Kopie van https://gitlab.com/studieverenigingvia/ict/centurion met een paar aanpassingen
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
centurion/frontend/src/types/types.ts

125 lines
3.1 KiB

export interface Config {
availableTimelines: string[];
}
export interface Room {
id: number;
userCount: number;
isLeader: boolean;
running: boolean;
startTime?: number;
seekTime: number;
timelineName: string;
readyToParticipate: boolean;
speedFactor: number;
ticker: string[];
users?: { id: string; readyToParticipate: boolean }[];
}
export class RoomOptions {
seekTime: number;
timelineName: string;
constructor(seekTime: number, timelineName: string) {
this.seekTime = seekTime;
this.timelineName = timelineName;
}
}
export class Timeline {
name: string;
songFile: string;
feed: TimelineItem[];
constructor(obj: any) {
this.name = obj.name;
this.songFile = obj.songFile;
this.feed = obj.feed;
this.feed = this.feed.sort((a, b) => a.timestamp - b.timestamp);
// Add string ids to the feed to uniquely identify them in the various
// reactive components.
for (let i = 0; i < this.feed.length; i++) {
this.feed[i].id = i.toString();
for (let j = 0; j < this.feed[i].events.length; j++) {
this.feed[i].events[j].id = `${i}:${j}`;
}
}
}
getTotalShotCount(): number {
let maxShot = 0;
for (const item of this.feed) {
for (const event of item.events) {
if (event.type === "shot") {
maxShot = Math.max(
maxShot,
(event as TimestampEventShot).shotCount || 0
);
}
}
}
return maxShot;
}
itemAfterTime(time: number, type?: EventType): TimelineItem | undefined {
const feedToSearch = type
? this.feed.filter((i) => i.events.some((j) => j.type === type))
: this.feed;
return feedToSearch.find((item) => item.timestamp * 1000 > time);
}
itemBeforeTime(time: number, type?: EventType): TimelineItem | undefined {
const feedToSearch = type
? this.feed.filter((i) => i.events.some((j) => j.type === type))
: this.feed;
return feedToSearch.reverse().find((item) => item.timestamp * 1000 < time);
}
eventAfterTime(time: number, type: "shot"): TimestampEventShot | undefined;
eventAfterTime(time: number, type: EventType): TimestampEvent | undefined {
const item = this.itemAfterTime(time, type);
if (!item || !item.events.length) {
return undefined;
}
return item.events.find((ev) => ev.type === type);
}
eventBeforeTime(time: number, type: "shot"): TimestampEventShot | undefined;
eventBeforeTime(time: number, type: EventType): TimestampEvent | undefined {
const item = this.itemBeforeTime(time, type);
if (!item || !item.events.length) {
return undefined;
}
return item.events.find((ev) => ev.type === type);
}
}
export interface TimelineItem {
id: string;
timestamp: number;
events: TimestampEvent[];
}
export const EVENT_PRIORITY: EventType[] = ["shot", "talk", "time", "song"];
export type EventType = "talk" | "shot" | "song" | "time";
interface TimestampEventBase {
id: string;
type: EventType;
text: string[];
}
interface TimestampEventShot extends TimestampEventBase {
type: "shot";
shotCount: number;
}
export type TimestampEvent = TimestampEventBase | TimestampEventShot;