@tldraw/editor
Version:
tldraw infinite canvas SDK (editor).
55 lines (50 loc) • 1.84 kB
text/typescript
import { TLInstancePresence } from '@tldraw/tlschema'
import { Editor } from '../editor/Editor'
/** The activity state of a collaborator */
export type CollaboratorState = 'active' | 'idle' | 'inactive'
/**
* Get the activity state of a collaborator based on elapsed time since their last activity.
*
* @param editor - The editor instance
* @param elapsed - Time in milliseconds since the collaborator's last activity
* @returns The collaborator's activity state
*/
export function getCollaboratorStateFromElapsedTime(
editor: Editor,
elapsed: number
): CollaboratorState {
return elapsed > editor.options.collaboratorInactiveTimeoutMs
? 'inactive'
: elapsed > editor.options.collaboratorIdleTimeoutMs
? 'idle'
: 'active'
}
/**
* Determine whether a collaborator should be shown based on their activity state
* and the current instance state (following, highlighted users, etc.).
*
* @param editor - The editor instance
* @param presence - The collaborator's presence data
* @param state - The collaborator's activity state
* @returns Whether the collaborator should be shown
*/
export function shouldShowCollaborator(
editor: Editor,
presence: TLInstancePresence,
state: CollaboratorState
): boolean {
const { followingUserId, highlightedUserIds } = editor.getInstanceState()
switch (state) {
case 'inactive':
// If they're inactive, only show if we're following them or they're highlighted
return followingUserId === presence.userId || highlightedUserIds.includes(presence.userId)
case 'idle':
// If they're idle and following us, hide them unless they have a chat message or are highlighted
if (presence.followingUserId === editor.user.getId()) {
return !!(presence.chatMessage || highlightedUserIds.includes(presence.userId))
}
return true
case 'active':
return true
}
}