import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { Icon } from '@squiz/generic-browser-lib'; import sampleSources from './sample-sources.json'; import { ResourceBrowserPlugin, ResourceBrowserResource } from '../types'; type CreateCallbacksProps = Partial<{ delay: number; sourceIsLoading: boolean; singleSource?: boolean; error?: string; }>; export const createPlugins = (callbackWait: number, headerPortal = false, resourceError?: boolean): ResourceBrowserPlugin[] => { const types = ['dam', 'matrix']; return types.map((type): ResourceBrowserPlugin => { return { //@ts-ignore type, createHeaderPortal: headerPortal, sourceBrowserComponent: () => { return (props) => { console.log('sourceBrowserComponent invoked with', props); return (
THIS IS A {type} BROWSE PLUGIN
{headerPortal && props.headerPortal && createPortal(
HeadPortal
, props.headerPortal)}
); }; }, sourceSearchComponent: () => { return (props) => { console.log('sourceSearchComponent invoked with', props); return (
THIS IS A {type} SEARCH PLUGIN
Received query: {props.query}
{headerPortal && props.headerPortal && createPortal(
HeadPortal
, props.headerPortal)}
); }; }, renderResourceLauncher: () => { return (props) => { const [query, setQuery] = useState(''); return (
Search {type}
setQuery(event.target.value)} />
); }; }, renderSelectedResource: (resource) => { return new Promise((resolve, reject) => { const fileSize = resource.squizImage?.imageVariations?.original?.byteSize; const fileWidth = resource.squizImage?.imageVariations?.original?.width; const fileHeight = resource.squizImage?.imageVariations?.original?.height; setTimeout(() => { resolve({ showThumbnail: resource.squizImage ? true : false, icon: , label: resource.name || resource.squizImage?.name || resource.id, description: resource.squizImage ? [
{type} plugin
Asset size
{resource.squizImage && ( <> {fileSize} kB , {fileWidth} x {fileHeight}px )}
, ] : undefined, }); }, callbackWait); }); }, useResolveResource: (unresolvedResource) => { const [resource, setResource] = useState(null); const [error, setError] = useState( resourceError ? new Error(`Error loading: ${JSON.stringify(unresolvedResource)}`) : null, ); const [isLoading, setIsLoading] = useState(false); if (resourceError) { console.log('useResolveResource has returned an error'); } useEffect(() => { if (unresolvedResource !== null) { const forceType: string = unresolvedResource.forceResourceType; setTimeout(() => { setIsLoading(false); setResource({ id: unresolvedResource.resource, name: 'An image from Bynder', url: 'https://cdn.mediavalet.com/aunsw/squiz/KfIjcjUJz0O6kWoInBys5A/XpBxg3Hj-0qOXFWnAAWvXQ/Large/RX-7.jpeg', source: unresolvedResource.source, type: { code: forceType ? forceType : 'jpeg', name: 'JPEG image', }, squizImage: forceType ? undefined : { name: 'An image from Bynder', imageVariations: { original: { width: 1024, height: 900, url: 'https://cdn.mediavalet.com/aunsw/squiz/KfIjcjUJz0O6kWoInBys5A/XpBxg3Hj-0qOXFWnAAWvXQ/Large/RX-7.jpeg', mimeType: 'image/jpeg', byteSize: 1068, sha1Hash: '', aspectRatio: '', }, }, }, }); }, callbackWait); } else { setResource(null); setIsLoading(false); } }, [unresolvedResource, setResource, setIsLoading]); return { data: !error ? resource : null, error: error, isLoading: isLoading, }; }, }; }); }; export const createResourceBrowserCallbacks = ({ delay = 500, sourceIsLoading = false, error, singleSource = false, }: CreateCallbacksProps = {}) => { return { onRequestSources: () => { console.log(`onRequestSources invoked`); return new Promise((resolve, reject) => { if (!sourceIsLoading) { setTimeout(() => { if (error) { reject(new Error(error)); } else { resolve(singleSource ? [sampleSources[0]] : sampleSources); } }, delay); } }); }, }; };