Home / Function/ AwsMarketplaceLinkExistingOrg() — supabase Function Reference

AwsMarketplaceLinkExistingOrg() — supabase Function Reference

Architecture documentation for the AwsMarketplaceLinkExistingOrg() function in AwsMarketplaceLinkExistingOrg.tsx from the supabase codebase.

Entity Profile

Dependency Diagram

graph TD
  78598aac_6117_8df2_66d6_a82cf46bc2b8["AwsMarketplaceLinkExistingOrg()"]
  e1ed520f_1e4f_09ef_5750_d3c9a554e529["useCloudMarketplaceOnboardingInfoQuery()"]
  78598aac_6117_8df2_66d6_a82cf46bc2b8 -->|calls| e1ed520f_1e4f_09ef_5750_d3c9a554e529
  style 78598aac_6117_8df2_66d6_a82cf46bc2b8 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx lines 48–325

export const AwsMarketplaceLinkExistingOrg = ({
  organizations,
}: AwsMarketplaceLinkExistingOrgProps) => {
  const router = useRouter()
  const {
    query: { buyer_id: buyerId },
  } = router

  const { data: onboardingInfo, isPending: isLoadingOnboardingInfo } =
    useCloudMarketplaceOnboardingInfoQuery({
      buyerId: buyerId as string,
    })

  const form = useForm<LinkExistingOrgForm>({
    resolver: zodResolver(FormSchema),
    defaultValues: {
      orgSlug: undefined,
    },
    mode: 'onBlur',
    reValidateMode: 'onChange',
  })

  const isDirty = !!Object.keys(form.formState.dirtyFields).length

  // Sort organizations by name ascending
  const sortedOrganizations = useMemo(() => {
    return organizations?.slice().sort((a, b) => a.name.localeCompare(b.name))
  }, [organizations])

  const { orgsLinkable, orgsNotLinkable } = useMemo(() => {
    const orgQualifiesForLinking = (org: Organization) => {
      const validationResult = onboardingInfo?.organization_linking_eligibility.find(
        (result) => result.slug === org.slug
      )

      return validationResult?.is_eligible ?? false
    }

    const linkable: Organization[] = []
    const notLinkable: Organization[] = []
    sortedOrganizations?.forEach((org) => {
      if (orgQualifiesForLinking(org)) {
        linkable.push(org)
      } else {
        notLinkable.push(org)
      }
    })
    return { orgsLinkable: linkable, orgsNotLinkable: notLinkable }
  }, [sortedOrganizations, onboardingInfo?.organization_linking_eligibility])

  const [isNotLinkableOrgListOpen, setIsNotLinkableOrgListOpen] = useState(false)
  const [orgLinkedSuccessfully, setOrgLinkedSuccessfully] = useState(false)
  const [showOrgCreationDialog, setShowOrgCreationDialog] = useState(false)
  const [orgToRedirectTo, setOrgToRedirectTo] = useState('')

  const { mutate: linkOrganization, isPending: isLinkingOrganization } =
    useOrganizationLinkAwsMarketplaceMutation({
      onSuccess: (_) => {
        //TODO(thomas): send tracking event?
        setOrgLinkedSuccessfully(true)
        setOrgToRedirectTo(form.getValues('orgSlug'))
      },
      onError: (res) => {
        toast.error(res.message, {
          duration: 7_000,
        })
      },
    })

  const onSubmit: SubmitHandler<LinkExistingOrgForm> = async (values) => {
    linkOrganization({ slug: values.orgSlug, buyerId: buyerId as string })
  }

  return (
    <>
      {onboardingInfo &&
        !onboardingInfo.aws_contract_auto_renewal &&
        !onboardingInfo.aws_contract_is_private_offer && (
          <AwsMarketplaceAutoRenewalWarning
            awsContractEndDate={onboardingInfo.aws_contract_end_date}
            awsContractSettingsUrl={onboardingInfo.aws_contract_settings_url}
          />
        )}
      {isLoadingOnboardingInfo ? (
        <AwsMarketplaceOnboardingPlaceholder />
      ) : (
        <ScaffoldSection>
          <ScaffoldSectionDetail className="text-base">
            <>
              <p>
                You’ve subscribed to the Supabase{' '}
                {onboardingInfo?.plan_name_selected_on_marketplace} Plan via the AWS Marketplace. As
                a final step, you need to link a Supabase organization to that subscription. Select
                the organization you want to be managed and billed through AWS.
              </p>

              <p>
                You can read more on billing through AWS in our {''}
                <Link
                  href={`${DOCS_URL}/guides/platform/aws-marketplace`}
                  target="_blank"
                  className="underline"
                >
                  Billing Docs.
                </Link>
              </p>

              <p className="mt-10">
                <span className="font-bold text-foreground-light">Want to start fresh?</span> Create
                a new organization and it will be linked automatically.
              </p>
              <Button
                size="tiny"
                htmlType="submit"
                type="primary"
                onClick={async (e) => {
                  e.preventDefault()
                  setShowOrgCreationDialog(true)
                }}
              >
                Create organization
              </Button>
            </>
          </ScaffoldSectionDetail>

          <ScaffoldSectionContent className="lg:ml-10">
            <Form_Shadcn_ {...form}>
              <form className="flex flex-col">
                <FormField_Shadcn_
                  name="orgSlug"
                  control={form.control}
                  render={({ field }) => (
                    <RadioGroupCard
                      {...field}
                      defaultValue={field.value}
                      onValueChange={(value: string) => {
                        form.setValue('orgSlug', value, {
                          shouldDirty: true,
                          shouldValidate: false,
                        })
                      }}
                    >
                      <FormItemLayout id={field.name}>
                        <div className={'grid gap-4 grid-cols-1'}>
                          {isLoadingOnboardingInfo ? (
                            Array(3)
                              .fill(0)
                              .map((_, i) => (
                                <Skeleton key={i} className="w-full h-[110px] rounded-md" />
                              ))
                          ) : (
                            <>
                              <p className="font-bold text-foreground-light">
                                Organizations that can be linked
                              </p>
                              {orgsLinkable.length === 0 ? (
                                <p className="text-sm text-foreground-light">
                                  None of your organizations can be linked to your AWS Marketplace
                                  subscription at the moment.
                                </p>
                              ) : (
                                orgsLinkable.map((org) => (
                                  <RadioGroupCardItem
                                    id={org.slug}
                                    key={org.slug}
                                    showIndicator={false}
                                    value={org.slug}
                                    className={cn(
                                      'relative text-sm text-left flex flex-col gap-0 p-0 [&_label]:w-full group w-full'
                                    )}
                                    label={
                                      <OrganizationCard
                                        key={org.id}
                                        isLink={false}
                                        organization={org}
                                      />
                                    }
                                  />
                                ))
                              )}
                            </>
                          )}
                        </div>
                      </FormItemLayout>
                    </RadioGroupCard>
                  )}
                />
              </form>
            </Form_Shadcn_>

            {orgsNotLinkable.length > 0 && !isLoadingOnboardingInfo && (
              <Collapsible_Shadcn_
                className="-space-y-px"
                open={isNotLinkableOrgListOpen || orgsLinkable.length === 0}
                onOpenChange={() => setIsNotLinkableOrgListOpen((prev) => !prev)}
              >
                <CollapsibleTrigger_Shadcn_ className="py-2 w-full flex items-center group justify-between">
                  <p className="text-xs font-bold text-foreground-light">
                    Organizations that can't be linked
                  </p>
                  <ChevronRight
                    size={16}
                    className="text-foreground-lighter transition-all group-data-[state=open]:rotate-90"
                    strokeWidth={1}
                  />
                </CollapsibleTrigger_Shadcn_>
                <CollapsibleContent_Shadcn_
                  className={cn(
                    'flex flex-col gap-4 transition-all',
                    'data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down'
                  )}
                >
                  <p className="text-foreground-light text-xs">
                    The following organizations can’t be linked to your AWS Marketplace subscription
                    at the moment. This may be due to missing permissions, outstanding invoices, or
                    an existing marketplace link. If you'd like to link one of these organizations,
                    please review the organization settings. You need to be Owner or Administrator
                    of the organization to link it.
                  </p>
                  <div className="text-sm text-left flex flex-col gap-4 p-0 [&_label]:w-full group] w-full opacity-60">
                    {orgsNotLinkable.map((org) => (
                      <OrganizationCard
                        isLink={false}
                        key={org.id}
                        organization={org}
                        className="cursor-not-allowed"
                      />
                    ))}
                  </div>
                </CollapsibleContent_Shadcn_>
              </Collapsible_Shadcn_>
            )}

            <div className={cn('flex gap-3 justify-end')}>
              <ButtonTooltip
                size="medium"
                htmlType="submit"
                type="primary"
                onClick={async () => {
                  await onSubmit(form.getValues())
                }}
                loading={isLinkingOrganization}
                disabled={!isDirty || isLinkingOrganization || isLoadingOnboardingInfo}
                tooltip={{
                  content: {
                    side: 'top',
                    text: !isDirty ? 'No organization selected' : undefined,
                  },
                }}
              >
                Link organization
              </ButtonTooltip>
            </div>
          </ScaffoldSectionContent>
        </ScaffoldSection>
      )}

      <AwsMarketplaceOnboardingSuccessModal
        visible={orgLinkedSuccessfully}
        onClose={() => {
          setOrgLinkedSuccessfully(false)
          router.push(`/org/${orgToRedirectTo}`)
        }}
      />

      <NewAwsMarketplaceOrgModal
        visible={showOrgCreationDialog}
        onClose={() => setShowOrgCreationDialog(false)}
        buyerId={buyerId as string}
        onSuccess={(newlyCreatedOrgSlug) => {
          setShowOrgCreationDialog(false)
          setOrgToRedirectTo(newlyCreatedOrgSlug)
          setOrgLinkedSuccessfully(true)
        }}
      />
    </>
  )
}

Subdomains

Frequently Asked Questions

What does AwsMarketplaceLinkExistingOrg() do?
AwsMarketplaceLinkExistingOrg() is a function in the supabase codebase.
What does AwsMarketplaceLinkExistingOrg() call?
AwsMarketplaceLinkExistingOrg() calls 1 function(s): useCloudMarketplaceOnboardingInfoQuery.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free