obsidian-visualiser/composables/useAuth.ts

96 lines
2.7 KiB
TypeScript

export enum AuthStatus
{
disconnected, loading, connected
};
export interface Auth
{
id: Ref<number>;
data: Ref<Record<string, any>>;
sessionId: Ref<string>;
status: Ref<AuthStatus>;
lastRefresh: Ref<Date>;
register: (username: string, email: string, password: string, data?: Record<string, any>) => Promise<any>;
login: (usernameOrEmail: string, password: string) => Promise<void>;
logout: () => Promise<void>;
refresh: () => Promise<void>;
}
async function register(username: string, email: string, password: string, additionalData?: Record<string, any>): Promise<any>
{
const id = useState<number>("auth:id");
const data = useState<any>("auth:data");
const sessionId = useState<string>("auth:sessionId");
const status = useState<AuthStatus>("auth:status");
const lastRefresh = useState<Date>("auth:date");
status.value = AuthStatus.loading;
try
{
const result = await $fetch("/api/auth/register", {
method: 'POST',
body: { username, email, password, additionalData },
ignoreResponseError: true,
});
if(result.success)
{
id.value = result.id!;
data.value = { ...additionalData, username: username, email: email };
sessionId.value = result.sessionId!;
status.value = AuthStatus.connected;
lastRefresh.value = new Date();
return;
}
else if(result.error)
{
status.value = AuthStatus.disconnected;
return result.error;
}
else
{
status.value = AuthStatus.disconnected;
return;
}
}
catch(e) {
console.log(JSON.stringify(e));
status.value = AuthStatus.disconnected;
}
}
async function login(usernameOrEmail: string, password: string): Promise<void>
{
const status = useState<AuthStatus>("auth:status");
status.value = AuthStatus.disconnected;
}
async function logout(): Promise<void>
{
const status = useState<AuthStatus>("auth:status");
status.value = AuthStatus.disconnected;
}
async function refresh(): Promise<void>
{
const status = useState<AuthStatus>("auth:status");
status.value = AuthStatus.disconnected;
}
export default function useAuth(): Auth {
const id = useState<number>("auth:id", () => 0);
const data = useState<any>("auth:data", () => { });
const sessionId = useState<string>("auth:sessionId", () => '');
const status = useState<AuthStatus>("auth:status", () => AuthStatus.disconnected);
const lastRefresh = useState<Date>("auth:date", () => new Date());
return {
id, data, sessionId, status, lastRefresh,
register, login, logout, refresh
};
}