Implement account setting modification and saving feature

This commit is contained in:
Curt Spark 2024-07-06 17:24:33 +01:00
parent 1c43080670
commit 61a41bd9eb
4 changed files with 53 additions and 39 deletions

View File

@ -4,22 +4,24 @@ import { Link } from "react-router-dom";
interface Props { interface Props {
settingField: string; settingField: string;
settingValue: string; settingValue: string;
settingsChangedHook: object; changedSettingsHook: object;
} }
function handleSettingFieldChange(eventData, setFunction, settingsChangedHook, initialValue) { function handleSettingFieldChange(eventData, setFunction, changedSettingsHook, initialValue, settingField) {
setFunction(eventData.target.value); setFunction(eventData.target.value);
if (eventData.target.value === initialValue) { if (eventData.target.value === initialValue) {
settingsChangedHook.setsettingsChanged(false); let removeSettingObject = changedSettingsHook.changedSettings
delete removeSettingObject[settingField];
changedSettingsHook.setChangedSettings(() => ({...removeSettingObject}));
} else { } else {
settingsChangedHook.setsettingsChanged(true); changedSettingsHook.setChangedSettings(() => ({...changedSettingsHook.changedSettings, [settingField]: eventData.target.value}));
} }
} }
export default function AccountDefaultSetting({ export default function AccountDefaultSetting({
settingField, settingField,
settingValue, settingValue,
settingsChangedHook, changedSettingsHook,
}: Props) { }: Props) {
const initialValue = settingValue; const initialValue = settingValue;
const [fieldValue, setFieldValue] = React.useState(settingValue); const [fieldValue, setFieldValue] = React.useState(settingValue);
@ -32,7 +34,7 @@ export default function AccountDefaultSetting({
name={settingField} name={settingField}
value={fieldValue} value={fieldValue}
onChange={(eventData) => onChange={(eventData) =>
handleSettingFieldChange(eventData, setFieldValue, settingsChangedHook, initialValue) handleSettingFieldChange(eventData, setFieldValue, changedSettingsHook, initialValue, settingField)
} }
></input> ></input>
</> </>

View File

@ -0,0 +1,13 @@
import * as React from "react";
export default function SettingSaveButton() {
function onSettingButtonClicked() {
currentSettingHook.setCurrentSetting(settingName);
}
return (
<>
<button onClick={onSettingButtonClicked}>{settingName}</button>
</>
);
}

View File

@ -10,10 +10,10 @@ interface Props {
authTokenStorageHandler: object; authTokenStorageHandler: object;
} }
function renderCurrentSetting(setting: string, settingsChangedHook: object) { function renderCurrentSetting(setting: string, changedSettingsHook: object) {
switch (setting) { switch (setting) {
case "Account": case "Account":
return <AccountSetting settingsChangedHook={settingsChangedHook}></AccountSetting>; return <AccountSetting changedSettingsHook={changedSettingsHook}></AccountSetting>;
case "Security": case "Security":
return <SecuritySetting></SecuritySetting>; return <SecuritySetting></SecuritySetting>;
default: default:
@ -24,17 +24,18 @@ function renderCurrentSetting(setting: string, settingsChangedHook: object) {
export default function Home({ authTokenStorageHandler }: Props) { export default function Home({ authTokenStorageHandler }: Props) {
const settings = ["Account", "Security"]; const settings = ["Account", "Security"];
const [currentSetting, setCurrentSetting] = React.useState(settings[0]); const [currentSetting, setCurrentSetting] = React.useState(settings[0]);
const [settingsChanged, setsettingsChanged] = React.useState(false); const [changedSettings, setChangedSettings] = React.useState({});
/* Make objects to pass by reference */ /* Make objects to pass by reference */
const currentSettingHook = { const currentSettingHook = {
currentSetting, currentSetting,
setCurrentSetting, setCurrentSetting,
}; };
const settingsChangedHook = { const changedSettingsHook = {
settingsChanged, changedSettings,
setsettingsChanged, setChangedSettings,
}; };
if (!authTokenStorageHandler.authTokenValue) { if (!authTokenStorageHandler.authTokenValue) {
return <Navigate to="/home"></Navigate>; return <Navigate to="/home"></Navigate>;
} }
@ -42,27 +43,23 @@ export default function Home({ authTokenStorageHandler }: Props) {
function onSettingsSave(formEvent) { function onSettingsSave(formEvent) {
formEvent.preventDefault(); formEvent.preventDefault();
const formData = new FormData(formEvent.target);
const formDataObject = Object.fromEntries(formData);
console.log(JSON.stringify(formDataObject)); for (let [key, value] of Object.entries(changedSettings)) {
fetch("http://127.0.0.1:8000/api/user/settings/change/" + key, {
fetch("http://127.0.0.1:8000/api/debug", { method: "PUT",
method: "GET",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify(formDataObject), body: JSON.stringify({
"authToken": authTokenStorageHandler.authTokenValue,
"newValue": value,
}),
}) })
.then((response) => response.json()) .then((response) => response.json())
.then((responseParsed: Object) => { .then((responseParsed: Object) => {
console.log(responseParsed); console.log(responseParsed);
if (responseParsed.success) {
authTokenStorageHandler.setAuthTokenValue(responseParsed.authToken);
} else {
console.log("Login failure!");
}
}); });
};
} }
return ( return (
@ -85,9 +82,11 @@ export default function Home({ authTokenStorageHandler }: Props) {
<hr></hr> <hr></hr>
<form className="currentSettingBox" onSubmit={onSettingsSave}> <form className="currentSettingBox" onSubmit={onSettingsSave}>
<div className="currentSetting"> <div className="currentSetting">
{renderCurrentSetting(currentSetting, settingsChangedHook)} {renderCurrentSetting(currentSetting, changedSettingsHook)}
</div> </div>
{settingsChangedHook.settingsChanged ? ( <button type="submit">Save</button> ) : null } {Object.keys(changedSettings).length > 0 ? ( <button type="submit">Save</button> ) : null }
<p>{JSON.stringify(changedSettings)}</p>
<p>{Object.keys(changedSettings).length}</p>
</form> </form>
</div> </div>
</TilingItem> </TilingItem>

View File

@ -3,10 +3,10 @@ import { authTokenStorageHandlerInit } from "../../components/storageHandler.ts"
import AccountDefaultSetting from "../../components/AccountDefaultSetting.tsx"; import AccountDefaultSetting from "../../components/AccountDefaultSetting.tsx";
interface Props { interface Props {
settingsChangedHook: object; changedSettingsHook: object;
} }
function RenderSettingField(settingField: str, settingValue: str, settingsChangedHook: object) { function RenderSettingField(settingField: str, settingValue: str, changedSettingsHook: object) {
switch (settingField) { switch (settingField) {
default: default:
return ( return (
@ -14,13 +14,13 @@ function RenderSettingField(settingField: str, settingValue: str, settingsChange
key={settingField + "Main"} key={settingField + "Main"}
settingField={settingField} settingField={settingField}
settingValue={settingValue} settingValue={settingValue}
settingsChangedHook={settingsChangedHook} changedSettingsHook={changedSettingsHook}
></AccountDefaultSetting> ></AccountDefaultSetting>
); );
} }
} }
export default function AccountSetting({ settingsChangedHook }: Props) { export default function AccountSetting({ changedSettingsHook }: Props) {
const [accountSettings, setAccountSettings] = React.useState({}); const [accountSettings, setAccountSettings] = React.useState({});
const authTokenStorageHandler = authTokenStorageHandlerInit(); const authTokenStorageHandler = authTokenStorageHandlerInit();
@ -49,7 +49,7 @@ export default function AccountSetting({ settingsChangedHook }: Props) {
<h1>Account</h1> <h1>Account</h1>
<hr></hr> <hr></hr>
{Object.entries(accountSettings).map((item, key) => {Object.entries(accountSettings).map((item, key) =>
RenderSettingField(item[0], item[1], settingsChangedHook), RenderSettingField(item[0], item[1], changedSettingsHook),
)} )}
</> </>
); );