um-react/src/features/settings/Settings.tsx

121 lines
3.2 KiB
TypeScript
Raw Normal View History

2023-06-09 23:45:41 +00:00
import {
Box,
2023-06-09 23:45:41 +00:00
Button,
Center,
2023-06-09 23:45:41 +00:00
Flex,
HStack,
2023-06-09 23:45:41 +00:00
Menu,
MenuButton,
MenuItem,
MenuList,
Portal,
Spacer,
2023-06-09 23:45:41 +00:00
Tab,
TabList,
TabPanel,
TabPanels,
Tabs,
Text,
VStack,
2023-06-09 23:45:41 +00:00
useBreakpointValue,
} from '@chakra-ui/react';
import { PanelQMCv2Key } from './panels/PanelQMCv2Key';
import { useState } from 'react';
import { MdExpandMore, MdMenu } from 'react-icons/md';
import { useAppDispatch } from '~/hooks';
import { commitStagingChange, discardStagingChanges } from './settingsSlice';
2023-06-09 23:45:41 +00:00
const TABS: { name: string; Tab: () => JSX.Element }[] = [
{ name: 'QMCv2 密钥', Tab: PanelQMCv2Key },
{
name: '其它/待定',
Tab: () => <Text></Text>,
2023-06-09 23:45:41 +00:00
},
];
2023-06-09 22:11:30 +00:00
export function Settings() {
const dispatch = useAppDispatch();
2023-06-09 23:45:41 +00:00
const isLargeWidthDevice =
useBreakpointValue({
base: false,
lg: true,
}) ?? false;
const [tabIndex, setTabIndex] = useState(0);
const handleTabChange = (idx: number) => {
setTabIndex(idx);
};
const handleResetSettings = () => dispatch(discardStagingChanges());
const handleApplySettings = () => dispatch(commitStagingChange());
2023-06-09 23:45:41 +00:00
2023-06-09 22:11:30 +00:00
return (
2023-06-09 23:45:41 +00:00
<Flex flexDir="column" flex={1}>
<Menu>
<MenuButton
as={Button}
leftIcon={<MdMenu />}
rightIcon={<MdExpandMore />}
colorScheme="gray"
variant="outline"
w="full"
flexShrink={0}
hidden={isLargeWidthDevice}
mb="4"
>
{TABS[tabIndex].name}
</MenuButton>
<Portal>
<MenuList w="100px">
{TABS.map(({ name }, i) => (
<MenuItem key={name} onClick={() => setTabIndex(i)}>
{name}
</MenuItem>
))}
</MenuList>
</Portal>
</Menu>
<Tabs
orientation={isLargeWidthDevice ? 'vertical' : 'horizontal'}
align="start"
variant="line-i"
display="flex"
flex={1}
index={tabIndex}
onChange={handleTabChange}
>
<TabList hidden={!isLargeWidthDevice} minW="8em" width="8em" textAlign="right" justifyContent="center">
{TABS.map(({ name }) => (
<Tab key={name}>{name}</Tab>
))}
</TabList>
2023-06-09 22:11:30 +00:00
2023-06-09 23:45:41 +00:00
<TabPanels>
{TABS.map(({ name, Tab }) => (
<Flex as={TabPanel} flex={1} flexDir="column" h="100%" key={name}>
<Flex h="100%" flex={1} minH={0}>
<Tab />
</Flex>
<VStack mt="4" alignItems="flex-start" w="full">
<Flex flexDir="row" gap="2" w="full">
<Center>
<Box color="gray"></Box>
</Center>
<Spacer />
<HStack gap="2" justifyContent="flex-end">
<Button onClick={handleResetSettings} colorScheme="red" variant="ghost" title="重置为更改前的状态">
</Button>
<Button onClick={handleApplySettings}></Button>
</HStack>
</Flex>
</VStack>
</Flex>
2023-06-09 23:45:41 +00:00
))}
</TabPanels>
</Tabs>
</Flex>
2023-06-09 22:11:30 +00:00
);
}