diff --git a/apps/dotcom/client/src/utils/analytics.tsx b/apps/dotcom/client/src/utils/analytics.tsx index 1de658e297f2..3dc261eb9b5e 100644 --- a/apps/dotcom/client/src/utils/analytics.tsx +++ b/apps/dotcom/client/src/utils/analytics.tsx @@ -178,6 +178,12 @@ function getGA4() { export function trackEvent(name: string, data?: { [key: string]: any }) { getPosthog()?.capture(name, data) + + // For GA4, rename 'source' to 'event_source' to avoid session attribution + if (data) { + const { source, ...rest } = data + data = source !== undefined ? { ...rest, event_source: source } : rest + } getGA4()?.event(name, data) } diff --git a/packages/sync-core/src/lib/TLSocketRoom.ts b/packages/sync-core/src/lib/TLSocketRoom.ts index 70a3f49e727e..192031791928 100644 --- a/packages/sync-core/src/lib/TLSocketRoom.ts +++ b/packages/sync-core/src/lib/TLSocketRoom.ts @@ -24,6 +24,10 @@ export class TLSocketRoom void } >() readonly log?: TLSyncLog + private readonly syncCallbacks: { + onDataChange?(): void + onPresenceChange?(): void + } constructor( public readonly opts: { @@ -65,11 +69,14 @@ export class TLSocketRoom({ + ...this.syncCallbacks, schema: opts.schema ?? (createTLSchema() as any), snapshot: initialSnapshot, - onDataChange: opts.onDataChange, - onPresenceChange: opts.onPresenceChange, log: opts.log, }) this.room.events.on('session_removed', (args) => { @@ -314,6 +321,7 @@ export class TLSocketRoom({ + ...this.syncCallbacks, schema: oldRoom.schema, snapshot: { clock: oldRoom.clock + 1, diff --git a/packages/sync-core/src/test/TLSocketRoom.test.ts b/packages/sync-core/src/test/TLSocketRoom.test.ts index 2e142326ff26..32f0028ce552 100644 --- a/packages/sync-core/src/test/TLSocketRoom.test.ts +++ b/packages/sync-core/src/test/TLSocketRoom.test.ts @@ -1,5 +1,5 @@ import { InstancePresenceRecordType, PageRecordType } from '@tldraw/tlschema' -import { createTLSchema, createTLStore } from 'tldraw' +import { createTLSchema, createTLStore, ZERO_INDEX_KEY } from 'tldraw' import { WebSocketMinimal } from '../lib/ServerSocketAdapter' import { TLSocketRoom } from '../lib/TLSocketRoom' import { RecordOpType } from '../lib/diff' @@ -241,4 +241,28 @@ describe(TLSocketRoom, () => { ) expect(documentRecordIds).toHaveLength(0) }) + + it('passes onDataChange handler through', async () => { + const addPage = (room: TLSocketRoom) => + room.updateStore((store) => { + store.put( + PageRecordType.create({ id: PageRecordType.createId(), name: '', index: ZERO_INDEX_KEY }) + ) + }) + const store = getStore() + store.ensureStoreIsUsable() + let called = 0 + + const room = new TLSocketRoom({ onDataChange: () => ++called }) + expect(called).toEqual(0) + + await addPage(room) + expect(called).toEqual(1) + + room.loadSnapshot(room.getCurrentSnapshot()) + expect(called).toEqual(1) + + await addPage(room) + expect(called).toEqual(2) + }) })