import { Button, Flex, Heading, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, Text, useDisclosure, } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import _, { isEqual } from 'lodash'; import { ChangeEvent, cloneElement, ReactElement } from 'react'; import { RootState, useAppDispatch, useAppSelector } from '../../../app/store'; import { persistor } from '../../../main'; import { InProgressImageType, setSaveIntermediatesInterval, setShouldConfirmOnDelete, setShouldDisplayGuides, setShouldDisplayInProgressType, SystemState, } from '../systemSlice'; import ModelList from './ModelList'; import { IN_PROGRESS_IMAGE_TYPES } from '../../../app/constants'; import IAISwitch from '../../../common/components/IAISwitch'; import IAISelect from '../../../common/components/IAISelect'; import IAINumberInput from '../../../common/components/IAINumberInput'; const systemSelector = createSelector( (state: RootState) => state.system, (system: SystemState) => { const { shouldDisplayInProgressType, shouldConfirmOnDelete, shouldDisplayGuides, model_list, } = system; return { shouldDisplayInProgressType, shouldConfirmOnDelete, shouldDisplayGuides, models: _.map(model_list, (_model, key) => key), }; }, { memoizeOptions: { resultEqualityCheck: isEqual }, } ); type SettingsModalProps = { /* The button to open the Settings Modal */ children: ReactElement; }; /** * Modal for app settings. Also provides Reset functionality in which the * app's localstorage is wiped via redux-persist. * * Secondary post-reset modal is included here. */ const SettingsModal = ({ children }: SettingsModalProps) => { const dispatch = useAppDispatch(); const saveIntermediatesInterval = useAppSelector( (state: RootState) => state.system.saveIntermediatesInterval ); const steps = useAppSelector((state: RootState) => state.options.steps); const { isOpen: isSettingsModalOpen, onOpen: onSettingsModalOpen, onClose: onSettingsModalClose, } = useDisclosure(); const { isOpen: isRefreshModalOpen, onOpen: onRefreshModalOpen, onClose: onRefreshModalClose, } = useDisclosure(); const { shouldDisplayInProgressType, shouldConfirmOnDelete, shouldDisplayGuides, } = useAppSelector(systemSelector); /** * Resets localstorage, then opens a secondary modal informing user to * refresh their browser. * */ const handleClickResetWebUI = () => { persistor.purge().then(() => { onSettingsModalClose(); onRefreshModalOpen(); }); }; const handleChangeIntermediateSteps = (value: number) => { if (value > steps) value = steps; if (value < 1) value = 1; dispatch(setSaveIntermediatesInterval(value)); }; return ( <> {cloneElement(children, { onClick: onSettingsModalOpen, })} Settings
) => dispatch( setShouldDisplayInProgressType( e.target.value as InProgressImageType ) ) } /> {shouldDisplayInProgressType === 'full-res' && ( )}
) => dispatch(setShouldConfirmOnDelete(e.target.checked)) } /> ) => dispatch(setShouldDisplayGuides(e.target.checked)) } />
Reset Web UI Resetting the web UI only resets the browser's local cache of your images and remembered settings. It does not delete any images from disk. If images aren't showing up in the gallery or something else isn't working, please try resetting before submitting an issue on GitHub.
Web UI has been reset. Refresh the page to reload. ); }; export default SettingsModal;