From eb055339d8e380c58df40df913f1ebefc08bb7ae Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 29 Mar 2023 19:54:35 -0500 Subject: [PATCH] react-hook-form SUX --- app/soapbox/features/group/edit-group.tsx | 112 +++++++++++++++------- package.json | 2 - yarn.lock | 10 -- 3 files changed, 79 insertions(+), 45 deletions(-) diff --git a/app/soapbox/features/group/edit-group.tsx b/app/soapbox/features/group/edit-group.tsx index 001a8b1ab..c2a38397b 100644 --- a/app/soapbox/features/group/edit-group.tsx +++ b/app/soapbox/features/group/edit-group.tsx @@ -1,10 +1,9 @@ import clsx from 'clsx'; -import React, { useMemo } from 'react'; -import { useForm } from 'react-hook-form'; +import React, { useEffect, useMemo, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import Icon from 'soapbox/components/icon'; -import { Avatar, Button, Column, Form, FormActions, FormGroup, HStack, Input, Text, Textarea } from 'soapbox/components/ui'; +import { Avatar, Button, Column, Form, FormActions, FormGroup, HStack, Input, Spinner, Text, Textarea } from 'soapbox/components/ui'; import { useAppSelector, useInstance } from 'soapbox/hooks'; import { useGroup, useUpdateGroup } from 'soapbox/hooks/api'; import { isDefaultAvatar, isDefaultHeader } from 'soapbox/utils/accounts'; @@ -96,13 +95,6 @@ const AvatarPicker = React.forwardRef(({ src, onC ); }); -interface EditGroupForm { - display_name: string - note: string - avatar?: FileList - header?: FileList -} - interface IEditGroup { params: { id: string @@ -113,44 +105,47 @@ const EditGroup: React.FC = ({ params: { id: groupId } }) => { const intl = useIntl(); const instance = useInstance(); - const { group } = useGroup(groupId); + const { group, isLoading } = useGroup(groupId); const { updateGroup } = useUpdateGroup(groupId); + const [isSubmitting, setIsSubmitting] = useState(false); + + const avatarField = useImageField({ maxPixels: 400 * 400, preview: nonDefaultAvatar(group?.avatar) }); + const headerField = useImageField({ maxPixels: 1920 * 1080, preview: nonDefaultHeader(group?.header) }); + + const displayNameField = useTextField(group?.display_name); + const noteField = useTextField(group?.note); + const maxName = Number(instance.configuration.getIn(['groups', 'max_characters_name'])); const maxNote = Number(instance.configuration.getIn(['groups', 'max_characters_description'])); - const { register, handleSubmit, formState: { isSubmitting }, watch } = useForm({ - values: group ? { - display_name: group.display_name, - note: group.note, - } : undefined, - }); - - const avatarSrc = usePreview(watch('avatar')?.item(0)) || nonDefaultAvatar(group?.avatar); - const headerSrc = usePreview(watch('header')?.item(0)) || nonDefaultHeader(group?.header); - const attachmentTypes = useAppSelector( state => state.instance.configuration.getIn(['media_attachments', 'supported_mime_types']) as ImmutableList, )?.filter(type => type.startsWith('image/')).toArray().join(','); - async function onSubmit(data: EditGroupForm) { - const avatar = data.avatar?.item(0); - const header = data.header?.item(0); + async function handleSubmit() { + setIsSubmitting(true); await updateGroup({ - display_name: data.display_name, - note: data.note, - avatar: avatar ? await resizeImage(avatar, 400 * 400) : undefined, - header: header ? await resizeImage(header, 1920 * 1080) : undefined, + display_name: displayNameField.value, + note: noteField.value, + avatar: avatarField.file, + header: headerField.file, }); + + setIsSubmitting(false); + } + + if (isLoading) { + return ; } return ( -
+
- - + +
} @@ -158,7 +153,8 @@ const EditGroup: React.FC = ({ params: { id: groupId } }) => { = ({ params: { id: groupId } }) => {