import { Box, Card, Grid, GridCol, Group, LoadingOverlay, Overlay, Stack, Switch, Text, TextInput, } from '@mantine/core'; import { useDebouncedValue } from '@mantine/hooks'; import { SettingsHeader } from 'components'; import { useCommonHooks, useMutationAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import FontPicker from 'react-fontpicker-ts'; import { cardClasses, switchClasses, textClasses, textInputClasses } from 'styles'; import type { PersonalData } from 'types'; export function Personalization() { const endpoint = 'api/personalData'; const { data: personalData, isFetching: personalDataIsFetching } = useQueryAPI({ endpoint: endpoint, }); const personal: PersonalData = personalData?.[0] || {}; const [wolEnabled, setWolEnabled] = useState(personal?.enableWol === 1); const [guacamoleEnabled, setGuacamoleEnabled] = useState( personal?.enableGuacamole === 1, ); const [defaultFont, setDefaultFont] = useState(personal?.defaultFont); const [customFont, setCustomFont] = useState(); const [update, setUpdate] = useState(); const [debounced] = useDebouncedValue(update, 1000); const { mutateAsync } = useMutationAPI(); const { isMobile, theme } = useCommonHooks(); useEffect(() => { if (debounced && Object.keys(debounced).length) { mutateAsync({ method: 'PATCH', endpoint: endpoint, body: debounced }); setUpdate(undefined); } }, [debounced]); useEffect(() => { if (Object.keys(personal).length > 0) { setCustomFont(personal.defaultFont !== 'Jost'); setWolEnabled(personal.enableWol === 1); setGuacamoleEnabled(personal.enableGuacamole === 1); setDefaultFont(personal.defaultFont); } }, [personal]); useEffect(() => { if ( Object.keys(personal).length > 0 && defaultFont && defaultFont !== personal.defaultFont ) { setUpdate({ ...personal, defaultFont: defaultFont, }); } }, [defaultFont]); return ( {}} searchPlaceholder={undefined} isLoading={false} setIsLoading={() => {}} /> {Object.keys(personal).length > 0 && ( <> { const updatedPersonal = { ...personal, firstName: event.currentTarget.value, }; setUpdate(updatedPersonal); }} styles={ theme.textShadowsEnabled ? { label: { boxShadow: '2px 2px var(--mantine-color-border-0)' }, } : undefined } /> { const updatedPersonal = { ...personal, lastName: event.currentTarget.value, }; setUpdate(updatedPersonal); }} styles={ theme.textShadowsEnabled ? { label: { boxShadow: '2px 2px var(--mantine-color-border-0)' }, } : undefined } /> { const updatedPersonal = { ...personal, nickname: event.currentTarget.value, }; setUpdate(updatedPersonal); }} styles={ theme.textShadowsEnabled ? { label: { boxShadow: '2px 2px var(--mantine-color-border-0)' }, } : undefined } /> { const updatedPersonal = { ...personal, email: event.currentTarget.value, }; setUpdate(updatedPersonal); }} styles={ theme.textShadowsEnabled ? { label: { boxShadow: '2px 2px var(--mantine-color-border-0)' }, } : undefined } /> { const updatedPersonal = { ...personal, physicalAddress: event.currentTarget.value, }; setUpdate(updatedPersonal); }} styles={ theme.textShadowsEnabled ? { label: { boxShadow: '2px 2px var(--mantine-color-border-0)' }, } : undefined } /> Extras { setCustomFont(!customFont); if (!event.target.checked) { setDefaultFont('Jost'); } }} /> { setWolEnabled(!wolEnabled); const updatedPersonal = { ...personal, enableWol: event.target.checked ? 1 : 0, }; setUpdate(updatedPersonal); }} /> { setGuacamoleEnabled(!guacamoleEnabled); const updatedPersonal = { ...personal, enableGuacamole: event.target.checked ? 1 : 0, }; setUpdate(updatedPersonal); }} /> {defaultFont && ( {!customFont && ( )} Default Font setDefaultFont(font)} /> )} {!personal?.enableGuacamole && ( )} { const updatedPersonal = { ...personal, guacamoleHost: event.currentTarget.value, }; setUpdate(updatedPersonal); }} styles={{ label: { zIndex: personal?.enableGuacamole ? 1 : -1, boxShadow: theme.textShadowsEnabled ? '2px 2px var(--mantine-color-border-0)' : undefined, }, }} /> )} ); }