- Add auth redirect in root layout for unauthenticated users - Proxy OIDC routes (/login, /callback, /logout) through Vite dev server - Strip Secure flag from OIDC cookies in dev mode (HTTP localhost) - Disable retry on auth query to prevent stale cookie loops - Fix SQLite .get()/.all()/.run() calls in category and global-item services for PostgreSQL compatibility - Add userId scoping to category service functions - Add OIDC error logging in auth middleware - Apply linter auto-formatting across affected files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
67 lines
1.4 KiB
TypeScript
67 lines
1.4 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
import { apiDelete, apiGet, apiPost } from "../lib/api";
|
|
|
|
interface AuthState {
|
|
user: { id: string; email?: string } | null;
|
|
authenticated: boolean;
|
|
}
|
|
|
|
export function useAuth() {
|
|
return useQuery({
|
|
queryKey: ["auth"],
|
|
queryFn: () => apiGet<AuthState>("/api/auth/me"),
|
|
staleTime: 5 * 60 * 1000,
|
|
retry: false,
|
|
});
|
|
}
|
|
|
|
export function useLogout() {
|
|
const logout = () => {
|
|
window.location.href = "/logout";
|
|
};
|
|
return { logout };
|
|
}
|
|
|
|
interface ApiKeyListItem {
|
|
id: number;
|
|
name: string;
|
|
keyPrefix: string;
|
|
createdAt: string;
|
|
}
|
|
|
|
interface ApiKeyResponse {
|
|
id: number;
|
|
name: string;
|
|
key: string;
|
|
prefix: string;
|
|
}
|
|
|
|
export function useApiKeys() {
|
|
return useQuery({
|
|
queryKey: ["apiKeys"],
|
|
queryFn: () => apiGet<ApiKeyListItem[]>("/api/auth/keys"),
|
|
});
|
|
}
|
|
|
|
export function useCreateApiKey() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (data: { name: string }) =>
|
|
apiPost<ApiKeyResponse>("/api/auth/keys", data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["apiKeys"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteApiKey() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) =>
|
|
apiDelete<{ success: boolean }>(`/api/auth/keys/${id}`),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ["apiKeys"] });
|
|
},
|
|
});
|
|
}
|