Add login, role-based portals, and browser-local admin image upload
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
'use client';
|
||||
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
|
||||
const ROLE_KEY = 'la-huasca-role';
|
||||
const IMAGES_KEY = 'la-huasca-admin-images';
|
||||
|
||||
type Role = 'admin' | 'user' | null;
|
||||
|
||||
export function useAuth() {
|
||||
const [role, setRole] = useState<Role>(null);
|
||||
const [hydrated, setHydrated] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const stored = typeof window !== 'undefined' ? localStorage.getItem(ROLE_KEY) : null;
|
||||
setRole((stored as Role) ?? null);
|
||||
setHydrated(true);
|
||||
}, []);
|
||||
|
||||
const login = useCallback((username: string, password: string): boolean => {
|
||||
if (typeof window === 'undefined') return false;
|
||||
if (username === 'admin' && password === 'admin') {
|
||||
localStorage.setItem(ROLE_KEY, 'admin');
|
||||
setRole('admin');
|
||||
return true;
|
||||
}
|
||||
if (username === 'user' && password === 'user') {
|
||||
localStorage.setItem(ROLE_KEY, 'user');
|
||||
setRole('user');
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}, []);
|
||||
|
||||
const logout = useCallback(() => {
|
||||
if (typeof window === 'undefined') return;
|
||||
localStorage.removeItem(ROLE_KEY);
|
||||
localStorage.removeItem(IMAGES_KEY);
|
||||
setRole(null);
|
||||
}, []);
|
||||
|
||||
const isAdmin = role === 'admin';
|
||||
const isUser = role === 'user';
|
||||
const isLoggedIn = role !== null;
|
||||
|
||||
return { role, hydrated, login, logout, isAdmin, isUser, isLoggedIn };
|
||||
}
|
||||
Reference in New Issue
Block a user