1+ 'use client'
2+
3+ import { useState , useEffect } from 'react'
4+ import { useAccount } from 'wagmi'
5+ import { useMakerDetails } from '@/lib/useContracts'
6+ import { useMakerSettings } from '@/lib/useMakerSettings'
7+ import { useRouter } from 'next/navigation'
8+
9+ export default function SettingsPage ( ) {
10+ const { address, isConnected } = useAccount ( )
11+ const { isRegistered } = useMakerDetails ( address || '' )
12+ const { settings, loading, updateSettings, resetSettings } = useMakerSettings ( )
13+ const router = useRouter ( )
14+
15+ const [ formData , setFormData ] = useState ( {
16+ defaultStartPrice : '90.00' ,
17+ defaultEndPrice : '80.00'
18+ } )
19+ const [ saved , setSaved ] = useState ( false )
20+
21+ // Redirect if not connected or not registered
22+ useEffect ( ( ) => {
23+ if ( ! isConnected || ( isConnected && ! isRegistered ) ) {
24+ router . push ( '/' )
25+ }
26+ } , [ isConnected , isRegistered , router ] )
27+
28+ // Update form data when settings change
29+ useEffect ( ( ) => {
30+ setFormData ( {
31+ defaultStartPrice : settings . defaultStartPrice ,
32+ defaultEndPrice : settings . defaultEndPrice
33+ } )
34+ } , [ settings ] )
35+
36+ const handleInputChange = ( field : string , value : string ) => {
37+ setFormData ( prev => ( {
38+ ...prev ,
39+ [ field ] : value
40+ } ) )
41+ setSaved ( false )
42+ }
43+
44+ const handleSave = async ( ) => {
45+ if ( ! address || ! isRegistered ) return
46+
47+ const success = await updateSettings ( formData )
48+ if ( success ) {
49+ setSaved ( true )
50+ // Auto-hide the saved message after 3 seconds
51+ setTimeout ( ( ) => setSaved ( false ) , 3000 )
52+ }
53+ }
54+
55+ const handleReset = async ( ) => {
56+ await resetSettings ( )
57+ setSaved ( false )
58+ }
59+
60+ if ( ! isConnected || ! isRegistered ) {
61+ return null // Will redirect via useEffect
62+ }
63+
64+ return (
65+ < div className = "min-h-screen bg-gray-50 py-8" >
66+ < div className = "max-w-3xl mx-auto px-4 sm:px-6 lg:px-8" >
67+ < div className = "bg-white shadow-lg rounded-lg" >
68+ < div className = "px-6 py-4 border-b border-gray-200" >
69+ < h1 className = "text-2xl font-bold text-gray-900" > Maker Settings</ h1 >
70+ < p className = "text-sm text-gray-600 mt-1" >
71+ Configure your default order parameters
72+ </ p >
73+ </ div >
74+
75+ < div className = "px-6 py-6 space-y-6" >
76+ { /* Start Price (INR per PYUSD) */ }
77+ < div >
78+ < label htmlFor = "defaultStartPrice" className = "block text-sm font-medium text-gray-700 mb-2" >
79+ Start Price (INR per PYUSD)
80+ </ label >
81+ < input
82+ type = "number"
83+ id = "defaultStartPrice"
84+ step = "0.01"
85+ min = "0"
86+ placeholder = "90.00"
87+ value = { formData . defaultStartPrice }
88+ onChange = { ( e ) => handleInputChange ( 'defaultStartPrice' , e . target . value ) }
89+ className = "block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm placeholder-gray-700"
90+ />
91+ < p className = "text-xs text-blue-500 mt-1" >
92+ Starting price in INR per token (Dutch auction starts high)
93+ </ p >
94+ </ div >
95+
96+ { /* End Price (INR per PYUSD) */ }
97+ < div >
98+ < label htmlFor = "defaultEndPrice" className = "block text-sm font-medium text-gray-700 mb-2" >
99+ End Price (INR per PYUSD)
100+ </ label >
101+ < input
102+ type = "number"
103+ id = "defaultEndPrice"
104+ step = "0.01"
105+ min = "0"
106+ placeholder = "80.00"
107+ value = { formData . defaultEndPrice }
108+ onChange = { ( e ) => handleInputChange ( 'defaultEndPrice' , e . target . value ) }
109+ className = "block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm placeholder-gray-700"
110+ />
111+ < p className = "text-xs text-blue-500 mt-1" >
112+ Ending price in INR per token (Dutch auction ends low)
113+ </ p >
114+ < p className = "text-xs text-red-500 mt-1" >
115+ < strong > Note:</ strong > Start price must be higher than end price for the Dutch auction mechanism
116+ </ p >
117+ </ div >
118+
119+ { /* Price Validation */ }
120+ { formData . defaultStartPrice && formData . defaultEndPrice &&
121+ parseFloat ( formData . defaultStartPrice ) <= parseFloat ( formData . defaultEndPrice ) && (
122+ < div className = "bg-yellow-50 border border-yellow-200 rounded-md p-3" >
123+ < div className = "flex" >
124+ < div className = "flex-shrink-0" >
125+ < svg className = "h-5 w-5 text-yellow-400" viewBox = "0 0 20 20" fill = "currentColor" >
126+ < path fillRule = "evenodd" d = "M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule = "evenodd" />
127+ </ svg >
128+ </ div >
129+ < div className = "ml-3" >
130+ < p className = "text-sm text-yellow-800" >
131+ < strong > Warning:</ strong > End price should typically be lower than start price for Dutch auctions.
132+ </ p >
133+ </ div >
134+ </ div >
135+ </ div >
136+ ) }
137+
138+ { /* Success Message */ }
139+ { saved && (
140+ < div className = "bg-green-50 border border-green-200 rounded-md p-3" >
141+ < div className = "flex" >
142+ < div className = "flex-shrink-0" >
143+ < svg className = "h-5 w-5 text-green-400" viewBox = "0 0 20 20" fill = "currentColor" >
144+ < path fillRule = "evenodd" d = "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule = "evenodd" />
145+ </ svg >
146+ </ div >
147+ < div className = "ml-3" >
148+ < p className = "text-sm text-green-800" >
149+ Settings saved successfully!
150+ </ p >
151+ </ div >
152+ </ div >
153+ </ div >
154+ ) }
155+ </ div >
156+
157+ { /* Action Buttons */ }
158+ < div className = "px-6 py-4 bg-gray-50 border-t border-gray-200 flex justify-between" >
159+ < button
160+ type = "button"
161+ onClick = { handleReset }
162+ className = "px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
163+ >
164+ Reset to Default
165+ </ button >
166+
167+ < button
168+ type = "button"
169+ onClick = { handleSave }
170+ disabled = { loading }
171+ className = "px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"
172+ >
173+ { loading ? 'Saving...' : 'Save Settings' }
174+ </ button >
175+ </ div >
176+ </ div >
177+
178+ { /* Additional Information */ }
179+ < div className = "mt-6 bg-blue-50 border border-blue-200 rounded-md p-4" >
180+ < div className = "flex" >
181+ < div className = "flex-shrink-0" >
182+ < svg className = "h-5 w-5 text-blue-400" viewBox = "0 0 20 20" fill = "currentColor" >
183+ < path fillRule = "evenodd" d = "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clipRule = "evenodd" />
184+ </ svg >
185+ </ div >
186+ < div className = "ml-3" >
187+ < h3 className = "text-sm font-medium text-blue-800" > About Default Prices</ h3 >
188+ < div className = "mt-2 text-sm text-blue-700" >
189+ < ul className = "list-disc pl-5 space-y-1" >
190+ < li > These default values will be automatically filled when you create new orders</ li >
191+ < li > You can always modify the prices when creating individual orders</ li >
192+ < li > Settings are stored locally in your browser and tied to your wallet address</ li >
193+ < li > For Dutch auctions, the start price should typically be higher than the end price</ li >
194+ </ ul >
195+ </ div >
196+ </ div >
197+ </ div >
198+ </ div >
199+ </ div >
200+ </ div >
201+ )
202+ }
0 commit comments