sanity-plugin-iframe-pane 4.0.0 → 5.0.0
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/LICENSE +1 -1
- package/README.md +0 -17
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +417 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -81
- package/lib/index.cjs +0 -375
- package/lib/index.cjs.map +0 -1
- package/lib/index.d.cts +0 -75
- package/lib/index.d.ts +0 -75
- package/lib/index.js +0 -384
- package/lib/index.js.map +0 -1
- package/sanity.json +0 -8
- package/src/DisplayUrl.tsx +0 -16
- package/src/Iframe.tsx +0 -443
- package/src/Toolbar.tsx +0 -185
- package/src/index.ts +0 -8
- package/src/types.ts +0 -11
- package/v2-incompatible.js +0 -11
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# sanity-plugin-iframe-pane
|
|
2
2
|
|
|
3
|
-
> For the v2 version, please refer to the [v2-branch](https://github.com/sanity-io/sanity-plugin-iframe-pane/tree/studio-v2).
|
|
4
|
-
|
|
5
3
|
Display any URL in a View Pane, along with helpful buttons to Copy the URL or open it in a new tab.
|
|
6
4
|
|
|
7
5
|
Accepts either a string or an async function to resolve a URL based on the current document.
|
|
@@ -117,18 +115,3 @@ attributes: {
|
|
|
117
115
|
## License
|
|
118
116
|
|
|
119
117
|
MIT-licensed. See LICENSE.
|
|
120
|
-
|
|
121
|
-
## Develop & test
|
|
122
|
-
|
|
123
|
-
This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
|
|
124
|
-
with default configuration for build & watch scripts.
|
|
125
|
-
|
|
126
|
-
See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
|
|
127
|
-
on how to run this plugin with hotreload in the studio.
|
|
128
|
-
|
|
129
|
-
### Release new version
|
|
130
|
-
|
|
131
|
-
Run ["CI & Release" workflow](https://github.com/sanity-io/sanity-plugin-iframe-pane/actions/workflows/main.yml).
|
|
132
|
-
Make sure to select the `main` branch and check "Release new version".
|
|
133
|
-
|
|
134
|
-
Semantic release will only release on configured branches, so it is safe to run release on any branch.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { HTMLAttributeReferrerPolicy } from "react";
|
|
2
|
+
import { SanityDocument, usePerspective } from "sanity";
|
|
3
|
+
type IframeSizeKey = keyof SizeProps;
|
|
4
|
+
type Size = 'desktop' | 'mobile';
|
|
5
|
+
type SizeProps = { [key in Size]: {
|
|
6
|
+
width: string | number;
|
|
7
|
+
height: string | number;
|
|
8
|
+
} };
|
|
9
|
+
type UrlResolver = (document: SanityDocument | null, perspective: Pick<ReturnType<typeof usePerspective>, 'selectedPerspectiveName' | 'perspectiveStack'>) => string | Error | undefined | Promise<string | Error | undefined>;
|
|
10
|
+
interface IframeOptions {
|
|
11
|
+
/**
|
|
12
|
+
* If you have multiple iframe instances side-by-side you need to give each a unique key.
|
|
13
|
+
*/
|
|
14
|
+
key?: string;
|
|
15
|
+
url: string | UrlResolver | {
|
|
16
|
+
/**
|
|
17
|
+
* The URL origin of where the preview is hosted, for example `https://example.com`.
|
|
18
|
+
* If it's an embedded Studio then set it to `'same-origin'`.
|
|
19
|
+
*/
|
|
20
|
+
origin: 'same-origin' | (string & {});
|
|
21
|
+
/**
|
|
22
|
+
* The route to redirect to after enabling Draft Mode.
|
|
23
|
+
* If you don't have enough data to build the URL, return an `Error` instance to show an error message.
|
|
24
|
+
* @example `return new Error('Missing slug')`
|
|
25
|
+
* To prolong the loading state, return `undefined`
|
|
26
|
+
*/
|
|
27
|
+
preview: string | UrlResolver;
|
|
28
|
+
/**
|
|
29
|
+
* The route that enables Draft Mode
|
|
30
|
+
* @example '/api/draft'
|
|
31
|
+
*/
|
|
32
|
+
draftMode: string;
|
|
33
|
+
};
|
|
34
|
+
defaultSize?: IframeSizeKey;
|
|
35
|
+
showDisplayUrl?: boolean;
|
|
36
|
+
reload?: {
|
|
37
|
+
button?: boolean;
|
|
38
|
+
};
|
|
39
|
+
attributes?: Partial<{
|
|
40
|
+
allow: string;
|
|
41
|
+
referrerPolicy: HTMLAttributeReferrerPolicy | undefined;
|
|
42
|
+
sandbox: string;
|
|
43
|
+
onLoad: () => void;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
interface IframeProps {
|
|
47
|
+
document: {
|
|
48
|
+
displayed: SanityDocument;
|
|
49
|
+
draft: SanityDocument | null;
|
|
50
|
+
published: SanityDocument | null;
|
|
51
|
+
};
|
|
52
|
+
options: IframeOptions;
|
|
53
|
+
}
|
|
54
|
+
declare function Iframe(props: IframeProps): React.JSX.Element;
|
|
55
|
+
export { Iframe, type IframeOptions, type IframeProps, type IframeSizeKey, type Size, type SizeProps, type UrlResolver };
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/Iframe.tsx"],"sourcesContent":[],"mappings":";;KAAY,aAAA,SAAsB;KAEtB,IAAA;KAEA,SAAA,aACF,IALE,GAAA;EAEA,KAAI,EAAA,MAAA,GAAA,MAAA;EAEJ,MAAA,EAAS,MAAA,GAAA,MACX;GC0BV;AD/BY,KC+BA,WAAA,GD/Ba,CAAA,QAAS,ECgCtB,cDhC+B,GAAA,IAAA,EAAA,WAAA,ECiC5B,IDjC4B,CCkCvC,UDlCuC,CAAA,OCkCrB,cDlCqB,CAAA,EAAA,yBAAA,GAAA,kBAAA,CAAA,EAAA,GAAA,MAAA,GCqC7B,KDrC6B,GAAA,SAAA,GCqCT,ODrCS,CAAA,MAAA,GCqCQ,KDrCR,GAAA,SAAA,CAAA;AAI/B,UCqCK,aAAA,CDpCP;;AC0BV;;EAGsB,GAAA,CAAA,EAAA,MAAA;EAAlB,GAAA,EAAA,MAAA,GAcE,WAdF,GAAA;IADW;;;;IAI0B,MAAA,EAAA,aAAA,GAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA;IAIxB;;;;;;IAgCK,OAAA,EAAA,MAAA,GAZI,WAYJ;IAUL;;;;IAMN,SAAA,EAAA,MAAA;EAAa,CAAA;EAOR,WAAM,CAAA,EA5BN,aA4Bc;;;;;eAvBf;;oBAEK;;;;;UAQH,WAAA;;eAEF;WACJ;eACI;;WAEJ;;iBAOK,MAAA,QAAc,cAAc,KAAA,CAAM,GAAA,CAAI"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { c } from "react/compiler-runtime";
|
|
3
|
+
import { MobileDeviceIcon, RefreshIcon, CopyIcon, LaunchIcon, WarningOutlineIcon } from "@sanity/icons";
|
|
4
|
+
import { createPreviewSecret } from "@sanity/preview-url-secret/create-secret";
|
|
5
|
+
import { definePreviewUrl } from "@sanity/preview-url-secret/define-preview-url";
|
|
6
|
+
import { Text, useToast, Button, Flex, Tooltip, Box, Card, usePrefersReducedMotion, Container, Stack, Spinner } from "@sanity/ui";
|
|
7
|
+
import { motion, MotionConfig, AnimatePresence } from "motion/react";
|
|
8
|
+
import { useRef, useState, memo, forwardRef, useEffect, useTransition, Suspense } from "react";
|
|
9
|
+
import { useActiveWorkspace, useCurrentUser, useClient, usePerspective } from "sanity";
|
|
10
|
+
import { suspend } from "suspend-react";
|
|
11
|
+
import { getRedirectTo } from "@sanity/preview-url-secret/get-redirect-to";
|
|
12
|
+
function DisplayUrl(props) {
|
|
13
|
+
const $ = c(4);
|
|
14
|
+
let t0;
|
|
15
|
+
$[0] !== props.url ? (t0 = getRedirectTo(props.url), $[0] = props.url, $[1] = t0) : t0 = $[1];
|
|
16
|
+
const url = t0, truncatedUrl = `${url.origin === location.origin ? "" : url.origin}${url.pathname}${url.search}`;
|
|
17
|
+
let t1;
|
|
18
|
+
return $[2] !== truncatedUrl ? (t1 = /* @__PURE__ */ jsx(Text, { size: 0, textOverflow: "ellipsis", children: truncatedUrl }), $[2] = truncatedUrl, $[3] = t1) : t1 = $[3], t1;
|
|
19
|
+
}
|
|
20
|
+
const sizes = {
|
|
21
|
+
desktop: {
|
|
22
|
+
width: "100%",
|
|
23
|
+
height: "100%"
|
|
24
|
+
},
|
|
25
|
+
mobile: {
|
|
26
|
+
width: 414,
|
|
27
|
+
height: 746
|
|
28
|
+
}
|
|
29
|
+
}, DEFAULT_SIZE = "desktop";
|
|
30
|
+
function Toolbar(props) {
|
|
31
|
+
const $ = c(60), {
|
|
32
|
+
url,
|
|
33
|
+
iframeSize,
|
|
34
|
+
setIframeSize,
|
|
35
|
+
reloading,
|
|
36
|
+
showUrl,
|
|
37
|
+
reloadButton,
|
|
38
|
+
handleReload
|
|
39
|
+
} = props, validUrl = url instanceof URL, input = useRef(null), {
|
|
40
|
+
push: pushToast
|
|
41
|
+
} = useToast(), [, copy] = useCopyToClipboard();
|
|
42
|
+
let t0;
|
|
43
|
+
$[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = {
|
|
44
|
+
position: "absolute",
|
|
45
|
+
pointerEvents: "none",
|
|
46
|
+
opacity: 0
|
|
47
|
+
}, $[0] = t0) : t0 = $[0];
|
|
48
|
+
let t1;
|
|
49
|
+
$[1] !== url || $[2] !== validUrl ? (t1 = validUrl ? url.toString() : "", $[1] = url, $[2] = validUrl, $[3] = t1) : t1 = $[3];
|
|
50
|
+
let t2;
|
|
51
|
+
$[4] !== t1 ? (t2 = /* @__PURE__ */ jsx("textarea", { style: t0, ref: input, value: t1, readOnly: !0, tabIndex: -1 }), $[4] = t1, $[5] = t2) : t2 = $[5];
|
|
52
|
+
let t3;
|
|
53
|
+
$[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = {
|
|
54
|
+
whiteSpace: "nowrap"
|
|
55
|
+
}, $[6] = t3) : t3 = $[6];
|
|
56
|
+
const t4 = iframeSize === "mobile" ? "Exit mobile preview" : "Preview mobile viewport";
|
|
57
|
+
let t5;
|
|
58
|
+
$[7] !== t4 ? (t5 = /* @__PURE__ */ jsx(Text, { size: 1, style: t3, children: t4 }), $[7] = t4, $[8] = t5) : t5 = $[8];
|
|
59
|
+
const t6 = !validUrl;
|
|
60
|
+
let t7;
|
|
61
|
+
$[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = [1], $[9] = t7) : t7 = $[9];
|
|
62
|
+
const t8 = iframeSize === "mobile" ? "default" : "ghost";
|
|
63
|
+
let t9;
|
|
64
|
+
$[10] !== iframeSize || $[11] !== setIframeSize ? (t9 = () => setIframeSize(iframeSize === "mobile" ? "desktop" : "mobile"), $[10] = iframeSize, $[11] = setIframeSize, $[12] = t9) : t9 = $[12];
|
|
65
|
+
let t10;
|
|
66
|
+
$[13] !== t6 || $[14] !== t8 || $[15] !== t9 ? (t10 = /* @__PURE__ */ jsx(Button, { disabled: t6, fontSize: t7, padding: 2, mode: t8, icon: MobileDeviceIcon, onClick: t9 }), $[13] = t6, $[14] = t8, $[15] = t9, $[16] = t10) : t10 = $[16];
|
|
67
|
+
let t11;
|
|
68
|
+
$[17] !== t10 || $[18] !== t5 ? (t11 = /* @__PURE__ */ jsx(Flex, { align: "center", gap: 1, children: /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t5, padding: 2, placement: "bottom-start", children: t10 }) }), $[17] = t10, $[18] = t5, $[19] = t11) : t11 = $[19];
|
|
69
|
+
let t12;
|
|
70
|
+
$[20] !== showUrl || $[21] !== url || $[22] !== validUrl ? (t12 = showUrl && validUrl && /* @__PURE__ */ jsx(DisplayUrl, { url }), $[20] = showUrl, $[21] = url, $[22] = validUrl, $[23] = t12) : t12 = $[23];
|
|
71
|
+
let t13;
|
|
72
|
+
$[24] !== t12 ? (t13 = /* @__PURE__ */ jsx(Box, { flex: 1, children: t12 }), $[24] = t12, $[25] = t13) : t13 = $[25];
|
|
73
|
+
let t14;
|
|
74
|
+
$[26] !== handleReload || $[27] !== reloadButton || $[28] !== reloading || $[29] !== validUrl ? (t14 = reloadButton ? /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: /* @__PURE__ */ jsx(Text, { size: 1, style: {
|
|
75
|
+
whiteSpace: "nowrap"
|
|
76
|
+
}, children: reloading ? "Reloading\u2026" : "Reload" }), padding: 2, children: /* @__PURE__ */ jsx(Button, { disabled: !validUrl, mode: "bleed", fontSize: [1], padding: 2, icon: RefreshIcon, loading: reloading, "aria-label": "Reload", onClick: () => handleReload() }) }) : null, $[26] = handleReload, $[27] = reloadButton, $[28] = reloading, $[29] = validUrl, $[30] = t14) : t14 = $[30];
|
|
77
|
+
let t15;
|
|
78
|
+
$[31] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t15 = /* @__PURE__ */ jsx(Text, { size: 1, style: {
|
|
79
|
+
whiteSpace: "nowrap"
|
|
80
|
+
}, children: "Copy URL" }), $[31] = t15) : t15 = $[31];
|
|
81
|
+
const t16 = !validUrl;
|
|
82
|
+
let t17;
|
|
83
|
+
$[32] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t17 = [1], $[32] = t17) : t17 = $[32];
|
|
84
|
+
let t18;
|
|
85
|
+
$[33] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t18 = [2], $[33] = t18) : t18 = $[33];
|
|
86
|
+
let t19;
|
|
87
|
+
$[34] !== copy || $[35] !== pushToast ? (t19 = () => {
|
|
88
|
+
input?.current?.value && copy(input.current.value).then((copied) => (pushToast(copied ? {
|
|
89
|
+
closable: !0,
|
|
90
|
+
status: "success",
|
|
91
|
+
title: "The URL is copied to the clipboard"
|
|
92
|
+
} : {
|
|
93
|
+
closable: !0,
|
|
94
|
+
status: "error",
|
|
95
|
+
title: "Failed to copy the URL to the clipboard"
|
|
96
|
+
}), copied));
|
|
97
|
+
}, $[34] = copy, $[35] = pushToast, $[36] = t19) : t19 = $[36];
|
|
98
|
+
let t20;
|
|
99
|
+
$[37] !== t16 || $[38] !== t19 ? (t20 = /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t15, padding: 2, children: /* @__PURE__ */ jsx(Button, { mode: "bleed", disabled: t16, fontSize: t17, icon: CopyIcon, padding: t18, "aria-label": "Copy URL", onClick: t19 }) }), $[37] = t16, $[38] = t19, $[39] = t20) : t20 = $[39];
|
|
100
|
+
let t21;
|
|
101
|
+
$[40] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t21 = /* @__PURE__ */ jsx(Text, { size: 1, style: {
|
|
102
|
+
whiteSpace: "nowrap"
|
|
103
|
+
}, children: "Open URL in a new tab" }), $[40] = t21) : t21 = $[40];
|
|
104
|
+
const t22 = !validUrl;
|
|
105
|
+
let t23;
|
|
106
|
+
$[41] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t23 = [1], $[41] = t23) : t23 = $[41];
|
|
107
|
+
let t24;
|
|
108
|
+
$[42] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t24 = [2], $[42] = t24) : t24 = $[42];
|
|
109
|
+
let t25;
|
|
110
|
+
$[43] !== url || $[44] !== validUrl ? (t25 = validUrl ? () => window.open(url.toString()) : void 0, $[43] = url, $[44] = validUrl, $[45] = t25) : t25 = $[45];
|
|
111
|
+
let t26;
|
|
112
|
+
$[46] !== t22 || $[47] !== t25 ? (t26 = /* @__PURE__ */ jsx(Tooltip, { animate: !0, content: t21, padding: 2, placement: "bottom-end", children: /* @__PURE__ */ jsx(Button, { disabled: t22, fontSize: t23, icon: LaunchIcon, mode: "ghost", paddingY: t24, text: "Open", "aria-label": "Open URL in a new tab", onClick: t25 }) }), $[46] = t22, $[47] = t25, $[48] = t26) : t26 = $[48];
|
|
113
|
+
let t27;
|
|
114
|
+
$[49] !== t14 || $[50] !== t20 || $[51] !== t26 ? (t27 = /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 1, children: [
|
|
115
|
+
t14,
|
|
116
|
+
t20,
|
|
117
|
+
t26
|
|
118
|
+
] }), $[49] = t14, $[50] = t20, $[51] = t26, $[52] = t27) : t27 = $[52];
|
|
119
|
+
let t28;
|
|
120
|
+
$[53] !== t11 || $[54] !== t13 || $[55] !== t27 ? (t28 = /* @__PURE__ */ jsx(Card, { padding: 2, borderBottom: !0, children: /* @__PURE__ */ jsxs(Flex, { align: "center", gap: 2, children: [
|
|
121
|
+
t11,
|
|
122
|
+
t13,
|
|
123
|
+
t27
|
|
124
|
+
] }) }), $[53] = t11, $[54] = t13, $[55] = t27, $[56] = t28) : t28 = $[56];
|
|
125
|
+
let t29;
|
|
126
|
+
return $[57] !== t2 || $[58] !== t28 ? (t29 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
127
|
+
t2,
|
|
128
|
+
t28
|
|
129
|
+
] }), $[57] = t2, $[58] = t28, $[59] = t29) : t29 = $[59], t29;
|
|
130
|
+
}
|
|
131
|
+
function useCopyToClipboard() {
|
|
132
|
+
const $ = c(3), [copiedText, setCopiedText] = useState(null);
|
|
133
|
+
let t0;
|
|
134
|
+
$[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t0 = async (text) => {
|
|
135
|
+
if (!navigator?.clipboard)
|
|
136
|
+
return console.warn("Clipboard not supported"), !1;
|
|
137
|
+
try {
|
|
138
|
+
return await navigator.clipboard.writeText(text), setCopiedText(text), !0;
|
|
139
|
+
} catch (t12) {
|
|
140
|
+
return console.warn("Copy failed", t12), setCopiedText(null), !1;
|
|
141
|
+
}
|
|
142
|
+
}, $[0] = t0) : t0 = $[0];
|
|
143
|
+
const copy = t0;
|
|
144
|
+
let t1;
|
|
145
|
+
return $[1] !== copiedText ? (t1 = [copiedText, copy], $[1] = copiedText, $[2] = t1) : t1 = $[2], t1;
|
|
146
|
+
}
|
|
147
|
+
const MotionFlex = motion.create(Flex);
|
|
148
|
+
function encodeStudioPerspective(studioPerspective) {
|
|
149
|
+
return Array.isArray(studioPerspective) ? studioPerspective.join(",") : studioPerspective;
|
|
150
|
+
}
|
|
151
|
+
function Iframe(props) {
|
|
152
|
+
const $ = c(36), {
|
|
153
|
+
document,
|
|
154
|
+
options
|
|
155
|
+
} = props, draft = document.draft || document.published || document.displayed, {
|
|
156
|
+
defaultSize: t0,
|
|
157
|
+
reload,
|
|
158
|
+
attributes,
|
|
159
|
+
showDisplayUrl: t1,
|
|
160
|
+
key
|
|
161
|
+
} = options, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0, showDisplayUrl = t1 === void 0 ? !0 : t1, basePath = useActiveWorkspace()?.activeWorkspace?.basePath || "/", urlRef = useRef(options.url);
|
|
162
|
+
let t2;
|
|
163
|
+
$[0] !== draft || $[1] !== key ? (t2 = () => ({
|
|
164
|
+
key,
|
|
165
|
+
draft
|
|
166
|
+
}), $[0] = draft, $[1] = key, $[2] = t2) : t2 = $[2];
|
|
167
|
+
const [draftSnapshot, setDraftSnapshot] = useState(t2);
|
|
168
|
+
let t3, t4;
|
|
169
|
+
$[3] !== options.url ? (t3 = () => {
|
|
170
|
+
urlRef.current = options.url;
|
|
171
|
+
}, t4 = [options.url], $[3] = options.url, $[4] = t3, $[5] = t4) : (t3 = $[4], t4 = $[5]), useEffect(t3, t4);
|
|
172
|
+
const currentUser = useCurrentUser();
|
|
173
|
+
let t5;
|
|
174
|
+
$[6] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t5 = {
|
|
175
|
+
apiVersion: "2023-10-16"
|
|
176
|
+
}, $[6] = t5) : t5 = $[6];
|
|
177
|
+
const client = useClient(t5), [expiresAt, setExpiresAt] = useState(), previewSecretRef = useRef(void 0), [isResolvingUrl, startTransition] = useTransition(), {
|
|
178
|
+
perspectiveStack,
|
|
179
|
+
selectedPerspectiveName
|
|
180
|
+
} = usePerspective();
|
|
181
|
+
let t6;
|
|
182
|
+
$[7] !== perspectiveStack || $[8] !== selectedPerspectiveName ? (t6 = {
|
|
183
|
+
perspectiveStack,
|
|
184
|
+
selectedPerspectiveName
|
|
185
|
+
}, $[7] = perspectiveStack, $[8] = selectedPerspectiveName, $[9] = t6) : t6 = $[9];
|
|
186
|
+
const perspective = t6;
|
|
187
|
+
let t7, t8;
|
|
188
|
+
$[10] !== draft || $[11] !== draftSnapshot || $[12] !== key ? (t7 = () => {
|
|
189
|
+
JSON.stringify({
|
|
190
|
+
key,
|
|
191
|
+
draft
|
|
192
|
+
}) !== JSON.stringify(draftSnapshot) && startTransition(() => setDraftSnapshot({
|
|
193
|
+
key,
|
|
194
|
+
draft
|
|
195
|
+
}));
|
|
196
|
+
}, t8 = [draft, draftSnapshot, key, startTransition], $[10] = draft, $[11] = draftSnapshot, $[12] = key, $[13] = t7, $[14] = t8) : (t7 = $[13], t8 = $[14]), useEffect(t7, t8);
|
|
197
|
+
let t9;
|
|
198
|
+
$[15] !== basePath || $[16] !== client || $[17] !== currentUser?.id || $[18] !== perspective ? (t9 = async (draft_0) => {
|
|
199
|
+
if (typeof location > "u")
|
|
200
|
+
return;
|
|
201
|
+
const urlProp = urlRef.current;
|
|
202
|
+
if (typeof urlProp == "string")
|
|
203
|
+
return new URL(urlProp, location.origin);
|
|
204
|
+
if (typeof urlProp == "function") {
|
|
205
|
+
const url = await urlProp(draft_0, perspective);
|
|
206
|
+
return typeof url == "string" ? new URL(url, location.origin) : url;
|
|
207
|
+
}
|
|
208
|
+
if (typeof urlProp == "object") {
|
|
209
|
+
const preview = typeof urlProp.preview == "function" ? await urlProp.preview(draft_0, perspective) : urlProp.preview;
|
|
210
|
+
if (typeof preview != "string")
|
|
211
|
+
return preview;
|
|
212
|
+
if (!previewSecretRef.current) {
|
|
213
|
+
const {
|
|
214
|
+
secret,
|
|
215
|
+
expiresAt: expiresAt_0
|
|
216
|
+
} = await createPreviewSecret(client, "sanity-plugin-iframe-pane", location.href, currentUser?.id);
|
|
217
|
+
previewSecretRef.current = secret, startTransition(() => setExpiresAt(expiresAt_0.getTime()));
|
|
218
|
+
}
|
|
219
|
+
const url_0 = await definePreviewUrl({
|
|
220
|
+
origin: urlProp.origin === "same-origin" ? location.origin : urlProp.origin,
|
|
221
|
+
preview,
|
|
222
|
+
draftMode: {
|
|
223
|
+
enable: urlProp.draftMode
|
|
224
|
+
}
|
|
225
|
+
})({
|
|
226
|
+
client,
|
|
227
|
+
previewUrlSecret: previewSecretRef.current,
|
|
228
|
+
previewSearchParam: null,
|
|
229
|
+
studioBasePath: basePath,
|
|
230
|
+
studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack)
|
|
231
|
+
});
|
|
232
|
+
return new URL(url_0, location.origin);
|
|
233
|
+
}
|
|
234
|
+
}, $[15] = basePath, $[16] = client, $[17] = currentUser?.id, $[18] = perspective, $[19] = t9) : t9 = $[19];
|
|
235
|
+
const url_1 = t9;
|
|
236
|
+
let t10, t11;
|
|
237
|
+
$[20] !== expiresAt ? (t10 = () => {
|
|
238
|
+
if (expiresAt) {
|
|
239
|
+
const timeout = setTimeout(() => {
|
|
240
|
+
startTransition(() => setExpiresAt(void 0)), previewSecretRef.current = void 0;
|
|
241
|
+
}, Math.max(0, expiresAt - Date.now()));
|
|
242
|
+
return () => clearTimeout(timeout);
|
|
243
|
+
}
|
|
244
|
+
}, t11 = [expiresAt], $[20] = expiresAt, $[21] = t10, $[22] = t11) : (t10 = $[21], t11 = $[22]), useEffect(t10, t11);
|
|
245
|
+
let t12;
|
|
246
|
+
$[23] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t12 = /* @__PURE__ */ jsx(Loading, { iframeSize: "desktop" }), $[23] = t12) : t12 = $[23];
|
|
247
|
+
const t13 = `${draftSnapshot.key}-${selectedPerspectiveName || "draft"}`, t14 = currentUser?.id;
|
|
248
|
+
let t15;
|
|
249
|
+
return $[24] !== attributes || $[25] !== defaultSize || $[26] !== draftSnapshot.draft || $[27] !== draftSnapshot.key || $[28] !== isResolvingUrl || $[29] !== perspective || $[30] !== reload || $[31] !== showDisplayUrl || $[32] !== t13 || $[33] !== t14 || $[34] !== url_1 ? (t15 = /* @__PURE__ */ jsx(Suspense, { fallback: t12, children: /* @__PURE__ */ jsx(IframeInner, { _key: draftSnapshot.key, draftSnapshot: draftSnapshot.draft, url: url_1, isResolvingUrl, attributes, perspective, defaultSize, reload, showDisplayUrl, userId: t14 }, t13) }), $[24] = attributes, $[25] = defaultSize, $[26] = draftSnapshot.draft, $[27] = draftSnapshot.key, $[28] = isResolvingUrl, $[29] = perspective, $[30] = reload, $[31] = showDisplayUrl, $[32] = t13, $[33] = t14, $[34] = url_1, $[35] = t15) : t15 = $[35], t15;
|
|
250
|
+
}
|
|
251
|
+
const IframeInner = memo(function(props) {
|
|
252
|
+
const $ = c(35), {
|
|
253
|
+
isResolvingUrl,
|
|
254
|
+
defaultSize: t0,
|
|
255
|
+
reload,
|
|
256
|
+
attributes: t1,
|
|
257
|
+
showDisplayUrl: t2,
|
|
258
|
+
draftSnapshot,
|
|
259
|
+
userId,
|
|
260
|
+
expiresAt,
|
|
261
|
+
perspective: t3,
|
|
262
|
+
_key
|
|
263
|
+
} = props, defaultSize = t0 === void 0 ? DEFAULT_SIZE : t0;
|
|
264
|
+
let t4;
|
|
265
|
+
$[0] !== t1 ? (t4 = t1 === void 0 ? {} : t1, $[0] = t1, $[1] = t4) : t4 = $[1];
|
|
266
|
+
const attributes = t4, showDisplayUrl = t2 === void 0 ? !0 : t2, {
|
|
267
|
+
selectedPerspectiveName,
|
|
268
|
+
perspectiveStack
|
|
269
|
+
} = t3, [iframeSize, setIframeSize] = useState(sizes?.[defaultSize] ? defaultSize : DEFAULT_SIZE), prefersReducedMotion = usePrefersReducedMotion();
|
|
270
|
+
let t5;
|
|
271
|
+
$[2] !== draftSnapshot || $[3] !== props ? (t5 = () => props.url(draftSnapshot), $[2] = draftSnapshot, $[3] = props, $[4] = t5) : t5 = $[4];
|
|
272
|
+
let t6;
|
|
273
|
+
$[5] !== _key || $[6] !== draftSnapshot || $[7] !== expiresAt || $[8] !== perspectiveStack || $[9] !== selectedPerspectiveName || $[10] !== t5 || $[11] !== userId ? (t6 = suspend(t5, ["sanity-plugin-iframe-pane", draftSnapshot, selectedPerspectiveName, perspectiveStack, userId, expiresAt, _key, resolveUUID]), $[5] = _key, $[6] = draftSnapshot, $[7] = expiresAt, $[8] = perspectiveStack, $[9] = selectedPerspectiveName, $[10] = t5, $[11] = userId, $[12] = t6) : t6 = $[12];
|
|
274
|
+
const url = t6, [loading, setLoading] = useState(!0), [_reloading, setReloading] = useState(!1), reloading = _reloading || isResolvingUrl, iframe = useRef(null);
|
|
275
|
+
let t7;
|
|
276
|
+
$[13] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t7 = () => {
|
|
277
|
+
if (!iframe?.current)
|
|
278
|
+
return;
|
|
279
|
+
const {
|
|
280
|
+
src
|
|
281
|
+
} = iframe.current;
|
|
282
|
+
iframe.current.src = src, setReloading(!0);
|
|
283
|
+
}, $[13] = t7) : t7 = $[13];
|
|
284
|
+
const handleReload = t7;
|
|
285
|
+
let t8;
|
|
286
|
+
$[14] !== prefersReducedMotion ? (t8 = prefersReducedMotion ? {
|
|
287
|
+
duration: 0
|
|
288
|
+
} : void 0, $[14] = prefersReducedMotion, $[15] = t8) : t8 = $[15];
|
|
289
|
+
let t9;
|
|
290
|
+
$[16] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t9 = {
|
|
291
|
+
height: "100%"
|
|
292
|
+
}, $[16] = t9) : t9 = $[16];
|
|
293
|
+
const t10 = !!reload?.button;
|
|
294
|
+
let t11;
|
|
295
|
+
$[17] !== iframeSize || $[18] !== reloading || $[19] !== showDisplayUrl || $[20] !== t10 || $[21] !== url ? (t11 = /* @__PURE__ */ jsx(Toolbar, { url, iframeSize, reloading, setIframeSize, showUrl: showDisplayUrl, reloadButton: t10, handleReload }), $[17] = iframeSize, $[18] = reloading, $[19] = showDisplayUrl, $[20] = t10, $[21] = url, $[22] = t11) : t11 = $[22];
|
|
296
|
+
let t12;
|
|
297
|
+
$[23] !== attributes || $[24] !== iframeSize || $[25] !== loading || $[26] !== reloading || $[27] !== url ? (t12 = url instanceof Error ? /* @__PURE__ */ jsx(ErrorCard, { error: url }) : /* @__PURE__ */ jsx(Card, { tone: "transparent", style: {
|
|
298
|
+
height: "100%"
|
|
299
|
+
}, children: /* @__PURE__ */ jsx(Frame, { ref: iframe, loading, reloading, iframeSize, setReloading, setLoading, url, attributes }) }), $[23] = attributes, $[24] = iframeSize, $[25] = loading, $[26] = reloading, $[27] = url, $[28] = t12) : t12 = $[28];
|
|
300
|
+
let t13;
|
|
301
|
+
$[29] !== t11 || $[30] !== t12 ? (t13 = /* @__PURE__ */ jsxs(Flex, { direction: "column", style: t9, children: [
|
|
302
|
+
t11,
|
|
303
|
+
t12
|
|
304
|
+
] }), $[29] = t11, $[30] = t12, $[31] = t13) : t13 = $[31];
|
|
305
|
+
let t14;
|
|
306
|
+
return $[32] !== t13 || $[33] !== t8 ? (t14 = /* @__PURE__ */ jsx(MotionConfig, { transition: t8, children: t13 }), $[32] = t13, $[33] = t8, $[34] = t14) : t14 = $[34], t14;
|
|
307
|
+
}), Frame = forwardRef(function(props, iframe) {
|
|
308
|
+
const $ = c(22), {
|
|
309
|
+
loading,
|
|
310
|
+
setLoading,
|
|
311
|
+
iframeSize,
|
|
312
|
+
attributes,
|
|
313
|
+
reloading,
|
|
314
|
+
url,
|
|
315
|
+
setReloading
|
|
316
|
+
} = props;
|
|
317
|
+
let t0;
|
|
318
|
+
$[0] !== attributes || $[1] !== setLoading || $[2] !== setReloading ? (t0 = function() {
|
|
319
|
+
setLoading(!1), setReloading(!1), attributes.onLoad && typeof attributes.onLoad == "function" && attributes.onLoad();
|
|
320
|
+
}, $[0] = attributes, $[1] = setLoading, $[2] = setReloading, $[3] = t0) : t0 = $[3];
|
|
321
|
+
const handleIframeLoad = t0;
|
|
322
|
+
let t1;
|
|
323
|
+
$[4] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = {
|
|
324
|
+
height: "100%",
|
|
325
|
+
position: "relative"
|
|
326
|
+
}, $[4] = t1) : t1 = $[4];
|
|
327
|
+
let t2;
|
|
328
|
+
$[5] !== iframeSize || $[6] !== loading || $[7] !== url ? (t2 = !url || loading && /* @__PURE__ */ jsx(MotionFlex, { initial: "initial", animate: "animate", exit: "exit", variants: spinnerVariants, justify: "center", align: "center", style: {
|
|
329
|
+
inset: "0",
|
|
330
|
+
position: "absolute"
|
|
331
|
+
}, children: /* @__PURE__ */ jsx(Loading, { iframeSize }) }), $[5] = iframeSize, $[6] = loading, $[7] = url, $[8] = t2) : t2 = $[8];
|
|
332
|
+
let t3;
|
|
333
|
+
$[9] !== t2 ? (t3 = /* @__PURE__ */ jsx(AnimatePresence, { children: t2 }), $[9] = t2, $[10] = t3) : t3 = $[10];
|
|
334
|
+
let t4;
|
|
335
|
+
$[11] !== attributes || $[12] !== handleIframeLoad || $[13] !== iframe || $[14] !== iframeSize || $[15] !== loading || $[16] !== reloading || $[17] !== url ? (t4 = url && /* @__PURE__ */ jsx(motion.iframe, { ref: iframe, title: "preview", frameBorder: "0", style: {
|
|
336
|
+
maxHeight: "100%"
|
|
337
|
+
}, src: url.toString(), initial: ["background", iframeSize], variants: iframeVariants, animate: [loading ? "background" : "active", reloading ? "reloading" : "idle", iframeSize], ...attributes, onLoad: handleIframeLoad }), $[11] = attributes, $[12] = handleIframeLoad, $[13] = iframe, $[14] = iframeSize, $[15] = loading, $[16] = reloading, $[17] = url, $[18] = t4) : t4 = $[18];
|
|
338
|
+
let t5;
|
|
339
|
+
return $[19] !== t3 || $[20] !== t4 ? (t5 = /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "center", style: t1, children: [
|
|
340
|
+
t3,
|
|
341
|
+
t4
|
|
342
|
+
] }), $[19] = t3, $[20] = t4, $[21] = t5) : t5 = $[21], t5;
|
|
343
|
+
}), spinnerVariants = {
|
|
344
|
+
initial: {
|
|
345
|
+
opacity: 1
|
|
346
|
+
},
|
|
347
|
+
animate: {
|
|
348
|
+
opacity: [0, 0, 1]
|
|
349
|
+
},
|
|
350
|
+
exit: {
|
|
351
|
+
opacity: [1, 0, 0]
|
|
352
|
+
}
|
|
353
|
+
}, iframeVariants = {
|
|
354
|
+
...sizes,
|
|
355
|
+
desktop: {
|
|
356
|
+
...sizes.desktop,
|
|
357
|
+
boxShadow: "0 0 0 0px var(--card-shadow-outline-color)"
|
|
358
|
+
},
|
|
359
|
+
mobile: {
|
|
360
|
+
...sizes.mobile,
|
|
361
|
+
boxShadow: "0 0 0 1px var(--card-shadow-outline-color)"
|
|
362
|
+
},
|
|
363
|
+
background: {
|
|
364
|
+
opacity: 0,
|
|
365
|
+
scale: 1
|
|
366
|
+
},
|
|
367
|
+
idle: {
|
|
368
|
+
scale: 1
|
|
369
|
+
},
|
|
370
|
+
reloading: {
|
|
371
|
+
scale: [1, 1, 1, 0.98]
|
|
372
|
+
},
|
|
373
|
+
active: {
|
|
374
|
+
opacity: [0, 0, 1],
|
|
375
|
+
scale: 1
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
function Loading(t0) {
|
|
379
|
+
const $ = c(6), {
|
|
380
|
+
iframeSize
|
|
381
|
+
} = t0, t1 = sizes[iframeSize];
|
|
382
|
+
let t2;
|
|
383
|
+
$[0] !== t1 ? (t2 = {
|
|
384
|
+
...t1
|
|
385
|
+
}, $[0] = t1, $[1] = t2) : t2 = $[1];
|
|
386
|
+
let t3, t4;
|
|
387
|
+
$[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = /* @__PURE__ */ jsx(Spinner, { muted: !0 }), t4 = /* @__PURE__ */ jsx(Text, { muted: !0, size: 1, children: "Loading\u2026" }), $[2] = t3, $[3] = t4) : (t3 = $[2], t4 = $[3]);
|
|
388
|
+
let t5;
|
|
389
|
+
return $[4] !== t2 ? (t5 = /* @__PURE__ */ jsxs(Flex, { style: t2, justify: "center", align: "center", direction: "column", gap: 4, children: [
|
|
390
|
+
t3,
|
|
391
|
+
t4
|
|
392
|
+
] }), $[4] = t2, $[5] = t5) : t5 = $[5], t5;
|
|
393
|
+
}
|
|
394
|
+
function ErrorCard(t0) {
|
|
395
|
+
const $ = c(8), {
|
|
396
|
+
error
|
|
397
|
+
} = t0;
|
|
398
|
+
let t1;
|
|
399
|
+
$[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t1 = /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, children: /* @__PURE__ */ jsx(WarningOutlineIcon, {}) }) }), $[0] = t1) : t1 = $[0];
|
|
400
|
+
let t2;
|
|
401
|
+
$[1] !== error.name ? (t2 = /* @__PURE__ */ jsx(Text, { as: "h1", size: 1, weight: "bold", children: error.name }), $[1] = error.name, $[2] = t2) : t2 = $[2];
|
|
402
|
+
let t3;
|
|
403
|
+
$[3] !== error.message ? (t3 = /* @__PURE__ */ jsx(Text, { as: "p", muted: !0, size: 1, children: error.message }), $[3] = error.message, $[4] = t3) : t3 = $[4];
|
|
404
|
+
let t4;
|
|
405
|
+
return $[5] !== t2 || $[6] !== t3 ? (t4 = /* @__PURE__ */ jsx(Card, { height: "fill", children: /* @__PURE__ */ jsx(Flex, { align: "center", height: "fill", justify: "center", padding: 4, sizing: "border", children: /* @__PURE__ */ jsx(Container, { width: 0, children: /* @__PURE__ */ jsx(Card, { padding: 4, radius: 2, shadow: 1, tone: "caution", children: /* @__PURE__ */ jsxs(Flex, { children: [
|
|
406
|
+
t1,
|
|
407
|
+
/* @__PURE__ */ jsxs(Stack, { flex: 1, marginLeft: 3, space: 3, children: [
|
|
408
|
+
t2,
|
|
409
|
+
t3
|
|
410
|
+
] })
|
|
411
|
+
] }) }) }) }) }), $[5] = t2, $[6] = t3, $[7] = t4) : t4 = $[7], t4;
|
|
412
|
+
}
|
|
413
|
+
const resolveUUID = /* @__PURE__ */ Symbol();
|
|
414
|
+
export {
|
|
415
|
+
Iframe
|
|
416
|
+
};
|
|
417
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 {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 {useCallback, useRef, useState} from 'react'\n\nimport type {IframeSizeKey, SizeProps} from './types'\n\nimport {DisplayUrl} from './DisplayUrl'\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 animate\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 animate\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 animate\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 void copy(input.current.value).then((copied) => {\n if (copied) {\n pushToast({\n closable: true,\n status: 'success',\n title: 'The URL is copied to the clipboard',\n })\n } else {\n pushToast({\n closable: true,\n status: 'error',\n title: 'Failed to copy the URL to the clipboard',\n })\n }\n return copied\n })\n }}\n />\n </Tooltip>\n <Tooltip\n animate\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\ntype CopiedValue = string | null\n\ntype CopyFn = (text: string) => Promise<boolean>\n\nfunction useCopyToClipboard(): [CopiedValue, CopyFn] {\n const [copiedText, setCopiedText] = useState<CopiedValue>(null)\n\n const copy: CopyFn = useCallback(async (text) => {\n if (!navigator?.clipboard) {\n console.warn('Clipboard not supported')\n return false\n }\n\n // Try to save to clipboard then save it in the state if worked\n try {\n await navigator.clipboard.writeText(text)\n setCopiedText(text)\n return true\n } catch (error) {\n console.warn('Copy failed', error)\n setCopiedText(null)\n return false\n }\n }, [])\n\n return [copiedText, copy]\n}\n","import type {HTMLAttributeReferrerPolicy} from 'react'\n\nimport {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 'motion/react'\nimport {\n forwardRef,\n memo,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useTransition,\n} from 'react'\nimport {\n type SanityDocument,\n useActiveWorkspace,\n useClient,\n useCurrentUser,\n usePerspective,\n} from 'sanity'\nimport {suspend} from 'suspend-react'\n\nimport type {IframeSizeKey} from './types'\n\nimport {DEFAULT_SIZE, sizes, Toolbar} from './Toolbar'\n\nexport type UrlResolver = (\n document: SanityDocument | null,\n perspective: Pick<\n ReturnType<typeof usePerspective>,\n 'selectedPerspectiveName' | 'perspectiveStack'\n >,\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.create(Flex)\n\nexport interface IframeProps {\n document: {\n displayed: SanityDocument\n draft: SanityDocument | null\n published: SanityDocument | null\n }\n options: IframeOptions\n}\n\nfunction encodeStudioPerspective(studioPerspective: string[] | string): string {\n return Array.isArray(studioPerspective) ? studioPerspective.join(',') : studioPerspective\n}\n\nexport function Iframe(props: IframeProps): React.JSX.Element {\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 workspace = useActiveWorkspace()\n const basePath = workspace?.activeWorkspace?.basePath || '/'\n const urlRef = useRef(options.url)\n const [draftSnapshot, setDraftSnapshot] = useState(() => ({key, draft}))\n useEffect(() => {\n urlRef.current = options.url\n }, [options.url])\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>(undefined)\n const [isResolvingUrl, startTransition] = useTransition()\n const {perspectiveStack, selectedPerspectiveName} = usePerspective()\n const perspective = useMemo(\n () => ({\n perspectiveStack,\n selectedPerspectiveName,\n }),\n [perspectiveStack, selectedPerspectiveName],\n )\n\n useEffect(() => {\n if (JSON.stringify({key, draft}) !== JSON.stringify(draftSnapshot)) {\n startTransition(() => setDraftSnapshot({key, draft}))\n }\n }, [draft, draftSnapshot, key, startTransition])\n\n const url = useCallback(\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 const url = await urlProp(draft, perspective)\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'\n ? await urlProp.preview(draft, perspective)\n : urlProp.preview\n if (typeof preview !== 'string') {\n return preview\n }\n if (!previewSecretRef.current) {\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 const url = await resolvePreviewUrl({\n client,\n previewUrlSecret: previewSecretRef.current,\n previewSearchParam: null,\n studioBasePath: basePath,\n studioPreviewPerspective: encodeStudioPerspective(perspective.perspectiveStack),\n })\n return new URL(url, location.origin)\n }\n return undefined\n },\n [basePath, client, currentUser?.id, perspective, startTransition],\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}-${selectedPerspectiveName || 'draft'}`}\n _key={draftSnapshot.key}\n draftSnapshot={draftSnapshot.draft}\n url={url}\n isResolvingUrl={isResolvingUrl}\n attributes={attributes}\n perspective={perspective}\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 perspective: Parameters<UrlResolver>[1]\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 perspective: {selectedPerspectiveName, perspectiveStack},\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 selectedPerspectiveName,\n perspectiveStack,\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 const {src} = iframe.current\n iframe.current.src = 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","$","_c","t0","url","getRedirectTo","truncatedUrl","origin","location","pathname","search","t1","sizes","desktop","width","height","mobile","DEFAULT_SIZE","Toolbar","iframeSize","setIframeSize","reloading","showUrl","reloadButton","handleReload","validUrl","URL","input","useRef","push","pushToast","useToast","copy","useCopyToClipboard","for","position","pointerEvents","opacity","toString","t2","t3","whiteSpace","t4","t5","t6","t7","Symbol","t8","t9","t10","MobileDeviceIcon","t11","t12","t13","t14","RefreshIcon","t15","t16","t17","t18","t19","current","value","then","copied","closable","status","title","t20","CopyIcon","t21","t22","t23","t24","t25","window","open","undefined","t26","LaunchIcon","t27","t28","t29","copiedText","setCopiedText","useState","text","navigator","clipboard","console","warn","writeText","error","MotionFlex","motion","create","Flex","encodeStudioPerspective","studioPerspective","Array","isArray","join","Iframe","document","options","draft","published","displayed","defaultSize","reload","attributes","showDisplayUrl","key","basePath","useActiveWorkspace","activeWorkspace","urlRef","draftSnapshot","setDraftSnapshot","useEffect","currentUser","useCurrentUser","apiVersion","client","useClient","expiresAt","setExpiresAt","previewSecretRef","isResolvingUrl","startTransition","useTransition","perspectiveStack","selectedPerspectiveName","usePerspective","perspective","JSON","stringify","id","draft_0","urlProp","preview","secret","expiresAt_0","createPreviewSecret","href","getTime","url_0","definePreviewUrl","draftMode","enable","previewUrlSecret","previewSearchParam","studioBasePath","studioPreviewPerspective","url_1","timeout","setTimeout","Math","max","Date","now","clearTimeout","IframeInner","memo","userId","_key","prefersReducedMotion","usePrefersReducedMotion","suspend","resolveUUID","loading","setLoading","_reloading","setReloading","iframe","src","duration","button","Error","Frame","forwardRef","onLoad","handleIframeLoad","spinnerVariants","inset","maxHeight","iframeVariants","initial","animate","exit","boxShadow","background","scale","idle","active","Loading","ErrorCard","name","message"],"mappings":"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"}
|