UNPKG

sanity-plugin-wistia-input

Version:
1 lines 23.8 kB
{"version":3,"file":"index.mjs","sources":["../src/schema.tsx","../src/components/Projects.tsx","../src/components/Videos.tsx","../src/components/Player.tsx","../src/components/AssetMenu.tsx","../src/components/Input.tsx","../src/plugin.tsx","../src/index.ts"],"sourcesContent":["export const wistiaMedia = {\n name: 'wistiaMedia',\n type: 'object',\n title: 'Wistia media',\n fields: [\n {\n type: 'number',\n name: 'id',\n },\n {\n type: 'string',\n name: 'hashed_id',\n },\n ],\n preview: {\n select: {\n title: 'id',\n },\n prepare({ title }: { title: String }) {\n return {\n title: `Wistia video ID: ${title}`\n }\n }\n }\n}","import {useEffect, useState} from 'react'\nimport {Spinner, Card, Flex, Text, Box, Menu, MenuItem, Tooltip} from '@sanity/ui'\nimport {LockIcon} from '@sanity/icons'\n\nimport {Config, WistaAPIProject} from '../types'\n\nconst WistiaProjectsComponent = ({\n onProjectClick,\n config,\n}: {\n onProjectClick: Function\n config: Config\n}) => {\n const [wistiaProjects, setWistiaProjects] = useState<WistaAPIProject[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n\n const handleProjectClick = (projectId: number) => {\n onProjectClick(projectId)\n }\n\n useEffect(() => {\n setLoading(true)\n\n const apiUrl = 'https://api.wistia.com/v1/projects.json?sort_by=updated&sort_direction=0'\n\n const headers = new Headers({\n Authorization: `Bearer ${config.token}`,\n })\n\n fetch(apiUrl, {\n method: 'GET',\n headers: headers,\n })\n .then((response) => {\n if (!response.ok) {\n if (response?.status === 401) {\n setError('401 Not authorised - check your API key permissions.')\n } else {\n setError(`${response?.status} error`)\n }\n }\n\n setLoading(false)\n return response.json()\n })\n .then((data) => setWistiaProjects(data))\n .catch((error) => console.error(error))\n }, [])\n\n if (error) {\n return (\n <Box padding={3}>\n <Card padding={[3, 3, 4]} radius={2} shadow={1} tone=\"critical\">\n <Text align=\"center\">{error}</Text>\n </Card>\n </Box>\n )\n }\n\n return (\n <Box padding={1}>\n <Menu>\n {loading && (\n <Card padding={4}>\n <Flex align=\"center\" direction=\"column\" gap={3} height=\"fill\" justify=\"center\">\n <Spinner muted />\n <Text muted size={1}>\n Loading projects from Wistia…\n </Text>\n </Flex>\n </Card>\n )}\n\n {wistiaProjects?.length\n ? wistiaProjects?.map((project: WistaAPIProject) => (\n <MenuItem\n key={project.id}\n style={{cursor: 'pointer'}}\n onClick={() => handleProjectClick(project.id)}\n >\n <Box padding={1}>\n <Flex justify=\"space-between\" gap={2}>\n <Text weight=\"semibold\">\n {project.name}\n\n {!project.public && (\n <Tooltip\n content={\n <Box padding={2}>\n <Text muted size={1}>\n This project is private\n </Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <LockIcon style={{marginLeft: 5}} />\n </Tooltip>\n )}\n </Text>\n <Text muted={true}>{project.mediaCount}</Text>\n </Flex>\n </Box>\n </MenuItem>\n ))\n : !loading && (\n <Card padding={4}>\n <Text align=\"center\" muted size={1}>\n No projects found.\n </Text>\n </Card>\n )}\n </Menu>\n </Box>\n )\n}\n\nexport default WistiaProjectsComponent\n","import {useEffect, useState} from 'react'\nimport {Spinner, Card, Flex, Text, Box, Menu, MenuItem, Heading} from '@sanity/ui'\nimport {WistiaMedia, WistiaAPIMedias, WistaMediasGrouped, Config} from '../types'\n\nconst groupBy = (array: Array<WistiaAPIMedias>, key: string) => {\n return array.reduce((rv: any, x: any) => {\n ;(rv[x[key]] = rv[x[key]] || []).push(x)\n return rv\n }, {})\n}\n\nconst wistiaMediasComponent = ({\n onVideoClick,\n projectId,\n config,\n}: {\n onVideoClick: Function\n projectId: number\n config: Config\n}) => {\n const [wistiaMedias, setwistiaMedias] = useState<WistaMediasGrouped>({})\n const [loading, setLoading] = useState(false)\n\n const handleVideoClick = (media: WistiaMedia) => {\n onVideoClick(media)\n }\n\n useEffect(() => {\n if (projectId) {\n setLoading(true)\n\n const apiUrl = `https://api.wistia.com/v1/medias.json?project_id=${projectId}&sort_by=name`\n\n const headers = new Headers({\n Authorization: `Bearer ${config.token}`,\n })\n\n fetch(apiUrl, {\n method: 'GET',\n headers: headers,\n })\n .then((response) => response.json())\n .then((data) => {\n setLoading(false)\n let grouped = groupBy(data, 'section')\n return setwistiaMedias(grouped)\n })\n .catch((error) => console.error(error))\n }\n }, [])\n\n return (\n <Box padding={1}>\n <Menu>\n {!projectId && <div>Error loading project</div>}\n\n {loading && (\n <Card padding={4}>\n <Flex align=\"center\" direction=\"column\" gap={3} height=\"fill\" justify=\"center\">\n <Spinner muted />\n <Text muted size={1}>\n Loading media from Wistia…\n </Text>\n </Flex>\n </Card>\n )}\n\n {Object.keys(wistiaMedias)?.length\n ? Object.keys(wistiaMedias)?.map((section, index) => (\n <div key={projectId + index}>\n {section !== 'undefined' && (\n <Card padding={3}>\n <Heading as=\"h2\" size={1}>\n {section}\n </Heading>\n </Card>\n )}\n {wistiaMedias[section].map((media: WistiaAPIMedias) => (\n <MenuItem\n paddingX={3}\n paddingY={2}\n key={media.id}\n style={{cursor: 'pointer'}}\n onClick={() => handleVideoClick({id: media.id, hashed_id: media.hashed_id})}\n >\n <Flex gap={3} align=\"center\">\n <img src={media.thumbnail.url} width=\"70\" style={{borderRadius: 3}} />\n <Text size={1} weight=\"semibold\" align={'left'}>\n {media.name}\n </Text>\n <Text size={1} style={{marginLeft: 'auto'}} muted={true}>\n {new Date(media.duration * 1000).toISOString().slice(11, 19)}\n </Text>\n </Flex>\n </MenuItem>\n ))}\n </div>\n ))\n : !loading && (\n <Card padding={4}>\n <Text align=\"center\" muted size={1}>\n No media found.\n </Text>\n </Card>\n )}\n </Menu>\n </Box>\n )\n}\n\nexport default wistiaMediasComponent\n","const playerUrl = (videoUrl: string) => {\n let params = new URLSearchParams()\n\n // https://wistia.com/support/developers/embed-options#options\n let wistiaSettings: any = {\n playbar: true,\n playButton: true,\n seo: false,\n controlsVisibleOnLoad: true,\n autoPlay: false,\n doNotTrack: true,\n preload: 'none',\n volumeControl: true,\n copyLinkAndThumbnailEnabled: true,\n fullscreenButton: true,\n }\n\n for (let key in wistiaSettings) {\n params.append(key, wistiaSettings[key])\n }\n\n return `${videoUrl}?${params.toString()}`\n}\n\nexport function Player({videoUrl}: {videoUrl: string}) {\n return (\n <div\n style={{\n position: 'relative',\n paddingTop: '56.25%',\n height: '0',\n }}\n >\n <iframe\n allow=\"autoplay; fullscreen\"\n style={{\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: '0',\n right: '0',\n bottom: '0',\n left: '0',\n border: '0',\n display: 'block',\n borderRadius: '3px',\n }}\n src={playerUrl(videoUrl) || ''}\n />\n </div>\n )\n}\n","import {Button, MenuButton, Menu, MenuItem, MenuDivider} from '@sanity/ui'\nimport {EllipsisVerticalIcon, ResetIcon, ClipboardIcon, SearchIcon} from '@sanity/icons'\n\nimport {AssetMediaActions} from '../types'\n\nexport function AssetMenu({onAction}: {onAction: (action: AssetMediaActions) => void}) {\n return (\n <MenuButton\n button={<Button padding={2} mode=\"ghost\" icon={EllipsisVerticalIcon} tone=\"default\" />}\n id=\"asset-menu\"\n menu={\n <Menu>\n <MenuItem\n text=\"Replace media\"\n icon={SearchIcon}\n onClick={() => {\n onAction({type: 'select'})\n }}\n />\n <MenuItem\n text=\"Copy embed URL\"\n icon={ClipboardIcon}\n onClick={() => {\n onAction({type: 'copyUrl'})\n }}\n />\n <MenuDivider />\n <MenuItem\n text=\"Clear field\"\n icon={ResetIcon}\n tone=\"critical\"\n onClick={() => {\n onAction({type: 'delete'})\n }}\n />\n </Menu>\n }\n />\n )\n}\n","import {useState, useCallback} from 'react'\nimport {Button, Dialog, Card, Flex, Text, useToast} from '@sanity/ui'\nimport {DocumentVideoIcon, ChevronLeftIcon, PlayIcon} from '@sanity/icons'\nimport {set, unset, setIfMissing} from 'sanity'\n\nimport {AssetMediaActions, WistiaMedia, WistiaInputProps} from '../types'\n\nimport Projects from './Projects'\nimport Videos from './Videos'\n\nimport {Player} from './Player'\nimport {AssetMenu} from './AssetMenu'\n\nconst WistiaInputComponent = (props: WistiaInputProps) => {\n const {\n value,\n onChange,\n config,\n schemaType,\n } = props\n\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [selectedProjectId, setSelectedProjectId] = useState(0)\n \n const handleChange = useCallback(\n (newValue: WistiaMedia) => {\n setIsModalOpen(false)\n\n onChange([\n setIfMissing({\n _type: schemaType.name,\n }),\n set(newValue.hashed_id, ['hashed_id']),\n set(newValue.id, ['id']),\n ])\n },\n [onChange, schemaType],\n )\n\n const handleProjectClick = (projectId: number) => {\n setSelectedProjectId(projectId)\n }\n\n const handleAssetMenu = (action: AssetMediaActions) => {\n switch (action?.type) {\n case 'copyUrl':\n handleCopyURL()\n break\n case 'delete':\n handleChange({})\n break\n case 'select':\n setIsModalOpen(true)\n break\n }\n }\n\n const videoUrl = value?.hashed_id\n ? `https://fast.wistia.net/embed/iframe/${value.hashed_id}`\n : null\n\n const {push: pushToast} = useToast()\n\n const handleCopyURL = useCallback(() => {\n navigator.clipboard.writeText(videoUrl || '')\n pushToast({closable: true, status: 'success', title: 'The URL is copied to the clipboard'})\n }, [pushToast, videoUrl])\n\n const toggleModal = () => {\n setIsModalOpen(!isModalOpen)\n }\n\n if (!config?.token?.length) {\n return (\n <Card padding={[3, 3, 4]} radius={2} shadow={1} tone=\"critical\">\n <Text align=\"center\">\n Missing required API token in Sanity config.{' '}\n <a href=\"https://wistia.com/support/developers/making-api-requests\">\n See Wistia documentation.\n </a>\n </Text>\n </Card>\n )\n }\n\n return (\n <div style={{padding: 1}}>\n {videoUrl ? (\n <Card radius={2} shadow={1} padding={2}>\n <Flex justify=\"space-between\" align=\"center\" gap={2} marginBottom={2}>\n <Text size={1} weight=\"semibold\" cellPadding={2}>\n <PlayIcon style={{marginLeft: 3, marginRight: 3}} />\n Wistia video ID: {value?.id}\n </Text>\n <AssetMenu onAction={handleAssetMenu} />\n </Flex>\n\n <Player videoUrl={videoUrl || ''} />\n </Card>\n ) : (\n <Card tone={'inherit'} border padding={[3, 5]} style={{borderStyle: 'dashed'}}>\n <Flex align={'center'} direction={'column'} gap={4}>\n <Text muted>\n <DocumentVideoIcon />\n </Text>\n\n <Text size={1} muted>\n Select a media from Wistia\n </Text>\n\n <Button mode=\"ghost\" text=\"Select media\" onClick={toggleModal} />\n </Flex>\n </Card>\n )}\n\n {isModalOpen && (\n <Dialog\n header={selectedProjectId ? 'Select media' : 'Select project'}\n id=\"wistia-projects\"\n onClose={toggleModal}\n width={1}\n >\n {!selectedProjectId ? (\n <Projects config={config} onProjectClick={handleProjectClick} />\n ) : (\n <div>\n <Card tone=\"default\" borderBottom={true} padding={4}>\n <Button\n icon={ChevronLeftIcon}\n onClick={() => handleProjectClick(0)}\n mode=\"ghost\"\n text=\"Back to projects\"\n />\n </Card>\n <Videos config={config} projectId={selectedProjectId} onVideoClick={handleChange} />\n </div>\n )}\n </Dialog>\n )}\n </div>\n )\n}\n\nexport default WistiaInputComponent\n","import {ObjectInputProps} from 'sanity'\n\nimport Input from './components/Input'\n\nimport {Config} from './types'\n\nexport function wistiaMediaRender(config: Config) {\n return {\n components: {\n input: (props: ObjectInputProps) => <Input config={config} {...props} />,\n },\n }\n}\n","import {definePlugin} from 'sanity'\n\nimport {Config} from './types'\nimport {wistiaMedia} from './schema'\nimport {wistiaMediaRender} from './plugin'\n\n/**\n * Wistia input plugin for Sanity Studio\n * @public\n */\nexport const wistiaInput = definePlugin<Config>((config) => ({\n name: 'sanity-plugin-wistia-input',\n schema: {\n types: [\n {\n ...wistiaMedia,\n ...wistiaMediaRender(config),\n },\n ],\n },\n}))\n"],"names":["error","Videos","Projects","Input"],"mappings":"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"}