From ced8f2653771f59f6f13085f3e5949d8841b9889 Mon Sep 17 00:00:00 2001 From: ld3zian <42660576+ld3z@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:07:51 -0700 Subject: [PATCH 1/3] bump deps --- package-lock.json | 45 ++++++++++++++++++++------------------------- package.json | 6 +++--- 2 files changed, 23 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca57b80..ac682b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,12 @@ "dependencies": { "@astrojs/rss": "^4.0.11", "@astrojs/tailwind": "^6.0.0", - "@astrojs/vercel": "^8.0.6", + "@astrojs/vercel": "^8.0.7", "@floating-ui/dom": "^1.6.13", - "@types/node": "^22.13.1", + "@types/node": "^22.13.4", "@vercel/analytics": "^1.5.0", "@vercel/kv": "^3.0.0", - "astro": "^5.2.5", + "astro": "^5.3.0", "feed": "^4.2.2", "ioredis": "^5.5.0", "tailwindcss": "^3.4.1" @@ -38,9 +38,9 @@ "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.2.tgz", - "integrity": "sha512-EdDWkC3JJVcpGpqJAU/5hSk2LKXyG3mNGkzGoAuyK+xoPHbaVdSuIWoN1QTnmK3N/gGfaaAfM8gO2KDCAW7S3w==" + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.5.1.tgz", + "integrity": "sha512-M7rAge1n2+aOSxNvKUFa0u/KFn0W+sZy7EW91KOSERotm2Ti8qs+1K0xx3zbOxtAVrmJb5/J98eohVvvEqtNkw==" }, "node_modules/@astrojs/markdown-remark": { "version": "6.1.0", @@ -121,15 +121,15 @@ } }, "node_modules/@astrojs/vercel": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@astrojs/vercel/-/vercel-8.0.6.tgz", - "integrity": "sha512-5lchUcf1HC8O8zQVJSTyGxZ9rxDsOj6NeueSC+qO5fZDlQXxf4avEzuJaHN2q1qNS9fZLOGEzcPgT0hNfHYBXg==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@astrojs/vercel/-/vercel-8.0.7.tgz", + "integrity": "sha512-2DPqPGZ/Et4afpJt8CAoIql2S649rzEmLBNJPHUGBysP0JklMaZ05HhQVKr+qEhZSm3NrVccxpkiIG/eLW3nPg==", "dependencies": { - "@astrojs/internal-helpers": "^0.4.2", + "@astrojs/internal-helpers": "^0.5.1", "@vercel/analytics": "^1.4.1", "@vercel/edge": "^1.2.1", "@vercel/nft": "^0.29.0", - "@vercel/routing-utils": "5.0.2", + "@vercel/routing-utils": "^5.0.4", "esbuild": "^0.24.0", "fast-glob": "^3.3.3" }, @@ -1464,9 +1464,9 @@ } }, "node_modules/@types/node": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", - "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dependencies": { "undici-types": "~6.20.0" } @@ -1568,9 +1568,9 @@ } }, "node_modules/@vercel/routing-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-5.0.2.tgz", - "integrity": "sha512-uJViB3+HEo+kzHYELs7cQWX5k0kCNvq9G/8nJQX8mP5Ta0fG68CBRmOaaG8A+2xbtTp/QuGORIwV8CsI9ebcNg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vercel/routing-utils/-/routing-utils-5.0.4.tgz", + "integrity": "sha512-4ke67zkXVi2fRZdoYckABcsSkRC9CnrdadOGxoS/Bk22+ObHjGQWvUHExRSXh339anwu9YY7ZacNSGH4gUnTQA==", "dependencies": { "path-to-regexp": "6.1.0", "path-to-regexp-updated": "npm:path-to-regexp@6.3.0" @@ -1753,9 +1753,9 @@ } }, "node_modules/astro": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.2.5.tgz", - "integrity": "sha512-AYXyYkc+c5xbKTm48FyQA91y81nXyNPAaoyafR0LUugE4lAwuvIUcXDBfMzmbuP1lGRvsE33G2oypv6gbGaPFg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.3.0.tgz", + "integrity": "sha512-e88l/Yk/6enR/ZDddLbqtM+oblBFk5mneNSmNesyVYGL/6Dj4UA67GPAZOk79VxT5dbLlclZSyyw/wlxN1aj3A==", "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/internal-helpers": "0.5.1", @@ -1833,11 +1833,6 @@ "sharp": "^0.33.3" } }, - "node_modules/astro/node_modules/@astrojs/internal-helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.5.1.tgz", - "integrity": "sha512-M7rAge1n2+aOSxNvKUFa0u/KFn0W+sZy7EW91KOSERotm2Ti8qs+1K0xx3zbOxtAVrmJb5/J98eohVvvEqtNkw==" - }, "node_modules/astro/node_modules/@vercel/kv": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@vercel/kv/-/kv-1.0.1.tgz", diff --git a/package.json b/package.json index d12e7c4..72b85ce 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,12 @@ "dependencies": { "@astrojs/rss": "^4.0.11", "@astrojs/tailwind": "^6.0.0", - "@astrojs/vercel": "^8.0.6", + "@astrojs/vercel": "^8.0.7", "@floating-ui/dom": "^1.6.13", - "@types/node": "^22.13.1", + "@types/node": "^22.13.4", "@vercel/analytics": "^1.5.0", "@vercel/kv": "^3.0.0", - "astro": "^5.2.5", + "astro": "^5.3.0", "feed": "^4.2.2", "ioredis": "^5.5.0", "tailwindcss": "^3.4.1" From b614d9fb3f4d089e5ecda1f68e76c4d3be688c86 Mon Sep 17 00:00:00 2001 From: ld3zian <42660576+ld3z@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:12:57 -0700 Subject: [PATCH 2/3] add importing feed ids --- src/components/SlugInput.astro | 79 +++++++++++++++++++++++++++++++++- src/pages/api/feed/[feedId].ts | 28 ++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/pages/api/feed/[feedId].ts diff --git a/src/components/SlugInput.astro b/src/components/SlugInput.astro index 72ab64e..3ce3081 100644 --- a/src/components/SlugInput.astro +++ b/src/components/SlugInput.astro @@ -1,4 +1,5 @@ --- +import { getFeedMapping } from '../lib/db'; interface Props { currentSlugs?: string[]; } @@ -42,6 +43,24 @@ const languages = [ +
+ + +
+ @@ -95,6 +114,8 @@ const languages = [ const slugList = document.getElementById('slug-list'); const generateRSSLink = document.getElementById('generate-rss'); const langSelect = document.getElementById('lang-select') as HTMLSelectElement; + const feedIdInput = document.getElementById('feed-id-input') as HTMLInputElement; + const importFeedButton = document.getElementById('import-feed'); // Load saved slugs from localStorage let slugs = new Set(JSON.parse(localStorage.getItem('comic-slugs') || '[]')); @@ -410,6 +431,62 @@ const languages = [ } } + // Import feed functionality + importFeedButton?.addEventListener('click', async () => { + const feedId = feedIdInput.value.trim(); + if (!feedId) return; + + try { + importFeedButton.disabled = true; + importFeedButton.innerHTML = ` + + + + Importing... + `; + + const response = await fetch(`/api/feed/${feedId}`); + if (!response.ok) throw new Error('Failed to fetch feed'); + + const { slugs: feedSlugs, lang } = await response.json(); + + // Update language if provided + if (lang && langSelect) { + langSelect.value = lang; + } + + // Add new slugs to existing collection + feedSlugs.forEach((slug: string) => slugs.add(slug)); + + // Update UI + updateSlugs(); + feedIdInput.value = ''; + + // Show success message + const successDiv = document.createElement('div'); + successDiv.className = 'text-sm text-green-500 mt-1'; + successDiv.textContent = 'Feed imported successfully!'; + feedIdInput.parentNode?.appendChild(successDiv); + setTimeout(() => successDiv.remove(), 3000); + + } catch (error) { + console.error('Failed to import feed:', error); + const errorDiv = document.createElement('div'); + errorDiv.className = 'text-sm text-red-500 mt-1'; + errorDiv.textContent = 'Failed to import feed. Please check the feed ID and try again.'; + feedIdInput.parentNode?.appendChild(errorDiv); + setTimeout(() => errorDiv.remove(), 3000); + } finally { + importFeedButton.disabled = false; + importFeedButton.innerHTML = ` + + + + Import Feed + `; + } + }); + // Initial render renderSlugs(); updateRSSLink(); @@ -423,4 +500,4 @@ const languages = [ searchResults?.classList.add('hidden'); } }); - \ No newline at end of file + \ No newline at end of file diff --git a/src/pages/api/feed/[feedId].ts b/src/pages/api/feed/[feedId].ts new file mode 100644 index 0000000..2fe7c8f --- /dev/null +++ b/src/pages/api/feed/[feedId].ts @@ -0,0 +1,28 @@ +import type { APIRoute } from "astro"; +import { getFeedMapping } from '../../../lib/db'; + +export const GET: APIRoute = async ({ params }) => { + const { feedId } = params; + + if (!feedId) { + return new Response("Feed ID not provided", { status: 400 }); + } + + try { + const mapping = await getFeedMapping(feedId); + + if (!mapping) { + return new Response("Feed not found", { status: 404 }); + } + + return new Response(JSON.stringify(mapping), { + status: 200, + headers: { + 'Content-Type': 'application/json' + } + }); + } catch (error) { + console.error('Error fetching feed:', error); + return new Response("Internal server error", { status: 500 }); + } +}; \ No newline at end of file From cc3d0e6dc8e950fbe77fbde733b5bb9e40e94226 Mon Sep 17 00:00:00 2001 From: ld3zian <42660576+ld3z@users.noreply.github.com> Date: Thu, 13 Feb 2025 17:17:03 -0700 Subject: [PATCH 3/3] add clear all button --- src/components/SlugInput.astro | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/components/SlugInput.astro b/src/components/SlugInput.astro index 3ce3081..3a5b5d3 100644 --- a/src/components/SlugInput.astro +++ b/src/components/SlugInput.astro @@ -66,6 +66,20 @@ const languages = [ +
+

Selected Comics

+ +
+
{currentSlugs.map(slug => (
@@ -116,6 +130,7 @@ const languages = [ const langSelect = document.getElementById('lang-select') as HTMLSelectElement; const feedIdInput = document.getElementById('feed-id-input') as HTMLInputElement; const importFeedButton = document.getElementById('import-feed'); + const clearAllButton = document.getElementById('clear-all'); // Load saved slugs from localStorage let slugs = new Set(JSON.parse(localStorage.getItem('comic-slugs') || '[]')); @@ -124,8 +139,23 @@ const languages = [ localStorage.setItem('comic-slugs', JSON.stringify([...slugs])); updateRSSLink(); renderSlugs(); + updateClearAllButton(); } + function updateClearAllButton() { + if (clearAllButton) { + clearAllButton.style.display = slugs.size > 0 ? 'flex' : 'none'; + } + } + + // Clear all functionality + clearAllButton?.addEventListener('click', () => { + if (confirm('Are you sure you want to clear all comics? This cannot be undone.')) { + slugs.clear(); + updateSlugs(); + } + }); + async function renderSlugs() { if (!slugList) return; @@ -490,6 +520,7 @@ const languages = [ // Initial render renderSlugs(); updateRSSLink(); + updateClearAllButton(); // Update RSS link when language changes langSelect?.addEventListener('change', () => updateRSSLink());