diff --git a/apps/edr-freight-web/portal/src/pages/SettingsPage.tsx b/apps/edr-freight-web/portal/src/pages/SettingsPage.tsx index 13b0d4025..53e0cf0a3 100644 --- a/apps/edr-freight-web/portal/src/pages/SettingsPage.tsx +++ b/apps/edr-freight-web/portal/src/pages/SettingsPage.tsx @@ -47,6 +47,7 @@ import useAuth from "@/hooks/useAuth"; import { rolesForCompanyType } from "./settings/companyRoles"; import TabAccount from "./settings/TabAccount"; import TabCompanyProfile from "./settings/TabCompanyProfile"; +import RegistrationSourceCard from "./settings/RegistrationSourceCard"; import TabContactPerson from "./settings/TabContactPerson"; import TabDocuments from "./settings/TabDocuments"; import TabOwner from "./settings/TabOwner"; @@ -398,6 +399,7 @@ export default function SettingsPage() { /> + diff --git a/apps/edr-freight-web/portal/src/pages/settings/RegistrationSourceCard.tsx b/apps/edr-freight-web/portal/src/pages/settings/RegistrationSourceCard.tsx new file mode 100644 index 000000000..09f4e7195 --- /dev/null +++ b/apps/edr-freight-web/portal/src/pages/settings/RegistrationSourceCard.tsx @@ -0,0 +1,149 @@ +import { useState } from "react"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { + Alert, + Button, + Card, + Group, + List, + Modal, + Stack, + Text, + Title, +} from "@mantine/core"; +import { AlertCircle, FileSearch } from "lucide-react"; + +import { api } from "@/services/api"; +import type { ProfileResponse } from "@/types/profile"; +import { extractApiError } from "@/utils/result"; + +/** + * Leave the foreign investment-licence route and go back to the ordinary eTrade + * one — for a company that has since been registered with the trade registry, + * or that ticked the box by mistake. + * + * It is a re-application, not a settings edit: the API clears the registration + * the customer typed (nothing on file was ever checked against a licence) and + * puts the company back to pending, so the wizard reopens on the company step + * and the TIN goes through eTrade this time. Said plainly here rather than + * discovered afterwards. + */ +export default function RegistrationSourceCard({ + profile, + disabled = false, +}: { + profile: ProfileResponse; + /** A change request is under review — switching now would strand it. */ + disabled?: boolean; +}) { + const queryClient = useQueryClient(); + const [confirming, setConfirming] = useState(false); + const [error, setError] = useState(null); + + const revert = useMutation({ + mutationFn: () => api.companies.revertToRegularCompany.call(), + onSuccess: async () => { + setConfirming(false); + // getInfo is what the onboarding gate reads, so refreshing it is what + // reopens the wizard. + await Promise.all([ + queryClient.invalidateQueries({ + queryKey: api.companies.getInfo.queryKey(), + }), + queryClient.invalidateQueries({ + queryKey: api.companies.getProfile.queryKey(), + }), + queryClient.invalidateQueries({ + queryKey: api.companies.onboardingRequirements.queryKey(), + }), + ]); + }, + onError: (err) => setError(extractApiError(err).message), + }); + + if (!profile.investorLicence) return null; + + return ( + <> + + + + Registration source + + + + Your company is registered on a foreign investment licence, so your + registration details were entered by hand instead of being read from + eTrade. Our team reviews them against the documents you uploaded. + + + If your company now holds an eTrade trade licence, you can switch + over and have your registration verified automatically. + + + + + {disabled && ( + + Not available while your profile changes are under review. + + )} + + + + setConfirming(false)} + title="Switch to eTrade registration?" + centered + radius="lg" + > + + This re-opens your application: + + + The registration details you typed are cleared — eTrade supplies + them once your TIN is found. + + + Your company goes back to pending and is reviewed again. + + + Your documents, owner and contact details stay as they are. + + + }> + If eTrade holds no record for your TIN you won't be able to finish — + come back here and re-select the investment licence in the wizard. + + {error && ( + + {error} + + )} + + + + + + + + ); +}