import { fetchJSON, saveToken, removeToken, PAT_STORE_KEY } from './client';
import * as SecureStore from 'expo-secure-store';
import { useSettingsStore } from '../store/settingsStore';
import type { AuthUser } from '../store/authStore';
export interface MeResponse {
id: number;
username: string;
email: string;
avatarUrl: string | null;
bio: string | null;
createdAt: string;
}
export async function validateToken(host: string, token: string): Promise<AuthUser> {
useSettingsStore.getState().setHost(host);
const response = await fetch(`${host.replace(/\/$/, '')}/api/users/me`, {
headers: {
Authorization: `Bearer ${token}`,
Accept: 'application/json',
},
});
if (!response.ok) {
let msg = `HTTP ${response.status}`;
try {
const body = (await response.json()) as Record<string, unknown>;
if (typeof body.error === 'string') msg = body.error;
} catch {
}
throw new Error(msg);
}
const data = (await response.json()) as MeResponse;
return {
id: data.id,
username: data.username,
email: data.email,
avatarUrl: data.avatarUrl ?? null,
bio: data.bio ?? null,
createdAt: data.createdAt,
};
}
export async function persistToken(token: string): Promise<void> {
await saveToken(token);
}
export async function clearToken(): Promise<void> {
await removeToken();
}
export async function fetchMe(): Promise<AuthUser> {
return fetchJSON<AuthUser>('/api/users/me');
}
|