diff --git a/public/modalIcon/Warning.svg b/public/modalIcon/Warning.svg new file mode 100644 index 0000000..60f7001 --- /dev/null +++ b/public/modalIcon/Warning.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/modalIcon/bcIcon.png b/public/modalIcon/bcIcon.png new file mode 100644 index 0000000..bceb344 Binary files /dev/null and b/public/modalIcon/bcIcon.png differ diff --git a/public/modalIcon/checkCircle.svg b/public/modalIcon/checkCircle.svg new file mode 100644 index 0000000..169acfe --- /dev/null +++ b/public/modalIcon/checkCircle.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/modalIcon/ethIcon.png b/public/modalIcon/ethIcon.png new file mode 100644 index 0000000..0174de0 Binary files /dev/null and b/public/modalIcon/ethIcon.png differ diff --git a/public/modalIcon/hourGlassIcon.svg b/public/modalIcon/hourGlassIcon.svg new file mode 100644 index 0000000..99b3a15 --- /dev/null +++ b/public/modalIcon/hourGlassIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/modalIcon/moneyIcon.svg b/public/modalIcon/moneyIcon.svg new file mode 100644 index 0000000..eefaf01 --- /dev/null +++ b/public/modalIcon/moneyIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/modalIcon/strk.svg b/public/modalIcon/strk.svg new file mode 100644 index 0000000..87b885f --- /dev/null +++ b/public/modalIcon/strk.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/app/admin-dashboard/claims/components/claims-dashboard.tsx b/src/app/admin-dashboard/claims/components/claims-dashboard.tsx index 891605f..dedc50f 100644 --- a/src/app/admin-dashboard/claims/components/claims-dashboard.tsx +++ b/src/app/admin-dashboard/claims/components/claims-dashboard.tsx @@ -1,31 +1,39 @@ -"use client" +"use client"; -import type React from "react" +import type React from "react"; -import { useState } from "react" -import { Clock, Hourglass, CheckCircle, XCircle, Search, Download } from "lucide-react" -import ClaimsTable from "./claims-table" +import { useState } from "react"; +import { + Clock, + Hourglass, + CheckCircle, + XCircle, + Search, + Download, +} from "lucide-react"; +import ClaimsTable from "./claims-table"; +import { DirectionAnimation } from "@/motion/Animation"; // Define the types for our data interface ClaimSummary { - id: string - title: string - count: number - icon: React.ElementType - color: string + id: string; + title: string; + count: number; + icon: React.ElementType; + color: string; } interface Claim { - id: string - planId: string - planName: string - assetOwner: string - beneficiary: string - status: "Pending" | "Validated" | "Rejected" + id: string; + planId: string; + planName: string; + assetOwner: string; + beneficiary: string; + status: "Pending" | "Validated" | "Rejected"; } export default function ClaimsDashboard() { - const [searchQuery, setSearchQuery] = useState("") + const [searchQuery, setSearchQuery] = useState(""); // Claims summary data const claimsSummary: ClaimSummary[] = [ @@ -57,7 +65,7 @@ export default function ClaimsDashboard() { icon: XCircle, color: "bg-red-800 hover:bg-red-700", }, - ] + ]; // Claims data const claimsData: Claim[] = [ @@ -85,67 +93,82 @@ export default function ClaimsDashboard() { beneficiary: "jane@example.com", status: "Pending", }, - ] + ]; const handleSearch = (e: React.FormEvent) => { - e.preventDefault() + e.preventDefault(); // Implement search functionality here - console.log("Searching for:", searchQuery) - } + console.log("Searching for:", searchQuery); + }; return (
- {/* Claims summary cards */}
{claimsSummary.map((summary) => ( -
+
-
- -
-

{summary.title}

-

{summary.count}

+ +
+ +
+
+

+ + {summary.title} + +

+

+ + {summary.count} + +

))}
{/* Search bar and actions */} -
-
-
-
- + +
+
+
+
+ +
+ setSearchQuery(e.target.value)} + /> +
- setSearchQuery(e.target.value)} - /> -
+
+ +
-
- - -
-
+ {/* Claims table */}
- ) + ); } - diff --git a/src/app/admin-dashboard/claims/components/claims-table.tsx b/src/app/admin-dashboard/claims/components/claims-table.tsx index 86561e5..ad2a4c7 100644 --- a/src/app/admin-dashboard/claims/components/claims-table.tsx +++ b/src/app/admin-dashboard/claims/components/claims-table.tsx @@ -1,23 +1,24 @@ -"use client" +"use client"; -import { useState } from "react" -import { ChevronDown } from "lucide-react" +import { useState } from "react"; +import { ChevronDown } from "lucide-react"; +import { DirectionAnimation } from "@/motion/Animation"; interface Claim { - id: string - planId: string - planName: string - assetOwner: string - beneficiary: string - status: "Pending" | "Validated" | "Rejected" + id: string; + planId: string; + planName: string; + assetOwner: string; + beneficiary: string; + status: "Pending" | "Validated" | "Rejected"; } interface ClaimsTableProps { - claims: Claim[] + claims: Claim[]; } export default function ClaimsTable({ claims }: ClaimsTableProps) { - const [activeTab, setActiveTab] = useState("all") + const [activeTab, setActiveTab] = useState("all"); // Sample data based on the image const claimsData: Claim[] = [ @@ -45,7 +46,7 @@ export default function ClaimsTable({ claims }: ClaimsTableProps) { beneficiary: "jedipadawan@gmail.com", status: "Rejected", }, - ] + ]; return (
@@ -73,37 +74,56 @@ export default function ClaimsTable({ claims }: ClaimsTableProps) {
Status
Action
-
- {claimsData.map((claim) => ( -
-
{claim.planId}
-
{claim.planName}
-
{claim.assetOwner}
-
{claim.beneficiary}
-
- {claim.status} + + {" "} +
+ {claimsData.map((claim) => ( +
+
+ {claim.planId} +
+
+ {claim.planName} +
+
+ {claim.assetOwner} +
+
+ {claim.beneficiary} +
+
+ {claim.status} +
+
+ + {claim.status !== "Rejected" && + claim.status !== "Validated" && ( + + )} + {claim.status !== "Rejected" && ( + + )} + {claim.status === "Rejected" && ( + + )} +
-
- - {claim.status !== "Rejected" && claim.status !== "Validated" && ( - - )} - {claim.status !== "Rejected" && ( - - )} - {claim.status === "Rejected" && ( - - )} -
-
- ))} -
+ ))} +
+
- ) + ); } - diff --git a/src/app/admin-dashboard/components/AdminQuickActions.tsx b/src/app/admin-dashboard/components/AdminQuickActions.tsx index 1d25e08..a3a3392 100644 --- a/src/app/admin-dashboard/components/AdminQuickActions.tsx +++ b/src/app/admin-dashboard/components/AdminQuickActions.tsx @@ -1,5 +1,7 @@ +"use client"; import React from "react"; import Image from "next/image"; +import { DirectionAnimation } from "@/motion/Animation"; interface Button { icon: string; @@ -18,18 +20,20 @@ export default function AdminQuickActions() {

Quick Actions

{buttons.map((button, index) => ( - + + + ))}
diff --git a/src/app/admin-dashboard/components/AdminRecentActivities.tsx b/src/app/admin-dashboard/components/AdminRecentActivities.tsx index 3ce31cd..5a33c64 100644 --- a/src/app/admin-dashboard/components/AdminRecentActivities.tsx +++ b/src/app/admin-dashboard/components/AdminRecentActivities.tsx @@ -1,68 +1,81 @@ -import { Clock, BarChart2 } from "lucide-react" +"use client"; +import { DirectionAnimation } from "@/motion/Animation"; +import { Clock, BarChart2 } from "lucide-react"; export default function AdminRecentActivities() { return (
-
-

Recent Activities

+ +
+

+ Recent Activities +

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - Date -
-
Type -
- - Details -
-
Action
24 - 01 - 2025SupportResponded to support ticket - - View Ticket - -
24 - 01 - 2025ClaimsApproved Claim - - View Claim - -
24 - 01 - 2025SupportAdded FAQ - - View FAQs - -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + Date +
+
Type +
+ + Details +
+
Action
24 - 01 - 2025SupportResponded to support ticket + + View Ticket + +
24 - 01 - 2025ClaimsApproved Claim + + View Claim + +
24 - 01 - 2025SupportAdded FAQ + + View FAQs + +
+
-
+
- ) + ); } - diff --git a/src/app/admin-dashboard/components/AdminStatCards.tsx b/src/app/admin-dashboard/components/AdminStatCards.tsx index 31493d6..aebe828 100644 --- a/src/app/admin-dashboard/components/AdminStatCards.tsx +++ b/src/app/admin-dashboard/components/AdminStatCards.tsx @@ -1,3 +1,5 @@ +"use client"; +import { DirectionAnimation } from "@/motion/Animation"; import Image from "next/image"; interface Stat { @@ -34,17 +36,23 @@ const AdminStatCards = () => { >
- {`${stat.label} + + {`${stat.label} +
- {stat.label} -

{stat.value}

+ + {stat.label} + +

+ {stat.value} +

))} diff --git a/src/app/admin-dashboard/components/SupportQuickAction.tsx b/src/app/admin-dashboard/components/SupportQuickAction.tsx index ee3aeb9..8eef03f 100644 --- a/src/app/admin-dashboard/components/SupportQuickAction.tsx +++ b/src/app/admin-dashboard/components/SupportQuickAction.tsx @@ -1,24 +1,24 @@ import React from "react"; import Image from "next/image"; - +import { DirectionAnimation } from "@/motion/Animation"; const SupportQuickAction = () => { - interface Button { icon: string; label: string; } - + const buttons: Button[] = [ { icon: "/svg/add.svg", label: "Add FAQ" }, { icon: "/svg/view.svg", label: "View All FAQs" }, ]; - - return ( -
-

Quick Actions

-
- {buttons.map((button, index) => ( + + return ( +
+

Quick Actions

+
+ {buttons.map((button, index) => ( + - ))} -
+ + ))}
- ); - } +
+ ); +}; -export default SupportQuickAction \ No newline at end of file +export default SupportQuickAction; diff --git a/src/app/admin-dashboard/components/SupportStatCard.tsx b/src/app/admin-dashboard/components/SupportStatCard.tsx index ea8a12b..b37251c 100644 --- a/src/app/admin-dashboard/components/SupportStatCard.tsx +++ b/src/app/admin-dashboard/components/SupportStatCard.tsx @@ -1,3 +1,4 @@ +import { DirectionAnimation } from "@/motion/Animation"; import Image from "next/image"; interface Stat { @@ -34,17 +35,23 @@ const SupportStatCard = () => { >
- {`${stat.label} + + {`${stat.label} +
- {stat.label} -

{stat.value}

+ + {stat.label} + +

+ {stat.value} +

))} diff --git a/src/app/admin-dashboard/plans/components/plans-dashboard.tsx b/src/app/admin-dashboard/plans/components/plans-dashboard.tsx index 50f9ed4..5ccc390 100644 --- a/src/app/admin-dashboard/plans/components/plans-dashboard.tsx +++ b/src/app/admin-dashboard/plans/components/plans-dashboard.tsx @@ -8,6 +8,7 @@ import { plans, users } from "../lib/data"; import { ChevronDown, Download, ListFilter, Search } from "lucide-react"; import AdminStatCards from "../../components/AdminStatCards"; +import { DirectionAnimation } from "@/motion/Animation"; export function PlansDashboard() { const [searchQuery, setSearchQuery] = useState(""); @@ -42,96 +43,98 @@ export function PlansDashboard() {
- {/* Search and Actions */} -
-
- + + {/* Search and Actions */} +
+
+ - setSearchQuery(e.target.value)} - /> - + setSearchQuery(e.target.value)} + /> + +
+
+ + +
-
- - -
-
- {/* Plans Table */} -
-
-

Plans

- -
+ {/* Plans Table */} +
+
+

Plans

+ +
-
- - - - - - - - - - - - - - {filteredPlans.map((plan) => ( - - - - - - - - +
+
- Plan ID - - Plan Name - - Asset Owner - - Beneficiaries - - Time-Lock Status - - Status - - Action -
{plan.id}{plan.name}{plan.assetOwner}{plan.beneficiaries.length}{plan.timeLockStatus}{plan.status} - -
+ + + + + + + + + - ))} - -
+ Plan ID + + Plan Name + + Asset Owner + + Beneficiaries + + Time-Lock Status + + Status + + Action +
+ + + {filteredPlans.map((plan) => ( + + {plan.id} + {plan.name} + {plan.assetOwner} + {plan.beneficiaries.length} + {plan.timeLockStatus} + {plan.status} + + + + + ))} + + +
-
+ {/* Modals */} {selectedPlan && ( diff --git a/src/app/admin-dashboard/support/page.tsx b/src/app/admin-dashboard/support/page.tsx index 7204a90..90663b4 100644 --- a/src/app/admin-dashboard/support/page.tsx +++ b/src/app/admin-dashboard/support/page.tsx @@ -1,10 +1,11 @@ -import React from 'react' -import SupportStatCard from "../components/SupportStatCard" -import SupportQuickAction from '../components/SupportQuickAction' -import SupportSearchBar from "../components/SupportSearchBar" -import SupportTicket from '../components/SupportTicket' -import SupportFaqs from '../components/SupportFaqs' - +import React from "react"; +import SupportStatCard from "../components/SupportStatCard"; +import SupportQuickAction from "../components/SupportQuickAction"; +import SupportSearchBar from "../components/SupportSearchBar"; +import SupportTicket from "../components/SupportTicket"; +import SupportFaqs from "../components/SupportFaqs"; +import { DirectionAnimation } from "@/motion/Animation"; + export default function support() { return ( <> @@ -12,11 +13,19 @@ export default function support() { - + + + - + + {" "} + + - + + {" "} + + - ) + ); } diff --git a/src/app/user-dashboard/advisory/advisory.tsx b/src/app/user-dashboard/advisory/advisory.tsx index cb9233b..ff59652 100644 --- a/src/app/user-dashboard/advisory/advisory.tsx +++ b/src/app/user-dashboard/advisory/advisory.tsx @@ -111,32 +111,34 @@ function Advisory() { {/* Option buttons */}
-
- - - - -
+ +
+ + + + +
+
{/* Chat input */}
diff --git a/src/app/user-dashboard/assets/assets.tsx b/src/app/user-dashboard/assets/assets.tsx index cf28860..85b2147 100644 --- a/src/app/user-dashboard/assets/assets.tsx +++ b/src/app/user-dashboard/assets/assets.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import ethIcon from "@/svg/ethIcon.svg"; import usdtIcon from "@/svg/usctIcon.svg"; import usdcIcon from "@/svg/usdc.svg"; +import { DirectionAnimation } from "@/motion/Animation"; interface AssetData { name: string; @@ -184,79 +185,91 @@ const Assets = () => {
{/* Order Card - Left aligned with specific dimensions */} -
-
-
- - - -
-
- 0x8a53...3279 - + +
+
+
+ + + +
+
+ 0x8a53...3279 + +
-
-
{totalBalance}
-
-
- +
{totalBalance}
+
+
+ +
-
+
{/* Tab Navigation */}
- + + +
- + + {" "} + +
- + + {" "} + + {isOpen && (
    - {currencies.map((currency) => ( + {currencies.map((currency, index) => (
  • selectCurrency(currency)} > - {currency} + + {currency} +
  • ))}
@@ -278,58 +291,64 @@ const Assets = () => { {/* Table with minimum width to ensure horizontal scroll when needed */}
{/* Table Headers */} -
-
Asset
-
Balance
-
Price
-
PNL
-
Chart
-
+ +
+
Asset
+
Balance
+
Price
+
PNL
+
Chart
+
+
{/* Asset Rows */}
{assets.map((asset, index) => ( -
-
- {asset.name} -
-
{asset.name}
-
- {asset.network} + +
+
+ {asset.name} +
+
+ {asset.name} +
+
+ {asset.network} +
-
-
-
- {asset.balance} -
-
- ${asset.balanceUSD} +
+
+ {asset.balance} +
+
+ ${asset.balanceUSD} +
-
-
{asset.price}
+
{asset.price}
-
- {asset.pnl} -
+
+ {asset.pnl} +
-
- {renderChart(asset.chartData, asset.isPositive)} +
+ {renderChart(asset.chartData, asset.isPositive)} +
-
+
))}
@@ -343,55 +362,63 @@ const Assets = () => { {/* NFTs Table */}
{/* Table Headers */} -
-
Image
-
Name
-
Collection
-
Token ID
-
Blockchain
-
Action
-
+ +
+
Image
+
Name
+
Collection
+
Token ID
+
Blockchain
+
Action
+
+
{/* NFT Rows */}
- {nfts.map((nft) => ( -
+ {nfts.map((nft, index) => ( +
handleNftImageClick(nft)} - className="cursor-pointer" + key={index} + className="grid grid-cols-6 items-center py-2 border-t border-gray-700" > - {/* Using SVG with image tag */} - handleNftImageClick(nft)} + className="cursor-pointer" > - - -
-
{nft.name}
-
{nft.collection}
-
{nft.tokenId}
-
{nft.blockchain}
-
- + viewBox="0 0 48 48" + xmlns="http://www.w3.org/2000/svg" + > + + +
+
{nft.name}
+
+ {nft.collection} +
+
{nft.tokenId}
+
+ {nft.blockchain} +
+
+ +
-
+ ))}
diff --git a/src/app/user-dashboard/claims/claims.tsx b/src/app/user-dashboard/claims/claims.tsx index 62b9bbe..6c0fde2 100644 --- a/src/app/user-dashboard/claims/claims.tsx +++ b/src/app/user-dashboard/claims/claims.tsx @@ -6,12 +6,14 @@ import clockIcon from "../../../../public/svg/plansIcon.svg"; import peopleIcon from "../../../../public/svg/people.svg"; import ClaimForm from "../component/ClaimForm"; import ClaimList from "../component/ClaimList"; -import { CircleCheck } from "lucide-react"; -import { TriangleAlert } from "lucide-react"; -import { Hourglass } from "lucide-react"; import ClaimModal from "../component/ClaimModal"; import AcceptedModal from "../component/AcceptedModal"; +import WithdrawalModal from "../../../components/WithdrawalModal"; import { ClaimStatCard } from "../component/ClaimStatCard"; +import checkCicle from "../../../../public/modalIcon/checkCircle.svg"; +import warningIcon from "../../../../public/modalIcon/Warning.svg"; +import hourglassIcon from "../../../../public/modalIcon/hourGlassIcon.svg"; +import { DirectionAnimation } from "@/motion/Animation"; interface Claim { id: number; @@ -37,7 +39,6 @@ const dummyClaims: Claim[] = [ status: "Accepted", action: "view", }, - { id: 2, date: "24-01-2025", @@ -46,7 +47,6 @@ const dummyClaims: Claim[] = [ status: "Pending", action: "claim", }, - { id: 3, date: "24-01-2025", @@ -59,37 +59,59 @@ const dummyClaims: Claim[] = [ const modalMessages = { Submitted: { - title: "Claim Request Recieved", + title: "Claim Request Received", message: - "Your Sumbmissions have been recieved! We're reviewing them and will update you shortly. Check your email or dashboard for status updates", - icon: , + "Your submissions have been received! We’re reviewing them and will update you shortly. Check your email or dashboard for status updates.", + icon: ( + Claim Submitted + ), }, Pending: { title: "Claim Pending", message: "Claim under review, please check your mailbox and dashboard regularly for status updates.", - icon: , + icon: ( + Claim Submitted + ), }, Rejected: { title: "Invalid Claim Code", message: "Claim code is not associated with your account or does not exist. Please check claim code and try again", - icon: , + icon: ( + Claim Submitted + ), }, Accepted: { - title: "Claim Accepted", + title: "Claim Request Received ", message: - "Your claim has been accepted. Please check your email or dashboard for further details.", - icon: , + "Your submissions have been received! We’re reviewing them and will update you shortly. Check your email or dashboard for status updates.", + icon: ( + Claim Submitted + ), + }, + Sucessful: { + title: "Withdrawal Successful", + message: "25,002.45 STRK has been successfully transferred to your wallet.", + icon: ( + Claim Submitted + ), }, }; function Claims() { - const [claims, setClaims] = useState(dummyClaims); + // Start with empty claims + const [claims, setClaims] = useState([]); const [selectedClaim, setSelectedClaim] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [modalData, setModalData] = useState(null); const [isAcceptedModalOpen, setIsAcceptedModalOpen] = useState(false); + const [isWithdrawalModalOpen, setIsWithdrawalModalOpen] = useState(false); const claimedCount = claims.filter( (claim) => claim.status === "Accepted" @@ -100,29 +122,57 @@ function Claims() { const handleClaimSubmission = (claimCode: string) => { console.log("Claim submitted with code:", claimCode); - setModalData(modalMessages.Submitted); + + // Check if code is 666 + if (claimCode === "666") { + setModalData(modalMessages.Pending); + setIsModalOpen(true); + setClaims(dummyClaims); + return; + } + + // Check if code is only one letter + if (claimCode.length < 2) { + setModalData(modalMessages.Rejected); + setIsModalOpen(true); + return; + } + + // Valid code - add the dummy claims and show success modal + setClaims(dummyClaims); + setModalData(modalMessages.Accepted); setIsModalOpen(true); }; - const handleViewClaim = (claims: Claim) => { - setSelectedClaim(claims); - if (claims.status === "Accepted") { + const handleViewClaim = (claim: Claim) => { + setSelectedClaim(claim); + if (claim.status === "Accepted") { setIsAcceptedModalOpen(true); } else { - setModalData(modalMessages[claims.status]); + setModalData(modalMessages[claim.status]); setIsModalOpen(true); } }; + const handleWithdrawFunds = () => { + setIsWithdrawalModalOpen(true); + }; + + const handleWithdrawalSubmit = (amount: string) => { + setIsWithdrawalModalOpen(false); + setModalData(modalMessages.Sucessful); + setIsModalOpen(true); + }; + const closeModal = () => { setIsModalOpen(false); setSelectedClaim(null); setModalData(null); }; - const Stat = [ + const stats = [ { - value: "$0.00", + value: "$452.35", icon: Assets, label: "Total amount of claimed assets", }, @@ -140,20 +190,60 @@ function Claims() { return (
-
- {Stat.map((stat, index) => ( +
0 ? "4" : "3" + } gap-6 `} + > + {stats.map((stat, index) => ( ))} + {claims.length > 0 && ( + + )}
- - - {isModalOpen && } + + + + + + {claims.length > 0 ? ( + + + + ) : ( + +
+

+ Claims +

+

+ No Claims Yet, Enter Claim Code to Claim Inheritance +

+
+
+ )} + + {isModalOpen && modalData && ( + + )} {isAcceptedModalOpen && selectedClaim && ( setIsAcceptedModalOpen(false)} /> )} + {isWithdrawalModalOpen && ( + setIsWithdrawalModalOpen(false)} + onSubmit={handleWithdrawalSubmit} + /> + )}
); } diff --git a/src/app/user-dashboard/component/AcceptedModal.tsx b/src/app/user-dashboard/component/AcceptedModal.tsx index 53449b0..86cada5 100644 --- a/src/app/user-dashboard/component/AcceptedModal.tsx +++ b/src/app/user-dashboard/component/AcceptedModal.tsx @@ -1,18 +1,19 @@ "use client"; -import React from "react"; -import { FileText } from 'lucide-react'; - - +import React, { useState, useRef, useEffect } from "react"; +import { FileText, ChevronUp, ChevronDown } from "lucide-react"; interface PreviewClaimModalProps { isOpen: boolean; onClose: () => void; - } -const AcceptedModal: React.FC = ({ isOpen, onClose }) => { - if (!isOpen) return null; - +const PreviewClaimModal: React.FC = ({ + isOpen, + onClose, +}) => { + const [assetsVisible, setAssetsVisible] = useState(true); + const [filesVisible, setFilesVisible] = useState(true); + const modalRef = useRef(null); // Hardcoded claim data for testing const claim = { @@ -21,92 +22,161 @@ const AcceptedModal: React.FC = ({ isOpen, onClose }) => transferDate: "28-05-2030", assets: { tokens: [ - { name: "ETH", amount: "0.51", dollas:"≈$2.523.22" }, - { name: "STARK", amount: "23.450", dollas:"≈$2.523.22"}, + { name: "ETH", amount: "0.51", dollars: "≈$2,523.22" }, + { name: "STARK", amount: "23,450", dollars: "≈$2,523.22" }, ], nfts: ["JASPe2113", "RocketTeddy222"], - files: ["tribute_and_instuctions.mp4", "tribute_and_instuctions.mp4"], + files: ["tribute_and_instructions.mp4", "tribute_and_instructions.mp4"], }, }; - return ( -
-
-

Preview Claim

- - -
-
-

Asset Owner Name

-
{claim.assetsOwner}
-
-
-

Message

-
For everyone dear to me
-
-
-

Transfer Date

-
{claim.transferDate}
-
- -
-

Assets

-
-
-

Tokens

-
- {claim.assets.tokens.map((token, index) => ( -
- {token.name} -
- {token.amount} - {token.dollas} -
+ // Scroll to top when modal opens + useEffect(() => { + if (isOpen && modalRef.current) { + modalRef.current.scrollTop = 0; + } + }, [isOpen]); -
- ))} -
+ if (!isOpen) return null; -
-

NFTs

-
- {claim.assets.nfts.map((nft, index) => ( -
- {nft} - -
- ))} -
+ return ( +
+
+

+ Preview Claim +

+ +
+ {/* Asset Owner Name */} +
+
+

Asset Owner Name

+

{claim.assetsOwner}

+
+
-
+ {/* Message */} +
+
+

Message

+

{claim.message}

+
+
+ {/* Transfer Date */} +
+
+

Transfer Date

+

{claim.transferDate}

+
+
+ + {/* Assets */} +
+
+

Assets

+
setAssetsVisible(!assetsVisible)} + > + {assetsVisible ? "Hide Details" : "Show Details"} + {assetsVisible ? ( + + ) : ( + + )}
-
-

Files

- {claim.assets.files.map((file, index) => ( -
-
-
- -
+
+ + {assetsVisible && ( + <> + {/* Tokens */} +
+
+

Tokens

+
+
+ {claim.assets.tokens.map((token, index) => ( +
+ {token.name}
-

File 1

-

{file}

+ {token.amount} + + {token.dollars} +
-
+ ))} +
+
- -
- ))} + {/* NFTs */} +
+
+

NFT

+
+
+ {claim.assets.nfts.map((nft, index) => ( +
+ {nft} + +
+ ))} +
+ + )} +
+ + {/* Files */} +
+
+

Files

+
setFilesVisible(!filesVisible)} + > + {filesVisible ? "Hide Details" : "Show Details"} + {filesVisible ? ( + + ) : ( + + )} +
- - + {filesVisible && ( +
+ {claim.assets.files.map((file, index) => ( +
+
+ +
+

File 1

+

{file}

+
+
+ +
+ ))} +
+ )} +
+
-
-
@@ -115,4 +185,4 @@ const AcceptedModal: React.FC = ({ isOpen, onClose }) => ); }; -export default AcceptedModal; +export default PreviewClaimModal; diff --git a/src/app/user-dashboard/component/ClaimForm.tsx b/src/app/user-dashboard/component/ClaimForm.tsx index 8efee00..6ce4b90 100644 --- a/src/app/user-dashboard/component/ClaimForm.tsx +++ b/src/app/user-dashboard/component/ClaimForm.tsx @@ -8,9 +8,13 @@ interface ClaimFormProps { const ClaimForm: React.FC = ({ onClaimSubmit }) => { const [claimCode, setClaimCode] = useState(""); + const [error, setError] = useState(false); const handleClaimSubmit = () => { - if (claimCode.trim() === "") return; + if (claimCode.length < 2 || !claimCode) { + setError(true); + } + onClaimSubmit(claimCode); setClaimCode(""); }; @@ -25,14 +29,16 @@ const ClaimForm: React.FC = ({ onClaimSubmit }) => {

Claim Code

setClaimCode(e.target.value)} - className="mb-4 py-3 px-3 rounded-lg w-full bg-[#21202A] border border-white text-white " + onChange={(e) => (setClaimCode(e.target.value), setError(false))} + className={`mb-4 py-3 px-3 rounded-lg w-full bg-[#21202A] border ${ + error ? "border-red-600" : "border-white" + } text-white `} /> diff --git a/src/app/user-dashboard/component/ClaimModal.tsx b/src/app/user-dashboard/component/ClaimModal.tsx index 4461136..ab9b52c 100644 --- a/src/app/user-dashboard/component/ClaimModal.tsx +++ b/src/app/user-dashboard/component/ClaimModal.tsx @@ -1,10 +1,9 @@ "use client"; -import React, { FC, ReactNode } from 'react' - +import React, { FC } from "react"; interface ModalMessage { - icon: ReactNode; + icon: any; title: string; message: string; } @@ -14,23 +13,27 @@ interface ClaimListProps { onClose: () => void; } - - const ClaimModal: FC = ({ modalData, onClose }) => { - if (!modalData) return null; + if (!modalData) return null; return ( -
-
-
{modalData.icon}
-

{modalData.title}

-

{modalData.message}

-
+ ); +}; - ) -} - -export default ClaimModal; \ No newline at end of file +export default ClaimModal; diff --git a/src/app/user-dashboard/component/ClaimStatCard.tsx b/src/app/user-dashboard/component/ClaimStatCard.tsx index f091e54..541977d 100644 --- a/src/app/user-dashboard/component/ClaimStatCard.tsx +++ b/src/app/user-dashboard/component/ClaimStatCard.tsx @@ -1,34 +1,73 @@ +import { DirectionAnimation } from "@/motion/Animation"; import { ReactNode } from "react"; interface StatCardProps { - icon: ReactNode; - value: string; - label: string; + icon?: ReactNode; + value?: string; + label?: string; bgCol?: string; + isAction?: boolean; + actionText?: string; + onAction?: () => void; } -export function ClaimStatCard({ icon, value, label, bgCol }: StatCardProps) { +export function ClaimStatCard({ + icon, + value, + label, + isAction = false, + actionText, + onAction, +}: StatCardProps) { + if (isAction) { + return ( +
+
+

{actionText}

+ + + +
+
+ ); + } + return (
-
-
+
+
- {icon} + {icon}
- -
-

{label}

-

{value}

- +

+ {label} +

+

+ {value} +

); -} \ No newline at end of file +} diff --git a/src/app/user-dashboard/component/StatCard.tsx b/src/app/user-dashboard/component/StatCard.tsx index 4732791..c251dcc 100644 --- a/src/app/user-dashboard/component/StatCard.tsx +++ b/src/app/user-dashboard/component/StatCard.tsx @@ -1,3 +1,4 @@ +import { DirectionAnimation } from "@/motion/Animation"; import { ReactNode } from "react"; interface StatCardProps { @@ -17,15 +18,24 @@ export function StatCard({ icon, value, label, bgCol }: StatCardProps) {
- {icon} + + {icon} +
- {label} + + {" "} + {label} +
-

{value}

+

+ + {value} + +

diff --git a/src/app/user-dashboard/dashboard/dashboard.tsx b/src/app/user-dashboard/dashboard/dashboard.tsx index 5e0c934..e5bd76f 100644 --- a/src/app/user-dashboard/dashboard/dashboard.tsx +++ b/src/app/user-dashboard/dashboard/dashboard.tsx @@ -9,6 +9,7 @@ import peopleIcon from "../../../../public/svg/people.svg"; import midClockIcon from "../../../../public/svg/mdi_clock-plus.svg"; import swapIcon from "../../../../public/svg/swap-icon.svg"; import RecentActivities from "../component/RecentActivity"; +import { DirectionAnimation } from "@/motion/Animation"; const stats = [ { @@ -61,15 +62,23 @@ function Dashboard() {

Quick Actions

{quickActions.map((action, index) => ( - + > + + ))}
- + + + ); diff --git a/src/app/user-dashboard/exchanges/exchanges.tsx b/src/app/user-dashboard/exchanges/exchanges.tsx index 7839304..d932177 100644 --- a/src/app/user-dashboard/exchanges/exchanges.tsx +++ b/src/app/user-dashboard/exchanges/exchanges.tsx @@ -7,6 +7,7 @@ import eth from "../../../../public/assets/Eth.png"; import strk from "../../../../public/assets/strk.png"; import usdc from "../../../../public/assets/usdc.png"; import usdt from "../../../../public/assets/usdt.png"; +import { DirectionAnimation } from "@/motion/Animation"; // Token type definition interface Token { @@ -190,477 +191,488 @@ const Exchange = () => {
{/* From Section */} -
-
- From -
- + +
+
+ From +
+ - {/* From Token Dropdown */} - {showFromDropdown && ( -
-
-
- - - + {/* From Token Dropdown */} + {showFromDropdown && ( +
+
+
+ + + +
-
-
- {filteredTokens.map((token) => ( -
selectFromToken(token)} - > -
- {/* Replaced text with Image component */} -
- {token.symbol} -
-
-
- {token.name} +
+ {filteredTokens.map((token) => ( +
selectFromToken(token)} + > +
+ {/* Replaced text with Image component */} +
+ {token.symbol}
-
- {token.symbol} +
+
+ {token.name} +
+
+ {token.symbol} +
-
-
-
{token.balance.toLocaleString()}
-
- ${(token.balance * token.value).toLocaleString()} +
+
{token.balance.toLocaleString()}
+
+ ${(token.balance * token.value).toLocaleString()} +
-
- ))} + ))} +
-
- )} + )} +
-
-
-
- handleFromAmountChange(e.currentTarget.textContent || "") - } - className="bg-transparent text-2xl sm:text-3xl md:text-4xl font-bold outline-none" - > - {fromAmount} +
+
+ handleFromAmountChange(e.currentTarget.textContent || "") + } + className="bg-transparent text-2xl sm:text-3xl md:text-4xl font-bold outline-none" + > + {fromAmount} +
+
+ {fromToken.symbol} +
{" "} +
+ ≈${(parseFloat(fromAmount) * fromToken.value).toLocaleString()} +
-
- {fromToken.symbol} -
{" "} -
+
≈${(parseFloat(fromAmount) * fromToken.value).toLocaleString()}
+
+ Balance: {fromToken.balance.toLocaleString()} {fromToken.symbol} + + (${(fromToken.balance * fromToken.value).toLocaleString()}) + +
-
- ≈${(parseFloat(fromAmount) * fromToken.value).toLocaleString()} -
-
- Balance: {fromToken.balance.toLocaleString()} {fromToken.symbol} - - (${(fromToken.balance * fromToken.value).toLocaleString()}) - -
-
+ + {/* Swap Button */} -
- -
+ +
+ +
+
{/* To Section */} -
-
- To -
- + +
+
+ To +
+ - {/* To token dropdown */} - {showToDropdown && ( -
-
-
- - - + {/* To token dropdown */} + {showToDropdown && ( +
+
+
+ + + +
-
-
- {filteredTokens.map((token) => ( -
selectToToken(token)} - > -
- {/* Replaced text with Image component */} -
- {token.symbol} -
-
-
- {token.name} +
+ {filteredTokens.map((token) => ( +
selectToToken(token)} + > +
+ {/* Replaced text with Image component */} +
+ {token.symbol}
-
- {token.symbol} +
+
+ {token.name} +
+
+ {token.symbol} +
-
-
-
- ${(token.balance * token.value).toLocaleString()} +
+
+ ${(token.balance * token.value).toLocaleString()} +
-
- ))} + ))} +
-
- )} + )} +
-
-
-
- handleToAmountChange(e.currentTarget.textContent || "") - } - className="bg-transparent text-2xl sm:text-3xl md:text-4xl font-bold outline-none" - > - {toAmount} -
-
- {toToken.symbol} +
+
+ handleToAmountChange(e.currentTarget.textContent || "") + } + className="bg-transparent text-2xl sm:text-3xl md:text-4xl font-bold outline-none" + > + {toAmount} +
+
+ {toToken.symbol} +
+
+ ≈${(parseFloat(toAmount) * toToken.value).toLocaleString()} +
-
+
≈${(parseFloat(toAmount) * toToken.value).toLocaleString()}
-
-
- ≈${(parseFloat(toAmount) * toToken.value).toLocaleString()} -
-
-
Gas Fee: 0.001 ETH
+
+
Gas Fee: 0.001 ETH
+
-
+ {/* Swap Button */} -
- -
+ +
+ +
+
{/* Activity log */} -
-
-

Activity Log

-
-
- - - - - - - - - - - - {transactions.map((transaction) => ( - - - - - - - - ))} - -
- Date - - From - - To - - Transaction ID - - Status -
+ +
+
+

Activity Log

+
+
+ + + + + + + + + + + + {transactions.map((transaction) => ( + + + + + + + + ))} + +
+ Date + + From + + To + + Transaction ID + + Status +
+ {transaction.date} + +
+ {/* Added logo to transaction history */} +
+ {getTokenImageBySymbol(transaction.fromToken) && ( + {transaction.fromToken} + )} +
+ {transaction.fromAmount.toLocaleString()}{" "} + {transaction.fromToken} +
+
+
+ {/* Added logo to transaction history */} +
+ {getTokenImageBySymbol(transaction.toToken) && ( + {transaction.toToken} + )} +
+ {transaction.toAmount.toLocaleString()}{" "} + {transaction.toToken} +
+
+ {transaction.id} + + {transaction.id.substring(0, 8)}... + + + + {transaction.status} + +
+
+ + {/* Mobile card view - shown only on small screens */} +
+ {transactions.map((transaction) => ( +
+
+ {transaction.date} -
+ + + {transaction.status} + + + +
+
+ From
- {/* Added logo to transaction history */} -
+
{getTokenImageBySymbol(transaction.fromToken) && ( {transaction.fromToken} )}
- {transaction.fromAmount.toLocaleString()}{" "} - {transaction.fromToken} + + {transaction.fromAmount.toLocaleString()}{" "} + {transaction.fromToken} +
-
+ + +
+ + + +
+ +
+ To
- {/* Added logo to transaction history */} -
+
{getTokenImageBySymbol(transaction.toToken) && ( {transaction.toToken} )}
- {transaction.toAmount.toLocaleString()}{" "} - {transaction.toToken} + + {transaction.toAmount.toLocaleString()}{" "} + {transaction.toToken} +
-
- {transaction.id} - - {transaction.id.substring(0, 8)}... - - - - {transaction.status} - -
-
- - {/* Mobile card view - shown only on small screens */} -
- {transactions.map((transaction) => ( -
-
- - {transaction.date} - - - {transaction.status} - -
- -
-
- From -
-
- {getTokenImageBySymbol(transaction.fromToken) && ( - {transaction.fromToken} - )} -
- - {transaction.fromAmount.toLocaleString()}{" "} - {transaction.fromToken} -
-
- - - -
- -
- To -
-
- {getTokenImageBySymbol(transaction.toToken) && ( - {transaction.toToken} - )} -
- - {transaction.toAmount.toLocaleString()}{" "} - {transaction.toToken} +
+
+ TX ID: + + {transaction.id.substring(0, 10)}... + {transaction.id.substring(transaction.id.length - 4)}
- -
-
- TX ID: - - {transaction.id.substring(0, 10)}... - {transaction.id.substring(transaction.id.length - 4)} - -
-
-
- ))} + ))} +
-
+ {/* Success Modal */} !notif.read).length; + const unreadCount = notifications.filter( + (notif: Notification) => !notif.read + ).length; const markAllAsRead = () => { - setNotifications(notifications.map((notif: Notification) => ({ ...notif, read: true }))); + setNotifications( + notifications.map((notif: Notification) => ({ ...notif, read: true })) + ); }; const markAsRead = (id: number) => { setNotifications( - notifications.map((notif: Notification) => + notifications.map((notif: Notification) => notif.id === id ? { ...notif, read: true } : notif ) ); }; // Group notifications by date - const today = notifications.filter(notif => notif.time.includes("h ago") || notif.time === "Now"); - const yesterday = notifications.filter(notif => notif.time === "Yesterday"); - const older = notifications.filter(notif => - !notif.time.includes("h ago") && notif.time !== "Now" && notif.time !== "Yesterday" + const today = notifications.filter( + (notif) => notif.time.includes("h ago") || notif.time === "Now" + ); + const yesterday = notifications.filter((notif) => notif.time === "Yesterday"); + const older = notifications.filter( + (notif) => + !notif.time.includes("h ago") && + notif.time !== "Now" && + notif.time !== "Yesterday" ); return (
-
-

- You have {unreadCount} Unread Notification{unreadCount !== 1 ? 's' : ''} -

- -
+ +
+

+ You have {unreadCount} Unread Notification + {unreadCount !== 1 ? "s" : ""} +

+ +
+
{/* Today's notifications */} {today.length > 0 && (

Today

- {today.map(notification => ( - markAsRead(notification.id)} - /> + {today.map((notification, index) => ( + + {" "} + markAsRead(notification.id)} + /> + ))}
@@ -122,12 +144,15 @@ function Notification() {

Yesterday

- {yesterday.map(notification => ( - markAsRead(notification.id)} - /> + {yesterday.map((notification, index) => ( + + {" "} + markAsRead(notification.id)} + /> + ))}
@@ -138,9 +163,9 @@ function Notification() {

Older

- {older.map(notification => ( - ( + markAsRead(notification.id)} /> @@ -164,9 +189,9 @@ function NotificationCard({ notification, onView }: NotificationCardProps) {
{notification.icon === "profile" ? ( - + ) : ( - claim + claim )}
@@ -176,14 +201,11 @@ function NotificationCard({ notification, onView }: NotificationCardProps) {

{notification.message}

-
); } -export default Notification; \ No newline at end of file +export default Notification; diff --git a/src/app/user-dashboard/plans/components/plansHeaderCard.tsx b/src/app/user-dashboard/plans/components/plansHeaderCard.tsx index ebb9c70..e9bf72d 100644 --- a/src/app/user-dashboard/plans/components/plansHeaderCard.tsx +++ b/src/app/user-dashboard/plans/components/plansHeaderCard.tsx @@ -1,3 +1,4 @@ +import { DirectionAnimation } from "@/motion/Animation"; import { ClockIcon, Users } from "@/svg/Icons"; import { BTCIcon } from "@/svg/tokenSvg"; @@ -32,15 +33,21 @@ export default function PlanCard() {
- {data.icon} + {data.icon}
- {data.detail} + + {data.detail} +
-

{data.amount}

+

+ + {data.amount} + +

diff --git a/src/app/user-dashboard/plans/components/plansTable.tsx b/src/app/user-dashboard/plans/components/plansTable.tsx index 9e8e7b3..3015808 100644 --- a/src/app/user-dashboard/plans/components/plansTable.tsx +++ b/src/app/user-dashboard/plans/components/plansTable.tsx @@ -1,5 +1,6 @@ import { Button } from "@/components/ui/button"; import { plansTableType } from "@/lib/types"; +import { DirectionAnimation } from "@/motion/Animation"; import { BTCIcon } from "@/svg/tokenSvg"; export default function PlanTable({ @@ -12,41 +13,45 @@ export default function PlanTable({ return ( <>
- + + +
- - - - - - - - - - - - - {planTableDetails.map((data: plansTableType) => { - return ( - - - - - - - - ); - })} + +
Plan NameTotal Assets AllocatedBeneficiariesTime-Lock StatusAction
{data.planName}{data.totalAssest}{data.beneficiaries}{data.timeLockStatus} - {data.action} -
+ + + + + + + + - -
Plan NameTotal Assets AllocatedBeneficiariesTime-Lock StatusAction
+ + + {planTableDetails.map((data: plansTableType) => { + return ( + + {data.planName} + {data.totalAssest} + {data.beneficiaries} + {data.timeLockStatus} + + {data.action} + + + ); + })} + + + +
{planTableDetails.map((data: plansTableType, index) => ( diff --git a/src/app/user-dashboard/profile/profile.tsx b/src/app/user-dashboard/profile/profile.tsx index c96f4dc..d89ac9e 100644 --- a/src/app/user-dashboard/profile/profile.tsx +++ b/src/app/user-dashboard/profile/profile.tsx @@ -1,15 +1,15 @@ -'use client'; -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import KYCVerification from './kyc'; -import PendingVerification from './pending'; -import VerifiedDetails from './verified'; - +"use client"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import KYCVerification from "./kyc"; +import PendingVerification from "./pending"; +import VerifiedDetails from "./verified"; +import { DirectionAnimation } from "@/motion/Animation"; enum VerificationStatus { - NotStarted = 'NOT_STARTED', - Pending = 'PENDING', - Verified = 'VERIFIED' + NotStarted = "NOT_STARTED", + Pending = "PENDING", + Verified = "VERIFIED", } interface ProfileField { @@ -20,27 +20,26 @@ interface ProfileField { const Profile: React.FC = () => { const router = useRouter(); const [showKyc, setShowKyc] = useState(false); - - const [verificationStatus, setVerificationStatus] = useState( - VerificationStatus.NotStarted - ); + + const [verificationStatus, setVerificationStatus] = + useState(VerificationStatus.NotStarted); const profileData = { - fullName: 'DANIEL OCHOJA', - emailAddress: 'danielochoja@gmail.com', - dateOfBirth: '24-05-1998', - address: 'No.22, Hawk Street Highway, Ikeja, Lagos', - nationality: 'NIGERIAN', - identityDocumentType: "DRIVER'S LICENSE" + fullName: "DANIEL OCHOJA", + emailAddress: "danielochoja@gmail.com", + dateOfBirth: "24-05-1998", + address: "No.22, Hawk Street Highway, Ikeja, Lagos", + nationality: "NIGERIAN", + identityDocumentType: "DRIVER'S LICENSE", }; const profileFields: ProfileField[] = [ - { label: 'Full Name', value: 'N/A' }, - { label: 'Email Address', value: 'N/A' }, - { label: 'Date of Birth', value: 'N/A' }, - { label: 'Address', value: 'N/A' }, - { label: 'Nationality', value: 'N/A' }, - { label: 'Identity Document Type', value: 'N/A' }, + { label: "Full Name", value: "N/A" }, + { label: "Email Address", value: "N/A" }, + { label: "Date of Birth", value: "N/A" }, + { label: "Address", value: "N/A" }, + { label: "Nationality", value: "N/A" }, + { label: "Identity Document Type", value: "N/A" }, ]; const handleStartKYC = () => { @@ -49,35 +48,53 @@ const Profile: React.FC = () => { }; const renderVerificationComponent = () => { - switch(verificationStatus) { + switch (verificationStatus) { case VerificationStatus.NotStarted: return (
-
-

No Information Yet

-

Start KYC to add profile information

- -
+ +
+

No Information Yet

+

+ Start KYC to add profile information +

+ +
+

Profile Details

- {profileFields.map((field) => ( -
-

{field.label}

-

{field.value}

-
+ {profileFields.map((field, index) => ( + +
+

+ {field.label} +

+

+ {field.value} +

+
+
))}
); case VerificationStatus.Pending: - return showKyc ? : ; + return showKyc ? ( + + ) : ( + + ); case VerificationStatus.Verified: return ; default: @@ -92,4 +109,4 @@ const Profile: React.FC = () => { ); }; -export default Profile; \ No newline at end of file +export default Profile; diff --git a/src/app/user-dashboard/support/support.tsx b/src/app/user-dashboard/support/support.tsx index cdf31a2..f7e4cf7 100644 --- a/src/app/user-dashboard/support/support.tsx +++ b/src/app/user-dashboard/support/support.tsx @@ -1,6 +1,7 @@ import React, { useState, useRef } from "react"; import SuccessModal from "../component/RequestSuccessModal"; import { ChevronDown, Upload } from "lucide-react"; +import { DirectionAnimation } from "@/motion/Animation"; interface FormData { email: string; @@ -104,167 +105,170 @@ const SupportRequestForm: React.FC = () => { return (
-
-
-
- {" "} -

- Submit a Request -

-

- Need help with your inheritance plan or account? If our - FAQs don't - answer your question, submit a support ticket, and our team will - assist you within 24 business hours. -

-
-
-
- - + +
+
+
+ {" "} +

+ Submit a Request +

+

+ Need help with your inheritance plan or account? If our + FAQs + don't answer your question, submit a support ticket, and our + team will assist you within 24 business hours. +

+ +
+ + +
-
- -
- + Subject + +
+ +
+ {SubjectOptions.map((option) => ( +
handleSubjectSelect(option)} + > + {option} +
+ ))} +
+
+
+ +
+ + +
+ +
+
- {SubjectOptions.map((option) => ( -
handleSubjectSelect(option)} - > - {option} + + +
+
+ Drag and Drop Document or{" "} + Browse +
+
+ Supports JPG, PNG (not more than 5 MB) +
+
+ {formData.attachment && ( +
+ {formData.attachment.name}
- ))} + )}
+

+ Please attach a screenshot of any errors or issues to help us + assist you faster. For files over 5 MB or additional images, + reply to your support confirmation email. +

-
- -
- - -
-
- -
- - -
-
- Drag and Drop Document or{" "} - Browse -
-
- Supports JPG, PNG (not more than 5 MB) -
-
- {formData.attachment && ( -
- {formData.attachment.name} -
+ {isSubmitting ? ( + + Submitting... + + ) : ( + "Submit" )} -
-

- Please attach a screenshot of any errors or issues to help us - assist you faster. For files over 5 MB or additional images, - reply to your support confirmation email. -

-
- - - + + +
-
- +
{/* Success Modal */} diff --git a/src/components/WithdrawalModal.tsx b/src/components/WithdrawalModal.tsx new file mode 100644 index 0000000..2bc0410 --- /dev/null +++ b/src/components/WithdrawalModal.tsx @@ -0,0 +1,220 @@ +"use client"; +import { useState } from "react"; +import { Check, CircleCheck, User } from "lucide-react"; +import Image from "next/image"; +import moneyBagIcon from "../../public/modalIcon/moneyIcon.svg"; +import strkImg from "../../public/modalIcon/strk.svg"; +import ethImg from "../../public/modalIcon/ethIcon.png"; +import btcImg from "../../public/modalIcon/bcIcon.png"; + +interface WithdrawalModalProps { + isOpen: boolean; + onClose: () => void; + onSubmit: (amount: string, token: string) => void; +} + +const tokens = [ + { name: "STRK", icon: strkImg }, + { name: "ETH", icon: ethImg }, + { name: "BTC", icon: btcImg }, +]; + +export default function WithdrawalModal({ + isOpen, + onClose, + onSubmit, +}: WithdrawalModalProps) { + const [amount, setAmount] = useState(""); + const [selectedToken, setSelectedToken] = useState(tokens[0]); + const [showTokenDropdown, setShowTokenDropdown] = useState(false); + + if (!isOpen) return null; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onSubmit(amount, selectedToken.name); + }; + + const toggleDropdown = () => { + setShowTokenDropdown((prev) => !prev); + }; + + const handleSelectToken = (token: { name: string; icon: any }) => { + setSelectedToken(token); + setShowTokenDropdown(false); + }; + + return ( +
+
+ {/* Title */} +

+ Withdraw Funds +

+ + {/* Available Funds Card */} +
+
+
+
+ Money Bag +
+

2,500

+

+ Available For Withdrawal +

+
+ + {/* Token Selection */} +
+ + + {/* Dropdown menu */} + {showTokenDropdown && ( +
+ {tokens.map((token) => ( +
handleSelectToken(token)} + className="flex items-center gap-2 px-4 py-2 cursor-pointer hover:bg-[#312d2f]" + > + {token.name} + {token.name} +
+ ))} +
+ )} +
+
+
+ + {/* Recepient Card */} +
+
+
+
Recipient
+
+ +
+
0x0596....0fe3
+
+ + Valid Address +
+
+
+
+ Account Address +
+
+
+
+ + {/* Withdrawal Form */} +
+
+

+ Enter Withdrawal Amount: +

+
+ {/* Token Display (again in form) */} +
+
+ {selectedToken.name} + {selectedToken.name} + + + +
+
+ + setAmount(e.target.value)} + /> +
+ +

+ Minimum Withdrawal Amount:{" "} + + 00 {selectedToken.name} + +

+ + +
+
+ + {/* Close Button */} + +
+
+ ); +} diff --git a/src/components/about/AboutUs.tsx b/src/components/about/AboutUs.tsx index 6465239..f558278 100644 --- a/src/components/about/AboutUs.tsx +++ b/src/components/about/AboutUs.tsx @@ -5,7 +5,7 @@ import { DirectionAnimation } from "@/motion/Animation"; const AboutUs = () => { return ( -
+
diff --git a/src/motion/Animation.tsx b/src/motion/Animation.tsx index 026002a..5d12ab9 100644 --- a/src/motion/Animation.tsx +++ b/src/motion/Animation.tsx @@ -1,3 +1,4 @@ +"use client"; import React, { useEffect, useRef } from "react"; import { motion, useAnimation, useInView } from "framer-motion";