import React, { useImperativeHandle, useState } from 'react' import styled from 'styled-components' import { AssetLoader } from '@xrengine/engine/src/assets/classes/AssetLoader' import { AssetType } from '@xrengine/engine/src/assets/enum/AssetType' import createReadableTexture from '@xrengine/engine/src/assets/functions/createReadableTexture' import { useHookstate } from '@xrengine/hyperflux' import { AudioPreviewPanel } from './AssetPreviewPanels/AudioPreviewPanel' import { ImagePreviewPanel } from './AssetPreviewPanels/ImagePreviewPanel' import { JsonPreviewPanel } from './AssetPreviewPanels/JsonPreviewPanel' import { ModelPreviewPanel } from './AssetPreviewPanels/ModelPreviewPanel' import { PreviewUnavailable } from './AssetPreviewPanels/PreviewUnavailable' import { TxtPreviewPanel } from './AssetPreviewPanels/TxtPreviewPanel' import { VideoPreviewPanel } from './AssetPreviewPanels/VideoPreviewPanel' const AssetHeading = (styled as any).div` text-align: center; font-size: 0.9rem; padding-bottom: 10px; color: #f1f1f1; ` interface Props { hideHeading?: boolean } export type AssetSelectionChangePropsType = { resourceUrl: string name: string contentType: string } /** * Used to see the Preview of the Asset in the FileBrowser Panel */ export const AssetsPreviewPanel = React.forwardRef(({ hideHeading }: Props, ref) => { useImperativeHandle(ref, () => ({ onSelectionChanged })) const [previewPanel, usePreviewPanel] = useState({ PreviewSource: null as any, resourceProps: { resourceUrl: '', name: '' } }) const thumbnail = useHookstate('') const onSelectionChanged = async (props: AssetSelectionChangePropsType) => { thumbnail.value && URL.revokeObjectURL(thumbnail.value) if (/ktx2$/.test(props.resourceUrl)) { const texture = await AssetLoader.loadAsync(props.resourceUrl) thumbnail.set((await createReadableTexture(texture, { url: true })) as string) } else { thumbnail.set('') } renderPreview(props) } const renderPreview = (props) => { switch (props.contentType) { case 'model/gltf': case 'model/gltf-binary': case 'model/glb': case AssetType.glB: case AssetType.glTF: case 'gltf-binary': case AssetType.USDZ: case AssetType.FBX: const modelPreviewPanel = { PreviewSource: ModelPreviewPanel, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(modelPreviewPanel) break case 'image/png': case 'image/jpeg': case 'png': case 'jpeg': case 'jpg': const imagePreviewPanel = { PreviewSource: ImagePreviewPanel, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(imagePreviewPanel) break case 'ktx2': case 'image/ktx2': const compImgPreviewPanel = { PreviewSource: ImagePreviewPanel, resourceProps: { resourceUrl: thumbnail.value, name: props.name } } usePreviewPanel(compImgPreviewPanel) break case 'video/mp4': case 'mp4': case 'm3u8': const videoPreviewPanel = { PreviewSource: VideoPreviewPanel, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(videoPreviewPanel) break case 'audio/mpeg': case 'mpeg': case 'mp3': const audioPreviewPanel = { PreviewSource: AudioPreviewPanel, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(audioPreviewPanel) break case 'md': case 'ts': const txtPreviewPanel = { PreviewSource: TxtPreviewPanel, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(txtPreviewPanel) break case 'json': const jsonPreviewPanel = { PreviewSource: JsonPreviewPanel, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(jsonPreviewPanel) break default: const unavailable = { PreviewSource: PreviewUnavailable, resourceProps: { resourceUrl: props.resourceUrl, name: props.name } } usePreviewPanel(unavailable) break } } return ( <> {!hideHeading && {previewPanel.resourceProps.name}} {previewPanel.PreviewSource && } ) })