import React, {useCallback, useEffect, useMemo, useState} from 'react'; import './CreateCharacter.less' import {Faj, TulajdonsagokFajjal} from "../domain-models/faj"; import {Osztaly, SetFelszerelesForChangedOsztaly} from "../domain-models/osztaly" import FajSelector from "../components/FajSelector"; import Tulajdonsagok from "../components/Tulajdonsagok"; import OsztalySelector from "../components/OsztalySelector"; import KarakterKepzettsegek from "../components/KarakterKepzettsegek"; import MasodlagosErtekek from "../components/MasodlagosErtekek"; import { AvailableKezpettsegList, GetKepzettsegListaN, GetNumberOfKepzettsegek, KepzettsegId, SetDefaultKepzettsegek, SetDefaultTolvajKepzettsegek, } from "../domain-models/kepzettsegek"; import {CreatePDF} from "../pdf/character.pdf"; import {KarakterDefaults, KarakterInputs} from "../domain-models/karakter"; import {CalculateMasodlagosErtekek} from "../domain-models/masodlagos_ertekek"; import {KarakterInputToPdfView} from "../pdf/karakter_pdf_view"; import JellemSelector from "../components/JellemSelector"; import {CanLevelUp, LevelDown, LevelUp} from "../domain-models/level"; import {Card, OverlayTrigger, Toast, ToastContainer} from "react-bootstrap"; import LevelUps from "../components/LevelUps"; import HarcosFegyverSpecializacio from "../components/HarcosFegyverSpecializacio"; import Felszereles from '../components/Felszereles'; import { KarakterFelszereles } from '../domain-models/felszereles'; import {Faro} from "@grafana/faro-web-sdk"; import {StoreNewCharacter, UpdateCharacter} from "../api/character.api"; import {useLoaderData, useNavigate, useParams} from "react-router-dom"; import saveOverlayTooltip from "../components/SaveOverlayTooltip"; import {KarakterTulajdonsagok} from "../domain-models/tulajdonsag"; import {useSelector} from "react-redux"; import {RootState} from "../../store"; import {userSelector} from "../../shared/domain-models/userSlice"; import {SaveModal} from "../../shared/components/SaveModal"; function CreateCharacterPage(props: { faro?: Faro, }) { const {faro} = props const loaderData = useLoaderData() as KarakterInputs & { isPublic: boolean } | undefined; let initialKarakterInputs = KarakterDefaults; if (loaderData != null) { const { isPublic: t1, ...t2 } = loaderData; initialKarakterInputs = t2 } const { id } = useParams(); const fetchedUser = useSelector.withTypes()(userSelector); const initialIsPublic = loaderData?.isPublic ?? fetchedUser?.email == null; const navigate = useNavigate(); let [karakter, changeKarakter] = useState(initialKarakterInputs) const tulajdonsagokFajjal = useMemo(() => TulajdonsagokFajjal(karakter.tulajdonsagok, karakter.faj), [karakter.tulajdonsagok, karakter.faj]) const changeKepzettseg = useCallback((k: KepzettsegId[]) => { changeKarakter(prev => ({...prev, kepzettsegek: k})) }, []) const changeTolvajKepzettseg = useCallback((tk?: KepzettsegId[]) => { changeKarakter(prev => ({...prev, tolvajKepzettsegek: tk})) }, []) const availableKepzettsegList = useMemo(() => AvailableKezpettsegList(karakter.osztaly), [karakter.osztaly]) const setFelszereles = useCallback((f: KarakterFelszereles) => { changeKarakter(prev => ({...prev, felszereles: f})) }, []) const tolvajDefaultsInput = useMemo(() => ({ osztaly: karakter.osztaly, tolvajKepzettsegek: karakter.tolvajKepzettsegek, }), [karakter.osztaly, karakter.tolvajKepzettsegek]) const kepzettsegDefaultsInput = useMemo(() => ({ osztaly: karakter.osztaly, faj: karakter.faj, tulajdonsagok: tulajdonsagokFajjal, kepzettsegek: karakter.kepzettsegek, tolvajKepzettsegek: karakter.tolvajKepzettsegek, }), [karakter.osztaly, karakter.faj, tulajdonsagokFajjal, karakter.kepzettsegek, karakter.tolvajKepzettsegek]) useEffect(() => { SetDefaultTolvajKepzettsegek(tolvajDefaultsInput, changeTolvajKepzettseg) }, [tolvajDefaultsInput, changeTolvajKepzettseg]) useEffect(() => { SetDefaultKepzettsegek(kepzettsegDefaultsInput, changeKepzettseg) }, [kepzettsegDefaultsInput, changeKepzettseg]) useEffect(() => { SetFelszerelesForChangedOsztaly(karakter.osztaly, karakter.felszereles, setFelszereles) }, [karakter.osztaly, karakter.felszereles, setFelszereles]) const levelUp = () => LevelUp(karakter, changeKarakter) const levelDown = () => LevelDown(karakter, changeKarakter) const canLevelUp = CanLevelUp(karakter) let [showSaveModal, setShowSaveModal] = useState(false); let [newId, setNewId] = useState(null as string | null) let [showSaved, setShowSaved] = useState(false); let [isPublic, setIsPublic] = useState(initialIsPublic); const newCharacterUrl = () => `${window.location.origin}/1e/karakter/${newId}` const handleSaveModalCopyAndClose = async () => { await navigator.clipboard.writeText(newCharacterUrl()); handleSaveModalClose() } const handleSaveModalClose = () => { setShowSaveModal(false); navigate(`/1e/karakter/${newId}`) } const hideSaved = () => setShowSaved(false); const onSaveClicked = async () => { faro?.api.pushEvent('character_stored', { osztaly: karakter.osztaly, szint: karakter.szint.toString(), faj: karakter.faj.toString(), is_public: isPublic.toString(), }) if (id == null) { let recievedId = await StoreNewCharacter(karakter, isPublic); setNewId(recievedId) setShowSaveModal(true); } else { await UpdateCharacter(id, karakter, isPublic); setShowSaved(true); setTimeout(() => { hideSaved(); }, 5000) } } return (

Karakter {!!id ? "szerkesztése" : "létrehozása"}

Karakter mentve!
event.preventDefault()}>
Származás
changeKarakter({...karakter, name: e.target.value})}/> {!karakter.name && A karaktered nem mászkálhat névtelenül a világban!}
changeKarakter({...karakter, nem: e.target.value})}/>
changeKarakter({...karakter, kor: Number(e.target.value)})}/>
changeKarakter({...karakter, jellem: val})}/>
changeKarakter({...karakter, isten: e.target.value})}/>
changeKarakter({...karakter, faj: faj})} faj={karakter.faj} />
changeKarakter({ ...karakter, tulajdonsagok: tul })} />
Tanult
changeKarakter({ ...karakter, osztaly: o, harcosSpecializaciok: (o === Osztaly.Harcos && karakter.harcosSpecializaciok.length === 0) ? ['hosszu_kard'] : karakter.harcosSpecializaciok, })} /> {karakter.osztaly === Osztaly.Harcos &&
changeKarakter({ ...karakter, harcosSpecializaciok: [spec, ...karakter.harcosSpecializaciok.slice(1)] })} szint={1} />
}

{karakter.szint > 1 &&
}
{canLevelUp && } {!canLevelUp && karakter.szint < 10 && Elérted a fajod szint limitjét} {karakter.szint > 1 && }


Véglegesítés
{fetchedUser.email != null &&
}
{fetchedUser.email == null ? : }
); } export default CreateCharacterPage;