"use client" import { useEffect, useState } from "react" import useNotifications from "@/hooks/useNotifications" import { Check, CircleHelp, Copy, Server, Smartphone } from "lucide-react" interface NotificationSettingsProps { onError: (message: string) => void onSuccess: (message: string) => void } export const NotificationSettings = ({ onError, onSuccess }: NotificationSettingsProps) => { const { getNotificationApplicationsSettings, getNotificationServerSettings, editNotificationApplicationsSettings, editNotificationServerSettings, } = useNotifications() const [applicationsSettings, setApplicationsSettings] = useState(null) const [serverSettings, setServerSettings] = useState(null) const [copiedVariable, setCopiedVariable] = useState(null) const [serverCollapsed, setServerCollapsed] = useState(true) const [applicationCollapsed, setApplicationCollapsed] = useState(true) const fetchNotificationSettings = async () => { const applicationsSettings = await getNotificationApplicationsSettings() const serverSettings = await getNotificationServerSettings() setServerSettings( serverSettings || { enabled: false, statusChange: true, cpuLimit: 80, gpuLimit: 80, memoryLimit: 80, diskLimit: 80, temperatureLimit: 80, notificationTextStatus: "{servername} went {status}", notificationTextCpu: "{servername} CPU usage is high at {cpu}%", notificationTextGpu: "{servername} GPU usage is high at {gpu}%", notificationTextMemory: "{servername} Memory usage is high at {memory}%", notificationTextDisk: "{servername} Disk usage is high at {disk}%", notificationTextTemperature: "{servername} Temperature is high at {temperature}°C", notificationCpu: true, notificationGpu: true, notificationMemory: true, notificationDisk: true, notificationTemperature: true, }, ) setApplicationsSettings( applicationsSettings || { enabled: false, statusChange: false, latencyLimit: 1000, notificationTextStatus: "{appname} went {status}", notificationTextLatency: "{appname} latency is high at {latency}ms", notificationLatency: true, }, ) } useEffect(() => { fetchNotificationSettings() }, []) const saveNotificationSettings = async () => { const response = editNotificationServerSettings(serverSettings) if (typeof response === "string") { onError && onError(response) return } const response2 = editNotificationApplicationsSettings(applicationsSettings) if (typeof response2 === "string") { onError && onError(response2) return } try { const successMessage = await response const successMessage2 = await response2 console.log(successMessage, successMessage2) if (onSuccess && successMessage && successMessage2) { onSuccess("Notification settings saved successfully") } } catch (apiError: any) { onError && onError(apiError) } } const copyToClipboard = async (text: string) => { try { await navigator.clipboard.writeText(text) setCopiedVariable(text) setTimeout(() => setCopiedVariable(null), 2000) } catch (err) { console.error("Failed to copy text: ", err) } } const ResourceThresholdRow = ({ label, checked, onCheckedChange, value, onValueChange, unit, message, onMessageChange, disabled, }: { label: string checked: boolean onCheckedChange: () => void value: number onValueChange: (value: string) => void unit: string message: string onMessageChange: (value: string) => void disabled: boolean }) => (
{/* Header Row - Checkbox and Threshold */}
{label}
Threshold:
onValueChange(e.target.value)} disabled={disabled} min="0" max={unit === "°C" ? "200" : "100"} /> {unit}
{/* Message Template Row */}
Notification Message:
onMessageChange(e.target.value)} disabled={disabled} />
) return (
{/* Header */}

Notification Settings

Configure monitoring alerts for your servers and applications

{/* Server Monitoring Section */}
setServerCollapsed(!serverCollapsed)} >

Server Notifications

Monitor server resources and performance

{serverSettings?.enabled ? "Active" : "Inactive"}
{/* Master Toggle */}
setServerSettings({ ...serverSettings, enabled: !serverSettings.enabled })} />

Enable Server Monitoring

Turn on global server monitoring notifications

{/* Settings Content */}
{/* Status Change Alerts */}
setServerSettings({ ...serverSettings, statusChange: !serverSettings.statusChange }) } disabled={!serverSettings?.enabled} />
Status Change Alerts

Get notified when server status changes

setServerSettings({ ...serverSettings, notificationTextStatus: e.target.value }) } disabled={!serverSettings?.enabled} />
{/* Resource Thresholds */}

Resource Thresholds

setServerSettings({ ...serverSettings, notificationCpu: !serverSettings.notificationCpu }) } value={serverSettings?.cpuLimit} onValueChange={(value) => setServerSettings({ ...serverSettings, cpuLimit: value })} unit="%" message={serverSettings?.notificationTextCpu} onMessageChange={(value) => setServerSettings({ ...serverSettings, notificationTextCpu: value })} disabled={!serverSettings?.enabled} /> setServerSettings({ ...serverSettings, notificationGpu: !serverSettings.notificationGpu }) } value={serverSettings?.gpuLimit} onValueChange={(value) => setServerSettings({ ...serverSettings, gpuLimit: value })} unit="%" message={serverSettings?.notificationTextGpu} onMessageChange={(value) => setServerSettings({ ...serverSettings, notificationTextGpu: value })} disabled={!serverSettings?.enabled} /> setServerSettings({ ...serverSettings, notificationMemory: !serverSettings.notificationMemory }) } value={serverSettings?.memoryLimit} onValueChange={(value) => setServerSettings({ ...serverSettings, memoryLimit: value })} unit="%" message={serverSettings?.notificationTextMemory} onMessageChange={(value) => setServerSettings({ ...serverSettings, notificationTextMemory: value }) } disabled={!serverSettings?.enabled} /> setServerSettings({ ...serverSettings, notificationDisk: !serverSettings.notificationDisk }) } value={serverSettings?.diskLimit} onValueChange={(value) => setServerSettings({ ...serverSettings, diskLimit: value })} unit="%" message={serverSettings?.notificationTextDisk} onMessageChange={(value) => setServerSettings({ ...serverSettings, notificationTextDisk: value })} disabled={!serverSettings?.enabled} /> setServerSettings({ ...serverSettings, notificationTemperature: !serverSettings.notificationTemperature, }) } value={serverSettings?.temperatureLimit} onValueChange={(value) => setServerSettings({ ...serverSettings, temperatureLimit: value })} unit="°C" message={serverSettings?.notificationTextTemperature} onMessageChange={(value) => setServerSettings({ ...serverSettings, notificationTextTemperature: value }) } disabled={!serverSettings?.enabled} />
{/* Server Variables Reference */}
Available Server Variables
{[ { var: "{servername}", desc: "Server name or hostname" }, { var: "{status}", desc: "Current server status" }, { var: "{cpu}", desc: "CPU usage percentage" }, { var: "{gpu}", desc: "GPU usage percentage" }, { var: "{memory}", desc: "Memory usage percentage" }, { var: "{disk}", desc: "Disk usage percentage" }, { var: "{temperature}", desc: "Temperature in Celsius" }, ].map((item) => (
copyToClipboard(item.var)} >
{item.var}
{item.desc}
{copiedVariable === item.var ? ( ) : ( )}
))}
{/* Application Monitoring Section */}
setApplicationCollapsed(!applicationCollapsed)} >

Application Notifications

Configure application monitoring notifications

{applicationsSettings?.enabled ? "Active" : "Inactive"}
{/* Master Toggle */}
setApplicationsSettings({ ...applicationsSettings, enabled: !applicationsSettings.enabled }) } />

Enable Application Monitoring

Turn on global application monitoring

{/* Application Settings */}
{/* Status Change Alerts */}
setApplicationsSettings({ ...applicationsSettings, statusChange: !applicationsSettings.statusChange, }) } disabled={!applicationsSettings?.enabled} />
Status Change Alerts

Get notified when application status changes

setApplicationsSettings({ ...applicationsSettings, notificationTextStatus: e.target.value }) } disabled={!applicationsSettings?.enabled} />
{/* Performance Thresholds */}

Performance Thresholds

setApplicationsSettings({ ...applicationsSettings, notificationLatency: !applicationsSettings.notificationLatency, }) } value={applicationsSettings?.latencyLimit} onValueChange={(value) => setApplicationsSettings({ ...applicationsSettings, latencyLimit: Number(value) }) } unit="ms" message={applicationsSettings?.notificationTextLatency} onMessageChange={(value) => setApplicationsSettings({ ...applicationsSettings, notificationTextLatency: value }) } disabled={!applicationsSettings?.enabled} />
{/* Application Variables Reference */}
Available Application Variables
{[ { var: "{appname}", desc: "Application name" }, { var: "{status}", desc: "Application status" }, { var: "{latency}", desc: "Application latency in ms" }, ].map((item) => (
copyToClipboard(item.var)} >
{item.var}
{item.desc}
{copiedVariable === item.var ? ( ) : ( )}
))}
{/* Action Buttons */}
) }