TipTap Integration
WriteTrack includes a first-party TipTap extension, compatible with @tiptap/core v2.0+ and tested against v3.19. See React and Vue examples below.
Installation
Section titled “Installation”Install WriteTrack alongside your TipTap packages:
npm i writetrack @tiptap/core @tiptap/starter-kitpnpm add writetrack @tiptap/core @tiptap/starter-kityarn add writetrack @tiptap/core @tiptap/starter-kitbun add writetrack @tiptap/core @tiptap/starter-kitBasic Usage
Section titled “Basic Usage”import { Editor } from '@tiptap/core';import StarterKit from '@tiptap/starter-kit';import { WriteTrackExtension } from 'writetrack/tiptap';
const editor = new Editor({ element: document.querySelector('#editor'), extensions: [ StarterKit, WriteTrackExtension.configure({ license: 'your-license-key', }), ],});
// Access WriteTrack data when neededconst data = editor.storage.writetrack.tracker.getData();Configuration
Section titled “Configuration”Pass options via .configure():
WriteTrackExtension.configure({ license: 'your-license-key', userId: 'user-123', contentId: 'document-456', metadata: { formName: 'signup' }, autoStart: true, // default});| Option | Type | Default | Description |
|---|---|---|---|
license | string | undefined | WriteTrack license key |
userId | string | undefined | User identifier included in metadata |
contentId | string | undefined | Content identifier included in metadata |
metadata | Record<string, unknown> | undefined | Additional metadata |
autoStart | boolean | true | Start tracking when editor is created |
wasmUrl | string | undefined | URL to WASM binary for analysis |
persist | boolean | false | Enable IndexedDB session persistence (requires contentId) |
Accessing Data
Section titled “Accessing Data”The extension stores the WriteTrack instance in TipTap’s storage system:
// Get the tracker instanceconst tracker = editor.storage.writetrack.tracker;
// Get typing dataconst data = tracker.getData();
// Check tracking statusconst isTracking = editor.storage.writetrack.isTracking;import { useEditor, EditorContent } from '@tiptap/react';import StarterKit from '@tiptap/starter-kit';import { WriteTrackExtension } from 'writetrack/tiptap';
const writetrack = WriteTrackExtension.configure({ license: 'your-license-key',});
function FormEditor() { const editor = useEditor({ extensions: [StarterKit, writetrack], });
const handleSubmit = () => { const data = editor?.storage.writetrack.tracker?.getData(); console.log('Typing data:', data); };
return ( <div> <EditorContent editor={editor} /> <button onClick={handleSubmit}>Submit</button> </div> );}<script setup>import { useEditor, EditorContent } from '@tiptap/vue-3';import StarterKit from '@tiptap/starter-kit';import { WriteTrackExtension } from 'writetrack/tiptap';
const writetrack = WriteTrackExtension.configure({ license: 'your-license-key',});
const editor = useEditor({ extensions: [StarterKit, writetrack],});
function handleSubmit() { const data = editor.value?.storage.writetrack.tracker?.getData(); console.log('Typing data:', data);}</script>
<template> <div> <EditorContent :editor="editor" /> <button @click="handleSubmit">Submit</button> </div></template>Manual DOM Attachment
Section titled “Manual DOM Attachment”If you prefer not to use the extension, you can attach WriteTrack directly to TipTap’s editable element:
import WriteTrack from 'writetrack';import { Editor } from '@tiptap/core';import StarterKit from '@tiptap/starter-kit';
const editor = new Editor({ element: document.querySelector('#editor'), extensions: [StarterKit], onCreate({ editor }) { const tracker = new WriteTrack({ target: editor.view.dom, license: 'your-license-key', }); tracker.start(); },});TypeScript
Section titled “TypeScript”import type { WriteTrackExtensionOptions, WriteTrackExtensionStorage,} from 'writetrack/tiptap';