From 289423af838631d2abeb227b6ca9ba19026ba21b Mon Sep 17 00:00:00 2001 From: Silberengel Date: Wed, 18 Mar 2026 17:33:45 +0100 Subject: [PATCH] refine spells --- .../primary/SpellsPage/CreateSpellDialog.tsx | 29 ++++-- src/pages/primary/SpellsPage/index.tsx | 91 ++++++++++++++++++- src/services/indexed-db.service.ts | 18 ++++ 3 files changed, 125 insertions(+), 13 deletions(-) diff --git a/src/pages/primary/SpellsPage/CreateSpellDialog.tsx b/src/pages/primary/SpellsPage/CreateSpellDialog.tsx index ca9d1aac..c26c37df 100644 --- a/src/pages/primary/SpellsPage/CreateSpellDialog.tsx +++ b/src/pages/primary/SpellsPage/CreateSpellDialog.tsx @@ -231,14 +231,27 @@ export default function CreateSpellDialog({ /> -
- setForm((f) => ({ ...f, closeOnEose: e.target.checked }))} - /> - +
+ +
+ + +
+

+ {form.closeOnEose ? t('Fetch once, then stop.') : t('Live feed; keeps updating.')} +

diff --git a/src/pages/primary/SpellsPage/index.tsx b/src/pages/primary/SpellsPage/index.tsx index 2da994c8..cda427ff 100644 --- a/src/pages/primary/SpellsPage/index.tsx +++ b/src/pages/primary/SpellsPage/index.tsx @@ -1,5 +1,17 @@ import NoteList from '@/components/NoteList' import { Button } from '@/components/ui/button' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle +} from '@/components/ui/dialog' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger +} from '@/components/ui/dropdown-menu' import PrimaryPageLayout from '@/layouts/PrimaryPageLayout' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { useNostr } from '@/providers/NostrProvider' @@ -13,7 +25,7 @@ import { spellIsCount } from '@/services/spell.service' import { TFeedSubRequest } from '@/types' -import { ChevronLeft, Plus, Wand2 } from 'lucide-react' +import { ChevronLeft, FileText, MoreVertical, Plus, Trash2, Wand2 } from 'lucide-react' import type { Event } from 'nostr-tools' import { forwardRef, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -28,6 +40,7 @@ const SpellsPage = forwardRef(function SpellsPage(_, ref) { const [favoriteIds, setFavoriteIds] = useState>(new Set()) const [selectedSpell, setSelectedSpell] = useState(null) const [createOpen, setCreateOpen] = useState(false) + const [definitionSpell, setDefinitionSpell] = useState(null) const [subRequests, setSubRequests] = useState([]) const [contacts, setContacts] = useState([]) @@ -90,6 +103,17 @@ const SpellsPage = forwardRef(function SpellsPage(_, ref) { setFavoriteIds(set) }, []) + const handleDeleteSpell = useCallback( + async (spell: Event) => { + await indexedDb.deleteSpellEvent(spell.id) + const ids = await indexedDb.getSpellFavoriteIds() + await indexedDb.setSpellFavoriteIds(ids.filter((id) => id !== spell.id)) + if (selectedSpell?.id === spell.id) setSelectedSpell(null) + loadSpells() + }, + [loadSpells, selectedSpell?.id] + ) + const orderedSpells = [...spells].sort((a, b) => { const aFav = favoriteIds.has(a.id) const bFav = favoriteIds.has(b.id) @@ -146,9 +170,6 @@ const SpellsPage = forwardRef(function SpellsPage(_, ref) { {t('Create a Spell')} -
- {t('Select a spell to run its filter and see the feed.')} -
    {orderedSpells.length === 0 && (
  • {t('No spells yet. Create one above.')}
  • @@ -157,11 +178,36 @@ const SpellsPage = forwardRef(function SpellsPage(_, ref) {
  • + + + + + + setDefinitionSpell(spell)}> + + {t('View definition')} + + handleDeleteSpell(spell)} + > + + {t('Delete')} + + +