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 (
);
};
},
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);
}
});
},
};
};