Something went wrong. Try again.
React blog kit backed by AT Protocol. Provides filtering UI, pagination, Bluesky comments/embeds, subscribe widget, and markdown rendering.
Something went wrong. Try again.
1.6 kB · 54 lines
TypeScript
at main
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455"use client";
import { createContext, createElement, useContext, type ReactNode } from "react";
export interface BlogTelemetry { logClientEvent(name: string, data: Record<string, unknown>): void; logServerEvent(name: string, data: Record<string, unknown>): Promise<void> | void;}
// Default — emits structured wide events to stdout. Consumers replace this with// an Axiom/Convex/whatever adapter via `BlogConfig.telemetry`. PII rules in// docs/logging-strategy.md still apply to whatever the caller hands in `data`.function emit( source: "atproto-presskit/client" | "atproto-presskit/server", name: string, data: Record<string, unknown>,) { console.log(JSON.stringify({ eventName: name, timestamp: Date.now(), source, data }));}
export const consoleTelemetry: BlogTelemetry = { logClientEvent(name, data) { emit("atproto-presskit/client", name, data); }, logServerEvent(name, data) { emit("atproto-presskit/server", name, data); },};
// Use when you want to silence telemetry entirely (tests, opt-out consumers).export const noopTelemetry: BlogTelemetry = { logClientEvent() {}, logServerEvent() {},};
const TelemetryContext = createContext<BlogTelemetry>(consoleTelemetry);
export function BlogTelemetryProvider({ telemetry, children,}: { telemetry?: BlogTelemetry; children: ReactNode;}) { return createElement( TelemetryContext.Provider, { value: telemetry ?? consoleTelemetry }, children, );}
export function useBlogTelemetry(): BlogTelemetry { return useContext(TelemetryContext);}