diff --git a/src/components/AddFeedModal.svelte b/src/components/AddFeedModal.svelte index 5296eb1..86a08f7 100644 --- a/src/components/AddFeedModal.svelte +++ b/src/components/AddFeedModal.svelte @@ -26,7 +26,7 @@ lastFetched: Date.now(), fetchInterval: 30, enabled: true, - consecutiveErrors: 0 + consecutiveErrors: 0, }); await db.saveArticles(articles); await newsStore.refresh(); @@ -40,26 +40,37 @@
- - -
+ +

Add RSS Feed

-
-
{ e.preventDefault(); handleSubmit(); }}> + { + e.preventDefault(); + handleSubmit(); + }} + >
- - -
{/if} - - - @@ -161,8 +176,14 @@
{#if article.imageUrl} -
- +
+
{/if} diff --git a/src/components/Navbar.svelte b/src/components/Navbar.svelte index d26aa45..66b1e5c 100644 --- a/src/components/Navbar.svelte +++ b/src/components/Navbar.svelte @@ -5,17 +5,35 @@ let { onAddFeed } = $props(); -
+
- - @@ -33,9 +66,9 @@
- diff --git a/src/components/Sidebar.svelte b/src/components/Sidebar.svelte index 3568f35..e4fbf28 100644 --- a/src/components/Sidebar.svelte +++ b/src/components/Sidebar.svelte @@ -2,17 +2,35 @@ import { newsStore } from '$lib/store.svelte'; import { db } from '$lib/db'; import { exportToOPML, parseOPML } from '$lib/opml'; - import { Home, Star, Bookmark, Hash, Settings as SettingsIcon, ChevronRight, ChevronDown, AlertCircle, Edit2, GripVertical, Plus, Trash2, Save, X, Download, Upload, GitBranch } from 'lucide-svelte'; + import { + Home, + Star, + Bookmark, + Hash, + Settings as SettingsIcon, + ChevronRight, + ChevronDown, + AlertCircle, + Edit2, + GripVertical, + Plus, + Trash2, + Save, + X, + Download, + Upload, + GitBranch, + } from 'lucide-svelte'; import { toast } from '$lib/toast.svelte'; import { slide } from 'svelte/transition'; let { onOpenSettings } = $props(); - + let expandedCategories = $state>({}); $effect(() => { // Expand new categories by default - newsStore.categories.forEach(cat => { + newsStore.categories.forEach((cat) => { if (expandedCategories[cat.id] === undefined) { expandedCategories[cat.id] = true; } @@ -38,7 +56,7 @@ function getFeedsForCategory(categoryId: string) { return newsStore.feeds - .filter(f => f.categoryId === categoryId) + .filter((f) => f.categoryId === categoryId) .sort((a, b) => a.order - b.order); } @@ -66,34 +84,34 @@ if (draggedCategoryId && targetType === 'category') { const cats = [...newsStore.categories].sort((a, b) => a.order - b.order); - const fromIndex = cats.findIndex(c => c.id === draggedCategoryId); - const toIndex = cats.findIndex(c => c.id === targetId); - + const fromIndex = cats.findIndex((c) => c.id === draggedCategoryId); + const toIndex = cats.findIndex((c) => c.id === targetId); + if (fromIndex !== -1 && toIndex !== -1 && fromIndex !== toIndex) { const [moved] = cats.splice(fromIndex, 1); cats.splice(toIndex, 0, moved); - await newsStore.reorderCategories(cats.map(c => c.id)); + await newsStore.reorderCategories(cats.map((c) => c.id)); } } else if (draggedFeedId && targetType === 'feed') { - const sourceFeed = newsStore.feeds.find(f => f.id === draggedFeedId); - const targetFeed = newsStore.feeds.find(f => f.id === targetId); - + const sourceFeed = newsStore.feeds.find((f) => f.id === draggedFeedId); + const targetFeed = newsStore.feeds.find((f) => f.id === targetId); + if (sourceFeed && targetFeed && sourceFeed.categoryId === targetFeed.categoryId) { const catFeeds = newsStore.feeds - .filter(f => f.categoryId === sourceFeed.categoryId) + .filter((f) => f.categoryId === sourceFeed.categoryId) .sort((a, b) => a.order - b.order); - - const fromIndex = catFeeds.findIndex(f => f.id === draggedFeedId); - const toIndex = catFeeds.findIndex(f => f.id === targetId); - + + const fromIndex = catFeeds.findIndex((f) => f.id === draggedFeedId); + const toIndex = catFeeds.findIndex((f) => f.id === targetId); + if (fromIndex !== -1 && toIndex !== -1 && fromIndex !== toIndex) { const [moved] = catFeeds.splice(fromIndex, 1); catFeeds.splice(toIndex, 0, moved); - await newsStore.reorderFeeds(catFeeds.map(f => f.id)); + await newsStore.reorderFeeds(catFeeds.map((f) => f.id)); } } } - + draggedCategoryId = null; draggedFeedId = null; } @@ -111,7 +129,7 @@ async function saveCategory() { if (!editingCategoryId) return; - const cat = newsStore.categories.find(c => c.id === editingCategoryId); + const cat = newsStore.categories.find((c) => c.id === editingCategoryId); if (cat) { await newsStore.updateCategory({ ...cat, name: editingCategoryName }); } @@ -126,13 +144,16 @@ async function saveFeed() { if (!editingFeedId) return; - const feed = newsStore.feeds.find(f => f.id === editingFeedId); + const feed = newsStore.feeds.find((f) => f.id === editingFeedId); if (feed) { - await newsStore.updateFeed({ - ...feed, - title: editingFeedTitle, - id: editingFeedUrl - }, editingFeedId); + await newsStore.updateFeed( + { + ...feed, + title: editingFeedTitle, + id: editingFeedUrl, + }, + editingFeedId + ); } editingFeedId = null; } @@ -145,14 +166,14 @@ try { const text = await file.text(); const { feeds, categories } = parseOPML(text); - + if (categories.length > 0) { await db.saveCategories(categories as any); } if (feeds.length > 0) { await db.saveFeeds(feeds as any); } - + toast.success(`Imported ${feeds.length} feeds`); await newsStore.init(); } catch (err) { @@ -183,234 +204,315 @@ } - diff --git a/src/components/Toasts.svelte b/src/components/Toasts.svelte index 4910722..98d9bd6 100644 --- a/src/components/Toasts.svelte +++ b/src/components/Toasts.svelte @@ -7,27 +7,31 @@ info: Info, success: CheckCircle, error: AlertCircle, - warning: AlertTriangle + warning: AlertTriangle, }; const colors = { info: 'text-blue-500 bg-bg-secondary/95 border-blue-500/30', success: 'text-green-500 bg-bg-secondary/95 border-green-500/30', error: 'text-red-500 bg-bg-secondary/95 border-red-500/30', - warning: 'text-yellow-500 bg-bg-secondary/95 border-yellow-500/30' + warning: 'text-yellow-500 bg-bg-secondary/95 border-yellow-500/30', }; -
+
{#each toast.toasts as t (t.id)} -

{t.message}

-
{/each}
-