diff --git a/web/source/settings/admin/settings.js b/web/source/settings/admin/settings.js
index c3b8e9d91..294b9b885 100644
--- a/web/source/settings/admin/settings.js
+++ b/web/source/settings/admin/settings.js
@@ -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 (
+
);
+};
+
+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 (
-
+
+
);
-};
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/web/source/settings/lib/form/form-with-data.jsx b/web/source/settings/lib/form/form-with-data.jsx
new file mode 100644
index 000000000..3e96f989b
--- /dev/null
+++ b/web/source/settings/lib/form/form-with-data.jsx
@@ -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 ;
+ } else {
+ return ;
+ }
+};
\ No newline at end of file
diff --git a/web/source/settings/lib/query/admin.js b/web/source/settings/lib/query/admin.js
new file mode 100644
index 000000000..9a73c9e30
--- /dev/null
+++ b/web/source/settings/lib/query/admin.js
@@ -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 .
+*/
+
+"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});
\ No newline at end of file
diff --git a/web/source/settings/lib/query/base.js b/web/source/settings/lib/query/base.js
index a0b7ba346..2a23f539f 100644
--- a/web/source/settings/lib/query/base.js
+++ b/web/source/settings/lib/query/base.js
@@ -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`
+ })
+ })
+ })
});
\ No newline at end of file
diff --git a/web/source/settings/lib/query/index.js b/web/source/settings/lib/query/index.js
index be98794dd..e3558fa17 100644
--- a/web/source/settings/lib/query/index.js
+++ b/web/source/settings/lib/query/index.js
@@ -21,5 +21,6 @@
module.exports = {
...require("./base"),
...require("./custom-emoji.js"),
- ...require("./user-settings")
+ ...require("./user"),
+ ...require("./admin")
};
\ No newline at end of file
diff --git a/web/source/settings/lib/query/user-settings.js b/web/source/settings/lib/query/user.js
similarity index 100%
rename from web/source/settings/lib/query/user-settings.js
rename to web/source/settings/lib/query/user.js
diff --git a/web/source/settings/user/profile.js b/web/source/settings/user/profile.js
index 43d7314ad..760ec4745 100644
--- a/web/source/settings/user/profile.js
+++ b/web/source/settings/user/profile.js
@@ -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}),