import React, { useEffect, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { fetchFilters, createFilter, deleteFilter } from 'soapbox/actions/filters'; import List, { ListItem } from 'soapbox/components/list'; import ScrollableList from 'soapbox/components/scrollable-list'; import { Button, CardHeader, CardTitle, Column, Form, FormActions, FormGroup, HStack, IconButton, Input, Stack, Text, Toggle } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import toast from 'soapbox/toast'; const messages = defineMessages({ heading: { id: 'column.filters', defaultMessage: 'Muted words' }, subheading_add_new: { id: 'column.filters.subheading_add_new', defaultMessage: 'Add New Filter' }, keyword: { id: 'column.filters.keyword', defaultMessage: 'Keyword or phrase' }, expires: { id: 'column.filters.expires', defaultMessage: 'Expire after' }, expires_hint: { id: 'column.filters.expires_hint', defaultMessage: 'Expiration dates are not currently supported' }, home_timeline: { id: 'column.filters.home_timeline', defaultMessage: 'Home timeline' }, public_timeline: { id: 'column.filters.public_timeline', defaultMessage: 'Public timeline' }, notifications: { id: 'column.filters.notifications', defaultMessage: 'Notifications' }, conversations: { id: 'column.filters.conversations', defaultMessage: 'Conversations' }, drop_header: { id: 'column.filters.drop_header', defaultMessage: 'Drop instead of hide' }, drop_hint: { id: 'column.filters.drop_hint', defaultMessage: 'Filtered posts will disappear irreversibly, even if filter is later removed' }, whole_word_header: { id: 'column.filters.whole_word_header', defaultMessage: 'Whole word' }, whole_word_hint: { id: 'column.filters.whole_word_hint', defaultMessage: 'When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word' }, add_new: { id: 'column.filters.add_new', defaultMessage: 'Add New Filter' }, create_error: { id: 'column.filters.create_error', defaultMessage: 'Error adding filter' }, delete_error: { id: 'column.filters.delete_error', defaultMessage: 'Error deleting filter' }, subheading_filters: { id: 'column.filters.subheading_filters', defaultMessage: 'Current Filters' }, delete: { id: 'column.filters.delete', defaultMessage: 'Delete' }, }); const contexts = { home: messages.home_timeline, public: messages.public_timeline, notifications: messages.notifications, thread: messages.conversations, }; // const expirations = { // null: 'Never', // // 3600: '30 minutes', // // 21600: '1 hour', // // 43200: '12 hours', // // 86400 : '1 day', // // 604800: '1 week', // }; const Filters = () => { const intl = useIntl(); const dispatch = useAppDispatch(); const filters = useAppSelector((state) => state.filters); const [phrase, setPhrase] = useState(''); const [expiresAt] = useState(''); const [homeTimeline, setHomeTimeline] = useState(true); const [publicTimeline, setPublicTimeline] = useState(false); const [notifications, setNotifications] = useState(false); const [conversations, setConversations] = useState(false); const [irreversible, setIrreversible] = useState(false); const [wholeWord, setWholeWord] = useState(true); // const handleSelectChange = e => { // this.setState({ [e.target.name]: e.target.value }); // }; const handleAddNew: React.FormEventHandler = e => { e.preventDefault(); const context: Array = []; if (homeTimeline) { context.push('home'); } if (publicTimeline) { context.push('public'); } if (notifications) { context.push('notifications'); } if (conversations) { context.push('thread'); } dispatch(createFilter(phrase, expiresAt, context, wholeWord, irreversible)).then(() => { return dispatch(fetchFilters()); }).catch(error => { toast.error(intl.formatMessage(messages.create_error)); }); }; const handleFilterDelete = (id: string) => () => { dispatch(deleteFilter(id)).then(() => { return dispatch(fetchFilters()); }).catch(() => { toast.error(intl.formatMessage(messages.delete_error)); }); }; useEffect(() => { dispatch(fetchFilters()); }, []); const emptyMessage = ; return (
setPhrase(target.value)} /> {/* */} setHomeTimeline(target.checked)} /> setPublicTimeline(target.checked)} /> setNotifications(target.checked)} /> setConversations(target.checked)} /> setIrreversible(target.checked)} /> setWholeWord(target.checked)} />
{filters.map((filter, i) => ( {' '} {filter.phrase} {' '} {filter.context.map(context => contexts[context] ? intl.formatMessage(contexts[context]) : context).join(', ')} {filter.irreversible ? : } {filter.whole_word && ( )} ))}
); }; export default Filters;