| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- "use client"
- import React, { useEffect } from 'react'
- import { useAuth } from '@/lib/auth-context'
- import { LoginForm } from './login-form'
- interface ProtectedRouteProps {
- children: React.ReactNode
- requiredRole?: 'admin' | 'user'
- fallback?: React.ReactNode
- }
- export function ProtectedRoute({ children, requiredRole, fallback }: ProtectedRouteProps) {
- const { isAuthenticated, isLoading, user, error, authEnabled } = useAuth()
- // If authentication is not enabled, allow access
- if (!authEnabled) {
- return <>{children}</>
- }
- if (isLoading) {
- return (
- <div className="flex items-center justify-center min-h-screen">
- <div className="text-center">
- <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto mb-4"></div>
- <p className="text-muted-foreground">Loading...</p>
- </div>
- </div>
- )
- }
- if (!isAuthenticated) {
- if (fallback) {
- return <>{fallback}</>
- }
- return (
- <div className="flex items-center justify-center min-h-screen bg-background">
- <div className="w-full max-w-md p-6">
- <div className="text-center mb-8">
- <h1 className="text-3xl font-bold">Stable Diffusion</h1>
- <p className="text-muted-foreground mt-2">Please sign in to continue</p>
- </div>
- <LoginForm />
- </div>
- </div>
- )
- }
- // Check role requirements
- if (requiredRole && user?.role !== requiredRole) {
- return (
- <div className="flex items-center justify-center min-h-screen">
- <div className="text-center">
- <h1 className="text-2xl font-bold text-destructive mb-4">Access Denied</h1>
- <p className="text-muted-foreground">
- You don't have permission to access this page.
- </p>
- </div>
- </div>
- )
- }
- return <>{children}</>
- }
- // Higher-order component for protecting routes
- export function withAuth<P extends object>(
- Component: React.ComponentType<P>,
- options?: { requiredRole?: 'admin' | 'user' }
- ) {
- return function AuthenticatedComponent(props: P) {
- return (
- <ProtectedRoute requiredRole={options?.requiredRole}>
- <Component {...props} />
- </ProtectedRoute>
- )
- }
- }
|