{"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\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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"}