import React from "react"; import { useTranslation } from "react-i18next"; import { useSaveSettings } from "#/hooks/mutation/use-save-settings"; import { useSettings } from "#/hooks/query/use-settings"; import { AvailableLanguages } from "#/i18n"; import { DEFAULT_SETTINGS } from "#/services/settings"; import { BrandButton } from "#/components/features/settings/brand-button"; import { SettingsSwitch } from "#/components/features/settings/settings-switch"; import { I18nKey } from "#/i18n/declaration"; import { LanguageInput } from "#/components/features/settings/app-settings/language-input"; import { handleCaptureConsent } from "#/utils/handle-capture-consent"; import { displayErrorToast, displaySuccessToast, } from "#/utils/custom-toast-handlers"; import { retrieveAxiosErrorMessage } from "#/utils/retrieve-axios-error-message"; import { AppSettingsInputsSkeleton } from "#/components/features/settings/app-settings/app-settings-inputs-skeleton"; import { useConfig } from "#/hooks/query/use-config"; function AppSettingsScreen() { const { t } = useTranslation(); const { mutate: saveSettings, isPending } = useSaveSettings(); const { data: settings, isLoading } = useSettings(); const { data: config } = useConfig(); const [languageInputHasChanged, setLanguageInputHasChanged] = React.useState(false); const [analyticsSwitchHasChanged, setAnalyticsSwitchHasChanged] = React.useState(false); const [ soundNotificationsSwitchHasChanged, setSoundNotificationsSwitchHasChanged, ] = React.useState(false); const [ proactiveConversationsSwitchHasChanged, setProactiveConversationsSwitchHasChanged, ] = React.useState(false); const formAction = (formData: FormData) => { const languageLabel = formData.get("language-input")?.toString(); const languageValue = AvailableLanguages.find( ({ label }) => label === languageLabel, )?.value; const language = languageValue || DEFAULT_SETTINGS.LANGUAGE; const enableAnalytics = formData.get("enable-analytics-switch")?.toString() === "on"; const enableSoundNotifications = formData.get("enable-sound-notifications-switch")?.toString() === "on"; const enableProactiveConversations = formData.get("enable-proactive-conversations-switch")?.toString() === "on"; saveSettings( { LANGUAGE: language, user_consents_to_analytics: enableAnalytics, ENABLE_SOUND_NOTIFICATIONS: enableSoundNotifications, ENABLE_PROACTIVE_CONVERSATION_STARTERS: enableProactiveConversations, }, { onSuccess: () => { handleCaptureConsent(enableAnalytics); displaySuccessToast(t(I18nKey.SETTINGS$SAVED)); }, onError: (error) => { const errorMessage = retrieveAxiosErrorMessage(error); displayErrorToast(errorMessage || t(I18nKey.ERROR$GENERIC)); }, onSettled: () => { setLanguageInputHasChanged(false); setAnalyticsSwitchHasChanged(false); setSoundNotificationsSwitchHasChanged(false); setProactiveConversationsSwitchHasChanged(false); }, }, ); }; const checkIfLanguageInputHasChanged = (value: string) => { const selectedLanguage = AvailableLanguages.find( ({ label: langValue }) => langValue === value, )?.label; const currentLanguage = AvailableLanguages.find( ({ value: langValue }) => langValue === settings?.LANGUAGE, )?.label; setLanguageInputHasChanged(selectedLanguage !== currentLanguage); }; const checkIfAnalyticsSwitchHasChanged = (checked: boolean) => { const currentAnalytics = !!settings?.USER_CONSENTS_TO_ANALYTICS; setAnalyticsSwitchHasChanged(checked !== currentAnalytics); }; const checkIfSoundNotificationsSwitchHasChanged = (checked: boolean) => { const currentSoundNotifications = !!settings?.ENABLE_SOUND_NOTIFICATIONS; setSoundNotificationsSwitchHasChanged( checked !== currentSoundNotifications, ); }; const checkIfProactiveConversationsSwitchHasChanged = (checked: boolean) => { const currentProactiveConversations = !!settings?.ENABLE_PROACTIVE_CONVERSATION_STARTERS; setProactiveConversationsSwitchHasChanged( checked !== currentProactiveConversations, ); }; const formIsClean = !languageInputHasChanged && !analyticsSwitchHasChanged && !soundNotificationsSwitchHasChanged && !proactiveConversationsSwitchHasChanged; const shouldBeLoading = !settings || isLoading || isPending; return (
{shouldBeLoading && } {!shouldBeLoading && (
{t(I18nKey.ANALYTICS$ENABLE)} {t(I18nKey.SETTINGS$SOUND_NOTIFICATIONS)} {config?.APP_MODE === "saas" && ( {t(I18nKey.SETTINGS$PROACTIVE_CONVERSATION_STARTERS)} )}
)}
{!isPending && t("SETTINGS$SAVE_CHANGES")} {isPending && t("SETTINGS$SAVING")}
); } export default AppSettingsScreen;