Files
AFFiNE-Mirror/blocksuite/blocks/src/_specs/preset/mobile-patch.ts
2024-12-20 15:38:06 +08:00

120 lines
3.3 KiB
TypeScript

import {
type ReferenceNodeConfig,
ReferenceNodeConfigIdentifier,
} from '@blocksuite/affine-components/rich-text';
import {
type BlockStdScope,
ConfigIdentifier,
LifeCycleWatcher,
WidgetViewMapIdentifier,
type WidgetViewMapType,
} from '@blocksuite/block-std';
import type { Container } from '@blocksuite/global/di';
import type { CodeBlockConfig } from '../../code-block/code-block-config.js';
import { AFFINE_EMBED_CARD_TOOLBAR_WIDGET } from '../../root-block/widgets/embed-card-toolbar/embed-card-toolbar.js';
import { AFFINE_FORMAT_BAR_WIDGET } from '../../root-block/widgets/format-bar/format-bar.js';
import { AFFINE_SLASH_MENU_WIDGET } from '../../root-block/widgets/slash-menu/index.js';
export class MobileSpecsPatches extends LifeCycleWatcher {
static override key = 'mobile-patches';
constructor(std: BlockStdScope) {
super(std);
std.doc.awarenessStore.setFlag('enable_mobile_keyboard_toolbar', true);
std.doc.awarenessStore.setFlag('enable_mobile_linked_doc_menu', true);
}
static override setup(di: Container) {
super.setup(di);
// Hide reference popup on mobile.
{
const prev = di.getFactory(ReferenceNodeConfigIdentifier);
di.override(ReferenceNodeConfigIdentifier, provider => {
return {
...prev?.(provider),
hidePopup: true,
} satisfies ReferenceNodeConfig;
});
}
// Hide number lines for code block on mobile.
{
const codeConfigIdentifier = ConfigIdentifier('affine:code');
const prev = di.getFactory(codeConfigIdentifier);
di.override(codeConfigIdentifier, provider => {
return {
...prev?.(provider),
showLineNumbers: false,
} satisfies CodeBlockConfig;
});
}
// Disable root level widgets for mobile.
{
const rootWidgetViewMapIdentifier =
WidgetViewMapIdentifier('affine:page');
const prev = di.getFactory(rootWidgetViewMapIdentifier);
di.override(rootWidgetViewMapIdentifier, provider => {
const ignoreWidgets = [
AFFINE_FORMAT_BAR_WIDGET,
AFFINE_EMBED_CARD_TOOLBAR_WIDGET,
AFFINE_SLASH_MENU_WIDGET,
];
const newMap = { ...prev?.(provider) };
ignoreWidgets.forEach(widget => {
if (widget in newMap) delete newMap[widget];
});
return newMap;
});
}
// Disable block level toolbar widgets for mobile.
{
di.override(
WidgetViewMapIdentifier('affine:code'),
(): WidgetViewMapType => ({})
);
di.override(
WidgetViewMapIdentifier('affine:image'),
(): WidgetViewMapType => ({})
);
di.override(
WidgetViewMapIdentifier('affine:surface-ref'),
(): WidgetViewMapType => ({})
);
}
}
override mounted() {
// remove slash placeholder for mobile: `type / ...`
{
const paragraphService = this.std.getService('affine:paragraph');
if (!paragraphService) return;
paragraphService.placeholderGenerator = model => {
const placeholders = {
text: '',
h1: 'Heading 1',
h2: 'Heading 2',
h3: 'Heading 3',
h4: 'Heading 4',
h5: 'Heading 5',
h6: 'Heading 6',
quote: '',
};
return placeholders[model.type];
};
}
}
}