Skip to content

Commit 9ab291e

Browse files
authored
feat: add more event logs (#650)
1 parent c0bf2ca commit 9ab291e

File tree

9 files changed

+127
-14
lines changed

9 files changed

+127
-14
lines changed

src/extensions/behavior/Clipboard/clipboard.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ export const clipboard = ({
6060
paste(view, e) {
6161
if (!e.clipboardData) return false;
6262

63+
const pasteLogger = logger.nested({
64+
domEvent: 'paste',
65+
dataTypes: e.clipboardData.types,
66+
});
67+
6368
let data: string;
6469
let isPasteHandled = false;
6570

@@ -84,6 +89,9 @@ export const clipboard = ({
8489
{clipboardDataFormat: DataTransferType.UriList},
8590
),
8691
);
92+
pasteLogger.event({
93+
event: 'paste-uri-list',
94+
});
8795
isPasteHandled = true;
8896
e.preventDefault();
8997
return true;
@@ -106,12 +114,14 @@ export const clipboard = ({
106114
{clipboardDataFormat: DataTransferType.Html},
107115
),
108116
);
117+
pasteLogger.event({
118+
event: 'paste-parsed-html',
119+
});
109120
isPasteHandled = true;
110121
} else {
111122
globalLogger.error(res.error);
112-
logger.error(res.error, {
113-
module: 'clipboard',
114-
event: 'paste',
123+
pasteLogger.error(res.error, {
124+
event: 'parse-html',
115125
});
116126
console.error(res.error);
117127
}
@@ -137,6 +147,10 @@ export const clipboard = ({
137147
const schema: Schema = view.state.schema;
138148
const insideCodeData = e.clipboardData.getData(DataTransferType.Text);
139149

150+
pasteLogger.event({
151+
event: 'paste-text-to-code',
152+
codeType,
153+
});
140154
view.dispatch(
141155
trackTransactionMetrics(
142156
view.state.tr.replaceSelectionWith(
@@ -156,6 +170,10 @@ export const clipboard = ({
156170
if (res.success) {
157171
const docNode = res.result;
158172
const slice = getSliceFromMarkupFragment(docNode.content);
173+
pasteLogger.event({
174+
event: 'paste-parsed-content',
175+
dataFormat,
176+
});
159177
view.dispatch(
160178
trackTransactionMetrics(
161179
view.state.tr.replaceSelection(slice),
@@ -166,16 +184,19 @@ export const clipboard = ({
166184
isPasteHandled = true;
167185
} else {
168186
globalLogger.error(res.error);
169-
logger.error(res.error, {
170-
module: 'clipboard',
187+
pasteLogger.error(res.error, {
171188
event: 'paste',
189+
dataFormat,
172190
});
173191
console.error(res.error);
174192
}
175193
}
176194
}
177195

178196
if (e.clipboardData.files.length && pasteFileHandler) {
197+
pasteLogger.event({
198+
event: 'paste-files',
199+
});
179200
for (const file of Array.from(e.clipboardData.files)) {
180201
pasteFileHandler(file);
181202
}

src/extensions/behavior/Clipboard/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ export const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {
1111
builder.addPlugin(
1212
(deps) =>
1313
clipboard({
14-
logger: builder.logger,
14+
logger: builder.logger.nested({
15+
module: 'clipboard',
16+
plugin: 'clipboard',
17+
}),
1518
mdParser: deps.markupParser,
1619
textParser: deps.textParser,
1720
serializer: deps.serializer,

src/extensions/behavior/EditorModeKeymap/index.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,22 @@ export const EditorModeKeymap: ExtensionAuto<EditorModeKeymapOptions> = (builder
1717
builder.addKeymap(() => {
1818
const bindings: Keymap = {};
1919
const {onCancel, onSubmit} = opts;
20+
const logger = builder.logger.nested({
21+
source: 'keymap',
22+
});
2023

21-
if (onCancel) bindings[f.toPM(A.Cancel)!] = () => onCancel();
22-
if (onSubmit) bindings[f.toPM(A.Submit)!] = () => onSubmit();
24+
if (onCancel)
25+
bindings[f.toPM(A.Cancel)!] = () => {
26+
const result = onCancel();
27+
logger.event({event: 'cancel', result});
28+
return result;
29+
};
30+
if (onSubmit)
31+
bindings[f.toPM(A.Submit)!] = () => {
32+
const result = onSubmit();
33+
logger.event({event: 'submit', result});
34+
return result;
35+
};
2336

2437
bindings[f.toPM(A.__debug)!] = () => {
2538
debug();

src/extensions/behavior/FilePaste/index.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';
22
import {Plugin} from 'prosemirror-state';
33
import {dropPoint} from 'prosemirror-transform';
44

5-
import type {ExtensionAuto} from '../../../core';
5+
import {type ExtensionAuto, getLoggerFromState} from '../../../core';
66
import {pType} from '../../../extensions/base';
77
import {isFilesOnly} from '../Clipboard/utils';
88

@@ -15,6 +15,12 @@ export const FilePaste: ExtensionAuto = (builder) => {
1515
const files = getFiles(event.clipboardData);
1616
if (!files) return false;
1717

18+
getLoggerFromState(view.state).event({
19+
event: 'paste-files',
20+
plugin: 'file-paste',
21+
prop: 'handlePaste',
22+
});
23+
1824
view.dispatch(
1925
view.state.tr
2026
.replaceSelection(createFilesSlice(view.state.schema, files))
@@ -36,6 +42,14 @@ export const FilePaste: ExtensionAuto = (builder) => {
3642
if (dropPos === -1) return false;
3743

3844
const posToInsert = dropPoint(view.state.doc, dropPos, slice);
45+
46+
getLoggerFromState(view.state).event({
47+
event: 'drop-files',
48+
plugin: 'file-paste',
49+
prop: 'handleDrop',
50+
dispatch: posToInsert !== null,
51+
});
52+
3953
if (posToInsert === null) return false;
4054

4155
view.dispatch(view.state.tr.insert(posToInsert, slice.content));

src/extensions/markdown/Link/paste-plugin.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {Plugin, TextSelection, type Transaction} from 'prosemirror-state';
22

3-
import type {ExtensionDeps, Parser} from '../../../core';
3+
import {type ExtensionDeps, type Parser, getLoggerFromState} from '../../../core';
44
import {isNodeSelection, isTextSelection} from '../../../utils/selection';
55
import {DataTransferType, isIosSafariShare} from '../../behavior/Clipboard/utils';
66
import {imageType} from '../Image';
@@ -12,6 +12,11 @@ export function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {
1212
props: {
1313
handleDOMEvents: {
1414
paste(view, e): boolean {
15+
const logger = getLoggerFromState(view.state).nested({
16+
plugin: 'link-paste-enhance',
17+
domEvent: 'paste',
18+
});
19+
1520
const {state, dispatch} = view;
1621
const sel = state.selection;
1722
let tr: Transaction | null = null;
@@ -34,6 +39,9 @@ export function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {
3439
]),
3540
false,
3641
);
42+
logger.event({
43+
event: 'paste-url',
44+
});
3745
}
3846
} else if ($from.sameParent($to)) {
3947
const url = getUrl(e.clipboardData, parser);
@@ -46,6 +54,9 @@ export function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {
4654
}),
4755
);
4856
tr.setSelection(TextSelection.create(tr.doc, $to.pos));
57+
logger.event({
58+
event: 'paste-url-on-text',
59+
});
4960
}
5061
}
5162
}

src/extensions/yfm/ImgSize/ImagePaste/index.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {Plugin} from 'prosemirror-state';
44
import {dropPoint} from 'prosemirror-transform';
55

66
import type {ParseInsertedUrlAsImage} from '../../../../bundle';
7-
import type {ExtensionAuto} from '../../../../core';
7+
import {type ExtensionAuto, getLoggerFromState} from '../../../../core';
88
import {isFunction} from '../../../../lodash';
99
import type {FileUploadHandler} from '../../../../utils';
1010
import {clipboardUtils} from '../../../behavior/Clipboard';
@@ -43,9 +43,15 @@ export const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {
4343
props: {
4444
handleDOMEvents: {
4545
paste(view, e) {
46+
const logger = getLoggerFromState(view.state).nested({
47+
plugin: 'image-paste',
48+
domEvent: 'paste',
49+
});
50+
4651
const files = getPastedImages(e.clipboardData);
4752
if (imageUploadHandler && files) {
4853
e.preventDefault();
54+
logger.event({event: 'paste-images'});
4955
new ImagesUploadProcess(
5056
view,
5157
files,
@@ -73,6 +79,7 @@ export const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {
7379

7480
const tr = view.state.tr.replaceSelectionWith(imageNode);
7581
view.dispatch(tr.scrollIntoView());
82+
logger.event({event: 'paste-url-as-image'});
7683

7784
return true;
7885
}
@@ -100,6 +107,14 @@ export const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {
100107
createFakeImageSlice(view.state.schema),
101108
);
102109

110+
const logger = getLoggerFromState(view.state);
111+
logger.event({
112+
event: 'drop-image',
113+
plugin: 'image-paste',
114+
domEvent: 'drop',
115+
runProcess: posToInsert !== null,
116+
});
117+
103118
if (posToInsert !== null) {
104119
new ImagesUploadProcess(
105120
view,

src/extensions/yfm/YfmFile/YfmFilePaste/index.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {Plugin} from 'prosemirror-state';
33
import {dropPoint} from 'prosemirror-transform';
44
import type {EditorView} from 'prosemirror-view';
55

6-
import type {ExtensionAuto} from '../../../../core';
6+
import {type ExtensionAuto, getLoggerFromState} from '../../../../core';
77
import {isFunction} from '../../../../lodash';
88
import type {FileUploadHandler, UploadSuccessItem} from '../../../../utils';
99
import {clipboardUtils} from '../../../behavior/Clipboard';
@@ -30,9 +30,15 @@ export const YfmFilePaste: ExtensionAuto<YfmFilePasteOptions> = (builder, opts)
3030
props: {
3131
handleDOMEvents: {
3232
paste(view, e) {
33+
const logger = getLoggerFromState(view.state);
3334
const files = getPastedFiles(e.clipboardData);
3435
if (files) {
3536
e.preventDefault();
37+
logger.event({
38+
event: 'paste-files',
39+
plugin: 'yfm-file-paste',
40+
domEvent: 'paste',
41+
});
3642
new YfmFilesPasteUploadProcess(view, files, {
3743
uploadHandler: opts.fileUploadHandler,
3844
needToSetDimensionsForUploadedImages:
@@ -59,6 +65,14 @@ export const YfmFilePaste: ExtensionAuto<YfmFilePasteOptions> = (builder, opts)
5965
createFakeFileSlice(view.state.schema),
6066
);
6167

68+
const logger = getLoggerFromState(view.state);
69+
logger.event({
70+
event: 'drop-files',
71+
plugin: 'yfm-file-paste',
72+
domEvent: 'drop',
73+
runProcess: posToInsert !== null,
74+
});
75+
6276
if (posToInsert !== null) {
6377
new YfmFilesPasteUploadProcess(view, files, {
6478
pos: posToInsert,

src/markup/codemirror/create.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ export function createCodemirror(params: CreateCodemirrorParams) {
176176
paste(event, editor) {
177177
if (!event.clipboardData) return;
178178

179+
const pasteLogger = logger.nested({
180+
domEvent: 'paste',
181+
dataTypes: event.clipboardData.types,
182+
});
183+
179184
const {from} = editor.state.selection.main;
180185
const line = editor.state.doc.lineAt(from);
181186
const currentLine = line.text;
@@ -185,6 +190,7 @@ export function createCodemirror(params: CreateCodemirrorParams) {
185190
const yfmContent = event.clipboardData.getData(DataTransferType.Yfm);
186191
if (yfmContent) {
187192
event.preventDefault();
193+
logger.event({event: 'paste-markup'});
188194
const reindentedYfmContent = smartReindent(yfmContent, currentLine);
189195
editor.dispatch(editor.state.replaceSelection(reindentedYfmContent));
190196
return;
@@ -209,12 +215,13 @@ export function createCodemirror(params: CreateCodemirrorParams) {
209215
// especially with invalid HTML or weird DOM parsing errors.
210216
// If something goes wrong, I just want to fall back to the "default pasting"
211217
// rather than break the entire experience for the user.
212-
logger.error(e);
218+
pasteLogger.error(e, {event: 'parse-html-to-md'});
213219
globalLogger.error(e);
214220
}
215221

216222
if (parsedMarkdownMarkup !== undefined) {
217223
event.preventDefault();
224+
logger.event({event: 'paste-parsed-html'});
218225
const reindentedHtmlContent = smartReindent(
219226
parsedMarkdownMarkup,
220227
currentLine,
@@ -232,7 +239,7 @@ export function createCodemirror(params: CreateCodemirrorParams) {
232239

233240
if (imageUrl) {
234241
event.preventDefault();
235-
242+
logger.event({event: 'paste-url-as-image'});
236243
insertImages([
237244
{
238245
url: imageUrl,

src/markup/codemirror/files-upload-plugin/plugin.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import type {RendererItem} from '../../../extensions';
1313
import {type FileUploadHandler, type FileUploadResult, getProportionalSize} from '../../../utils';
1414
import {FileUploadHandlerFacet} from '../files-upload-facet';
15+
import {LoggerFacet} from '../logger-facet';
1516
import {ReactRendererFacet} from '../react-facet';
1617

1718
import {IMG_MAX_HEIGHT, SUCCESS_UPLOAD_REMOVE_TIMEOUT} from './const';
@@ -256,6 +257,13 @@ export const FilesUploadPlugin = ViewPlugin.fromClass(
256257

257258
const {from, to} = view.state.selection.main;
258259

260+
view.state.facet(LoggerFacet).event({
261+
domEvent: 'paste',
262+
event: 'paste-files',
263+
plugin: 'files-upload',
264+
dataTypes: event.clipboardData.types,
265+
});
266+
259267
view.dispatch({
260268
selection: {anchor: from},
261269
effects: AddUploadWidgetEffect.of({files, pos: from}),
@@ -270,6 +278,13 @@ export const FilesUploadPlugin = ViewPlugin.fromClass(
270278
const files = getTransferFiles(event.dataTransfer);
271279
if (!files) return false;
272280

281+
view.state.facet(LoggerFacet).event({
282+
domEvent: 'drop',
283+
event: 'drop-files',
284+
plugin: 'files-upload',
285+
dataTypes: event.dataTransfer.types,
286+
});
287+
273288
const pos = this.view.posAtCoords(event, false);
274289
view.dispatch({
275290
selection: {anchor: pos},

0 commit comments

Comments
 (0)