aboutsummaryrefslogtreecommitdiff
path: root/src/client/util/TrackMovements.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/util/TrackMovements.ts')
-rw-r--r--src/client/util/TrackMovements.ts141
1 files changed, 77 insertions, 64 deletions
diff --git a/src/client/util/TrackMovements.ts b/src/client/util/TrackMovements.ts
index d512e4802..4a2ccd706 100644
--- a/src/client/util/TrackMovements.ts
+++ b/src/client/util/TrackMovements.ts
@@ -1,27 +1,26 @@
-import { IReactionDisposer, observable, observe, reaction } from "mobx";
-import { NumCast } from "../../fields/Types";
-import { Doc, DocListCast } from "../../fields/Doc";
-import { CollectionDockingView } from "../views/collections/CollectionDockingView";
-import { Id } from "../../fields/FieldSymbols";
+import { IReactionDisposer, observable, observe, reaction } from 'mobx';
+import { NumCast } from '../../fields/Types';
+import { Doc, DocListCast } from '../../fields/Doc';
+import { CollectionDockingView } from '../views/collections/CollectionDockingView';
+import { Id } from '../../fields/FieldSymbols';
export type Movement = {
- time: number,
- panX: number,
- panY: number,
- scale: number,
- docId: string,
-}
+ time: number;
+ panX: number;
+ panY: number;
+ scale: number;
+ docId: string;
+};
export type Presentation = {
- movements: Movement[] | null,
- totalTime: number,
- meta: Object | Object[],
-}
+ movements: Movement[] | null;
+ totalTime: number;
+ meta: Object | Object[];
+};
export class TrackMovements {
-
private static get NULL_PRESENTATION(): Presentation {
- return { movements: null, meta: {}, totalTime: -1, }
+ return { movements: null, meta: {}, totalTime: -1 };
}
// instance variables
@@ -32,16 +31,17 @@ export class TrackMovements {
private recordingFFViews: Map<string, IReactionDisposer> | null;
private tabChangeDisposeFunc: IReactionDisposer | null;
-
// create static instance and getter for global use
@observable static _instance: TrackMovements;
- static get Instance(): TrackMovements { return TrackMovements._instance }
+ static get Instance(): TrackMovements {
+ return TrackMovements._instance;
+ }
constructor() {
// init the global instance
TrackMovements._instance = this;
// init the instance variables
- this.currentPresentation = TrackMovements.NULL_PRESENTATION
+ this.currentPresentation = TrackMovements.NULL_PRESENTATION;
this.tracking = false;
this.absoluteStart = -1;
@@ -52,28 +52,37 @@ export class TrackMovements {
// little helper :)
private get nullPresentation(): boolean {
- return this.currentPresentation.movements === null
+ return this.currentPresentation.movements === null;
}
private addRecordingFFView(doc: Doc, key: string = doc[Id]): void {
// console.info('adding dispose func : docId', key, 'doc', doc);
- if (this.recordingFFViews === null) { console.warn('addFFView on null RecordingApi'); return; }
- if (this.recordingFFViews.has(key)) { console.warn('addFFView : key already in map'); return; }
+ if (this.recordingFFViews === null) {
+ console.warn('addFFView on null RecordingApi');
+ return;
+ }
+ if (this.recordingFFViews.has(key)) {
+ console.warn('addFFView : key already in map');
+ return;
+ }
const disposeFunc = reaction(
- () => ({ x: NumCast(doc.panX, -1), y: NumCast(doc.panY, -1), scale: NumCast(doc.viewScale, 0)}),
- (res) => (res.x !== -1 && res.y !== -1 && this.tracking) && this.trackMovement(res.x, res.y, key, res.scale),
+ () => ({ x: NumCast(doc.panX, -1), y: NumCast(doc.panY, -1), scale: NumCast(doc.viewScale, 0) }),
+ res => res.x !== -1 && res.y !== -1 && this.tracking && this.trackMovement(res.x, res.y, key, res.scale)
);
this.recordingFFViews?.set(key, disposeFunc);
}
private removeRecordingFFView = (key: string) => {
// console.info('removing dispose func : docId', key);
- if (this.recordingFFViews === null) { console.warn('removeFFView on null RecordingApi'); return; }
+ if (this.recordingFFViews === null) {
+ console.warn('removeFFView on null RecordingApi');
+ return;
+ }
this.recordingFFViews.get(key)?.();
this.recordingFFViews.delete(key);
- }
+ };
// in the case where only one tab was changed (updates not across dashboards), set only one to true
private updateRecordingFFViewsFromTabs = (tabbedDocs: Doc[], onlyOne = false) => {
@@ -86,7 +95,6 @@ export class TrackMovements {
if (isFFView(DashDoc)) tabbedFFViews.add(DashDoc[Id]);
}
-
// new tab was added - need to add it
if (tabbedFFViews.size > this.recordingFFViews.size) {
for (const DashDoc of tabbedDocs) {
@@ -103,13 +111,13 @@ export class TrackMovements {
// tab was removed - need to remove it from recordingFFViews
else if (tabbedFFViews.size < this.recordingFFViews.size) {
for (const [key] of this.recordingFFViews) {
- if (!tabbedFFViews.has(key)) {
+ if (!tabbedFFViews.has(key)) {
this.removeRecordingFFView(key);
if (onlyOne) return;
- }
+ }
}
}
- }
+ };
private initTabTracker = () => {
if (this.recordingFFViews === null) {
@@ -117,18 +125,19 @@ export class TrackMovements {
}
// init the dispose funcs on the page
- const docList = DocListCast(CollectionDockingView.Instance.props.Document.data);
+ const docList = DocListCast(CollectionDockingView.Instance?.props.Document.data);
this.updateRecordingFFViewsFromTabs(docList);
// create a reaction to monitor changes in tabs
- this.tabChangeDisposeFunc =
- reaction(() => CollectionDockingView.Instance.props.Document.data,
- (change) => {
- // TODO: consider changing between dashboards
- // console.info('change in tabs', change);
- this.updateRecordingFFViewsFromTabs(DocListCast(change), true);
- });
- }
+ this.tabChangeDisposeFunc = reaction(
+ () => CollectionDockingView.Instance?.props.Document.data,
+ change => {
+ // TODO: consider changing between dashboards
+ // console.info('change in tabs', change);
+ this.updateRecordingFFViewsFromTabs(DocListCast(change), true);
+ }
+ );
+ };
start = (meta?: Object) => {
this.initTabTracker();
@@ -142,12 +151,12 @@ export class TrackMovements {
this.absoluteStart = startDate.getTime();
// (2) assign meta content if it exists
- this.currentPresentation.meta = meta || {}
+ this.currentPresentation.meta = meta || {};
// (3) assign start date to currentPresenation
- this.currentPresentation.movements = []
+ this.currentPresentation.movements = [];
// (4) set tracking true to allow trackMovements
- this.tracking = true
- }
+ this.tracking = true;
+ };
/* stops the video and returns the presentatation; if no presentation, returns undefined */
yieldPresentation(clearData: boolean = true): Presentation | null {
@@ -157,7 +166,7 @@ export class TrackMovements {
// set the previus recording view to the play view
// this.playFFView = this.recordingFFView;
- // ensure we add the endTime now that they are done recording
+ // ensure we add the endTime now that they are done recording
const cpy = { ...this.currentPresentation, totalTime: new Date().getTime() - this.absoluteStart };
// reset the current presentation
@@ -169,10 +178,10 @@ export class TrackMovements {
finish = (): void => {
// make is tracking false
- this.tracking = false
+ this.tracking = false;
// reset the RecordingApi instance
this.clear();
- }
+ };
private clear = (): void => {
// clear the disposeFunc if we are done (not tracking)
@@ -187,44 +196,46 @@ export class TrackMovements {
}
// clear presenation data
- this.currentPresentation = TrackMovements.NULL_PRESENTATION
+ this.currentPresentation = TrackMovements.NULL_PRESENTATION;
// clear absoluteStart
- this.absoluteStart = -1
- }
+ this.absoluteStart = -1;
+ };
removeAllRecordingFFViews = () => {
- if (this.recordingFFViews === null) { console.warn('removeAllFFViews on null RecordingApi'); return; }
+ if (this.recordingFFViews === null) {
+ console.warn('removeAllFFViews on null RecordingApi');
+ return;
+ }
for (const [id, disposeFunc] of this.recordingFFViews) {
// console.info('calling dispose func : docId', id);
disposeFunc();
this.recordingFFViews.delete(id);
}
- }
+ };
private trackMovement = (panX: number, panY: number, docId: string, scale: number = 0) => {
// ensure we are recording to track
if (!this.tracking) {
- console.error('[recordingApi.ts] trackMovements(): tracking is false')
+ console.error('[recordingApi.ts] trackMovements(): tracking is false');
return;
}
// check to see if the presetation is init - if not, we are between segments
// TODO: make this more clear - tracking should be "live tracking", not always true when the recording api being used (between start and yieldPres)
- // bacuse tracking should be false inbetween segments high key
+ // bacuse tracking should be false inbetween segments high key
if (this.nullPresentation) {
- console.warn('[recordingApi.ts] trackMovements(): trying to store movemetns between segments')
+ console.warn('[recordingApi.ts] trackMovements(): trying to store movemetns between segments');
return;
}
// get the time
- const time = new Date().getTime() - this.absoluteStart
+ const time = new Date().getTime() - this.absoluteStart;
// make new movement object
- const movement: Movement = { time, panX, panY, scale, docId }
+ const movement: Movement = { time, panX, panY, scale, docId };
// add that movement to the current presentation data's movement array
- this.currentPresentation.movements && this.currentPresentation.movements.push(movement)
- }
-
+ this.currentPresentation.movements && this.currentPresentation.movements.push(movement);
+ };
// method that concatenates an array of presentatations into one
public concatPresentations = (presentations: Presentation[]): Presentation => {
@@ -233,13 +244,15 @@ export class TrackMovements {
let sumTime = 0;
let combinedMetas: any[] = [];
- presentations.forEach((presentation) => {
+ presentations.forEach(presentation => {
const { movements, totalTime, meta } = presentation;
// update movements if they had one
if (movements) {
// add the summed time to the movements
- const addedTimeMovements = movements.map(move => { return { ...move, time: move.time + sumTime } });
+ const addedTimeMovements = movements.map(move => {
+ return { ...move, time: move.time + sumTime };
+ });
// concat the movements already in the combined presentation with these new ones
combinedMovements.push(...addedTimeMovements);
}
@@ -252,6 +265,6 @@ export class TrackMovements {
});
// return the combined presentation with the updated total summed time
- return { movements: combinedMovements, totalTime: sumTime, meta: combinedMetas };
- }
+ return { movements: combinedMovements, totalTime: sumTime, meta: combinedMetas };
+ };
}