"use client"; /** * MIRROR of main frontend `frontend/src/lib/useMe.ts` — keep in sync manually. * * Tradein-mvp — отдельный Next.js bundle с basePath=/trade-in. `apiFetch` * автоматически префиксит `API_BASE_URL` (= `/trade-in` в проде, "" в dev), * поэтому путь `/api/v1/me` в проде превращается в `/trade-in/api/v1/me` → * Caddy `uri strip_prefix /trade-in` → tradein-backend `/api/v1/me`. * Tradein-backend имеет mirror endpoint `/me` (см. `tradein-mvp/backend/app/api/v1/me.py`). */ import { useQuery } from "@tanstack/react-query"; import { apiFetchWithStatus, HTTPError } from "@/lib/api"; export type Role = "admin" | "pilot"; export interface UserScope { username: string; role: Role; allowed_paths: string[]; deny_paths: string[]; // #657 brand-by-account: slug бренда, привязанный к аккаунту (praktika→"praktika"). // null/undefined = generic UI. useBrand применяет его автоматически на login. brand?: string | null; } export const ME_QUERY_KEY = ["auth", "me"] as const; async function fetchMe(): Promise { const { body } = await apiFetchWithStatus("/api/v1/me"); return body; } export function useMe() { return useQuery({ queryKey: ME_QUERY_KEY, queryFn: fetchMe, staleTime: Infinity, gcTime: Infinity, refetchOnWindowFocus: false, refetchOnReconnect: false, refetchOnMount: false, retry: (failureCount, error) => { if (error instanceof HTTPError && (error.status === 401 || error.status === 403)) { return false; } return failureCount < 2; }, }); }