feat(editor): add feature flag service (#9592)
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import type { DatabaseBlockModel } from '@blocksuite/affine-model';
|
||||
import { FeatureFlagService } from '@blocksuite/affine-shared/services';
|
||||
import {
|
||||
insertPositionToIndex,
|
||||
type InsertToPosition,
|
||||
@@ -57,10 +58,12 @@ export class DatabaseBlockDataSource extends DataSourceBase {
|
||||
private readonly _model: DatabaseBlockModel;
|
||||
|
||||
override featureFlags$: ReadonlySignal<DatabaseFlags> = computed(() => {
|
||||
const featureFlagService = this.doc.get(FeatureFlagService);
|
||||
const flag = featureFlagService.getFlag(
|
||||
'enable_database_number_formatting'
|
||||
);
|
||||
return {
|
||||
enable_number_formatting:
|
||||
this.doc.awarenessStore.getFlag('enable_database_number_formatting') ??
|
||||
false,
|
||||
enable_number_formatting: flag ?? false,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
EMBED_CARD_HEIGHT,
|
||||
EMBED_CARD_WIDTH,
|
||||
} from '@blocksuite/affine-shared/consts';
|
||||
import { FeatureFlagService } from '@blocksuite/affine-shared/services';
|
||||
import { cloneReferenceInfoWithoutAliases } from '@blocksuite/affine-shared/utils';
|
||||
import { Bound } from '@blocksuite/global/utils';
|
||||
|
||||
@@ -15,10 +16,10 @@ export class EmbedEdgelessLinkedDocBlockComponent extends toEdgelessEmbedBlock(
|
||||
override convertToEmbed = () => {
|
||||
const { id, doc, caption, xywh } = this.model;
|
||||
|
||||
// synced doc entry controlled by awareness flag
|
||||
const isSyncedDocEnabled = doc.awarenessStore.getFlag(
|
||||
'enable_synced_doc_block'
|
||||
);
|
||||
// synced doc entry controlled by flag
|
||||
const isSyncedDocEnabled = doc
|
||||
.get(FeatureFlagService)
|
||||
.getFlag('enable_synced_doc_block');
|
||||
if (!isSyncedDocEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
import {
|
||||
DocDisplayMetaProvider,
|
||||
DocModeProvider,
|
||||
FeatureFlagService,
|
||||
ThemeProvider,
|
||||
} from '@blocksuite/affine-shared/services';
|
||||
import {
|
||||
@@ -129,10 +130,10 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
|
||||
|
||||
const { doc, caption } = this.model;
|
||||
|
||||
// synced doc entry controlled by awareness flag
|
||||
const isSyncedDocEnabled = doc.awarenessStore.getFlag(
|
||||
'enable_synced_doc_block'
|
||||
);
|
||||
// synced doc entry controlled by flag
|
||||
const isSyncedDocEnabled = doc
|
||||
.get(FeatureFlagService)
|
||||
.getFlag('enable_synced_doc_block');
|
||||
if (!isSyncedDocEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import type {
|
||||
TextAlign,
|
||||
TextVerticalAlign,
|
||||
} from '@blocksuite/affine-model';
|
||||
import { FeatureFlagService } from '@blocksuite/affine-shared/services';
|
||||
import type { Bound, SerializedXYWH } from '@blocksuite/global/utils';
|
||||
import { deltaInsertsToChunks } from '@blocksuite/inline';
|
||||
|
||||
@@ -68,9 +69,9 @@ export function drawGeneralShape(
|
||||
const { blur, offsetX, offsetY, color } = shapeModel.shadow;
|
||||
const scale = ctx.getTransform().a;
|
||||
|
||||
const enableShadowBlur = shapeModel.surface.doc.awarenessStore.getFlag(
|
||||
'enable_shape_shadow_blur'
|
||||
);
|
||||
const enableShadowBlur = shapeModel.surface.doc
|
||||
.get(FeatureFlagService)
|
||||
.getFlag('enable_shape_shadow_blur');
|
||||
|
||||
// hard shadow, or soft shadow if `enable_shape_shadow_blur` is true
|
||||
// see comment of `shape.shadow` in `ShapeElementModel`
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { ReferenceInfo } from '@blocksuite/affine-model';
|
||||
import {
|
||||
FeatureFlagService,
|
||||
GenerateDocUrlProvider,
|
||||
type LinkEventType,
|
||||
type TelemetryEvent,
|
||||
@@ -305,10 +306,10 @@ export class ReferencePopup extends WithDisposable(LitElement) {
|
||||
}
|
||||
|
||||
private _viewSelector() {
|
||||
// synced doc entry controlled by awareness flag
|
||||
const isSyncedDocEnabled = this.doc.awarenessStore.getFlag(
|
||||
'enable_synced_doc_block'
|
||||
);
|
||||
// synced doc entry controlled by flag
|
||||
const isSyncedDocEnabled = this.doc
|
||||
.get(FeatureFlagService)
|
||||
.getFlag('enable_synced_doc_block');
|
||||
const buttons = [];
|
||||
|
||||
buttons.push({
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
import { type Store, StoreExtension } from '@blocksuite/store';
|
||||
import { type Signal, signal } from '@preact/signals-core';
|
||||
|
||||
export interface BlockSuiteFlags {
|
||||
enable_synced_doc_block: boolean;
|
||||
enable_pie_menu: boolean;
|
||||
enable_database_number_formatting: boolean;
|
||||
enable_database_attachment_note: boolean;
|
||||
enable_database_full_width: boolean;
|
||||
enable_block_query: boolean;
|
||||
enable_lasso_tool: boolean;
|
||||
enable_edgeless_text: boolean;
|
||||
enable_ai_onboarding: boolean;
|
||||
enable_ai_chat_block: boolean;
|
||||
enable_color_picker: boolean;
|
||||
enable_mind_map_import: boolean;
|
||||
enable_advanced_block_visibility: boolean;
|
||||
enable_shape_shadow_blur: boolean;
|
||||
enable_mobile_keyboard_toolbar: boolean;
|
||||
enable_mobile_linked_doc_menu: boolean;
|
||||
}
|
||||
|
||||
export class FeatureFlagService extends StoreExtension {
|
||||
static override key = 'feature-flag-server';
|
||||
|
||||
private readonly _flags: Signal<BlockSuiteFlags> = signal({
|
||||
enable_synced_doc_block: true,
|
||||
enable_pie_menu: false,
|
||||
enable_database_number_formatting: false,
|
||||
enable_database_attachment_note: false,
|
||||
enable_database_full_width: false,
|
||||
enable_block_query: false,
|
||||
enable_lasso_tool: false,
|
||||
enable_edgeless_text: true,
|
||||
enable_ai_onboarding: true,
|
||||
enable_ai_chat_block: true,
|
||||
enable_color_picker: true,
|
||||
enable_mind_map_import: true,
|
||||
enable_advanced_block_visibility: false,
|
||||
enable_shape_shadow_blur: false,
|
||||
enable_mobile_keyboard_toolbar: false,
|
||||
enable_mobile_linked_doc_menu: false,
|
||||
});
|
||||
|
||||
setFlag(key: keyof BlockSuiteFlags, value: boolean) {
|
||||
this._flags.value = {
|
||||
...this._flags.value,
|
||||
[key]: value,
|
||||
};
|
||||
}
|
||||
|
||||
getFlag(key: keyof BlockSuiteFlags) {
|
||||
return this._flags.value[key];
|
||||
}
|
||||
|
||||
constructor(store: Store) {
|
||||
super(store);
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ export * from './drag-handle-config';
|
||||
export * from './edit-props-store';
|
||||
export * from './editor-setting-service';
|
||||
export * from './embed-option-service';
|
||||
export * from './feature-flag-service';
|
||||
export * from './font-loader';
|
||||
export * from './generate-url-service';
|
||||
export * from './native-clipboard-service';
|
||||
|
||||
Reference in New Issue
Block a user