Implement account setting modification and saving feature
This commit is contained in:
parent
1c43080670
commit
61a41bd9eb
|
|
@ -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>
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
import * as React from "react";
|
||||||
|
|
||||||
|
export default function SettingSaveButton() {
|
||||||
|
function onSettingButtonClicked() {
|
||||||
|
currentSettingHook.setCurrentSetting(settingName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<button onClick={onSettingButtonClicked}>{settingName}</button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -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({
|
||||||
body: JSON.stringify(formDataObject),
|
"authToken": authTokenStorageHandler.authTokenValue,
|
||||||
})
|
"newValue": value,
|
||||||
.then((response) => response.json())
|
}),
|
||||||
.then((responseParsed: Object) => {
|
})
|
||||||
console.log(responseParsed);
|
.then((response) => response.json())
|
||||||
if (responseParsed.success) {
|
.then((responseParsed: Object) => {
|
||||||
authTokenStorageHandler.setAuthTokenValue(responseParsed.authToken);
|
console.log(responseParsed);
|
||||||
} 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>
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue