mime-chat/src/modules/auth.ts

57 lines
1.2 KiB
TypeScript

import { reactive, toRefs } from 'vue';
import { useIpc } from './ipc';
interface AuthState {
accessToken: string | null;
error?: Error;
}
const state = reactive<AuthState>({
accessToken: null,
error: undefined,
});
const AUTH_KEY = 'crimata_token';
const token = window.localStorage.getItem(AUTH_KEY);
const authToken = async () => {
const { invoke } = useIpc();
try {
state.accessToken = await invoke('auth-session', token);
}
catch(e) {
state.error = e;
console.log('ERROR: failed authentication');
window.localStorage.removeItem(AUTH_KEY);
}
}
// authenticate on auth event
window.ipcRenderer.on("auth", async (_event, _arg) => {
await authToken();
});
if (token) {
state.accessToken = token;
}
export const useAuth = () => {
const setToken = (token: string) => {
window.localStorage.setItem(AUTH_KEY, token);
state.accessToken = token;
state.error = undefined;
}
const logout = (): Promise<null> => {
window.localStorage.removeItem(AUTH_KEY);
return Promise.resolve(state.accessToken = null);
}
return {
setToken,
logout,
...toRefs(state), // accessToken, error
}
}