sanity-plugin-iframe-pane 3.1.2 → 3.1.4

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/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/DisplayUrl.tsx","../src/Toolbar.tsx","../src/Iframe.tsx"],"sourcesContent":["import {getRedirectTo} from '@sanity/preview-url-secret/get-redirect-to'\nimport {Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\n\nexport function DisplayUrl(props: {url: URL}) {\n const truncatedUrl = useMemo(() => {\n const url = getRedirectTo(props.url)\n return `${url.origin === location.origin ? '' : url.origin}${url.pathname}${url.search}`\n }, [props.url])\n\n return (\n <Text size={0} textOverflow=\"ellipsis\">\n {truncatedUrl}\n </Text>\n )\n}\n","import {CopyIcon, LaunchIcon, MobileDeviceIcon, RefreshIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, Tooltip, useToast} from '@sanity/ui'\nimport React, {useRef} from 'react'\nimport {useCopyToClipboard} from 'usehooks-ts'\n\nimport {DisplayUrl} from './DisplayUrl'\nimport {IframeSizeKey, type SizeProps} from './types'\n\nexport const sizes: SizeProps = {\n desktop: {\n width: '100%',\n height: '100%',\n },\n mobile: {\n width: 414,\n height: 746,\n },\n}\n\nexport const DEFAULT_SIZE = `desktop`\n\nexport interface ToolbarProps {\n url: URL | Error | undefined\n iframeSize: IframeSizeKey\n setIframeSize: (size: IframeSizeKey) => void\n showUrl: boolean\n reloading: boolean\n reloadButton: boolean\n handleReload: () => void\n}\nexport function Toolbar(props: ToolbarProps) {\n const {url, iframeSize, setIframeSize, reloading, showUrl, reloadButton, handleReload} = props\n const validUrl = url instanceof URL\n\n const input = useRef<HTMLTextAreaElement>(null)\n const {push: pushToast} = useToast()\n const [, copy] = useCopyToClipboard()\n\n return (\n <>\n <textarea\n style={{position: `absolute`, pointerEvents: `none`, opacity: 0}}\n ref={input}\n value={validUrl ? url.toString() : ''}\n readOnly\n tabIndex={-1}\n />\n <Card padding={2} borderBottom>\n <Flex align=\"center\" gap={2}>\n <Flex align=\"center\" gap={1}>\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n </Text>\n }\n padding={2}\n placement=\"bottom-start\"\n >\n <Button\n disabled={!validUrl}\n fontSize={[1]}\n padding={2}\n mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n icon={MobileDeviceIcon}\n onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n />\n </Tooltip>\n </Flex>\n <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n <Flex align=\"center\" gap={1}>\n {reloadButton ? (\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n {reloading ? 'Reloading…' : 'Reload'}\n </Text>\n }\n padding={2}\n >\n <Button\n disabled={!validUrl}\n mode=\"bleed\"\n fontSize={[1]}\n padding={2}\n icon={RefreshIcon}\n loading={reloading}\n aria-label=\"Reload\"\n onClick={() => handleReload()}\n />\n </Tooltip>\n ) : null}\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Copy URL\n </Text>\n }\n padding={2}\n >\n <Button\n mode=\"bleed\"\n disabled={!validUrl}\n fontSize={[1]}\n icon={CopyIcon}\n padding={[2]}\n aria-label=\"Copy URL\"\n onClick={() => {\n if (!input?.current?.value) return\n\n copy(input.current.value)\n pushToast({\n closable: true,\n status: 'success',\n title: 'The URL is copied to the clipboard',\n })\n }}\n />\n </Tooltip>\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Open URL in a new tab\n </Text>\n }\n padding={2}\n placement=\"bottom-end\"\n >\n <Button\n disabled={!validUrl}\n fontSize={[1]}\n icon={LaunchIcon}\n mode=\"ghost\"\n paddingY={[2]}\n text=\"Open\"\n aria-label=\"Open URL in a new tab\"\n onClick={validUrl ? () => window.open(url.toString()) : undefined}\n />\n </Tooltip>\n </Flex>\n </Flex>\n </Card>\n </>\n )\n}\n","import {WarningOutlineIcon} from '@sanity/icons'\nimport {createPreviewSecret} from '@sanity/preview-url-secret/create-secret'\nimport {definePreviewUrl} from '@sanity/preview-url-secret/define-preview-url'\nimport {Box, Card, Container, Flex, Spinner, Stack, Text, usePrefersReducedMotion} from '@sanity/ui'\nimport {AnimatePresence, motion, MotionConfig} from 'framer-motion'\nimport React, {\n forwardRef,\n memo,\n Suspense,\n useCallback,\n useEffect,\n useRef,\n useState,\n useTransition,\n} from 'react'\nimport {HTMLAttributeReferrerPolicy} from 'react'\nimport {SanityDocument, useClient, useCurrentUser} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport {DEFAULT_SIZE, sizes, Toolbar} from './Toolbar'\nimport {IframeSizeKey} from './types'\n\nexport type UrlResolver = (\n document: SanityDocument | null,\n) => string | Error | undefined | Promise<string | Error | undefined>\n\nexport type {IframeSizeKey}\n\nexport interface IframeOptions {\n /**\n * If you have multiple iframe instances side-by-side you need to give each a unique key.\n */\n key?: string\n url:\n | string\n | UrlResolver\n | {\n /**\n * The URL origin of where the preview is hosted, for example `https://example.com`.\n * If it's an embedded Studio then set it to `'same-origin'`.\n */\n origin: 'same-origin' | string\n /**\n * The route to redirect to after enabling Draft Mode.\n * If you don't have enough data to build the URL, return an `Error` instance to show an error message.\n * @example `return new Error('Missing slug')`\n * To prolong the loading state, return `undefined`\n */\n preview: string | UrlResolver\n /**\n * The route that enables Draft Mode\n * @example '/api/draft'\n */\n draftMode: string\n }\n defaultSize?: IframeSizeKey\n showDisplayUrl?: boolean\n reload?: {\n button?: boolean\n }\n attributes?: Partial<{\n allow: string\n referrerPolicy: HTMLAttributeReferrerPolicy | undefined\n sandbox: string\n onLoad: () => void\n }>\n}\n\nconst MotionFlex = motion(Flex)\n\nexport interface IframeProps {\n document: {\n draft: SanityDocument | null\n published: SanityDocument | null\n }\n options: IframeOptions\n}\n\nexport function Iframe(props: IframeProps) {\n const {document, options} = props\n const draft = document.draft || document.published\n\n const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n const urlRef = useRef(options.url)\n const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))\n useEffect(() => {\n urlRef.current = options.url\n }, [options.url])\n useEffect(() => {\n if (JSON.stringify({key, draft}) !== JSON.stringify(draftSnapshot)) {\n startTransition(() => setDraftSnapshot({key, draft}))\n }\n }, [draft, draftSnapshot, key])\n const currentUser = useCurrentUser()\n const client = useClient({apiVersion: '2023-10-16'})\n const [expiresAt, setExpiresAt] = useState<number | undefined>()\n const previewSecretRef = useRef<string | undefined>()\n const [isResolvingUrl, startTransition] = useTransition()\n const url = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n async (draft: SanityDocument | null) => {\n if (typeof location === 'undefined') {\n return undefined\n }\n const urlProp = urlRef.current\n if (typeof urlProp === 'string') {\n return new URL(urlProp, location.origin)\n }\n if (typeof urlProp === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const url = await urlProp(draft)\n return typeof url === 'string' ? new URL(url, location.origin) : url\n }\n if (typeof urlProp === 'object') {\n const preview =\n typeof urlProp.preview === 'function' ? await urlProp.preview(draft) : urlProp.preview\n if (typeof preview !== 'string') {\n return preview\n }\n if (!previewSecretRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {secret, expiresAt} = await createPreviewSecret(\n client,\n 'sanity-plugin-iframe-pane',\n location.href,\n currentUser?.id,\n )\n previewSecretRef.current = secret\n startTransition(() => setExpiresAt(expiresAt.getTime()))\n }\n\n const resolvePreviewUrl = definePreviewUrl({\n origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n preview,\n draftMode: {\n enable: urlProp.draftMode,\n },\n })\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const url = await resolvePreviewUrl({\n client,\n previewUrlSecret: previewSecretRef.current,\n previewSearchParam: null,\n })\n return new URL(url, location.origin)\n }\n return undefined\n },\n [client, currentUser?.id],\n )\n useEffect(() => {\n if (expiresAt) {\n const timeout = setTimeout(\n () => {\n startTransition(() => setExpiresAt(undefined))\n previewSecretRef.current = undefined\n },\n Math.max(0, expiresAt - Date.now()),\n )\n return () => clearTimeout(timeout)\n }\n return undefined\n }, [expiresAt])\n\n return (\n <Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n <IframeInner\n key={draftSnapshot.key}\n _key={draftSnapshot.key}\n draftSnapshot={draftSnapshot.draft}\n url={url}\n isResolvingUrl={isResolvingUrl}\n attributes={attributes}\n defaultSize={defaultSize}\n reload={reload}\n showDisplayUrl={showDisplayUrl}\n userId={currentUser?.id}\n />\n </Suspense>\n )\n}\n\nexport interface IframeInnerProps extends Omit<IframeOptions, 'url'> {\n url: (draftSnapshot: SanityDocument | null) => Promise<URL | Error | undefined>\n isResolvingUrl: boolean\n draftSnapshot: SanityDocument | null\n userId?: string\n expiresAt?: number\n _key?: string\n}\nconst IframeInner = memo(function IframeInner(props: IframeInnerProps) {\n const {\n isResolvingUrl,\n defaultSize = DEFAULT_SIZE,\n reload,\n attributes = {},\n showDisplayUrl = true,\n draftSnapshot,\n userId,\n expiresAt,\n _key,\n } = props\n const [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE)\n\n const prefersReducedMotion = usePrefersReducedMotion()\n\n const url = suspend(\n () => props.url(draftSnapshot),\n [\n // Cache based on a few specific conditions\n 'sanity-plugin-iframe-pane',\n draftSnapshot,\n userId,\n expiresAt,\n _key,\n resolveUUID,\n ],\n )\n\n const [loading, setLoading] = useState(true)\n const [_reloading, setReloading] = useState(false)\n const reloading = _reloading || isResolvingUrl\n\n const iframe = useRef<HTMLIFrameElement>(null)\n\n const handleReload = useCallback(() => {\n if (!iframe?.current) {\n return\n }\n\n // Funky way to reload an iframe without CORS issues\n // eslint-disable-next-line no-self-assign\n iframe.current.src = iframe.current.src\n\n setReloading(true)\n }, [])\n\n return (\n <MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n <Flex direction=\"column\" style={{height: `100%`}}>\n <Toolbar\n url={url}\n iframeSize={iframeSize}\n reloading={reloading}\n setIframeSize={setIframeSize}\n showUrl={showDisplayUrl}\n reloadButton={!!reload?.button}\n handleReload={handleReload}\n />\n {url instanceof Error ? (\n <ErrorCard error={url} />\n ) : (\n <Card tone=\"transparent\" style={{height: `100%`}}>\n <Frame\n ref={iframe}\n loading={loading}\n reloading={reloading}\n iframeSize={iframeSize}\n setReloading={setReloading}\n setLoading={setLoading}\n url={url}\n attributes={attributes}\n />\n </Card>\n )}\n </Flex>\n </MotionConfig>\n )\n})\n\ninterface FrameProps extends Required<Pick<IframeOptions, 'attributes'>> {\n loading: boolean\n reloading: boolean\n setLoading: (loading: boolean) => void\n setReloading: (reloading: boolean) => void\n iframeSize: IframeSizeKey\n url: URL | undefined\n}\nconst Frame = forwardRef(function Frame(\n props: FrameProps,\n iframe: React.ForwardedRef<HTMLIFrameElement>,\n) {\n const {loading, setLoading, iframeSize, attributes, reloading, url, setReloading} = props\n\n function handleIframeLoad() {\n setLoading(false)\n setReloading(false)\n // Run onLoad from attributes\n if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n attributes.onLoad()\n }\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" style={{height: `100%`, position: `relative`}}>\n <AnimatePresence>\n {!url ||\n (loading && (\n <MotionFlex\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={spinnerVariants}\n justify=\"center\"\n align=\"center\"\n style={{inset: `0`, position: `absolute`}}\n >\n <Loading iframeSize={iframeSize} />\n </MotionFlex>\n ))}\n </AnimatePresence>\n {url && (\n <motion.iframe\n ref={iframe}\n title=\"preview\"\n frameBorder=\"0\"\n style={{maxHeight: '100%'}}\n src={url.toString()}\n initial={['background', iframeSize]}\n variants={iframeVariants}\n animate={[\n loading ? 'background' : 'active',\n reloading ? 'reloading' : 'idle',\n iframeSize,\n ]}\n {...attributes}\n onLoad={handleIframeLoad}\n />\n )}\n </Flex>\n )\n})\n\nconst spinnerVariants = {\n initial: {opacity: 1},\n animate: {opacity: [0, 0, 1]},\n exit: {opacity: [1, 0, 0]},\n}\n\nconst iframeVariants = {\n ...sizes,\n desktop: {\n ...sizes.desktop,\n boxShadow: '0 0 0 0px var(--card-shadow-outline-color)',\n },\n mobile: {\n ...sizes.mobile,\n boxShadow: '0 0 0 1px var(--card-shadow-outline-color)',\n },\n background: {\n opacity: 0,\n scale: 1,\n },\n idle: {\n scale: 1,\n },\n reloading: {\n scale: [1, 1, 1, 0.98],\n },\n active: {\n opacity: [0, 0, 1],\n scale: 1,\n },\n}\n\nfunction Loading({iframeSize}: {iframeSize: IframeSizeKey}) {\n return (\n <Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n <Spinner muted />\n <Text muted size={1}>\n Loading…\n </Text>\n </Flex>\n )\n}\n\nexport function ErrorCard({error}: {error: Error}) {\n return (\n <Card height=\"fill\">\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Container width={0}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Flex>\n <Box>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n </Box>\n <Stack flex={1} marginLeft={3} space={3}>\n <Text as=\"h1\" size={1} weight=\"bold\">\n {error.name}\n </Text>\n <Text as=\"p\" muted size={1}>\n {error.message}\n </Text>\n </Stack>\n </Flex>\n </Card>\n </Container>\n </Flex>\n </Card>\n )\n}\n\n// https://github.com/pmndrs/suspend-react?tab=readme-ov-file#making-cache-keys-unique\nconst resolveUUID = Symbol()\n"],"names":["DisplayUrl","props","truncatedUrl","useMemo","url","getRedirectTo","concat","origin","location","pathname","search","Text","size","textOverflow","children","sizes","desktop","width","height","mobile","DEFAULT_SIZE","Toolbar","iframeSize","setIframeSize","reloading","showUrl","reloadButton","handleReload","validUrl","URL","input","useRef","push","pushToast","useToast","copy","useCopyToClipboard","jsxs","Fragment","jsx","style","position","pointerEvents","opacity","ref","value","toString","readOnly","tabIndex","Card","padding","borderBottom","Flex","align","gap","Tooltip","content","whiteSpace","placement","Button","disabled","fontSize","mode","icon","MobileDeviceIcon","onClick","Box","flex","RefreshIcon","loading","CopyIcon","_a","current","closable","status","title","LaunchIcon","paddingY","text","window","open","MotionFlex","motion","Iframe","document","options","draft","published","defaultSize","reload","attributes","showDisplayUrl","key","urlRef","draftSnapshot","setDraftSnapshot","useState","useEffect","JSON","stringify","startTransition","currentUser","useCurrentUser","client","useClient","apiVersion","expiresAt","setExpiresAt","previewSecretRef","isResolvingUrl","useTransition","useCallback","urlProp","preview","secret","createPreviewSecret","href","id","getTime","resolvePreviewUrl","definePreviewUrl","draftMode","enable","previewUrlSecret","previewSearchParam","timeout","setTimeout","Math","max","Date","now","clearTimeout","Suspense","fallback","Loading","IframeInner","_key","userId","memo","prefersReducedMotion","usePrefersReducedMotion","suspend","resolveUUID","setLoading","_reloading","setReloading","iframe","src","MotionConfig","transition","duration","direction","button","Error","ErrorCard","error","tone","Frame","forwardRef","handleIframeLoad","onLoad","justify","AnimatePresence","initial","animate","exit","variants","spinnerVariants","inset","frameBorder","maxHeight","iframeVariants","boxShadow","background","scale","idle","active","_ref","Spinner","muted","_ref2","sizing","Container","radius","shadow","WarningOutlineIcon","Stack","marginLeft","space","as","weight","name","message","Symbol"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/DisplayUrl.tsx","../src/Toolbar.tsx","../src/Iframe.tsx"],"sourcesContent":["import {getRedirectTo} from '@sanity/preview-url-secret/get-redirect-to'\nimport {Text} from '@sanity/ui'\nimport React, {useMemo} from 'react'\n\nexport function DisplayUrl(props: {url: URL}) {\n const truncatedUrl = useMemo(() => {\n const url = getRedirectTo(props.url)\n return `${url.origin === location.origin ? '' : url.origin}${url.pathname}${url.search}`\n }, [props.url])\n\n return (\n <Text size={0} textOverflow=\"ellipsis\">\n {truncatedUrl}\n </Text>\n )\n}\n","import {CopyIcon, LaunchIcon, MobileDeviceIcon, RefreshIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Text, Tooltip, useToast} from '@sanity/ui'\nimport React, {useRef} from 'react'\nimport {useCopyToClipboard} from 'usehooks-ts'\n\nimport {DisplayUrl} from './DisplayUrl'\nimport {IframeSizeKey, type SizeProps} from './types'\n\nexport const sizes: SizeProps = {\n desktop: {\n width: '100%',\n height: '100%',\n },\n mobile: {\n width: 414,\n height: 746,\n },\n}\n\nexport const DEFAULT_SIZE = `desktop`\n\nexport interface ToolbarProps {\n url: URL | Error | undefined\n iframeSize: IframeSizeKey\n setIframeSize: (size: IframeSizeKey) => void\n showUrl: boolean\n reloading: boolean\n reloadButton: boolean\n handleReload: () => void\n}\nexport function Toolbar(props: ToolbarProps) {\n const {url, iframeSize, setIframeSize, reloading, showUrl, reloadButton, handleReload} = props\n const validUrl = url instanceof URL\n\n const input = useRef<HTMLTextAreaElement>(null)\n const {push: pushToast} = useToast()\n const [, copy] = useCopyToClipboard()\n\n return (\n <>\n <textarea\n style={{position: `absolute`, pointerEvents: `none`, opacity: 0}}\n ref={input}\n value={validUrl ? url.toString() : ''}\n readOnly\n tabIndex={-1}\n />\n <Card padding={2} borderBottom>\n <Flex align=\"center\" gap={2}>\n <Flex align=\"center\" gap={1}>\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n {iframeSize === 'mobile' ? 'Exit mobile preview' : 'Preview mobile viewport'}\n </Text>\n }\n padding={2}\n placement=\"bottom-start\"\n >\n <Button\n disabled={!validUrl}\n fontSize={[1]}\n padding={2}\n mode={iframeSize === 'mobile' ? 'default' : 'ghost'}\n icon={MobileDeviceIcon}\n onClick={() => setIframeSize(iframeSize === 'mobile' ? 'desktop' : 'mobile')}\n />\n </Tooltip>\n </Flex>\n <Box flex={1}>{showUrl && validUrl && <DisplayUrl url={url} />}</Box>\n <Flex align=\"center\" gap={1}>\n {reloadButton ? (\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n {reloading ? 'Reloading…' : 'Reload'}\n </Text>\n }\n padding={2}\n >\n <Button\n disabled={!validUrl}\n mode=\"bleed\"\n fontSize={[1]}\n padding={2}\n icon={RefreshIcon}\n loading={reloading}\n aria-label=\"Reload\"\n onClick={() => handleReload()}\n />\n </Tooltip>\n ) : null}\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Copy URL\n </Text>\n }\n padding={2}\n >\n <Button\n mode=\"bleed\"\n disabled={!validUrl}\n fontSize={[1]}\n icon={CopyIcon}\n padding={[2]}\n aria-label=\"Copy URL\"\n onClick={() => {\n if (!input?.current?.value) return\n\n copy(input.current.value)\n pushToast({\n closable: true,\n status: 'success',\n title: 'The URL is copied to the clipboard',\n })\n }}\n />\n </Tooltip>\n <Tooltip\n content={\n <Text size={1} style={{whiteSpace: 'nowrap'}}>\n Open URL in a new tab\n </Text>\n }\n padding={2}\n placement=\"bottom-end\"\n >\n <Button\n disabled={!validUrl}\n fontSize={[1]}\n icon={LaunchIcon}\n mode=\"ghost\"\n paddingY={[2]}\n text=\"Open\"\n aria-label=\"Open URL in a new tab\"\n onClick={validUrl ? () => window.open(url.toString()) : undefined}\n />\n </Tooltip>\n </Flex>\n </Flex>\n </Card>\n </>\n )\n}\n","import {WarningOutlineIcon} from '@sanity/icons'\nimport {createPreviewSecret} from '@sanity/preview-url-secret/create-secret'\nimport {definePreviewUrl} from '@sanity/preview-url-secret/define-preview-url'\nimport {Box, Card, Container, Flex, Spinner, Stack, Text, usePrefersReducedMotion} from '@sanity/ui'\nimport {AnimatePresence, motion, MotionConfig} from 'framer-motion'\nimport React, {\n forwardRef,\n memo,\n Suspense,\n useCallback,\n useEffect,\n useRef,\n useState,\n useTransition,\n} from 'react'\nimport {HTMLAttributeReferrerPolicy} from 'react'\nimport {SanityDocument, useClient, useCurrentUser} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport {DEFAULT_SIZE, sizes, Toolbar} from './Toolbar'\nimport {IframeSizeKey} from './types'\n\nexport type UrlResolver = (\n document: SanityDocument | null,\n) => string | Error | undefined | Promise<string | Error | undefined>\n\nexport type {IframeSizeKey}\n\nexport interface IframeOptions {\n /**\n * If you have multiple iframe instances side-by-side you need to give each a unique key.\n */\n key?: string\n url:\n | string\n | UrlResolver\n | {\n /**\n * The URL origin of where the preview is hosted, for example `https://example.com`.\n * If it's an embedded Studio then set it to `'same-origin'`.\n */\n origin: 'same-origin' | string\n /**\n * The route to redirect to after enabling Draft Mode.\n * If you don't have enough data to build the URL, return an `Error` instance to show an error message.\n * @example `return new Error('Missing slug')`\n * To prolong the loading state, return `undefined`\n */\n preview: string | UrlResolver\n /**\n * The route that enables Draft Mode\n * @example '/api/draft'\n */\n draftMode: string\n }\n defaultSize?: IframeSizeKey\n showDisplayUrl?: boolean\n reload?: {\n button?: boolean\n }\n attributes?: Partial<{\n allow: string\n referrerPolicy: HTMLAttributeReferrerPolicy | undefined\n sandbox: string\n onLoad: () => void\n }>\n}\n\nconst MotionFlex = motion(Flex)\n\nexport interface IframeProps {\n document: {\n displayed: SanityDocument\n draft: SanityDocument | null\n published: SanityDocument | null\n }\n options: IframeOptions\n}\n\nexport function Iframe(props: IframeProps) {\n const {document, options} = props\n const draft = document.draft || document.published || document.displayed\n\n const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n const urlRef = useRef(options.url)\n const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))\n useEffect(() => {\n urlRef.current = options.url\n }, [options.url])\n useEffect(() => {\n if (JSON.stringify({key, draft}) !== JSON.stringify(draftSnapshot)) {\n startTransition(() => setDraftSnapshot({key, draft}))\n }\n }, [draft, draftSnapshot, key])\n const currentUser = useCurrentUser()\n const client = useClient({apiVersion: '2023-10-16'})\n const [expiresAt, setExpiresAt] = useState<number | undefined>()\n const previewSecretRef = useRef<string | undefined>()\n const [isResolvingUrl, startTransition] = useTransition()\n const url = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n async (draft: SanityDocument | null) => {\n if (typeof location === 'undefined') {\n return undefined\n }\n const urlProp = urlRef.current\n if (typeof urlProp === 'string') {\n return new URL(urlProp, location.origin)\n }\n if (typeof urlProp === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const url = await urlProp(draft)\n return typeof url === 'string' ? new URL(url, location.origin) : url\n }\n if (typeof urlProp === 'object') {\n const preview =\n typeof urlProp.preview === 'function' ? await urlProp.preview(draft) : urlProp.preview\n if (typeof preview !== 'string') {\n return preview\n }\n if (!previewSecretRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {secret, expiresAt} = await createPreviewSecret(\n client,\n 'sanity-plugin-iframe-pane',\n location.href,\n currentUser?.id,\n )\n previewSecretRef.current = secret\n startTransition(() => setExpiresAt(expiresAt.getTime()))\n }\n\n const resolvePreviewUrl = definePreviewUrl({\n origin: urlProp.origin === 'same-origin' ? location.origin : urlProp.origin,\n preview,\n draftMode: {\n enable: urlProp.draftMode,\n },\n })\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const url = await resolvePreviewUrl({\n client,\n previewUrlSecret: previewSecretRef.current,\n previewSearchParam: null,\n })\n return new URL(url, location.origin)\n }\n return undefined\n },\n [client, currentUser?.id],\n )\n useEffect(() => {\n if (expiresAt) {\n const timeout = setTimeout(\n () => {\n startTransition(() => setExpiresAt(undefined))\n previewSecretRef.current = undefined\n },\n Math.max(0, expiresAt - Date.now()),\n )\n return () => clearTimeout(timeout)\n }\n return undefined\n }, [expiresAt])\n\n return (\n <Suspense fallback={<Loading iframeSize=\"desktop\" />}>\n <IframeInner\n key={draftSnapshot.key}\n _key={draftSnapshot.key}\n draftSnapshot={draftSnapshot.draft}\n url={url}\n isResolvingUrl={isResolvingUrl}\n attributes={attributes}\n defaultSize={defaultSize}\n reload={reload}\n showDisplayUrl={showDisplayUrl}\n userId={currentUser?.id}\n />\n </Suspense>\n )\n}\n\nexport interface IframeInnerProps extends Omit<IframeOptions, 'url'> {\n url: (draftSnapshot: SanityDocument | null) => Promise<URL | Error | undefined>\n isResolvingUrl: boolean\n draftSnapshot: SanityDocument | null\n userId?: string\n expiresAt?: number\n _key?: string\n}\nconst IframeInner = memo(function IframeInner(props: IframeInnerProps) {\n const {\n isResolvingUrl,\n defaultSize = DEFAULT_SIZE,\n reload,\n attributes = {},\n showDisplayUrl = true,\n draftSnapshot,\n userId,\n expiresAt,\n _key,\n } = props\n const [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE)\n\n const prefersReducedMotion = usePrefersReducedMotion()\n\n const url = suspend(\n () => props.url(draftSnapshot),\n [\n // Cache based on a few specific conditions\n 'sanity-plugin-iframe-pane',\n draftSnapshot,\n userId,\n expiresAt,\n _key,\n resolveUUID,\n ],\n )\n\n const [loading, setLoading] = useState(true)\n const [_reloading, setReloading] = useState(false)\n const reloading = _reloading || isResolvingUrl\n\n const iframe = useRef<HTMLIFrameElement>(null)\n\n const handleReload = useCallback(() => {\n if (!iframe?.current) {\n return\n }\n\n // Funky way to reload an iframe without CORS issues\n // eslint-disable-next-line no-self-assign\n iframe.current.src = iframe.current.src\n\n setReloading(true)\n }, [])\n\n return (\n <MotionConfig transition={prefersReducedMotion ? {duration: 0} : undefined}>\n <Flex direction=\"column\" style={{height: `100%`}}>\n <Toolbar\n url={url}\n iframeSize={iframeSize}\n reloading={reloading}\n setIframeSize={setIframeSize}\n showUrl={showDisplayUrl}\n reloadButton={!!reload?.button}\n handleReload={handleReload}\n />\n {url instanceof Error ? (\n <ErrorCard error={url} />\n ) : (\n <Card tone=\"transparent\" style={{height: `100%`}}>\n <Frame\n ref={iframe}\n loading={loading}\n reloading={reloading}\n iframeSize={iframeSize}\n setReloading={setReloading}\n setLoading={setLoading}\n url={url}\n attributes={attributes}\n />\n </Card>\n )}\n </Flex>\n </MotionConfig>\n )\n})\n\ninterface FrameProps extends Required<Pick<IframeOptions, 'attributes'>> {\n loading: boolean\n reloading: boolean\n setLoading: (loading: boolean) => void\n setReloading: (reloading: boolean) => void\n iframeSize: IframeSizeKey\n url: URL | undefined\n}\nconst Frame = forwardRef(function Frame(\n props: FrameProps,\n iframe: React.ForwardedRef<HTMLIFrameElement>,\n) {\n const {loading, setLoading, iframeSize, attributes, reloading, url, setReloading} = props\n\n function handleIframeLoad() {\n setLoading(false)\n setReloading(false)\n // Run onLoad from attributes\n if (attributes.onLoad && typeof attributes.onLoad === 'function') {\n attributes.onLoad()\n }\n }\n\n return (\n <Flex align=\"center\" justify=\"center\" style={{height: `100%`, position: `relative`}}>\n <AnimatePresence>\n {!url ||\n (loading && (\n <MotionFlex\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={spinnerVariants}\n justify=\"center\"\n align=\"center\"\n style={{inset: `0`, position: `absolute`}}\n >\n <Loading iframeSize={iframeSize} />\n </MotionFlex>\n ))}\n </AnimatePresence>\n {url && (\n <motion.iframe\n ref={iframe}\n title=\"preview\"\n frameBorder=\"0\"\n style={{maxHeight: '100%'}}\n src={url.toString()}\n initial={['background', iframeSize]}\n variants={iframeVariants}\n animate={[\n loading ? 'background' : 'active',\n reloading ? 'reloading' : 'idle',\n iframeSize,\n ]}\n {...attributes}\n onLoad={handleIframeLoad}\n />\n )}\n </Flex>\n )\n})\n\nconst spinnerVariants = {\n initial: {opacity: 1},\n animate: {opacity: [0, 0, 1]},\n exit: {opacity: [1, 0, 0]},\n}\n\nconst iframeVariants = {\n ...sizes,\n desktop: {\n ...sizes.desktop,\n boxShadow: '0 0 0 0px var(--card-shadow-outline-color)',\n },\n mobile: {\n ...sizes.mobile,\n boxShadow: '0 0 0 1px var(--card-shadow-outline-color)',\n },\n background: {\n opacity: 0,\n scale: 1,\n },\n idle: {\n scale: 1,\n },\n reloading: {\n scale: [1, 1, 1, 0.98],\n },\n active: {\n opacity: [0, 0, 1],\n scale: 1,\n },\n}\n\nfunction Loading({iframeSize}: {iframeSize: IframeSizeKey}) {\n return (\n <Flex style={{...sizes[iframeSize]}} justify=\"center\" align=\"center\" direction=\"column\" gap={4}>\n <Spinner muted />\n <Text muted size={1}>\n Loading…\n </Text>\n </Flex>\n )\n}\n\nexport function ErrorCard({error}: {error: Error}) {\n return (\n <Card height=\"fill\">\n <Flex align=\"center\" height=\"fill\" justify=\"center\" padding={4} sizing=\"border\">\n <Container width={0}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Flex>\n <Box>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n </Box>\n <Stack flex={1} marginLeft={3} space={3}>\n <Text as=\"h1\" size={1} weight=\"bold\">\n {error.name}\n </Text>\n <Text as=\"p\" muted size={1}>\n {error.message}\n </Text>\n </Stack>\n </Flex>\n </Card>\n </Container>\n </Flex>\n </Card>\n )\n}\n\n// https://github.com/pmndrs/suspend-react?tab=readme-ov-file#making-cache-keys-unique\nconst resolveUUID = Symbol()\n"],"names":["draft","url","expiresAt"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-iframe-pane",
3
- "version": "3.1.2",
3
+ "version": "3.1.4",
4
4
  "description": "Display any URL in a View Pane, along with helpful buttons to Copy the URL or open in a new tab",
5
5
  "homepage": "https://github.com/sanity-io/sanity-plugin-iframe-pane#readme",
6
6
  "bugs": {
@@ -52,41 +52,41 @@
52
52
  "dependencies": {
53
53
  "@sanity/icons": "^2.7.0",
54
54
  "@sanity/incompatible-plugin": "^1.0.4",
55
- "@sanity/preview-url-secret": "^1.2.0",
55
+ "@sanity/preview-url-secret": "^1.3.3",
56
56
  "@sanity/ui": "^1.9.3",
57
57
  "framer-motion": "^10.16.5",
58
58
  "suspend-react": "0.1.3",
59
59
  "usehooks-ts": "2.9.1"
60
60
  },
61
61
  "devDependencies": {
62
- "@commitlint/cli": "^17.8.1",
63
- "@commitlint/config-conventional": "^17.8.1",
64
- "@sanity/pkg-utils": "^3.2.3",
62
+ "@commitlint/cli": "^19.2.0",
63
+ "@commitlint/config-conventional": "^19.1.0",
64
+ "@sanity/pkg-utils": "^4.4.2",
65
65
  "@sanity/plugin-kit": "^3.1.10",
66
66
  "@sanity/semantic-release-preset": "^4.1.6",
67
67
  "@typescript-eslint/eslint-plugin": "^5.62.0",
68
68
  "@typescript-eslint/parser": "^5.62.0",
69
- "eslint": "^8.53.0",
70
- "eslint-config-prettier": "^9.0.0",
69
+ "eslint": "^8.55.0",
70
+ "eslint-config-prettier": "^9.1.0",
71
71
  "eslint-config-react-app": "^7.0.1",
72
72
  "eslint-config-sanity": "^6.0.0",
73
73
  "eslint-plugin-import": "^2.29.0",
74
74
  "eslint-plugin-prettier": "^5.0.1",
75
75
  "eslint-plugin-react": "^7.33.2",
76
76
  "eslint-plugin-react-hooks": "^4.6.0",
77
- "eslint-plugin-simple-import-sort": "^10.0.0",
77
+ "eslint-plugin-simple-import-sort": "^12.0.0",
78
78
  "husky": "^8.0.3",
79
79
  "lint-staged": "^15.0.1",
80
80
  "npm-run-all": "^4.1.5",
81
81
  "prettier": "^3.1.0",
82
- "prettier-plugin-packagejson": "^2.4.6",
82
+ "prettier-plugin-packagejson": "^2.4.7",
83
83
  "react": "^18.2.0",
84
84
  "react-dom": "^18.2.0",
85
85
  "react-is": "^18.2.0",
86
86
  "rimraf": "^5.0.1",
87
- "sanity": "^3.20.0",
87
+ "sanity": "^3.21.1",
88
88
  "styled-components": "^6.1.1",
89
- "typescript": "^5.2.2"
89
+ "typescript": "^5.3.3"
90
90
  },
91
91
  "peerDependencies": {
92
92
  "react": "^18.2.0",
package/src/Iframe.tsx CHANGED
@@ -70,6 +70,7 @@ const MotionFlex = motion(Flex)
70
70
 
71
71
  export interface IframeProps {
72
72
  document: {
73
+ displayed: SanityDocument
73
74
  draft: SanityDocument | null
74
75
  published: SanityDocument | null
75
76
  }
@@ -78,7 +79,7 @@ export interface IframeProps {
78
79
 
79
80
  export function Iframe(props: IframeProps) {
80
81
  const {document, options} = props
81
- const draft = document.draft || document.published
82
+ const draft = document.draft || document.published || document.displayed
82
83
 
83
84
  const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options
84
85