import { useCallback, useState } from 'react'; import { FormattedMessage } from 'react-intl'; import { useHistory, useLocation } from 'react-router-dom'; import { isFulfilled } from '@reduxjs/toolkit'; import type { ApiCollectionJSON, ApiCreateCollectionPayload, ApiUpdateCollectionPayload, } from 'mastodon/api_types/collections'; import { Button } from 'mastodon/components/button'; import { CheckboxField, Fieldset, FormStack, RadioButtonField, TextAreaField, } from 'mastodon/components/form_fields'; import { TextInputField } from 'mastodon/components/form_fields/text_input_field'; import { createCollection, updateCollection, } from 'mastodon/reducers/slices/collections'; import { useAppDispatch } from 'mastodon/store'; import type { TempCollectionState } from './state'; import { getCollectionEditorState } from './state'; import classes from './styles.module.scss'; import { WizardStepHeader } from './wizard_step_header'; export const CollectionDetails: React.FC<{ collection?: ApiCollectionJSON | null; }> = ({ collection }) => { const dispatch = useAppDispatch(); const history = useHistory(); const location = useLocation(); const { id, initialName, initialDescription, initialTopic, initialItemIds, initialDiscoverable, initialSensitive, } = getCollectionEditorState(collection, location.state); const [name, setName] = useState(initialName); const [description, setDescription] = useState(initialDescription); const [topic, setTopic] = useState(initialTopic); const [discoverable, setDiscoverable] = useState(initialDiscoverable); const [sensitive, setSensitive] = useState(initialSensitive); const handleNameChange = useCallback( (event: React.ChangeEvent) => { setName(event.target.value); }, [], ); const handleDescriptionChange = useCallback( (event: React.ChangeEvent) => { setDescription(event.target.value); }, [], ); const handleTopicChange = useCallback( (event: React.ChangeEvent) => { setTopic(event.target.value); }, [], ); const handleDiscoverableChange = useCallback( (event: React.ChangeEvent) => { setDiscoverable(event.target.value === 'public'); }, [], ); const handleSensitiveChange = useCallback( (event: React.ChangeEvent) => { setSensitive(event.target.checked); }, [], ); const handleSubmit = useCallback( (e: React.FormEvent) => { e.preventDefault(); if (id) { const payload: ApiUpdateCollectionPayload = { id, name, description, tag_name: topic || null, discoverable, sensitive, }; void dispatch(updateCollection({ payload })).then(() => { history.goBack(); }); } else { const payload: ApiCreateCollectionPayload = { name, description, discoverable, sensitive, account_ids: initialItemIds, }; if (topic) { payload.tag_name = topic; } void dispatch( createCollection({ payload, }), ).then((result) => { if (isFulfilled(result)) { history.replace( `/collections/${result.payload.collection.id}/edit/details`, ); history.push(`/collections/${result.payload.collection.id}`); } }); } }, [ id, name, description, topic, discoverable, sensitive, dispatch, history, initialItemIds, ], ); return (
{!id && ( } /> )} } hint={ } value={name} onChange={handleNameChange} maxLength={40} /> } hint={ } value={description} onChange={handleDescriptionChange} maxLength={100} /> } hint={ } value={topic} onChange={handleTopicChange} maxLength={40} />
} > } hint={ } value='public' checked={discoverable} onChange={handleDiscoverableChange} /> } hint={ } value='unlisted' checked={!discoverable} onChange={handleDiscoverableChange} />
} > } hint={ } checked={sensitive} onChange={handleSensitiveChange} />
); };