import { Show, createEffect, createResource, type Component } from "solid-js" import { Bell } from "lucide-solid" import { showToastNotification } from "../../lib/notifications" import { getOsNotificationCapability, requestOsNotificationPermission, type OsNotificationPermission, } from "../../lib/os-notifications" import { useConfig } from "../../stores/preferences" import { useI18n } from "../../lib/i18n" function formatPermissionLabel(permission: OsNotificationPermission, t: ReturnType["t"]): string { switch (permission) { case "granted": return t("settings.notifications.permission.granted") case "denied": return t("settings.notifications.permission.denied") case "default": return t("settings.notifications.permission.default") case "unsupported": return t("settings.notifications.permission.unsupported") default: return String(permission) } } export const NotificationsSettingsSection: Component = () => { const { t } = useI18n() const { preferences, updatePreferences } = useConfig() const [capability, { refetch }] = createResource(() => getOsNotificationCapability()) createEffect(() => { void refetch() }) const handleEnableToggle = async (enabled: boolean) => { if (!enabled) { updatePreferences({ osNotificationsEnabled: false }) return } const cap = capability() if (cap && !cap.supported) { showToastNotification({ title: t("settings.section.notifications.title"), message: cap.info ?? t("settings.notifications.messages.unsupportedEnvironment"), variant: "warning", }) updatePreferences({ osNotificationsEnabled: false }) return } const permission = await requestOsNotificationPermission() if (permission !== "granted") { showToastNotification({ title: t("settings.section.notifications.title"), message: permission === "denied" ? t("settings.notifications.messages.permissionDenied") : t("settings.notifications.messages.permissionNotGranted"), variant: "warning", }) updatePreferences({ osNotificationsEnabled: false }) return } updatePreferences({ osNotificationsEnabled: true }) void refetch() } const handleRequestPermission = async () => { const cap = capability() if (cap && !cap.supported) { showToastNotification({ title: t("settings.section.notifications.title"), message: cap.info ?? t("settings.notifications.messages.unsupportedGeneral"), variant: "warning", }) return } const permission = await requestOsNotificationPermission() if (permission === "granted") { showToastNotification({ title: t("settings.section.notifications.title"), message: t("settings.notifications.messages.permissionGranted"), variant: "success", duration: 6000, }) void refetch() return } showToastNotification({ title: t("settings.section.notifications.title"), message: permission === "denied" ? t("settings.notifications.messages.permissionRequestDenied") : t("settings.notifications.messages.permissionNotGranted"), variant: "warning", }) void refetch() } const supported = () => capability()?.supported ?? false const permissionLabel = () => formatPermissionLabel(capability()?.permission ?? "unsupported", t) const infoMessage = () => capability()?.info return (

{t("settings.notifications.sessionStatus.title")}

{t("settings.notifications.sessionStatus.subtitle")}

{t("settings.scope.device")}
{t("settings.notifications.enable.title")}
{t("settings.notifications.enable.permission", { permission: permissionLabel() })}
{t("settings.notifications.requestPermission.title")}
{t("settings.notifications.requestPermission.subtitle")}
{t("settings.notifications.allowVisible.title")}
{t("settings.notifications.allowVisible.subtitle")}
{infoMessage()}
{t("settings.notifications.unsupportedNote")}

{t("settings.notifications.events.title")}

{t("settings.notifications.events.subtitle")}

{t("settings.scope.device")}
{t("settings.notifications.events.needsInput")}
{t("settings.notifications.events.idle")}
) }