import { useCallback, useState, useEffect } from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; import { useParams, useHistory, Link } from 'react-router-dom'; import { isFulfilled } from '@reduxjs/toolkit'; import CircleIcon from '@/material-icons/400-24px/account_circle.svg?react'; import { fetchCircle } from 'mastodon/actions/circles'; import { createCircle, updateCircle } from 'mastodon/actions/circles_typed'; import { apiGetAccounts } from 'mastodon/api/circles'; import Column from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; const messages = defineMessages({ edit: { id: 'column.edit_circle', defaultMessage: 'Edit circle' }, create: { id: 'column.create_circle', defaultMessage: 'Create circle' }, }); const MembersLink: React.FC<{ id: string; }> = ({ id }) => { const [count, setCount] = useState(0); const [avatars, setAvatars] = useState([]); useEffect(() => { void apiGetAccounts(id) .then((data) => { setCount(data.length); setAvatars(data.slice(0, 3).map((a) => a.avatar)); return ''; }) .catch(() => { // Nothing }); }, [id, setCount, setAvatars]); return (
{avatars.map((url) => ( ))}
); }; const NewCircle: React.FC<{ multiColumn?: boolean; }> = ({ multiColumn }) => { const dispatch = useAppDispatch(); const { id } = useParams<{ id?: string }>(); const intl = useIntl(); const history = useHistory(); const circle = useAppSelector((state) => id ? state.circles.get(id) : undefined, ); const [title, setTitle] = useState(''); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (id) { dispatch(fetchCircle(id)); } }, [dispatch, id]); useEffect(() => { if (id && circle) { setTitle(circle.title); } }, [setTitle, id, circle]); const handleTitleChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { setTitle(value); }, [setTitle], ); const handleSubmit = useCallback(() => { setSubmitting(true); if (id) { void dispatch( updateCircle({ id, title, }), ).then(() => { setSubmitting(false); return ''; }); } else { void dispatch( createCircle({ title, }), ).then((result) => { setSubmitting(false); if (isFulfilled(result)) { history.replace(`/circles/${result.payload.id}/edit`); history.push(`/circles/${result.payload.id}/members`); } return ''; }); } }, [history, dispatch, setSubmitting, id, title]); return (
{id && (
)}
{intl.formatMessage(id ? messages.edit : messages.create)}
); }; // eslint-disable-next-line import/no-default-export export default NewCircle;