chore(editor): add track event for latex (#12541)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
  - Enhanced telemetry tracking for LaTeX and equation creation actions, capturing detailed context such as editor mode and location within the app.
- **Chores**
  - Expanded telemetry event types to include LaTeX-specific actions for improved analytics and observability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Flrande
2025-05-26 11:10:32 +00:00
parent 9343e29fea
commit 5d28657d76
5 changed files with 105 additions and 14 deletions

View File

@@ -1,4 +1,8 @@
import type { LatexProps } from '@blocksuite/affine-model'; import type { LatexProps } from '@blocksuite/affine-model';
import {
DocModeProvider,
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import type { Command } from '@blocksuite/std'; import type { Command } from '@blocksuite/std';
import type { BlockModel } from '@blocksuite/store'; import type { BlockModel } from '@blocksuite/store';
@@ -48,6 +52,21 @@ export const insertLatexBlockCommand: Command<
if (blockComponent instanceof LatexBlockComponent) { if (blockComponent instanceof LatexBlockComponent) {
await blockComponent.updateComplete; await blockComponent.updateComplete;
blockComponent.toggleEditor(); blockComponent.toggleEditor();
const mode = std.get(DocModeProvider).getEditorMode() ?? 'page';
const ifEdgelessText = blockComponent.closest('affine-edgeless-text');
std.getOptional(TelemetryProvider)?.track('Latex', {
from:
mode === 'page'
? 'doc'
: ifEdgelessText
? 'edgeless text'
: 'edgeless note',
page: mode === 'page' ? 'doc' : 'edgeless',
segment: mode === 'page' ? 'doc' : 'whiteboard',
module: 'equation',
control: 'create equation',
});
} }
} }
return result[0]; return result[0];

View File

@@ -1,3 +1,7 @@
import {
DocModeProvider,
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import type { Command, TextSelection } from '@blocksuite/std'; import type { Command, TextSelection } from '@blocksuite/std';
export const insertInlineLatex: Command<{ export const insertInlineLatex: Command<{
@@ -37,6 +41,21 @@ export const insertInlineLatex: Command<{
length: 1, length: 1,
}); });
const mode = ctx.std.get(DocModeProvider).getEditorMode() ?? 'page';
const ifEdgelessText = blockComponent.closest('affine-edgeless-text');
ctx.std.getOptional(TelemetryProvider)?.track('Latex', {
from:
mode === 'page'
? 'doc'
: ifEdgelessText
? 'edgeless text'
: 'edgeless note',
page: mode === 'page' ? 'doc' : 'edgeless',
segment: mode === 'page' ? 'doc' : 'whiteboard',
module: 'inline equation',
control: 'create inline equation',
});
inlineEditor inlineEditor
.waitForUpdate() .waitForUpdate()
.then(async () => { .then(async () => {

View File

@@ -1,3 +1,7 @@
import {
DocModeProvider,
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
import type { BlockComponent } from '@blocksuite/std'; import type { BlockComponent } from '@blocksuite/std';
import { InlineMarkdownExtension } from '@blocksuite/std/inline'; import { InlineMarkdownExtension } from '@blocksuite/std/inline';
@@ -14,6 +18,20 @@ export const LatexExtension = InlineMarkdownExtension<AffineTextAttributes>({
const inlinePrefix = match.groups['inlinePrefix']; const inlinePrefix = match.groups['inlinePrefix'];
const blockPrefix = match.groups['blockPrefix']; const blockPrefix = match.groups['blockPrefix'];
if (!inlineEditor.rootElement) return;
const blockComponent =
inlineEditor.rootElement.closest<BlockComponent>('[data-block-id]');
if (!blockComponent) return;
const doc = blockComponent.store;
const std = blockComponent.std;
const parentComponent = blockComponent.parentComponent;
if (!parentComponent) return;
const index = parentComponent.model.children.indexOf(blockComponent.model);
if (index === -1) return;
const mode = std.get(DocModeProvider).getEditorMode() ?? 'page';
const ifEdgelessText = blockComponent.closest('affine-edgeless-text');
if (blockPrefix === '$$$$') { if (blockPrefix === '$$$$') {
inlineEditor.insertText( inlineEditor.insertText(
{ {
@@ -29,20 +47,6 @@ export const LatexExtension = InlineMarkdownExtension<AffineTextAttributes>({
undoManager.stopCapturing(); undoManager.stopCapturing();
if (!inlineEditor.rootElement) return;
const blockComponent =
inlineEditor.rootElement.closest<BlockComponent>('[data-block-id]');
if (!blockComponent) return;
const doc = blockComponent.store;
const parentComponent = blockComponent.parentComponent;
if (!parentComponent) return;
const index = parentComponent.model.children.indexOf(
blockComponent.model
);
if (index === -1) return;
inlineEditor.deleteText({ inlineEditor.deleteText({
index: inlineRange.index - 4, index: inlineRange.index - 4,
length: 5, length: 5,
@@ -67,6 +71,19 @@ export const LatexExtension = InlineMarkdownExtension<AffineTextAttributes>({
}) })
.catch(console.error); .catch(console.error);
std.getOptional(TelemetryProvider)?.track('Latex', {
from:
mode === 'page'
? 'doc'
: ifEdgelessText
? 'edgeless text'
: 'edgeless note',
page: mode === 'page' ? 'doc' : 'edgeless',
segment: mode === 'page' ? 'doc' : 'whiteboard',
module: 'equation',
control: 'create equation',
});
return; return;
} }
@@ -124,6 +141,19 @@ export const LatexExtension = InlineMarkdownExtension<AffineTextAttributes>({
}) })
.catch(console.error); .catch(console.error);
std.getOptional(TelemetryProvider)?.track('Latex', {
from:
mode === 'page'
? 'doc'
: ifEdgelessText
? 'edgeless text'
: 'edgeless note',
page: mode === 'page' ? 'doc' : 'edgeless',
segment: mode === 'page' ? 'doc' : 'whiteboard',
module: 'inline equation',
control: 'create inline equation',
});
return; return;
} }
@@ -169,5 +199,18 @@ export const LatexExtension = InlineMarkdownExtension<AffineTextAttributes>({
index: startIndex + 1, index: startIndex + 1,
length: 0, length: 0,
}); });
std.getOptional(TelemetryProvider)?.track('Latex', {
from:
mode === 'page'
? 'doc'
: ifEdgelessText
? 'edgeless text'
: 'edgeless note',
page: mode === 'page' ? 'doc' : 'edgeless',
segment: mode === 'page' ? 'doc' : 'whiteboard',
module: 'inline equation',
control: 'create inline equation',
});
}, },
}); });

View File

@@ -16,6 +16,7 @@ import type {
ElementCreationEvent, ElementCreationEvent,
ElementLockEvent, ElementLockEvent,
ElementUpdatedEvent, ElementUpdatedEvent,
LatexEvent,
LinkedDocCreatedEvent, LinkedDocCreatedEvent,
LinkEvent, LinkEvent,
MindMapCollapseEvent, MindMapCollapseEvent,
@@ -42,6 +43,7 @@ export type TelemetryEventMap = OutDatabaseAllEvents &
BlockCreated: BlockCreationEvent; BlockCreated: BlockCreationEvent;
EdgelessToolPicked: EdgelessToolPickedEvent; EdgelessToolPicked: EdgelessToolPickedEvent;
CreateEmbedBlock: LinkEvent; CreateEmbedBlock: LinkEvent;
Latex: LatexEvent;
}; };
export interface TelemetryService { export interface TelemetryService {

View File

@@ -117,3 +117,11 @@ export interface ElementUpdatedEvent extends TelemetryEvent {
export interface LinkEvent extends TelemetryEvent { export interface LinkEvent extends TelemetryEvent {
result?: 'success' | 'failure'; result?: 'success' | 'failure';
} }
export interface LatexEvent extends TelemetryEvent {
from: 'doc' | 'edgeless text' | 'edgeless note';
page: 'doc' | 'edgeless';
segment: 'doc' | 'whiteboard';
module: 'equation' | 'inline equation';
control: 'create equation' | 'create inline equation';
}