mirror of
1
Fork 0

refactor admin settings

This commit is contained in:
f0x 2023-01-08 16:14:46 +00:00
parent df9e980a24
commit 85e7f2ccb5
7 changed files with 124 additions and 49 deletions

View File

@ -19,88 +19,103 @@
"use strict";
const React = require("react");
const Redux = require("react-redux");
const Submit = require("../components/submit");
const query = require("../lib/query");
const api = require("../lib/api");
const submit = require("../lib/submit");
const {
useTextInput,
useFileInput
} = require("../lib/form");
const adminActions = require("../redux/reducers/instances").actions;
const useFormSubmit = require("../lib/form/submit");
const {
TextInput,
TextArea,
File
} = require("../components/form-fields").formFields(adminActions.setAdminSettingsVal, (state) => state.instances.adminSettings);
FileInput
} = require("../components/form/inputs");
const FormWithData = require("../lib/form/form-with-data");
const MutationButton = require("../components/form/mutation-button");
module.exports = function AdminSettings() {
const dispatch = Redux.useDispatch();
const instance = Redux.useSelector(state => state.instances.adminSettings);
const [errorMsg, setError] = React.useState("");
const [statusMsg, setStatus] = React.useState("");
const updateSettings = submit(
() => dispatch(api.admin.updateInstance()),
{setStatus, setError}
return (
<FormWithData
dataQuery={query.useInstanceQuery}
DataForm={AdminSettingsForm}
/>
);
};
function AdminSettingsForm({data: instance}) {
const form = {
title: useTextInput("title", {defaultValue: instance.title}),
thumbnail: useFileInput("thumbnail", {withPreview: true}),
thumbnailDesc: useTextInput("thumbnail_description", {defaultValue: instance.thumbnail_description}),
shortDesc: useTextInput("short_description", {defaultValue: instance.short_description}),
description: useTextInput("description", {defaultValue: instance.description}),
contactUser: useTextInput("contact_username", {defaultValue: instance.contact_account?.username}),
contactEmail: useTextInput("contact_email", {defaultValue: instance.email}),
terms: useTextInput("terms", {defaultValue: instance.terms})
};
const [result, submitForm] = useFormSubmit(form, query.useUpdateInstanceMutation());
return (
<div>
<form onSubmit={submitForm}>
<h1>Instance Settings</h1>
<TextInput
id="title"
name="Title"
placeHolder="My GoToSocial instance"
field={form.title}
label="Title"
placeholder="My GoToSocial instance"
/>
<div className="file-upload">
<h3>Instance thumbnail</h3>
<div>
<img className="preview avatar" src={instance.thumbnail} alt={instance.thumbnail ? `Thumbnail image for the instance` : "No instance thumbnail image set"} />
<File
id="thumbnail"
fileType="image/*"
<img className="preview avatar" src={form.thumbnail.previewValue ?? instance.thumbnail} alt={form.thumbnailDesc.value ?? (instance.thumbnail ? `Thumbnail image for the instance` : "No instance thumbnail image set")} />
<FileInput
field={form.thumbnail}
accept="image/*"
/>
</div>
</div>
<TextInput
id="thumbnail_description"
name="Instance thumbnail description"
placeHolder="A cute little picture of a smiling sloth."
field={form.thumbnailDesc}
label="Instance thumbnail description"
placeholder="A cute drawing of a smiling sloth."
/>
<TextArea
id="short_description"
name="Short description"
placeHolder="A small testing instance for the GoToSocial alpha."
field={form.shortDesc}
label="Short description"
placeholder="A small testing instance for the GoToSocial alpha software."
/>
<TextArea
id="description"
name="Full description"
placeHolder="A small testing instance for the GoToSocial alpha."
field={form.description}
label="Full description"
placeholder="A small testing instance for the GoToSocial alpha software. Just trying it out, my main instance is https://example.com"
/>
<TextInput
id="contact_account.username"
name="Contact user (local account username)"
placeHolder="admin"
field={form.contactUser}
label="Contact user (local account username)"
placeholder="admin"
/>
<TextInput
id="email"
name="Contact email"
placeHolder="admin@example.com"
field={form.contactEmail}
label="Contact email"
placeholder="admin@example.com"
/>
<TextArea
id="terms"
name="Terms & Conditions"
placeHolder=""
field={form.terms}
label="Terms & Conditions"
placeholder=""
/>
<Submit onClick={updateSettings} label="Save" errorMsg={errorMsg} statusMsg={statusMsg} />
</div>
<MutationButton text="Save" result={result}/>
</form>
);
};
}

View File

@ -0,0 +1,17 @@
"use strict";
const React = require("react");
const Loading = require("../../components/loading");
// Wrap Form component inside component that fires the RTK Query call,
// so Form will only be rendered when data is available to generate form-fields for
module.exports = function FormWithData({dataQuery, DataForm}) {
const {data, isLoading} = dataQuery();
if (isLoading) {
return <Loading/>;
} else {
return <DataForm data={data}/>;
}
};

View File

@ -0,0 +1,36 @@
/*
GoToSocial
Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
"use strict";
const { updateCacheOnMutation } = require("./lib");
const base = require("./base");
const endpoints = (build) => ({
updateInstance: build.mutation({
query: (formData) => ({
method: "PATCH",
url: `/api/v1/instance`,
asForm: true,
body: formData
}),
...updateCacheOnMutation("instance")
})
});
module.exports = base.injectEndpoints({endpoints});

View File

@ -51,5 +51,11 @@ module.exports = createApi({
reducerPath: "api",
baseQuery: instanceBasedQuery,
tagTypes: ["Emojis", "User"],
endpoints: () => ({})
endpoints: (build) => ({
instance: build.query({
query: () => ({
url: `/api/v1/instance`
})
})
})
});

View File

@ -21,5 +21,6 @@
module.exports = {
...require("./base"),
...require("./custom-emoji.js"),
...require("./user-settings")
...require("./user"),
...require("./admin")
};

View File

@ -66,8 +66,8 @@ function UserProfileForm({profile}) {
*/
const form = {
avatar: useFileInput("avatar", {withPreview: true, }),
header: useFileInput("header", {withPreview: true, }),
avatar: useFileInput("avatar", {withPreview: true}),
header: useFileInput("header", {withPreview: true}),
displayName: useTextInput("display_name", {defaultValue: profile.display_name}),
note: useTextInput("note", {defaultValue: profile.source?.note}),
customCSS: useTextInput("custom_css", {defaultValue: profile.custom_css}),