96 lines
2.7 KiB
TypeScript
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
|
|
};
|
|
} |