/* GoToSocial Copyright (C) GoToSocial Authors admin@gotosocial.org SPDX-License-Identifier: AGPL-3.0-or-later 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 React = require("react"); const query = require("../lib/query"); const { useTextInput, useFileInput, useBoolInput, useFieldArrayInput } = require("../lib/form"); const useFormSubmit = require("../lib/form/submit"); const { useWithFormContext, FormContext } = require("../lib/form/context"); const { TextInput, TextArea, FileInput, Checkbox } = require("../components/form/inputs"); const FormWithData = require("../lib/form/form-with-data"); const FakeProfile = require("../components/fake-profile"); const MutationButton = require("../components/form/mutation-button"); module.exports = function UserProfile() { return ( ); }; function UserProfileForm({ data: profile }) { /* User profile update form keys - bool bot - bool locked - string display_name - string note - file avatar - file header - bool enable_rss - string custom_css (if enabled) */ const { data: instance } = query.useInstanceQuery(); const instanceConfig = React.useMemo(() => { return { allowCustomCSS: instance?.configuration?.accounts?.allow_custom_css === true, maxPinnedFields: instance?.configuration?.accounts?.max_profile_fields ?? 6 }; }, [instance]); const form = { avatar: useFileInput("avatar", { withPreview: true }), header: useFileInput("header", { withPreview: true }), displayName: useTextInput("display_name", { source: profile }), note: useTextInput("note", { source: profile, valueSelector: (p) => p.source?.note }), customCSS: useTextInput("custom_css", { source: profile }), bot: useBoolInput("bot", { source: profile }), locked: useBoolInput("locked", { source: profile }), enableRSS: useBoolInput("enable_rss", { source: profile }), fields: useFieldArrayInput("fields_attributes", { defaultValue: profile?.source?.fields, length: instanceConfig.maxPinnedFields }), }; const [submitForm, result] = useFormSubmit(form, query.useUpdateCredentialsMutation(), { onFinish: () => { form.avatar.reset(); form.header.reset(); } }); return (

Profile

Header

Avatar

} ); } function ProfileFields({ field: formField }) { return (
{formField.value.map((data, i) => ( ))}
); } function Field({ index, data }) { const form = useWithFormContext(index, { name: useTextInput("name", { defaultValue: data.name }), value: useTextInput("value", { defaultValue: data.value }) }); return (
); }