tracks lexicons and how many times they appeared on the jetstream

feat(client): show tracking since

ptr.pet d275783d 999365ad

verified
Changed files
+23 -3
client
src
+13 -1
client/src/lib/api.ts
···
import { dev } from "$app/environment";
-
import type { Events } from "./types";
+
import type { Events, Since } from "./types";
import { PUBLIC_API_URL } from "$env/static/public";
export const fetchEvents = async (): Promise<Events> => {
···
const data = await response.json();
return data;
};
+
+
export const fetchTrackingSince = async (): Promise<Since> => {
+
const response = await fetch(
+
`${dev ? "http" : "https"}://${PUBLIC_API_URL}/since`,
+
);
+
if (!response.ok) {
+
throw new Error(`(${response.status}): ${await response.json()}`);
+
}
+
+
const data = await response.json();
+
return data;
+
};
+3
client/src/lib/types.ts
···
count: number;
deleted_count: number;
};
+
export type Since = {
+
since: number;
+
};
export type SortOption = "total" | "created" | "deleted" | "date";
+7 -2
client/src/routes/+page.svelte
···
import { onMount, onDestroy } from "svelte";
import { writable } from "svelte/store";
import { PUBLIC_API_URL } from "$env/static/public";
-
import { fetchEvents } from "$lib/api";
+
import { fetchEvents, fetchTrackingSince } from "$lib/api";
import { createRegexFilter } from "$lib/filter";
import StatsCard from "$lib/components/StatsCard.svelte";
import StatusBadge from "$lib/components/StatusBadge.svelte";
···
import SortControls from "$lib/components/SortControls.svelte";
import BskyToggle from "$lib/components/BskyToggle.svelte";
import RefreshControl from "$lib/components/RefreshControl.svelte";
+
import { formatTimestamp } from "$lib/format";
const events = writable(new Map<string, EventRecord>());
const pendingUpdates = new Map<string, EventRecord>();
···
.toArray();
});
let per_second = $state(0);
+
let tracking_since = $state(0);
let all: EventRecord = $derived(
eventsList.reduce(
···
}
return map;
});
+
tracking_since = (await fetchTrackingSince()).since;
} catch (err) {
error =
err instanceof Error
···
>
<h1 class="text-4xl font-bold mr-4 text-gray-900">lexicon tracker</h1>
<p class="text-lg mt-1 text-gray-600">
-
tracks lexicons seen on the jetstream
+
tracks lexicons seen on the jetstream {tracking_since === 0
+
? ""
+
: `(since: ${formatTimestamp(tracking_since)})`}
</p>
</div>
</header>