+
+
+
+ {filters.length > 0 ? (
+ <>
+
+ {filters.map((filter) => {
+ const { id, title, expiresAt, keywords } = filter;
+ return (
+ -
+
+
{title}
+ {keywords?.length > 0 && (
+
+ {keywords.map((k) => (
+ <>
+
+ {k.wholeWord ? `“${k.keyword}”` : k.keyword}
+ {' '}
+ >
+ ))}
+
+ )}
+
+
+
+
+
+
+ );
+ })}
+
+ {filters.length > 1 && (
+
+ )}
+ >
+ ) : uiState === 'loading' ? (
+
+
+
+ ) : uiState === 'error' ? (
+ Unable to load filters.
+ ) : (
+ No filters yet.
+ )}
+
+
+ {!!showFiltersAddEditModal && (
+
{
+ setShowFiltersAddEditModal(false);
+ }}
+ >
+ {
+ if (result.state === 'success') {
+ reload();
+ }
+ setShowFiltersAddEditModal(false);
+ }}
+ />
+
+ )}
+
+ );
+}
+
+function FiltersAddEdit({ filter, onClose }) {
+ const { masto } = api();
+ const [uiState, setUIState] = useState('default');
+ const editMode = !!filter;
+ const { context, expiresAt, id, keywords, title, filterAction } =
+ filter || {};
+ const hasExpiry = !!expiresAt;
+ const expiresAtDate = hasExpiry && new Date(expiresAt);
+ const [editKeywords, setEditKeywords] = useState(keywords || []);
+ const keywordsRef = useRef();
+
+ // Hacky way of handling removed keywords for both existing and new ones
+ const [removedKeywordIDs, setRemovedKeywordIDs] = useState([]);
+ const [removedNewKeywordIndices, setRemovedNewKeywordIndices] = useState([]);
+
+ return (
+