///
import {
Cell,
cell,
Default,
derive,
fetchData,
handler,
NAME,
recipe,
str,
UI,
} from "commontools";
import { type FeedItem, parseRSSFeed } from "./rss-utils.ts";
interface Settings {
feedUrl: Cell>;
limit: Default;
}
const feedUpdater = handler;
settings: Settings;
}>((_, { items, settings }) => {
if (!settings.feedUrl) {
console.warn("no feed URL provided");
return;
}
const query = fetchData({ url: settings.feedUrl, mode: "text" });
return derive(
{ items, query, limit: settings.limit },
({ query, limit, items }) => {
if (!query.result || typeof query.result !== "string") return;
const newEntries = parseRSSFeed(
query.result as string,
limit,
new Set(items.get().map((item) => item.id)),
);
items.push(...newEntries);
},
);
});
export default recipe<
{ settings: Settings }
>(
"rss importer",
({ settings }) => {
const items = cell([]);
console.log("feed items", items.get().length);
return {
[NAME]: str`RSS/Atom Feed Importer ${settings.feedUrl}`,
[UI]: (
Feed Items: {derive(items, (items) => items.get().length)}
| DATE |
TITLE |
AUTHOR |
{items.map((item) => (
|
{item.pubDate}
|
{item.title}
|
{item.author}
|
))}
),
items,
bgUpdater: feedUpdater({ items, settings }),
};
},
);