/* * Copyright (C) Contributors to the Suwayomi project * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import React, { useState, useEffect } from 'react'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; import Dialog from '@mui/material/Dialog'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import DialogActions from '@mui/material/DialogActions'; import FormGroup from '@mui/material/FormGroup'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; import Button from '@mui/material/Button'; import cloneObject from 'util/cloneObject'; interface IListDialogProps{ selectedValues: string[] open: boolean onClose: (arg0: string[] | null) => void values: string[] } function ListDialog(props: IListDialogProps) { const { selectedValues: selectedValuesProp, open, onClose, values, } = props; const [selectedValues, setSelectedValues] = React.useState(selectedValuesProp); React.useEffect(() => { if (!open) { setSelectedValues(selectedValuesProp); } }, [selectedValuesProp, open]); const handleCancel = () => { onClose(null); }; const handleOk = () => { onClose(selectedValues); }; const handleChange = (event: React.ChangeEvent, value: string) => { const { checked } = event.target as HTMLInputElement; const hasEntry = selectedValues.some((selectedValue) => value === selectedValue); if (checked) { if (!hasEntry) { const selectedValuesClone = cloneObject(selectedValues) as string[]; selectedValuesClone.push(value); setSelectedValues(selectedValuesClone); } } else if (hasEntry) { // not checked and has entry const selectedValuesClone = cloneObject(selectedValues) as string[]; const index = selectedValuesClone.indexOf(value); selectedValuesClone.splice(index, 1); setSelectedValues(selectedValuesClone); } }; return ( Phone Ringtone {values.map((value) => ( value === selectedValue, )} onChange={(e) => handleChange(e, value)} color="default" /> )} label={value} key={value} /> ))} ); } export default function MultiSelectListPreference(props: MultiSelectListPreferenceProps) { const { title, summary, currentValue, updateValue, entryValues, entries, } = props; const [internalCurrentValue, setInternalCurrentValue] = useState(currentValue); const [dialogOpen, setDialogOpen] = useState(false); useEffect(() => { setInternalCurrentValue(currentValue); }, [currentValue]); const findEntriesOf = (values: string[]) => values.map((value) => { const idx = entryValues.indexOf(value); return entries[idx]; }); const findEntryValuesOf = (values: string[]) => values.map((value) => { const idx = entries.indexOf(value); return entryValues[idx]; }); const getSummary = () => summary; const handleDialogClose = (newValue: string[] | null) => { if (newValue !== null) { // console.log(newValue); updateValue(findEntryValuesOf(newValue)); // appear smooth setInternalCurrentValue(newValue); } setDialogOpen(false); }; return ( <> setDialogOpen(true)} > ); }