sanity-plugin-shopify-assets 1.2.1 → 1.2.3

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/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # sanity-plugin-shopify-assets
2
2
 
3
- > This is a **Sanity Studio v3** plugin.
4
-
5
3
  Select assets from your Shopify store in the context of your Sanity Studio. This plugin allows you to serve assets from the Shopify CDN in your frontends.
6
4
 
7
5
  ## Installation
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- import { useProjectId, useDataset, PatchEvent, set, unset, DiffFromTo, defineType, defineField, definePlugin } from 'sanity';
1
+ import { useProjectId, useDataset, useClient, PatchEvent, set, unset, DiffFromTo, defineType, defineField, definePlugin } from 'sanity';
2
2
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
3
  import { LaunchIcon, ErrorOutlineIcon } from '@sanity/icons';
4
4
  import { Card, Box, Text, Flex, Button, Stack, Dialog, Inline, TextInput, Spinner, Grid } from '@sanity/ui';
@@ -232,12 +232,16 @@ const fetchSearch = props => {
232
232
  shop,
233
233
  query,
234
234
  cursor,
235
- resultsPerPage
235
+ resultsPerPage,
236
+ token
236
237
  } = props;
237
238
  return defer(() => {
238
239
  return axios.get(`https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}&query=${encodeURIComponent(query)}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`, {
239
240
  withCredentials: true,
240
- method: "GET"
241
+ method: "GET",
242
+ headers: token ? {
243
+ Authorization: `Bearer ${token}`
244
+ } : {}
241
245
  });
242
246
  }).pipe(map(result => result.data));
243
247
  };
@@ -247,11 +251,15 @@ const fetchList = props => {
247
251
  dataset,
248
252
  shop,
249
253
  cursor,
250
- resultsPerPage
254
+ resultsPerPage,
255
+ token
251
256
  } = props;
252
257
  return defer(() => axios.get(`https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`, {
253
258
  withCredentials: true,
254
- method: "GET"
259
+ method: "GET",
260
+ headers: token ? {
261
+ Authorization: `Bearer ${token}`
262
+ } : {}
255
263
  })).pipe(map(result => result.data));
256
264
  };
257
265
  const search = props => {
@@ -261,7 +269,8 @@ const search = props => {
261
269
  shop,
262
270
  query,
263
271
  cursor,
264
- resultsPerPage
272
+ resultsPerPage,
273
+ token
265
274
  } = props;
266
275
  return concat(query.pipe(withLatestFrom(cursor), debounceTime(500), distinctUntilChanged(), switchMap(_ref1 => {
267
276
  let [q, c] = _ref1;
@@ -272,7 +281,8 @@ const search = props => {
272
281
  shop,
273
282
  query: q,
274
283
  cursor: c,
275
- resultsPerPage
284
+ resultsPerPage,
285
+ token
276
286
  }).pipe(distinctUntilChanged());
277
287
  }
278
288
  return fetchList({
@@ -280,7 +290,8 @@ const search = props => {
280
290
  dataset,
281
291
  shop,
282
292
  cursor: c,
283
- resultsPerPage
293
+ resultsPerPage,
294
+ token
284
295
  });
285
296
  })));
286
297
  };
@@ -290,7 +301,7 @@ const DialogHeader = props => {
290
301
  shopifyDomain
291
302
  } = props;
292
303
  const handleOpenInNewTab = useCallback(() => {
293
- window.open(`https://${shopifyDomain}/admin/settings/files`, "_blank");
304
+ window.open(`https://${shopifyDomain}/admin/content/files`, "_blank");
294
305
  }, [shopifyDomain]);
295
306
  return /* @__PURE__ */jsxs(Flex, {
296
307
  align: "center",
@@ -395,6 +406,10 @@ function ShopifyAssetPicker(props) {
395
406
  } = props;
396
407
  const projectId = useProjectId();
397
408
  const dataset = useDataset();
409
+ const client = useClient({
410
+ apiVersion: "2021-06-07"
411
+ });
412
+ const token = client.config().token;
398
413
  const [error, setError] = useState("");
399
414
  const [query, setQuery] = useState("");
400
415
  const [searchResults, setSearchResults] = useState([]);
@@ -412,7 +427,8 @@ function ShopifyAssetPicker(props) {
412
427
  shop: shopifyDomain,
413
428
  query: searchSubject$,
414
429
  cursor: cursorSubject$,
415
- resultsPerPage: RESULTS_PER_PAGE
430
+ resultsPerPage: RESULTS_PER_PAGE,
431
+ token
416
432
  }).subscribe({
417
433
  next: results => {
418
434
  setSearchResults(prevResults => [...prevResults, ...results.assets]);
@@ -420,11 +436,11 @@ function ShopifyAssetPicker(props) {
420
436
  setIsLoading(false);
421
437
  },
422
438
  error: err => {
423
- setError(`${err.response.data.message || err.message || "An error occurred"} - check plugin configuration`);
439
+ setError(`${err.response?.data?.message || err.message || "An error occurred"} - check plugin configuration`);
424
440
  }
425
441
  });
426
442
  return () => searchSubscription.unsubscribe();
427
- }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset]);
443
+ }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset, token]);
428
444
  const handleSearchTermChanged = useCallback(event => {
429
445
  const newQuery = event.currentTarget.value;
430
446
  setQuery(newQuery);
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/components/File.styled.tsx","../src/components/VideoPlayer.tsx","../src/components/AssetPreview.tsx","../src/datastores/shopify.ts","../src/components/DialogHeader.tsx","../src/utils/helpers.ts","../src/components/File.tsx","../src/components/ShopifyAssetInput.styled.tsx","../src/components/ShopifyAssetPicker.tsx","../src/components/ShopifyIcon.tsx","../src/components/ShopifyAssetInput.tsx","../src/components/AssetDiff.tsx","../src/schema/shopifyAssetSchema.ts","../src/schema/shopifyAssetPreviewSchema.ts","../src/schema/shopifyAssetMetadataSchema.ts","../src/index.ts"],"sourcesContent":["import {Card} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n background-color: ${({theme}) => theme.sanity.color.card.enabled.bg2};\n position: relative;\n outline: none !important;\n border: ${({theme}) => `1px solid ${theme.sanity.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const InfoLine = styled(Card)`\n ${({theme}) => `\n --infoline-fg: ${theme.sanity.color.card.enabled.fg};\n --infoline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--infoline-bg);\n top: 0;\n left: 0;\n max-width: 65%;\n overflow-wrap: break-word;\n\n [data-ui='Text'] {\n color: var(--infoline-fg);\n }\n`\n\nexport const DurationLine = styled(Card)`\n ${({theme}) => `\n --durationline-fg: ${theme.sanity.color.card.enabled.bg};\n --durationline-bg: ${theme.sanity.color.card.enabled.fg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--durationline-bg);\n top: 0;\n right: 0;\n\n [data-ui='Text'] {\n color: var(--durationline-fg);\n }\n`\n","import React, {type CSSProperties, type MouseEvent, useCallback, useEffect} from 'react'\nimport videojs, {type VideoJsPlayer} from 'video.js'\n\ntype PlayerKind = 'player' | 'diff'\n\ninterface VideoProps {\n src: string\n kind: PlayerKind\n}\n\nconst VideoPlayer = ({src, kind}: VideoProps) => {\n const videoNode = React.useRef<HTMLVideoElement>(null)\n const player = React.useRef<VideoJsPlayer>()\n\n useEffect(() => {\n player.current = videojs(videoNode.current ?? '', {\n sources: [{src}],\n controls: true,\n })\n\n player.current.src({src})\n }, [src])\n\n const stopPropagation = useCallback((event: MouseEvent) => {\n event.stopPropagation()\n }, [])\n\n const className: Record<PlayerKind, string> = {\n player: 'video-js vjs-16-9 vjs-big-play-centered',\n diff: 'video-js vjs-layout-tiny vjs-fluid',\n }\n\n const style: CSSProperties = {position: 'relative'}\n\n return (\n <div>\n <link href=\"https://vjs.zencdn.net/7.8.4/video-js.css\" rel=\"stylesheet\" />\n <div data-vjs-player>\n <video\n onClick={stopPropagation}\n style={kind === 'diff' ? style : {}}\n className={className[kind]}\n ref={videoNode}\n />\n </div>\n </div>\n )\n}\n\nexport default VideoPlayer\n","import React from 'react'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport {styled} from 'styled-components'\nimport {Box, Flex, Text} from '@sanity/ui'\n\nimport {Asset} from '../types'\nimport {DurationLine, InfoLine} from './File.styled'\nimport VideoPlayer from './VideoPlayer'\n\ninterface ComponentProps {\n value: Asset\n}\n\nexport const StyledBox = styled(Box)`\n background-color: ${({theme}) => theme.sanity.color?.card?.enabled?.bg2};\n border: ${({theme}) => `1px solid ${theme.sanity?.color?.card?.enabled?.border}`};\n display: flex;\n justify-content: center;\n margin-bottom: ${({theme}) => theme.sanity.space[4]};\n position: relative;\n`\n\nconst RenderAsset = ({value, url}: {value: Asset; url: string}) => {\n switch (value.type) {\n case 'video':\n return <VideoPlayer src={url} kind=\"player\" />\n default:\n return (\n <Flex justify=\"center\">\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n maxWidth: '100%',\n height: 'auto',\n display: 'block',\n maxHeight: '30vh',\n }}\n />\n </Flex>\n )\n }\n}\n\nconst AssetPreview = ({value}: ComponentProps) => {\n const url = value && value.url\n\n if (!value || !url) {\n return null\n }\n\n const {filename, meta} = value\n const {fileSize, duration} = meta\n\n return (\n <StyledBox marginBottom={2}>\n <RenderAsset value={value} url={url} />\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {fileSize && `(${prettyBytes(fileSize)})`}\n </Text>\n </InfoLine>\n {duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </StyledBox>\n )\n}\n\nexport default AssetPreview\n","import {BehaviorSubject, Observable, concat, defer} from 'rxjs'\nimport {debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport axios from 'axios'\n\ntype SearchSubject = BehaviorSubject<string>\ntype CursorSubject = BehaviorSubject<any>\n\ninterface fetchProps {\n projectId: string\n dataset: string\n shop: string\n query: SearchSubject\n cursor: CursorSubject\n resultsPerPage: number\n}\n\ninterface searchProps extends Omit<fetchProps, 'query' | 'cursor'> {\n query: string\n cursor: string\n}\ninterface listProps extends Omit<fetchProps, 'query' | 'cursor'> {\n cursor: string\n}\n\nconst fetchSearch = (props: searchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage} = props\n\n return defer(() => {\n return axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}&query=${encodeURIComponent(\n query\n )}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n }\n )\n }).pipe(map((result) => result.data))\n}\n\nconst fetchList = (props: listProps): Observable<any> => {\n const {projectId, dataset, shop, cursor, resultsPerPage} = props\n\n return defer(() =>\n axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}${\n cursor && `&cursor=${cursor}`\n }&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n }\n )\n ).pipe(map((result) => result.data))\n}\n\nexport const search = (props: fetchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage} = props\n\n return concat(\n query.pipe(\n withLatestFrom(cursor),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, c]) => {\n if (q) {\n return fetchSearch({projectId, dataset, shop, query: q, cursor: c, resultsPerPage}).pipe(\n distinctUntilChanged()\n )\n }\n return fetchList({projectId, dataset, shop, cursor: c, resultsPerPage})\n })\n )\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Flex, Button} from '@sanity/ui'\nimport {LaunchIcon} from '@sanity/icons'\n\ninterface Props {\n title: string\n shopifyDomain: string\n}\n\nconst DialogHeader = (props: Props) => {\n const {title, shopifyDomain} = props\n\n const handleOpenInNewTab = useCallback(() => {\n window.open(`https://${shopifyDomain}/admin/settings/files`, '_blank')\n }, [shopifyDomain])\n\n return (\n <Flex align=\"center\">\n {title}\n {/*\n HACK: Sanity UI will attempt to focus the first 'focusable' descendant of any dialog.\n Typically this is fine, but since our first focusable element is a button with a tooltip, this\n default behaviour causes the tooltip to appear whenever the dialog is opened, which we don't want!\n\n To get around this, we include a pseudo-hidden input to ensure our tooltip-enabled button remains\n unfocused on initial mount.\n */}\n <input style={{opacity: 0}} tabIndex={-1} type=\"button\" />\n <Box style={{position: 'absolute', right: '-1.5em'}}>\n <Box className=\"button-large\">\n <Button\n fontSize={1}\n icon={LaunchIcon}\n mode=\"bleed\"\n onClick={handleOpenInNewTab}\n text=\"Add New\"\n />\n </Box>\n </Box>\n </Flex>\n )\n}\n\nexport default DialogHeader\n","export const extractName = (name: string): string => name?.split('/')?.pop()?.split('?')[0] ?? ''\n","import React, {useCallback, useRef} from 'react'\nimport {Text} from '@sanity/ui'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\n\nimport {extractName} from '../utils/helpers'\nimport {Asset, ShopifyFile} from '../types'\nimport {DurationLine, InfoLine, Root} from './File.styled'\n\ntype Props = {\n data: ShopifyFile\n width: number\n height: number\n onClick: (file: Asset) => void\n}\n\nexport default function File(props: Props) {\n const {onClick, data, width, height} = props\n const rootElm = useRef<HTMLDivElement>(null)\n\n const {preview, meta} = data\n const filename = extractName(data.url)\n\n const handleClick = useCallback(() => {\n onClick({...data, filename})\n }, [onClick, data, filename])\n\n return (\n <Root\n ref={rootElm}\n title={`${filename}`}\n tabIndex={0}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${preview?.url}\")`,\n }}\n onClick={handleClick}\n >\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {meta.fileSize && `(${prettyBytes(meta.fileSize)})`}\n </Text>\n </InfoLine>\n {meta.duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(meta.duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </Root>\n )\n}\n","import {Stack} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import {BehaviorSubject, Subscription} from 'rxjs'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Card, Dialog, Flex, Inline, Spinner, Stack, Text, TextInput} from '@sanity/ui'\nimport {PatchEvent, set, useProjectId, ObjectInputProps, useDataset} from 'sanity'\nimport React, {useCallback, useEffect, useMemo, useState} from 'react'\nimport PhotoAlbum from 'react-photo-album'\nimport InfiniteScroll from 'react-infinite-scroll-component'\n\nimport {search} from '../datastores/shopify'\nimport type {Asset, PageInfo, ShopifyAPIResponse, ShopifyFile} from '../types'\nimport DialogHeader from './DialogHeader'\nimport File from './File'\nimport {Search} from './ShopifyAssetInput.styled'\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1\n\nexport interface AssetPickerProps extends ObjectInputProps<Asset> {\n shopifyDomain: string\n isOpen: boolean\n onClose: () => void\n}\n\nexport default function ShopifyAssetPicker(props: AssetPickerProps) {\n const {isOpen, onClose, shopifyDomain, onChange, schemaType, value} = props\n const projectId = useProjectId()\n const dataset = useDataset()\n\n const [error, setError] = useState('')\n const [query, setQuery] = useState('')\n const [searchResults, setSearchResults] = useState<any[]>([])\n const [pageInfo, setPageInfo] = useState<PageInfo>()\n const [isLoading, setIsLoading] = useState(true)\n\n const searchSubject$ = useMemo(() => new BehaviorSubject(''), [])\n const cursorSubject$ = useMemo(() => new BehaviorSubject(''), [])\n\n useEffect(() => {\n if (!shopifyDomain) setError('Please configure your Shopify domain in the plugin config')\n }, [shopifyDomain])\n\n useEffect(() => {\n const searchSubscription: Subscription = search({\n projectId,\n dataset,\n shop: shopifyDomain,\n query: searchSubject$,\n cursor: cursorSubject$,\n resultsPerPage: RESULTS_PER_PAGE,\n }).subscribe({\n next: (results: ShopifyAPIResponse) => {\n setSearchResults((prevResults) => [...prevResults, ...results.assets])\n setPageInfo(results.pageInfo)\n setIsLoading(false)\n },\n error: (err) => {\n setError(\n `${\n err.response.data.message || err.message || 'An error occurred'\n } - check plugin configuration`\n )\n },\n })\n\n return () => searchSubscription.unsubscribe()\n }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset])\n\n const handleSearchTermChanged = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newQuery = event.currentTarget.value\n setQuery(newQuery)\n setSearchResults([])\n setPageInfo(undefined)\n setIsLoading(true)\n\n cursorSubject$.next('')\n searchSubject$.next(newQuery)\n },\n [cursorSubject$, searchSubject$]\n )\n\n const handleScollerLoadMore = useCallback(() => {\n setIsLoading(true)\n if (pageInfo) cursorSubject$.next(pageInfo.cursor)\n searchSubject$.next(query)\n }, [cursorSubject$, pageInfo, searchSubject$, query])\n\n const handleSelect = useCallback(\n (file: Asset) => {\n file._key = value?._key\n file._type = schemaType.name\n onChange(PatchEvent.from([set(file)]))\n onClose()\n },\n [onChange, onClose, schemaType.name, value?._key]\n )\n\n const renderFile = useCallback(\n (fileProps: any) => {\n const {photo, layout} = fileProps\n return (\n <File\n onClick={handleSelect}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n />\n )\n },\n [handleSelect]\n )\n\n const handleWidth = useCallback((width: number) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }, [])\n\n return (\n <Dialog\n id=\"shopify-asset-source\"\n header={<DialogHeader title=\"Shopify Assets\" shopifyDomain={shopifyDomain} />}\n onClose={onClose}\n open={isOpen}\n width={4}\n >\n <Stack space={3} padding={4}>\n {error ? (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>{error}</Text>\n </Inline>\n </Flex>\n </Card>\n ) : (\n <>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Shopify for assets\n </Text>\n <TextInput\n label=\"Search Images\"\n placeholder=\"filename.jpg\"\n value={query}\n onChange={handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && searchResults.length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={searchResults.length} // This is important field to render the next data\n next={handleScollerLoadMore}\n hasMore={pageInfo ? pageInfo?.hasNextPage : true}\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Flex>\n }\n >\n {searchResults && (\n <PhotoAlbum\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={handleWidth}\n photos={searchResults.map((file: ShopifyFile) => ({\n src: file?.preview?.url,\n width: file?.preview?.width || 2048,\n height: file?.preview?.height || 2048,\n key: file.id,\n data: file,\n }))}\n renderPhoto={renderFile}\n componentsProps={{\n containerProps: {style: {marginBottom: `${PHOTO_SPACING}px`}},\n }}\n />\n )}\n </InfiniteScroll>\n </>\n )}\n </Stack>\n </Dialog>\n )\n}\n","import React from 'react'\n\nconst ShopifyIcon = () => {\n return (\n <svg width=\"18\" height=\"20\" viewBox=\"0 0 18 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.3269 3.85113C15.3132 3.75015 15.2258 3.69411 15.1531 3.688C15.081 3.6819 13.6693 3.66026 13.6693 3.66026C13.6693 3.66026 12.4887 2.50392 12.3722 2.38628C12.2555 2.26865 12.0277 2.30417 11.9392 2.3308C11.9381 2.33135 11.7175 2.40016 11.3461 2.51612C11.2839 2.31304 11.1927 2.06335 11.0622 1.81255C10.6419 1.00356 10.0263 0.575752 9.2825 0.574642C9.28142 0.574642 9.28092 0.574642 9.27975 0.574642C9.22808 0.574642 9.17692 0.579636 9.12517 0.584074C9.10317 0.557441 9.08117 0.531362 9.05808 0.505838C8.73408 0.156272 8.31869 -0.0140727 7.82082 0.000908712C6.86027 0.0286521 5.90357 0.72834 5.12787 1.97124C4.58212 2.84572 4.16677 3.94435 4.04904 4.79497C2.94601 5.13953 2.17471 5.38035 2.15766 5.3859C1.60091 5.56235 1.58331 5.57955 1.51069 6.10889C1.45677 6.50895 0 17.8704 0 17.8704L12.2082 20L17.4994 18.6733C17.4994 18.6733 15.3407 3.95212 15.3269 3.85113ZM10.7349 2.707C10.4537 2.79467 10.1342 2.89454 9.78758 3.00274C9.78042 2.51224 9.72267 1.82975 9.496 1.23992C10.2249 1.3792 10.5836 2.21095 10.7349 2.707ZM9.14883 3.20249C8.509 3.40225 7.81091 3.62031 7.11058 3.83892C7.30753 3.0782 7.68107 2.32081 8.13989 1.8242C8.31044 1.63943 8.54917 1.43358 8.832 1.31594C9.09767 1.87525 9.15542 2.66705 9.14883 3.20249ZM7.84007 0.645665C8.06562 0.640671 8.25542 0.690609 8.41775 0.798253C8.15805 0.9342 7.90718 1.12951 7.67172 1.38419C7.06162 2.04448 6.594 3.06932 6.4075 4.0581C5.826 4.23954 5.25715 4.41766 4.73342 4.58078C5.06405 3.02438 6.35743 0.688944 7.84007 0.645665Z\"\n fill=\"#95BF47\"\n />\n <path\n d=\"M9.276 6.43238L8.66142 8.75117C8.66142 8.75117 7.97598 8.43658 7.16342 8.48817C5.97181 8.56417 5.95916 9.32217 5.97126 9.51242C6.03618 10.5495 8.74125 10.7759 8.89308 13.2051C9.01242 15.1161 7.88796 16.4233 6.26779 16.5265C4.32303 16.6502 3.25246 15.4933 3.25246 15.4933L3.66452 13.7256C3.66452 13.7256 4.74224 14.5457 5.60487 14.4907C6.16821 14.4547 6.36957 13.9924 6.34921 13.6657C6.26448 12.3128 4.06172 12.3927 3.92253 10.17C3.80536 8.29951 5.02337 6.40408 7.71081 6.23318C8.74617 6.16604 9.276 6.43238 9.276 6.43238Z\"\n fill=\"white\"\n />\n <path\n d=\"M15.1536 3.68853C15.0815 3.68243 13.6698 3.66078 13.6698 3.66078C13.6698 3.66078 12.4893 2.50444 12.3726 2.38681C12.3292 2.34298 12.2703 2.32023 12.2087 2.31079L12.2093 19.9994L17.4999 18.6733C17.4999 18.6733 15.3412 3.95264 15.3274 3.85166C15.3137 3.75068 15.2257 3.69463 15.1536 3.68853Z\"\n fill=\"#5E8E3E\"\n />\n </svg>\n )\n}\n\nexport default ShopifyIcon\n","import React from 'react'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Inline, Stack, Text} from '@sanity/ui'\nimport {ObjectInputProps, PatchEvent, unset} from 'sanity'\nimport {useCallback, useState} from 'react'\n\nimport {Asset} from '../types'\nimport AssetPreview from './AssetPreview'\nimport ShopifyAssetPicker from './ShopifyAssetPicker'\nimport ShopifyIcon from './ShopifyIcon'\n\nexport default function ShopifyAssetInput(props: ObjectInputProps) {\n const {onChange, readOnly, value, schemaType} = props\n const {options} = schemaType\n const {shopifyDomain} = options\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const removeValue = useCallback(() => {\n onChange(PatchEvent.from([unset()]))\n }, [onChange])\n\n const onOpen = useCallback(() => {\n setDialogOpen(true)\n }, [setDialogOpen])\n\n const onClose = useCallback(() => {\n setDialogOpen(false)\n }, [setDialogOpen])\n\n if (!shopifyDomain) {\n return (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>\n You need to configure your *.myshopify.com domain in the plugin / field options to\n enable Shopify Assets.\n </Text>\n </Inline>\n </Flex>\n </Card>\n )\n }\n\n return (\n <>\n {dialogOpen && (\n <ShopifyAssetPicker\n {...props}\n shopifyDomain={shopifyDomain}\n isOpen={dialogOpen}\n onClose={onClose}\n value={value as Asset}\n />\n )}\n <Stack>\n <AssetPreview value={value as Asset} />\n\n <Grid gap={1} style={{gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))'}}>\n <Button\n disabled={readOnly}\n mode=\"ghost\"\n icon={ShopifyIcon}\n title=\"Select an asset\"\n onClick={onOpen}\n text=\"Select…\"\n />\n <Button\n disabled={readOnly || !value}\n tone=\"critical\"\n mode=\"ghost\"\n title=\"Remove asset\"\n text=\"Remove\"\n onClick={removeValue}\n />\n </Grid>\n </Stack>\n </>\n )\n}\n","import React from 'react'\nimport {DiffFromTo} from 'sanity'\nimport {Flex, Text, Stack} from '@sanity/ui'\n\nimport type {Asset} from '../types'\n\ntype Props = {\n value: Asset | undefined\n}\n\nconst CloudinaryDiffPreview = ({value}: Props) => {\n if (!value) {\n return null\n }\n\n if (value?.preview?.url) {\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <Stack space={2}>\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n objectFit: 'contain',\n margin: 'auto',\n maxWidth: '100%',\n maxHeight: '100%',\n }}\n />\n <Text size={1}>{value.type.charAt(0).toUpperCase() + value.type.slice(1)}</Text>\n </Stack>\n </Flex>\n )\n }\n\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <div>(no image)</div>\n </Flex>\n )\n}\n\ntype DiffProps = {\n diff: any\n schemaType: any\n}\n\nconst AssetDiff = ({diff, schemaType}: DiffProps) => {\n return (\n <DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={CloudinaryDiffPreview}\n layout={'grid'}\n />\n )\n}\n\nexport default AssetDiff\n","/* eslint-disable */\nimport ShopifyAssetInput from '../components/ShopifyAssetInput'\nimport AssetDiff from '../components/AssetDiff'\nimport AssetPreview from '../components/AssetPreview'\nimport {defineField, defineType} from 'sanity'\n\ninterface ObjectConfig {\n shopifyDomain: string\n}\n\ndeclare module 'sanity' {\n interface ObjectOptions {\n shopifyDomain?: string\n }\n}\n\nexport const shopifyAssetSchema = (config: ObjectConfig) => {\n const {shopifyDomain} = config\n\n return defineType({\n type: 'object',\n name: 'shopify.asset',\n title: 'Shopify Asset',\n options: {\n shopifyDomain,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'filename',\n title: 'Filename',\n }),\n defineField({\n type: 'string',\n name: 'id',\n title: 'ID',\n }),\n defineField({\n type: 'shopify.assetMetadata',\n name: 'meta',\n title: 'Metadata',\n }),\n defineField({\n type: 'shopify.assetPreview',\n name: 'preview',\n title: 'Preview',\n }),\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n ...({\n components: {\n input: ShopifyAssetInput,\n diff: AssetDiff,\n preview: AssetPreview,\n },\n } as {}),\n preview: {\n select: {\n meta: 'meta',\n preview: 'preview',\n url: 'url',\n filename: 'filename',\n type: 'type',\n },\n prepare({url, meta, preview, filename, type}) {\n return {\n title: filename,\n subtitle: type,\n value: {\n url,\n meta,\n preview,\n filename,\n },\n }\n },\n },\n })\n}\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetPreviewSchema = defineType({\n type: 'object',\n name: 'shopify.assetPreview',\n title: 'Asset preview',\n fields: [\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n})\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetMetadataSchema = defineType({\n type: 'object',\n name: 'shopify.assetMetadata',\n title: 'Asset metadata',\n fields: [\n defineField({\n type: 'string',\n name: 'alt',\n title: 'Alternative text',\n }),\n defineField({\n type: 'number',\n name: 'duration',\n title: 'Duration',\n }),\n defineField({\n type: 'number',\n name: 'fileSize',\n title: 'File size',\n }),\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n ],\n})\n","import {definePlugin, type ObjectDefinition} from 'sanity'\nimport {shopifyAssetSchema} from './schema/shopifyAssetSchema'\nimport {shopifyAssetPreviewSchema} from './schema/shopifyAssetPreviewSchema'\nimport {shopifyAssetMetadataSchema} from './schema/shopifyAssetMetadataSchema'\nimport type {PluginConfig} from './types'\n\nexport * from './types'\n\n// enables autocompletion and validation of document options\ndeclare module 'sanity' {\n export namespace Schema {\n // here we type up our custom schema definition\n export type ShopifyAssetTypeDef = Omit<ObjectDefinition, 'type' | 'fields'> & {\n type: 'shopify.asset'\n options: {\n shopifyDomain: string\n }\n }\n // Adds 'extension-type' as an intrinsic type\n export interface IntrinsicTypeDefinition {\n 'shopify.asset': ShopifyAssetTypeDef\n }\n }\n}\n\nexport const shopifyAssets = definePlugin<PluginConfig>((config) => {\n return {\n name: 'shopify-asset-schema',\n schema: {\n types: [shopifyAssetPreviewSchema, shopifyAssetMetadataSchema, shopifyAssetSchema(config)],\n },\n }\n})\n"],"names":["Root","styled","div","_ref","theme","sanity","color","card","enabled","bg2","_ref2","border","InfoLine","Card","_ref3","fg","bg","DurationLine","_ref4","VideoPlayer","_ref5","src","kind","videoNode","React","useRef","player","useEffect","current","videojs","sources","controls","stopPropagation","useCallback","event","className","diff","style","position","children","jsx","href","rel","onClick","ref","StyledBox","Box","_ref6","_ref7","_ref8","space","RenderAsset","_ref9","value","url","type","Flex","justify","alt","preview","maxWidth","height","display","maxHeight","AssetPreview","_ref0","filename","meta","fileSize","duration","jsxs","marginBottom","padding","radius","margin","Text","size","title","prettyBytes","prettyMilliseconds","colonNotation","secondsDecimalDigits","fetchSearch","props","projectId","dataset","shop","query","cursor","resultsPerPage","defer","axios","get","encodeURIComponent","withCredentials","method","pipe","map","result","data","fetchList","search","concat","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref1","q","c","DialogHeader","shopifyDomain","handleOpenInNewTab","window","open","align","opacity","tabIndex","right","Button","fontSize","icon","LaunchIcon","mode","text","extractName","name","split","pop","File","width","rootElm","handleClick","backgroundImage","Search","Stack","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","ShopifyAssetPicker","isOpen","onClose","onChange","schemaType","useProjectId","useDataset","error","setError","useState","setQuery","searchResults","setSearchResults","pageInfo","setPageInfo","isLoading","setIsLoading","searchSubject$","useMemo","BehaviorSubject","cursorSubject$","searchSubscription","subscribe","next","results","prevResults","assets","err","response","message","unsubscribe","handleSearchTermChanged","newQuery","currentTarget","handleScollerLoadMore","handleSelect","file","_key","_type","PatchEvent","from","set","renderFile","fileProps","photo","layout","handleWidth","Dialog","id","header","overflow","shadow","tone","gap","ErrorOutlineIcon","Inline","Fragment","weight","TextInput","label","placeholder","length","muted","InfiniteScroll","dataLength","hasMore","hasNextPage","scrollThreshold","loader","Spinner","endMessage","PhotoAlbum","spacing","targetRowHeight","photos","key","renderPhoto","componentsProps","containerProps","ShopifyIcon","viewBox","fill","xmlns","d","ShopifyAssetInput","readOnly","options","dialogOpen","setDialogOpen","removeValue","unset","onOpen","Grid","gridTemplateColumns","disabled","CloudinaryDiffPreview","_ref10","objectFit","charAt","toUpperCase","slice","AssetDiff","_ref11","DiffFromTo","previewComponent","shopifyAssetSchema","config","defineType","fields","defineField","components","input","select","prepare","_ref12","subtitle","shopifyAssetPreviewSchema","shopifyAssetMetadataSchema","shopifyAssets","definePlugin","schema","types"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/components/File.styled.tsx","../src/components/VideoPlayer.tsx","../src/components/AssetPreview.tsx","../src/datastores/shopify.ts","../src/components/DialogHeader.tsx","../src/utils/helpers.ts","../src/components/File.tsx","../src/components/ShopifyAssetInput.styled.tsx","../src/components/ShopifyAssetPicker.tsx","../src/components/ShopifyIcon.tsx","../src/components/ShopifyAssetInput.tsx","../src/components/AssetDiff.tsx","../src/schema/shopifyAssetSchema.ts","../src/schema/shopifyAssetPreviewSchema.ts","../src/schema/shopifyAssetMetadataSchema.ts","../src/index.ts"],"sourcesContent":["import {Card} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n background-color: ${({theme}) => theme.sanity.color.card.enabled.bg2};\n position: relative;\n outline: none !important;\n border: ${({theme}) => `1px solid ${theme.sanity.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const InfoLine = styled(Card)`\n ${({theme}) => `\n --infoline-fg: ${theme.sanity.color.card.enabled.fg};\n --infoline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--infoline-bg);\n top: 0;\n left: 0;\n max-width: 65%;\n overflow-wrap: break-word;\n\n [data-ui='Text'] {\n color: var(--infoline-fg);\n }\n`\n\nexport const DurationLine = styled(Card)`\n ${({theme}) => `\n --durationline-fg: ${theme.sanity.color.card.enabled.bg};\n --durationline-bg: ${theme.sanity.color.card.enabled.fg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--durationline-bg);\n top: 0;\n right: 0;\n\n [data-ui='Text'] {\n color: var(--durationline-fg);\n }\n`\n","import React, {type CSSProperties, type MouseEvent, useCallback, useEffect} from 'react'\nimport videojs, {type VideoJsPlayer} from 'video.js'\n\ntype PlayerKind = 'player' | 'diff'\n\ninterface VideoProps {\n src: string\n kind: PlayerKind\n}\n\nconst VideoPlayer = ({src, kind}: VideoProps) => {\n const videoNode = React.useRef<HTMLVideoElement>(null)\n const player = React.useRef<VideoJsPlayer>()\n\n useEffect(() => {\n player.current = videojs(videoNode.current ?? '', {\n sources: [{src}],\n controls: true,\n })\n\n player.current.src({src})\n }, [src])\n\n const stopPropagation = useCallback((event: MouseEvent) => {\n event.stopPropagation()\n }, [])\n\n const className: Record<PlayerKind, string> = {\n player: 'video-js vjs-16-9 vjs-big-play-centered',\n diff: 'video-js vjs-layout-tiny vjs-fluid',\n }\n\n const style: CSSProperties = {position: 'relative'}\n\n return (\n <div>\n <link href=\"https://vjs.zencdn.net/7.8.4/video-js.css\" rel=\"stylesheet\" />\n <div data-vjs-player>\n <video\n onClick={stopPropagation}\n style={kind === 'diff' ? style : {}}\n className={className[kind]}\n ref={videoNode}\n />\n </div>\n </div>\n )\n}\n\nexport default VideoPlayer\n","import React from 'react'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport {styled} from 'styled-components'\nimport {Box, Flex, Text} from '@sanity/ui'\n\nimport {Asset} from '../types'\nimport {DurationLine, InfoLine} from './File.styled'\nimport VideoPlayer from './VideoPlayer'\n\ninterface ComponentProps {\n value: Asset\n}\n\nexport const StyledBox = styled(Box)`\n background-color: ${({theme}) => theme.sanity.color?.card?.enabled?.bg2};\n border: ${({theme}) => `1px solid ${theme.sanity?.color?.card?.enabled?.border}`};\n display: flex;\n justify-content: center;\n margin-bottom: ${({theme}) => theme.sanity.space[4]};\n position: relative;\n`\n\nconst RenderAsset = ({value, url}: {value: Asset; url: string}) => {\n switch (value.type) {\n case 'video':\n return <VideoPlayer src={url} kind=\"player\" />\n default:\n return (\n <Flex justify=\"center\">\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n maxWidth: '100%',\n height: 'auto',\n display: 'block',\n maxHeight: '30vh',\n }}\n />\n </Flex>\n )\n }\n}\n\nconst AssetPreview = ({value}: ComponentProps) => {\n const url = value && value.url\n\n if (!value || !url) {\n return null\n }\n\n const {filename, meta} = value\n const {fileSize, duration} = meta\n\n return (\n <StyledBox marginBottom={2}>\n <RenderAsset value={value} url={url} />\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {fileSize && `(${prettyBytes(fileSize)})`}\n </Text>\n </InfoLine>\n {duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </StyledBox>\n )\n}\n\nexport default AssetPreview\n","import {BehaviorSubject, Observable, concat, defer} from 'rxjs'\nimport {debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport axios from 'axios'\n\ntype SearchSubject = BehaviorSubject<string>\ntype CursorSubject = BehaviorSubject<any>\n\ninterface fetchProps {\n projectId: string\n dataset: string\n shop: string\n query: SearchSubject\n cursor: CursorSubject\n resultsPerPage: number\n token?: string\n}\n\ninterface searchProps extends Omit<fetchProps, 'query' | 'cursor'> {\n query: string\n cursor: string\n}\ninterface listProps extends Omit<fetchProps, 'query' | 'cursor'> {\n cursor: string\n}\n\nconst fetchSearch = (props: searchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage, token} = props\n\n return defer(() => {\n return axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}&query=${encodeURIComponent(\n query\n )}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n }\n )\n }).pipe(map((result) => result.data))\n}\n\nconst fetchList = (props: listProps): Observable<any> => {\n const {projectId, dataset, shop, cursor, resultsPerPage, token} = props\n\n return defer(() =>\n axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}${\n cursor && `&cursor=${cursor}`\n }&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n }\n )\n ).pipe(map((result) => result.data))\n}\n\nexport const search = (props: fetchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage, token} = props\n\n return concat(\n query.pipe(\n withLatestFrom(cursor),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, c]) => {\n if (q) {\n return fetchSearch({\n projectId,\n dataset,\n shop,\n query: q,\n cursor: c,\n resultsPerPage,\n token,\n }).pipe(distinctUntilChanged())\n }\n return fetchList({projectId, dataset, shop, cursor: c, resultsPerPage, token})\n })\n )\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Flex, Button} from '@sanity/ui'\nimport {LaunchIcon} from '@sanity/icons'\n\ninterface Props {\n title: string\n shopifyDomain: string\n}\n\nconst DialogHeader = (props: Props) => {\n const {title, shopifyDomain} = props\n\n const handleOpenInNewTab = useCallback(() => {\n window.open(`https://${shopifyDomain}/admin/content/files`, '_blank')\n }, [shopifyDomain])\n\n return (\n <Flex align=\"center\">\n {title}\n {/*\n HACK: Sanity UI will attempt to focus the first 'focusable' descendant of any dialog.\n Typically this is fine, but since our first focusable element is a button with a tooltip, this\n default behaviour causes the tooltip to appear whenever the dialog is opened, which we don't want!\n\n To get around this, we include a pseudo-hidden input to ensure our tooltip-enabled button remains\n unfocused on initial mount.\n */}\n <input style={{opacity: 0}} tabIndex={-1} type=\"button\" />\n <Box style={{position: 'absolute', right: '-1.5em'}}>\n <Box className=\"button-large\">\n <Button\n fontSize={1}\n icon={LaunchIcon}\n mode=\"bleed\"\n onClick={handleOpenInNewTab}\n text=\"Add New\"\n />\n </Box>\n </Box>\n </Flex>\n )\n}\n\nexport default DialogHeader\n","export const extractName = (name: string): string => name?.split('/')?.pop()?.split('?')[0] ?? ''\n","import React, {useCallback, useRef} from 'react'\nimport {Text} from '@sanity/ui'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\n\nimport {extractName} from '../utils/helpers'\nimport {Asset, ShopifyFile} from '../types'\nimport {DurationLine, InfoLine, Root} from './File.styled'\n\ntype Props = {\n data: ShopifyFile\n width: number\n height: number\n onClick: (file: Asset) => void\n}\n\nexport default function File(props: Props) {\n const {onClick, data, width, height} = props\n const rootElm = useRef<HTMLDivElement>(null)\n\n const {preview, meta} = data\n const filename = extractName(data.url)\n\n const handleClick = useCallback(() => {\n onClick({...data, filename})\n }, [onClick, data, filename])\n\n return (\n <Root\n ref={rootElm}\n title={`${filename}`}\n tabIndex={0}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${preview?.url}\")`,\n }}\n onClick={handleClick}\n >\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {meta.fileSize && `(${prettyBytes(meta.fileSize)})`}\n </Text>\n </InfoLine>\n {meta.duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(meta.duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </Root>\n )\n}\n","import {Stack} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import {BehaviorSubject, Subscription} from 'rxjs'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Card, Dialog, Flex, Inline, Spinner, Stack, Text, TextInput} from '@sanity/ui'\nimport {PatchEvent, set, useProjectId, ObjectInputProps, useDataset, useClient} from 'sanity'\nimport React, {useCallback, useEffect, useMemo, useState} from 'react'\nimport PhotoAlbum from 'react-photo-album'\nimport InfiniteScroll from 'react-infinite-scroll-component'\n\nimport {search} from '../datastores/shopify'\nimport type {Asset, PageInfo, ShopifyAPIResponse, ShopifyFile} from '../types'\nimport DialogHeader from './DialogHeader'\nimport File from './File'\nimport {Search} from './ShopifyAssetInput.styled'\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1\n\nexport interface AssetPickerProps extends ObjectInputProps<Asset> {\n shopifyDomain: string\n isOpen: boolean\n onClose: () => void\n}\n\nexport default function ShopifyAssetPicker(props: AssetPickerProps) {\n const {isOpen, onClose, shopifyDomain, onChange, schemaType, value} = props\n const projectId = useProjectId()\n const dataset = useDataset()\n const client = useClient({apiVersion: '2021-06-07'})\n const token = client.config().token\n\n const [error, setError] = useState('')\n const [query, setQuery] = useState('')\n const [searchResults, setSearchResults] = useState<any[]>([])\n const [pageInfo, setPageInfo] = useState<PageInfo>()\n const [isLoading, setIsLoading] = useState(true)\n\n const searchSubject$ = useMemo(() => new BehaviorSubject(''), [])\n const cursorSubject$ = useMemo(() => new BehaviorSubject(''), [])\n\n useEffect(() => {\n if (!shopifyDomain) setError('Please configure your Shopify domain in the plugin config')\n }, [shopifyDomain])\n\n useEffect(() => {\n const searchSubscription: Subscription = search({\n projectId,\n dataset,\n shop: shopifyDomain,\n query: searchSubject$,\n cursor: cursorSubject$,\n resultsPerPage: RESULTS_PER_PAGE,\n token,\n }).subscribe({\n next: (results: ShopifyAPIResponse) => {\n setSearchResults((prevResults) => [...prevResults, ...results.assets])\n setPageInfo(results.pageInfo)\n setIsLoading(false)\n },\n error: (err) => {\n setError(\n `${\n err.response?.data?.message || err.message || 'An error occurred'\n } - check plugin configuration`\n )\n },\n })\n\n return () => searchSubscription.unsubscribe()\n }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset, token])\n\n const handleSearchTermChanged = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newQuery = event.currentTarget.value\n setQuery(newQuery)\n setSearchResults([])\n setPageInfo(undefined)\n setIsLoading(true)\n\n cursorSubject$.next('')\n searchSubject$.next(newQuery)\n },\n [cursorSubject$, searchSubject$]\n )\n\n const handleScollerLoadMore = useCallback(() => {\n setIsLoading(true)\n if (pageInfo) cursorSubject$.next(pageInfo.cursor)\n searchSubject$.next(query)\n }, [cursorSubject$, pageInfo, searchSubject$, query])\n\n const handleSelect = useCallback(\n (file: Asset) => {\n file._key = value?._key\n file._type = schemaType.name\n onChange(PatchEvent.from([set(file)]))\n onClose()\n },\n [onChange, onClose, schemaType.name, value?._key]\n )\n\n const renderFile = useCallback(\n (fileProps: any) => {\n const {photo, layout} = fileProps\n return (\n <File\n onClick={handleSelect}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n />\n )\n },\n [handleSelect]\n )\n\n const handleWidth = useCallback((width: number) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }, [])\n\n return (\n <Dialog\n id=\"shopify-asset-source\"\n header={<DialogHeader title=\"Shopify Assets\" shopifyDomain={shopifyDomain} />}\n onClose={onClose}\n open={isOpen}\n width={4}\n >\n <Stack space={3} padding={4}>\n {error ? (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>{error}</Text>\n </Inline>\n </Flex>\n </Card>\n ) : (\n <>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Shopify for assets\n </Text>\n <TextInput\n label=\"Search Images\"\n placeholder=\"filename.jpg\"\n value={query}\n onChange={handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && searchResults.length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={searchResults.length} // This is important field to render the next data\n next={handleScollerLoadMore}\n hasMore={pageInfo ? pageInfo?.hasNextPage : true}\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Flex>\n }\n >\n {searchResults && (\n <PhotoAlbum\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={handleWidth}\n photos={searchResults.map((file: ShopifyFile) => ({\n src: file?.preview?.url,\n width: file?.preview?.width || 2048,\n height: file?.preview?.height || 2048,\n key: file.id,\n data: file,\n }))}\n renderPhoto={renderFile}\n componentsProps={{\n containerProps: {style: {marginBottom: `${PHOTO_SPACING}px`}},\n }}\n />\n )}\n </InfiniteScroll>\n </>\n )}\n </Stack>\n </Dialog>\n )\n}\n","import React from 'react'\n\nconst ShopifyIcon = () => {\n return (\n <svg width=\"18\" height=\"20\" viewBox=\"0 0 18 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.3269 3.85113C15.3132 3.75015 15.2258 3.69411 15.1531 3.688C15.081 3.6819 13.6693 3.66026 13.6693 3.66026C13.6693 3.66026 12.4887 2.50392 12.3722 2.38628C12.2555 2.26865 12.0277 2.30417 11.9392 2.3308C11.9381 2.33135 11.7175 2.40016 11.3461 2.51612C11.2839 2.31304 11.1927 2.06335 11.0622 1.81255C10.6419 1.00356 10.0263 0.575752 9.2825 0.574642C9.28142 0.574642 9.28092 0.574642 9.27975 0.574642C9.22808 0.574642 9.17692 0.579636 9.12517 0.584074C9.10317 0.557441 9.08117 0.531362 9.05808 0.505838C8.73408 0.156272 8.31869 -0.0140727 7.82082 0.000908712C6.86027 0.0286521 5.90357 0.72834 5.12787 1.97124C4.58212 2.84572 4.16677 3.94435 4.04904 4.79497C2.94601 5.13953 2.17471 5.38035 2.15766 5.3859C1.60091 5.56235 1.58331 5.57955 1.51069 6.10889C1.45677 6.50895 0 17.8704 0 17.8704L12.2082 20L17.4994 18.6733C17.4994 18.6733 15.3407 3.95212 15.3269 3.85113ZM10.7349 2.707C10.4537 2.79467 10.1342 2.89454 9.78758 3.00274C9.78042 2.51224 9.72267 1.82975 9.496 1.23992C10.2249 1.3792 10.5836 2.21095 10.7349 2.707ZM9.14883 3.20249C8.509 3.40225 7.81091 3.62031 7.11058 3.83892C7.30753 3.0782 7.68107 2.32081 8.13989 1.8242C8.31044 1.63943 8.54917 1.43358 8.832 1.31594C9.09767 1.87525 9.15542 2.66705 9.14883 3.20249ZM7.84007 0.645665C8.06562 0.640671 8.25542 0.690609 8.41775 0.798253C8.15805 0.9342 7.90718 1.12951 7.67172 1.38419C7.06162 2.04448 6.594 3.06932 6.4075 4.0581C5.826 4.23954 5.25715 4.41766 4.73342 4.58078C5.06405 3.02438 6.35743 0.688944 7.84007 0.645665Z\"\n fill=\"#95BF47\"\n />\n <path\n d=\"M9.276 6.43238L8.66142 8.75117C8.66142 8.75117 7.97598 8.43658 7.16342 8.48817C5.97181 8.56417 5.95916 9.32217 5.97126 9.51242C6.03618 10.5495 8.74125 10.7759 8.89308 13.2051C9.01242 15.1161 7.88796 16.4233 6.26779 16.5265C4.32303 16.6502 3.25246 15.4933 3.25246 15.4933L3.66452 13.7256C3.66452 13.7256 4.74224 14.5457 5.60487 14.4907C6.16821 14.4547 6.36957 13.9924 6.34921 13.6657C6.26448 12.3128 4.06172 12.3927 3.92253 10.17C3.80536 8.29951 5.02337 6.40408 7.71081 6.23318C8.74617 6.16604 9.276 6.43238 9.276 6.43238Z\"\n fill=\"white\"\n />\n <path\n d=\"M15.1536 3.68853C15.0815 3.68243 13.6698 3.66078 13.6698 3.66078C13.6698 3.66078 12.4893 2.50444 12.3726 2.38681C12.3292 2.34298 12.2703 2.32023 12.2087 2.31079L12.2093 19.9994L17.4999 18.6733C17.4999 18.6733 15.3412 3.95264 15.3274 3.85166C15.3137 3.75068 15.2257 3.69463 15.1536 3.68853Z\"\n fill=\"#5E8E3E\"\n />\n </svg>\n )\n}\n\nexport default ShopifyIcon\n","import React from 'react'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Inline, Stack, Text} from '@sanity/ui'\nimport {ObjectInputProps, PatchEvent, unset} from 'sanity'\nimport {useCallback, useState} from 'react'\n\nimport {Asset} from '../types'\nimport AssetPreview from './AssetPreview'\nimport ShopifyAssetPicker from './ShopifyAssetPicker'\nimport ShopifyIcon from './ShopifyIcon'\n\nexport default function ShopifyAssetInput(props: ObjectInputProps) {\n const {onChange, readOnly, value, schemaType} = props\n const {options} = schemaType\n const {shopifyDomain} = options\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const removeValue = useCallback(() => {\n onChange(PatchEvent.from([unset()]))\n }, [onChange])\n\n const onOpen = useCallback(() => {\n setDialogOpen(true)\n }, [setDialogOpen])\n\n const onClose = useCallback(() => {\n setDialogOpen(false)\n }, [setDialogOpen])\n\n if (!shopifyDomain) {\n return (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>\n You need to configure your *.myshopify.com domain in the plugin / field options to\n enable Shopify Assets.\n </Text>\n </Inline>\n </Flex>\n </Card>\n )\n }\n\n return (\n <>\n {dialogOpen && (\n <ShopifyAssetPicker\n {...props}\n shopifyDomain={shopifyDomain}\n isOpen={dialogOpen}\n onClose={onClose}\n value={value as Asset}\n />\n )}\n <Stack>\n <AssetPreview value={value as Asset} />\n\n <Grid gap={1} style={{gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))'}}>\n <Button\n disabled={readOnly}\n mode=\"ghost\"\n icon={ShopifyIcon}\n title=\"Select an asset\"\n onClick={onOpen}\n text=\"Select…\"\n />\n <Button\n disabled={readOnly || !value}\n tone=\"critical\"\n mode=\"ghost\"\n title=\"Remove asset\"\n text=\"Remove\"\n onClick={removeValue}\n />\n </Grid>\n </Stack>\n </>\n )\n}\n","import React from 'react'\nimport {DiffFromTo} from 'sanity'\nimport {Flex, Text, Stack} from '@sanity/ui'\n\nimport type {Asset} from '../types'\n\ntype Props = {\n value: Asset | undefined\n}\n\nconst CloudinaryDiffPreview = ({value}: Props) => {\n if (!value) {\n return null\n }\n\n if (value?.preview?.url) {\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <Stack space={2}>\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n objectFit: 'contain',\n margin: 'auto',\n maxWidth: '100%',\n maxHeight: '100%',\n }}\n />\n <Text size={1}>{value.type.charAt(0).toUpperCase() + value.type.slice(1)}</Text>\n </Stack>\n </Flex>\n )\n }\n\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <div>(no image)</div>\n </Flex>\n )\n}\n\ntype DiffProps = {\n diff: any\n schemaType: any\n}\n\nconst AssetDiff = ({diff, schemaType}: DiffProps) => {\n return (\n <DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={CloudinaryDiffPreview}\n layout={'grid'}\n />\n )\n}\n\nexport default AssetDiff\n","/* eslint-disable */\nimport ShopifyAssetInput from '../components/ShopifyAssetInput'\nimport AssetDiff from '../components/AssetDiff'\nimport AssetPreview from '../components/AssetPreview'\nimport {defineField, defineType} from 'sanity'\n\ninterface ObjectConfig {\n shopifyDomain: string\n}\n\ndeclare module 'sanity' {\n interface ObjectOptions {\n shopifyDomain?: string\n }\n}\n\nexport const shopifyAssetSchema = (config: ObjectConfig) => {\n const {shopifyDomain} = config\n\n return defineType({\n type: 'object',\n name: 'shopify.asset',\n title: 'Shopify Asset',\n options: {\n shopifyDomain,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'filename',\n title: 'Filename',\n }),\n defineField({\n type: 'string',\n name: 'id',\n title: 'ID',\n }),\n defineField({\n type: 'shopify.assetMetadata',\n name: 'meta',\n title: 'Metadata',\n }),\n defineField({\n type: 'shopify.assetPreview',\n name: 'preview',\n title: 'Preview',\n }),\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n ...({\n components: {\n input: ShopifyAssetInput,\n diff: AssetDiff,\n preview: AssetPreview,\n },\n } as {}),\n preview: {\n select: {\n meta: 'meta',\n preview: 'preview',\n url: 'url',\n filename: 'filename',\n type: 'type',\n },\n prepare({url, meta, preview, filename, type}) {\n return {\n title: filename,\n subtitle: type,\n value: {\n url,\n meta,\n preview,\n filename,\n },\n }\n },\n },\n })\n}\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetPreviewSchema = defineType({\n type: 'object',\n name: 'shopify.assetPreview',\n title: 'Asset preview',\n fields: [\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n})\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetMetadataSchema = defineType({\n type: 'object',\n name: 'shopify.assetMetadata',\n title: 'Asset metadata',\n fields: [\n defineField({\n type: 'string',\n name: 'alt',\n title: 'Alternative text',\n }),\n defineField({\n type: 'number',\n name: 'duration',\n title: 'Duration',\n }),\n defineField({\n type: 'number',\n name: 'fileSize',\n title: 'File size',\n }),\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n ],\n})\n","import {definePlugin, type ObjectDefinition} from 'sanity'\nimport {shopifyAssetSchema} from './schema/shopifyAssetSchema'\nimport {shopifyAssetPreviewSchema} from './schema/shopifyAssetPreviewSchema'\nimport {shopifyAssetMetadataSchema} from './schema/shopifyAssetMetadataSchema'\nimport type {PluginConfig} from './types'\n\nexport * from './types'\n\n// enables autocompletion and validation of document options\ndeclare module 'sanity' {\n export namespace Schema {\n // here we type up our custom schema definition\n export type ShopifyAssetTypeDef = Omit<ObjectDefinition, 'type' | 'fields'> & {\n type: 'shopify.asset'\n options: {\n shopifyDomain: string\n }\n }\n // Adds 'extension-type' as an intrinsic type\n export interface IntrinsicTypeDefinition {\n 'shopify.asset': ShopifyAssetTypeDef\n }\n }\n}\n\nexport const shopifyAssets = definePlugin<PluginConfig>((config) => {\n return {\n name: 'shopify-asset-schema',\n schema: {\n types: [shopifyAssetPreviewSchema, shopifyAssetMetadataSchema, shopifyAssetSchema(config)],\n },\n }\n})\n"],"names":["Root","styled","div","_ref","theme","sanity","color","card","enabled","bg2","_ref2","border","InfoLine","Card","_ref3","fg","bg","DurationLine","_ref4","VideoPlayer","_ref5","src","kind","videoNode","React","useRef","player","useEffect","current","videojs","sources","controls","stopPropagation","useCallback","event","className","diff","style","position","children","jsx","href","rel","onClick","ref","StyledBox","Box","_ref6","_ref7","_ref8","space","RenderAsset","_ref9","value","url","type","Flex","justify","alt","preview","maxWidth","height","display","maxHeight","AssetPreview","_ref0","filename","meta","fileSize","duration","jsxs","marginBottom","padding","radius","margin","Text","size","title","prettyBytes","prettyMilliseconds","colonNotation","secondsDecimalDigits","fetchSearch","props","projectId","dataset","shop","query","cursor","resultsPerPage","token","defer","axios","get","encodeURIComponent","withCredentials","method","headers","Authorization","pipe","map","result","data","fetchList","search","concat","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref1","q","c","DialogHeader","shopifyDomain","handleOpenInNewTab","window","open","align","opacity","tabIndex","right","Button","fontSize","icon","LaunchIcon","mode","text","extractName","name","split","pop","File","width","rootElm","handleClick","backgroundImage","Search","Stack","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","ShopifyAssetPicker","isOpen","onClose","onChange","schemaType","useProjectId","useDataset","client","useClient","apiVersion","config","error","setError","useState","setQuery","searchResults","setSearchResults","pageInfo","setPageInfo","isLoading","setIsLoading","searchSubject$","useMemo","BehaviorSubject","cursorSubject$","searchSubscription","subscribe","next","results","prevResults","assets","err","response","message","unsubscribe","handleSearchTermChanged","newQuery","currentTarget","handleScollerLoadMore","handleSelect","file","_key","_type","PatchEvent","from","set","renderFile","fileProps","photo","layout","handleWidth","Dialog","id","header","overflow","shadow","tone","gap","ErrorOutlineIcon","Inline","Fragment","weight","TextInput","label","placeholder","length","muted","InfiniteScroll","dataLength","hasMore","hasNextPage","scrollThreshold","loader","Spinner","endMessage","PhotoAlbum","spacing","targetRowHeight","photos","key","renderPhoto","componentsProps","containerProps","ShopifyIcon","viewBox","fill","xmlns","d","ShopifyAssetInput","readOnly","options","dialogOpen","setDialogOpen","removeValue","unset","onOpen","Grid","gridTemplateColumns","disabled","CloudinaryDiffPreview","_ref10","objectFit","charAt","toUpperCase","slice","AssetDiff","_ref11","DiffFromTo","previewComponent","shopifyAssetSchema","defineType","fields","defineField","components","input","select","prepare","_ref12","subtitle","shopifyAssetPreviewSchema","shopifyAssetMetadataSchema","shopifyAssets","definePlugin","schema","types"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -249,12 +249,16 @@ const fetchSearch = props => {
249
249
  shop,
250
250
  query,
251
251
  cursor,
252
- resultsPerPage
252
+ resultsPerPage,
253
+ token
253
254
  } = props;
254
255
  return rxjs.defer(() => {
255
256
  return axios__default.default.get(`https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}&query=${encodeURIComponent(query)}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`, {
256
257
  withCredentials: true,
257
- method: "GET"
258
+ method: "GET",
259
+ headers: token ? {
260
+ Authorization: `Bearer ${token}`
261
+ } : {}
258
262
  });
259
263
  }).pipe(operators.map(result => result.data));
260
264
  };
@@ -264,11 +268,15 @@ const fetchList = props => {
264
268
  dataset,
265
269
  shop,
266
270
  cursor,
267
- resultsPerPage
271
+ resultsPerPage,
272
+ token
268
273
  } = props;
269
274
  return rxjs.defer(() => axios__default.default.get(`https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`, {
270
275
  withCredentials: true,
271
- method: "GET"
276
+ method: "GET",
277
+ headers: token ? {
278
+ Authorization: `Bearer ${token}`
279
+ } : {}
272
280
  })).pipe(operators.map(result => result.data));
273
281
  };
274
282
  const search = props => {
@@ -278,7 +286,8 @@ const search = props => {
278
286
  shop,
279
287
  query,
280
288
  cursor,
281
- resultsPerPage
289
+ resultsPerPage,
290
+ token
282
291
  } = props;
283
292
  return rxjs.concat(query.pipe(operators.withLatestFrom(cursor), operators.debounceTime(500), operators.distinctUntilChanged(), operators.switchMap(_ref1 => {
284
293
  let [q, c] = _ref1;
@@ -289,7 +298,8 @@ const search = props => {
289
298
  shop,
290
299
  query: q,
291
300
  cursor: c,
292
- resultsPerPage
301
+ resultsPerPage,
302
+ token
293
303
  }).pipe(operators.distinctUntilChanged());
294
304
  }
295
305
  return fetchList({
@@ -297,7 +307,8 @@ const search = props => {
297
307
  dataset,
298
308
  shop,
299
309
  cursor: c,
300
- resultsPerPage
310
+ resultsPerPage,
311
+ token
301
312
  });
302
313
  })));
303
314
  };
@@ -307,7 +318,7 @@ const DialogHeader = props => {
307
318
  shopifyDomain
308
319
  } = props;
309
320
  const handleOpenInNewTab = React.useCallback(() => {
310
- window.open(`https://${shopifyDomain}/admin/settings/files`, "_blank");
321
+ window.open(`https://${shopifyDomain}/admin/content/files`, "_blank");
311
322
  }, [shopifyDomain]);
312
323
  return /* @__PURE__ */jsxRuntime.jsxs(ui.Flex, {
313
324
  align: "center",
@@ -412,6 +423,10 @@ function ShopifyAssetPicker(props) {
412
423
  } = props;
413
424
  const projectId = sanity.useProjectId();
414
425
  const dataset = sanity.useDataset();
426
+ const client = sanity.useClient({
427
+ apiVersion: "2021-06-07"
428
+ });
429
+ const token = client.config().token;
415
430
  const [error, setError] = React.useState("");
416
431
  const [query, setQuery] = React.useState("");
417
432
  const [searchResults, setSearchResults] = React.useState([]);
@@ -429,7 +444,8 @@ function ShopifyAssetPicker(props) {
429
444
  shop: shopifyDomain,
430
445
  query: searchSubject$,
431
446
  cursor: cursorSubject$,
432
- resultsPerPage: RESULTS_PER_PAGE
447
+ resultsPerPage: RESULTS_PER_PAGE,
448
+ token
433
449
  }).subscribe({
434
450
  next: results => {
435
451
  setSearchResults(prevResults => [...prevResults, ...results.assets]);
@@ -437,11 +453,11 @@ function ShopifyAssetPicker(props) {
437
453
  setIsLoading(false);
438
454
  },
439
455
  error: err => {
440
- setError(`${err.response.data.message || err.message || "An error occurred"} - check plugin configuration`);
456
+ setError(`${err.response?.data?.message || err.message || "An error occurred"} - check plugin configuration`);
441
457
  }
442
458
  });
443
459
  return () => searchSubscription.unsubscribe();
444
- }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset]);
460
+ }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset, token]);
445
461
  const handleSearchTermChanged = React.useCallback(event => {
446
462
  const newQuery = event.currentTarget.value;
447
463
  setQuery(newQuery);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/File.styled.tsx","../src/components/VideoPlayer.tsx","../src/components/AssetPreview.tsx","../src/datastores/shopify.ts","../src/components/DialogHeader.tsx","../src/utils/helpers.ts","../src/components/File.tsx","../src/components/ShopifyAssetInput.styled.tsx","../src/components/ShopifyAssetPicker.tsx","../src/components/ShopifyIcon.tsx","../src/components/ShopifyAssetInput.tsx","../src/components/AssetDiff.tsx","../src/schema/shopifyAssetSchema.ts","../src/schema/shopifyAssetPreviewSchema.ts","../src/schema/shopifyAssetMetadataSchema.ts","../src/index.ts"],"sourcesContent":["import {Card} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n background-color: ${({theme}) => theme.sanity.color.card.enabled.bg2};\n position: relative;\n outline: none !important;\n border: ${({theme}) => `1px solid ${theme.sanity.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const InfoLine = styled(Card)`\n ${({theme}) => `\n --infoline-fg: ${theme.sanity.color.card.enabled.fg};\n --infoline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--infoline-bg);\n top: 0;\n left: 0;\n max-width: 65%;\n overflow-wrap: break-word;\n\n [data-ui='Text'] {\n color: var(--infoline-fg);\n }\n`\n\nexport const DurationLine = styled(Card)`\n ${({theme}) => `\n --durationline-fg: ${theme.sanity.color.card.enabled.bg};\n --durationline-bg: ${theme.sanity.color.card.enabled.fg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--durationline-bg);\n top: 0;\n right: 0;\n\n [data-ui='Text'] {\n color: var(--durationline-fg);\n }\n`\n","import React, {type CSSProperties, type MouseEvent, useCallback, useEffect} from 'react'\nimport videojs, {type VideoJsPlayer} from 'video.js'\n\ntype PlayerKind = 'player' | 'diff'\n\ninterface VideoProps {\n src: string\n kind: PlayerKind\n}\n\nconst VideoPlayer = ({src, kind}: VideoProps) => {\n const videoNode = React.useRef<HTMLVideoElement>(null)\n const player = React.useRef<VideoJsPlayer>()\n\n useEffect(() => {\n player.current = videojs(videoNode.current ?? '', {\n sources: [{src}],\n controls: true,\n })\n\n player.current.src({src})\n }, [src])\n\n const stopPropagation = useCallback((event: MouseEvent) => {\n event.stopPropagation()\n }, [])\n\n const className: Record<PlayerKind, string> = {\n player: 'video-js vjs-16-9 vjs-big-play-centered',\n diff: 'video-js vjs-layout-tiny vjs-fluid',\n }\n\n const style: CSSProperties = {position: 'relative'}\n\n return (\n <div>\n <link href=\"https://vjs.zencdn.net/7.8.4/video-js.css\" rel=\"stylesheet\" />\n <div data-vjs-player>\n <video\n onClick={stopPropagation}\n style={kind === 'diff' ? style : {}}\n className={className[kind]}\n ref={videoNode}\n />\n </div>\n </div>\n )\n}\n\nexport default VideoPlayer\n","import React from 'react'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport {styled} from 'styled-components'\nimport {Box, Flex, Text} from '@sanity/ui'\n\nimport {Asset} from '../types'\nimport {DurationLine, InfoLine} from './File.styled'\nimport VideoPlayer from './VideoPlayer'\n\ninterface ComponentProps {\n value: Asset\n}\n\nexport const StyledBox = styled(Box)`\n background-color: ${({theme}) => theme.sanity.color?.card?.enabled?.bg2};\n border: ${({theme}) => `1px solid ${theme.sanity?.color?.card?.enabled?.border}`};\n display: flex;\n justify-content: center;\n margin-bottom: ${({theme}) => theme.sanity.space[4]};\n position: relative;\n`\n\nconst RenderAsset = ({value, url}: {value: Asset; url: string}) => {\n switch (value.type) {\n case 'video':\n return <VideoPlayer src={url} kind=\"player\" />\n default:\n return (\n <Flex justify=\"center\">\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n maxWidth: '100%',\n height: 'auto',\n display: 'block',\n maxHeight: '30vh',\n }}\n />\n </Flex>\n )\n }\n}\n\nconst AssetPreview = ({value}: ComponentProps) => {\n const url = value && value.url\n\n if (!value || !url) {\n return null\n }\n\n const {filename, meta} = value\n const {fileSize, duration} = meta\n\n return (\n <StyledBox marginBottom={2}>\n <RenderAsset value={value} url={url} />\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {fileSize && `(${prettyBytes(fileSize)})`}\n </Text>\n </InfoLine>\n {duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </StyledBox>\n )\n}\n\nexport default AssetPreview\n","import {BehaviorSubject, Observable, concat, defer} from 'rxjs'\nimport {debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport axios from 'axios'\n\ntype SearchSubject = BehaviorSubject<string>\ntype CursorSubject = BehaviorSubject<any>\n\ninterface fetchProps {\n projectId: string\n dataset: string\n shop: string\n query: SearchSubject\n cursor: CursorSubject\n resultsPerPage: number\n}\n\ninterface searchProps extends Omit<fetchProps, 'query' | 'cursor'> {\n query: string\n cursor: string\n}\ninterface listProps extends Omit<fetchProps, 'query' | 'cursor'> {\n cursor: string\n}\n\nconst fetchSearch = (props: searchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage} = props\n\n return defer(() => {\n return axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}&query=${encodeURIComponent(\n query\n )}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n }\n )\n }).pipe(map((result) => result.data))\n}\n\nconst fetchList = (props: listProps): Observable<any> => {\n const {projectId, dataset, shop, cursor, resultsPerPage} = props\n\n return defer(() =>\n axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}${\n cursor && `&cursor=${cursor}`\n }&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n }\n )\n ).pipe(map((result) => result.data))\n}\n\nexport const search = (props: fetchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage} = props\n\n return concat(\n query.pipe(\n withLatestFrom(cursor),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, c]) => {\n if (q) {\n return fetchSearch({projectId, dataset, shop, query: q, cursor: c, resultsPerPage}).pipe(\n distinctUntilChanged()\n )\n }\n return fetchList({projectId, dataset, shop, cursor: c, resultsPerPage})\n })\n )\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Flex, Button} from '@sanity/ui'\nimport {LaunchIcon} from '@sanity/icons'\n\ninterface Props {\n title: string\n shopifyDomain: string\n}\n\nconst DialogHeader = (props: Props) => {\n const {title, shopifyDomain} = props\n\n const handleOpenInNewTab = useCallback(() => {\n window.open(`https://${shopifyDomain}/admin/settings/files`, '_blank')\n }, [shopifyDomain])\n\n return (\n <Flex align=\"center\">\n {title}\n {/*\n HACK: Sanity UI will attempt to focus the first 'focusable' descendant of any dialog.\n Typically this is fine, but since our first focusable element is a button with a tooltip, this\n default behaviour causes the tooltip to appear whenever the dialog is opened, which we don't want!\n\n To get around this, we include a pseudo-hidden input to ensure our tooltip-enabled button remains\n unfocused on initial mount.\n */}\n <input style={{opacity: 0}} tabIndex={-1} type=\"button\" />\n <Box style={{position: 'absolute', right: '-1.5em'}}>\n <Box className=\"button-large\">\n <Button\n fontSize={1}\n icon={LaunchIcon}\n mode=\"bleed\"\n onClick={handleOpenInNewTab}\n text=\"Add New\"\n />\n </Box>\n </Box>\n </Flex>\n )\n}\n\nexport default DialogHeader\n","export const extractName = (name: string): string => name?.split('/')?.pop()?.split('?')[0] ?? ''\n","import React, {useCallback, useRef} from 'react'\nimport {Text} from '@sanity/ui'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\n\nimport {extractName} from '../utils/helpers'\nimport {Asset, ShopifyFile} from '../types'\nimport {DurationLine, InfoLine, Root} from './File.styled'\n\ntype Props = {\n data: ShopifyFile\n width: number\n height: number\n onClick: (file: Asset) => void\n}\n\nexport default function File(props: Props) {\n const {onClick, data, width, height} = props\n const rootElm = useRef<HTMLDivElement>(null)\n\n const {preview, meta} = data\n const filename = extractName(data.url)\n\n const handleClick = useCallback(() => {\n onClick({...data, filename})\n }, [onClick, data, filename])\n\n return (\n <Root\n ref={rootElm}\n title={`${filename}`}\n tabIndex={0}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${preview?.url}\")`,\n }}\n onClick={handleClick}\n >\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {meta.fileSize && `(${prettyBytes(meta.fileSize)})`}\n </Text>\n </InfoLine>\n {meta.duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(meta.duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </Root>\n )\n}\n","import {Stack} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import {BehaviorSubject, Subscription} from 'rxjs'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Card, Dialog, Flex, Inline, Spinner, Stack, Text, TextInput} from '@sanity/ui'\nimport {PatchEvent, set, useProjectId, ObjectInputProps, useDataset} from 'sanity'\nimport React, {useCallback, useEffect, useMemo, useState} from 'react'\nimport PhotoAlbum from 'react-photo-album'\nimport InfiniteScroll from 'react-infinite-scroll-component'\n\nimport {search} from '../datastores/shopify'\nimport type {Asset, PageInfo, ShopifyAPIResponse, ShopifyFile} from '../types'\nimport DialogHeader from './DialogHeader'\nimport File from './File'\nimport {Search} from './ShopifyAssetInput.styled'\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1\n\nexport interface AssetPickerProps extends ObjectInputProps<Asset> {\n shopifyDomain: string\n isOpen: boolean\n onClose: () => void\n}\n\nexport default function ShopifyAssetPicker(props: AssetPickerProps) {\n const {isOpen, onClose, shopifyDomain, onChange, schemaType, value} = props\n const projectId = useProjectId()\n const dataset = useDataset()\n\n const [error, setError] = useState('')\n const [query, setQuery] = useState('')\n const [searchResults, setSearchResults] = useState<any[]>([])\n const [pageInfo, setPageInfo] = useState<PageInfo>()\n const [isLoading, setIsLoading] = useState(true)\n\n const searchSubject$ = useMemo(() => new BehaviorSubject(''), [])\n const cursorSubject$ = useMemo(() => new BehaviorSubject(''), [])\n\n useEffect(() => {\n if (!shopifyDomain) setError('Please configure your Shopify domain in the plugin config')\n }, [shopifyDomain])\n\n useEffect(() => {\n const searchSubscription: Subscription = search({\n projectId,\n dataset,\n shop: shopifyDomain,\n query: searchSubject$,\n cursor: cursorSubject$,\n resultsPerPage: RESULTS_PER_PAGE,\n }).subscribe({\n next: (results: ShopifyAPIResponse) => {\n setSearchResults((prevResults) => [...prevResults, ...results.assets])\n setPageInfo(results.pageInfo)\n setIsLoading(false)\n },\n error: (err) => {\n setError(\n `${\n err.response.data.message || err.message || 'An error occurred'\n } - check plugin configuration`\n )\n },\n })\n\n return () => searchSubscription.unsubscribe()\n }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset])\n\n const handleSearchTermChanged = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newQuery = event.currentTarget.value\n setQuery(newQuery)\n setSearchResults([])\n setPageInfo(undefined)\n setIsLoading(true)\n\n cursorSubject$.next('')\n searchSubject$.next(newQuery)\n },\n [cursorSubject$, searchSubject$]\n )\n\n const handleScollerLoadMore = useCallback(() => {\n setIsLoading(true)\n if (pageInfo) cursorSubject$.next(pageInfo.cursor)\n searchSubject$.next(query)\n }, [cursorSubject$, pageInfo, searchSubject$, query])\n\n const handleSelect = useCallback(\n (file: Asset) => {\n file._key = value?._key\n file._type = schemaType.name\n onChange(PatchEvent.from([set(file)]))\n onClose()\n },\n [onChange, onClose, schemaType.name, value?._key]\n )\n\n const renderFile = useCallback(\n (fileProps: any) => {\n const {photo, layout} = fileProps\n return (\n <File\n onClick={handleSelect}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n />\n )\n },\n [handleSelect]\n )\n\n const handleWidth = useCallback((width: number) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }, [])\n\n return (\n <Dialog\n id=\"shopify-asset-source\"\n header={<DialogHeader title=\"Shopify Assets\" shopifyDomain={shopifyDomain} />}\n onClose={onClose}\n open={isOpen}\n width={4}\n >\n <Stack space={3} padding={4}>\n {error ? (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>{error}</Text>\n </Inline>\n </Flex>\n </Card>\n ) : (\n <>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Shopify for assets\n </Text>\n <TextInput\n label=\"Search Images\"\n placeholder=\"filename.jpg\"\n value={query}\n onChange={handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && searchResults.length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={searchResults.length} // This is important field to render the next data\n next={handleScollerLoadMore}\n hasMore={pageInfo ? pageInfo?.hasNextPage : true}\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Flex>\n }\n >\n {searchResults && (\n <PhotoAlbum\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={handleWidth}\n photos={searchResults.map((file: ShopifyFile) => ({\n src: file?.preview?.url,\n width: file?.preview?.width || 2048,\n height: file?.preview?.height || 2048,\n key: file.id,\n data: file,\n }))}\n renderPhoto={renderFile}\n componentsProps={{\n containerProps: {style: {marginBottom: `${PHOTO_SPACING}px`}},\n }}\n />\n )}\n </InfiniteScroll>\n </>\n )}\n </Stack>\n </Dialog>\n )\n}\n","import React from 'react'\n\nconst ShopifyIcon = () => {\n return (\n <svg width=\"18\" height=\"20\" viewBox=\"0 0 18 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.3269 3.85113C15.3132 3.75015 15.2258 3.69411 15.1531 3.688C15.081 3.6819 13.6693 3.66026 13.6693 3.66026C13.6693 3.66026 12.4887 2.50392 12.3722 2.38628C12.2555 2.26865 12.0277 2.30417 11.9392 2.3308C11.9381 2.33135 11.7175 2.40016 11.3461 2.51612C11.2839 2.31304 11.1927 2.06335 11.0622 1.81255C10.6419 1.00356 10.0263 0.575752 9.2825 0.574642C9.28142 0.574642 9.28092 0.574642 9.27975 0.574642C9.22808 0.574642 9.17692 0.579636 9.12517 0.584074C9.10317 0.557441 9.08117 0.531362 9.05808 0.505838C8.73408 0.156272 8.31869 -0.0140727 7.82082 0.000908712C6.86027 0.0286521 5.90357 0.72834 5.12787 1.97124C4.58212 2.84572 4.16677 3.94435 4.04904 4.79497C2.94601 5.13953 2.17471 5.38035 2.15766 5.3859C1.60091 5.56235 1.58331 5.57955 1.51069 6.10889C1.45677 6.50895 0 17.8704 0 17.8704L12.2082 20L17.4994 18.6733C17.4994 18.6733 15.3407 3.95212 15.3269 3.85113ZM10.7349 2.707C10.4537 2.79467 10.1342 2.89454 9.78758 3.00274C9.78042 2.51224 9.72267 1.82975 9.496 1.23992C10.2249 1.3792 10.5836 2.21095 10.7349 2.707ZM9.14883 3.20249C8.509 3.40225 7.81091 3.62031 7.11058 3.83892C7.30753 3.0782 7.68107 2.32081 8.13989 1.8242C8.31044 1.63943 8.54917 1.43358 8.832 1.31594C9.09767 1.87525 9.15542 2.66705 9.14883 3.20249ZM7.84007 0.645665C8.06562 0.640671 8.25542 0.690609 8.41775 0.798253C8.15805 0.9342 7.90718 1.12951 7.67172 1.38419C7.06162 2.04448 6.594 3.06932 6.4075 4.0581C5.826 4.23954 5.25715 4.41766 4.73342 4.58078C5.06405 3.02438 6.35743 0.688944 7.84007 0.645665Z\"\n fill=\"#95BF47\"\n />\n <path\n d=\"M9.276 6.43238L8.66142 8.75117C8.66142 8.75117 7.97598 8.43658 7.16342 8.48817C5.97181 8.56417 5.95916 9.32217 5.97126 9.51242C6.03618 10.5495 8.74125 10.7759 8.89308 13.2051C9.01242 15.1161 7.88796 16.4233 6.26779 16.5265C4.32303 16.6502 3.25246 15.4933 3.25246 15.4933L3.66452 13.7256C3.66452 13.7256 4.74224 14.5457 5.60487 14.4907C6.16821 14.4547 6.36957 13.9924 6.34921 13.6657C6.26448 12.3128 4.06172 12.3927 3.92253 10.17C3.80536 8.29951 5.02337 6.40408 7.71081 6.23318C8.74617 6.16604 9.276 6.43238 9.276 6.43238Z\"\n fill=\"white\"\n />\n <path\n d=\"M15.1536 3.68853C15.0815 3.68243 13.6698 3.66078 13.6698 3.66078C13.6698 3.66078 12.4893 2.50444 12.3726 2.38681C12.3292 2.34298 12.2703 2.32023 12.2087 2.31079L12.2093 19.9994L17.4999 18.6733C17.4999 18.6733 15.3412 3.95264 15.3274 3.85166C15.3137 3.75068 15.2257 3.69463 15.1536 3.68853Z\"\n fill=\"#5E8E3E\"\n />\n </svg>\n )\n}\n\nexport default ShopifyIcon\n","import React from 'react'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Inline, Stack, Text} from '@sanity/ui'\nimport {ObjectInputProps, PatchEvent, unset} from 'sanity'\nimport {useCallback, useState} from 'react'\n\nimport {Asset} from '../types'\nimport AssetPreview from './AssetPreview'\nimport ShopifyAssetPicker from './ShopifyAssetPicker'\nimport ShopifyIcon from './ShopifyIcon'\n\nexport default function ShopifyAssetInput(props: ObjectInputProps) {\n const {onChange, readOnly, value, schemaType} = props\n const {options} = schemaType\n const {shopifyDomain} = options\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const removeValue = useCallback(() => {\n onChange(PatchEvent.from([unset()]))\n }, [onChange])\n\n const onOpen = useCallback(() => {\n setDialogOpen(true)\n }, [setDialogOpen])\n\n const onClose = useCallback(() => {\n setDialogOpen(false)\n }, [setDialogOpen])\n\n if (!shopifyDomain) {\n return (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>\n You need to configure your *.myshopify.com domain in the plugin / field options to\n enable Shopify Assets.\n </Text>\n </Inline>\n </Flex>\n </Card>\n )\n }\n\n return (\n <>\n {dialogOpen && (\n <ShopifyAssetPicker\n {...props}\n shopifyDomain={shopifyDomain}\n isOpen={dialogOpen}\n onClose={onClose}\n value={value as Asset}\n />\n )}\n <Stack>\n <AssetPreview value={value as Asset} />\n\n <Grid gap={1} style={{gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))'}}>\n <Button\n disabled={readOnly}\n mode=\"ghost\"\n icon={ShopifyIcon}\n title=\"Select an asset\"\n onClick={onOpen}\n text=\"Select…\"\n />\n <Button\n disabled={readOnly || !value}\n tone=\"critical\"\n mode=\"ghost\"\n title=\"Remove asset\"\n text=\"Remove\"\n onClick={removeValue}\n />\n </Grid>\n </Stack>\n </>\n )\n}\n","import React from 'react'\nimport {DiffFromTo} from 'sanity'\nimport {Flex, Text, Stack} from '@sanity/ui'\n\nimport type {Asset} from '../types'\n\ntype Props = {\n value: Asset | undefined\n}\n\nconst CloudinaryDiffPreview = ({value}: Props) => {\n if (!value) {\n return null\n }\n\n if (value?.preview?.url) {\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <Stack space={2}>\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n objectFit: 'contain',\n margin: 'auto',\n maxWidth: '100%',\n maxHeight: '100%',\n }}\n />\n <Text size={1}>{value.type.charAt(0).toUpperCase() + value.type.slice(1)}</Text>\n </Stack>\n </Flex>\n )\n }\n\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <div>(no image)</div>\n </Flex>\n )\n}\n\ntype DiffProps = {\n diff: any\n schemaType: any\n}\n\nconst AssetDiff = ({diff, schemaType}: DiffProps) => {\n return (\n <DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={CloudinaryDiffPreview}\n layout={'grid'}\n />\n )\n}\n\nexport default AssetDiff\n","/* eslint-disable */\nimport ShopifyAssetInput from '../components/ShopifyAssetInput'\nimport AssetDiff from '../components/AssetDiff'\nimport AssetPreview from '../components/AssetPreview'\nimport {defineField, defineType} from 'sanity'\n\ninterface ObjectConfig {\n shopifyDomain: string\n}\n\ndeclare module 'sanity' {\n interface ObjectOptions {\n shopifyDomain?: string\n }\n}\n\nexport const shopifyAssetSchema = (config: ObjectConfig) => {\n const {shopifyDomain} = config\n\n return defineType({\n type: 'object',\n name: 'shopify.asset',\n title: 'Shopify Asset',\n options: {\n shopifyDomain,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'filename',\n title: 'Filename',\n }),\n defineField({\n type: 'string',\n name: 'id',\n title: 'ID',\n }),\n defineField({\n type: 'shopify.assetMetadata',\n name: 'meta',\n title: 'Metadata',\n }),\n defineField({\n type: 'shopify.assetPreview',\n name: 'preview',\n title: 'Preview',\n }),\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n ...({\n components: {\n input: ShopifyAssetInput,\n diff: AssetDiff,\n preview: AssetPreview,\n },\n } as {}),\n preview: {\n select: {\n meta: 'meta',\n preview: 'preview',\n url: 'url',\n filename: 'filename',\n type: 'type',\n },\n prepare({url, meta, preview, filename, type}) {\n return {\n title: filename,\n subtitle: type,\n value: {\n url,\n meta,\n preview,\n filename,\n },\n }\n },\n },\n })\n}\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetPreviewSchema = defineType({\n type: 'object',\n name: 'shopify.assetPreview',\n title: 'Asset preview',\n fields: [\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n})\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetMetadataSchema = defineType({\n type: 'object',\n name: 'shopify.assetMetadata',\n title: 'Asset metadata',\n fields: [\n defineField({\n type: 'string',\n name: 'alt',\n title: 'Alternative text',\n }),\n defineField({\n type: 'number',\n name: 'duration',\n title: 'Duration',\n }),\n defineField({\n type: 'number',\n name: 'fileSize',\n title: 'File size',\n }),\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n ],\n})\n","import {definePlugin, type ObjectDefinition} from 'sanity'\nimport {shopifyAssetSchema} from './schema/shopifyAssetSchema'\nimport {shopifyAssetPreviewSchema} from './schema/shopifyAssetPreviewSchema'\nimport {shopifyAssetMetadataSchema} from './schema/shopifyAssetMetadataSchema'\nimport type {PluginConfig} from './types'\n\nexport * from './types'\n\n// enables autocompletion and validation of document options\ndeclare module 'sanity' {\n export namespace Schema {\n // here we type up our custom schema definition\n export type ShopifyAssetTypeDef = Omit<ObjectDefinition, 'type' | 'fields'> & {\n type: 'shopify.asset'\n options: {\n shopifyDomain: string\n }\n }\n // Adds 'extension-type' as an intrinsic type\n export interface IntrinsicTypeDefinition {\n 'shopify.asset': ShopifyAssetTypeDef\n }\n }\n}\n\nexport const shopifyAssets = definePlugin<PluginConfig>((config) => {\n return {\n name: 'shopify-asset-schema',\n schema: {\n types: [shopifyAssetPreviewSchema, shopifyAssetMetadataSchema, shopifyAssetSchema(config)],\n },\n }\n})\n"],"names":["Root","styled","div","_ref","theme","sanity","color","card","enabled","bg2","_ref2","border","InfoLine","Card","_ref3","fg","bg","DurationLine","_ref4","VideoPlayer","_ref5","src","kind","videoNode","React","useRef","player","useEffect","current","videojs","sources","controls","stopPropagation","useCallback","event","className","diff","style","position","children","jsx","href","rel","onClick","ref","StyledBox","Box","_ref6","_ref7","_ref8","space","RenderAsset","_ref9","value","url","type","Flex","justify","alt","preview","maxWidth","height","display","maxHeight","AssetPreview","_ref0","filename","meta","fileSize","duration","jsxs","marginBottom","padding","radius","margin","Text","size","title","prettyBytes","default","prettyMilliseconds","colonNotation","secondsDecimalDigits","fetchSearch","props","projectId","dataset","shop","query","cursor","resultsPerPage","defer","axios","get","encodeURIComponent","withCredentials","method","pipe","map","result","data","fetchList","search","concat","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref1","q","c","DialogHeader","shopifyDomain","handleOpenInNewTab","window","open","align","opacity","tabIndex","right","Button","fontSize","icon","LaunchIcon","mode","text","extractName","name","split","pop","File","width","rootElm","handleClick","backgroundImage","Search","Stack","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","ShopifyAssetPicker","isOpen","onClose","onChange","schemaType","useProjectId","useDataset","error","setError","useState","setQuery","searchResults","setSearchResults","pageInfo","setPageInfo","isLoading","setIsLoading","searchSubject$","useMemo","BehaviorSubject","cursorSubject$","searchSubscription","subscribe","next","results","prevResults","assets","err","response","message","unsubscribe","handleSearchTermChanged","newQuery","currentTarget","handleScollerLoadMore","handleSelect","file","_key","_type","PatchEvent","from","set","renderFile","fileProps","photo","layout","handleWidth","Dialog","id","header","overflow","shadow","tone","gap","ErrorOutlineIcon","Inline","Fragment","weight","TextInput","label","placeholder","length","muted","InfiniteScroll","dataLength","hasMore","hasNextPage","scrollThreshold","loader","Spinner","endMessage","PhotoAlbum","spacing","targetRowHeight","photos","key","renderPhoto","componentsProps","containerProps","ShopifyIcon","viewBox","fill","xmlns","d","ShopifyAssetInput","readOnly","options","dialogOpen","setDialogOpen","removeValue","unset","onOpen","Grid","gridTemplateColumns","disabled","CloudinaryDiffPreview","_ref10","objectFit","charAt","toUpperCase","slice","AssetDiff","_ref11","DiffFromTo","previewComponent","shopifyAssetSchema","config","defineType","fields","defineField","components","input","select","prepare","_ref12","subtitle","shopifyAssetPreviewSchema","shopifyAssetMetadataSchema","shopifyAssets","definePlugin","schema","types"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/File.styled.tsx","../src/components/VideoPlayer.tsx","../src/components/AssetPreview.tsx","../src/datastores/shopify.ts","../src/components/DialogHeader.tsx","../src/utils/helpers.ts","../src/components/File.tsx","../src/components/ShopifyAssetInput.styled.tsx","../src/components/ShopifyAssetPicker.tsx","../src/components/ShopifyIcon.tsx","../src/components/ShopifyAssetInput.tsx","../src/components/AssetDiff.tsx","../src/schema/shopifyAssetSchema.ts","../src/schema/shopifyAssetPreviewSchema.ts","../src/schema/shopifyAssetMetadataSchema.ts","../src/index.ts"],"sourcesContent":["import {Card} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Root = styled.div`\n overflow: hidden;\n background-origin: content-box;\n background-repeat: no-repeat;\n background-clip: border-box;\n background-size: cover;\n background-color: ${({theme}) => theme.sanity.color.card.enabled.bg2};\n position: relative;\n outline: none !important;\n border: ${({theme}) => `1px solid ${theme.sanity.color.card.enabled.border}`};\n box-sizing: content-box;\n user-drag: none;\n\n &:hover {\n opacity: 0.85;\n }\n\n &:focus,\n &:active {\n border: 1px solid var(--input-border-color-focus);\n box-shadow: inset 0 0 0 3px var(--input-border-color-focus);\n }\n`\n\nexport const InfoLine = styled(Card)`\n ${({theme}) => `\n --infoline-fg: ${theme.sanity.color.card.enabled.fg};\n --infoline-bg: ${theme.sanity.color.card.enabled.bg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--infoline-bg);\n top: 0;\n left: 0;\n max-width: 65%;\n overflow-wrap: break-word;\n\n [data-ui='Text'] {\n color: var(--infoline-fg);\n }\n`\n\nexport const DurationLine = styled(Card)`\n ${({theme}) => `\n --durationline-fg: ${theme.sanity.color.card.enabled.bg};\n --durationline-bg: ${theme.sanity.color.card.enabled.fg};\n `};\n user-drag: none;\n position: absolute;\n background-color: var(--durationline-bg);\n top: 0;\n right: 0;\n\n [data-ui='Text'] {\n color: var(--durationline-fg);\n }\n`\n","import React, {type CSSProperties, type MouseEvent, useCallback, useEffect} from 'react'\nimport videojs, {type VideoJsPlayer} from 'video.js'\n\ntype PlayerKind = 'player' | 'diff'\n\ninterface VideoProps {\n src: string\n kind: PlayerKind\n}\n\nconst VideoPlayer = ({src, kind}: VideoProps) => {\n const videoNode = React.useRef<HTMLVideoElement>(null)\n const player = React.useRef<VideoJsPlayer>()\n\n useEffect(() => {\n player.current = videojs(videoNode.current ?? '', {\n sources: [{src}],\n controls: true,\n })\n\n player.current.src({src})\n }, [src])\n\n const stopPropagation = useCallback((event: MouseEvent) => {\n event.stopPropagation()\n }, [])\n\n const className: Record<PlayerKind, string> = {\n player: 'video-js vjs-16-9 vjs-big-play-centered',\n diff: 'video-js vjs-layout-tiny vjs-fluid',\n }\n\n const style: CSSProperties = {position: 'relative'}\n\n return (\n <div>\n <link href=\"https://vjs.zencdn.net/7.8.4/video-js.css\" rel=\"stylesheet\" />\n <div data-vjs-player>\n <video\n onClick={stopPropagation}\n style={kind === 'diff' ? style : {}}\n className={className[kind]}\n ref={videoNode}\n />\n </div>\n </div>\n )\n}\n\nexport default VideoPlayer\n","import React from 'react'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport {styled} from 'styled-components'\nimport {Box, Flex, Text} from '@sanity/ui'\n\nimport {Asset} from '../types'\nimport {DurationLine, InfoLine} from './File.styled'\nimport VideoPlayer from './VideoPlayer'\n\ninterface ComponentProps {\n value: Asset\n}\n\nexport const StyledBox = styled(Box)`\n background-color: ${({theme}) => theme.sanity.color?.card?.enabled?.bg2};\n border: ${({theme}) => `1px solid ${theme.sanity?.color?.card?.enabled?.border}`};\n display: flex;\n justify-content: center;\n margin-bottom: ${({theme}) => theme.sanity.space[4]};\n position: relative;\n`\n\nconst RenderAsset = ({value, url}: {value: Asset; url: string}) => {\n switch (value.type) {\n case 'video':\n return <VideoPlayer src={url} kind=\"player\" />\n default:\n return (\n <Flex justify=\"center\">\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n maxWidth: '100%',\n height: 'auto',\n display: 'block',\n maxHeight: '30vh',\n }}\n />\n </Flex>\n )\n }\n}\n\nconst AssetPreview = ({value}: ComponentProps) => {\n const url = value && value.url\n\n if (!value || !url) {\n return null\n }\n\n const {filename, meta} = value\n const {fileSize, duration} = meta\n\n return (\n <StyledBox marginBottom={2}>\n <RenderAsset value={value} url={url} />\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {fileSize && `(${prettyBytes(fileSize)})`}\n </Text>\n </InfoLine>\n {duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </StyledBox>\n )\n}\n\nexport default AssetPreview\n","import {BehaviorSubject, Observable, concat, defer} from 'rxjs'\nimport {debounceTime, distinctUntilChanged, map, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport axios from 'axios'\n\ntype SearchSubject = BehaviorSubject<string>\ntype CursorSubject = BehaviorSubject<any>\n\ninterface fetchProps {\n projectId: string\n dataset: string\n shop: string\n query: SearchSubject\n cursor: CursorSubject\n resultsPerPage: number\n token?: string\n}\n\ninterface searchProps extends Omit<fetchProps, 'query' | 'cursor'> {\n query: string\n cursor: string\n}\ninterface listProps extends Omit<fetchProps, 'query' | 'cursor'> {\n cursor: string\n}\n\nconst fetchSearch = (props: searchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage, token} = props\n\n return defer(() => {\n return axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}&query=${encodeURIComponent(\n query\n )}${cursor && `&cursor=${cursor}`}&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n }\n )\n }).pipe(map((result) => result.data))\n}\n\nconst fetchList = (props: listProps): Observable<any> => {\n const {projectId, dataset, shop, cursor, resultsPerPage, token} = props\n\n return defer(() =>\n axios.get(\n `https://${projectId}.api.sanity.io/v1/shopify/assets/${dataset}?shop=${shop}${\n cursor && `&cursor=${cursor}`\n }&limit=${resultsPerPage}`,\n {\n withCredentials: true,\n method: 'GET',\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n }\n )\n ).pipe(map((result) => result.data))\n}\n\nexport const search = (props: fetchProps): Observable<any> => {\n const {projectId, dataset, shop, query, cursor, resultsPerPage, token} = props\n\n return concat(\n query.pipe(\n withLatestFrom(cursor),\n debounceTime(500),\n distinctUntilChanged(),\n switchMap(([q, c]) => {\n if (q) {\n return fetchSearch({\n projectId,\n dataset,\n shop,\n query: q,\n cursor: c,\n resultsPerPage,\n token,\n }).pipe(distinctUntilChanged())\n }\n return fetchList({projectId, dataset, shop, cursor: c, resultsPerPage, token})\n })\n )\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Flex, Button} from '@sanity/ui'\nimport {LaunchIcon} from '@sanity/icons'\n\ninterface Props {\n title: string\n shopifyDomain: string\n}\n\nconst DialogHeader = (props: Props) => {\n const {title, shopifyDomain} = props\n\n const handleOpenInNewTab = useCallback(() => {\n window.open(`https://${shopifyDomain}/admin/content/files`, '_blank')\n }, [shopifyDomain])\n\n return (\n <Flex align=\"center\">\n {title}\n {/*\n HACK: Sanity UI will attempt to focus the first 'focusable' descendant of any dialog.\n Typically this is fine, but since our first focusable element is a button with a tooltip, this\n default behaviour causes the tooltip to appear whenever the dialog is opened, which we don't want!\n\n To get around this, we include a pseudo-hidden input to ensure our tooltip-enabled button remains\n unfocused on initial mount.\n */}\n <input style={{opacity: 0}} tabIndex={-1} type=\"button\" />\n <Box style={{position: 'absolute', right: '-1.5em'}}>\n <Box className=\"button-large\">\n <Button\n fontSize={1}\n icon={LaunchIcon}\n mode=\"bleed\"\n onClick={handleOpenInNewTab}\n text=\"Add New\"\n />\n </Box>\n </Box>\n </Flex>\n )\n}\n\nexport default DialogHeader\n","export const extractName = (name: string): string => name?.split('/')?.pop()?.split('?')[0] ?? ''\n","import React, {useCallback, useRef} from 'react'\nimport {Text} from '@sanity/ui'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\n\nimport {extractName} from '../utils/helpers'\nimport {Asset, ShopifyFile} from '../types'\nimport {DurationLine, InfoLine, Root} from './File.styled'\n\ntype Props = {\n data: ShopifyFile\n width: number\n height: number\n onClick: (file: Asset) => void\n}\n\nexport default function File(props: Props) {\n const {onClick, data, width, height} = props\n const rootElm = useRef<HTMLDivElement>(null)\n\n const {preview, meta} = data\n const filename = extractName(data.url)\n\n const handleClick = useCallback(() => {\n onClick({...data, filename})\n }, [onClick, data, filename])\n\n return (\n <Root\n ref={rootElm}\n title={`${filename}`}\n tabIndex={0}\n style={{\n width: `${width}px`,\n height: `${height}px`,\n backgroundImage: `url(\"${preview?.url}\")`,\n }}\n onClick={handleClick}\n >\n <InfoLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Select ${filename}`}>\n {filename} {meta.fileSize && `(${prettyBytes(meta.fileSize)})`}\n </Text>\n </InfoLine>\n {meta.duration && (\n <DurationLine padding={2} radius={2} margin={2}>\n <Text size={1} title={`Video duration: ${filename}`}>\n {prettyMilliseconds(meta.duration, {colonNotation: true, secondsDecimalDigits: 0})}\n </Text>\n </DurationLine>\n )}\n </Root>\n )\n}\n","import {Stack} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const Search = styled(Stack)`\n position: sticky;\n top: 0;\n z-index: 1;\n`\n\nexport const Scroller = styled.div`\n overflow-y: auto;\n max-height: 80vh;\n`\n","import {BehaviorSubject, Subscription} from 'rxjs'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Card, Dialog, Flex, Inline, Spinner, Stack, Text, TextInput} from '@sanity/ui'\nimport {PatchEvent, set, useProjectId, ObjectInputProps, useDataset, useClient} from 'sanity'\nimport React, {useCallback, useEffect, useMemo, useState} from 'react'\nimport PhotoAlbum from 'react-photo-album'\nimport InfiniteScroll from 'react-infinite-scroll-component'\n\nimport {search} from '../datastores/shopify'\nimport type {Asset, PageInfo, ShopifyAPIResponse, ShopifyFile} from '../types'\nimport DialogHeader from './DialogHeader'\nimport File from './File'\nimport {Search} from './ShopifyAssetInput.styled'\n\nconst RESULTS_PER_PAGE = 42\nconst PHOTO_SPACING = 2\nconst PHOTO_PADDING = 1\n\nexport interface AssetPickerProps extends ObjectInputProps<Asset> {\n shopifyDomain: string\n isOpen: boolean\n onClose: () => void\n}\n\nexport default function ShopifyAssetPicker(props: AssetPickerProps) {\n const {isOpen, onClose, shopifyDomain, onChange, schemaType, value} = props\n const projectId = useProjectId()\n const dataset = useDataset()\n const client = useClient({apiVersion: '2021-06-07'})\n const token = client.config().token\n\n const [error, setError] = useState('')\n const [query, setQuery] = useState('')\n const [searchResults, setSearchResults] = useState<any[]>([])\n const [pageInfo, setPageInfo] = useState<PageInfo>()\n const [isLoading, setIsLoading] = useState(true)\n\n const searchSubject$ = useMemo(() => new BehaviorSubject(''), [])\n const cursorSubject$ = useMemo(() => new BehaviorSubject(''), [])\n\n useEffect(() => {\n if (!shopifyDomain) setError('Please configure your Shopify domain in the plugin config')\n }, [shopifyDomain])\n\n useEffect(() => {\n const searchSubscription: Subscription = search({\n projectId,\n dataset,\n shop: shopifyDomain,\n query: searchSubject$,\n cursor: cursorSubject$,\n resultsPerPage: RESULTS_PER_PAGE,\n token,\n }).subscribe({\n next: (results: ShopifyAPIResponse) => {\n setSearchResults((prevResults) => [...prevResults, ...results.assets])\n setPageInfo(results.pageInfo)\n setIsLoading(false)\n },\n error: (err) => {\n setError(\n `${\n err.response?.data?.message || err.message || 'An error occurred'\n } - check plugin configuration`\n )\n },\n })\n\n return () => searchSubscription.unsubscribe()\n }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset, token])\n\n const handleSearchTermChanged = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const newQuery = event.currentTarget.value\n setQuery(newQuery)\n setSearchResults([])\n setPageInfo(undefined)\n setIsLoading(true)\n\n cursorSubject$.next('')\n searchSubject$.next(newQuery)\n },\n [cursorSubject$, searchSubject$]\n )\n\n const handleScollerLoadMore = useCallback(() => {\n setIsLoading(true)\n if (pageInfo) cursorSubject$.next(pageInfo.cursor)\n searchSubject$.next(query)\n }, [cursorSubject$, pageInfo, searchSubject$, query])\n\n const handleSelect = useCallback(\n (file: Asset) => {\n file._key = value?._key\n file._type = schemaType.name\n onChange(PatchEvent.from([set(file)]))\n onClose()\n },\n [onChange, onClose, schemaType.name, value?._key]\n )\n\n const renderFile = useCallback(\n (fileProps: any) => {\n const {photo, layout} = fileProps\n return (\n <File\n onClick={handleSelect}\n data={photo.data}\n width={layout.width}\n height={layout.height}\n />\n )\n },\n [handleSelect]\n )\n\n const handleWidth = useCallback((width: number) => {\n if (width < 300) return 150\n else if (width < 600) return 200\n return 300\n }, [])\n\n return (\n <Dialog\n id=\"shopify-asset-source\"\n header={<DialogHeader title=\"Shopify Assets\" shopifyDomain={shopifyDomain} />}\n onClose={onClose}\n open={isOpen}\n width={4}\n >\n <Stack space={3} padding={4}>\n {error ? (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>{error}</Text>\n </Inline>\n </Flex>\n </Card>\n ) : (\n <>\n <Card>\n <Search space={3}>\n <Text size={1} weight=\"semibold\">\n Search Shopify for assets\n </Text>\n <TextInput\n label=\"Search Images\"\n placeholder=\"filename.jpg\"\n value={query}\n onChange={handleSearchTermChanged}\n />\n </Search>\n </Card>\n {!isLoading && searchResults.length === 0 && (\n <Text size={1} muted>\n No results found\n </Text>\n )}\n <InfiniteScroll\n dataLength={searchResults.length} // This is important field to render the next data\n next={handleScollerLoadMore}\n hasMore={pageInfo ? pageInfo?.hasNextPage : true}\n scrollThreshold={0.99}\n height=\"60vh\"\n loader={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Spinner muted />\n </Flex>\n }\n endMessage={\n <Flex align=\"center\" justify=\"center\" padding={3}>\n <Text size={1} muted>\n No more results\n </Text>\n </Flex>\n }\n >\n {searchResults && (\n <PhotoAlbum\n layout=\"rows\"\n spacing={PHOTO_SPACING}\n padding={PHOTO_PADDING}\n targetRowHeight={handleWidth}\n photos={searchResults.map((file: ShopifyFile) => ({\n src: file?.preview?.url,\n width: file?.preview?.width || 2048,\n height: file?.preview?.height || 2048,\n key: file.id,\n data: file,\n }))}\n renderPhoto={renderFile}\n componentsProps={{\n containerProps: {style: {marginBottom: `${PHOTO_SPACING}px`}},\n }}\n />\n )}\n </InfiniteScroll>\n </>\n )}\n </Stack>\n </Dialog>\n )\n}\n","import React from 'react'\n\nconst ShopifyIcon = () => {\n return (\n <svg width=\"18\" height=\"20\" viewBox=\"0 0 18 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.3269 3.85113C15.3132 3.75015 15.2258 3.69411 15.1531 3.688C15.081 3.6819 13.6693 3.66026 13.6693 3.66026C13.6693 3.66026 12.4887 2.50392 12.3722 2.38628C12.2555 2.26865 12.0277 2.30417 11.9392 2.3308C11.9381 2.33135 11.7175 2.40016 11.3461 2.51612C11.2839 2.31304 11.1927 2.06335 11.0622 1.81255C10.6419 1.00356 10.0263 0.575752 9.2825 0.574642C9.28142 0.574642 9.28092 0.574642 9.27975 0.574642C9.22808 0.574642 9.17692 0.579636 9.12517 0.584074C9.10317 0.557441 9.08117 0.531362 9.05808 0.505838C8.73408 0.156272 8.31869 -0.0140727 7.82082 0.000908712C6.86027 0.0286521 5.90357 0.72834 5.12787 1.97124C4.58212 2.84572 4.16677 3.94435 4.04904 4.79497C2.94601 5.13953 2.17471 5.38035 2.15766 5.3859C1.60091 5.56235 1.58331 5.57955 1.51069 6.10889C1.45677 6.50895 0 17.8704 0 17.8704L12.2082 20L17.4994 18.6733C17.4994 18.6733 15.3407 3.95212 15.3269 3.85113ZM10.7349 2.707C10.4537 2.79467 10.1342 2.89454 9.78758 3.00274C9.78042 2.51224 9.72267 1.82975 9.496 1.23992C10.2249 1.3792 10.5836 2.21095 10.7349 2.707ZM9.14883 3.20249C8.509 3.40225 7.81091 3.62031 7.11058 3.83892C7.30753 3.0782 7.68107 2.32081 8.13989 1.8242C8.31044 1.63943 8.54917 1.43358 8.832 1.31594C9.09767 1.87525 9.15542 2.66705 9.14883 3.20249ZM7.84007 0.645665C8.06562 0.640671 8.25542 0.690609 8.41775 0.798253C8.15805 0.9342 7.90718 1.12951 7.67172 1.38419C7.06162 2.04448 6.594 3.06932 6.4075 4.0581C5.826 4.23954 5.25715 4.41766 4.73342 4.58078C5.06405 3.02438 6.35743 0.688944 7.84007 0.645665Z\"\n fill=\"#95BF47\"\n />\n <path\n d=\"M9.276 6.43238L8.66142 8.75117C8.66142 8.75117 7.97598 8.43658 7.16342 8.48817C5.97181 8.56417 5.95916 9.32217 5.97126 9.51242C6.03618 10.5495 8.74125 10.7759 8.89308 13.2051C9.01242 15.1161 7.88796 16.4233 6.26779 16.5265C4.32303 16.6502 3.25246 15.4933 3.25246 15.4933L3.66452 13.7256C3.66452 13.7256 4.74224 14.5457 5.60487 14.4907C6.16821 14.4547 6.36957 13.9924 6.34921 13.6657C6.26448 12.3128 4.06172 12.3927 3.92253 10.17C3.80536 8.29951 5.02337 6.40408 7.71081 6.23318C8.74617 6.16604 9.276 6.43238 9.276 6.43238Z\"\n fill=\"white\"\n />\n <path\n d=\"M15.1536 3.68853C15.0815 3.68243 13.6698 3.66078 13.6698 3.66078C13.6698 3.66078 12.4893 2.50444 12.3726 2.38681C12.3292 2.34298 12.2703 2.32023 12.2087 2.31079L12.2093 19.9994L17.4999 18.6733C17.4999 18.6733 15.3412 3.95264 15.3274 3.85166C15.3137 3.75068 15.2257 3.69463 15.1536 3.68853Z\"\n fill=\"#5E8E3E\"\n />\n </svg>\n )\n}\n\nexport default ShopifyIcon\n","import React from 'react'\nimport {ErrorOutlineIcon} from '@sanity/icons'\nimport {Button, Card, Flex, Grid, Inline, Stack, Text} from '@sanity/ui'\nimport {ObjectInputProps, PatchEvent, unset} from 'sanity'\nimport {useCallback, useState} from 'react'\n\nimport {Asset} from '../types'\nimport AssetPreview from './AssetPreview'\nimport ShopifyAssetPicker from './ShopifyAssetPicker'\nimport ShopifyIcon from './ShopifyIcon'\n\nexport default function ShopifyAssetInput(props: ObjectInputProps) {\n const {onChange, readOnly, value, schemaType} = props\n const {options} = schemaType\n const {shopifyDomain} = options\n\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const removeValue = useCallback(() => {\n onChange(PatchEvent.from([unset()]))\n }, [onChange])\n\n const onOpen = useCallback(() => {\n setDialogOpen(true)\n }, [setDialogOpen])\n\n const onClose = useCallback(() => {\n setDialogOpen(false)\n }, [setDialogOpen])\n\n if (!shopifyDomain) {\n return (\n <Card overflow=\"hidden\" padding={4} radius={2} shadow={1} tone=\"critical\">\n <Flex align=\"center\" gap={3}>\n <Text size={2}>\n <ErrorOutlineIcon />\n </Text>\n <Inline space={2}>\n <Text size={1}>\n You need to configure your *.myshopify.com domain in the plugin / field options to\n enable Shopify Assets.\n </Text>\n </Inline>\n </Flex>\n </Card>\n )\n }\n\n return (\n <>\n {dialogOpen && (\n <ShopifyAssetPicker\n {...props}\n shopifyDomain={shopifyDomain}\n isOpen={dialogOpen}\n onClose={onClose}\n value={value as Asset}\n />\n )}\n <Stack>\n <AssetPreview value={value as Asset} />\n\n <Grid gap={1} style={{gridTemplateColumns: 'repeat(auto-fit, minmax(100px, 1fr))'}}>\n <Button\n disabled={readOnly}\n mode=\"ghost\"\n icon={ShopifyIcon}\n title=\"Select an asset\"\n onClick={onOpen}\n text=\"Select…\"\n />\n <Button\n disabled={readOnly || !value}\n tone=\"critical\"\n mode=\"ghost\"\n title=\"Remove asset\"\n text=\"Remove\"\n onClick={removeValue}\n />\n </Grid>\n </Stack>\n </>\n )\n}\n","import React from 'react'\nimport {DiffFromTo} from 'sanity'\nimport {Flex, Text, Stack} from '@sanity/ui'\n\nimport type {Asset} from '../types'\n\ntype Props = {\n value: Asset | undefined\n}\n\nconst CloudinaryDiffPreview = ({value}: Props) => {\n if (!value) {\n return null\n }\n\n if (value?.preview?.url) {\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <Stack space={2}>\n <img\n alt=\"preview\"\n src={value?.preview?.url}\n style={{\n objectFit: 'contain',\n margin: 'auto',\n maxWidth: '100%',\n maxHeight: '100%',\n }}\n />\n <Text size={1}>{value.type.charAt(0).toUpperCase() + value.type.slice(1)}</Text>\n </Stack>\n </Flex>\n )\n }\n\n return (\n <Flex justify=\"center\" align=\"center\" height=\"fill\" width=\"fill\">\n <div>(no image)</div>\n </Flex>\n )\n}\n\ntype DiffProps = {\n diff: any\n schemaType: any\n}\n\nconst AssetDiff = ({diff, schemaType}: DiffProps) => {\n return (\n <DiffFromTo\n diff={diff}\n schemaType={schemaType}\n previewComponent={CloudinaryDiffPreview}\n layout={'grid'}\n />\n )\n}\n\nexport default AssetDiff\n","/* eslint-disable */\nimport ShopifyAssetInput from '../components/ShopifyAssetInput'\nimport AssetDiff from '../components/AssetDiff'\nimport AssetPreview from '../components/AssetPreview'\nimport {defineField, defineType} from 'sanity'\n\ninterface ObjectConfig {\n shopifyDomain: string\n}\n\ndeclare module 'sanity' {\n interface ObjectOptions {\n shopifyDomain?: string\n }\n}\n\nexport const shopifyAssetSchema = (config: ObjectConfig) => {\n const {shopifyDomain} = config\n\n return defineType({\n type: 'object',\n name: 'shopify.asset',\n title: 'Shopify Asset',\n options: {\n shopifyDomain,\n },\n fields: [\n defineField({\n type: 'string',\n name: 'filename',\n title: 'Filename',\n }),\n defineField({\n type: 'string',\n name: 'id',\n title: 'ID',\n }),\n defineField({\n type: 'shopify.assetMetadata',\n name: 'meta',\n title: 'Metadata',\n }),\n defineField({\n type: 'shopify.assetPreview',\n name: 'preview',\n title: 'Preview',\n }),\n defineField({\n type: 'string',\n name: 'type',\n title: 'Type',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n ...({\n components: {\n input: ShopifyAssetInput,\n diff: AssetDiff,\n preview: AssetPreview,\n },\n } as {}),\n preview: {\n select: {\n meta: 'meta',\n preview: 'preview',\n url: 'url',\n filename: 'filename',\n type: 'type',\n },\n prepare({url, meta, preview, filename, type}) {\n return {\n title: filename,\n subtitle: type,\n value: {\n url,\n meta,\n preview,\n filename,\n },\n }\n },\n },\n })\n}\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetPreviewSchema = defineType({\n type: 'object',\n name: 'shopify.assetPreview',\n title: 'Asset preview',\n fields: [\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n defineField({\n type: 'url',\n name: 'url',\n title: 'URL',\n }),\n ],\n})\n","import {defineField, defineType} from 'sanity'\n\nexport const shopifyAssetMetadataSchema = defineType({\n type: 'object',\n name: 'shopify.assetMetadata',\n title: 'Asset metadata',\n fields: [\n defineField({\n type: 'string',\n name: 'alt',\n title: 'Alternative text',\n }),\n defineField({\n type: 'number',\n name: 'duration',\n title: 'Duration',\n }),\n defineField({\n type: 'number',\n name: 'fileSize',\n title: 'File size',\n }),\n defineField({\n type: 'number',\n name: 'height',\n title: 'Height',\n }),\n defineField({\n type: 'number',\n name: 'width',\n title: 'Width',\n }),\n ],\n})\n","import {definePlugin, type ObjectDefinition} from 'sanity'\nimport {shopifyAssetSchema} from './schema/shopifyAssetSchema'\nimport {shopifyAssetPreviewSchema} from './schema/shopifyAssetPreviewSchema'\nimport {shopifyAssetMetadataSchema} from './schema/shopifyAssetMetadataSchema'\nimport type {PluginConfig} from './types'\n\nexport * from './types'\n\n// enables autocompletion and validation of document options\ndeclare module 'sanity' {\n export namespace Schema {\n // here we type up our custom schema definition\n export type ShopifyAssetTypeDef = Omit<ObjectDefinition, 'type' | 'fields'> & {\n type: 'shopify.asset'\n options: {\n shopifyDomain: string\n }\n }\n // Adds 'extension-type' as an intrinsic type\n export interface IntrinsicTypeDefinition {\n 'shopify.asset': ShopifyAssetTypeDef\n }\n }\n}\n\nexport const shopifyAssets = definePlugin<PluginConfig>((config) => {\n return {\n name: 'shopify-asset-schema',\n schema: {\n types: [shopifyAssetPreviewSchema, shopifyAssetMetadataSchema, shopifyAssetSchema(config)],\n },\n }\n})\n"],"names":["Root","styled","div","_ref","theme","sanity","color","card","enabled","bg2","_ref2","border","InfoLine","Card","_ref3","fg","bg","DurationLine","_ref4","VideoPlayer","_ref5","src","kind","videoNode","React","useRef","player","useEffect","current","videojs","sources","controls","stopPropagation","useCallback","event","className","diff","style","position","children","jsx","href","rel","onClick","ref","StyledBox","Box","_ref6","_ref7","_ref8","space","RenderAsset","_ref9","value","url","type","Flex","justify","alt","preview","maxWidth","height","display","maxHeight","AssetPreview","_ref0","filename","meta","fileSize","duration","jsxs","marginBottom","padding","radius","margin","Text","size","title","prettyBytes","default","prettyMilliseconds","colonNotation","secondsDecimalDigits","fetchSearch","props","projectId","dataset","shop","query","cursor","resultsPerPage","token","defer","axios","get","encodeURIComponent","withCredentials","method","headers","Authorization","pipe","map","result","data","fetchList","search","concat","withLatestFrom","debounceTime","distinctUntilChanged","switchMap","_ref1","q","c","DialogHeader","shopifyDomain","handleOpenInNewTab","window","open","align","opacity","tabIndex","right","Button","fontSize","icon","LaunchIcon","mode","text","extractName","name","split","pop","File","width","rootElm","handleClick","backgroundImage","Search","Stack","RESULTS_PER_PAGE","PHOTO_SPACING","PHOTO_PADDING","ShopifyAssetPicker","isOpen","onClose","onChange","schemaType","useProjectId","useDataset","client","useClient","apiVersion","config","error","setError","useState","setQuery","searchResults","setSearchResults","pageInfo","setPageInfo","isLoading","setIsLoading","searchSubject$","useMemo","BehaviorSubject","cursorSubject$","searchSubscription","subscribe","next","results","prevResults","assets","err","response","message","unsubscribe","handleSearchTermChanged","newQuery","currentTarget","handleScollerLoadMore","handleSelect","file","_key","_type","PatchEvent","from","set","renderFile","fileProps","photo","layout","handleWidth","Dialog","id","header","overflow","shadow","tone","gap","ErrorOutlineIcon","Inline","Fragment","weight","TextInput","label","placeholder","length","muted","InfiniteScroll","dataLength","hasMore","hasNextPage","scrollThreshold","loader","Spinner","endMessage","PhotoAlbum","spacing","targetRowHeight","photos","key","renderPhoto","componentsProps","containerProps","ShopifyIcon","viewBox","fill","xmlns","d","ShopifyAssetInput","readOnly","options","dialogOpen","setDialogOpen","removeValue","unset","onOpen","Grid","gridTemplateColumns","disabled","CloudinaryDiffPreview","_ref10","objectFit","charAt","toUpperCase","slice","AssetDiff","_ref11","DiffFromTo","previewComponent","shopifyAssetSchema","defineType","fields","defineField","components","input","select","prepare","_ref12","subtitle","shopifyAssetPreviewSchema","shopifyAssetMetadataSchema","shopifyAssets","definePlugin","schema","types"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-shopify-assets",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "Choose assets from your Shopify store in your Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
@@ -92,7 +92,7 @@
92
92
  },
93
93
  "peerDependencies": {
94
94
  "react": "^18.3 || ^19",
95
- "sanity": "^3 || ^4.0.0-0",
95
+ "sanity": "^3 || ^4.0.0-0 || ^5.0.0",
96
96
  "styled-components": "^6"
97
97
  },
98
98
  "engines": {
@@ -11,7 +11,7 @@ const DialogHeader = (props: Props) => {
11
11
  const {title, shopifyDomain} = props
12
12
 
13
13
  const handleOpenInNewTab = useCallback(() => {
14
- window.open(`https://${shopifyDomain}/admin/settings/files`, '_blank')
14
+ window.open(`https://${shopifyDomain}/admin/content/files`, '_blank')
15
15
  }, [shopifyDomain])
16
16
 
17
17
  return (
@@ -1,7 +1,7 @@
1
1
  import {BehaviorSubject, Subscription} from 'rxjs'
2
2
  import {ErrorOutlineIcon} from '@sanity/icons'
3
3
  import {Card, Dialog, Flex, Inline, Spinner, Stack, Text, TextInput} from '@sanity/ui'
4
- import {PatchEvent, set, useProjectId, ObjectInputProps, useDataset} from 'sanity'
4
+ import {PatchEvent, set, useProjectId, ObjectInputProps, useDataset, useClient} from 'sanity'
5
5
  import React, {useCallback, useEffect, useMemo, useState} from 'react'
6
6
  import PhotoAlbum from 'react-photo-album'
7
7
  import InfiniteScroll from 'react-infinite-scroll-component'
@@ -26,6 +26,8 @@ export default function ShopifyAssetPicker(props: AssetPickerProps) {
26
26
  const {isOpen, onClose, shopifyDomain, onChange, schemaType, value} = props
27
27
  const projectId = useProjectId()
28
28
  const dataset = useDataset()
29
+ const client = useClient({apiVersion: '2021-06-07'})
30
+ const token = client.config().token
29
31
 
30
32
  const [error, setError] = useState('')
31
33
  const [query, setQuery] = useState('')
@@ -48,6 +50,7 @@ export default function ShopifyAssetPicker(props: AssetPickerProps) {
48
50
  query: searchSubject$,
49
51
  cursor: cursorSubject$,
50
52
  resultsPerPage: RESULTS_PER_PAGE,
53
+ token,
51
54
  }).subscribe({
52
55
  next: (results: ShopifyAPIResponse) => {
53
56
  setSearchResults((prevResults) => [...prevResults, ...results.assets])
@@ -57,14 +60,14 @@ export default function ShopifyAssetPicker(props: AssetPickerProps) {
57
60
  error: (err) => {
58
61
  setError(
59
62
  `${
60
- err.response.data.message || err.message || 'An error occurred'
63
+ err.response?.data?.message || err.message || 'An error occurred'
61
64
  } - check plugin configuration`
62
65
  )
63
66
  },
64
67
  })
65
68
 
66
69
  return () => searchSubscription.unsubscribe()
67
- }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset])
70
+ }, [searchSubject$, cursorSubject$, shopifyDomain, projectId, dataset, token])
68
71
 
69
72
  const handleSearchTermChanged = useCallback(
70
73
  (event: React.ChangeEvent<HTMLInputElement>) => {
@@ -13,6 +13,7 @@ interface fetchProps {
13
13
  query: SearchSubject
14
14
  cursor: CursorSubject
15
15
  resultsPerPage: number
16
+ token?: string
16
17
  }
17
18
 
18
19
  interface searchProps extends Omit<fetchProps, 'query' | 'cursor'> {
@@ -24,7 +25,7 @@ interface listProps extends Omit<fetchProps, 'query' | 'cursor'> {
24
25
  }
25
26
 
26
27
  const fetchSearch = (props: searchProps): Observable<any> => {
27
- const {projectId, dataset, shop, query, cursor, resultsPerPage} = props
28
+ const {projectId, dataset, shop, query, cursor, resultsPerPage, token} = props
28
29
 
29
30
  return defer(() => {
30
31
  return axios.get(
@@ -34,13 +35,18 @@ const fetchSearch = (props: searchProps): Observable<any> => {
34
35
  {
35
36
  withCredentials: true,
36
37
  method: 'GET',
38
+ headers: token
39
+ ? {
40
+ Authorization: `Bearer ${token}`,
41
+ }
42
+ : {},
37
43
  }
38
44
  )
39
45
  }).pipe(map((result) => result.data))
40
46
  }
41
47
 
42
48
  const fetchList = (props: listProps): Observable<any> => {
43
- const {projectId, dataset, shop, cursor, resultsPerPage} = props
49
+ const {projectId, dataset, shop, cursor, resultsPerPage, token} = props
44
50
 
45
51
  return defer(() =>
46
52
  axios.get(
@@ -50,13 +56,18 @@ const fetchList = (props: listProps): Observable<any> => {
50
56
  {
51
57
  withCredentials: true,
52
58
  method: 'GET',
59
+ headers: token
60
+ ? {
61
+ Authorization: `Bearer ${token}`,
62
+ }
63
+ : {},
53
64
  }
54
65
  )
55
66
  ).pipe(map((result) => result.data))
56
67
  }
57
68
 
58
69
  export const search = (props: fetchProps): Observable<any> => {
59
- const {projectId, dataset, shop, query, cursor, resultsPerPage} = props
70
+ const {projectId, dataset, shop, query, cursor, resultsPerPage, token} = props
60
71
 
61
72
  return concat(
62
73
  query.pipe(
@@ -65,11 +76,17 @@ export const search = (props: fetchProps): Observable<any> => {
65
76
  distinctUntilChanged(),
66
77
  switchMap(([q, c]) => {
67
78
  if (q) {
68
- return fetchSearch({projectId, dataset, shop, query: q, cursor: c, resultsPerPage}).pipe(
69
- distinctUntilChanged()
70
- )
79
+ return fetchSearch({
80
+ projectId,
81
+ dataset,
82
+ shop,
83
+ query: q,
84
+ cursor: c,
85
+ resultsPerPage,
86
+ token,
87
+ }).pipe(distinctUntilChanged())
71
88
  }
72
- return fetchList({projectId, dataset, shop, cursor: c, resultsPerPage})
89
+ return fetchList({projectId, dataset, shop, cursor: c, resultsPerPage, token})
73
90
  })
74
91
  )
75
92
  )