esa-nodecg/shared/dashboard/mediabox/components/shared.ts
2024-03-13 11:26:46 +01:00

72 lines
2.1 KiB
TypeScript

import type NodeCGTypes from '@nodecg/types';
import { v4 as uuid } from 'uuid';
import { MediaBox, Tracker } from '../../../types';
import { store } from '../store';
/**
* Checks if the supplied type is that of an alert.
* @param type Type of alert
*/
export function isAlertType(type: MediaBox.Types): boolean {
return ['donation', 'subscription', 'cheer', 'merch', 'therungg'].includes(type);
}
/**
* Returns details about a piece of media from rotation if found.
* @param media Media from rotation you wish to query information on.
*/
export function getMediaDetails(
media: MediaBox.RotationElem | NonNullable<MediaBox.ActiveElem>,
): { name?: string } {
let details: NodeCGTypes.AssetFile | Tracker.FormattedPrize | undefined;
if (media.type === 'prize_generic') {
return {
name: 'Generic Prize Slide',
};
}
if (media.type === 'image') {
details = store.state.images.find((l) => l.sum === media.mediaUUID);
} else if (media.type === 'prize') {
details = store.state.prizes.find((p) => p.id.toString() === media.mediaUUID);
} else if (media.type === 'text') {
return {
// This cast type is technically wrong but works OK in this context.
name: (media as MediaBox.RotationElem).text
? (media as MediaBox.RotationElem).text
: 'Custom Text',
};
}
return details ? {
name: details.name,
} : {};
}
/**
* Used by VueDraggble to properly clone items.
* @param type Type of item to be cloned.
* @param mediaUUID UUID of media, sum of image, ID of prize etc.
*/
export function clone(
type: 'image' | 'prize' | 'prize_generic' | 'text',
mediaUUID?: string,
text?: string,
): MediaBox.RotationElem {
return {
type,
id: uuid(),
mediaUUID: mediaUUID || '-1',
text,
seconds: 60,
showOnIntermission: true,
};
}
/**
* Returns if a prize should be shown or not.
* @param prize Formatted prize object from the tracker.
*/
export function isPrizeApplicable(prize?: Tracker.FormattedPrize): boolean {
return !!(prize && prize.startTime && prize.endTime
&& Date.now() > prize.startTime && Date.now() < prize.endTime);
}