Build Verse: a poem-quote app on the agent-native chat template
CI / build (push) Successful in 4m26s
CI / build (push) Successful in 4m26s
Adds a Postgres-backed quotes domain (poems/quotes/favorites) exposed as five agent-native actions (list-quotes, get-random-quote, create-quote, toggle-favorite, list-favorites) callable from both chat and the React UI via useActionQuery/useActionMutation. Moves the primary UI from chat to a mobile-first Quotes/Favorites experience (chat moves to /chat), adds manual OpenTelemetry instrumentation exporting traces/metrics/logs over OTLP, and wires a local Docker Postgres for shared state.
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
import { useState } from "react";
|
||||
|
||||
const STORAGE_KEY = "verse-quote-app.visitor-id";
|
||||
|
||||
function generateId(): string {
|
||||
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
||||
return crypto.randomUUID();
|
||||
}
|
||||
return `v-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* A stable anonymous id for this browser, used to scope favorites without
|
||||
* requiring a login. Not a real user identity — just enough to remember
|
||||
* "your" favorites on this device.
|
||||
*/
|
||||
export function getVisitorId(): string {
|
||||
if (typeof window === "undefined") return "";
|
||||
try {
|
||||
const existing = window.localStorage.getItem(STORAGE_KEY);
|
||||
if (existing) return existing;
|
||||
const created = generateId();
|
||||
window.localStorage.setItem(STORAGE_KEY, created);
|
||||
return created;
|
||||
} catch {
|
||||
return generateId();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* React hook wrapper around getVisitorId(). Routes that use this render only
|
||||
* an SSR loading shell (see DEVELOPING.md), so reading localStorage during
|
||||
* the initial client render here does not cause a hydration mismatch.
|
||||
*/
|
||||
export function useVisitorId(): string {
|
||||
const [visitorId] = useState(() => getVisitorId());
|
||||
return visitorId;
|
||||
}
|
||||
Reference in New Issue
Block a user