Skip to content

Vue Integration

WriteTrack provides a Vue 3 composable for easy integration with Vue applications.

Terminal window
npm i writetrack

Vue is an optional peer dependency - non-Vue users won’t have it in their bundle.

ResponseForm.vue
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const textareaRef = ref<HTMLTextAreaElement | null>(null);
const { tracker, isTracking } = useWriteTrack(textareaRef);
function handleSubmit() {
if (tracker.value) {
const data = tracker.value.getData();
console.log('Session data:', data);
}
}
</script>
<template>
<form @submit.prevent="handleSubmit">
<textarea ref="textareaRef" placeholder="Type your response..." />
<p v-if="isTracking">Tracking keystrokes...</p>
<button type="submit">Submit</button>
</form>
</template>
function useWriteTrack(
elementRef: Ref<HTMLElement | null>,
options?: UseWriteTrackOptions
): UseWriteTrackReturn;
ParameterTypeDescription
elementRefRef<HTMLElement>Vue ref attached to the input element
options.licensestringWriteTrack license key
options.userIdstringUser identifier included in metadata
options.contentIdstringContent identifier included in metadata
options.metadataRecord<string, unknown>Additional metadata
options.autoStartbooleanAuto-start tracking when element mounts (default: true)
options.wasmUrlstringURL to WASM binary for analysis
options.persistbooleanEnable IndexedDB session persistence (requires contentId)
options.analysisbooleanSubscribe to real-time analysis events (requires WASM)
options.onTick(data: { activeTime: number; totalTime: number; tracker: WriteTrack }) => voidCallback fired every ~1s with active session time and tracker instance
options.onReady(tracker: WriteTrack) => voidCallback fired when tracker is ready
PropertyTypeDescription
start() => voidStart tracking (if autoStart was false)
stop() => voidStop tracking
reset() => voidReset tracker and clear state
isTrackingRef<boolean>Whether tracker is active
trackerShallowRef<WriteTrack | null>Underlying WriteTrack instance
isReadyRef<boolean>Whether tracker has initialised
analysisShallowRef<SessionAnalysis | null>Latest analysis result (when analysis: true)
errorShallowRef<Error | null>Latest error from WASM or initialisation
ControlledForm.vue
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const inputRef = ref<HTMLInputElement | null>(null);
const { start, stop, tracker, isTracking } = useWriteTrack(inputRef, {
autoStart: false,
});
function toggleTracking() {
if (isTracking.value) {
stop();
} else {
start();
}
}
</script>
<template>
<div>
<input ref="inputRef" type="text" />
<button @click="toggleTracking">
{{ isTracking ? 'Stop' : 'Start' }} Tracking
</button>
<button @click="() => tracker && console.log(tracker.getData())">
Get Data
</button>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const nameRef = ref<HTMLInputElement | null>(null);
const emailRef = ref<HTMLInputElement | null>(null);
const messageRef = ref<HTMLTextAreaElement | null>(null);
// Track the main content field
const { tracker } = useWriteTrack(messageRef);
function handleSubmit() {
if (tracker.value) {
const data = tracker.value.getData();
console.log('Session:', data.quality);
}
}
</script>
<template>
<form @submit.prevent="handleSubmit">
<input ref="nameRef" placeholder="Name" />
<input ref="emailRef" placeholder="Email" />
<textarea ref="messageRef" placeholder="Message (tracked)" />
<button type="submit">Send</button>
</form>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const textareaRef = ref<HTMLTextAreaElement | null>(null);
const { analysis, isReady, error } = useWriteTrack(textareaRef, {
analysis: true,
onTick: ({ activeTime }) => {
console.log(`Active: ${Math.floor(activeTime / 1000)}s`);
},
onReady: (tracker) => {
console.log('Tracker ready:', tracker);
},
});
</script>
<template>
<div>
<textarea ref="textareaRef" />
<p v-if="!isReady">Initialising...</p>
<p v-if="error">Error: {{ error.message }}</p>
<p v-if="analysis">Origin: {{ analysis.contentOrigin.indicator.code }}</p>
</div>
</template>
import type { UseWriteTrackReturn, UseWriteTrackOptions } from 'writetrack/vue';