diff --git a/package-lock.json b/package-lock.json index 716ce23..546a170 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,18 @@ "@tanstack/react-query": "^5.63.0", "@tanstack/react-query-devtools": "^5.63.0", "axios": "^1.7.9", + "date-fns": "^4.1.0", "next": "15.1.4", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "rss": "^1.2.2" }, "devDependencies": { "@eslint/eslintrc": "^3", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@types/rss": "^0.0.32", "eslint": "^9", "eslint-config-next": "15.1.4", "postcss": "^8", @@ -1049,6 +1052,13 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/rss": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/rss/-/rss-0.0.32.tgz", + "integrity": "sha512-2oKNqKyUY4RSdvl5eZR1n2Q9yvw3XTe3mQHsFPn9alaNBxfPnbXBtGP8R0SV8pK1PrVnLul0zx7izbm5/gF5Qw==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.19.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz", @@ -1976,6 +1986,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -4845,6 +4865,37 @@ "node": ">=0.10.0" } }, + "node_modules/rss": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz", + "integrity": "sha512-xUhRTgslHeCBeHAqaWSbOYTydN2f0tAzNXvzh3stjz7QDhQMzdgHf3pfgNIngeytQflrFPfy6axHilTETr6gDg==", + "license": "MIT", + "dependencies": { + "mime-types": "2.1.13", + "xml": "1.0.1" + } + }, + "node_modules/rss/node_modules/mime-db": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz", + "integrity": "sha512-5k547tI4Cy+Lddr/hdjNbBEWBwSl8EBc5aSdKvedav8DReADgWJzcYiktaRIw3GtGC1jjwldXtTzvqJZmtvC7w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rss/node_modules/mime-types": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz", + "integrity": "sha512-ryBDp1Z/6X90UvjUK3RksH0IBPM137T7cmg4OgD5wQBojlAiUwuok0QeELkim/72EtcYuNlmbkrcGuxj3Kl0YQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.25.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5970,6 +6021,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, "node_modules/yaml": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", diff --git a/package.json b/package.json index 9d5e56e..96cddb3 100644 --- a/package.json +++ b/package.json @@ -15,15 +15,18 @@ "@tanstack/react-query": "^5.63.0", "@tanstack/react-query-devtools": "^5.63.0", "axios": "^1.7.9", + "date-fns": "^4.1.0", "next": "15.1.4", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "rss": "^1.2.2" }, "devDependencies": { "@eslint/eslintrc": "^3", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@types/rss": "^0.0.32", "eslint": "^9", "eslint-config-next": "15.1.4", "postcss": "^8", diff --git a/src/lib/api.tsx b/src/lib/api.tsx index 3829e55..caa9dd5 100644 --- a/src/lib/api.tsx +++ b/src/lib/api.tsx @@ -1,3 +1,4 @@ +import { subDays } from "date-fns"; import { Book, Chapter, Editor } from "./types"; const API_URL = process.env.NEXT_PUBLIC_API_URL as string; @@ -48,6 +49,14 @@ export async function fetchBooks(): Promise { return data.data; } +export async function fetchChaptersRSS(): Promise { + const currentDateTime = new Date() + const yesterday = subDays(currentDateTime, 1); + const data = await fetchFromAPI<{ data: Chapter[] }> + (`/api/chapters?populate=book&filters[release_datetime][$lte]=${currentDateTime.toISOString()}&filters[release_datetime][$gte]=${yesterday.toISOString()}`); + return data.data; +} + export async function fetchBookChapterLinks(bookId: string): Promise { const currentDateTime = new Date().toISOString(); const data = await fetchFromAPI<{ data: Book }>(`/api/books/${bookId}?populate[chapters][filters][release_datetime][$lte]=${currentDateTime}`);