Something went wrong. Try again.
Monorepo for Tangled
Something went wrong. Try again.
TypeScript
at sl/gitmirror
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172import type * as ShTangledActorDefs from "$lib/api/lexicons/types/sh/tangled/actor/defs";import type * as ShTangledFeedGetTimeline from "$lib/api/lexicons/types/sh/tangled/feed/getTimeline";
type TimelineItem = ShTangledFeedGetTimeline.$output["feed"][number];
export interface TimelineEvent<E> { event: E; eventAt: string;}
interface Group<K extends string, E> { kind: K; key: string; actor: ShTangledActorDefs.ProfileViewBasic; items: TimelineEvent<E>[];}
export type TimelineEntry = | Group<"follow", ShTangledFeedGetTimeline.FollowEvent> | Group<"star", ShTangledFeedGetTimeline.StarEvent> | Group<"create" | "fork", ShTangledFeedGetTimeline.RepoEvent>;
const GROUP_WINDOW_MS = 60 * 60 * 1000;
const withinWindow = (a: string, b: string) => Math.abs(Date.parse(a) - Date.parse(b)) < GROUP_WINDOW_MS;
const toEntry = ({ event, eventAt }: TimelineItem): TimelineEntry | undefined => { switch (event.$type) { case "sh.tangled.feed.getTimeline#followEvent": return { kind: "follow", key: event.uri, actor: event.actor, items: [{ event, eventAt }] }; case "sh.tangled.feed.getTimeline#starEvent": return { kind: "star", key: event.uri, actor: event.actor, items: [{ event, eventAt }] }; case "sh.tangled.feed.getTimeline#repoEvent": return { kind: event.source ? "fork" : "create", key: event.uri, actor: event.repo.owner, items: [{ event, eventAt }] }; }};
export const groupTimeline = (feed: TimelineItem[]): TimelineEntry[] => { const entries: TimelineEntry[] = []; for (const item of feed) { const next = toEntry(item); if (!next) continue; const last = entries.at(-1); if ( last?.kind === next.kind && last.actor.did === next.actor.did && withinWindow(last.items.at(-1)!.eventAt, item.eventAt) ) { (last.items as unknown[]).push(...next.items); } else { entries.push(next); } } return entries;};