/// 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)}

{items.map((item) => ( ))}
DATE TITLE AUTHOR
 {item.pubDate}   {item.title}   {item.author} 
), items, bgUpdater: feedUpdater({ items, settings }), }; }, );