Files
AFFiNE-Mirror/libs/components/layout/src/settings-sidebar/Settings/use-settings.ts
T
2022-09-08 18:48:01 +08:00

171 lines
4.9 KiB
TypeScript

import { message } from '@toeverything/components/ui';
import { useTranslation } from '@toeverything/datasource/i18n';
import { copyToClipboard } from '@toeverything/utils';
import { useNavigate } from 'react-router-dom';
import { useSettingFlags, type SettingFlags } from './use-setting-flags';
import {
clearWorkspace,
duplicatePage,
exportHtml,
exportMarkdown,
exportWorkspace,
getPageTitle,
importWorkspace,
useWorkspaceAndPageId,
} from './util';
interface BaseSettingItem {
flag?: keyof SettingFlags;
key: string;
}
interface SwitchItem extends BaseSettingItem {
name: string;
type: 'switch';
value: boolean;
onChange: (value: boolean) => void;
}
interface SeparatorItem extends BaseSettingItem {
type: 'separator';
}
interface ButtonItem extends BaseSettingItem {
name: string;
type: 'button';
onClick: () => void;
}
type SettingItem = SwitchItem | SeparatorItem | ButtonItem;
const filterSettings = (settings: SettingItem[], flags: SettingFlags) => {
return settings
.filter(setting => {
if (!setting.flag) {
return true;
}
return flags[setting.flag];
})
.filter((setting, index, array) => {
if (setting.type === 'separator') {
if (
// If the current is a separator, and the following is also a separator, delete the current one
array[index + 1]?.type === 'separator' ||
// If the current separator is the last one, delete the current one
index === array.length - 1
) {
return false;
}
}
return true;
});
};
export const useSettings = (): SettingItem[] => {
const { workspaceId, pageId } = useWorkspaceAndPageId();
const navigate = useNavigate();
const settingFlags = useSettingFlags();
const { t } = useTranslation();
// const { toggleReadingMode, readingMode } = useReadingMode();
const settings: SettingItem[] = [
// {
// type: 'switch',
// name: 'Reading Mode',
// value: readingMode,
// onChange: () => {
// toggleReadingMode();
// },
// },
// {
// type: 'separator',
// },
{
type: 'button',
name: t('Duplicate Page'),
key: 'Duplicate Page',
onClick: async () => {
const newPageInfo = await duplicatePage({
workspaceId,
pageId,
});
navigate(`/${newPageInfo.workspaceId}/${newPageInfo.pageId}`);
},
},
{
type: 'button',
name: t('Copy Page Link'),
key: 'Copy Page Link',
onClick: () => {
copyToClipboard(window.location.href);
message.success('Page link copied successfully');
},
},
{
type: 'button',
name: t('Language'),
key: 'Language',
onClick: () => {
// Do noting
},
},
{
type: 'separator',
key: 'separator1',
},
{
type: 'button',
name: t('Export As Markdown'),
key: 'Export As Markdown',
onClick: async () => {
const title = await getPageTitle({ workspaceId, pageId });
exportMarkdown({ workspaceId, rootBlockId: pageId, title });
},
flag: 'booleanExportMarkdown',
},
{
type: 'button',
name: t('Export As HTML'),
key: 'Export As HTML',
onClick: async () => {
const title = await getPageTitle({ workspaceId, pageId });
exportHtml({ workspaceId, rootBlockId: pageId, title });
},
flag: 'booleanExportHtml',
},
{
type: 'button',
name: t('Export As PDF (Unsupported)'),
key: 'Export As PDF (Unsupported)',
onClick: () => console.log('Export As PDF'),
flag: 'booleanExportPdf',
},
{
type: 'separator',
key: 'separator2',
},
{
type: 'button',
name: t('Clear Workspace'),
key: 'Clear Workspace',
onClick: () => clearWorkspace(workspaceId),
flag: 'booleanClearWorkspace',
},
{
type: 'button',
name: t('Import Workspace'),
key: 'Import Workspace',
onClick: () => importWorkspace(),
},
{
type: 'button',
name: t('Export Workspace'),
key: 'Export Workspace',
onClick: () => exportWorkspace(),
},
];
return filterSettings(settings, settingFlags);
};