import { Anchor, DeleteForever, Palette } from '@mui/icons-material'; import { Autocomplete, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Switch, TextField, } from '@mui/material'; import { DateConfig, Resume } from '@reactive-resume/schema'; import dayjs from 'dayjs'; import get from 'lodash/get'; import { useTranslation } from 'next-i18next'; import { useMemo } from 'react'; import { useMutation } from 'react-query'; import Heading from '@/components/shared/Heading'; import ThemeSwitch from '@/components/shared/ThemeSwitch'; import { Language, languageMap, languages } from '@/config/languages'; import { ServerError } from '@/services/axios'; import queryClient from '@/services/react-query'; import { loadSampleData, LoadSampleDataParams, resetResume, ResetResumeParams } from '@/services/resume'; import { setTheme, togglePageBreakLine, togglePageOrientation } from '@/store/build/buildSlice'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import { setResumeState } from '@/store/resume/resumeSlice'; import { dateFormatOptions } from '@/utils/date'; const Settings = () => { const { t } = useTranslation(); const dispatch = useAppDispatch(); const resume = useAppSelector((state) => state.resume); const theme = useAppSelector((state) => state.build.theme); const breakLine = useAppSelector((state) => state.build.page.breakLine); const orientation = useAppSelector((state) => state.build.page.orientation); const id: number = useMemo(() => get(resume, 'id'), [resume]); const slug: string = useMemo(() => get(resume, 'slug'), [resume]); const username: string = useMemo(() => get(resume, 'user.username'), [resume]); const language: string = useMemo(() => get(resume, 'metadata.language'), [resume]); const dateConfig: DateConfig = useMemo(() => get(resume, 'metadata.date'), [resume]); const isDarkMode = useMemo(() => theme === 'dark', [theme]); const exampleString = useMemo(() => `Eg. ${dayjs().format(dateConfig.format)}`, [dateConfig.format]); const themeString = useMemo(() => (isDarkMode ? 'Matte Black Everything' : 'As bright as your future'), [isDarkMode]); const { mutateAsync: loadSampleDataMutation } = useMutation( loadSampleData ); const { mutateAsync: resetResumeMutation } = useMutation(resetResume); const handleSetTheme = (value: boolean) => dispatch(setTheme({ theme: value ? 'dark' : 'light' })); const handleChangeDateFormat = (value: string | null) => dispatch(setResumeState({ path: 'metadata.date.format', value })); const handleChangeLanguage = (value: Language | null) => dispatch(setResumeState({ path: 'metadata.language', value: value?.code })); const handleLoadSampleData = async () => { await loadSampleDataMutation({ id }); queryClient.invalidateQueries(`resume/${username}/${slug}`); }; const handleResetResume = async () => { await resetResumeMutation({ id }); queryClient.invalidateQueries(`resume/${username}/${slug}`); }; return ( <> {/* Global Settings */} <> {t('builder.rightSidebar.sections.settings.global.heading')} handleSetTheme(value)} /> disableClearable className="my-2 w-full" options={dateFormatOptions} value={dateConfig.format} onChange={(_, value) => handleChangeDateFormat(value)} renderInput={(params) => } /> disableClearable className="my-2 w-full" options={languages} value={languageMap[language]} getOptionLabel={(language) => { if (language.localName) { return `${language.name} (${language.localName})`; } return language.name; }} isOptionEqualToValue={(a, b) => a.code === b.code} onChange={(_, value) => handleChangeLanguage(value)} renderInput={(params) => } /> {/* Page Settings */} <> {t('builder.rightSidebar.sections.settings.page.heading')} dispatch(togglePageOrientation())} /> dispatch(togglePageBreakLine())} /> {/* Resume Settings */} <> {t('builder.rightSidebar.sections.settings.resume.heading')} ); }; export default Settings;