/** * Component: Admin Account Setup Step * Documentation: documentation/setup-wizard.md */ 'use client'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/Button'; interface AdminAccountStepProps { adminUsername: string; adminPassword: string; onUpdate: (field: string, value: string) => void; onNext: () => void; onBack: () => void; } export function AdminAccountStep({ adminUsername, adminPassword, onUpdate, onNext, onBack, }: AdminAccountStepProps) { const [confirmPassword, setConfirmPassword] = useState(''); const [errors, setErrors] = useState<{ username?: string; password?: string; confirm?: string }>({}); const [allowWeakPassword, setAllowWeakPassword] = useState(false); // Fetch password policy useEffect(() => { const fetchPolicy = async () => { try { const response = await fetch('/api/auth/providers'); if (response.ok) { const data = await response.json(); setAllowWeakPassword(data.allowWeakPassword === true); } } catch { // Default to strict validation on error } }; fetchPolicy(); }, []); const validate = () => { const newErrors: { username?: string; password?: string; confirm?: string } = {}; // Validate username if (!adminUsername || adminUsername.length < 3) { newErrors.username = 'Username must be at least 3 characters'; } // Validate password if (!adminPassword) { newErrors.password = 'Password is required'; } else if (!allowWeakPassword && adminPassword.length < 8) { newErrors.password = 'Password must be at least 8 characters'; } // Validate password confirmation if (adminPassword !== confirmPassword) { newErrors.confirm = 'Passwords do not match'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleNext = () => { if (validate()) { onNext(); } }; return (

Create Admin Account

Set up your administrator account to manage the application

{/* Username */}
onUpdate('adminUsername', e.target.value)} className="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent" placeholder="admin" autoComplete="username" /> {errors.username && (

{errors.username}

)}

This will be your local admin username (minimum 3 characters)

{/* Password */}
onUpdate('adminPassword', e.target.value)} className="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent" placeholder="••••••••" autoComplete="new-password" /> {errors.password && (

{errors.password}

)}

{allowWeakPassword ? 'Choose a password' : 'Choose a strong password (minimum 8 characters)'}

{/* Confirm Password */}
setConfirmPassword(e.target.value)} className="w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent" placeholder="••••••••" autoComplete="new-password" /> {errors.confirm && (

{errors.confirm}

)}
{/* Info Box */}

About Admin Accounts

This local admin account is separate from media server authentication. Use it to access admin settings and manage the application.

{/* Navigation */}
); }