mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-05 06:50:28 +03:00
move timeline utils functions to new file
This commit is contained in:
parent
d73428ee3d
commit
174b315278
3 changed files with 85 additions and 73 deletions
|
|
@ -128,6 +128,16 @@ import { useTheme } from '../../hooks/useTheme';
|
||||||
import { useRoomCreatorsTag } from '../../hooks/useRoomCreatorsTag';
|
import { useRoomCreatorsTag } from '../../hooks/useRoomCreatorsTag';
|
||||||
import { usePowerLevelTags } from '../../hooks/usePowerLevelTags';
|
import { usePowerLevelTags } from '../../hooks/usePowerLevelTags';
|
||||||
import { ThreadSelector, ThreadSelectorContainer } from './message/thread-selector';
|
import { ThreadSelector, ThreadSelectorContainer } from './message/thread-selector';
|
||||||
|
import {
|
||||||
|
getEventIdAbsoluteIndex,
|
||||||
|
getFirstLinkedTimeline,
|
||||||
|
getLinkedTimelines,
|
||||||
|
getTimelineAndBaseIndex,
|
||||||
|
getTimelineEvent,
|
||||||
|
getTimelineRelativeIndex,
|
||||||
|
getTimelinesEventsCount,
|
||||||
|
timelineToEventsCount,
|
||||||
|
} from './utils';
|
||||||
|
|
||||||
const TimelineFloat = as<'div', css.TimelineFloatVariants>(
|
const TimelineFloat = as<'div', css.TimelineFloatVariants>(
|
||||||
({ position, className, ...props }, ref) => (
|
({ 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 = {
|
type RoomTimelineProps = {
|
||||||
room: Room;
|
room: Room;
|
||||||
eventId?: string;
|
eventId?: string;
|
||||||
|
|
@ -234,6 +171,14 @@ type RoomTimelineProps = {
|
||||||
|
|
||||||
const PAGINATION_LIMIT = 80;
|
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 = {
|
type Timeline = {
|
||||||
linkedTimelines: EventTimeline[];
|
linkedTimelines: EventTimeline[];
|
||||||
range: ItemRange;
|
range: ItemRange;
|
||||||
|
|
|
||||||
1
src/app/features/room/utils/index.ts
Normal file
1
src/app/features/room/utils/index.ts
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
export * from './timeline';
|
||||||
66
src/app/features/room/utils/timeline.ts
Normal file
66
src/app/features/room/utils/timeline.ts
Normal file
|
|
@ -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;
|
||||||
|
};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue