mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-11 23:26:30 +08:00
171 lines
4.9 KiB
TypeScript
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);
|
|
};
|