Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 136x 136x 136x 136x 136x | import { MAX_TRACKED_STREAMS, TRACKED_FLOW_STYLES } from "./constants";
import type {
TrackedStreamEdgeFlow,
TrackedStreamState,
TrackedStreamSummary,
} from "./types";
type TrackedStreamFlowResult = {
sourceStreamId: number;
streamIds?: number[];
};
export function nextTrackedFlowStyle(trackedStreams: TrackedStreamState[]) {
const usedAccents = new Set(trackedStreams.map((flow) => flow.accent));
return (
TRACKED_FLOW_STYLES.find((style) => !usedAccents.has(style.accent)) ??
TRACKED_FLOW_STYLES[trackedStreams.length % TRACKED_FLOW_STYLES.length]
);
}
export function upsertTrackedStream(
trackedStreams: TrackedStreamState[],
trackedFlow: TrackedStreamFlowResult,
sourceName: string,
) {
const trackedStreamIndex = trackedStreams.findIndex(
(stream) => stream.sourceStreamId === trackedFlow.sourceStreamId,
);
if (
trackedStreamIndex === -1 &&
trackedStreams.length >= MAX_TRACKED_STREAMS
) {
return trackedStreams;
}
const trackedFlowStyle =
trackedStreamIndex === -1
? nextTrackedFlowStyle(trackedStreams)
: trackedStreams[trackedStreamIndex];
const nextTrackedStream: TrackedStreamState = {
sourceStreamId: trackedFlow.sourceStreamId,
sourceName,
streamIds: trackedFlow.streamIds ?? [],
accent: trackedFlowStyle.accent,
animationDelay: trackedFlowStyle.animationDelay,
};
if (trackedStreamIndex === -1) {
return [...trackedStreams, nextTrackedStream];
}
return trackedStreams.map((stream, index) =>
index === trackedStreamIndex ? nextTrackedStream : stream,
);
}
export function buildTrackedStreamIds(trackedStreams: TrackedStreamState[]) {
return new Set(trackedStreams.flatMap((flow) => flow.streamIds));
}
export function buildTrackedFlowsByStreamId(
trackedStreams: TrackedStreamState[],
) {
const flowsByStreamId = new Map<number, TrackedStreamEdgeFlow[]>();
trackedStreams.forEach((flow, order) => {
flow.streamIds.forEach((streamId) => {
const streamFlows = flowsByStreamId.get(streamId) ?? [];
streamFlows.push({
sourceStreamId: flow.sourceStreamId,
accent: flow.accent,
animationDelay: flow.animationDelay,
order,
});
flowsByStreamId.set(streamId, streamFlows);
});
});
return flowsByStreamId;
}
export function buildTrackedStreamSummaries(
trackedStreams: TrackedStreamState[],
): TrackedStreamSummary[] {
return trackedStreams.map((flow) => ({
sourceStreamId: flow.sourceStreamId,
sourceName: flow.sourceName,
accent: flow.accent,
}));
}
|