{"version":3,"sources":["../../../src/lib/pipes.tsx"],"sourcesContent":["\"use client\";\nimport { Callout, Card, Flex, Text } from \"@radix-ui/themes\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport * as CardList from \"./card-list.js\";\nimport { DataIntegrationIcon } from \"./data-integration-icon.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport {\n  DotsHorizontalIcon,\n  ExternalLinkIcon,\n  GlobeIcon,\n  LockClosedIcon,\n} from \"@radix-ui/react-icons\";\nimport {\n  AlertDialog,\n  Button,\n  Dialog,\n  DropdownMenu,\n  IconButton,\n  Skeleton,\n} from \"./elements.js\";\nimport { IconPanel } from \"./icon-panel.js\";\nimport { Status } from \"./status.js\";\nimport {\n  DataIntegration,\n  useDeleteDataInstallation,\n  useGetDataIntegrationAuthorizeUrlHook,\n  getMyDataIntegrationsQueryKey,\n  useSettings,\n} from \"../api/endpoint.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { GenericError } from \"./generic-error.js\";\nimport { getDomProps, WidgetRootDomProps, WidgetRootState } from \"./utils.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface PipesProps extends WidgetRootDomProps {\n  integrations: DataIntegration[];\n}\n\nconst HANDOFF_INTERVAL_MS = 100;\nconst HANDOFF_MAX_ATTEMPTS = 100; // 10 seconds worth of attempts\n\nconst useOpenDataIntegrationAuthorizeUrl = (integration: DataIntegration) => {\n  const getDataIntegrationAuthorizeUrl =\n    useGetDataIntegrationAuthorizeUrlHook();\n  const settings = useSettings();\n  const baseUrl = settings.data?.authkitOrigin ?? \"\";\n  const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(\n    undefined,\n  );\n  const messageHandlerRef = useRef<((event: MessageEvent) => void) | undefined>(\n    undefined,\n  );\n\n  useEffect(() => {\n    return () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n      if (messageHandlerRef.current) {\n        window.removeEventListener(\"message\", messageHandlerRef.current);\n      }\n    };\n  }, []);\n\n  return useCallback(async () => {\n    // Clear any existing interval from a previous invocation\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n      intervalRef.current = undefined;\n    }\n    // Remove any existing message handler\n    if (messageHandlerRef.current) {\n      window.removeEventListener(\"message\", messageHandlerRef.current);\n      messageHandlerRef.current = undefined;\n    }\n\n    // need to do this synchronously in the event handler to avoid popup blocker notifications\n    const win = window.open(`${baseUrl}/pipes/redirecting`, \"_blank\");\n\n    // caller will catch\n    const { url, handoffToken, redirectToken } =\n      await getDataIntegrationAuthorizeUrl(integration.slug, {\n        requireHandoff: true,\n      });\n    if (win) {\n      win.location = url;\n      const parsedUrl = new URL(url);\n      const payload = { handoffToken, redirectToken };\n\n      const cleanup = () => {\n        if (intervalRef.current) {\n          clearInterval(intervalRef.current);\n          intervalRef.current = undefined;\n        }\n        if (messageHandlerRef.current) {\n          window.removeEventListener(\"message\", messageHandlerRef.current);\n          messageHandlerRef.current = undefined;\n        }\n      };\n\n      messageHandlerRef.current = (event: MessageEvent) => {\n        if (\n          event.origin === parsedUrl.origin &&\n          event.data?.redirectToken === redirectToken\n        ) {\n          cleanup();\n        }\n      };\n      window.addEventListener(\"message\", messageHandlerRef.current);\n\n      let attempts = 0;\n      intervalRef.current = setInterval(() => {\n        attempts += 1;\n\n        if (attempts >= HANDOFF_MAX_ATTEMPTS) {\n          cleanup();\n          return;\n        }\n\n        if (win && !win.closed) {\n          win.postMessage(payload, parsedUrl.origin);\n        } else {\n          cleanup();\n        }\n      }, HANDOFF_INTERVAL_MS);\n    }\n  }, [getDataIntegrationAuthorizeUrl, integration.slug, baseUrl]);\n};\n\nfunction ConnectIntegrationButton({\n  integration,\n}: {\n  integration: DataIntegration;\n}) {\n  const eventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n\n  return (\n    <Button\n      variant=\"secondary\"\n      onClick={async () => {\n        try {\n          await eventHandler();\n        } catch {\n          // pass - error displayed in new tab\n        }\n      }}\n    >\n      <Translation\n        defaultMessage=\"Connect\"\n        id=\"quvdFp\"\n        description=\"Button to connect an integration\"\n      />\n    </Button>\n  );\n}\n\nfunction SharedCredentialsConnectIntegrationButton({\n  integration,\n}: {\n  integration: DataIntegration;\n}) {\n  const settings = useSettings();\n  const [open, setOpen] = useState(false);\n  const eventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n\n  const logo = settings.data?.logoDarkPath ?? settings.data?.logoLightPath;\n  const appName = settings.data?.teamName ?? \"This application\";\n\n  return (\n    <>\n      <Dialog.Root open={open} onOpenChange={setOpen}>\n        <Dialog.Content maxWidth=\"430px\">\n          <Flex justify=\"center\" align=\"center\" gap=\"2\" mt=\"2\">\n            {logo && (\n              <>\n                <IconPanel\n                  color=\"panel\"\n                  style={{ width: \"48px\", height: \"48px\" }}\n                >\n                  <ProviderIcon\n                    size=\"2\"\n                    provider=\"workos\"\n                    style={{ backgroundImage: `url(${logo})` }}\n                  />\n                </IconPanel>\n                <DotsHorizontalIcon />\n              </>\n            )}\n            <IconPanel\n              color=\"panel\"\n              style={{\n                ...(logo ? { borderWidth: 0 } : undefined),\n                width: \"48px\",\n                height: \"48px\",\n              }}\n            >\n              <ProviderIcon size=\"2\" provider=\"workos\" />\n            </IconPanel>\n            <DotsHorizontalIcon />\n            <IconPanel color=\"panel\" style={{ width: \"48px\", height: \"48px\" }}>\n              <DataIntegrationIcon size=\"2\" integration={integration} />\n            </IconPanel>\n          </Flex>\n          <Dialog.Title size=\"2\" mt=\"5\" mb=\"5\" weight={\"bold\"} align=\"center\">\n            <Translation\n              defaultMessage=\"{appName} uses WorkOS to connect to {integrationName}.\"\n              id=\"ujRDBH\"\n              description=\"Dialog title explaining the app connection flow\"\n              values={{ appName, integrationName: integration.name }}\n            />\n          </Dialog.Title>\n          <Card>\n            <Flex direction=\"column\" gap=\"4\">\n              <Flex gap=\"2\" align=\"center\">\n                <IconPanel\n                  color=\"gray\"\n                  style={{ width: \"32px\", height: \"32px\" }}\n                >\n                  <GlobeIcon />\n                </IconPanel>\n                <Flex direction=\"column\">\n                  <Text size=\"1\" weight=\"bold\">\n                    <Translation\n                      defaultMessage=\"You'll be redirected to sign in with {integrationName}.\"\n                      id=\"g+n4aY\"\n                      description=\"Instruction about redirect to sign in\"\n                      values={{ integrationName: integration.name }}\n                    />\n                  </Text>\n                  <Text size=\"1\">\n                    <Translation\n                      defaultMessage=\"Authorize access to connect your account.\"\n                      id=\"fxVS34\"\n                      description=\"Instruction to authorize access\"\n                    />\n                  </Text>\n                </Flex>\n              </Flex>\n              <Flex gap=\"2\" align=\"center\">\n                <IconPanel\n                  color=\"gray\"\n                  style={{ width: \"32px\", height: \"32px\" }}\n                >\n                  <LockClosedIcon />\n                </IconPanel>\n                <Flex direction=\"column\">\n                  <Text size=\"1\" weight=\"bold\">\n                    <Translation\n                      defaultMessage=\"Your credentials remain secure.\"\n                      id=\"gM3bot\"\n                      description=\"Security message about credentials\"\n                    />\n                  </Text>\n                  <Text size=\"1\">\n                    <Translation\n                      defaultMessage=\"WorkOS never sees your credentials.\"\n                      id=\"kC9Fwe\"\n                      description=\"Security message about WorkOS not seeing credentials\"\n                    />\n                  </Text>\n                </Flex>\n              </Flex>\n            </Flex>\n          </Card>\n          <Flex justify=\"end\" gap=\"3\" mt=\"5\">\n            <Dialog.Close>\n              <Button variant=\"secondary\">\n                <Translation\n                  defaultMessage=\"Cancel\"\n                  id=\"hHNj31\"\n                  description=\"Cancel button text\"\n                />\n              </Button>\n            </Dialog.Close>\n            <Button\n              type=\"button\"\n              onClick={async () => {\n                try {\n                  await eventHandler();\n                  setOpen(false);\n                } catch {\n                  // pass - error displayed in new tab\n                }\n              }}\n            >\n              <Translation\n                defaultMessage=\"Connect\"\n                id=\"16WmG0\"\n                description=\"Connect button with external link\"\n                trailingSpace\n              />\n              <ExternalLinkIcon aria-hidden />\n            </Button>\n          </Flex>\n        </Dialog.Content>\n      </Dialog.Root>\n      <Button variant=\"secondary\" onClick={() => setOpen(true)}>\n        <Translation\n          defaultMessage=\"Connect\"\n          id=\"quvdFp\"\n          description=\"Button to connect an integration\"\n        />\n      </Button>\n    </>\n  );\n}\n\nfunction ProviderStatus({ integration }: { integration: DataIntegration }) {\n  const [disconnectOpen, setDisconnectOpen] = useState(false);\n  const authorizeEventHandler = useOpenDataIntegrationAuthorizeUrl(integration);\n  const translate = useTranslation();\n\n  const pipeActionsTitle = translate({\n    defaultMessage: \"Pipe actions\",\n    id: \"1uF9ve\",\n    description: \"Title for pipe actions dropdown button\",\n  });\n\n  if (integration.installation) {\n    return (\n      <>\n        <DisconnectAccountDialog\n          integrationName={integration.name}\n          installationId={integration.installation.id}\n          open={disconnectOpen}\n          onOpenChange={setDisconnectOpen}\n        />\n        <Flex align=\"center\" gap=\"4\">\n          <Status\n            state={\n              integration.installation.state === \"connected\"\n                ? \"success\"\n                : \"error\"\n            }\n          >\n            {integration.installation.state === \"connected\" ? (\n              <Translation\n                defaultMessage=\"Connected\"\n                id=\"i6Hxoz\"\n                description=\"Status text for connected integration\"\n              />\n            ) : (\n              <Translation\n                defaultMessage=\"Requires reauthorization\"\n                id=\"dqczQS\"\n                description=\"Status text for integration needing reauthorization\"\n              />\n            )}\n          </Status>\n          <DropdownMenu.Root>\n            <DropdownMenu.Trigger>\n              <IconButton title={pipeActionsTitle}>\n                <DotsHorizontalIcon />\n              </IconButton>\n            </DropdownMenu.Trigger>\n            <DropdownMenu.Content align=\"end\">\n              {integration.installation.state === \"needs_reauthorization\" && (\n                <DropdownMenu.Item\n                  onClick={async () => {\n                    try {\n                      await authorizeEventHandler();\n                    } catch {\n                      // pass - error displayed in new tab\n                    }\n                  }}\n                >\n                  <Flex gap=\"4\" width=\"100%\" justify=\"between\" align=\"center\">\n                    <Translation\n                      defaultMessage=\"Reauthorize\"\n                      id=\"0E29F1\"\n                      description=\"Menu option to reauthorize an integration\"\n                      trailingSpace\n                    />\n                    <ExternalLinkIcon aria-hidden />\n                  </Flex>\n                </DropdownMenu.Item>\n              )}\n              <DropdownMenu.Item\n                variant=\"destructive\"\n                onClick={() => setDisconnectOpen(true)}\n              >\n                <Translation\n                  defaultMessage=\"Disconnect account\"\n                  id=\"esZQrd\"\n                  description=\"Menu option to disconnect an account\"\n                />\n              </DropdownMenu.Item>\n            </DropdownMenu.Content>\n          </DropdownMenu.Root>\n        </Flex>\n      </>\n    );\n  }\n\n  if (integration.credentialsType === \"shared\") {\n    return (\n      <SharedCredentialsConnectIntegrationButton integration={integration} />\n    );\n  }\n\n  return <ConnectIntegrationButton integration={integration} />;\n}\n\nfunction DisconnectAccountDialog({\n  integrationName,\n  installationId,\n  open,\n  onOpenChange,\n}: {\n  integrationName: string;\n  installationId: string;\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n}) {\n  const queryClient = useQueryClient();\n  const {\n    mutate: deleteDataInstallation,\n    error,\n    reset,\n    isPending,\n  } = useDeleteDataInstallation({\n    mutation: {\n      onSuccess: () => {\n        onOpenChange(false);\n        queryClient.invalidateQueries({\n          queryKey: getMyDataIntegrationsQueryKey(),\n        });\n      },\n    },\n  });\n\n  useEffect(() => {\n    if (open) {\n      reset();\n    }\n  }, [open, reset]);\n\n  return (\n    <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n      <AlertDialog.Content style={{ width: \"80vw\", maxWidth: \"520px\" }}>\n        <AlertDialog.Title>\n          <Translation\n            defaultMessage=\"Disconnect account\"\n            id=\"9ABlCr\"\n            description=\"Dialog title for disconnecting an account\"\n          />\n        </AlertDialog.Title>\n        {error && (\n          <Callout.Root my=\"5\" color=\"red\" role=\"alert\">\n            <Callout.Text>\n              <Translation\n                defaultMessage=\"An error occurred while disconnecting your account. Please refresh the page and try again.\"\n                id=\"qKBKF7\"\n                description=\"Error message when disconnecting an account fails\"\n              />\n            </Callout.Text>\n          </Callout.Root>\n        )}\n        <AlertDialog.Description>\n          <Translation\n            defaultMessage=\"Are you sure you want to disconnect your {integrationName} account?\"\n            id=\"eEXeqP\"\n            description=\"Confirmation message for disconnecting an account\"\n            values={{\n              integrationName: (\n                <Text as=\"span\" weight=\"bold\">\n                  {integrationName}\n                </Text>\n              ),\n            }}\n          />\n        </AlertDialog.Description>\n        <Flex gap=\"3\" justify=\"end\" mt=\"5\">\n          <AlertDialog.Cancel>\n            <Button variant=\"secondary\">\n              <Translation\n                defaultMessage=\"Cancel\"\n                id=\"hHNj31\"\n                description=\"Cancel button text\"\n              />\n            </Button>\n          </AlertDialog.Cancel>\n          <Button\n            variant=\"destructive\"\n            disabled={isPending}\n            loading={isPending}\n            onClick={() => deleteDataInstallation({ installationId })}\n          >\n            <Translation\n              defaultMessage=\"Disconnect\"\n              id=\"vMVXQh\"\n              description=\"Button to disconnect an account\"\n            />\n          </Button>\n        </Flex>\n      </AlertDialog.Content>\n    </AlertDialog.Root>\n  );\n}\n\ninterface PipesLoadingProps extends WidgetRootDomProps {\n  count: number;\n}\n\nconst PipesLoading: React.FC<PipesLoadingProps> = ({ count, ...domProps }) => {\n  return (\n    <CardList.Root {...getWidgetRootDomProps(\"loading\", domProps)}>\n      {Array.from({ length: count }).map((_, index) => (\n        <CardList.Item key={index}>\n          <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n            <Flex gap=\"4\" align=\"center\">\n              <Skeleton>\n                <IconPanel>\n                  <ProviderIcon provider=\"google\" />\n                </IconPanel>\n              </Skeleton>\n              <Skeleton>\n                <Text size=\"2\" weight=\"bold\">\n                  <Translation\n                    defaultMessage=\"Google Drive\"\n                    id=\"g11OOu\"\n                    description=\"Placeholder text for loading state\"\n                  />\n                </Text>\n              </Skeleton>\n            </Flex>\n            <Skeleton>\n              <Button variant=\"secondary\" disabled>\n                <Translation\n                  defaultMessage=\"Connect\"\n                  id=\"8TuDfA\"\n                  description=\"Placeholder button text for loading state\"\n                />\n              </Button>\n            </Skeleton>\n          </Flex>\n        </CardList.Item>\n      ))}\n    </CardList.Root>\n  );\n};\n\nconst Pipes: React.FC<PipesProps> = ({ integrations, ...domProps }) => {\n  return (\n    <CardList.Root {...getWidgetRootDomProps(\"resolved\", domProps)}>\n      {integrations.map((integration) => (\n        <CardList.Item key={integration.id}>\n          <Flex direction=\"row\" justify=\"between\" align=\"center\" gap=\"2\">\n            <Flex gap=\"4\" align=\"center\">\n              <IconPanel color=\"panel\">\n                <DataIntegrationIcon integration={integration} />\n              </IconPanel>\n              <Text size=\"2\" weight=\"bold\">\n                {integration.name}\n              </Text>\n            </Flex>\n            <ProviderStatus integration={integration} />\n          </Flex>\n        </CardList.Item>\n      ))}\n    </CardList.Root>\n  );\n};\n\ninterface PipesErrorProps extends WidgetRootDomProps {\n  error: unknown;\n}\n\nconst PipesError: React.FC<PipesErrorProps> = ({ error, ...domProps }) => {\n  return (\n    <Card size=\"2\" {...getWidgetRootDomProps(\"error\", domProps)}>\n      <GenericError error={error} />\n    </Card>\n  );\n};\n\nfunction getWidgetRootDomProps(\n  state: WidgetRootState,\n  domProps: WidgetRootDomProps,\n) {\n  return getDomProps({\n    ...domProps,\n    isWidgetRoot: true,\n    widgetId: \"pipes\",\n    widgetState: state,\n  });\n}\n\nexport type { PipesProps, PipesLoadingProps, PipesErrorProps };\nexport { Pipes, PipesLoading, PipesError };\n"],"mappings":"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","names":[]}