@multisynq/react
Version:
React bindings for Multisynq
68 lines (59 loc) • 1.76 kB
text/typescript
import { View } from '@multisynq/client'
import { ReactModel } from './ReactModel'
export type UpdateCallback = (time: number) => void
export type SyncedCallback = (flag: boolean) => void
export type DetachCallback = () => void
let storedSyncedCallback: ((flag: boolean) => void) | null = null
// our top level view that gets the root model
// and from which we create our one-time-use views per component
export class MultisynqReactView<M extends ReactModel> extends View {
model: M
updateCallback: UpdateCallback | null
syncedCallback: SyncedCallback | null
detachCallback: DetachCallback | null
constructor(model: M) {
super(model)
this.model = model
this.updateCallback = null
this.syncedCallback = storedSyncedCallback
this.detachCallback = null
this.subscribe(this.viewId, 'synced', this.synced)
}
update(time: number) {
if (this.updateCallback !== null) {
this.updateCallback(time)
}
}
synced(flag: boolean) {
// console.log('synced', flag)
if (this.syncedCallback) {
this.syncedCallback(flag)
}
}
detach() {
if (this.detachCallback) {
this.detachCallback()
}
super.detach()
}
}
/** A function to set up the handler for the synced event.
* It is supposed to be called from the React component that
* calls createReactSession() in the following manner from where the
*
*```
*setSyncedCallback((flag) => {
* console.log(`synced`, flag)
* if (flag) {
* setMultisynqView((old) => session.view)
* }
* session.view.detachCallback = () => {
* console.log(`detached`)
* setMultisynqView(null)
* }
*})
*```
*/
export function setSyncedCallback(func: (flag: boolean) => void) {
storedSyncedCallback = func
}