import { useState, useCallback, useMemo } from 'react'; import { MoreHorizontal, Plus, Trash2, Pencil, Mail, ChevronDown } from 'lucide-react'; import { OAuthConfigDialog, AuthPreview } from '@/features/auth/components'; import { useOAuthConfig } from '@/features/auth/hooks/useOAuthConfig'; import { useConfirm } from '@/lib/hooks/useConfirm'; import { Button, ConfirmDialog, CopyButton, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, } from '@/components'; import type { OAuthProvidersSchema } from '@insforge/shared-schemas'; import { oauthProviders, type OAuthProviderInfo, getAuthImplementationPrompt, } from '@/features/auth/helpers'; import { getBackendUrl } from '@/lib/utils/utils'; export default function AuthMethodsPage() { const [selectedProvider, setSelectedProvider] = useState(); const [isDialogOpen, setIsDialogOpen] = useState(false); const { confirm, confirmDialogProps } = useConfirm(); const { configs, isLoadingConfigs, deleteConfig, refetchConfigs, getProviderConfig, isProviderConfigured, } = useOAuthConfig(); const handleConfigureProvider = (provider: OAuthProviderInfo) => { setSelectedProvider(provider); setIsDialogOpen(true); }; const deleteOAuthConfig = async (providerId: OAuthProvidersSchema, providerName: string) => { const shouldDelete = await confirm({ title: `Delete ${providerName} OAuth`, description: `Are you sure you want to delete the ${providerName} configuration? This action cannot be undone.`, confirmText: 'Delete', cancelText: 'Cancel', destructive: true, }); if (shouldDelete) { deleteConfig(providerId); } }; const handleCloseDialog = () => { setIsDialogOpen(false); setSelectedProvider(undefined); }; const hasAuthMethods = useMemo(() => { return !!configs.length; }, [configs]); const enabledProviders = useMemo(() => { const enabled: Record = {} as Record< OAuthProvidersSchema, boolean >; oauthProviders.forEach((provider) => { enabled[provider.id] = isProviderConfigured(provider.id); }); return enabled; }, [isProviderConfigured]); // Check if all providers are enabled const allProvidersEnabled = useMemo(() => { return oauthProviders.every((provider) => enabledProviders[provider.id]); }, [enabledProviders]); const handleSuccess = useCallback(() => { // Refresh configuration after successful update void refetchConfigs(); }, [refetchConfigs]); if (isLoadingConfigs) { return (
Loading OAuth configuration...
); } return (
{/* Two column layout */}
{/* Left Section - Auth Methods List */}
{/* Header */}

Auth Methods

{!allProvidersEnabled && ( {/* Available providers (not enabled) */} {oauthProviders .filter((provider) => !enabledProviders[provider.id]) .map((provider) => ( handleConfigureProvider(provider)} className="py-2 px-3 flex items-center gap-3 cursor-pointer" > {provider.icon} {provider.name} ))} {/* Separator if there are both enabled and disabled providers */} {oauthProviders.some((p) => enabledProviders[p.id]) && oauthProviders.some((p) => !enabledProviders[p.id]) && ( )} {/* Enabled providers (disabled from selection) */} {oauthProviders .filter((provider) => enabledProviders[provider.id]) .map((provider) => (
{provider.icon} {provider.name}
Enabled
))}
)}
{/* Auth Methods List */}
{/* Email Auth Card */}
Email Auth
{/* OAuth Providers */} {hasAuthMethods && oauthProviders.map((provider) => { const providerConfig = getProviderConfig(provider.id); if (!providerConfig) { return null; } return (
{provider.icon}
{provider.name}
{providerConfig.useSharedKey && ( Shared Keys )} handleConfigureProvider(provider)} className="py-2 px-3 flex items-center gap-3 cursor-pointer" > Edit void deleteOAuthConfig(provider.id, provider.name)} className="py-2 px-3 flex items-center gap-3 cursor-pointer text-red-600 dark:text-red-400" > Delete
); })}
{/* Right Section - Preview */}
{/* Preview Header */}

Integrate Authentication to Your Application

{/* Preview Content */}

Preview Mode

{/* Confirm Dialog */}
); }