108 lines
2.3 KiB
TypeScript
108 lines
2.3 KiB
TypeScript
'use client'
|
|
|
|
import { createContext, useContext, useState, type ReactNode } from 'react'
|
|
|
|
export type Role = 'admin' | 'warehouse' | 'sales'
|
|
|
|
export interface MockUser {
|
|
id: string
|
|
fullName: string
|
|
username: string
|
|
roleId: string
|
|
role: Role
|
|
}
|
|
|
|
interface AuthContextValue {
|
|
user: MockUser
|
|
permissions: string[]
|
|
setRole: (role: Role) => void
|
|
}
|
|
|
|
// Mock permissions per role — replace with real API call once auth is implemented
|
|
const MOCK_PERMISSIONS: Record<Role, string[]> = {
|
|
admin: ['*'],
|
|
warehouse: [
|
|
'items.view',
|
|
'categories.view',
|
|
'regions.view',
|
|
'routes.view',
|
|
'vehicles.view',
|
|
'warehouses.view',
|
|
'loading.view',
|
|
'loading.dispatch',
|
|
'loading.receive',
|
|
'loading.resolve',
|
|
'rides.view',
|
|
'rides.manage',
|
|
'rides.cancel.request',
|
|
'driver_profiles.view',
|
|
'compliance.manage',
|
|
],
|
|
sales: [
|
|
'stores.view',
|
|
'stores.create',
|
|
'stores.update',
|
|
'orders.view',
|
|
'orders.create',
|
|
'orders.update',
|
|
'items.view',
|
|
'categories.view',
|
|
'regions.view',
|
|
'routes.view',
|
|
'rides.view',
|
|
'driver_profiles.view',
|
|
],
|
|
}
|
|
|
|
const MOCK_USERS: Record<Role, MockUser> = {
|
|
admin: {
|
|
id: '00000000-0000-0000-0000-000000000001',
|
|
fullName: 'Admin User',
|
|
username: 'admin',
|
|
roleId: '00000000-0000-0000-0000-000000000010',
|
|
role: 'admin',
|
|
},
|
|
warehouse: {
|
|
id: '00000000-0000-0000-0000-000000000002',
|
|
fullName: 'Warehouse Staff',
|
|
username: 'warehouse',
|
|
roleId: '00000000-0000-0000-0000-000000000011',
|
|
role: 'warehouse',
|
|
},
|
|
sales: {
|
|
id: '00000000-0000-0000-0000-000000000003',
|
|
fullName: 'Sales Rep',
|
|
username: 'sales',
|
|
roleId: '00000000-0000-0000-0000-000000000012',
|
|
role: 'sales',
|
|
},
|
|
}
|
|
|
|
const AuthContext = createContext<AuthContextValue | null>(null)
|
|
|
|
export function AuthProvider({ children }: { children: ReactNode }) {
|
|
const [role, setRoleState] = useState<Role>('admin')
|
|
|
|
function setRole(newRole: Role) {
|
|
setRoleState(newRole)
|
|
}
|
|
|
|
return (
|
|
<AuthContext.Provider
|
|
value={{
|
|
user: MOCK_USERS[role],
|
|
permissions: MOCK_PERMISSIONS[role],
|
|
setRole,
|
|
}}
|
|
>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function useAuth(): AuthContextValue {
|
|
const ctx = useContext(AuthContext)
|
|
if (!ctx) throw new Error('useAuth must be used inside AuthProvider')
|
|
return ctx
|
|
}
|