{"version":3,"sources":["jsdelivr-header.js","/npm/sanity-plugin-wistia-input@3.1.0/src/schema.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/components/Projects.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/components/Videos.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/components/Player.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/components/AssetMenu.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/components/Input.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/plugin.tsx","/npm/sanity-plugin-wistia-input@3.1.0/src/index.ts"],"names":[],"mappings":"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","file":"/npm/sanity-plugin-wistia-input@3.1.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/sanity-plugin-wistia-input@3.1.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","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"]}