import { create } from "zustand"; import { api } from "@/lib/api"; import { effectiveCredentials, updateBlacklist, verifyE621Credentials, type E621Credentials, type E621User, } from "@/lib/e621"; interface E621State { credentials: E621Credentials | null; profile: E621User | null; blacklist: string[]; loading: boolean; ready: boolean; load: () => Promise; loadBlacklist: () => Promise; saveBlacklist: (lines: string[]) => Promise; save: (values: { username: string; api_key: string; base_url: string; }) => Promise; clear: () => void; } export const useE621 = create((set, get) => ({ credentials: null, profile: null, blacklist: [], loading: false, ready: false, load: async () => { set({ loading: true }); try { const credentials = await api("/api/auth/e621/"); set({ credentials, ready: true, loading: false }); void get().loadBlacklist(); } catch { set({ credentials: null, ready: true, loading: false }); } }, loadBlacklist: async () => { try { const user = await verifyE621Credentials( effectiveCredentials(get().credentials), ); const tags = (user.blacklisted_tags ?? "") .split("\n") .map((tag) => tag.trim()) .filter(Boolean); set({ blacklist: tags, profile: user }); } catch { // Keep the last known blacklist when e621 is unreachable. } }, saveBlacklist: async (lines) => { const credentials = get().credentials; const profile = get().profile; if (!credentials?.configured || !profile) { throw new Error("Add e621 credentials in Account to edit your blacklist."); } await updateBlacklist(credentials, profile.id, lines.join("\n")); set({ blacklist: lines }); await get().loadBlacklist(); }, save: async (values) => { const credentials = await api("/api/auth/e621/", { method: "PUT", json: values, }); set({ credentials }); void get().loadBlacklist(); return credentials; }, clear: () => set({ credentials: null, profile: null, blacklist: [], ready: false }), }));