import { createQuery, createMutation } from '@tanstack/svelte-query'; export function createDeveloperQuery() { return createQuery({ queryKey: ['auth', 'developer'], queryFn: async () => { const res = await fetch(`/auth/developer`); if (!res.ok) throw new Error('Not authenticated as developer'); return res.json(); }, staleTime: 1000 * 60 * 5, }); } export function createAuthorizeMutation() { return createMutation({ mutationFn: async ({ handle }: { handle: string }) => { const res = await fetch(`/api/atproto/auth/authorize`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ handle }), }); if (!res.ok) { const text = await res.text(); let errMsg = 'Authorization failed'; try { const errJson = JSON.parse(text); errMsg = errJson.message || errMsg; } catch {} throw new Error(errMsg); } return res.json(); }, }); } export function createLogoutMutation() { return createMutation({ mutationFn: async () => { const res = await fetch(`/auth/logout`, { method: 'POST' }); return res.ok; }, }); } export interface CreatePlayerRequest { playerId: string; displayName?: string; } export interface CreatePlayerResponse { user: string; player_id: string; developer_id: string | null; created_at: string; } export function createPlayerQuery() { return createQuery({ queryKey: ['auth', 'player'], queryFn: async () => { const res = await fetch(`/auth/player`); if (!res.ok) throw new Error('Not authenticated as player'); return res.json(); }, staleTime: 1000 * 60 * 5, }); } export function createPlayerMutation() { return createMutation({ mutationFn: async ({ playerId, displayName }: CreatePlayerRequest) => { const res = await fetch(`/auth/player`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ player_id: playerId, display_name: displayName ?? `Player ${playerId.slice(0, 8)}`, }), }); if (!res.ok) { const err = await res.json(); throw new Error(err.message || 'Failed to create player session'); } return res.json() as Promise; }, }); }