sanity-plugin-cloudinary 0.2.1 → 1.0.0-v3-studio.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +160 -66
- package/lib/cjs/index.js +708 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/esm/index.js +697 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/types/index.d.ts +22 -0
- package/lib/types/index.d.ts.map +1 -0
- package/package.json +66 -40
- package/sanity.json +3 -15
- package/src/arrayFunctions.tsx +71 -0
- package/src/components/AssetDiff.tsx +44 -0
- package/src/components/AssetPreview.tsx +41 -0
- package/src/components/CloudinaryInput.tsx +61 -0
- package/src/components/SecretsConfigView.tsx +39 -0
- package/src/components/VideoPlayer.tsx +62 -0
- package/src/components/WidgetInput.tsx +66 -0
- package/src/components/asset-source/CloudinaryAssetSource.tsx +155 -0
- package/src/components/asset-source/Icon.tsx +93 -0
- package/src/index.ts +30 -0
- package/src/schema/cloudinaryAsset.ts +99 -0
- package/src/schema/cloudinaryAssetDerived.ts +26 -0
- package/src/typings.d.ts +74 -0
- package/src/utils.ts +115 -0
- package/v2-incompatible.js +11 -0
- package/dist/arrayFunctions.js +0 -82
- package/dist/arrayFunctions.js.map +0 -1
- package/dist/components/AssetDiff.js +0 -62
- package/dist/components/AssetDiff.js.map +0 -1
- package/dist/components/AssetPreview.js +0 -46
- package/dist/components/AssetPreview.js.map +0 -1
- package/dist/components/CloudinaryInput.js +0 -90
- package/dist/components/CloudinaryInput.js.map +0 -1
- package/dist/components/SecretsConfigView.js +0 -37
- package/dist/components/SecretsConfigView.js.map +0 -1
- package/dist/components/VideoPlayer.js +0 -70
- package/dist/components/VideoPlayer.js.map +0 -1
- package/dist/components/WidgetInput.js +0 -87
- package/dist/components/WidgetInput.js.map +0 -1
- package/dist/index.js +0 -24
- package/dist/index.js.map +0 -1
- package/dist/schema/cloudinary.js +0 -19
- package/dist/schema/cloudinary.js.map +0 -1
- package/dist/schema/cloudinaryAsset.js +0 -100
- package/dist/schema/cloudinaryAsset.js.map +0 -1
- package/dist/schema/cloudinaryAssetDerived.js +0 -22
- package/dist/schema/cloudinaryAssetDerived.js.map +0 -1
- package/dist/typings.d.js +0 -8
- package/dist/typings.d.js.map +0 -1
- package/dist/utils.js +0 -92
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/index.ts","src/schema/cloudinaryAsset.ts","src/components/CloudinaryInput.tsx","src/components/WidgetInput.tsx","src/components/AssetPreview.tsx","src/components/VideoPlayer.tsx","src/utils.ts","src/components/SecretsConfigView.tsx","src/components/AssetDiff.tsx","src/schema/cloudinaryAssetDerived.ts","src/components/asset-source/Icon.tsx","src/components/asset-source/CloudinaryAssetSource.tsx"],"sourcesContent":["import {cloudinaryAssetSchema} from './schema/cloudinaryAsset'\nimport {cloudinaryAssetDerivedSchema} from './schema/cloudinaryAssetDerived'\nimport {createPlugin, AssetSource} from 'sanity'\nimport {CloudinaryIcon} from './components/asset-source/Icon'\nimport {CloudinaryAssetSource} from './components/asset-source/CloudinaryAssetSource'\n\nexport {cloudinaryAssetSchema, cloudinaryAssetDerivedSchema}\n\nexport const cloudinarySchemaPlugin = createPlugin({\n name: 'cloudinary-schema',\n schema: {\n types: [cloudinaryAssetSchema, cloudinaryAssetDerivedSchema],\n },\n})\n\nexport const cloudinaryImageSource: AssetSource = {\n name: 'cloudinary-image',\n title: 'Cloudinary',\n icon: CloudinaryIcon,\n component: CloudinaryAssetSource,\n}\n\nexport const cloudinaryAssetSourcePlugin = createPlugin({\n name: 'cloudinart-asset-source',\n form: {\n image: {\n assetSources: [cloudinaryImageSource],\n },\n },\n})\n","/* eslint-disable */\nimport CloudinaryInput from '../components/CloudinaryInput'\nimport AssetDiff from '../components/AssetDiff'\nimport AssetPreview from '../components/AssetPreview'\nimport {defineType} from 'sanity'\n\nexport const cloudinaryAssetSchema = defineType({\n type: 'object',\n name: 'cloudinary.asset',\n fields: [\n {\n type: 'string',\n name: 'public_id',\n },\n {\n type: 'string',\n name: 'resource_type',\n // \"image\", \"?\"\n },\n {\n type: 'string',\n name: 'type',\n // \"upload\", \"?\"\n },\n {\n type: 'string',\n name: 'format',\n // \"jpg\"\n },\n {\n type: 'number',\n name: 'version',\n },\n {\n type: 'url',\n name: 'url',\n },\n {\n type: 'url',\n name: 'secure_url',\n },\n {\n type: 'number',\n name: 'width',\n },\n {\n type: 'number',\n name: 'height',\n },\n {\n type: 'number',\n name: 'bytes',\n },\n {\n type: 'number',\n name: 'duration',\n // can be null\n },\n {\n type: 'array',\n name: 'tags',\n of: [{type: 'string'}],\n },\n {\n type: 'datetime',\n name: 'created_at',\n },\n {\n type: 'array',\n name: 'derived',\n of: [{type: 'cloudinary.assetDerived'}],\n },\n {\n type: 'string',\n name: 'access_mode',\n },\n // context array of unknown content\n // metadata array of unknown content\n ],\n components: {\n input: CloudinaryInput,\n diff: AssetDiff,\n preview: AssetPreview,\n },\n preview: {\n select: {\n url: 'url',\n resource_type: 'resource_type',\n derived: 'derived.0.url',\n },\n prepare({url, derived, resource_type}) {\n return {\n title: url,\n resource_type,\n url: derived || url,\n }\n },\n },\n})\n","import React, {useCallback, useState} from 'react'\nimport WidgetInput from './WidgetInput'\nimport {nanoid} from 'nanoid'\nimport {ObjectInputProps, PatchEvent, set} from 'sanity'\nimport {CloudinaryAsset} from '../typings'\nimport {useSecrets} from '@sanity/studio-secrets'\nimport {InsertHandlerParams} from '../typings'\nimport {openMediaSelector} from '../utils'\nimport SecretsConfigView, {namespace, Secrets} from './SecretsConfigView'\n\nconst CloudinaryInput = (props: ObjectInputProps) => {\n const [showSettings, setShowSettings] = useState(false)\n const {secrets} = useSecrets<Secrets>(namespace)\n const {onChange, schemaType: type} = props\n const value = (props.value as CloudinaryAsset) || undefined\n\n const handleSelect = useCallback(\n (payload: InsertHandlerParams) => {\n const [asset] = payload.assets\n if (!asset) {\n return\n }\n\n onChange(\n PatchEvent.from([\n set(\n Object.assign(\n {\n _type: type.name,\n _version: 1,\n ...(value?._key ? {_key: value._key} : {_key: nanoid()}),\n },\n asset\n )\n ),\n ])\n )\n },\n [onChange, type, value?._key]\n )\n\n const action = secrets\n ? () =>\n openMediaSelector(\n secrets.cloudName,\n secrets.apiKey,\n false, // single selection\n handleSelect,\n value\n )\n : () => setShowSettings(true)\n\n return (\n <>\n {showSettings && <SecretsConfigView onClose={() => setShowSettings(false)} />}\n <WidgetInput onSetup={() => setShowSettings(true)} openMediaSelector={action} {...props} />\n </>\n )\n}\n\nexport default CloudinaryInput\n","import React, {useCallback} from 'react'\nimport {ObjectInputProps, PatchEvent, unset} from 'sanity'\nimport {Button, Flex, Grid, Stack} from '@sanity/ui'\nimport {PlugIcon} from '@sanity/icons'\nimport styled from 'styled-components'\nimport AssetPreview from './AssetPreview'\nimport {CloudinaryAsset} from '../typings'\n\nconst SetupButtonContainer = styled.div`\n position: relative;\n display: block;\n font-size: 0.8em;\n transform: translate(0%, -10%);\n`\n\ntype WidgetInputProps = ObjectInputProps & {openMediaSelector: () => void; onSetup: () => void}\n\nconst WidgetInput = (props: WidgetInputProps) => {\n const {onChange, readOnly, value, openMediaSelector} = props\n\n const removeValue = useCallback(() => {\n onChange(PatchEvent.from([unset()]))\n }, [onChange])\n\n return (\n <Stack>\n <SetupButtonContainer>\n <Flex flex={1} justify=\"flex-end\">\n <Button\n color=\"primary\"\n icon={PlugIcon}\n mode=\"bleed\"\n title=\"Configure\"\n onClick={props.onSetup}\n tabIndex={1}\n />\n </Flex>\n </SetupButtonContainer>\n\n <Flex style={{textAlign: 'center'}} marginBottom={2}>\n <AssetPreview value={value as CloudinaryAsset} />\n </Flex>\n\n <Grid gap={1} style={{gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))'}}>\n <Button\n disabled={readOnly}\n mode=\"ghost\"\n title=\"Select an asset\"\n tone=\"default\"\n onClick={openMediaSelector}\n text=\"Select…\"\n />\n <Button\n disabled={readOnly || !value}\n tone=\"critical\"\n mode=\"ghost\"\n title=\"Remove asset\"\n text=\"Remove\"\n onClick={removeValue}\n />\n </Grid>\n </Stack>\n )\n}\n\nexport default WidgetInput\n","import React from 'react'\nimport VideoPlayer from './VideoPlayer'\nimport {assetUrl} from '../utils'\nimport {Box} from '@sanity/ui'\nimport {CloudinaryAsset} from '../typings'\n\ntype ComponentProps = {\n layout?: 'default' | 'block'\n value: CloudinaryAsset | undefined\n}\n\nconst AssetPreview = ({value, layout}: ComponentProps) => {\n const url = value && assetUrl(value)\n if (!value || !url) {\n return null\n }\n\n switch (value.resource_type) {\n case 'video':\n return (\n <Box>\n <VideoPlayer src={url} kind=\"player\" />\n </Box>\n )\n default:\n return (\n <Box>\n <img\n alt=\"preview\"\n src={url}\n style={{\n maxWidth: layout === 'default' ? '80px' : '100%',\n height: 'auto',\n }}\n />\n </Box>\n )\n }\n}\n\nexport default AssetPreview\n","import React, { CSSProperties } from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\ntype PlayerKind = 'player' | 'diff';\n\nexport type VideoPlayerProps = {\n src: string;\n kind: PlayerKind;\n};\n\nexport default class VideoPlayer extends React.Component<\n VideoPlayerProps,\n any\n> {\n videoNode?: HTMLVideoElement;\n player?: VideoJsPlayer;\n\n componentDidMount() {\n const { src } = this.props;\n this.player = videojs(this.videoNode, {\n sources: [{ src }],\n controls: true,\n });\n }\n\n componentWillUnmount() {\n if (this.player) {\n this.player.dispose();\n }\n }\n\n render() {\n const { kind } = this.props;\n const className: Record<PlayerKind, string> = {\n player: 'video-js vjs-16-9 vjs-big-play-centered',\n diff: 'video-js vjs-layout-tiny vjs-fluid',\n };\n\n const style: CSSProperties = { position: 'relative' };\n\n return (\n <div>\n <link\n href=\"https://vjs.zencdn.net/7.8.4/video-js.css\"\n rel=\"stylesheet\"\n />\n <div data-vjs-player>\n <video\n onClick={event => event.stopPropagation()}\n style={kind === 'diff' ? style : {}}\n className={className[kind]}\n ref={node => {\n if (node) {\n this.videoNode = node;\n }\n }}\n ></video>\n </div>\n </div>\n );\n }\n}\n","/* eslint-disable camelcase */\nimport {\n CloudinaryAsset,\n CloudinaryAssetResponse,\n CloudinaryMediaLibrary,\n InsertHandlerParams,\n} from './typings'\n\nconst widgetSrc = 'https://media-library.cloudinary.com/global/all.js'\n\nexport function assetUrl(asset: CloudinaryAsset) {\n if (asset.derived && asset.derived.length > 0) {\n const [derived] = asset.derived\n if (derived.secure_url) {\n return derived.secure_url\n }\n return derived.url\n }\n if (asset.secure_url) {\n return asset.secure_url\n }\n return asset.url\n}\n\nexport const openMediaSelector = (\n cloudName: string,\n apiKey: string,\n multiple: boolean,\n insertHandler: (params: InsertHandlerParams) => void,\n selectedAsset?: CloudinaryAsset\n) => {\n loadJS(widgetSrc, () => {\n const options: Record<string, any> = {\n cloud_name: cloudName,\n api_key: apiKey,\n insert_caption: 'Select',\n multiple,\n }\n\n if (selectedAsset) {\n options.asset = {\n public_id: selectedAsset.public_id,\n type: selectedAsset.type,\n resource_type: selectedAsset.resource_type,\n }\n }\n\n window.cloudinary.openMediaLibrary(options, {insertHandler})\n })\n}\n\nexport const createMediaLibrary = ({\n cloudName,\n apiKey,\n inlineContainer,\n libraryCreated,\n insertHandler,\n}: {\n cloudName: string\n apiKey: string\n inlineContainer: string\n libraryCreated: (library: CloudinaryMediaLibrary) => void\n insertHandler: (params: InsertHandlerParams) => void\n}) => {\n loadJS(widgetSrc, () => {\n const options: Record<string, any> = {\n cloud_name: cloudName,\n api_key: apiKey,\n insert_caption: 'Select',\n inline_container: inlineContainer,\n remove_header: true,\n }\n\n libraryCreated(window.cloudinary.createMediaLibrary(options, {insertHandler}))\n })\n}\n\nexport function loadJS(url: string, callback: () => void) {\n const existingScript = document.getElementById('damWidget')\n if (!existingScript) {\n const script = document.createElement('script')\n script.src = url\n script.id = 'damWidget'\n document.body.appendChild(script)\n script.onload = () => {\n if (callback) {\n return callback()\n }\n return true\n }\n }\n if (existingScript && callback) {\n return callback()\n }\n return true\n}\n\nexport function encodeSourceId(asset: CloudinaryAssetResponse): string {\n const {resource_type, public_id, type} = asset\n return btoa(JSON.stringify({public_id, resource_type, type})) // Sort keys alphabetically!\n}\n\nexport function encodeFilename(asset: CloudinaryAssetResponse) {\n return `${asset.public_id.split('/').slice(-1)[0]}.${asset.format}`\n}\n\nexport function decodeSourceId(sourceId: string): CloudinaryAssetResponse | undefined {\n let sourceIdDecoded: any\n try {\n sourceIdDecoded = JSON.parse(atob(sourceId))\n } catch (err) {\n // Do nothing\n }\n return sourceIdDecoded\n}\n","import React from 'react'\nimport {SettingsView} from '@sanity/studio-secrets'\n\nexport type Secrets = {\n cloudName: string\n apiKey: string\n}\n\nconst pluginConfigKeys = [\n {\n key: 'cloudName',\n title: 'Cloud name',\n description: '',\n },\n {\n key: 'apiKey',\n title: 'API key',\n description: '',\n },\n]\n\nexport const namespace = 'cloudinary'\n\ntype Props = {\n onClose: () => void\n}\n\nconst SecretsConfigView = (props: Props) => {\n return (\n <SettingsView\n title=\"Cloudinary config\"\n namespace={namespace}\n keys={pluginConfigKeys}\n onClose={props.onClose}\n />\n )\n}\n\nexport default SecretsConfigView\n","import React from 'react'\nimport {DiffFromTo} from 'sanity'\nimport VideoPlayer from './VideoPlayer'\nimport {assetUrl} from '../utils'\nimport {CloudinaryAsset} from '../typings'\n\ntype Props = {\n value: CloudinaryAsset | undefined\n}\n\nconst CloudinaryDiffPreview = ({value}: Props) => {\n if (!value) {\n return null\n }\n\n const url = assetUrl(value)\n\n if (value.resource_type === 'video') {\n return (\n <section\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'space-between',\n }}\n >\n <VideoPlayer src={url} kind=\"diff\" />\n </section>\n )\n }\n\n return <img alt=\"preview\" src={url} style={{maxWidth: '100%', height: 'auto'}} />\n}\n\ntype DiffProps = {\n diff: any\n schemaType: any\n}\n\nconst AssetDiff = ({diff, schemaType}: DiffProps) => {\n return <DiffFromTo diff={diff} schemaType={schemaType} previewComponent={CloudinaryDiffPreview} />\n}\n\nexport default AssetDiff\n","import {defineType} from 'sanity'\n\nexport type CloudinaryAssetDerived = {\n raw_transformation: string\n url: string\n secure_url: string\n}\n\nexport const cloudinaryAssetDerivedSchema = defineType({\n type: 'object',\n name: 'cloudinary.assetDerived',\n fields: [\n {\n type: 'string',\n name: 'raw_transformation',\n },\n {\n type: 'url',\n name: 'url',\n },\n {\n type: 'url',\n name: 'secure_url',\n },\n ],\n})\n","import React from 'react'\n\nexport function CloudinaryIcon() {\n return (\n <svg\n version=\"1.1\"\n id=\"Layer_1\"\n x=\"0px\"\n y=\"0px\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 141.732 141.747\"\n enableBackground=\"new 0 0 141.732 141.747\"\n >\n <g>\n <path\n fill=\"#0071CE\"\n d=\"M115.585,109.242c-1.609,0-3.107-1.024-3.635-2.637c-0.657-2.008,0.438-4.169,2.447-4.826\n c7.278-2.382,11.98-8.761,11.98-16.252c0-9.487-7.718-17.206-17.205-17.206c-0.659,0-1.368,0.052-2.231,0.164l-3.741,0.485\n l-0.537-3.735c-2.299-16.016-16.251-28.094-32.454-28.094c-13.395,0-25.32,8.019-30.377,20.43l-0.952,2.335l-2.52,0.046\n c-11.581,0.213-21.003,9.804-21.003,21.379c0,8.45,4.906,16.156,12.498,19.631c1.921,0.88,2.766,3.15,1.886,5.071\n c-0.88,1.921-3.149,2.764-5.07,1.887C14.363,103.202,7.703,92.766,7.703,81.331c0-14.88,11.465-27.345,26.028-28.876\n c6.71-14.03,20.773-22.965,36.477-22.965c18.796,0,35.135,13.178,39.372,31.184c13.519,0.219,24.45,11.284,24.45,24.854\n c0,10.693-6.934,20.146-17.253,23.523C116.382,109.18,115.98,109.242,115.585,109.242z\"\n />\n <path\n fill=\"#DC8327\"\n d=\"M57.12,111.02c-0.001-0.001-0.001-0.001-0.002-0.001c-0.001,0-0.002-0.001-0.003-0.001h-0.001\n c0,0-0.001-0.001-0.001-0.001l-0.001-0.001c0,0-0.001,0-0.001-0.001h-0.001l-0.001-0.001c0.001-0.001-0.001-0.001-0.001-0.001\n l-0.001-0.001c0,0-0.001,0-0.001,0l-0.001-0.001c0.001,0.001-0.001-0.001-0.001-0.001s-0.002-0.001-0.003-0.001l-0.001-0.001H57.1\n c-0.001-0.001-0.001-0.001-0.001-0.001l-0.001-0.001c-0.003-0.001-0.002-0.001-0.003-0.001c-0.001,0.001-0.001-0.001-0.002-0.001\n l-0.001-0.001c0,0-0.001-0.001-0.002-0.001l-0.001-0.001c-0.001-0.001-0.003-0.001-0.004-0.001s-0.003-0.001-0.004-0.001\n c-0.001-0.001-0.001-0.001-0.002-0.001h-0.001c-0.001-0.001-0.002-0.001-0.003-0.001c-0.001-0.001-0.003-0.001-0.003-0.001\n c-0.001,0-0.001,0-0.001,0l-0.002-0.001c-0.001,0-0.001-0.001-0.001-0.001h-0.001c-0.059-0.021-0.122-0.034-0.188-0.037h-0.002\n h-0.002c-0.001,0-0.001,0-0.002,0c0,0,0,0-0.001,0c0,0-0.001,0-0.001,0h-0.001c-0.001-0.001-0.001-0.001-0.001-0.001\n c-0.001,0-0.002,0-0.002,0c-0.001,0-0.002,0-0.002,0h-0.001h-0.001h-0.001c-0.001,0-0.002,0-0.002,0h-0.001H56.86h-0.001h-0.001\n c-0.001,0-0.001,0-0.001,0h-0.001h-0.001h-0.001h-0.001c-0.001,0-0.001,0-0.001,0c-1.656,0-3.011-1.348-3.021-3V74.29h2.567\n c0.004,0,0.009,0,0.013,0c0.393,0.017,0.661-0.285,0.661-0.648c0-0.271-0.166-0.503-0.402-0.6l-12.379-8.544\n c-0.222-0.153-0.515-0.153-0.737,0l-12.476,8.611c-0.234,0.161-0.335,0.456-0.251,0.727c0.085,0.271,0.335,0.455,0.619,0.455h2.58\n l0.002,33.674c0.013,2.328,1.883,4.228,4.262,4.288c0.027,0.003,0.053,0.005,0.08,0.005h18.481c0.004,0,0.007,0,0.011,0\n c0.17-0.003,0.324-0.071,0.438-0.18c0,0,0,0,0.001-0.001c0.002-0.002,0.004-0.004,0.005-0.005c0.001-0.001,0.002-0.001,0.003-0.003\n c0,0,0.001-0.001,0.001-0.001l0.001-0.001l0.001-0.001l0.001-0.001l0.001-0.001c0.001-0.001,0.001-0.001,0.001-0.001\n c0.002-0.001,0.001-0.001,0.002-0.002c0,0,0,0,0.001-0.001l0.001-0.001c0,0,0,0,0.001-0.001c0.112-0.116,0.182-0.273,0.183-0.447\n v-0.002v-0.001v-0.001v-0.001v-0.001v-0.001v-0.001v-0.002C57.498,111.345,57.343,111.121,57.12,111.02z\"\n />\n <path\n fill=\"#F4B21B\"\n d=\"M83.889,111.02c0,0-0.001-0.001-0.002-0.001c-0.001,0-0.002-0.001-0.003-0.001h-0.001\n c-0.001-0.001-0.001-0.001-0.001-0.001l-0.001-0.001h-0.001c0,0-0.001-0.001-0.001-0.001c0,0-0.001-0.001-0.001-0.001\n c0.001-0.001-0.001-0.001-0.002-0.001l-0.001-0.001h-0.001c-0.001,0-0.001-0.001-0.001-0.001c-0.002,0.001-0.002-0.001-0.002-0.001\n l-0.002-0.001l-0.001-0.001h-0.001c0,0-0.001-0.001-0.001-0.001l-0.001-0.001c-0.001-0.001-0.002-0.001-0.002-0.001\n c-0.001,0.001-0.001-0.001-0.003-0.001l-0.001-0.001l-0.001-0.001c0,0-0.001,0-0.002-0.001c-0.001-0.001-0.003-0.001-0.004-0.001\n s-0.003-0.001-0.004-0.001c-0.001-0.001-0.001-0.001-0.002-0.001c-0.001,0-0.001,0-0.002-0.001c0,0-0.001,0-0.002-0.001\n c-0.003-0.001-0.001-0.001-0.002-0.001c-0.003,0-0.001,0-0.002-0.001c0,0-0.001-0.001-0.002-0.001l-0.001-0.001h-0.001\n c-0.059-0.021-0.122-0.034-0.188-0.037h-0.002c-0.001,0-0.001,0-0.001,0c-0.001,0-0.002,0-0.002,0s-0.001,0-0.001,0h-0.001h-0.001\n l-0.001-0.001c-0.001,0-0.002,0-0.002,0c-0.001,0-0.002,0-0.002,0h-0.001c-0.001,0-0.001,0-0.001,0h-0.001\n c-0.001,0-0.002,0-0.002,0s-0.001,0-0.002,0h-0.001c0,0-0.001,0-0.001,0h-0.001c-0.001,0-0.001,0-0.001,0h-0.001h-0.001h-0.001\n h-0.001c-0.001,0-0.001,0-0.001,0c-1.655,0-3.01-1.348-3.02-3V81.829h2.579c0.009-0.001,0.016-0.001,0.026,0\n c0.358,0,0.648-0.29,0.648-0.648c0-0.271-0.166-0.503-0.402-0.6l-12.38-8.544c-0.222-0.153-0.515-0.153-0.737,0L57.86,80.647\n c-0.234,0.161-0.335,0.456-0.251,0.727c0.085,0.271,0.335,0.455,0.619,0.455h2.568l0.002,26.135\n c0.011,2.329,1.884,4.23,4.264,4.289c0.026,0.003,0.052,0.004,0.078,0.004h18.481c0.004,0,0.007,0,0.011,0\n c0.17-0.003,0.324-0.071,0.438-0.18c0,0,0,0,0.001-0.001c0.002-0.002,0.006-0.004,0.005-0.005c0.001-0.001,0.002-0.001,0.003-0.003\n c0.001-0.001,0.001-0.001,0.001-0.001l0.001-0.001l0.001-0.001c0,0,0.001,0,0.001-0.001l0.001-0.001\n c0.001,0,0.001-0.001,0.001-0.001c0.003-0.001,0.002-0.001,0.002-0.002c0,0,0,0,0.001-0.001c0,0,0,0,0.001-0.001\n c0,0,0,0,0.001-0.001c0.112-0.116,0.182-0.273,0.183-0.447v-0.002v-0.001v-0.001v-0.001v-0.001v-0.001v-0.001v-0.002\n C84.267,111.345,84.112,111.121,83.889,111.02z\"\n />\n <path\n fill=\"#F2D864\"\n d=\"M110.667,111.02l-0.002-0.001c-0.001,0-0.002-0.001-0.003-0.001h-0.001\n c-0.001-0.001-0.001-0.001-0.001-0.001l-0.001-0.001c-0.001,0-0.001,0-0.001-0.001h-0.001l-0.001-0.001\n c-0.001-0.001-0.001-0.001-0.001-0.001s-0.001,0-0.001-0.001h-0.001c0,0-0.001-0.001-0.001-0.001\n c-0.001,0.001-0.001-0.001-0.002-0.001c0.001-0.001-0.001-0.001-0.002-0.001l-0.001-0.001c-0.001,0-0.001,0-0.001,0\n c-0.001-0.001-0.001-0.001-0.001-0.001l-0.001-0.001c-0.003-0.001-0.002-0.001-0.002-0.001c-0.001,0.001-0.001-0.001-0.003-0.001\n l-0.001-0.001c0.001-0.001-0.001-0.001-0.002-0.001c0,0-0.001,0-0.001-0.001c-0.001-0.001-0.003-0.001-0.004-0.001\n s-0.003-0.001-0.004-0.001l-0.002-0.001c0,0-0.001,0-0.002-0.001l-0.002-0.001c-0.003-0.001-0.003-0.001-0.002-0.001\n c-0.003,0-0.003,0-0.002-0.001c-0.001,0-0.001-0.001-0.001-0.001c-0.001,0-0.002-0.001-0.002-0.001h-0.001\n c-0.059-0.021-0.122-0.034-0.188-0.037h-0.001c-0.001,0-0.002,0-0.002,0c-0.001,0-0.002,0-0.003,0h-0.001h-0.001h-0.001\n c-0.001-0.001-0.001-0.001-0.002-0.001c0,0-0.001,0-0.002,0c0,0-0.001,0-0.002,0h-0.001c0,0-0.001,0-0.001,0h-0.001\n c-0.001,0-0.002,0-0.002,0h-0.002c0,0,0,0-0.001,0c0,0-0.001,0-0.001,0h-0.001c0,0-0.001,0-0.001,0h-0.001h-0.001h-0.001H110.4\n c0,0-0.001,0-0.001,0c-1.655,0-3.01-1.348-3.02-3V89.365h2.573c0.004,0,0.009,0,0.013,0c0.365-0.009,0.661-0.285,0.661-0.648\n c0-0.271-0.166-0.503-0.402-0.6l-12.38-8.544c-0.221-0.153-0.515-0.153-0.737,0l-12.476,8.61c-0.234,0.161-0.335,0.456-0.251,0.727\n c0.085,0.271,0.335,0.455,0.619,0.455h2.573l0.002,18.599c0.013,2.329,1.885,4.231,4.264,4.289\n c0.026,0.003,0.052,0.004,0.078,0.004h18.481c0.004,0,0.007,0,0.011,0c0.17-0.003,0.324-0.071,0.438-0.18l0.001-0.001\n c0.002-0.002,0.005-0.004,0.005-0.005c0.001-0.001,0.002-0.001,0.003-0.003c0,0,0.001-0.001,0.001-0.001l0.001-0.001l0.001-0.001\n l0.001-0.001l0.001-0.001l0.001-0.001c0.003-0.001,0.001-0.001,0.002-0.002c0,0,0,0,0.001-0.001l0.001-0.001c0,0,0,0,0.001-0.001\n c0.112-0.116,0.182-0.273,0.183-0.447v-0.002v-0.001v-0.001v-0.001v-0.001v-0.001v-0.001v-0.002\n C111.045,111.345,110.889,111.121,110.667,111.02z\"\n />\n </g>\n </svg>\n )\n}\n","/* eslint-disable camelcase */\nimport React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {Box, Button, Dialog, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {CloudinaryMediaLibrary, InsertHandlerParams} from '../../typings'\nimport {createMediaLibrary, decodeSourceId, encodeFilename, encodeSourceId} from '../../utils'\nimport styled from 'styled-components'\nimport {useSecrets} from '@sanity/studio-secrets'\nimport SecretsConfigView, {namespace, Secrets} from '../SecretsConfigView'\nimport {AssetSourceComponentProps, ImageAsset} from 'sanity'\nimport {PlugIcon} from '@sanity/icons'\n\nexport const Widget = styled.div`\n height: 70vh;\n`\n\nexport function CloudinaryAssetSource(props: AssetSourceComponentProps) {\n const {onClose} = props\n\n const [loadingMessage, setLoadingMessage] = useState<string | undefined>(\n 'Loading Cloudinary Media Libary'\n )\n const library = useRef<CloudinaryMediaLibrary | undefined>()\n const contentRef = useRef<HTMLDivElement | null>(null)\n const {secrets} = useSecrets<Secrets>(namespace)\n const cloudName = secrets?.cloudName\n const apiKey = secrets?.apiKey\n const [widgetId] = useState(() => `cloundinaryWidget-${Date.now()}`)\n const [showSettings, setShowSettings] = useState(false)\n\n const propsRef = useRef(props)\n\n useEffect(() => {\n // because we have to access props after loading js in a callback,\n // we cannot pass props as dependecnies as that will cause infinite updates\n // this takes a snapshot of props, so we can access them later\n propsRef.current = props\n }, [props])\n\n const handleClose = useCallback(() => {\n if (library.current) {\n library.current.hide()\n }\n onClose()\n }, [onClose, library])\n\n useEffect(() => {\n if (!cloudName || !apiKey) {\n return\n }\n\n createMediaLibrary({\n cloudName,\n apiKey,\n inlineContainer: `#${widgetId}`,\n libraryCreated: (lib: CloudinaryMediaLibrary) => {\n library.current = lib\n const selectedAssets = propsRef.current.selectedAssets\n const firstSelectedAsset = selectedAssets ? selectedAssets[0] : null\n\n // eslint-disable-next-line no-undef\n const iframe: ChildNode | null | undefined =\n contentRef.current && contentRef.current.firstChild\n if (iframe && iframe instanceof HTMLIFrameElement) {\n setLoadingMessage(undefined)\n let asset\n if (\n propsRef.current.selectionType === 'single' &&\n firstSelectedAsset &&\n firstSelectedAsset.source &&\n firstSelectedAsset.source.id\n ) {\n asset = decodeSourceId(firstSelectedAsset.source.id)\n }\n const folder = asset\n ? {\n path: asset.public_id.split('/').slice(0, -1).join('/'),\n resource_type: 'image',\n }\n : {path: '', resource_type: 'image'}\n if (lib && contentRef.current) {\n lib.show({folder, asset})\n contentRef.current.style.visibility = 'visible'\n }\n }\n },\n insertHandler: ({assets}: InsertHandlerParams) => {\n if (!library.current) {\n return\n }\n const imageAssets = assets.filter((asset) => asset.resource_type === 'image')\n if (imageAssets.length === 0) {\n throw new Error('The selection did not contain any images.')\n }\n library.current.hide()\n propsRef.current.onSelect(\n imageAssets.map((asset) => {\n const url =\n asset.derived && asset.derived[0] ? asset.derived[0].secure_url : asset.secure_url\n return {\n kind: 'url',\n value: url,\n assetDocumentProps: {\n _type: 'sanity.imageAsset',\n originalFilename: encodeFilename(asset),\n source: {\n id: encodeSourceId(asset),\n name: `cloudinary:${cloudName}`,\n },\n } as ImageAsset,\n }\n })\n )\n },\n })\n }, [cloudName, apiKey, widgetId])\n\n const hasConfig = apiKey && cloudName\n return (\n <Dialog\n id=\"cloudinary-asset-source\"\n header=\"Select image from Cloudinary\"\n onClose={handleClose}\n open\n width={4}\n >\n <Box padding={4}>\n {showSettings && <SecretsConfigView onClose={() => setShowSettings(false)} />}\n <Flex flex={1} justify=\"flex-end\">\n <Button\n color=\"primary\"\n icon={PlugIcon}\n mode=\"bleed\"\n title=\"Configure\"\n onClick={() => setShowSettings(true)}\n tabIndex={1}\n text={hasConfig ? undefined : 'Configure Cloudinary plugin'}\n />\n </Flex>\n\n {hasConfig && loadingMessage && (\n <Stack space={3}>\n <Flex align=\"center\" justify=\"center\">\n <Spinner muted />\n </Flex>\n <Text size={1} muted align=\"center\">\n {loadingMessage}\n </Text>\n </Stack>\n )}\n\n <Widget style={{visibility: 'hidden'}} ref={contentRef} id={widgetId} />\n </Box>\n </Dialog>\n )\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AssetSource } from "sanity";
|
|
2
|
+
export const cloudinaryAssetDerivedSchema: {
|
|
3
|
+
type: "object";
|
|
4
|
+
name: "cloudinary.assetDerived";
|
|
5
|
+
} & Omit<import("sanity").ObjectDefinition, "preview"> & {
|
|
6
|
+
preview?: import("sanity").PreviewConfig<Record<string, string>, Record<never, any>> | undefined;
|
|
7
|
+
};
|
|
8
|
+
export const cloudinaryAssetSchema: {
|
|
9
|
+
type: "object";
|
|
10
|
+
name: "cloudinary.asset";
|
|
11
|
+
} & Omit<import("sanity").ObjectDefinition, "preview"> & {
|
|
12
|
+
preview?: import("sanity").PreviewConfig<{
|
|
13
|
+
url: string;
|
|
14
|
+
resource_type: string;
|
|
15
|
+
derived: string;
|
|
16
|
+
}, Record<"url" | "derived" | "resource_type", any>> | undefined;
|
|
17
|
+
};
|
|
18
|
+
export const cloudinarySchemaPlugin: import("sanity").Plugin<void>;
|
|
19
|
+
export const cloudinaryImageSource: AssetSource;
|
|
20
|
+
export const cloudinaryAssetSourcePlugin: import("sanity").Plugin<void>;
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":";ACQA,OAAO,MAAM;;;;;CAiBX,CAAA;AOnBF,OAAO,MAAM;;;;;;;;;CA4FX,CAAA;AG1FF,OAAO,MAAM,qDAKX,CAAA;AAEF,OAAO,MAAM,uBAAuB,WAKnC,CAAA;AAED,OAAO,MAAM,0DAOX,CAAA","sources":["src/src/components/VideoPlayer.tsx","src/src/schema/cloudinaryAssetDerived.ts","src/src/utils.ts","src/src/components/AssetPreview.tsx","src/src/components/WidgetInput.tsx","src/src/components/SecretsConfigView.tsx","src/src/components/CloudinaryInput.tsx","src/src/components/AssetDiff.tsx","src/src/schema/cloudinaryAsset.ts","src/src/components/asset-source/Icon.tsx","src/src/components/asset-source/CloudinaryAssetSource.tsx","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,"import {cloudinaryAssetSchema} from './schema/cloudinaryAsset'\nimport {cloudinaryAssetDerivedSchema} from './schema/cloudinaryAssetDerived'\nimport {createPlugin, AssetSource} from 'sanity'\nimport {CloudinaryIcon} from './components/asset-source/Icon'\nimport {CloudinaryAssetSource} from './components/asset-source/CloudinaryAssetSource'\n\nexport {cloudinaryAssetSchema, cloudinaryAssetDerivedSchema}\n\nexport const cloudinarySchemaPlugin = createPlugin({\n name: 'cloudinary-schema',\n schema: {\n types: [cloudinaryAssetSchema, cloudinaryAssetDerivedSchema],\n },\n})\n\nexport const cloudinaryImageSource: AssetSource = {\n name: 'cloudinary-image',\n title: 'Cloudinary',\n icon: CloudinaryIcon,\n component: CloudinaryAssetSource,\n}\n\nexport const cloudinaryAssetSourcePlugin = createPlugin({\n name: 'cloudinart-asset-source',\n form: {\n image: {\n assetSources: [cloudinaryImageSource],\n },\n },\n})\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../"}
|
package/package.json
CHANGED
|
@@ -1,60 +1,86 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"name": "sanity-plugin-cloudinary",
|
|
3
|
+
"version": "1.0.0-v3-studio.2",
|
|
4
|
+
"description": "> **NOTE**",
|
|
5
|
+
"author": "Sanity.io <hello@sanity.io>",
|
|
3
6
|
"license": "MIT",
|
|
7
|
+
"source": "./src/index.ts",
|
|
8
|
+
"main": "./lib/cjs/index.js",
|
|
9
|
+
"module": "./lib/esm/index.js",
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"require": "./lib/cjs/index.js",
|
|
14
|
+
"default": "./lib/esm/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
4
17
|
"files": [
|
|
5
|
-
"
|
|
18
|
+
"src",
|
|
19
|
+
"lib",
|
|
20
|
+
"v2-incompatible.js",
|
|
6
21
|
"sanity.json"
|
|
7
22
|
],
|
|
8
23
|
"engines": {
|
|
9
|
-
"node": ">=
|
|
24
|
+
"node": ">=14.0.0"
|
|
10
25
|
},
|
|
11
26
|
"scripts": {
|
|
12
|
-
"build": "
|
|
13
|
-
"
|
|
27
|
+
"build": "parcel build --no-cache",
|
|
28
|
+
"watch": "parcel watch",
|
|
29
|
+
"prepublishOnly": "npm run build",
|
|
30
|
+
"clean": "rimraf lib",
|
|
31
|
+
"lint": "eslint .",
|
|
32
|
+
"prebuild": "npm run clean && plugin-kit verify-package --silent",
|
|
33
|
+
"link-watch": "plugin-kit link-watch",
|
|
34
|
+
"prepare": "husky install"
|
|
14
35
|
},
|
|
15
36
|
"peerDependencies": {
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"react": "^17.0",
|
|
20
|
-
"react-dom": "^17.0"
|
|
21
|
-
},
|
|
22
|
-
"husky": {
|
|
23
|
-
"hooks": {
|
|
24
|
-
"pre-commit": "sanipack verify"
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"prettier": {
|
|
28
|
-
"printWidth": 80,
|
|
29
|
-
"semi": true,
|
|
30
|
-
"singleQuote": true,
|
|
31
|
-
"trailingComma": "es5"
|
|
37
|
+
"react": "^18.0.0",
|
|
38
|
+
"react-dom": "^18.0.0",
|
|
39
|
+
"sanity": "dev-preview || 3.0.0-dev-preview.22"
|
|
32
40
|
},
|
|
33
|
-
"name": "sanity-plugin-cloudinary",
|
|
34
|
-
"author": "Sanity.io <hello@sanity.io>",
|
|
35
41
|
"devDependencies": {
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"@
|
|
39
|
-
"@
|
|
40
|
-
"@
|
|
41
|
-
"@
|
|
42
|
+
"@commitlint/cli": "^17.1.2",
|
|
43
|
+
"@commitlint/config-conventional": "^17.1.0",
|
|
44
|
+
"@parcel/packager-ts": "^2.6.2",
|
|
45
|
+
"@parcel/transformer-typescript-types": "^2.6.2",
|
|
46
|
+
"@sanity/plugin-kit": "^1.0.2",
|
|
47
|
+
"@sanity/semantic-release-preset": "^2.0.2",
|
|
48
|
+
"@types/react": "^18.0.0",
|
|
49
|
+
"@types/styled-components": "^5.1.26",
|
|
42
50
|
"@types/video.js": "^7.3.15",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^5.41.0",
|
|
52
|
+
"@typescript-eslint/parser": "^5.41.0",
|
|
53
|
+
"eslint": "^8.26.0",
|
|
54
|
+
"eslint-config-prettier": "^8.5.0",
|
|
55
|
+
"eslint-config-sanity": "^6.0.0",
|
|
56
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
57
|
+
"eslint-plugin-react": "^7.31.10",
|
|
58
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
59
|
+
"husky": "^8.0.1",
|
|
60
|
+
"lint-staged": "^13.0.3",
|
|
61
|
+
"parcel": "~2.6.0",
|
|
46
62
|
"postcss": "^8.0.0",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"typescript": "^4.2.2"
|
|
63
|
+
"prettier": "^2.7.1",
|
|
64
|
+
"react": "^18.0.0",
|
|
65
|
+
"rimraf": "^3.0.2",
|
|
66
|
+
"sanity": "dev-preview || 3.0.0-dev-preview.22",
|
|
67
|
+
"typescript": "~4.7.0"
|
|
53
68
|
},
|
|
54
69
|
"dependencies": {
|
|
70
|
+
"@sanity/icons": "^1.3.6",
|
|
71
|
+
"@sanity/incompatible-plugin": "^1.0.4",
|
|
72
|
+
"@sanity/studio-secrets": "^2.0.0-v3-studio.6",
|
|
73
|
+
"@sanity/ui": "^1.0.0-beta.31",
|
|
55
74
|
"nanoid": "^3.1.22",
|
|
56
|
-
"sanity-secrets": "^0.0.3",
|
|
57
75
|
"styled-components": "^5.2.1",
|
|
58
76
|
"video.js": "^7.11.7"
|
|
59
|
-
}
|
|
77
|
+
},
|
|
78
|
+
"repository": {
|
|
79
|
+
"type": "git",
|
|
80
|
+
"url": "git@github.com:sanity-io/sanity-plugin-cloudinary.git"
|
|
81
|
+
},
|
|
82
|
+
"bugs": {
|
|
83
|
+
"url": "https://github.com/sanity-io/sanity-plugin-cloudinary/issues"
|
|
84
|
+
},
|
|
85
|
+
"homepage": "https://github.com/sanity-io/sanity-plugin-cloudinary#readme"
|
|
60
86
|
}
|
package/sanity.json
CHANGED
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"paths": {
|
|
3
|
-
"source": "src",
|
|
4
|
-
"compiled": "dist"
|
|
5
|
-
},
|
|
6
2
|
"parts": [
|
|
7
3
|
{
|
|
8
|
-
"implements": "part:@sanity/base/
|
|
9
|
-
"path": "
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"implements": "part:@sanity/base/schema-type",
|
|
13
|
-
"path": "schema/cloudinaryAsset"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"implements": "part:@sanity/form-builder/input/array/functions",
|
|
17
|
-
"path": "arrayFunctions"
|
|
4
|
+
"implements": "part:@sanity/base/sanity-root",
|
|
5
|
+
"path": "./v2-incompatible.js"
|
|
18
6
|
}
|
|
19
7
|
]
|
|
20
|
-
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {Button} from '@sanity/ui'
|
|
3
|
+
import {PatchEvent, setIfMissing, insert} from 'sanity'
|
|
4
|
+
|
|
5
|
+
import {useSecrets} from '@sanity/studio-secrets'
|
|
6
|
+
import SecretsConfigView, {namespace} from './components/SecretsConfigView'
|
|
7
|
+
import {cloudinaryAssetSchema} from './schema/cloudinaryAsset'
|
|
8
|
+
import {openMediaSelector} from './utils'
|
|
9
|
+
import {InsertHandlerParams} from './typings'
|
|
10
|
+
|
|
11
|
+
interface ApiConfig {
|
|
12
|
+
cloudName: string
|
|
13
|
+
apiKey: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const AssetListFunctions = (props: any) => {
|
|
17
|
+
const {secrets, loading} = useSecrets<ApiConfig>(namespace)
|
|
18
|
+
const [showSettings, setShowSettings] = React.useState(false)
|
|
19
|
+
|
|
20
|
+
const cloudinaryType = props.type.of.find(
|
|
21
|
+
(t: {name: string}) => t.name === cloudinaryAssetSchema.name
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
const handleSelect = (selected: InsertHandlerParams) => {
|
|
25
|
+
const {onCreateValue, onChange} = props
|
|
26
|
+
const items = selected.assets.map((asset) =>
|
|
27
|
+
Object.assign(
|
|
28
|
+
{},
|
|
29
|
+
asset,
|
|
30
|
+
{
|
|
31
|
+
// Schema version. In case we ever change our schema.
|
|
32
|
+
_version: 1,
|
|
33
|
+
},
|
|
34
|
+
onCreateValue(cloudinaryType)
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
onChange(PatchEvent.from([setIfMissing([]), insert(items, 'after', [-1])]))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const actions = (
|
|
41
|
+
<>
|
|
42
|
+
<Button
|
|
43
|
+
disabled={props.readOnly || loading}
|
|
44
|
+
mode="ghost"
|
|
45
|
+
onClick={() =>
|
|
46
|
+
secrets &&
|
|
47
|
+
openMediaSelector(
|
|
48
|
+
secrets.cloudName,
|
|
49
|
+
secrets.apiKey,
|
|
50
|
+
true, // multi-selection
|
|
51
|
+
handleSelect
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
>
|
|
55
|
+
Add multiple
|
|
56
|
+
</Button>
|
|
57
|
+
<Button onClick={() => setShowSettings(true)}>Configure</Button>
|
|
58
|
+
</>
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<>
|
|
63
|
+
{showSettings && <SecretsConfigView onClose={() => setShowSettings(false)} />}
|
|
64
|
+
{/* <DefaultArrayFunctions {...props}>*/}
|
|
65
|
+
{cloudinaryType && actions}
|
|
66
|
+
{/* </DefaultArrayFunctions>*/}
|
|
67
|
+
</>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default AssetListFunctions
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {DiffFromTo} from 'sanity'
|
|
3
|
+
import VideoPlayer from './VideoPlayer'
|
|
4
|
+
import {assetUrl} from '../utils'
|
|
5
|
+
import {CloudinaryAsset} from '../typings'
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
value: CloudinaryAsset | undefined
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const CloudinaryDiffPreview = ({value}: Props) => {
|
|
12
|
+
if (!value) {
|
|
13
|
+
return null
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const url = assetUrl(value)
|
|
17
|
+
|
|
18
|
+
if (value.resource_type === 'video') {
|
|
19
|
+
return (
|
|
20
|
+
<section
|
|
21
|
+
style={{
|
|
22
|
+
display: 'flex',
|
|
23
|
+
flexWrap: 'wrap',
|
|
24
|
+
justifyContent: 'space-between',
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
<VideoPlayer src={url} kind="diff" />
|
|
28
|
+
</section>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return <img alt="preview" src={url} style={{maxWidth: '100%', height: 'auto'}} />
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type DiffProps = {
|
|
36
|
+
diff: any
|
|
37
|
+
schemaType: any
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const AssetDiff = ({diff, schemaType}: DiffProps) => {
|
|
41
|
+
return <DiffFromTo diff={diff} schemaType={schemaType} previewComponent={CloudinaryDiffPreview} />
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default AssetDiff
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import VideoPlayer from './VideoPlayer'
|
|
3
|
+
import {assetUrl} from '../utils'
|
|
4
|
+
import {Box} from '@sanity/ui'
|
|
5
|
+
import {CloudinaryAsset} from '../typings'
|
|
6
|
+
|
|
7
|
+
type ComponentProps = {
|
|
8
|
+
layout?: 'default' | 'block'
|
|
9
|
+
value: CloudinaryAsset | undefined
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const AssetPreview = ({value, layout}: ComponentProps) => {
|
|
13
|
+
const url = value && assetUrl(value)
|
|
14
|
+
if (!value || !url) {
|
|
15
|
+
return null
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
switch (value.resource_type) {
|
|
19
|
+
case 'video':
|
|
20
|
+
return (
|
|
21
|
+
<Box>
|
|
22
|
+
<VideoPlayer src={url} kind="player" />
|
|
23
|
+
</Box>
|
|
24
|
+
)
|
|
25
|
+
default:
|
|
26
|
+
return (
|
|
27
|
+
<Box>
|
|
28
|
+
<img
|
|
29
|
+
alt="preview"
|
|
30
|
+
src={url}
|
|
31
|
+
style={{
|
|
32
|
+
maxWidth: layout === 'default' ? '80px' : '100%',
|
|
33
|
+
height: 'auto',
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
36
|
+
</Box>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default AssetPreview
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React, {useCallback, useState} from 'react'
|
|
2
|
+
import WidgetInput from './WidgetInput'
|
|
3
|
+
import {nanoid} from 'nanoid'
|
|
4
|
+
import {ObjectInputProps, PatchEvent, set} from 'sanity'
|
|
5
|
+
import {CloudinaryAsset} from '../typings'
|
|
6
|
+
import {useSecrets} from '@sanity/studio-secrets'
|
|
7
|
+
import {InsertHandlerParams} from '../typings'
|
|
8
|
+
import {openMediaSelector} from '../utils'
|
|
9
|
+
import SecretsConfigView, {namespace, Secrets} from './SecretsConfigView'
|
|
10
|
+
|
|
11
|
+
const CloudinaryInput = (props: ObjectInputProps) => {
|
|
12
|
+
const [showSettings, setShowSettings] = useState(false)
|
|
13
|
+
const {secrets} = useSecrets<Secrets>(namespace)
|
|
14
|
+
const {onChange, schemaType: type} = props
|
|
15
|
+
const value = (props.value as CloudinaryAsset) || undefined
|
|
16
|
+
|
|
17
|
+
const handleSelect = useCallback(
|
|
18
|
+
(payload: InsertHandlerParams) => {
|
|
19
|
+
const [asset] = payload.assets
|
|
20
|
+
if (!asset) {
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
onChange(
|
|
25
|
+
PatchEvent.from([
|
|
26
|
+
set(
|
|
27
|
+
Object.assign(
|
|
28
|
+
{
|
|
29
|
+
_type: type.name,
|
|
30
|
+
_version: 1,
|
|
31
|
+
...(value?._key ? {_key: value._key} : {_key: nanoid()}),
|
|
32
|
+
},
|
|
33
|
+
asset
|
|
34
|
+
)
|
|
35
|
+
),
|
|
36
|
+
])
|
|
37
|
+
)
|
|
38
|
+
},
|
|
39
|
+
[onChange, type, value?._key]
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
const action = secrets
|
|
43
|
+
? () =>
|
|
44
|
+
openMediaSelector(
|
|
45
|
+
secrets.cloudName,
|
|
46
|
+
secrets.apiKey,
|
|
47
|
+
false, // single selection
|
|
48
|
+
handleSelect,
|
|
49
|
+
value
|
|
50
|
+
)
|
|
51
|
+
: () => setShowSettings(true)
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<>
|
|
55
|
+
{showSettings && <SecretsConfigView onClose={() => setShowSettings(false)} />}
|
|
56
|
+
<WidgetInput onSetup={() => setShowSettings(true)} openMediaSelector={action} {...props} />
|
|
57
|
+
</>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default CloudinaryInput
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {SettingsView} from '@sanity/studio-secrets'
|
|
3
|
+
|
|
4
|
+
export type Secrets = {
|
|
5
|
+
cloudName: string
|
|
6
|
+
apiKey: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const pluginConfigKeys = [
|
|
10
|
+
{
|
|
11
|
+
key: 'cloudName',
|
|
12
|
+
title: 'Cloud name',
|
|
13
|
+
description: '',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
key: 'apiKey',
|
|
17
|
+
title: 'API key',
|
|
18
|
+
description: '',
|
|
19
|
+
},
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
export const namespace = 'cloudinary'
|
|
23
|
+
|
|
24
|
+
type Props = {
|
|
25
|
+
onClose: () => void
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const SecretsConfigView = (props: Props) => {
|
|
29
|
+
return (
|
|
30
|
+
<SettingsView
|
|
31
|
+
title="Cloudinary config"
|
|
32
|
+
namespace={namespace}
|
|
33
|
+
keys={pluginConfigKeys}
|
|
34
|
+
onClose={props.onClose}
|
|
35
|
+
/>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default SecretsConfigView
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React, { CSSProperties } from 'react';
|
|
2
|
+
import videojs, { VideoJsPlayer } from 'video.js';
|
|
3
|
+
|
|
4
|
+
type PlayerKind = 'player' | 'diff';
|
|
5
|
+
|
|
6
|
+
export type VideoPlayerProps = {
|
|
7
|
+
src: string;
|
|
8
|
+
kind: PlayerKind;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default class VideoPlayer extends React.Component<
|
|
12
|
+
VideoPlayerProps,
|
|
13
|
+
any
|
|
14
|
+
> {
|
|
15
|
+
videoNode?: HTMLVideoElement;
|
|
16
|
+
player?: VideoJsPlayer;
|
|
17
|
+
|
|
18
|
+
componentDidMount() {
|
|
19
|
+
const { src } = this.props;
|
|
20
|
+
this.player = videojs(this.videoNode, {
|
|
21
|
+
sources: [{ src }],
|
|
22
|
+
controls: true,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
componentWillUnmount() {
|
|
27
|
+
if (this.player) {
|
|
28
|
+
this.player.dispose();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
render() {
|
|
33
|
+
const { kind } = this.props;
|
|
34
|
+
const className: Record<PlayerKind, string> = {
|
|
35
|
+
player: 'video-js vjs-16-9 vjs-big-play-centered',
|
|
36
|
+
diff: 'video-js vjs-layout-tiny vjs-fluid',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const style: CSSProperties = { position: 'relative' };
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<div>
|
|
43
|
+
<link
|
|
44
|
+
href="https://vjs.zencdn.net/7.8.4/video-js.css"
|
|
45
|
+
rel="stylesheet"
|
|
46
|
+
/>
|
|
47
|
+
<div data-vjs-player>
|
|
48
|
+
<video
|
|
49
|
+
onClick={event => event.stopPropagation()}
|
|
50
|
+
style={kind === 'diff' ? style : {}}
|
|
51
|
+
className={className[kind]}
|
|
52
|
+
ref={node => {
|
|
53
|
+
if (node) {
|
|
54
|
+
this.videoNode = node;
|
|
55
|
+
}
|
|
56
|
+
}}
|
|
57
|
+
></video>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
}
|