import { createSimpleSchema, object, serializable } from 'serializr'; import { Deserializable } from '../client/util/SerializationHelper'; import { Copy, FieldChanged, ToJavascriptString, ToScriptString, ToString } from './FieldSymbols'; import { ObjectField } from './ObjectField'; export type CursorPosition = { x: number; y: number; }; export type CursorMetadata = { id: string; identifier: string; timestamp: number; }; export type CursorData = { metadata: CursorMetadata; position: CursorPosition; }; const PositionSchema = createSimpleSchema({ x: true, y: true, }); const MetadataSchema = createSimpleSchema({ id: true, identifier: true, timestamp: true, }); const CursorSchema = createSimpleSchema({ metadata: object(MetadataSchema), position: object(PositionSchema), }); @Deserializable('cursor') export default class CursorField extends ObjectField { @serializable(object(CursorSchema)) readonly data: CursorData; constructor(data: CursorData) { super(); this.data = data; } setPosition(position: CursorPosition) { this.data.position = position; this.data.metadata.timestamp = Date.now(); this[FieldChanged]?.(); } [Copy]() { return new CursorField(this.data); } [ToJavascriptString]() { return 'invalid'; } [ToScriptString]() { return 'invalid'; } [ToString]() { return 'invalid'; } }