vue-vben-admin/src/layouts/default/setting/SettingDrawer.tsx

560 lines
16 KiB
TypeScript
Raw Normal View History

2020-11-24 22:59:29 +08:00
import type { ProjectConfig } from '/@/types/config';
import defaultSetting from '/@/settings/projectSetting';
import { defineComponent, computed, unref, FunctionalComponent } from 'vue';
2020-09-28 20:19:10 +08:00
import { BasicDrawer } from '/@/components/Drawer/index';
import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue';
2020-11-26 21:19:39 +08:00
import { Button } from '/@/components/Button';
2020-09-28 20:19:10 +08:00
import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue';
2020-11-24 22:59:29 +08:00
import { MenuTypeEnum } from '/@/enums/menuEnum';
2020-09-28 20:19:10 +08:00
import { appStore } from '/@/store/modules/app';
import { useMessage } from '/@/hooks/web/useMessage';
import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
2020-11-24 22:59:29 +08:00
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
2020-11-25 00:43:33 +08:00
import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
2020-11-25 23:20:30 +08:00
import { useI18n } from '/@/hooks/web/useI18n';
2020-09-28 20:19:10 +08:00
import { updateColorWeak, updateGrayMode } from '/@/setup/theme';
2020-11-24 22:59:29 +08:00
2020-11-10 22:45:39 +08:00
import { baseHandler } from './handler';
2020-11-24 22:59:29 +08:00
2020-11-10 22:45:39 +08:00
import {
HandlerEnum,
contentModeOptions,
topMenuAlignOptions,
menuTriggerOptions,
routerTransitionOptions,
2020-11-24 22:59:29 +08:00
menuTypeList,
} from './enum';
import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/colorSetting';
2020-09-28 20:19:10 +08:00
interface SwitchOptions {
config?: DeepPartial<ProjectConfig>;
def?: any;
disabled?: boolean;
handler?: Fn;
}
interface SelectConfig {
2020-11-18 22:41:59 +08:00
options?: LabelValueOptions;
2020-09-28 20:19:10 +08:00
def?: any;
disabled?: boolean;
handler?: Fn;
}
2020-11-24 22:59:29 +08:00
interface ThemePickerProps {
colorList: string[];
handler: Fn;
def: string;
}
2020-11-24 22:59:29 +08:00
const { createSuccessModal, createMessage } = useMessage();
2020-12-01 23:51:39 +08:00
const { t } = useI18n();
2020-11-24 22:59:29 +08:00
/**
* Menu type Picker comp
*/
const MenuTypePicker: FunctionalComponent = () => {
const { getIsHorizontal, getMenuType } = useMenuSetting();
return (
<div class={`setting-drawer__siderbar`}>
{menuTypeList.map((item) => {
const { title, type: ItemType, mode, src } = item;
return (
<Tooltip title={title} placement="bottom" key={title}>
{{
default: () => (
<div
onClick={baseHandler.bind(null, HandlerEnum.CHANGE_LAYOUT, {
mode: mode,
type: ItemType,
split: unref(getIsHorizontal) ? false : undefined,
})}
>
<CheckOutlined
class={['check-icon', unref(getMenuType) === ItemType ? 'active' : '']}
/>
<img src={src} />
</div>
),
}}
</Tooltip>
);
})}
</div>
);
};
const ThemePicker: FunctionalComponent<ThemePickerProps> = (props) => {
return (
<div class={`setting-drawer__theme-item`}>
{props.colorList.map((color) => {
return (
<span
onClick={() => props.handler?.(color)}
key={color}
class={[props.def === color ? 'active' : '']}
style={{
background: color,
}}
>
<CheckOutlined class="icon" />
</span>
);
})}
</div>
);
};
/**
* FooterButton component
*/
const FooterButton: FunctionalComponent = () => {
const { getRootSetting } = useRootSetting();
function handleCopy() {
const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2));
unref(isSuccessRef) &&
createSuccessModal({
2020-12-01 23:51:39 +08:00
title: t('layout.setting.operatingTitle'),
content: t('layout.setting.operatingContent'),
2020-11-24 22:59:29 +08:00
});
}
function handleResetSetting() {
try {
appStore.commitProjectConfigState(defaultSetting);
const { colorWeak, grayMode } = defaultSetting;
// updateTheme(themeColor);
updateColorWeak(colorWeak);
updateGrayMode(grayMode);
2020-12-01 23:51:39 +08:00
createMessage.success(t('layout.setting.resetSuccess'));
2020-11-24 22:59:29 +08:00
} catch (error) {
createMessage.error(error);
}
}
function handleClearAndRedo() {
localStorage.clear();
appStore.resumeAllState();
location.reload();
}
return (
<div class="setting-drawer__footer">
<Button type="primary" block onClick={handleCopy}>
{() => (
<>
<CopyOutlined class="mr-2" />
2020-12-01 23:51:39 +08:00
{t('layout.setting.copyBtn')}
2020-11-24 22:59:29 +08:00
</>
)}
</Button>
<Button block class="mt-2" onClick={handleResetSetting} color="warning">
{() => (
<>
<RedoOutlined class="mr-2" />
2020-12-01 23:51:39 +08:00
{t('layout.setting.resetBtn')}
2020-11-24 22:59:29 +08:00
</>
)}
</Button>
<Button block class="mt-2" onClick={handleClearAndRedo} color="error">
{() => (
<>
<RedoOutlined class="mr-2" />
2020-12-01 23:51:39 +08:00
{t('layout.setting.clearBtn')}
2020-11-24 22:59:29 +08:00
</>
)}
</Button>
</div>
);
};
2020-09-28 20:19:10 +08:00
export default defineComponent({
name: 'SettingDrawer',
setup(_, { attrs }) {
2020-11-24 22:59:29 +08:00
const {
getContentMode,
getShowFooter,
getShowBreadCrumb,
getShowBreadCrumbIcon,
getShowLogo,
getFullContent,
getColorWeak,
getGrayMode,
} = useRootSetting();
2020-09-28 20:19:10 +08:00
2020-11-25 00:43:33 +08:00
const {
getOpenPageLoading,
getBasicTransition,
getEnableTransition,
getOpenNProgress,
} = useTransitionSetting();
2020-11-24 22:59:29 +08:00
const {
getIsHorizontal,
getShowMenu,
getMenuType,
getTrigger,
getCollapsedShowTitle,
getMenuFixed,
getCollapsed,
2020-11-25 22:28:58 +08:00
getCanDrag,
2020-11-24 22:59:29 +08:00
getTopMenuAlign,
getAccordion,
getMenuWidth,
getMenuBgColor,
getIsTopMenu,
getSplit,
} = useMenuSetting();
2020-09-28 20:19:10 +08:00
2020-12-10 23:58:11 +08:00
const {
getShowHeader,
getFixed: getHeaderFixed,
getHeaderBgColor,
getShowSearch,
} = useHeaderSetting();
2020-09-28 20:19:10 +08:00
2020-11-24 22:59:29 +08:00
const { getShowMultipleTab, getShowQuick } = useMultipleTabSetting();
2020-09-28 20:19:10 +08:00
const getShowMenuRef = computed(() => {
2020-11-24 22:59:29 +08:00
return unref(getShowMenu) && !unref(getIsHorizontal);
2020-09-28 20:19:10 +08:00
});
2020-11-24 22:59:29 +08:00
function renderSidebar() {
return (
<>
<MenuTypePicker />
2020-12-01 23:51:39 +08:00
{renderSwitchItem(t('layout.setting.splitMenu'), {
2020-11-24 22:59:29 +08:00
handler: (e) => {
baseHandler(HandlerEnum.MENU_SPLIT, e);
},
def: unref(getSplit),
disabled: !unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX,
})}
</>
2020-09-28 20:19:10 +08:00
);
}
2020-11-24 22:59:29 +08:00
function renderTheme() {
return (
<>
2020-12-01 23:51:39 +08:00
<Divider>{() => t('layout.setting.headerTheme')}</Divider>
2020-11-24 22:59:29 +08:00
<ThemePicker
colorList={HEADER_PRESET_BG_COLOR_LIST}
def={unref(getHeaderBgColor)}
handler={(e) => {
baseHandler(HandlerEnum.HEADER_THEME, e);
}}
/>
2020-12-01 23:51:39 +08:00
<Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
2020-11-24 22:59:29 +08:00
<ThemePicker
colorList={SIDE_BAR_BG_COLOR_LIST}
def={unref(getMenuBgColor)}
handler={(e) => {
baseHandler(HandlerEnum.MENU_THEME, e);
}}
/>
</>
);
2020-11-10 22:45:39 +08:00
}
2020-09-28 20:19:10 +08:00
/**
* @description:
*/
function renderFeatures() {
return [
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.menuDrag'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_HAS_DRAG, e);
2020-09-28 20:19:10 +08:00
},
2020-11-25 22:28:58 +08:00
def: unref(getCanDrag),
2020-09-28 20:19:10 +08:00
disabled: !unref(getShowMenuRef),
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.menuSearch'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-12-10 23:58:11 +08:00
baseHandler(HandlerEnum.HEADER_SEARCH, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowSearch),
2020-12-10 23:58:11 +08:00
disabled: !unref(getShowHeader),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.menuAccordion'), {
2020-11-10 22:45:39 +08:00
handler: (e) => {
baseHandler(HandlerEnum.MENU_ACCORDION, e);
},
2020-11-24 22:59:29 +08:00
def: unref(getAccordion),
2020-11-10 22:45:39 +08:00
disabled: !unref(getShowMenuRef),
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.menuCollapse'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_COLLAPSED, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getCollapsed),
2020-09-28 20:19:10 +08:00
disabled: !unref(getShowMenuRef),
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.collapseMenuDisplayName'), {
2020-10-19 22:47:44 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e);
2020-10-19 22:47:44 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getCollapsedShowTitle),
disabled: !unref(getShowMenuRef) || !unref(getCollapsed),
2020-10-19 22:47:44 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.fixedHeader'), {
2020-11-10 23:50:47 +08:00
handler: (e) => {
baseHandler(HandlerEnum.HEADER_FIXED, e);
},
2020-11-24 22:59:29 +08:00
def: unref(getHeaderFixed),
disabled: !unref(getShowHeader),
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.fixedSideBar'), {
2020-11-24 22:59:29 +08:00
handler: (e) => {
baseHandler(HandlerEnum.MENU_FIXED, e);
},
def: unref(getMenuFixed),
disabled: !unref(getShowMenuRef),
2020-11-10 23:50:47 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSelectItem(t('layout.setting.topMenuLayout'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_TOP_ALIGN, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getTopMenuAlign),
2020-09-28 20:19:10 +08:00
options: topMenuAlignOptions,
2020-11-24 22:59:29 +08:00
disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSelectItem(t('layout.setting.menuCollapseButton'), {
2020-11-06 22:41:00 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_TRIGGER, e);
2020-11-06 22:41:00 +08:00
},
2020-11-24 22:59:29 +08:00
disabled: !unref(getShowMenuRef),
def: unref(getTrigger),
2020-11-06 22:41:00 +08:00
options: menuTriggerOptions,
}),
2020-11-10 23:50:47 +08:00
2020-12-01 23:51:39 +08:00
renderSelectItem(t('layout.setting.contentMode'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.CONTENT_MODE, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getContentMode),
2020-09-28 20:19:10 +08:00
options: contentModeOptions,
}),
<div class={`setting-drawer__cell-item`}>
2020-12-01 23:51:39 +08:00
<span>{t('layout.setting.autoScreenLock')}</span>
2020-09-28 20:19:10 +08:00
<InputNumber
2020-11-25 23:20:30 +08:00
style="width:126px"
2020-09-28 20:19:10 +08:00
size="small"
min={0}
2020-11-10 22:45:39 +08:00
onChange={(e: any) => {
baseHandler(HandlerEnum.LOCK_TIME, e);
2020-09-28 20:19:10 +08:00
}}
defaultValue={appStore.getProjectConfig.lockTime}
formatter={(value: string) => {
if (parseInt(value) === 0) {
2020-12-01 23:51:39 +08:00
return `0(${t('layout.setting.notAutoScreenLock')})`;
2020-09-28 20:19:10 +08:00
}
2020-12-01 23:51:39 +08:00
return `${value}${t('layout.setting.minute')}`;
2020-09-28 20:19:10 +08:00
}}
/>
</div>,
<div class={`setting-drawer__cell-item`}>
2020-12-01 23:51:39 +08:00
<span>{t('layout.setting.expandedMenuWidth')}</span>
2020-09-28 20:19:10 +08:00
<InputNumber
2020-11-25 23:20:30 +08:00
style="width:126px"
2020-09-28 20:19:10 +08:00
size="small"
max={600}
min={100}
step={10}
disabled={!unref(getShowMenuRef)}
2020-11-24 22:59:29 +08:00
defaultValue={unref(getMenuWidth)}
2020-09-28 20:19:10 +08:00
formatter={(value: string) => `${parseInt(value)}px`}
2020-11-06 22:41:00 +08:00
onChange={(e: any) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_WIDTH, e);
2020-09-28 20:19:10 +08:00
}}
/>
</div>,
];
}
function renderContent() {
return [
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.breadcrumb'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.SHOW_BREADCRUMB, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowBreadCrumb),
disabled: !unref(getShowHeader),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.breadcrumbIcon'), {
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e);
},
2020-11-24 22:59:29 +08:00
def: unref(getShowBreadCrumbIcon),
disabled: !unref(getShowHeader),
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.tabs'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.TABS_SHOW, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowMultipleTab),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.tabsQuickBtn'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.TABS_SHOW_QUICK, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowQuick),
disabled: !unref(getShowMultipleTab),
2020-09-28 20:19:10 +08:00
}),
2020-11-24 22:59:29 +08:00
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.sidebar'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowMenu),
disabled: unref(getIsHorizontal),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.header'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.HEADER_SHOW, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowHeader),
2020-09-28 20:19:10 +08:00
}),
renderSwitchItem('Logo', {
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.SHOW_LOGO, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getShowLogo),
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.footer'), {
2020-11-24 22:59:29 +08:00
handler: (e) => {
baseHandler(HandlerEnum.SHOW_FOOTER, e);
},
def: unref(getShowFooter),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.fullContent'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.FULL_CONTENT, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getFullContent),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.grayMode'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.GRAY_MODE, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getGrayMode),
2020-09-28 20:19:10 +08:00
}),
2020-12-01 23:51:39 +08:00
renderSwitchItem(t('layout.setting.colorWeak'), {
2020-09-28 20:19:10 +08:00
handler: (e) => {
2020-11-10 22:45:39 +08:00
baseHandler(HandlerEnum.COLOR_WEAK, e);
2020-09-28 20:19:10 +08:00
},
2020-11-24 22:59:29 +08:00
def: unref(getColorWeak),
2020-09-28 20:19:10 +08:00
}),
];
}
2020-11-24 22:59:29 +08:00
function renderTransition() {
return (
<>
2020-12-01 23:51:39 +08:00
{renderSwitchItem(t('layout.setting.progress'), {
2020-11-25 00:43:33 +08:00
handler: (e) => {
baseHandler(HandlerEnum.OPEN_PROGRESS, e);
},
def: unref(getOpenNProgress),
})}
2020-12-01 23:51:39 +08:00
{renderSwitchItem(t('layout.setting.switchLoading'), {
2020-11-24 22:59:29 +08:00
handler: (e) => {
baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e);
},
def: unref(getOpenPageLoading),
})}
2020-12-01 23:51:39 +08:00
{renderSwitchItem(t('layout.setting.switchAnimation'), {
2020-11-24 22:59:29 +08:00
handler: (e) => {
baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e);
},
2020-11-25 00:43:33 +08:00
def: unref(getEnableTransition),
2020-11-24 22:59:29 +08:00
})}
2020-12-01 23:51:39 +08:00
{renderSelectItem(t('layout.setting.animationType'), {
2020-11-24 22:59:29 +08:00
handler: (e) => {
baseHandler(HandlerEnum.ROUTER_TRANSITION, e);
},
2020-11-25 00:43:33 +08:00
def: unref(getBasicTransition),
2020-11-24 22:59:29 +08:00
options: routerTransitionOptions,
2020-11-25 00:43:33 +08:00
disabled: !unref(getEnableTransition),
2020-11-24 22:59:29 +08:00
})}
</>
);
}
2020-09-28 20:19:10 +08:00
function renderSelectItem(text: string, config?: SelectConfig) {
const { handler, def, disabled = false, options } = config || {};
const opt = def ? { value: def, defaultValue: def } : {};
return (
<div class={`setting-drawer__cell-item`}>
<span>{text}</span>
<Select
{...opt}
disabled={disabled}
size="small"
2020-11-25 23:20:30 +08:00
style={{ width: '126px' }}
2020-09-28 20:19:10 +08:00
onChange={(e) => {
handler && handler(e);
}}
options={options}
/>
</div>
);
}
function renderSwitchItem(text: string, options?: SwitchOptions) {
const { handler, def, disabled = false } = options || {};
const opt = def ? { checked: def } : {};
return (
<div class={`setting-drawer__cell-item`}>
<span>{text}</span>
<Switch
{...opt}
disabled={disabled}
2020-11-06 22:41:00 +08:00
onChange={(e: any) => {
2020-09-28 20:19:10 +08:00
handler && handler(e);
}}
2020-12-01 23:51:39 +08:00
checkedChildren={t('layout.setting.on')}
unCheckedChildren={t('layout.setting.off')}
2020-09-28 20:19:10 +08:00
/>
</div>
);
}
2020-11-10 22:45:39 +08:00
2020-09-28 20:19:10 +08:00
return () => (
2020-12-01 23:51:39 +08:00
<BasicDrawer
{...attrs}
title={t('layout.setting.drawerTitle')}
width={330}
wrapClassName="setting-drawer"
>
2020-09-28 20:19:10 +08:00
{{
default: () => (
<>
2020-12-01 23:51:39 +08:00
<Divider>{() => t('layout.setting.navMode')}</Divider>
2020-09-28 20:19:10 +08:00
{renderSidebar()}
{renderTheme()}
2020-12-01 23:51:39 +08:00
<Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
2020-09-28 20:19:10 +08:00
{renderFeatures()}
2020-12-01 23:51:39 +08:00
<Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>
2020-09-28 20:19:10 +08:00
{renderContent()}
2020-12-01 23:51:39 +08:00
<Divider>{() => t('layout.setting.animation')}</Divider>
2020-09-28 20:19:10 +08:00
{renderTransition()}
<Divider />
2020-11-24 22:59:29 +08:00
<FooterButton />
2020-09-28 20:19:10 +08:00
</>
),
}}
</BasicDrawer>
);
},
});