import clsx from 'clsx'; import React, { useMemo } from 'react'; import { useForm } from 'react-hook-form'; 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 { useAppSelector, useInstance } from 'soapbox/hooks'; import { useGroup, useUpdateGroup } from 'soapbox/hooks/api'; import { isDefaultAvatar, isDefaultHeader } from 'soapbox/utils/accounts'; import resizeImage from 'soapbox/utils/resize-image'; import type { List as ImmutableList } from 'immutable'; const nonDefaultAvatar = (url: string | undefined) => url && isDefaultAvatar(url) ? undefined : url; const nonDefaultHeader = (url: string | undefined) => url && isDefaultHeader(url) ? undefined : url; interface IMediaInput { src: string | undefined accept: string onChange: React.ChangeEventHandler disabled: boolean } const messages = defineMessages({ heading: { id: 'navigation_bar.edit_group', defaultMessage: 'Edit Group' }, groupNamePlaceholder: { id: 'manage_group.fields.name_placeholder', defaultMessage: 'Group Name' }, groupDescriptionPlaceholder: { id: 'manage_group.fields.description_placeholder', defaultMessage: 'Description' }, }); const HeaderPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { return ( ); }); const AvatarPicker = React.forwardRef(({ src, onChange, accept, disabled }, ref) => { return ( ); }); interface EditGroupForm { display_name: string note: string avatar?: FileList header?: FileList } interface IEditGroup { params: { id: string } } const EditGroup: React.FC = ({ params: { id: groupId } }) => { const intl = useIntl(); const instance = useInstance(); const { group } = useGroup(groupId); const { updateGroup } = useUpdateGroup(groupId); 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); 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, }); } return (
} > } >