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 AntennaIcon from '@/material-icons/400-24px/wifi.svg?react'; import { fetchAntenna } from 'mastodon/actions/antennas'; import { createAntenna, updateAntenna } from 'mastodon/actions/antennas_typed'; import { fetchLists } from 'mastodon/actions/lists'; import { Column } from 'mastodon/components/column'; import { ColumnHeader } from 'mastodon/components/column_header'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import { getOrderedLists } from 'mastodon/selectors/lists'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; const messages = defineMessages({ edit: { id: 'column.edit_antenna', defaultMessage: 'Edit antenna' }, create: { id: 'column.create_antenna', defaultMessage: 'Create antenna' }, }); const FiltersLink: React.FC<{ id: string; }> = ({ id }) => { return (
); }; const NewAntenna: React.FC<{ multiColumn?: boolean; }> = ({ multiColumn }) => { const dispatch = useAppDispatch(); const { id } = useParams<{ id?: string }>(); const intl = useIntl(); const history = useHistory(); const antenna = useAppSelector((state) => id ? state.antennas.get(id) : undefined, ); const lists = useAppSelector((state) => getOrderedLists(state)); const [title, setTitle] = useState(''); const [stl, setStl] = useState(false); const [ltl, setLtl] = useState(false); const [insertFeeds, setInsertFeeds] = useState(false); const [listId, setListId] = useState('0'); const [withMediaOnly, setWithMediaOnly] = useState(false); const [ignoreReblog, setIgnoreReblog] = useState(false); const [mode, setMode] = useState('filtering'); const [destination, setDestination] = useState('timeline'); const [favourite, setFavourite] = useState(true); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (id) { dispatch(fetchAntenna(id)); dispatch(fetchLists()); } }, [dispatch, id]); useEffect(() => { if (id && antenna) { setTitle(antenna.title); setStl(antenna.stl); setLtl(antenna.ltl); setInsertFeeds(antenna.insert_feeds); setListId(antenna.list?.id ?? '0'); setWithMediaOnly(antenna.with_media_only); setIgnoreReblog(antenna.ignore_reblog); setFavourite(antenna.favourite); if (antenna.stl) { setMode('stl'); } else if (antenna.ltl) { setMode('ltl'); } else { setMode('filtering'); } if (antenna.insert_feeds) { if (antenna.list) { setDestination('list'); } else { setDestination('home'); } } else { setDestination('timeline'); } } }, [ setTitle, setStl, setLtl, setInsertFeeds, setListId, setWithMediaOnly, setIgnoreReblog, setMode, setDestination, setFavourite, id, antenna, lists, ]); const handleTitleChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { setTitle(value); }, [setTitle], ); const handleListIdChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { setListId(value); }, [setListId], ); const handleModeChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { if (value === 'stl') { setStl(true); setLtl(false); } else if (value === 'ltl') { setStl(false); setLtl(true); } else if (value === 'filtering') { setStl(false); setLtl(false); } setMode(value); }, [setLtl, setStl, setMode], ); const handleDestinationChange = useCallback( ({ target: { value } }: React.ChangeEvent) => { if (value === 'list') { setInsertFeeds(true); if (listId === '0' && lists.length > 0) { setListId(lists[0]?.id ?? '0'); } } else if (value === 'home') { setInsertFeeds(true); // listId = 0 } else if (value === 'timeline') { setInsertFeeds(false); } setDestination(value); }, [setDestination, setListId, listId, lists], ); const handleWithMediaOnlyChange = useCallback( ({ target: { checked } }: React.ChangeEvent) => { setWithMediaOnly(checked); }, [setWithMediaOnly], ); const handleIgnoreReblogChange = useCallback( ({ target: { checked } }: React.ChangeEvent) => { setIgnoreReblog(checked); }, [setIgnoreReblog], ); const handleFavouriteChange = useCallback( ({ target: { checked } }: React.ChangeEvent) => { setFavourite(checked); }, [setFavourite], ); const handleSubmit = useCallback(() => { setSubmitting(true); if (id) { void dispatch( updateAntenna({ id, title, stl, ltl, insert_feeds: insertFeeds, list_id: destination === 'list' ? listId : '0', with_media_only: withMediaOnly, ignore_reblog: ignoreReblog, favourite, }), ).then(() => { setSubmitting(false); return ''; }); } else { void dispatch( createAntenna({ title, stl, ltl, insert_feeds: insertFeeds, list_id: destination === 'list' ? listId : '0', with_media_only: withMediaOnly, ignore_reblog: ignoreReblog, favourite, }), ).then((result) => { setSubmitting(false); if (isFulfilled(result)) { history.replace(`/antennas/${result.payload.id}/edit`); if (stl || ltl) { history.push(`/antennas`); } else { history.push(`/antennas/${result.payload.id}/filtering`); } } return ''; }); } }, [ history, dispatch, setSubmitting, id, title, stl, ltl, insertFeeds, listId, withMediaOnly, ignoreReblog, destination, favourite, ]); return (
{destination === 'list' && (
)} {id && mode === 'filtering' && (
)} {!id && mode === 'filtering' && (
)} {mode === 'filtering' && ( <>
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
{/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
)}
{/* 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 NewAntenna;