From 1b51d3fe92d035f1dd1d476e96acf175e549c1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 21 Feb 2026 21:51:44 +0100 Subject: [PATCH] nicolium: extend antenna editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/src/locales/en.json | 17 ++ .../pl-fe/src/modals/antenna-editor-modal.tsx | 182 ++++++++++++++++-- 2 files changed, 181 insertions(+), 18 deletions(-) diff --git a/packages/pl-fe/src/locales/en.json b/packages/pl-fe/src/locales/en.json index 599e08029..534d80dd2 100644 --- a/packages/pl-fe/src/locales/en.json +++ b/packages/pl-fe/src/locales/en.json @@ -260,13 +260,30 @@ "alt_text_modal.saving_failed": "Failed to save alt text", "announcements.title": "Announcements", "antennas.create": "Create antenna", + "antennas.create.error": "Error creating antenna", "antennas.create.save": "Create antenna", + "antennas.create.success": "Antenna created successfully", "antennas.delete": "Delete antenna", "antennas.edit": "Edit antenna", + "antennas.edit.destination": "Destination", + "antennas.edit.destination.antenna": "Antenna timeline only", + "antennas.edit.destination.home": "Insert to home timeline", + "antennas.edit.destination.list": "Insert to list", "antennas.edit.error": "Error updating antenna", + "antennas.edit.favourite": "Favourite", + "antennas.edit.favourite.hint": "The antenna will be marked as favourite (not used by Nicolium yet)", + "antennas.edit.ignore_reblogs": "Ignore reblogs", + "antennas.edit.ignore_reblogs.hint": "Reblogs will not be included in the antenna", + "antennas.edit.mode": "Mode", + "antennas.edit.mode.filtering": "Filtering", + "antennas.edit.mode.ltl": "Local timeline mode", + "antennas.edit.mode.stl": "Social timeline mode", "antennas.edit.save": "Save antenna", "antennas.edit.success": "Antenna updated successfully", "antennas.edit.title": "Antenna title", + "antennas.edit.with_media_only": "Media only", + "antennas.edit.with_media_only.hint": "Only include posts with media attachments", + "antennas.manage_accounts": "Manage antenna accounts", "antennas.new.create": "Add antenna", "antennas.subheading": "Your antennas", "app_create.name_label": "App name", diff --git a/packages/pl-fe/src/modals/antenna-editor-modal.tsx b/packages/pl-fe/src/modals/antenna-editor-modal.tsx index 811317fec..3e7b6ed4e 100644 --- a/packages/pl-fe/src/modals/antenna-editor-modal.tsx +++ b/packages/pl-fe/src/modals/antenna-editor-modal.tsx @@ -1,6 +1,7 @@ -import React, { useState } from 'react'; +import React, { useMemo, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; +import List, { ListItem } from '@/components/list'; import Button from '@/components/ui/button'; import Form from '@/components/ui/form'; import FormActions from '@/components/ui/form-actions'; @@ -8,7 +9,10 @@ import FormGroup from '@/components/ui/form-group'; import Input from '@/components/ui/input'; import Modal from '@/components/ui/modal'; import Spinner from '@/components/ui/spinner'; +import Toggle from '@/components/ui/toggle'; +import { SelectDropdown } from '@/features/forms'; import { useAntenna, useCreateAntenna, useUpdateAntenna } from '@/queries/accounts/use-antennas'; +import { useModalsActions } from '@/stores/modals'; import toast from '@/toast'; import type { BaseModalProps } from '@/features/ui/components/modal-root'; @@ -16,15 +20,18 @@ import type { BaseModalProps } from '@/features/ui/components/modal-root'; type Tab = 'info' | 'accounts' | 'excludedAccounts'; const messages = defineMessages({ - success: { id: 'antennas.edit.success', defaultMessage: 'Antenna updated successfully' }, - error: { id: 'antennas.edit.error', defaultMessage: 'Error updating antenna' }, + createSuccess: { id: 'antennas.create.success', defaultMessage: 'Antenna created successfully' }, + editSuccess: { id: 'antennas.edit.success', defaultMessage: 'Antenna updated successfully' }, + createError: { id: 'antennas.create.error', defaultMessage: 'Error creating antenna' }, + editError: { id: 'antennas.edit.error', defaultMessage: 'Error updating antenna' }, }); -interface IAntennaMembersForm { - antennaId?: string; +interface IAntennaAccountsForm { + antennaId: string; + excluded?: boolean; } -const AntennaMembersForm: React.FC = () => null; +const AntennaAccountsForm: React.FC = () => null; interface IEditAntennaForm { antennaId?: string; @@ -34,6 +41,7 @@ interface IEditAntennaForm { const EditAntennaForm: React.FC = ({ antennaId, onTabChange }) => { const intl = useIntl(); + const { closeModal } = useModalsActions(); const { data: antenna } = useAntenna(antennaId); const { mutate: updateAntenna, isPending: updateDisabled } = useUpdateAntenna(antennaId!); @@ -42,6 +50,13 @@ const EditAntennaForm: React.FC = ({ antennaId, onTabChange }) const disabled = antennaId ? updateDisabled : createDisabled; const [title, setTitle] = useState(antenna ? antenna.title : ''); + const [ltl, setLtl] = useState(antenna ? antenna.ltl : false); + const [stl, setStl] = useState(antenna ? antenna.stl : false); + const [insertFeeds, setInsertFeeds] = useState(antenna ? antenna.insert_feeds : false); + const [withMediaOnly, setWithMediaOnly] = useState(antenna ? antenna.with_media_only : false); + const [ignoreReblog, setIgnoreReblog] = useState(antenna ? antenna.ignore_reblog : false); + const [favourite, setFavourite] = useState(antenna ? antenna.favourite : false); + const [listId, setListId] = useState(antenna?.list?.id || undefined); const handleSubmit: React.FormEventHandler = (e) => { e.preventDefault(); @@ -50,13 +65,25 @@ const EditAntennaForm: React.FC = ({ antennaId, onTabChange }) const handleUpdate = () => { (antennaId ? updateAntenna : createAntenna)( - { title }, + { + title, + stl, + ltl, + insert_feeds: insertFeeds, + with_media_only: withMediaOnly, + ignore_reblog: ignoreReblog, + favourite, + list_id: listId, + }, { onSuccess: () => { - toast.success(intl.formatMessage(messages.success)); + toast.success( + intl.formatMessage(antennaId ? messages.editSuccess : messages.createSuccess), + ); + closeModal('ANTENNA_EDITOR'); }, onError: () => { - toast.error(intl.formatMessage(messages.error)); + toast.error(intl.formatMessage(antennaId ? messages.editError : messages.createError)); }, }, ); @@ -76,6 +103,114 @@ const EditAntennaForm: React.FC = ({ antennaId, onTabChange }) }} /> + }> + { + const value = e.target.value; + setStl(value === 'stl'); + setLtl(value === 'ltl'); + }} + /> + + } + > + { + const value = e.target.value; + setInsertFeeds(value === 'home'); + if (value === 'list') { + setListId(''); // TODO: add list selection + } else { + setListId(undefined); + } + }} + /> + + + + } + hint={ + + } + > + setWithMediaOnly(e.target.checked)} /> + + + } + hint={ + + } + > + setIgnoreReblog(e.target.checked)} /> + + } + hint={ + + } + > + setFavourite(e.target.checked)} /> + + {antennaId && ( + <> + + } + onClick={() => { + onTabChange('accounts'); + }} + /> + + )} +