import type { Demo } from './demo'; /** * Represents the state of the viewer. Certain methods will need to have a or multiple specific status on order * to be executed. * * > `unmounted` -> viewer's HTML element is yet to be mounted in the DOM. * * > `mounted` -> viewer's HTML element has been mounted in the DOM. * * > `loading` -> a 3D model is currently loading into the viewer. * * > `loaded` -> a 3D is loaded in the viewer and is ready to be manipulated. */ export enum ViewerStatus { UNMOUNTED = 'unmounted', MOUNTED = 'mounted', LOADING = 'loading', LOADED = 'loaded', } /** * @ignore */ export const statusLevels = { [ViewerStatus.UNMOUNTED]: 1, [ViewerStatus.MOUNTED]: 2, [ViewerStatus.LOADING]: 3, [ViewerStatus.LOADED]: 4, }; /** * @ignore */ export enum ViewerAPIMessage { // GETTERS - Request the viewer GET_VIEWER = 'VISAO/GET_VIEWER', GET_STATUS = 'VISAO/GET_STATUS', GET_VARIANT_INFO = 'VISAO/GET_VARIANT_INFO', GET_LANGUAGE_INFO = 'VISAO/GET_LANGUAGE_INFO', GET_ANIMATION_INFO = 'VISAO/GET_ANIMATION_INFO', GET_DIMENSIONS_UNIT = 'VISAO/GET_DIMENSIONS_UNIT', GET_DEMOS = 'VISAO/GET_DEMOS', GET_SCREENSHOT = 'VISAO/GET_SCREENSHOT', // SENDERS - Send back to the client SEND_VIEWER = 'VISAO/SEND_VIEWER', SEND_STATUS = 'VISAO/SEND_STATUS', SEND_VARIANT_INFO = 'VISAO/SEND_VARIANT_INFO', SEND_LANGUAGE_INFO = 'VISAO/SEND_LANGUAGE_INFO', SEND_ANIMATION_INFO = 'VISAO/SEND_ANIMATION_INFO', SEND_DIMENSIONS_UNIT = 'VISAO/SEND_DIMENSIONS_UNIT', SEND_DEMOS = 'VISAO/SEND_DEMOS', SEND_SCREENSHOT = 'VISAO/SEND_SCREENSHOT', // ACTIONS - Execute in the viewer UPDATE_VARIANT = 'VISAO/UPDATE_VARIANT', REMOVE_VARIANT = 'VISAO/REMOVE_VARIANT', UPDATE_LANGUAGE = 'VISAO/UPDATE_LANGUAGE', UPDATE_DIMENSIONS_UNIT = 'VISAO/UPDATE_DIMENSIONS_UNIT', START_AR = 'VISAO/START_AR', SHOW_STEP = 'VISAO/SHOW_STEP', NEXT_STEP = 'VISAO/NEXT_STEP', PREVIOUS_STEP = 'VISAO/PREVIOUS_STEP', CLOSE_STEP = 'VISAO/CLOSE_STEP', PLAY = 'VISAO/PLAY', PAUSE = 'VISAO/PAUSE', CAPTURE_SCREENSHOT = 'VISAO/CAPTURE_SCREENSHOT', RESET_CAMERA = 'VISAO/RESET_CAMERA', LOCK_CAMERA = 'VISAO/LOCK_CAMERA', UNLOCK_CAMERA = 'VISAO/UNLOCK_CAMERA', SHOW_HELP = 'VISAO/SHOW_HELP', CLOSE_HELP = 'VISAO/CLOSE_HELP', SHOW_QR = 'VISAO/SHOW_QR', CLOSE_QR = 'VISAO/CLOSE_QR', SHOW_DIMENSIONS = 'VISAO/SHOW_DIMENSIONS', CLOSE_DIMENSIONS = 'VISAO/CLOSE_DIMENSIONS', START_AUTO_ROTATE = 'VISAO/START_AUTO_ROTATE', STOP_AUTO_ROTATE = 'VISAO/STOP_AUTO_ROTATE', MUTE_VOICEOVER = 'VISAO/MUTE_VOICEOVER', UNMUTE_VOICEOVER = 'VISAO/UNMUTE_VOICEOVER', START_ANIMATION = 'VISAO/START_ANIMATION', STOP_ANIMATION = 'VISAO/STOP_ANIMATION', UPDATE_VOICEOVER_VOLUME = 'VISAO/UPDATE_VOICEOVER_VOLUME', // LEGACY STATUS = 'VISAO/STATUS', GET_VARIANT_INFORMATION = 'VISAO/GET_VARIANT_INFORMATION', GET_LANGUAGE_INFORMATION = 'VISAO/GET_LANGUAGE_INFORMATION', } /** * @ignore */ export enum ViewerAPIMessageSource { VIEWER = 'visao_viewer', API = 'visao_viewer_api', } export interface StatusPayload { status: ViewerStatus; } /** * @ignore */ export interface UpdateLanguagePayload { language: string; } export interface LanguageInformationPayload { language: string; languages: string[]; } /** * @ignore */ export type UpdateModelVariantPayload = | { modelVariant: string } | { modelVariants: string | string[] }; export interface VariantInformationPayload { availableModelVariants: string[]; selectedModelVariants: string[]; } export enum AnimationRepetitionType { LOOP = 'loop', REPEAT = 'repeat', } export interface AnimationOptions { repetitionType?: AnimationRepetitionType; repetitionQuantity?: number; } /** * @ignore */ export interface StartAnimationPayload { animation: string; options: AnimationOptions; } /** * @ignore */ export interface StopAnimationPayload { preventPresets?: boolean; } export interface AnimationInformationPayload { animation: string; animations: string[]; } export type DimensionsUnit = 'mm' | 'cm' | 'm' | 'in' | 'ft'; export interface DimensionsUnitPayload { unit: DimensionsUnit; } export interface VoiceoverVolumePayload { volume: number; } export interface DemosPayload { demos: Demo[]; } export type MimeType = 'image/png' | 'image/jpeg' | 'image/webp'; export type FileFormat = 'blob' | 'base64'; export interface ScreenshotOptions { mimeType: MimeType; fileFormat: FileFormat; } export const defaultScreenshotOptions: ScreenshotOptions = { mimeType: 'image/png', fileFormat: 'blob', }; export interface ScreenshotPayload { screenshot: string; options: ScreenshotOptions; } /** * @ignore */ export interface ShowStepPayload { step: string; } /** * @ignore */ export type Payload = | StatusPayload | UpdateModelVariantPayload | VariantInformationPayload | StartAnimationPayload | StopAnimationPayload | AnimationInformationPayload | UpdateLanguagePayload | LanguageInformationPayload | DimensionsUnitPayload | ScreenshotPayload | ScreenshotOptions | DemosPayload | ShowStepPayload | VoiceoverVolumePayload; /** * @ignore */ export type CallbackFn = (payload: any) => void; /** * @ignore */ export type CallbackId = string; /** * @ignore */ export type Callback = { id: CallbackId; fn: CallbackFn }; /** * @ignore */ export interface CallbackStore { [key: string]: Callback[]; } export type ViewerStatusListenerCallback = (status: ViewerStatus) => void; export type GetLanguageInformationCallback = ( languageInformation: LanguageInformationPayload, ) => void; export type GetVariantInformationCallback = ( variantInformation: VariantInformationPayload, ) => void; export type GetAnimationInformationCallback = ( animationInformation: AnimationInformationPayload, ) => void; export type GetDimensionsUnitCallback = ( dimensionsUnitPayload: DimensionsUnitPayload, ) => void; export type GetDemosCallback = (demos: DemosPayload) => void; export type GetScreenshotCallback = (screenshot: Blob | string) => void; export type ViewerElement = HTMLIFrameElement | null; /** * @ignore */ export interface Message { source: ViewerAPIMessageSource; type: ViewerAPIMessage; payload?: Payload; callbackId?: CallbackId; }