import * as yup from "yup" import {ReactElement} from "react" import {BsImage, BsShieldShaded} from "react-icons/bs" import {useFormik} from "formik" import {FaFile} from "react-icons/fa" import {MdCheckCircle} from "react-icons/md" import {AxiosError} from "axios" import {LoadingButton} from "@mui/lab" import {Collapse, Grid} from "@mui/material" import {mdiTextBoxMultiple} from "@mdi/js/commonjs/mdi" import {useMutation} from "@tanstack/react-query" import Icon from "@mdi/react" import {Alias, ImageProxyFormatType, ProxyUserAgentType} from "~/server-types" import { IMAGE_PROXY_FORMAT_TYPE_NAME_MAP, IMAGE_PROXY_USER_AGENT_TYPE_NAME_MAP, } from "~/constants/enum_mappings" import {UpdateAliasData, updateAlias} from "~/apis" import {ErrorSnack, SuccessSnack} from "~/components" import {parseFastAPIError} from "~/utils" import SelectField from "~/route-widgets/SettingsRoute/SelectField" export interface AliasPreferencesFormProps { alias: Alias } interface Form { removeTrackers: boolean | null createMailReport: boolean | null proxyImages: boolean | null imageProxyFormat: ImageProxyFormatType | null imageProxyUserAgent: ProxyUserAgentType | null detail?: string } const SCHEMA = yup.object().shape({ removeTrackers: yup.mixed().oneOf([true, false, null]), createMailReport: yup.mixed().oneOf([true, false, null]), proxyImages: yup.mixed().oneOf([true, false, null]), imageProxyFormat: yup .mixed() .oneOf([null, ...Object.values(ImageProxyFormatType)]), imageProxyUserAgent: yup .mixed() .oneOf([null, ...Object.values(ProxyUserAgentType)]), }) export default function AliasPreferencesForm({ alias, }: AliasPreferencesFormProps): ReactElement { const {mutateAsync, isSuccess} = useMutation< Alias, AxiosError, UpdateAliasData >(data => updateAlias(alias.id, data)) const formik = useFormik
({ enableReinitialize: true, initialValues: { removeTrackers: alias.prefRemoveTrackers, createMailReport: alias.prefCreateMailReport, proxyImages: alias.prefProxyImages, imageProxyFormat: alias.prefImageProxyFormat, imageProxyUserAgent: alias.prefImageProxyUserAgent, }, validationSchema: SCHEMA, onSubmit: async (values, {setErrors}) => { try { await mutateAsync({ prefCreateMailReport: values.createMailReport, prefRemoveTrackers: values.removeTrackers, prefProxyImages: values.proxyImages, prefImagProxyFormat: values.imageProxyFormat, prefImageProxyUserAgent: values.imageProxyUserAgent, }) } catch (error) { setErrors(parseFastAPIError(error as AxiosError)) } }, }) return ( <> } name="removeTrackers" /> } name="createMailReport" /> } name="proxyImages" /> } name="imageProxyFormat" valueTextMap={ IMAGE_PROXY_FORMAT_TYPE_NAME_MAP } /> } > Save Settings
) }