diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 71674b0f..44696b0a 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -128,6 +128,16 @@ import { useTheme } from '../../hooks/useTheme'; import { useRoomCreatorsTag } from '../../hooks/useRoomCreatorsTag'; import { usePowerLevelTags } from '../../hooks/usePowerLevelTags'; import { ThreadSelector, ThreadSelectorContainer } from './message/thread-selector'; +import { + getEventIdAbsoluteIndex, + getFirstLinkedTimeline, + getLinkedTimelines, + getTimelineAndBaseIndex, + getTimelineEvent, + getTimelineRelativeIndex, + getTimelinesEventsCount, + timelineToEventsCount, +} from './utils'; const TimelineFloat = as<'div', css.TimelineFloatVariants>( ({ position, className, ...props }, ref) => ( @@ -152,79 +162,6 @@ const TimelineDivider = as<'div', { variant?: ContainerColor | 'Inherit' }>( ) ); -export const getLiveTimeline = (room: Room): EventTimeline => - room.getUnfilteredTimelineSet().getLiveTimeline(); - -export const getEventTimeline = (room: Room, eventId: string): EventTimeline | undefined => { - const timelineSet = room.getUnfilteredTimelineSet(); - return timelineSet.getTimelineForEvent(eventId) ?? undefined; -}; - -export const getFirstLinkedTimeline = ( - timeline: EventTimeline, - direction: Direction -): EventTimeline => { - const linkedTm = timeline.getNeighbouringTimeline(direction); - if (!linkedTm) return timeline; - return getFirstLinkedTimeline(linkedTm, direction); -}; - -export const getLinkedTimelines = (timeline: EventTimeline): EventTimeline[] => { - const firstTimeline = getFirstLinkedTimeline(timeline, Direction.Backward); - const timelines: EventTimeline[] = []; - - for ( - let nextTimeline: EventTimeline | null = firstTimeline; - nextTimeline; - nextTimeline = nextTimeline.getNeighbouringTimeline(Direction.Forward) - ) { - timelines.push(nextTimeline); - } - return timelines; -}; - -export const timelineToEventsCount = (t: EventTimeline) => t.getEvents().length; -export const getTimelinesEventsCount = (timelines: EventTimeline[]): number => { - const timelineEventCountReducer = (count: number, tm: EventTimeline) => - count + timelineToEventsCount(tm); - return timelines.reduce(timelineEventCountReducer, 0); -}; - -export const getTimelineAndBaseIndex = ( - timelines: EventTimeline[], - index: number -): [EventTimeline | undefined, number] => { - let uptoTimelineLen = 0; - const timeline = timelines.find((t) => { - uptoTimelineLen += t.getEvents().length; - if (index < uptoTimelineLen) return true; - return false; - }); - if (!timeline) return [undefined, 0]; - return [timeline, uptoTimelineLen - timeline.getEvents().length]; -}; - -export const getTimelineRelativeIndex = (absoluteIndex: number, timelineBaseIndex: number) => - absoluteIndex - timelineBaseIndex; - -export const getTimelineEvent = (timeline: EventTimeline, index: number): MatrixEvent | undefined => - timeline.getEvents()[index]; - -export const getEventIdAbsoluteIndex = ( - timelines: EventTimeline[], - eventTimeline: EventTimeline, - eventId: string -): number | undefined => { - const timelineIndex = timelines.findIndex((t) => t === eventTimeline); - if (timelineIndex === -1) return undefined; - const eventIndex = eventTimeline.getEvents().findIndex((evt) => evt.getId() === eventId); - if (eventIndex === -1) return undefined; - const baseIndex = timelines - .slice(0, timelineIndex) - .reduce((accValue, timeline) => timeline.getEvents().length + accValue, 0); - return baseIndex + eventIndex; -}; - type RoomTimelineProps = { room: Room; eventId?: string; @@ -234,6 +171,14 @@ type RoomTimelineProps = { const PAGINATION_LIMIT = 80; +export const getLiveTimeline = (room: Room): EventTimeline => + room.getUnfilteredTimelineSet().getLiveTimeline(); + +export const getEventTimeline = (room: Room, eventId: string): EventTimeline | undefined => { + const timelineSet = room.getUnfilteredTimelineSet(); + return timelineSet.getTimelineForEvent(eventId) ?? undefined; +}; + type Timeline = { linkedTimelines: EventTimeline[]; range: ItemRange; diff --git a/src/app/features/room/utils/index.ts b/src/app/features/room/utils/index.ts new file mode 100644 index 00000000..13d812d7 --- /dev/null +++ b/src/app/features/room/utils/index.ts @@ -0,0 +1 @@ +export * from './timeline'; diff --git a/src/app/features/room/utils/timeline.ts b/src/app/features/room/utils/timeline.ts new file mode 100644 index 00000000..f9c45525 --- /dev/null +++ b/src/app/features/room/utils/timeline.ts @@ -0,0 +1,66 @@ +import { Room, EventTimeline, Direction, MatrixEvent } from 'matrix-js-sdk'; + +export const getFirstLinkedTimeline = ( + timeline: EventTimeline, + direction: Direction +): EventTimeline => { + const linkedTm = timeline.getNeighbouringTimeline(direction); + if (!linkedTm) return timeline; + return getFirstLinkedTimeline(linkedTm, direction); +}; + +export const getLinkedTimelines = (timeline: EventTimeline): EventTimeline[] => { + const firstTimeline = getFirstLinkedTimeline(timeline, Direction.Backward); + const timelines: EventTimeline[] = []; + + for ( + let nextTimeline: EventTimeline | null = firstTimeline; + nextTimeline; + nextTimeline = nextTimeline.getNeighbouringTimeline(Direction.Forward) + ) { + timelines.push(nextTimeline); + } + return timelines; +}; + +export const timelineToEventsCount = (t: EventTimeline) => t.getEvents().length; +export const getTimelinesEventsCount = (timelines: EventTimeline[]): number => { + const timelineEventCountReducer = (count: number, tm: EventTimeline) => + count + timelineToEventsCount(tm); + return timelines.reduce(timelineEventCountReducer, 0); +}; + +export const getTimelineAndBaseIndex = ( + timelines: EventTimeline[], + index: number +): [EventTimeline | undefined, number] => { + let uptoTimelineLen = 0; + const timeline = timelines.find((t) => { + uptoTimelineLen += t.getEvents().length; + if (index < uptoTimelineLen) return true; + return false; + }); + if (!timeline) return [undefined, 0]; + return [timeline, uptoTimelineLen - timeline.getEvents().length]; +}; + +export const getTimelineRelativeIndex = (absoluteIndex: number, timelineBaseIndex: number) => + absoluteIndex - timelineBaseIndex; + +export const getTimelineEvent = (timeline: EventTimeline, index: number): MatrixEvent | undefined => + timeline.getEvents()[index]; + +export const getEventIdAbsoluteIndex = ( + timelines: EventTimeline[], + eventTimeline: EventTimeline, + eventId: string +): number | undefined => { + const timelineIndex = timelines.findIndex((t) => t === eventTimeline); + if (timelineIndex === -1) return undefined; + const eventIndex = eventTimeline.getEvents().findIndex((evt) => evt.getId() === eventId); + if (eventIndex === -1) return undefined; + const baseIndex = timelines + .slice(0, timelineIndex) + .reduce((accValue, timeline) => timeline.getEvents().length + accValue, 0); + return baseIndex + eventIndex; +};