48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { createStore } from "zustand/vanilla";
|
|
import { getCurrentGiteaUser, giteaConfig, type GiteaUser } from "./api";
|
|
|
|
export type StatusTone = "neutral" | "success" | "error";
|
|
|
|
interface AppState {
|
|
config: typeof giteaConfig;
|
|
connectedUser: GiteaUser | null;
|
|
isTestingConnection: boolean;
|
|
statusMessage: string;
|
|
statusTone: StatusTone;
|
|
testConnection: () => Promise<void>;
|
|
}
|
|
|
|
export const appStore = createStore<AppState>()((set) => ({
|
|
config: giteaConfig,
|
|
connectedUser: null,
|
|
isTestingConnection: false,
|
|
statusMessage: "Ready.",
|
|
statusTone: "neutral",
|
|
testConnection: async () => {
|
|
set({
|
|
connectedUser: null,
|
|
isTestingConnection: true,
|
|
statusMessage: "Testing connection...",
|
|
statusTone: "neutral"
|
|
});
|
|
|
|
try {
|
|
const user = await getCurrentGiteaUser();
|
|
set({
|
|
connectedUser: user,
|
|
statusMessage: `Connected as ${user.full_name || user.login}.`,
|
|
statusTone: "success"
|
|
});
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "Connection failed.";
|
|
set({
|
|
connectedUser: null,
|
|
statusMessage: message,
|
|
statusTone: "error"
|
|
});
|
|
} finally {
|
|
set({ isTestingConnection: false });
|
|
}
|
|
}
|
|
}));
|