11"use client" ;
22
3- import { useState , memo , useMemo } from 'react' ;
3+ import { useState , memo , useMemo , useEffect } from 'react' ;
4+ import { useForm } from 'react-hook-form' ;
5+ import { zodResolver } from '@hookform/resolvers/zod' ;
6+ import { editPaymentLinkSchema , type EditPaymentLinkFormValues } from '@/lib/utils/validation' ;
47import { Card , CardContent , CardHeader , CardTitle , CardDescription , Button , Input , Label } from '@/components/ui' ;
58import { CopyAddress , EmptyState , ErrorDisplay } from '@/components/shared' ;
69import { PageHeader } from '@/components/shared/PageHeader' ;
@@ -166,8 +169,24 @@ export default function PaymentsPage() {
166169 resetForm ( ) ;
167170 } ;
168171
169- const handleEditSubmit = ( e : React . FormEvent ) => {
170- e . preventDefault ( ) ;
172+ const { register : registerEdit , handleSubmit : handleEditSubmitForm , reset : resetEditForm , formState : { errors : editErrors } } = useForm < EditPaymentLinkFormValues > ( {
173+ resolver : zodResolver ( editPaymentLinkSchema ) ,
174+ } ) ;
175+
176+ useEffect ( ( ) => {
177+ if ( editingLink ) {
178+ resetEditForm ( {
179+ label : editingLink . source ?? '' ,
180+ amount : editingLink . amountUsdc ? String ( editingLink . amountUsdc ) : '' ,
181+ currency : editingLink . amountUsdc ? 'USDC' : 'XLM' ,
182+ expiry : '' ,
183+ redirectUrl : '' ,
184+ reference : '' ,
185+ } ) ;
186+ }
187+ } , [ editingLink , resetEditForm ] ) ;
188+
189+ const handleEditSubmit = ( data : EditPaymentLinkFormValues ) => {
171190 notifySuccess ( 'Payment link updated successfully' ) ;
172191 setEditingLink ( null ) ;
173192 } ;
@@ -227,10 +246,16 @@ export default function PaymentsPage() {
227246
228247 < div className = "space-y-3" >
229248 < Label > Payment Mode</ Label >
230- < div className = "flex rounded-lg border border-border/50 bg-background/50 p-0.5" >
249+ < div
250+ role = "tablist"
251+ aria-label = "Payment mode"
252+ className = "flex rounded-lg border border-border/50 bg-background/50 p-0.5"
253+ >
231254 < button
232255 type = "button"
233- className = { `flex-1 rounded-md py-2 text-sm font-medium transition-colors ${
256+ role = "tab"
257+ aria-selected = { currencyMode === 'single' }
258+ className = { `flex-1 rounded-md py-2 text-sm font-medium transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${
234259 currencyMode === 'single'
235260 ? 'bg-primary text-primary-foreground shadow-sm'
236261 : 'text-muted-foreground hover:text-foreground'
@@ -241,7 +266,9 @@ export default function PaymentsPage() {
241266 </ button >
242267 < button
243268 type = "button"
244- className = { `flex-1 rounded-md py-2 text-sm font-medium transition-colors ${
269+ role = "tab"
270+ aria-selected = { currencyMode === 'multi' }
271+ className = { `flex-1 rounded-md py-2 text-sm font-medium transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${
245272 currencyMode === 'multi'
246273 ? 'bg-primary text-primary-foreground shadow-sm'
247274 : 'text-muted-foreground hover:text-foreground'
@@ -463,21 +490,86 @@ export default function PaymentsPage() {
463490
464491 { /* Edit Dialog */ }
465492 < Dialog open = { ! ! editingLink } onOpenChange = { ( open ) => ! open && setEditingLink ( null ) } >
466- < DialogContent className = "sm:max-w-[425px] bg-card border-border/50" >
493+ < DialogContent className = "sm:max-w-[425px] bg-card border-border/50 max-h-[85dvh] overflow-y-auto " >
467494 < DialogHeader >
468495 < DialogTitle > Edit Payment Link</ DialogTitle >
469496 < DialogDescription > Update details for { editingLink ?. source } </ DialogDescription >
470497 </ DialogHeader >
471- < form onSubmit = { handleEditSubmit } className = "space-y-4 py-2" >
498+ < form onSubmit = { handleEditSubmitForm ( handleEditSubmit ) } className = "space-y-4 py-2" >
472499 < div className = "space-y-2" >
473500 < Label htmlFor = "edit-title" > Title / Label</ Label >
474- < Input id = "edit-title" defaultValue = { editingLink ?. source ?? '' } />
501+ < Input
502+ id = "edit-title"
503+ className = "bg-background/50 border-border/50"
504+ { ...registerEdit ( 'label' ) }
505+ />
506+ { editErrors . label && (
507+ < p className = "text-xs text-destructive mt-1" > { editErrors . label . message } </ p >
508+ ) }
509+ </ div >
510+
511+ < div className = "grid grid-cols-2 gap-3" >
512+ < div className = "space-y-2" >
513+ < Label htmlFor = "edit-amount" > Amount (Optional)</ Label >
514+ < Input
515+ id = "edit-amount"
516+ type = "number"
517+ placeholder = "0.00"
518+ className = "bg-background/50 border-border/50"
519+ { ...registerEdit ( 'amount' ) }
520+ />
521+ { editErrors . amount && (
522+ < p className = "text-xs text-destructive mt-1" > { editErrors . amount . message } </ p >
523+ ) }
524+ </ div >
525+ < div className = "space-y-2" >
526+ < Label htmlFor = "edit-currency" > Currency</ Label >
527+ < select
528+ id = "edit-currency"
529+ className = "flex h-10 w-full rounded-md border border-input border-border/50 bg-background/50 px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
530+ { ...registerEdit ( 'currency' ) }
531+ >
532+ < option value = "USDC" > USDC</ option >
533+ < option value = "XLM" > XLM</ option >
534+ < option value = "USDT" > USDT</ option >
535+ </ select >
536+ </ div >
537+ </ div >
538+
539+ < div className = "space-y-2" >
540+ < Label htmlFor = "edit-reference" > Internal Reference</ Label >
541+ < Input
542+ id = "edit-reference"
543+ placeholder = "e.g. INV-2026-001"
544+ className = "bg-background/50 border-border/50"
545+ { ...registerEdit ( 'reference' ) }
546+ />
547+ </ div >
548+
549+ < div className = "space-y-2" >
550+ < Label htmlFor = "edit-expiry" > Expiry Date</ Label >
551+ < Input
552+ id = "edit-expiry"
553+ type = "date"
554+ className = "bg-background/50 border-border/50"
555+ { ...registerEdit ( 'expiry' ) }
556+ />
475557 </ div >
558+
476559 < div className = "space-y-2" >
477- < Label htmlFor = "edit-amount" > Amount (USDC)</ Label >
478- < Input id = "edit-amount" type = "number" defaultValue = { editingLink ?. amountUsdc ?? 0 } />
560+ < Label htmlFor = "edit-redirect" > Redirect URL (On success)</ Label >
561+ < Input
562+ id = "edit-redirect"
563+ placeholder = "https://yourstore.com/thank-you"
564+ className = "bg-background/50 border-border/50"
565+ { ...registerEdit ( 'redirectUrl' ) }
566+ />
567+ { editErrors . redirectUrl && (
568+ < p className = "text-xs text-destructive mt-1" > { editErrors . redirectUrl . message } </ p >
569+ ) }
479570 </ div >
480- < DialogFooter >
571+
572+ < DialogFooter className = "pt-4" >
481573 < Button type = "button" variant = "ghost" onClick = { ( ) => setEditingLink ( null ) } > Cancel</ Button >
482574 < Button type = "submit" > Save Changes</ Button >
483575 </ DialogFooter >
0 commit comments