import { PermissionAction } from '@supabase/shared-types/out/constants' import { parseAsBoolean, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogSection, DialogSectionSeparator, DialogTitle, RadioGroupStacked, RadioGroupStackedItem, } from 'ui' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { useOrganizationCustomerProfileUpdateMutation } from '@/data/organizations/organization-customer-profile-update-mutation' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { IS_PLATFORM } from '@/lib/constants' type IndirectTaxDeclaration = 'yes' | 'no' type DeclarationModal = 'declaration-form' | 'submission-confirmation' | null export const IndirectTaxDeclarationModal = () => { const { data: organization } = useSelectedOrganizationQuery({ enabled: IS_PLATFORM }) const [response, setResponse] = useState('') const [failedSubmissionSlug, setFailedSubmissionSlug] = useState() const [shouldShowDeclarationConfirmation, setShouldShowDeclarationConfirmation] = useQueryState( 'submit_indirect_tax_declaration', parseAsBoolean.withDefault(false) ) useEffect(() => { setResponse('') }, [organization?.slug]) const { can: canUpdateBillingInfo, isSuccess: permissionsLoaded } = useAsyncCheckPermissions( PermissionAction.BILLING_WRITE, 'stripe.customer' ) const { mutate: updateCustomerProfile, isPending } = useOrganizationCustomerProfileUpdateMutation( { onSuccess: () => { if (!shouldShowDeclarationConfirmation) { toast.success('GST declaration submitted') } }, onError: (_error, variables) => { setFailedSubmissionSlug(variables.slug) toast.error("We couldn't submit your GST declaration. Reload the page and try again.", { duration: Infinity, }) }, } ) const canViewDeclaration = IS_PLATFORM && organization !== undefined && permissionsLoaded && canUpdateBillingInfo let declarationModal: DeclarationModal = null if (canViewDeclaration) { if (organization.requires_indirect_tax_declaration) { if (organization.slug !== failedSubmissionSlug) { declarationModal = 'declaration-form' } } else if (shouldShowDeclarationConfirmation) { declarationModal = 'submission-confirmation' } } const onSubmit = () => { if (organization?.slug === undefined || response === '') return updateCustomerProfile({ slug: organization.slug, indirect_tax_registration_declaration: response, }) } const closeSubmissionConfirmation = () => { setShouldShowDeclarationConfirmation(null) } return ( <> event.preventDefault()} onEscapeKeyDown={(event) => event.preventDefault()} > Confirm your Australian GST status Confirm the following for your organization {organization?.name} { if (value === 'yes' || value === 'no') setResponse(value) }} > Submit declaration { if (!open) closeSubmissionConfirmation() }} > GST declaration submitted The GST declaration for {organization?.name} has been submitted. No further action is required. ) }