Skip to content

React Integration

WriteTrack provides a React hook for easy integration with React applications.

Terminal window
npm i writetrack

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

ResponseForm.tsx
import React, { useRef } from 'react';
import { useWriteTrack } from 'writetrack/react';
export function ResponseForm() {
const textareaRef = useRef<HTMLTextAreaElement>(null);
const { tracker, isTracking } = useWriteTrack(textareaRef);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (tracker) {
const data = tracker.getData();
console.log('Session data:', data);
}
};
return (
<form onSubmit={handleSubmit}>
<textarea ref={textareaRef} placeholder="Type your response..." />
{isTracking && <p>Tracking keystrokes...</p>}
<button type="submit">Submit</button>
</form>
);
}
function useWriteTrack(
ref: RefObject<HTMLElement | null>,
options?: UseWriteTrackOptions
): UseWriteTrackReturn;
ParameterTypeDescription
refRefObject<HTMLElement>React 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)
PropertyTypeDescription
start() => voidStart tracking (if autoStart was false)
stop() => voidStop tracking
reset() => voidReset tracker and clear state
isTrackingbooleanWhether tracker is active
trackerWriteTrack | nullUnderlying WriteTrack instance
ControlledForm.tsx
import React, { useRef } from 'react';
import { useWriteTrack } from 'writetrack/react';
export function ControlledForm() {
const inputRef = useRef<HTMLInputElement>(null);
const { start, stop, tracker, isTracking } = useWriteTrack(inputRef, {
autoStart: false,
});
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={isTracking ? stop : start}>
{isTracking ? 'Stop' : 'Start'} Tracking
</button>
<button onClick={() => tracker && console.log(tracker.getData())}>
Get Data
</button>
</div>
);
}
function MultiFieldForm() {
const nameRef = useRef<HTMLInputElement>(null);
const emailRef = useRef<HTMLInputElement>(null);
const messageRef = useRef<HTMLTextAreaElement>(null);
// Track the main content field
const { tracker } = useWriteTrack(messageRef);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (tracker) {
const data = tracker.getData();
console.log('Session:', data.quality);
}
};
return (
<form onSubmit={handleSubmit}>
<input ref={nameRef} placeholder="Name" />
<input ref={emailRef} placeholder="Email" />
<textarea ref={messageRef} placeholder="Message (tracked)" />
<button type="submit">Send</button>
</form>
);
}
import type {
UseWriteTrackReturn,
UseWriteTrackOptions,
} from 'writetrack/react';