"use client" import { Switch } from "@/components/ui/switch" import { Label } from "@/components/ui/label" import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card" import MyAccount from "@/components/cards/dashboard/Settings/MyAccount" import { useState, useEffect } from "react" import { LayoutDashboard, Trash, Loader2, Check, X } from "lucide-react" import { Button } from "@/components/ui/button" import { DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { Dialog } from "@/components/ui/dialog" import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, } from "@/components/ui/input-otp" import { signOut } from "next-auth/react" import { useRouter } from "next/navigation" export default function Settings() { const [settings, setSettings] = useState({ hideGenAI: false, hideUpgrades: false, hideCrypto: false }); const [loading, setLoading] = useState(false) const [deleteOTP, setDeleteOTP] = useState('') const [deleteOTPLoading, setDeleteOTPLoading] = useState(false) const [cooldownSeconds, setCooldownSeconds] = useState(0) const [otpError, setOtpError] = useState('') const [showSuccess, setShowSuccess] = useState(false) const [isDeleting, setIsDeleting] = useState(false) const [nextcloudError, setNextcloudError] = useState('') const [deleteSteps, setDeleteSteps] = useState({ nextcloud: { status: 'pending', message: 'Pending' }, database: { status: 'pending', message: 'Pending' } }) const [deleteStep, setDeleteStep] = useState<'initial' | 'otp' | 'confirm'>('initial') const router = useRouter() const handleOTPChange = (value: string) => { const numericValue = value.replace(/[^0-9]/g, '') setDeleteOTP(numericValue) } useEffect(() => { let successTimer: NodeJS.Timeout if (showSuccess) { successTimer = setTimeout(() => { setShowSuccess(false) }, 5000) } return () => { if (successTimer) clearTimeout(successTimer) } }, [showSuccess]) useEffect(() => { let cooldownTimer: NodeJS.Timeout if (cooldownSeconds > 0) { cooldownTimer = setInterval(() => { setCooldownSeconds(prev => prev - 1) }, 1000) } return () => { if (cooldownTimer) clearInterval(cooldownTimer) } }, [cooldownSeconds]) useEffect(() => { const fetchSettings = async () => { try { setLoading(true); const response = await fetch('/api/users/settings') if (response.ok) { const data = await response.json() setSettings(data) } else { console.error('[!] Failed to fetch settings') } } catch (error) { console.error('[!] Error fetching settings:', error) } finally { setLoading(false) } }; fetchSettings() }, []); const updateSetting = async (settingName: string, value: boolean) => { setSettings(prev => ({ ...prev, [settingName]: value })) try { setLoading(true) const response = await fetch('/api/users/settings', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ...settings, [settingName]: value }), }) if (response.ok) { const updatedSettings = await response.json() setSettings(updatedSettings) } else { console.error('[!] Failed to update settings') setSettings(prev => ({ ...prev, [settingName]: !value })) } } catch (error) { console.error('[!] Error updating settings:', error) setSettings(prev => ({ ...prev, [settingName]: !value })) } finally { setLoading(false) window.location.reload() } }; const deleteAccount = async () => { setIsDeleting(true) setOtpError('') setNextcloudError('') setDeleteSteps({ nextcloud: { status: 'pending', message: 'Pending' }, database: { status: 'pending', message: 'Pending' } }) try { // 1. Delete Nextcloud account const nextcloudResponse = await fetch('/api/users/delete', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ otp: deleteOTP, step: 'nextcloud' }), }) const nextcloudData = await nextcloudResponse.json() if (nextcloudData.steps) { setDeleteSteps(prev => ({ ...prev, nextcloud: nextcloudData.steps.nextcloud })) } if (!nextcloudResponse.ok || nextcloudData.steps?.nextcloud.status === 'error') { if (nextcloudData.error === 'Failed to delete user from Nextcloud') { setNextcloudError('Failed to delete your Nextcloud account. Please try again or contact support.') } else { setOtpError(nextcloudData.error || 'Failed to delete Nextcloud account') } setIsDeleting(false) return } const databaseResponse = await fetch('/api/users/delete', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ otp: deleteOTP, step: 'database' }), }) const databaseData = await databaseResponse.json() if (databaseData.steps) { setDeleteSteps(prev => ({ ...prev, database: databaseData.steps.database })) } if (databaseResponse.ok && databaseData.success) { setDeleteSteps({ nextcloud: { status: 'success', message: 'Completed' }, database: { status: 'success', message: 'Completed' } }) setTimeout(() => { signOut() router.push('/') }, 1500) } else { if (databaseData.error === 'Failed to delete user from database') { setOtpError('Failed to delete your account from the database. Please try again or contact support.') } else { setOtpError(databaseData.error || 'Failed to delete account') } setIsDeleting(false) } } catch (error) { console.error('[!] Error deleting account:', error) setOtpError(error instanceof Error ? error.message : 'Failed to delete account') setIsDeleting(false) } } const sendOTP = async () => { setDeleteOTPLoading(true) setOtpError('') try { const response = await fetch('/api/users/otp', { method: 'GET' }) const data = await response.json() if (response.ok) { console.log(data) setShowSuccess(true) setCooldownSeconds(60) } else { if (response.status === 429) { setCooldownSeconds(data.remainingCooldown) setOtpError(`Please wait ${data.remainingCooldown} seconds before requesting another OTP`) } else { setOtpError(data.error || 'Failed to send OTP') } } } catch (error) { console.error('[!] Error sending OTP:', error) setOtpError('Failed to send OTP') } finally { setDeleteOTPLoading(false) } } const renderStepIcon = (status: string) => { switch (status) { case 'pending': return case 'success': return case 'error': return default: return } } const renderStepStatus = (step: { status: string, message: string }) => { return (
{renderStepIcon(step.status)} {step.message}
) } return ( <>

Settings

Dashboard Settings Customize your dashboard experience
updateSetting('hideGenAI', checked)} disabled={loading} />
updateSetting('hideUpgrades', checked)} disabled={loading} />
updateSetting('hideCrypto', checked)} disabled={loading} />
Delete Account Permanently delete your account {deleteStep === 'initial' ? ( Delete Account Are you sure you want to delete your account? This action cannot be undone.

This will remove your data from the following services:

  • Nextcloud
  • LibreCloud Internal DB
) : deleteStep === 'otp' ? ( Confirm your identity Please confirm with a 6 digit code sent to your email.
{deleteOTPLoading ? ( ) : showSuccess ? ( ) : cooldownSeconds > 0 ? ( ) : ( )}
{otpError && (

{otpError}

)}
) : ( Final Confirmation Please review the deletion process carefully.

Deleting your account will permanently remove all data associated with your account and email. This action cannot be undone.

Nextcloud {renderStepStatus(deleteSteps.nextcloud)}
Database {renderStepStatus(deleteSteps.database)}
{nextcloudError && (

{nextcloudError}

)} {isDeleting ? ( ) : ( )}
)}
) }