sanity-plugin-iframe-pane 3.1.0 → 3.1.1

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.cjs CHANGED
@@ -188,15 +188,24 @@ function Iframe(props) {
188
188
  key
189
189
  } = options;
190
190
  const urlRef = react.useRef(options.url);
191
- const [draftSnapshot, setDraftSnapshot] = react.useState(() => draft);
191
+ const [draftSnapshot, setDraftSnapshot] = react.useState(() => ({
192
+ key,
193
+ draft
194
+ }));
192
195
  react.useEffect(() => {
193
196
  urlRef.current = options.url;
194
197
  }, [options.url]);
195
198
  react.useEffect(() => {
196
- if (JSON.stringify(draft) !== JSON.stringify(draftSnapshot)) {
197
- startTransition(() => setDraftSnapshot(draft));
199
+ if (JSON.stringify({
200
+ key,
201
+ draft
202
+ }) !== JSON.stringify(draftSnapshot)) {
203
+ startTransition(() => setDraftSnapshot({
204
+ key,
205
+ draft
206
+ }));
198
207
  }
199
- }, [draft, draftSnapshot]);
208
+ }, [draft, draftSnapshot, key]);
200
209
  const currentUser = sanity.useCurrentUser();
201
210
  const client = sanity.useClient({
202
211
  apiVersion: "2023-10-16"
@@ -262,8 +271,8 @@ function Iframe(props) {
262
271
  iframeSize: "desktop"
263
272
  }),
264
273
  children: /* @__PURE__ */jsxRuntime.jsx(IframeInner, {
265
- _key: key,
266
- draftSnapshot,
274
+ _key: draftSnapshot.key,
275
+ draftSnapshot: draftSnapshot.draft,
267
276
  url,
268
277
  isResolvingUrl,
269
278
  attributes,
@@ -271,7 +280,7 @@ function Iframe(props) {
271
280
  reload,
272
281
  showDisplayUrl,
273
282
  userId: currentUser == null ? void 0 : currentUser.id
274
- }, key)
283
+ }, draftSnapshot.key)
275
284
  });
276
285
  }
277
286
  const IframeInner = react.memo(function IframeInner2(props) {
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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 {\n document: {published, draft = published},\n options,\n } = props\n const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n const urlRef = useRef(options.url)\n const [draftSnapshot, setDraftSnapshot] = useState(() => draft)\n useEffect(() => {\n urlRef.current = options.url\n }, [options.url])\n useEffect(() => {\n if (JSON.stringify(draft) !== JSON.stringify(draftSnapshot)) {\n startTransition(() => setDraftSnapshot(draft))\n }\n }, [draft, draftSnapshot])\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={key}\n key={key}\n draftSnapshot={draftSnapshot}\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","published","draft","options","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.cjs","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 {\n document: {published, draft = published},\n options,\n } = props\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","published","draft","options","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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"}
package/lib/index.js CHANGED
@@ -183,15 +183,24 @@ function Iframe(props) {
183
183
  key
184
184
  } = options;
185
185
  const urlRef = useRef(options.url);
186
- const [draftSnapshot, setDraftSnapshot] = useState(() => draft);
186
+ const [draftSnapshot, setDraftSnapshot] = useState(() => ({
187
+ key,
188
+ draft
189
+ }));
187
190
  useEffect(() => {
188
191
  urlRef.current = options.url;
189
192
  }, [options.url]);
190
193
  useEffect(() => {
191
- if (JSON.stringify(draft) !== JSON.stringify(draftSnapshot)) {
192
- startTransition(() => setDraftSnapshot(draft));
194
+ if (JSON.stringify({
195
+ key,
196
+ draft
197
+ }) !== JSON.stringify(draftSnapshot)) {
198
+ startTransition(() => setDraftSnapshot({
199
+ key,
200
+ draft
201
+ }));
193
202
  }
194
- }, [draft, draftSnapshot]);
203
+ }, [draft, draftSnapshot, key]);
195
204
  const currentUser = useCurrentUser();
196
205
  const client = useClient({
197
206
  apiVersion: "2023-10-16"
@@ -257,8 +266,8 @@ function Iframe(props) {
257
266
  iframeSize: "desktop"
258
267
  }),
259
268
  children: /* @__PURE__ */jsx(IframeInner, {
260
- _key: key,
261
- draftSnapshot,
269
+ _key: draftSnapshot.key,
270
+ draftSnapshot: draftSnapshot.draft,
262
271
  url,
263
272
  isResolvingUrl,
264
273
  attributes,
@@ -266,7 +275,7 @@ function Iframe(props) {
266
275
  reload,
267
276
  showDisplayUrl,
268
277
  userId: currentUser == null ? void 0 : currentUser.id
269
- }, key)
278
+ }, draftSnapshot.key)
270
279
  });
271
280
  }
272
281
  const IframeInner = memo(function IframeInner2(props) {
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 {\n document: {published, draft = published},\n options,\n } = props\n const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options\n\n const urlRef = useRef(options.url)\n const [draftSnapshot, setDraftSnapshot] = useState(() => draft)\n useEffect(() => {\n urlRef.current = options.url\n }, [options.url])\n useEffect(() => {\n if (JSON.stringify(draft) !== JSON.stringify(draftSnapshot)) {\n startTransition(() => setDraftSnapshot(draft))\n }\n }, [draft, draftSnapshot])\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={key}\n key={key}\n draftSnapshot={draftSnapshot}\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","published","draft","options","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 draft: SanityDocument | null\n published: SanityDocument | null\n }\n options: IframeOptions\n}\n\nexport function Iframe(props: IframeProps) {\n const {\n document: {published, draft = published},\n options,\n } = props\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","published","draft","options","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-iframe-pane",
3
- "version": "3.1.0",
3
+ "version": "3.1.1",
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,7 +52,7 @@
52
52
  "dependencies": {
53
53
  "@sanity/icons": "^2.7.0",
54
54
  "@sanity/incompatible-plugin": "^1.0.4",
55
- "@sanity/preview-url-secret": "^1.1.0",
55
+ "@sanity/preview-url-secret": "^1.2.0",
56
56
  "@sanity/ui": "^1.9.3",
57
57
  "framer-motion": "^10.16.5",
58
58
  "suspend-react": "0.1.3",
package/src/Iframe.tsx CHANGED
@@ -84,15 +84,15 @@ export function Iframe(props: IframeProps) {
84
84
  const {defaultSize = DEFAULT_SIZE, reload, attributes, showDisplayUrl = true, key} = options
85
85
 
86
86
  const urlRef = useRef(options.url)
87
- const [draftSnapshot, setDraftSnapshot] = useState(() => draft)
87
+ const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))
88
88
  useEffect(() => {
89
89
  urlRef.current = options.url
90
90
  }, [options.url])
91
91
  useEffect(() => {
92
- if (JSON.stringify(draft) !== JSON.stringify(draftSnapshot)) {
93
- startTransition(() => setDraftSnapshot(draft))
92
+ if (JSON.stringify({key, draft}) !== JSON.stringify(draftSnapshot)) {
93
+ startTransition(() => setDraftSnapshot({key, draft}))
94
94
  }
95
- }, [draft, draftSnapshot])
95
+ }, [draft, draftSnapshot, key])
96
96
  const currentUser = useCurrentUser()
97
97
  const client = useClient({apiVersion: '2023-10-16'})
98
98
  const [expiresAt, setExpiresAt] = useState<number | undefined>()
@@ -167,9 +167,9 @@ export function Iframe(props: IframeProps) {
167
167
  return (
168
168
  <Suspense fallback={<Loading iframeSize="desktop" />}>
169
169
  <IframeInner
170
- _key={key}
171
- key={key}
172
- draftSnapshot={draftSnapshot}
170
+ key={draftSnapshot.key}
171
+ _key={draftSnapshot.key}
172
+ draftSnapshot={draftSnapshot.draft}
173
173
  url={url}
174
174
  isResolvingUrl={isResolvingUrl}
175
175
  attributes={attributes}