import { defineStore } from "pinia"; import { computed, ref } from "vue"; import * as api from "../services/api"; import * as signer from "../services/signer"; export const useAuthStore = defineStore("auth", () => { const stored = api.loadToken(); const npub = ref(stored?.npub ?? null); const token = ref(stored?.token ?? null); const error = ref(null); const busy = ref(false); const isLoggedIn = computed(() => !!token.value); async function loginExtension(): Promise { error.value = null; busy.value = true; try { await signer.loginWithExtension(); const r = await api.login(); token.value = r.token; npub.value = r.npub; api.saveToken(r.token, r.npub); } catch (e) { signer.clearSigner(); error.value = e instanceof Error ? e.message : "Login failed"; throw e; } finally { busy.value = false; } } async function loginBunker(uri: string): Promise { error.value = null; busy.value = true; try { await signer.loginWithBunker(uri); const r = await api.login(); token.value = r.token; npub.value = r.npub; api.saveToken(r.token, r.npub); } catch (e) { signer.clearSigner(); error.value = e instanceof Error ? e.message : "Login failed"; throw e; } finally { busy.value = false; } } function logout(): void { api.clearToken(); signer.clearSigner(); token.value = null; npub.value = null; error.value = null; } return { npub, token, error, busy, isLoggedIn, loginExtension, loginBunker, logout }; });