120 lines
3.2 KiB
TypeScript
120 lines
3.2 KiB
TypeScript
'use client';
|
|
|
|
import { getUserMetaById } from '@/db/UserMetas/GetById';
|
|
import { logger } from '@/lib/default-logger';
|
|
import { pb } from '@/lib/pb';
|
|
import type { User } from '@/types/user';
|
|
|
|
function generateToken(): string {
|
|
const arr = new Uint8Array(12);
|
|
window.crypto.getRandomValues(arr);
|
|
return Array.from(arr, (v) => v.toString(16).padStart(2, '0')).join('');
|
|
}
|
|
|
|
const user_xxx = {
|
|
id: 'USR-000',
|
|
avatar: '/assets/avatar.png',
|
|
firstName: 'Sofia',
|
|
lastName: 'Rivers',
|
|
email: 'sofia@devias.io',
|
|
} satisfies User;
|
|
|
|
export interface SignUpParams {
|
|
firstName: string;
|
|
lastName: string;
|
|
email: string;
|
|
password: string;
|
|
}
|
|
|
|
export interface SignInWithOAuthParams {
|
|
provider: 'google' | 'discord';
|
|
}
|
|
|
|
export interface SignInWithPasswordParams {
|
|
email: string;
|
|
password: string;
|
|
}
|
|
|
|
export interface ResetPasswordParams {
|
|
email: string;
|
|
}
|
|
|
|
class AuthClient {
|
|
async signUp(_: SignUpParams): Promise<{ error?: string }> {
|
|
// Make API request
|
|
|
|
// We do not handle the API, so we'll just generate a token and store it in localStorage.
|
|
const token = generateToken();
|
|
localStorage.setItem('custom-auth-token', token);
|
|
|
|
return {};
|
|
}
|
|
|
|
async signInWithOAuth(_: SignInWithOAuthParams): Promise<{ error?: string }> {
|
|
return { error: 'Social authentication not implemented' };
|
|
}
|
|
|
|
async signInWithPassword(params: SignInWithPasswordParams): Promise<{ error?: string }> {
|
|
const { email, password } = params;
|
|
|
|
try {
|
|
// Make API request
|
|
await pb.collection('users').authWithPassword(email, password);
|
|
|
|
// // We do not handle the API, so we'll check if the credentials match with the hardcoded ones.
|
|
// if (email !== 'sofia@devias.io' || password !== 'Secret1') {
|
|
// return { error: 'Invalid credentials' };
|
|
// }
|
|
// const token = generateToken();
|
|
|
|
localStorage.setItem('custom-auth-token', pb.authStore.token);
|
|
|
|
return {};
|
|
} catch (error) {
|
|
logger.error(error);
|
|
return { error: 'Invalid credentials' };
|
|
}
|
|
}
|
|
|
|
async resetPassword(_: ResetPasswordParams): Promise<{ error?: string }> {
|
|
return { error: 'Password reset not implemented' };
|
|
}
|
|
|
|
async updatePassword(_: ResetPasswordParams): Promise<{ error?: string }> {
|
|
return { error: 'Update reset not implemented' };
|
|
}
|
|
|
|
async getUser(): Promise<{ data?: User | null; error?: string }> {
|
|
// Make API request
|
|
|
|
// We do not handle the API, so just check if we have a token in localStorage.
|
|
// const token = localStorage.getItem('custom-auth-token');
|
|
// if (!token) {
|
|
// return { data: null };
|
|
// }
|
|
try {
|
|
logger.debug(JSON.stringify(`getUser: ${pb.authStore.record?.id}`));
|
|
//
|
|
if (pb.authStore.record?.id !== undefined) {
|
|
const userMeta = await getUserMetaById(pb.authStore.record?.id);
|
|
logger.debug({ userMeta });
|
|
return { data: userMeta as unknown as User };
|
|
}
|
|
|
|
return { data: null };
|
|
} catch (error) {
|
|
return { error: 'sorry cannot get user meta' };
|
|
}
|
|
}
|
|
|
|
async signOut(): Promise<{ error?: string }> {
|
|
pb.authStore.clear();
|
|
|
|
localStorage.removeItem('custom-auth-token');
|
|
|
|
return {};
|
|
}
|
|
}
|
|
|
|
export const authClient = new AuthClient();
|