"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