import { useContext, useEffect, useState } from "react"; import { AllowedLanguages, LanguageContext } from "../Locales/Context"; import { BackendURL } from "../Config"; import axios from "axios"; import { RangedWeapon, RangedWeaponRequest } from "../Models/RangedWeapon"; import { Description } from "../Models/Description"; import { useNavigate, useParams } from "react-router"; import { GetLocalizedString } from "../Locales/Locales"; import "./Weapons.css" import { AuthContext } from "../Authentication/ContextProvider"; import { useCookies } from 'react-cookie'; const RangedWeaponsURL = `${BackendURL}/weapons/ranged`; export function RangedWeaponPage() { var user = useContext(AuthContext); const { id } = useParams(); const lang = useContext(LanguageContext); const [weapon, setWeapon] = useState(null); const [description, setDescription] = useState(null); useState(() => { getWeapon(id).then(data => setWeapon(data)); getWeaponDescription(id, lang).then(data => setDescription(data)); }); if (weapon == null) { return

Not found

; // ; } function editButton() { if (!user || user.Role != "editor") { return (

); } else { return ( Edit ); } } return (

{weapon?.Name}

{ GetLocalizedString(weapon.WeaponType, lang) }

{ GetLocalizedString("Accuracy", lang) } { weapon.Accuracy }
{ GetLocalizedString("Concealability", lang) } { GetLocalizedString(weapon.Concealability, lang) }
{ GetLocalizedString("Avaliability", lang) } { GetLocalizedString(weapon.Avaliability, lang) }
{ GetLocalizedString("Damage/Ammunition", lang) } { weapon.Damage }({ weapon.Ammunition })
{ GetLocalizedString("Number Of Shots", lang) } { weapon.NumberOfShots }
{ GetLocalizedString("Rate Of Fire", lang) } { weapon.RateOfFire }
{ GetLocalizedString("Reliability", lang) } { GetLocalizedString(weapon.Reliability, lang) }
{ GetLocalizedString("Origin", lang) } { GetLocalizedString(weapon.Origin, lang) }

{description?.Contents}

{ editButton() }
); } const defaultNewRangedWeapon: RangedWeapon = { Id: "", Name: "", WeaponType: "Light pistol", Accuracy: 0, Concealability: "Pocket", Avaliability: "Common", Damage: "1d6", Ammunition: "9mm", NumberOfShots: 0, RateOfFire: 0, Reliability: "Standard", Origin: "Corebook", CreatedAt: 0, UpdatedAt: 0, } export function EditRangedWeaponPage() { var user = useContext(AuthContext); const [isLoading, setIsLoading] = useState(true); const { id } = useParams(); const lang = useContext(LanguageContext); var [weapon, setWeapon] = useState(null); const [description, setDescription] = useState(null); const [authCookie, ] = useCookies(['X-AUTH-TOKEN']); const navigate = useNavigate(); const [Name, setName] = useState(); const [WeaponType, setWeaponType] = useState(); const [Accuracy, setAccuracy] = useState(); const [Concealability, setConcealability] = useState(); const [Avaliability, setAvaliability] = useState(); const [Damage, setDamage] = useState(); const [Ammunition, setAmmunition] = useState(); const [NumberOfShots, setNumberOfShots] = useState(); const [RateOfFire, setRateOfFire] = useState(); const [Reliability, setReliability] = useState(); const [Origin, setOrigin] = useState(); const [currentLanguage, setCurrentLanguage] = useState("en"); const [DescriptionContents, SetDescContents] = useState(""); useState(() => { if (id == 'new') { setWeapon(defaultNewRangedWeapon); return } getWeapon(id).then(data => setWeapon(data)); getWeaponDescription(id, currentLanguage).then(data => setDescription(data)); }); useEffect(() => { if (user !== null) { setIsLoading(false); } }, [user]); useEffect(() => { if (weapon) { setName(weapon.Name); setWeaponType(weapon.WeaponType); setAccuracy(weapon.Accuracy); setConcealability(weapon.Concealability); setAvaliability(weapon.Avaliability); setDamage(weapon.Damage); setAmmunition(weapon.Ammunition); setNumberOfShots(weapon.NumberOfShots); setRateOfFire(weapon.RateOfFire); setReliability(weapon.Reliability); setOrigin(weapon.Origin); SetDescContents(description?.Contents ?? ""); } }, [weapon]); useEffect(() => { getWeaponDescription(id, currentLanguage).then(val => { const input = document.getElementById('description') as HTMLInputElement | null; if (!input) return; input.value = val?.Contents ?? ''; }); }, [currentLanguage]); function getUpdatedWeapon(): RangedWeaponRequest { var outp: RangedWeaponRequest = { Id: id || "", Name: Name || "", WeaponType: WeaponType || "", Accuracy: Accuracy || 0, Concealability: Concealability || "", Avaliability: Avaliability || "", Damage: Damage || "", Ammunition: Ammunition || "", NumberOfShots: NumberOfShots || 0, RateOfFire: RateOfFire || 0, Reliability: Reliability || "", Origin: Origin || "", }; return outp; } if (isLoading) { return
Loading...
; } if (!user || user.Role != "editor") { throw new Response("Forbidden", { status: 403 }); } if (weapon == null) { return

Not found

; // ; } return (
{ setName(val.target.value); }} />
{ GetLocalizedString("Accuracy", lang) } { setAccuracy(+val.target.value); }} />
{ GetLocalizedString("Concealability", lang) }
{ GetLocalizedString("Avaliability", lang) }
{ GetLocalizedString("Damage/Ammunition", lang) } { setDamage(val.target.value); }}/> ( { setAmmunition(val.target.value); }}/> )
{ GetLocalizedString("Number Of Shots", lang) } { setNumberOfShots(+val.target.value); }} />
{ GetLocalizedString("Rate Of Fire", lang) } { setRateOfFire(+val.target.value); }} />
{ GetLocalizedString("Reliability", lang) }
{ GetLocalizedString("Origin", lang) }
{ SetDescContents(val.target.value); }} />
); } function isIdValid(id: string | undefined): boolean { return id != undefined && id != "new" && id?.length > 0; } async function getWeapon(id: string | undefined): Promise { if (!isIdValid(id)) return null; try { const {data, status} = await axios.get( `${RangedWeaponsURL}/${id}`, { headers: { Accept: "application/json" } } ); if (status != 200) return null; return data; } catch (err) { console.log(`Failed to get ranged weapon: ${err}`); return null; } } async function UpdateRangedWeapon(id: string | undefined, model: RangedWeaponRequest, token: string) { if (!isIdValid(id)) return; const uri = `${RangedWeaponsURL}/${id}`; await axios.put(uri, model, { headers: { Authorization: `Bearer ${token}` } }) .then(resp => { console.log(resp); }) .catch(err => { console.log(`Failed to update the model: ${err}`) }); } function generateId(Name: string): string { return Name.toLowerCase().replaceAll(' ', '_'); } async function CreateRangedWeapon(model: RangedWeaponRequest, token: string) { if (model.Name.length == 0) { throw new Error('The model name should not be empty'); } model.Id = generateId(model.Name); if (model.Id == "new") { throw new Error("Forbidden name"); } await axios.post(RangedWeaponsURL, model, { headers: { Authorization: `Bearer ${token}` } }) .then(resp => { console.log(resp); }) .catch(err => { console.log(`Failed to create the model: ${err}`) }); } async function DeleteRangedWeapon(id: string | undefined, token: string) { if (!isIdValid(id)) { throw new Error("Invalid ID"); } const uri = `${RangedWeaponsURL}/${id}`; await axios.delete(uri, { headers: { Authorization: `Bearer ${token}` } }) .then(resp => { console.log(resp); }) .catch(err => { console.log(`Failed to create the model: ${err}`) }); } async function getWeaponDescription(id: string | undefined, lanuage: AllowedLanguages): Promise { if (!isIdValid(id)) return null; try { const {data, status} = await axios.get( `${RangedWeaponsURL}/${id}/description?lang=${lanuage}`, { headers: { Accept: "application/json" } } ); if (status != 200) return null; return data; } catch (err) { console.log(`Failed to get ranged weapon: ${err}`); return null; } } async function updateWeaponDescription(id: string | undefined, updated: Description, token: string) { if (!isIdValid) return; const uri = `${RangedWeaponsURL}/${id}/description`; axios.post(uri, { Language: updated.Language, Contents: updated.Contents, }, { headers: { Authorization: `Bearer ${token}` } }); }