import useSwr from 'swr'; import { MutatorCallback } from 'swr/dist/types'; import { UserType } from '../../server/constants/user'; import { hasPermission, Permission, PermissionCheckOptions, } from '../../server/lib/permissions'; import { NotificationAgentKey } from '../../server/lib/settings'; export { Permission, UserType }; export type { PermissionCheckOptions }; export interface User { id: number; plexUsername?: string; username?: string; displayName: string; email: string; avatar: string; permissions: number; userType: number; createdAt: Date; updatedAt: Date; requestCount: number; settings?: UserSettings; } type NotificationAgentTypes = Record; export interface UserSettings { discordId?: string; region?: string; originalLanguage?: string; locale?: string; notificationTypes: Partial; } interface UserHookResponse { user?: User; loading: boolean; error: string; revalidate: () => Promise; mutate: ( data?: User | Promise | MutatorCallback | undefined, shouldRevalidate?: boolean | undefined ) => Promise; hasPermission: ( permission: Permission | Permission[], options?: PermissionCheckOptions ) => boolean; } export const useUser = ({ id, initialData, }: { id?: number; initialData?: User } = {}): UserHookResponse => { const { data, error, revalidate, mutate } = useSwr( id ? `/api/v1/user/${id}` : `/api/v1/auth/me`, { initialData, refreshInterval: 30000, errorRetryInterval: 30000, shouldRetryOnError: false, } ); const checkPermission = ( permission: Permission | Permission[], options?: PermissionCheckOptions ): boolean => { return hasPermission(permission, data?.permissions ?? 0, options); }; return { user: data, loading: !data && !error, error, revalidate, hasPermission: checkPermission, mutate, }; };