sanity-plugin-dashboard-widget-netlify

3.0.183.0.19
~

Modified (2 files)

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "sanity-plugin-dashboard-widget-netlify",
-  "version": "3.0.18",
+  "version": "3.0.19",
   "description": "Sanity Studio Dashboard Widget for triggering Netlify builds",
   "keywords": [
     "dashboard",
     "netlify",
@@ -29,29 +29,29 @@
     ".": "./dist/index.js",
     "./package.json": "./package.json"
   },
   "dependencies": {
-    "@sanity/ui": "^4.0.4"
+    "@sanity/ui": "^4.2.7"
   },
   "devDependencies": {
+    "@sanity/dashboard": "6.0.19",
     "@sanity/tsconfig": "^2.2.1",
-    "@sanity/tsdown-config": "^0.26.0",
-    "@types/react": "^19.2.18",
-    "@types/react-dom": "^19.2.4",
-    "oxc-transform-react": "^0.145.0",
-    "react": "^19.2.8",
-    "react-dom": "^19.2.8",
-    "sanity": "^6.10.1",
+    "@sanity/tsdown-config": "^0.27.1",
+    "@types/react": "^19.3.0",
+    "@types/react-dom": "^19.3.0",
+    "oxc-transform-react": "^0.147.0",
+    "react": "^19.3.0",
+    "react-dom": "^19.3.0",
+    "sanity": "^6.16.0",
     "styled-components": "^6.5.3",
-    "tsdown": "^0.22.14",
-    "@sanity/dashboard": "6.0.18"
+    "tsdown": "^0.22.14"
   },
   "peerDependencies": {
+    "@sanity/dashboard": "^6.0.19",
     "react": "^19.2",
     "react-dom": "^19.2",
     "sanity": "^5 || ^6.0.0-0",
-    "styled-components": "^6.1",
-    "@sanity/dashboard": "^6.0.18"
+    "styled-components": "^6.1"
   },
   "engines": {
     "node": ">=20.19 <22 || >=22.12"
   },
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["<span>\n      <a href={url} target=\"_blank\" rel=\"noreferrer\">\n        {children}\n      </a>\n    </span>","<Link url={url}>view</Link>","<Link url={adminUrl}>admin</Link>","<span>\n        (<Link url={url}>view</Link>, <Link url={adminUrl}>admin</Link>)\n      </span>","<Link url={url}>(view)</Link>","<Link url={adminUrl}>(admin)</Link>","() => getImageUrl(siteId, branchName)","() => setSrc(getImageUrl(siteId, branchName))","useCallback(() => setSrc(getImageUrl(siteId, branchName)), [siteId, branchName])","() => {\n    const interval = window.setInterval(update, IMAGE_PULL_INTERVAL)\n    return () => window.clearInterval(interval)\n  }","[update]","[src, update]","() => () => window.clearTimeout(timeoutRef.current)","[]","() => {\n    onDeploy(site)\n    timeoutRef.current = window.setTimeout(updateBadge, 1000)\n  }","useCallback(() => {\n    onDeploy(site)\n    timeoutRef.current = window.setTimeout(updateBadge, 1000)\n  }, [site, onDeploy, updateBadge])","() => {\n    setHasBadgeError(true)\n  }","<Links url={url} adminUrl={adminUrl} />","<Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>","title || name","!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />","hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )","<Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>","<Box flex={1} paddingY={2} paddingX={3}>\n        <Stack gap={2}>\n          <Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>\n\n          <Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>\n        </Stack>\n      </Box>","buildHookId ? (\n        <Box paddingY={2} paddingX={3}>\n          <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n        </Box>\n      ) : null","<Flex as=\"li\">\n      <Box flex={1} paddingY={2} paddingX={3}>\n        <Stack gap={2}>\n          <Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>\n\n          <Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>\n        </Stack>\n      </Box>\n\n      {buildHookId ? (\n        <Box paddingY={2} paddingX={3}>\n          <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n        </Box>\n      ) : null}\n    </Flex>","<Spinner muted />","<Card padding={4}>\n        <Flex direction=\"column\" justify=\"center\" align=\"center\">\n          <Spinner muted />\n          <Box marginTop={3}>\n            <Text muted>Loading sites…</Text>\n          </Box>\n        </Flex>\n      </Card>","<Card tone=\"critical\" padding={3}>\n        <Text>No sites are defined in the widget options. Please check your config.</Text>\n      </Card>","sites.map((site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        })","(site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        }","<Box paddingY={2}>\n      <Stack as=\"ul\" gap={2}>\n        {sites.map((site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        })}\n      </Stack>\n    </Box>","<Flex direction=\"column\" align=\"stretch\">\n      <Button\n        as=\"a\"\n        href={isLoading ? undefined : netlifySitesUrl}\n        paddingX={2}\n        paddingY={4}\n        mode=\"bleed\"\n        tone=\"primary\"\n        text=\"Manage sites at Netlify\"\n        loading={isLoading}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      />\n    </Flex>","isLoading ? undefined : netlifySitesUrl","description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )","<SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />","<ContentCard paddingY={1}>\n        {description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )}\n        <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n      </ContentCard>","<DashboardWidgetContainer header={title} footer={footer}>\n      <ContentCard paddingY={1}>\n        {description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )}\n        <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n      </ContentCard>\n    </DashboardWidgetContainer>","options.sites || []","sites","(options.sites || []).map(toSite)","<NetlifyWidget\n      title={options.title || DEFAULT_TITLE}\n      description={options.description}\n      sites={sites}\n      isLoading={false}\n      onDeploy={deploy}\n    />","description","options.title || DEFAULT_TITLE"],"sources":["../src/components/SiteItem/Links.tsx","../src/components/SiteItem/index.tsx","../src/components/SiteList.tsx","../src/components/NetlifyWidget.tsx","../src/widget.tsx","../src/plugin.tsx"],"sourcesContent":["import type {FunctionComponent, PropsWithChildren} from 'react'\n\nconst Link = (props: PropsWithChildren<{url: string}>) => {\n  const {url, children} = props\n\n  return (\n    <span>\n      <a href={url} target=\"_blank\" rel=\"noreferrer\">\n        {children}\n      </a>\n    </span>\n  )\n}\n\ntype Props = {\n  url?: string\n  adminUrl?: string\n}\n\nconst Links: FunctionComponent<Props> = (props) => {\n  const {url, adminUrl} = props\n\n  if (url && adminUrl) {\n    return (\n      <span>\n        (<Link url={url}>view</Link>, <Link url={adminUrl}>admin</Link>)\n      </span>\n    )\n  }\n\n  if (url) {\n    return <Link url={url}>(view)</Link>\n  }\n  if (adminUrl) {\n    return <Link url={adminUrl}>(admin)</Link>\n  }\n  return null\n}\n\nexport default Links\n","import {Button, Flex, Box, Card, Text, Stack, Label} from '@sanity/ui'\nimport {type FunctionComponent, useCallback, useEffect, useRef, useState} from 'react'\n\nimport {type DeployAction, type Site} from '../../types'\nimport Links from './Links'\n\ninterface Props {\n  site: Site\n  onDeploy: DeployAction\n}\n\nconst IMAGE_PULL_INTERVAL = 10000\n\nconst getImageUrl = (siteId: string, branchName?: string) => {\n  const baseUrl = `https://api.netlify.com/api/v1/badges/${siteId}/deploy-status`\n  const time = new Date().getTime()\n  const branch = `branch=${branchName}`\n\n  return branchName ? `${baseUrl}?${time}&${branch}` : `${baseUrl}?${time}`\n}\n\nconst useBadgeImage = (siteId: string, branchName?: string) => {\n  const [src, setSrc] = useState(() => getImageUrl(siteId, branchName))\n  const update = useCallback(() => setSrc(getImageUrl(siteId, branchName)), [siteId, branchName])\n\n  useEffect(() => {\n    const interval = window.setInterval(update, IMAGE_PULL_INTERVAL)\n    return () => window.clearInterval(interval)\n  }, [update])\n\n  return [src, update] as const\n}\n\nconst useDeploy = (site: Site, onDeploy: DeployAction, updateBadge: () => void) => {\n  const timeoutRef = useRef(-1)\n  useEffect(() => () => window.clearTimeout(timeoutRef.current), [])\n\n  return useCallback(() => {\n    onDeploy(site)\n    timeoutRef.current = window.setTimeout(updateBadge, 1000)\n  }, [site, onDeploy, updateBadge])\n}\n\nconst SiteItem: FunctionComponent<Props> = (props) => {\n  const [hasBadgeError, setHasBadgeError] = useState(false)\n  const {site, onDeploy} = props\n  const {id, name, title, url, adminUrl, buildHookId, branch} = site\n\n  const [badge, updateBadge] = useBadgeImage(id, branch)\n  const handleDeploy = useDeploy(site, onDeploy, updateBadge)\n  const handleBadgeError = () => {\n    setHasBadgeError(true)\n  }\n\n  return (\n    <Flex as=\"li\">\n      <Box flex={1} paddingY={2} paddingX={3}>\n        <Stack gap={2}>\n          <Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>\n\n          <Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>\n        </Stack>\n      </Box>\n\n      {buildHookId ? (\n        <Box paddingY={2} paddingX={3}>\n          <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n        </Box>\n      ) : null}\n    </Flex>\n  )\n}\n\nexport default SiteItem\n","import {Flex, Box, Card, Text, Spinner, Stack} from '@sanity/ui'\n\nimport {type DeployAction, type Site} from '../types'\nimport SiteItem from './SiteItem'\n\ninterface Props {\n  isLoading: boolean\n  sites?: Site[]\n  onDeploy: DeployAction\n}\n\nexport default function SiteList(props: Props) {\n  const {isLoading, onDeploy, sites} = props\n  if (isLoading) {\n    return (\n      <Card padding={4}>\n        <Flex direction=\"column\" justify=\"center\" align=\"center\">\n          <Spinner muted />\n          <Box marginTop={3}>\n            <Text muted>Loading sites…</Text>\n          </Box>\n        </Flex>\n      </Card>\n    )\n  }\n  if (!sites || (sites && sites.length === 0)) {\n    return (\n      <Card tone=\"critical\" padding={3}>\n        <Text>No sites are defined in the widget options. Please check your config.</Text>\n      </Card>\n    )\n  }\n  return (\n    <Box paddingY={2}>\n      <Stack as=\"ul\" gap={2}>\n        {sites.map((site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        })}\n      </Stack>\n    </Box>\n  )\n}\n","import {DashboardWidgetContainer} from '@sanity/dashboard'\nimport {Button, Flex, Card, Text, Box} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {type NetlifyWidgetProps} from '../types'\nimport SiteList from './SiteList'\n\nconst ContentCard = styled(Card)`\n  min-height: 66px;\n`\n\nexport default function NetlifyWidget(props: NetlifyWidgetProps) {\n  const netlifySitesUrl = 'https://app.netlify.com/account/sites'\n  const {title, description, isLoading, sites, onDeploy} = props\n\n  const footer = (\n    <Flex direction=\"column\" align=\"stretch\">\n      <Button\n        as=\"a\"\n        href={isLoading ? undefined : netlifySitesUrl}\n        paddingX={2}\n        paddingY={4}\n        mode=\"bleed\"\n        tone=\"primary\"\n        text=\"Manage sites at Netlify\"\n        loading={isLoading}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      />\n    </Flex>\n  )\n\n  return (\n    <DashboardWidgetContainer header={title} footer={footer}>\n      <ContentCard paddingY={1}>\n        {description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )}\n        <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n      </ContentCard>\n    </DashboardWidgetContainer>\n  )\n}\n","import type {ReactNode} from 'react'\n\nimport NetlifyWidget from './components/NetlifyWidget'\nimport type {Site, SiteWidgetOption, WidgetOptions} from './types'\n\nconst DEFAULT_TITLE = 'Netlify sites'\n\nfunction toSite(option: SiteWidgetOption): Site {\n  const {apiId, name, title, buildHookId, url, branch} = option\n\n  return {\n    id: apiId,\n    name,\n    title,\n    buildHookId,\n    url:\n      url ||\n      (branch && name ? `https://${branch}--${name}.netlify.app/` : undefined) ||\n      (name ? `https://${name}.netlify.app/` : undefined),\n    adminUrl: name ? `https://app.netlify.com/sites/${name}` : undefined,\n    branch,\n  }\n}\n\nfunction deploy(site: Site): void {\n  if (!site.buildHookId) {\n    return\n  }\n\n  fetch(`https://api.netlify.com/build_hooks/${site.buildHookId}`, {method: 'POST'}).catch(() => {\n    // Build hook failures are intentionally ignored; the deploy badge will\n    // keep reflecting the actual deploy status of the site.\n  })\n}\n\nexport default function Widget(options: WidgetOptions): ReactNode {\n  const sites = (options.sites || []).map(toSite)\n\n  return (\n    <NetlifyWidget\n      title={options.title || DEFAULT_TITLE}\n      description={options.description}\n      sites={sites}\n      isLoading={false}\n      onDeploy={deploy}\n    />\n  )\n}\n","import {type DashboardWidget, type LayoutConfig} from '@sanity/dashboard'\n\nimport {type WidgetOptions} from './types'\nimport Widget from './widget'\n\nexport type NetlifyWidgetConfig = WidgetOptions & {layout?: LayoutConfig}\n\nexport function netlifyWidget(config: NetlifyWidgetConfig): DashboardWidget {\n  return {\n    name: 'netlify-widget',\n    component: () => {\n      return <Widget {...config} />\n    },\n    layout: config.layout ?? {width: 'medium'},\n  }\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["<span>\n      <a href={url} target=\"_blank\" rel=\"noreferrer\">\n        {children}\n      </a>\n    </span>","<Link url={url}>view</Link>","<Link url={adminUrl}>admin</Link>","<span>\n        (<Link url={url}>view</Link>, <Link url={adminUrl}>admin</Link>)\n      </span>","<Link url={url}>(view)</Link>","<Link url={adminUrl}>(admin)</Link>","_c","() => getImageUrl(siteId, branchName)","() => setSrc(getImageUrl(siteId, branchName))","useCallback(() => setSrc(getImageUrl(siteId, branchName)), [siteId, branchName])","() => {\n    const interval = window.setInterval(update, IMAGE_PULL_INTERVAL)\n    return () => window.clearInterval(interval)\n  }","[update]","[src, update]","() => () => window.clearTimeout(timeoutRef.current)","[]","() => {\n    onDeploy(site)\n    timeoutRef.current = window.setTimeout(updateBadge, 1000)\n  }","useCallback(() => {\n    onDeploy(site)\n    timeoutRef.current = window.setTimeout(updateBadge, 1000)\n  }, [site, onDeploy, updateBadge])","() => {\n    setHasBadgeError(true)\n  }","<Links url={url} adminUrl={adminUrl} />","<Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>","title || name","!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />","hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )","<Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>","<Box flex={1} paddingY={2} paddingX={3}>\n        <Stack gap={2}>\n          <Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>\n\n          <Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>\n        </Stack>\n      </Box>","buildHookId ? (\n        <Box paddingY={2} paddingX={3}>\n          <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n        </Box>\n      ) : null","<Flex as=\"li\">\n      <Box flex={1} paddingY={2} paddingX={3}>\n        <Stack gap={2}>\n          <Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>\n\n          <Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>\n        </Stack>\n      </Box>\n\n      {buildHookId ? (\n        <Box paddingY={2} paddingX={3}>\n          <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n        </Box>\n      ) : null}\n    </Flex>","_c","<Spinner muted />","<Card padding={4}>\n        <Flex direction=\"column\" justify=\"center\" align=\"center\">\n          <Spinner muted />\n          <Box marginTop={3}>\n            <Text muted>Loading sites…</Text>\n          </Box>\n        </Flex>\n      </Card>","<Card tone=\"critical\" padding={3}>\n        <Text>No sites are defined in the widget options. Please check your config.</Text>\n      </Card>","sites.map((site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        })","(site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        }","<Box paddingY={2}>\n      <Stack as=\"ul\" gap={2}>\n        {sites.map((site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        })}\n      </Stack>\n    </Box>","_c","<Flex direction=\"column\" align=\"stretch\">\n      <Button\n        as=\"a\"\n        href={isLoading ? undefined : netlifySitesUrl}\n        paddingX={2}\n        paddingY={4}\n        mode=\"bleed\"\n        tone=\"primary\"\n        text=\"Manage sites at Netlify\"\n        loading={isLoading}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      />\n    </Flex>","isLoading ? undefined : netlifySitesUrl","description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )","<SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />","<ContentCard paddingY={1}>\n        {description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )}\n        <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n      </ContentCard>","<DashboardWidgetContainer header={title} footer={footer}>\n      <ContentCard paddingY={1}>\n        {description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )}\n        <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n      </ContentCard>\n    </DashboardWidgetContainer>","_c","options.sites || []","sites","(options.sites || []).map(toSite)","<NetlifyWidget\n      title={options.title || DEFAULT_TITLE}\n      description={options.description}\n      sites={sites}\n      isLoading={false}\n      onDeploy={deploy}\n    />","description","options.title || DEFAULT_TITLE","_c"],"sources":["../src/components/SiteItem/Links.tsx","../src/components/SiteItem/index.tsx","../src/components/SiteList.tsx","../src/components/NetlifyWidget.tsx","../src/widget.tsx","../src/plugin.tsx"],"sourcesContent":["import type {FunctionComponent, PropsWithChildren} from 'react'\n\nconst Link = (props: PropsWithChildren<{url: string}>) => {\n  const {url, children} = props\n\n  return (\n    <span>\n      <a href={url} target=\"_blank\" rel=\"noreferrer\">\n        {children}\n      </a>\n    </span>\n  )\n}\n\ntype Props = {\n  url?: string\n  adminUrl?: string\n}\n\nconst Links: FunctionComponent<Props> = (props) => {\n  const {url, adminUrl} = props\n\n  if (url && adminUrl) {\n    return (\n      <span>\n        (<Link url={url}>view</Link>, <Link url={adminUrl}>admin</Link>)\n      </span>\n    )\n  }\n\n  if (url) {\n    return <Link url={url}>(view)</Link>\n  }\n  if (adminUrl) {\n    return <Link url={adminUrl}>(admin)</Link>\n  }\n  return null\n}\n\nexport default Links\n","import {Button, Flex, Box, Card, Text, Stack, Label} from '@sanity/ui'\nimport {type FunctionComponent, useCallback, useEffect, useRef, useState} from 'react'\n\nimport {type DeployAction, type Site} from '../../types'\nimport Links from './Links'\n\ninterface Props {\n  site: Site\n  onDeploy: DeployAction\n}\n\nconst IMAGE_PULL_INTERVAL = 10000\n\nconst getImageUrl = (siteId: string, branchName?: string) => {\n  const baseUrl = `https://api.netlify.com/api/v1/badges/${siteId}/deploy-status`\n  const time = new Date().getTime()\n  const branch = `branch=${branchName}`\n\n  return branchName ? `${baseUrl}?${time}&${branch}` : `${baseUrl}?${time}`\n}\n\nconst useBadgeImage = (siteId: string, branchName?: string) => {\n  const [src, setSrc] = useState(() => getImageUrl(siteId, branchName))\n  const update = useCallback(() => setSrc(getImageUrl(siteId, branchName)), [siteId, branchName])\n\n  useEffect(() => {\n    const interval = window.setInterval(update, IMAGE_PULL_INTERVAL)\n    return () => window.clearInterval(interval)\n  }, [update])\n\n  return [src, update] as const\n}\n\nconst useDeploy = (site: Site, onDeploy: DeployAction, updateBadge: () => void) => {\n  const timeoutRef = useRef(-1)\n  useEffect(() => () => window.clearTimeout(timeoutRef.current), [])\n\n  return useCallback(() => {\n    onDeploy(site)\n    timeoutRef.current = window.setTimeout(updateBadge, 1000)\n  }, [site, onDeploy, updateBadge])\n}\n\nconst SiteItem: FunctionComponent<Props> = (props) => {\n  const [hasBadgeError, setHasBadgeError] = useState(false)\n  const {site, onDeploy} = props\n  const {id, name, title, url, adminUrl, buildHookId, branch} = site\n\n  const [badge, updateBadge] = useBadgeImage(id, branch)\n  const handleDeploy = useDeploy(site, onDeploy, updateBadge)\n  const handleBadgeError = () => {\n    setHasBadgeError(true)\n  }\n\n  return (\n    <Flex as=\"li\">\n      <Box flex={1} paddingY={2} paddingX={3}>\n        <Stack gap={2}>\n          <Text as=\"h4\">\n            {title || name}\n            <Links url={url} adminUrl={adminUrl} />\n          </Text>\n\n          <Flex justify=\"flex-start\">\n            {!hasBadgeError && <img src={badge} onError={handleBadgeError} alt=\"Badge\" />}\n            {hasBadgeError && (\n              <Card tone=\"critical\" radius={2} padding={2}>\n                <Label size={0} muted>\n                  Failed to load badge\n                </Label>\n              </Card>\n            )}\n          </Flex>\n        </Stack>\n      </Box>\n\n      {buildHookId ? (\n        <Box paddingY={2} paddingX={3}>\n          <Button mode=\"ghost\" onClick={handleDeploy} text=\"Deploy\" />\n        </Box>\n      ) : null}\n    </Flex>\n  )\n}\n\nexport default SiteItem\n","import {Flex, Box, Card, Text, Spinner, Stack} from '@sanity/ui'\n\nimport {type DeployAction, type Site} from '../types'\nimport SiteItem from './SiteItem'\n\ninterface Props {\n  isLoading: boolean\n  sites?: Site[]\n  onDeploy: DeployAction\n}\n\nexport default function SiteList(props: Props) {\n  const {isLoading, onDeploy, sites} = props\n  if (isLoading) {\n    return (\n      <Card padding={4}>\n        <Flex direction=\"column\" justify=\"center\" align=\"center\">\n          <Spinner muted />\n          <Box marginTop={3}>\n            <Text muted>Loading sites…</Text>\n          </Box>\n        </Flex>\n      </Card>\n    )\n  }\n  if (!sites || (sites && sites.length === 0)) {\n    return (\n      <Card tone=\"critical\" padding={3}>\n        <Text>No sites are defined in the widget options. Please check your config.</Text>\n      </Card>\n    )\n  }\n  return (\n    <Box paddingY={2}>\n      <Stack as=\"ul\" gap={2}>\n        {sites.map((site) => {\n          return <SiteItem onDeploy={onDeploy} site={site} key={site.id} />\n        })}\n      </Stack>\n    </Box>\n  )\n}\n","import {DashboardWidgetContainer} from '@sanity/dashboard'\nimport {Button, Flex, Card, Text, Box} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nimport {type NetlifyWidgetProps} from '../types'\nimport SiteList from './SiteList'\n\nconst ContentCard = styled(Card)`\n  min-height: 66px;\n`\n\nexport default function NetlifyWidget(props: NetlifyWidgetProps) {\n  const netlifySitesUrl = 'https://app.netlify.com/account/sites'\n  const {title, description, isLoading, sites, onDeploy} = props\n\n  const footer = (\n    <Flex direction=\"column\" align=\"stretch\">\n      <Button\n        as=\"a\"\n        href={isLoading ? undefined : netlifySitesUrl}\n        paddingX={2}\n        paddingY={4}\n        mode=\"bleed\"\n        tone=\"primary\"\n        text=\"Manage sites at Netlify\"\n        loading={isLoading}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      />\n    </Flex>\n  )\n\n  return (\n    <DashboardWidgetContainer header={title} footer={footer}>\n      <ContentCard paddingY={1}>\n        {description && (\n          <Box paddingY={3} paddingX={3}>\n            <Text as=\"p\" size={1} muted>\n              <span dangerouslySetInnerHTML={{__html: description}} />\n            </Text>\n          </Box>\n        )}\n        <SiteList isLoading={isLoading} onDeploy={onDeploy} sites={sites} />\n      </ContentCard>\n    </DashboardWidgetContainer>\n  )\n}\n","import type {ReactNode} from 'react'\n\nimport NetlifyWidget from './components/NetlifyWidget'\nimport type {Site, SiteWidgetOption, WidgetOptions} from './types'\n\nconst DEFAULT_TITLE = 'Netlify sites'\n\nfunction toSite(option: SiteWidgetOption): Site {\n  const {apiId, name, title, buildHookId, url, branch} = option\n\n  return {\n    id: apiId,\n    name,\n    title,\n    buildHookId,\n    url:\n      url ||\n      (branch && name ? `https://${branch}--${name}.netlify.app/` : undefined) ||\n      (name ? `https://${name}.netlify.app/` : undefined),\n    adminUrl: name ? `https://app.netlify.com/sites/${name}` : undefined,\n    branch,\n  }\n}\n\nfunction deploy(site: Site): void {\n  if (!site.buildHookId) {\n    return\n  }\n\n  fetch(`https://api.netlify.com/build_hooks/${site.buildHookId}`, {method: 'POST'}).catch(() => {\n    // Build hook failures are intentionally ignored; the deploy badge will\n    // keep reflecting the actual deploy status of the site.\n  })\n}\n\nexport default function Widget(options: WidgetOptions): ReactNode {\n  const sites = (options.sites || []).map(toSite)\n\n  return (\n    <NetlifyWidget\n      title={options.title || DEFAULT_TITLE}\n      description={options.description}\n      sites={sites}\n      isLoading={false}\n      onDeploy={deploy}\n    />\n  )\n}\n","import {type DashboardWidget, type LayoutConfig} from '@sanity/dashboard'\n\nimport {type WidgetOptions} from './types'\nimport Widget from './widget'\n\nexport type NetlifyWidgetConfig = WidgetOptions & {layout?: LayoutConfig}\n\nexport function netlifyWidget(config: NetlifyWidgetConfig): DashboardWidget {\n  return {\n    name: 'netlify-widget',\n    component: () => {\n      return <Widget {...config} />\n    },\n    layout: config.layout ?? {width: 'medium'},\n  }\n}\n"],"mappings":"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"}
\ No newline at end of file