import { Trans } from "@lingui/react/macro" import { Divider, Select, Stack, TextInput } from "@mantine/core" import { useEffect, useState } from "react" import { useAppDispatch, useAppSelector } from "@/app/store" import type { NotificationService as NotificationServiceType, NotificationSettings as NotificationSettingsType } from "@/app/types" import { changeNotificationSettings } from "@/app/user/thunks" function useDebouncedSave(value: string, settingsKey: string, dispatch: ReturnType) { const [localValue, setLocalValue] = useState(value) useEffect(() => { setLocalValue(value) }, [value]) const onBlur = async () => { if (localValue !== value) { await dispatch(changeNotificationSettings({ [settingsKey]: localValue })) } } return { localValue, setLocalValue, onBlur } } function toServiceValue(settings?: NotificationSettingsType): NotificationServiceType { if (settings?.enabled && settings.type) { return settings.type } return "disabled" } export function NotificationSettings() { const notificationSettings = useAppSelector(state => state.user.settings?.notificationSettings) const dispatch = useAppDispatch() const serviceValue = toServiceValue(notificationSettings) const serverUrl = useDebouncedSave(notificationSettings?.serverUrl ?? "", "serverUrl", dispatch) const token = useDebouncedSave(notificationSettings?.token ?? "", "token", dispatch) const userKey = useDebouncedSave(notificationSettings?.userKey ?? "", "userKey", dispatch) const topic = useDebouncedSave(notificationSettings?.topic ?? "", "topic", dispatch) const onServiceChange = async (value: string | null) => { if (value === "disabled" || !value) { await dispatch(changeNotificationSettings({ enabled: false, type: undefined })) } else { await dispatch(changeNotificationSettings({ enabled: true, type: value as Exclude })) } } return ( Notifications } />