Skip to content

Commit fc20ea8

Browse files
feat: make payment methods selectable with interactive state and visual feedback
1 parent cca795d commit fc20ea8

1 file changed

Lines changed: 40 additions & 10 deletions

File tree

src/components/CheckoutModal.tsx

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { motion, AnimatePresence } from "framer-motion";
22
import { Plane, Hotel, MapPin, X, CreditCard, Wallet, CheckCircle2 } from "lucide-react";
3+
import { useState } from "react";
34

45
interface ItineraryItem {
56
type: 'flight' | 'hotel' | 'activity';
@@ -9,6 +10,8 @@ interface ItineraryItem {
910
}
1011

1112
export const CheckoutModal = ({ items, total, onConfirm, onClose }: { items: ItineraryItem[], total: number, onConfirm: () => void, onClose: () => void }) => {
13+
const [selectedMethod, setSelectedMethod] = useState<'regional' | 'international' | 'web3'>('international');
14+
1215
return (
1316
<motion.div
1417
initial={{ opacity: 0 }}
@@ -69,36 +72,63 @@ export const CheckoutModal = ({ items, total, onConfirm, onClose }: { items: Iti
6972

7073
<h3 className="text-sm font-bold uppercase tracking-widest text-slate-500 mb-6">Financial Orchestration</h3>
7174
<div className="space-y-4 mb-10">
72-
<div className="p-4 rounded-2xl border border-slate-800 bg-slate-900/30 hover:border-cyan-500/50 hover:bg-cyan-500/5 transition-all cursor-pointer group">
75+
<div
76+
onClick={() => setSelectedMethod('regional')}
77+
className={`p-4 rounded-2xl border transition-all cursor-pointer group ${
78+
selectedMethod === 'regional'
79+
? 'border-emerald-500 bg-emerald-500/10 shadow-[0_0_20px_rgba(16,185,129,0.1)]'
80+
: 'border-slate-800 bg-slate-900/30 hover:border-slate-700'
81+
}`}
82+
>
7383
<div className="flex items-center gap-3 mb-2">
74-
<div className="h-8 w-8 rounded-lg bg-emerald-500/10 flex items-center justify-center text-emerald-400">
84+
<div className={`h-8 w-8 rounded-lg flex items-center justify-center transition-colors ${
85+
selectedMethod === 'regional' ? 'bg-emerald-500 text-slate-900' : 'bg-emerald-500/10 text-emerald-400'
86+
}`}>
7587
<CheckCircle2 className="h-4 w-4" />
7688
</div>
77-
<span className="font-bold text-white text-sm">Regional Excellence</span>
89+
<span className={`font-bold text-sm transition-colors ${selectedMethod === 'regional' ? 'text-white' : 'text-slate-300'}`}>Regional Excellence</span>
7890
</div>
7991
<p className="text-[10px] text-slate-500 leading-relaxed">
8092
Instant settlement via MTN MoMo or Airtel Money for local convenience.
8193
</p>
8294
</div>
8395

84-
<div className="p-4 rounded-2xl border-2 border-cyan-500/50 bg-cyan-500/10 text-white cursor-pointer group">
96+
<div
97+
onClick={() => setSelectedMethod('international')}
98+
className={`p-4 rounded-2xl border transition-all cursor-pointer group ${
99+
selectedMethod === 'international'
100+
? 'border-cyan-500 bg-cyan-500/10 shadow-[0_0_20px_rgba(6,182,212,0.1)]'
101+
: 'border-slate-800 bg-slate-900/30 hover:border-slate-700'
102+
}`}
103+
>
85104
<div className="flex items-center gap-3 mb-2">
86-
<div className="h-8 w-8 rounded-lg bg-cyan-500/20 flex items-center justify-center text-cyan-400">
105+
<div className={`h-8 w-8 rounded-lg flex items-center justify-center transition-colors ${
106+
selectedMethod === 'international' ? 'bg-cyan-500 text-slate-900' : 'bg-cyan-500/10 text-cyan-400'
107+
}`}>
87108
<CreditCard className="h-4 w-4" />
88109
</div>
89-
<span className="font-bold text-sm">International Standards</span>
110+
<span className={`font-bold text-sm transition-colors ${selectedMethod === 'international' ? 'text-white' : 'text-slate-300'}`}>International Standards</span>
90111
</div>
91-
<p className="text-[10px] text-cyan-200/50 leading-relaxed">
112+
<p className="text-[10px] text-slate-500 leading-relaxed">
92113
Secured with world-class encryption via Stripe or PayPal.
93114
</p>
94115
</div>
95116

96-
<div className="p-4 rounded-2xl border border-slate-800 bg-slate-900/30 hover:border-purple-500/50 hover:bg-purple-500/5 transition-all cursor-pointer group">
117+
<div
118+
onClick={() => setSelectedMethod('web3')}
119+
className={`p-4 rounded-2xl border transition-all cursor-pointer group ${
120+
selectedMethod === 'web3'
121+
? 'border-purple-500 bg-purple-500/10 shadow-[0_0_20px_rgba(168,85,247,0.1)]'
122+
: 'border-slate-800 bg-slate-900/30 hover:border-slate-700'
123+
}`}
124+
>
97125
<div className="flex items-center gap-3 mb-2">
98-
<div className="h-8 w-8 rounded-lg bg-purple-500/10 flex items-center justify-center text-purple-400">
126+
<div className={`h-8 w-8 rounded-lg flex items-center justify-center transition-colors ${
127+
selectedMethod === 'web3' ? 'bg-purple-500 text-white' : 'bg-purple-500/10 text-purple-400'
128+
}`}>
99129
<Wallet className="h-4 w-4" />
100130
</div>
101-
<span className="font-bold text-white text-sm">Web3 & Cross-Border</span>
131+
<span className={`font-bold text-sm transition-colors ${selectedMethod === 'web3' ? 'text-white' : 'text-slate-300'}`}>Web3 & Cross-Border</span>
102132
</div>
103133
<p className="text-[10px] text-slate-500 leading-relaxed">
104134
Optimized conversion path via MiniPay or Wise.

0 commit comments

Comments
 (0)