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 Toggle from 'react-toggle'; import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { fetchList } from 'mastodon/actions/lists'; import { createList, updateList } from 'mastodon/actions/lists_typed'; import { apiGetAccounts } from 'mastodon/api/lists'; import type { RepliesPolicyType } from 'mastodon/api_types/lists'; 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_list', defaultMessage: 'Edit list' }, create: { id: 'column.create_list', defaultMessage: 'Create list' }, }); 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 NewList: React.FC<{ multiColumn?: boolean; }> = ({ multiColumn }) => { const dispatch = useAppDispatch(); const { id } = useParams<{ id?: string }>(); const intl = useIntl(); const history = useHistory(); const list = useAppSelector((state) => id ? state.lists.get(id) : undefined, ); const [title, setTitle] = useState(''); const [exclusive, setExclusive] = useState(false); const [repliesPolicy, setRepliesPolicy] = useState('list'); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (id) { dispatch(fetchList(id)); } }, [dispatch, id]); useEffect(() => { if (id && list) { setTitle(list.title); setExclusive(list.exclusive); setRepliesPolicy(list.replies_policy); } }, [setTitle, setExclusive, setRepliesPolicy, id, list]); const handleTitleChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { setTitle(value); }, [setTitle], ); const handleExclusiveChange = useCallback( ({ target: { checked } }: React.ChangeEvent) => { setExclusive(checked); }, [setExclusive], ); const handleRepliesPolicyChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { setRepliesPolicy(value as RepliesPolicyType); }, [setRepliesPolicy], ); const handleSubmit = useCallback(() => { setSubmitting(true); if (id) { void dispatch( updateList({ id, title, exclusive, replies_policy: repliesPolicy, }), ).then(() => { setSubmitting(false); return ''; }); } else { void dispatch( createList({ title, exclusive, replies_policy: repliesPolicy, }), ).then((result) => { setSubmitting(false); if (isFulfilled(result)) { history.replace(`/lists/${result.payload.id}/edit`); history.push(`/lists/${result.payload.id}/members`); } return ''; }); } }, [history, dispatch, setSubmitting, id, title, exclusive, repliesPolicy]); return (
{id && (
)}
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
{intl.formatMessage(id ? messages.edit : messages.create)}
); }; // eslint-disable-next-line import/no-default-export export default NewList;