sanity-plugin-wistia-input
Version:
Wistia input for Sanity v5
1 lines • 39.9 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/schema.tsx","../src/components/Player.tsx","../src/components/Folder.tsx","../src/components/Medias.tsx","../src/hooks/useWistiaData.ts","../src/components/Input.tsx","../src/components/Preview.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: 'title',\n subtitle: 'hashed_id',\n },\n prepare({title, subtitle}: {title: string; subtitle: string}) {\n return {\n title: title || 'Wistia media',\n subtitle,\n }\n },\n },\n}\n","const playerUrl = (mediaUrl: 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 wmode: 'transparent',\n videoFoam: false,\n fitStrategy: 'fill',\n }\n\n for (let key in wistiaSettings) {\n params.append(key, wistiaSettings[key])\n }\n\n return `${mediaUrl}?${params.toString()}`\n}\n\nexport function Player({mediaUrl}: {mediaUrl: string}) {\n return (\n <div\n style={{\n width: '100%',\n borderRadius: '3px',\n overflow: 'hidden',\n }}\n >\n {mediaUrl && \n <iframe\n allow=\"autoplay; fullscreen;\"\n allow-transparency=\"true\"\n width=\"100%\"\n style={{\n aspectRatio: '16/9',\n border: 0,\n display: 'block',\n }}\n src={playerUrl(mediaUrl)}\n />\n }\n </div>\n )\n}\n","import {memo, useState} from 'react'\nimport {Spinner, Card, Flex, Text, Box, Tooltip, Button, Badge, Stack} from '@sanity/ui'\nimport {LockIcon, LaunchIcon, FolderIcon} from '@sanity/icons'\n\nimport {Config, WistaAPIFolder} from '../types'\n\nconst WistiaFoldersComponent = ({\n folders,\n loadingFolderId,\n error,\n hasMore,\n loadingMore,\n onFolderClick,\n onLoadMore,\n config,\n}: {\n folders: WistaAPIFolder[]\n loadingFolderId: number | null\n error: string\n hasMore: boolean\n loadingMore: boolean\n onFolderClick: (folder: WistaAPIFolder) => void\n onLoadMore: () => void\n config: Config\n}) => {\n const [hoveredId, setHoveredId] = useState<number | null>(null)\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 <>\n {folders.length\n ? folders.map((folder: WistaAPIFolder) => (\n <Card\n key={folder.id}\n paddingTop={3}\n paddingBottom={3}\n paddingRight={3}\n paddingLeft={4}\n radius={1}\n style={{cursor: 'pointer'}}\n onClick={() => onFolderClick(folder)}\n tone={\n loadingFolderId === folder.id || hoveredId === folder.id ? 'primary' : 'inherit'\n }\n onMouseEnter={() => setHoveredId(folder.id)}\n onMouseLeave={() => setHoveredId(null)}\n as=\"button\"\n >\n <Flex justify=\"space-between\" align=\"center\" gap={2}>\n <Flex align=\"center\" gap={3} paddingLeft={1}>\n <Box flex=\"none\">\n {loadingFolderId === folder.id ?\n <Spinner size={2} />\n :\n <Text size={2}>\n {folder.public ? (\n <FolderIcon />\n ) : (\n <Box flex=\"none\">\n <Text size={2}>\n <Tooltip\n content={\n <Text muted size={1}>\n Private\n </Text>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <LockIcon />\n </Tooltip>\n </Text>\n </Box>\n )}\n </Text>\n }\n </Box>\n <Stack space={2}>\n <Text size={2} weight=\"semibold\">\n {folder.name}\n </Text>\n </Stack>\n </Flex>\n <Flex align=\"center\" gap={3}>\n <Badge aria-label={`${folder.media_count} media items`} tone=\"default\">\n {folder.media_count}\n </Badge>\n <Tooltip\n content={<Text size={1}>Open in Wistia</Text>}\n placement=\"top\"\n fallbackPlacements={['left', 'bottom']}\n portal\n >\n <Button\n as=\"a\"\n href={`https://${config.accountSubdomain || 'app'}.wistia.com/folders/${folder.hashed_id}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n />\n </Tooltip>\n </Flex>\n </Flex>\n </Card>\n ))\n : (\n <Card padding={4}>\n <Text align=\"center\" muted size={1}>\n No folders found.\n </Text>\n </Card>\n )}\n {hasMore && (\n <Card padding={3} borderTop>\n <Button\n mode=\"bleed\"\n text={loadingMore ? 'Loading…' : 'Show more'}\n onClick={onLoadMore}\n disabled={loadingMore}\n width=\"fill\"\n />\n </Card>\n )}\n </>\n )\n}\n\nexport default memo(WistiaFoldersComponent)\n","import {memo, useState, useMemo} from 'react'\nimport {Card, Flex, Text, Heading, Button, Stack, Tooltip, Box} from '@sanity/ui'\nimport {LaunchIcon, CalendarIcon} from '@sanity/icons'\n\nimport {WistiaMedia, WistiaAPIMedias, WistaMediasGrouped, Config} from '../types'\n\nconst groupBy = (array: WistiaAPIMedias[]): WistaMediasGrouped => {\n return array.reduce((rv: WistaMediasGrouped, x) => {\n const key = x.section ?? 'undefined'\n rv[key] = rv[key] ? [...rv[key], x] : [x]\n return rv\n }, {})\n}\n\nconst wistiaMediasComponent = ({\n medias,\n hasMore,\n loadingMore,\n onVideoClick,\n onLoadMore,\n config,\n}: {\n medias: WistiaAPIMedias[]\n hasMore: boolean\n loadingMore: boolean\n onVideoClick: (media: WistiaMedia) => void\n onLoadMore: () => void\n config: Config\n}) => {\n const [hoveredId, setHoveredId] = useState<number | null>(null)\n const groupedMedias = useMemo(() => groupBy(medias), [medias])\n\n return (\n <>\n {Object.keys(groupedMedias).length\n ? Object.keys(groupedMedias).map((section) => (\n <div key={section}>\n {section !== 'undefined' && (\n <Card\n padding={3}\n paddingLeft={4}\n borderBottom\n style={{position: 'sticky', top: 0, zIndex: 1}}\n >\n <Heading as=\"h3\" size={1}>\n {section}\n </Heading>\n </Card>\n )}\n {groupedMedias[section].map((media: WistiaAPIMedias) => (\n <Card\n key={media.id}\n padding={3}\n paddingLeft={4}\n radius={1}\n style={{cursor: 'pointer'}}\n onClick={() => onVideoClick({id: media.id, hashed_id: media.hashed_id})}\n tone={hoveredId === media.id ? 'primary' : 'inherit'}\n onMouseEnter={() => setHoveredId(media.id)}\n onMouseLeave={() => setHoveredId(null)}\n as=\"button\"\n >\n <Flex gap={3} align=\"center\">\n <Card padding={0} overflow=\"hidden\" radius={2} shadow={1} flex=\"none\">\n <img\n src={media.thumbnail.url}\n width={70}\n height={Math.round(70 / (media.thumbnail.width / media.thumbnail.height))}\n style={{\n display: 'block',\n }}\n alt={media.name}\n />\n </Card>\n <Stack space={2}>\n <Text title={media.name} textOverflow=\"ellipsis\" weight=\"semibold\">\n {media.name}\n </Text>\n </Stack>\n <Box flex=\"none\" style={{marginLeft: 'auto'}}>\n <Text muted>\n {new Date(media.duration * 1000).toISOString().slice(11, 19)}\n </Text>\n </Box>\n <Tooltip\n content={<Text size={1}>Open in Wistia</Text>}\n placement=\"top\"\n fallbackPlacements={['left', 'bottom']}\n portal\n >\n <Button\n as=\"a\"\n href={`https://${config.accountSubdomain || 'app'}.wistia.com/medias/${media.hashed_id}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n />\n </Tooltip>\n </Flex>\n </Card>\n ))}\n </div>\n ))\n : (\n <Card padding={5}>\n <Text align=\"center\" muted size={1}>\n No media found.\n </Text>\n </Card>\n )}\n {hasMore && (\n <Card padding={3} borderTop>\n <Button\n mode=\"bleed\"\n text={loadingMore ? 'Loading…' : 'Show more'}\n onClick={onLoadMore}\n disabled={loadingMore}\n width=\"fill\"\n />\n </Card>\n )}\n </>\n )\n}\n\nexport default memo(wistiaMediasComponent)\n","import {useState, useEffect, useCallback, useRef} from 'react'\n\nimport {Config} from '../types'\n\nconst RESULTS_PER_PAGE = 100\nconst WISTIA_API_URL = 'https://api.wistia.com/modern'\n\ninterface UseWistiaDataResult<T> {\n data: T[]\n loadingMore: boolean\n error: string\n hasMore: boolean\n loadMore: () => void\n}\n\nexport function useWistiaData<T>(\n path: string | null,\n config: Config,\n onFirstLoad?: (data: T[]) => void,\n): UseWistiaDataResult<T> {\n const [data, setData] = useState<T[]>([])\n const [loadingMore, setLoadingMore] = useState(false)\n const [error, setError] = useState('')\n const [page, setPage] = useState(1)\n const [hasMore, setHasMore] = useState(false)\n\n const wistiaAPIOptions = {\n headers: {\n 'X-Wistia-API-Version': '2026-01',\n Authorization: `Bearer ${config.token}`,\n }\n }\n\n // Always call onFirstLoad with the latest version without it being a dep\n const onFirstLoadRef = useRef(onFirstLoad)\n onFirstLoadRef.current = onFirstLoad\n\n useEffect(() => {\n if (!path) {\n setData([])\n setHasMore(false)\n setError('')\n setPage(1)\n return\n }\n\n setPage(1)\n fetch(`${WISTIA_API_URL}${path}&page=1&per_page=${RESULTS_PER_PAGE}`, wistiaAPIOptions)\n .then((r) => {\n if (!r.ok) {\n throw new Error(\n r.status === 401\n ? '401 Not authorised - check your API key permissions.'\n : `${r.status} error`,\n )\n }\n return r.json()\n })\n .then((result: T[]) => {\n setHasMore(result.length === RESULTS_PER_PAGE)\n setData(result)\n onFirstLoadRef.current?.(result)\n })\n .catch((err) => setError(err.message))\n }, [path, config.token])\n\n const loadMore = useCallback(() => {\n if (!path) return\n const nextPage = page + 1\n setPage(nextPage)\n setLoadingMore(true)\n\n fetch(`${WISTIA_API_URL}${path}&page=${nextPage}&per_page=${RESULTS_PER_PAGE}`, wistiaAPIOptions)\n .then((r) => r.json())\n .then((result: T[]) => {\n setHasMore(result.length === RESULTS_PER_PAGE)\n setData((prev) => [...prev, ...result])\n setLoadingMore(false)\n })\n .catch(console.error)\n }, [page, path, config.token])\n\n return {data, loadingMore, error, hasMore, loadMore}\n}\n","import {useState, useCallback} from 'react'\nimport {Button, Card, Dialog, Flex, Text, Badge, Box, Stack, Tooltip, useToast, Heading} from '@sanity/ui'\nimport {\n DocumentVideoIcon,\n ChevronLeftIcon,\n LaunchIcon,\n ResetIcon,\n LinkIcon,\n SearchIcon,\n} from '@sanity/icons'\nimport {set, unset, setIfMissing} from 'sanity'\n\nimport {WistiaMedia, WistiaAPIMedias, WistiaInputProps, WistaAPIFolder} from '../types'\nimport {Player} from './Player'\nimport Folder from './Folder'\nimport Medias from './Medias'\nimport {useWistiaData} from '../hooks/useWistiaData'\n\nconst WistiaInputComponent = (props: WistiaInputProps) => {\n const {value, onChange, config, schemaType, renderDefault} = props\n const {push: pushToast} = useToast()\n\n const [isPickerMounted, setIsPickerMounted] = useState(false)\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n const [isFolderLoading, setIsFolderLoading] = useState(false)\n const [selectedFolder, setSelectedFolder] = useState<WistaAPIFolder | null>(null)\n const [loadingFolderId, setLoadingFolderId] = useState<number | null>(null)\n const [visibleFolder, setVisibleFolder] = useState<WistaAPIFolder | null>(null)\n\n const {\n data: folders,\n loadingMore: foldersLoadingMore,\n error: foldersError,\n hasMore: hasMoreFolders,\n loadMore: loadMoreFolders,\n } = useWistiaData<WistaAPIFolder>(\n isPickerMounted ? '/folders?sort_by=updated&sort_direction=0' : null,\n config,\n () => {\n setIsFolderLoading(false)\n setIsDialogOpen(true)\n },\n )\n\n const {\n data: medias,\n loadingMore: mediasLoadingMore,\n hasMore: hasMoreMedias,\n loadMore: loadMoreMedias,\n } = useWistiaData<WistiaAPIMedias>(\n selectedFolder ? `/medias?folder_id=${selectedFolder.id}&sort_by=name` : null,\n config,\n () => {\n setLoadingFolderId(null)\n setVisibleFolder(selectedFolder)\n },\n )\n\n const handleChange = useCallback(\n (newValue: WistiaMedia) => {\n setIsPickerMounted(false)\n setIsDialogOpen(false)\n setSelectedFolder(null)\n setVisibleFolder(null)\n onChange([\n setIfMissing({_type: schemaType.name}),\n set(newValue.hashed_id, ['hashed_id']),\n set(newValue.id, ['id']),\n ])\n },\n [onChange, schemaType],\n )\n\n const handleClear = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n const handleCopyUrl = useCallback(() => {\n navigator.clipboard.writeText(`https://fast.wistia.net/embed/iframe/${value?.hashed_id}`)\n pushToast({closable: true, status: 'success', title: 'URL copied to clipboard'})\n }, [value, pushToast])\n\n const handleOpenPicker = useCallback(() => {\n setIsFolderLoading(true)\n setIsPickerMounted(true)\n }, [])\n\n const handleClosePicker = useCallback(() => {\n setIsPickerMounted(false)\n setIsDialogOpen(false)\n setSelectedFolder(null)\n setVisibleFolder(null)\n setLoadingFolderId(null)\n setIsFolderLoading(false)\n }, [])\n\n const handleFolderClick = useCallback((folder: WistaAPIFolder) => {\n setLoadingFolderId(folder.id)\n setSelectedFolder(folder)\n }, [])\n\n // MARK: Config error\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://docs.wistia.com/docs/making-api-requests\">\n See Wistia documentation.\n </a>\n </Text>\n </Card>\n )\n }\n\n const mediaUrl = value?.hashed_id\n ? `https://fast.wistia.net/embed/iframe/${value.hashed_id}`\n : null\n\n // MARK: Selecting a Folder and Media\n const picker = isDialogOpen && (\n <Dialog\n id=\"wistia-picker\"\n onClose={handleClosePicker}\n animate\n width={1}\n header={\n visibleFolder ? (\n <Stack space={3}>\n <Flex justify=\"space-between\">\n <Button\n icon={ChevronLeftIcon}\n onClick={() => {\n setSelectedFolder(null)\n setVisibleFolder(null)\n }}\n mode=\"bleed\"\n padding={2}\n space={2}\n text=\"All folders\"\n />\n <Button\n as=\"a\"\n href={`https://${config.accountSubdomain || 'app'}.wistia.com/folders/${visibleFolder.hashed_id}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n space={2}\n text=\"Open in Wistia\"\n />\n </Flex>\n <Flex justify=\"space-between\" align=\"center\" flex={1} paddingBottom={0}>\n <Stack space={3}>\n <Heading as=\"h2\" size={2}>\n {visibleFolder.name}\n </Heading>\n {visibleFolder.description ? (\n <Text textOverflow=\"ellipsis\" size={1} muted>\n {visibleFolder.description.replace(/<[^>]*>/g, '').trim()}\n </Text>\n ) : null}\n </Stack>\n </Flex>\n </Stack>\n ) : (\n 'Select a folder'\n )\n }\n footer={\n visibleFolder ? (\n <Card tone=\"transparent\" paddingX={4} paddingY={4}>\n <Flex align=\"center\" justify=\"flex-start\" gap={3}>\n {!visibleFolder.public && (\n <Badge tone=\"caution\">\n Private\n </Badge>\n )}\n <Badge title={`${visibleFolder.media_count} items`} tone=\"default\">\n {visibleFolder.media_count} items\n </Badge>\n <Text title={visibleFolder.updated} size={1}>\n <b>Updated</b>{' '}\n {new Date(visibleFolder.updated).toLocaleDateString(undefined, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n })}\n </Text>\n </Flex>\n </Card>\n ) : undefined\n }\n >\n {!visibleFolder ? (\n <Folder\n config={config}\n folders={folders}\n loadingFolderId={loadingFolderId}\n error={foldersError}\n hasMore={hasMoreFolders}\n loadingMore={foldersLoadingMore}\n onFolderClick={handleFolderClick}\n onLoadMore={loadMoreFolders}\n />\n ) : (\n <Medias\n config={config}\n medias={medias}\n hasMore={hasMoreMedias}\n loadingMore={mediasLoadingMore}\n onVideoClick={handleChange}\n onLoadMore={loadMoreMedias}\n />\n )}\n </Dialog>\n )\n\n // Add in any extra fields the user has defined\n const extraFields = config.fields?.length\n ? <Stack marginTop={4}>{renderDefault({...props, members: props.members.filter(\n (m) => m.kind === 'field' && config.fields!.some((f) => f.name === m.name)\n )})}</Stack>\n : null\n\n // MARK: Media is selected\n if (mediaUrl) {\n return (\n <Stack space={0}>\n <Card radius={2} shadow={1} padding={2}>\n <Flex justify=\"space-between\" align=\"center\" padding={0} paddingBottom={2} gap={1}>\n <Flex gap={1}>\n <Tooltip animate content={<Text size={1}>Open in Wistia</Text>} placement=\"top\" portal>\n <Button\n as=\"a\"\n href={`https://${config.accountSubdomain || 'app'}.wistia.com/medias/${value?.hashed_id}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={LaunchIcon}\n mode=\"bleed\"\n padding={2}\n />\n </Tooltip>\n <Tooltip animate content={<Text size={1}>Copy embed URL</Text>} placement=\"top\" portal>\n <Button mode=\"bleed\" padding={2} icon={LinkIcon} onClick={handleCopyUrl} />\n </Tooltip>\n </Flex>\n <Flex align=\"center\" gap={1}>\n <Button\n text=\"Replace\"\n padding={2}\n space={2}\n mode=\"bleed\"\n icon={SearchIcon}\n loading={isFolderLoading}\n onClick={handleOpenPicker}\n />\n <Button\n text=\"Clear\"\n padding={2}\n space={2}\n mode=\"bleed\"\n icon={ResetIcon}\n tone=\"critical\"\n onClick={handleClear}\n />\n </Flex>\n </Flex>\n <Player mediaUrl={mediaUrl} />\n </Card>\n {picker}\n {extraFields}\n </Stack>\n )\n }\n\n // MARK: Initial state, no media selected\n return (\n <Stack space={2}>\n <Card tone={'inherit'} radius={2} border padding={2} paddingLeft={3}>\n <Flex justify=\"space-between\" align=\"center\">\n <Flex align=\"center\" gap={3}>\n <Box flex=\"none\">\n <Text size={2}><DocumentVideoIcon /></Text>\n </Box>\n <Text size={1} muted>\n No media selected\n </Text>\n </Flex>\n <Flex align=\"center\" gap={1}>\n <Button\n as=\"a\"\n href={`https://${config.accountSubdomain || 'app'}.wistia.com/home`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={LaunchIcon}\n mode=\"bleed\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n text={'Open Wistia'}\n padding={2}\n space={2}\n />\n <Button\n mode=\"bleed\"\n text=\"Select\"\n icon={SearchIcon}\n loading={isFolderLoading}\n onClick={handleOpenPicker}\n padding={2}\n space={2}\n />\n </Flex>\n </Flex>\n </Card>\n {picker}\n {extraFields}\n </Stack>\n )\n}\n\nexport default WistiaInputComponent\n","import {PreviewProps} from 'sanity'\nimport {Stack} from '@sanity/ui'\nimport {Player} from './Player'\n\nexport default (props: PreviewProps) => {\n const {subtitle: hashed_id, renderDefault} = props\n\n return (\n <Stack space={1}>\n {renderDefault({...props})}\n {hashed_id && <Player mediaUrl={`https://fast.wistia.net/embed/iframe/${hashed_id}`} />}\n </Stack>\n )\n}\n","import {ObjectInputProps, PreviewProps} from 'sanity'\nimport {Config} from './types'\n\nimport Input from './components/Input'\nimport Preview from './components/Preview'\n\nexport function wistiaMediaRender(config: Config) {\n return {\n components: {\n input: (props: ObjectInputProps) => <Input config={config} {...props} />,\n preview: (props: PreviewProps) => (\n <Preview {...(props as PreviewProps & {subtitle?: string})} />\n ),\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 fields: [\n ...wistiaMedia.fields,\n ...(config.fields ?? []).filter(\n (f) => !wistiaMedia.fields.some((base) => base.name === f.name),\n ),\n ],\n ...wistiaMediaRender(config),\n },\n ],\n },\n}))\n"],"names":["Input"],"mappings":"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"}