From 3d00697788e721e1d73f5d29d11cfd1d157299d5 Mon Sep 17 00:00:00 2001 From: auralshin Date: Tue, 2 Jun 2026 18:01:54 +0530 Subject: [PATCH 1/3] feat: implement KYC flow with verification screens and API integration --- packages/widget/src/Widget.tsx | 2 + .../components/atoms/icons/shield-check.tsx | 34 +++++++ .../molecules/kyc-iframe-modal/index.tsx | 64 +++++++++++++ .../molecules/kyc-iframe-modal/styles.css.ts | 71 ++++++++++++++ packages/widget/src/domain/types/kyc.ts | 87 ++++++++++++++++++ .../widget/src/hooks/api/use-kyc-status.ts | 43 +++++++++ .../earn-page/state/earn-page-context.tsx | 11 ++- .../pages/kyc/identity-verification.page.tsx | 92 +++++++++++++++++++ .../widget/src/pages/kyc/kyc-gate.page.tsx | 92 +++++++++++++++++++ .../widget/src/providers/api/api-client.ts | 25 ++++- .../src/translation/English/translations.json | 18 ++++ .../src/translation/French/translations.json | 18 ++++ .../use-cases/kyc-flow/kyc-flow.test.tsx | 61 ++++++++++++ .../use-cases/kyc-flow/kyc-helpers.test.ts | 54 +++++++++++ .../widget/tests/use-cases/kyc-flow/setup.ts | 37 ++++++++ 15 files changed, 707 insertions(+), 2 deletions(-) create mode 100644 packages/widget/src/components/atoms/icons/shield-check.tsx create mode 100644 packages/widget/src/components/molecules/kyc-iframe-modal/index.tsx create mode 100644 packages/widget/src/components/molecules/kyc-iframe-modal/styles.css.ts create mode 100644 packages/widget/src/domain/types/kyc.ts create mode 100644 packages/widget/src/hooks/api/use-kyc-status.ts create mode 100644 packages/widget/src/pages/kyc/identity-verification.page.tsx create mode 100644 packages/widget/src/pages/kyc/kyc-gate.page.tsx create mode 100644 packages/widget/tests/use-cases/kyc-flow/kyc-flow.test.tsx create mode 100644 packages/widget/tests/use-cases/kyc-flow/kyc-helpers.test.ts create mode 100644 packages/widget/tests/use-cases/kyc-flow/setup.ts diff --git a/packages/widget/src/Widget.tsx b/packages/widget/src/Widget.tsx index 9cacb450..b96faa41 100644 --- a/packages/widget/src/Widget.tsx +++ b/packages/widget/src/Widget.tsx @@ -24,6 +24,7 @@ import { AnimatedActivityPage } from "./pages/details/activity-page/activity.pag import { Details } from "./pages/details/details-page/details.page"; import { AnimatedEarnPage } from "./pages/details/earn-page/earn.page"; import { AnimatedPositionsPage } from "./pages/details/positions-page/positions.page"; +import { KycGatePage } from "./pages/kyc/kyc-gate.page"; import { PositionDetailsPage } from "./pages/position-details"; import { StakeReviewPage } from "./pages/review"; import { ActionReviewPage } from "./pages/review/pages/action-review.page"; @@ -133,6 +134,7 @@ export const Widget = () => { {/* Stake flow */} + } /> } /> } /> } /> diff --git a/packages/widget/src/components/atoms/icons/shield-check.tsx b/packages/widget/src/components/atoms/icons/shield-check.tsx new file mode 100644 index 00000000..e41faae4 --- /dev/null +++ b/packages/widget/src/components/atoms/icons/shield-check.tsx @@ -0,0 +1,34 @@ +import { vars } from "../../../styles/theme/contract.css"; + +export const ShieldCheckIcon = ({ + width, + height, + color = "text", +}: { + width?: number; + height?: number; + color?: Exclude; +}) => ( + + + + +); diff --git a/packages/widget/src/components/molecules/kyc-iframe-modal/index.tsx b/packages/widget/src/components/molecules/kyc-iframe-modal/index.tsx new file mode 100644 index 00000000..5595d8bd --- /dev/null +++ b/packages/widget/src/components/molecules/kyc-iframe-modal/index.tsx @@ -0,0 +1,64 @@ +import { Content, Overlay, Portal, Root, Title } from "@radix-ui/react-dialog"; +import { useContext } from "react"; +import { SettingsContext } from "../../../providers/settings"; +import { id } from "../../../styles/theme/ids"; +import { Box } from "../../atoms/box"; +import { XIcon } from "../../atoms/icons/x-icon"; +import { Text } from "../../atoms/typography/text"; +import { container, content, iframe, overlay } from "./styles.css"; + +export type KycIframeModalProps = { + open: boolean; + onOpenChange: (open: boolean) => void; + url: string; + title: string; +}; + +export const KycIframeModal = ({ + open, + onOpenChange, + url, + title, +}: KycIframeModalProps) => { + const portalContainer = useContext(SettingsContext)?.portalContainer; + + return ( + + + + onOpenChange(false)} className={overlay} /> + + + + + <Text variant={{ weight: "bold", size: "large" }}>{title}</Text> + + + onOpenChange(false)}> + + + + +