Add login, role-based portals, and browser-local admin image upload

This commit is contained in:
2026-06-27 16:33:20 -05:00
parent e4b30d6dfd
commit 26559d4cf8
6 changed files with 485 additions and 0 deletions
+47
View File
@@ -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 };
}