import * as yup from "yup" import {AxiosError} from "axios" import {useFormik} from "formik" import {MdCheckCircle, MdImage} from "react-icons/md" import {useTranslation} from "react-i18next" import React, {ReactElement, useContext} from "react" import {useMutation} from "@tanstack/react-query" import { Alert, Checkbox, Collapse, FormControlLabel, FormGroup, FormHelperText, Grid, InputAdornment, MenuItem, TextField, useMediaQuery, useTheme, } from "@mui/material" import {LoadingButton} from "@mui/lab" import {ImageProxyFormatType, ProxyUserAgentType, SimpleDetailResponse} from "~/server-types" import {UpdatePreferencesData, updatePreferences} from "~/apis" import {useErrorSuccessSnacks, useUser} from "~/hooks" import {createEnumMapFromTranslation, parseFastAPIError} from "~/utils" import {AuthContext, SimplePageBuilder} from "~/components" interface Form { removeTrackers: boolean createMailReport: boolean proxyImages: boolean imageProxyFormat: ImageProxyFormatType proxyUserAgent: ProxyUserAgentType expandUrlShorteners: boolean rejectOnPrivacyLeak: boolean detail?: string } export default function SettingsAliasPreferencesRoute(): ReactElement { const {t} = useTranslation(["aliases", "settings-preferences", "common"]) const {_updateUser} = useContext(AuthContext) const user = useUser() const {showError, showSuccess} = useErrorSuccessSnacks() const imageProxyMap = createEnumMapFromTranslation( "settings.fields.imageProxyFormat.values", ImageProxyFormatType, )(key => t(key)) const imageProxyUserAgentMap = createEnumMapFromTranslation( "settings.fields.proxyUserAgent.values", ProxyUserAgentType, )(key => t(key)) const schema = yup.object().shape({ removeTrackers: yup.boolean().label(t("settings.fields.removeTrackers.label")), createMailReport: yup.boolean().label(t("settings.fields.createMailReport.label")), proxyImages: yup.boolean().label(t("settings.fields.proxyImages.label")), imageProxyFormat: yup .mixed() .oneOf(Object.values(ImageProxyFormatType)) .required() .label(t("settings.fields.imageProxyFormat.label")), proxyUserAgent: yup .mixed() .oneOf(Object.values(ProxyUserAgentType)) .required() .label(t("settings.fields.proxyUserAgent.label")), expandUrlShorteners: yup.boolean().label(t("settings.fields.expandUrlShorteners.label")), rejectOnPrivacyLeak: yup.boolean().label(t("settings.fields.rejectOnPrivacyLeak.label")), }) const {mutateAsync} = useMutation( updatePreferences, { onSuccess: (response, values) => { const newUser = { ...user, preferences: { ...user.preferences, ...values, }, } if (response.detail) { showSuccess(response?.detail) } _updateUser(newUser) }, onError: showError, }, ) const formik = useFormik
({ validationSchema: schema, initialValues: { removeTrackers: user.preferences.aliasRemoveTrackers, createMailReport: user.preferences.aliasCreateMailReport, proxyImages: user.preferences.aliasProxyImages, imageProxyFormat: user.preferences.aliasImageProxyFormat, proxyUserAgent: user.preferences.aliasProxyUserAgent, expandUrlShorteners: user.preferences.aliasExpandUrlShorteners, rejectOnPrivacyLeak: user.preferences.aliasRejectOnPrivacyLeak, }, onSubmit: async (values, {setErrors}) => { try { await mutateAsync({ aliasRemoveTrackers: values.removeTrackers, aliasCreateMailReport: values.createMailReport, aliasProxyImages: values.proxyImages, aliasImageProxyFormat: values.imageProxyFormat, aliasProxyUserAgent: values.proxyUserAgent, aliasExpandUrlShorteners: values.expandUrlShorteners, aliasRejectOnPrivacyLeak: values.rejectOnPrivacyLeak, }) } catch (error) { setErrors(parseFastAPIError(error as AxiosError)) } }, }) const theme = useTheme() const isLarge = useMediaQuery(theme.breakpoints.up("md")) return ( } labelPlacement="start" label={t("settings.fields.removeTrackers.label")} /> {(formik.touched.createMailReport && formik.errors.createMailReport) || t("settings.fields.removeTrackers.helperText")} } labelPlacement="start" label={t("settings.fields.createMailReport.label")} /> {(formik.touched.createMailReport && formik.errors.createMailReport) || t("settings.fields.createMailReport.helperText")} } labelPlacement="start" label={t("settings.fields.proxyImages.label")} /> {(formik.touched.proxyImages && formik.errors.proxyImages) || t("settings.fields.proxyImages.helperText")} {t("general.experimentalFeatureExplanation", {ns: "common"})} ), }} name="imageProxyFormat" id="imageProxyFormat" label={t("settings.fields.imageProxyFormat.label")} value={formik.values.imageProxyFormat} onChange={formik.handleChange} disabled={formik.isSubmitting} error={ formik.touched.imageProxyFormat && Boolean(formik.errors.imageProxyFormat) } helperText={ formik.touched.imageProxyFormat && formik.errors.imageProxyFormat } > {Object.entries(imageProxyMap).map( ([value, translationString]) => ( {t(translationString)} ), )} {formik.touched.imageProxyFormat && formik.errors.imageProxyFormat} {Object.entries(imageProxyUserAgentMap).map( ([value, translationString]) => ( {t(translationString)} ), )} {(formik.touched.proxyUserAgent && formik.errors.proxyUserAgent) || t("settings.fields.proxyUserAgent.helperText")} } labelPlacement="start" label={t("settings.fields.expandUrlShorteners.label")} /> {(formik.touched.expandUrlShorteners && formik.errors.expandUrlShorteners) || t("settings.fields.expandUrlShorteners.helperText")} {t("general.experimentalFeatureExplanation", {ns: "common"})} } labelPlacement="start" label={t("settings.fields.rejectOnPrivacyLeak.label")} /> {(formik.touched.rejectOnPrivacyLeak && formik.errors.rejectOnPrivacyLeak) || t("settings.fields.rejectOnPrivacyLeak.helperText")} } > {t("continueActionLabel", {ns: "settings-preferences"})}
) }