refactor: clean up formatting and indentation in company policy configuration objects

This commit is contained in:
sazzadulalambd
2026-05-06 01:19:00 +06:00
parent 342133cdfd
commit 42a4c8c43b

View File

@@ -384,27 +384,33 @@ const initialSettings: CompanySettings = {
] ]
}, },
rentalTypes: [ rentalTypes: [
{ type: 'single', name: 'Rental (Single)', title: 'Rental (Single)', description: '<h2>Single Person Rental</h2><p>Perfect for individual riders who need a reliable vehicle for daily commute or delivery work.</p><h3>Plan Features</h3><ul><li>Daily, weekly, and monthly options available</li><li>Comprehensive insurance included</li><li>24/7 roadside assistance</li><li>Free maintenance during rental period</li></ul><h3>Pricing</h3><p>Starting from <strong>৳400/day</strong> with deposit of ৳5,000.</p>', rules: [ {
type: 'single', name: 'Rental (Single)', title: 'Rental (Single)', description: '<h2>Single Person Rental</h2><p>Perfect for individual riders who need a reliable vehicle for daily commute or delivery work.</p><h3>Plan Features</h3><ul><li>Daily, weekly, and monthly options available</li><li>Comprehensive insurance included</li><li>24/7 roadside assistance</li><li>Free maintenance during rental period</li></ul><h3>Pricing</h3><p>Starting from <strong>৳400/day</strong> with deposit of ৳5,000.</p>', rules: [
{ name: 'No smoking in vehicles', description: 'Smoking is strictly prohibited inside any vehicle' }, { name: 'No smoking in vehicles', description: 'Smoking is strictly prohibited inside any vehicle' },
{ name: 'Return with same fuel/charge level', description: 'Vehicles must be returned with the same fuel/charge level' }, { name: 'Return with same fuel/charge level', description: 'Vehicles must be returned with the same fuel/charge level' },
{ name: 'No unauthorized drivers', description: 'Only the registered rider is permitted to drive' }, { name: 'No unauthorized drivers', description: 'Only the registered rider is permitted to drive' },
{ name: 'Follow traffic rules', description: 'All traffic laws must be followed' }, { name: 'Follow traffic rules', description: 'All traffic laws must be followed' },
{ name: 'Report accidents within 24 hours', description: 'Any accident must be reported within 24 hours' } { name: 'Report accidents within 24 hours', description: 'Any accident must be reported within 24 hours' }
], enabled: true }, ], enabled: true
{ type: 'shared', name: 'Rental (2 Person Shared)', title: 'Rental (2 Person Shared)', description: '<h2>Shared Rental Plan</h2><p>Ideal for companions or delivery partners who want to share riding costs and responsibilities.</p><h3>Plan Features</h3><ul><li>Split costs between two riders</li><li>Both users must be verified</li><li>Shared liability coverage</li><li>Flexible switch driver feature</li></ul><h3>Pricing</h3><p>Starting from <strong>৳600/day</strong> (৳300 each) with deposit of ৳8,000.</p>', rules: [ },
{
type: 'shared', name: 'Rental (2 Person Shared)', title: 'Rental (2 Person Shared)', description: '<h2>Shared Rental Plan</h2><p>Ideal for companions or delivery partners who want to share riding costs and responsibilities.</p><h3>Plan Features</h3><ul><li>Split costs between two riders</li><li>Both users must be verified</li><li>Shared liability coverage</li><li>Flexible switch driver feature</li></ul><h3>Pricing</h3><p>Starting from <strong>৳600/day</strong> (৳300 each) with deposit of ৳8,000.</p>', rules: [
{ name: 'No smoking in vehicles', description: 'Smoking is strictly prohibited inside any vehicle' }, { name: 'No smoking in vehicles', description: 'Smoking is strictly prohibited inside any vehicle' },
{ name: 'Return with same fuel/charge level', description: 'Vehicles must be returned with the same fuel/charge level' }, { name: 'Return with same fuel/charge level', description: 'Vehicles must be returned with the same fuel/charge level' },
{ name: 'No unauthorized drivers', description: 'Both registered riders are permitted to drive' }, { name: 'No unauthorized drivers', description: 'Both registered riders are permitted to drive' },
{ name: 'Follow traffic rules', description: 'All traffic laws must be followed' }, { name: 'Follow traffic rules', description: 'All traffic laws must be followed' },
{ name: 'Report accidents within 24 hours', description: 'Any accident must be reported within 24 hours' } { name: 'Report accidents within 24 hours', description: 'Any accident must be reported within 24 hours' }
], enabled: true }, ], enabled: true
{ type: 'renttoown', name: 'Rent-to-Own', title: 'Rent-to-Own', description: '<h2>Rent-to-Own Plan</h2><p>Build ownership gradually with our rent-to-own program. After completing the tenure, own the EV outright.</p><h3>Program Benefits</h3><ul><li>50% of rental payments go toward purchase</li><li>Option to buyout anytime</li><li>Full ownership after 36 months</li><li>Transferable to family members</li></ul><h3>Requirements</h3><p>Good payment history required. Credit check applies.</p>', rules: [ },
{
type: 'renttoown', name: 'Rent-to-Own', title: 'Rent-to-Own', description: '<h2>Rent-to-Own Plan</h2><p>Build ownership gradually with our rent-to-own program. After completing the tenure, own the EV outright.</p><h3>Program Benefits</h3><ul><li>50% of rental payments go toward purchase</li><li>Option to buyout anytime</li><li>Full ownership after 36 months</li><li>Transferable to family members</li></ul><h3>Requirements</h3><p>Good payment history required. Credit check applies.</p>', rules: [
{ name: 'No smoking in vehicles', description: 'Smoking is strictly prohibited inside any vehicle' }, { name: 'No smoking in vehicles', description: 'Smoking is strictly prohibited inside any vehicle' },
{ name: 'Return with same fuel/charge level', description: 'Vehicles must be returned with the same fuel/charge level' }, { name: 'Return with same fuel/charge level', description: 'Vehicles must be returned with the same fuel/charge level' },
{ name: 'No unauthorized drivers', description: 'Only the registered rider is permitted to drive' }, { name: 'No unauthorized drivers', description: 'Only the registered rider is permitted to drive' },
{ name: 'Follow traffic rules', description: 'All traffic laws must be followed' }, { name: 'Follow traffic rules', description: 'All traffic laws must be followed' },
{ name: 'Report accidents within 24 hours', description: 'Any accident must be reported within 24 hours' } { name: 'Report accidents within 24 hours', description: 'Any accident must be reported within 24 hours' }
], enabled: true }, ], enabled: true
},
], ],
}, },
rentalPolicy: { rentalPolicy: {
@@ -676,7 +682,7 @@ export default function CompanySettingsPage() {
const [newDocName, setNewDocName] = useState(''); const [newDocName, setNewDocName] = useState('');
const [newDocDesc, setNewDocDesc] = useState(''); const [newDocDesc, setNewDocDesc] = useState('');
const [activeInvestTab, setActiveInvestTab] = useState(0); const [activeInvestTab, setActiveInvestTab] = useState(0);
const [editingPolicy, setEditingPolicy] = useState<{tab: string; index: number} | null>(null); const [editingPolicy, setEditingPolicy] = useState<{ tab: string; index: number } | null>(null);
const [editPolicyName, setEditPolicyName] = useState(''); const [editPolicyName, setEditPolicyName] = useState('');
const [editPolicyDesc, setEditPolicyDesc] = useState(''); const [editPolicyDesc, setEditPolicyDesc] = useState('');
const [editPolicyDescHtml, setEditPolicyDescHtml] = useState(''); const [editPolicyDescHtml, setEditPolicyDescHtml] = useState('');
@@ -760,7 +766,7 @@ export default function CompanySettingsPage() {
setSettings({ ...settings, plans: { ...settings.plans, swapStation: updatedPlans } }); setSettings({ ...settings, plans: { ...settings.plans, swapStation: updatedPlans } });
setActiveSwapTab(updatedPlans.length - 1); setActiveSwapTab(updatedPlans.length - 1);
setAddSwapStationPlan(false); setAddSwapStationPlan(false);
setNewSwapName(''); setNewSwapName('');
} }
}; };
const [activeRiderTab, setActiveRiderTab] = useState(0); const [activeRiderTab, setActiveRiderTab] = useState(0);
@@ -1869,7 +1875,7 @@ setNewSwapName('');
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<h3 className="text-lg font-semibold text-slate-800">Company's Policy</h3> <h3 className="text-lg font-semibold text-slate-800">Company's Policy</h3>
<div className="flex gap-2 border-b border-slate-200 pb-2"> <div className="flex gap-2 border-b border-slate-200">
<button onClick={() => setActiveMasterTab('investor')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${activeMasterTab === 'investor' ? 'border-blue-500 text-blue-600' : 'border-transparent text-slate-500 hover:text-slate-700'}`}>Investor</button> <button onClick={() => setActiveMasterTab('investor')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${activeMasterTab === 'investor' ? 'border-blue-500 text-blue-600' : 'border-transparent text-slate-500 hover:text-slate-700'}`}>Investor</button>
<button onClick={() => setActiveMasterTab('merchant')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${activeMasterTab === 'merchant' ? 'border-blue-500 text-blue-600' : 'border-transparent text-slate-500 hover:text-slate-700'}`}>Merchant</button> <button onClick={() => setActiveMasterTab('merchant')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${activeMasterTab === 'merchant' ? 'border-blue-500 text-blue-600' : 'border-transparent text-slate-500 hover:text-slate-700'}`}>Merchant</button>
<button onClick={() => setActiveMasterTab('swapstation')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${activeMasterTab === 'swapstation' ? 'border-blue-500 text-blue-600' : 'border-transparent text-slate-500 hover:text-slate-700'}`}>Swap Station</button> <button onClick={() => setActiveMasterTab('swapstation')} className={`px-4 py-2 text-sm font-medium border-b-2 -mb-px ${activeMasterTab === 'swapstation' ? 'border-blue-500 text-blue-600' : 'border-transparent text-slate-500 hover:text-slate-700'}`}>Swap Station</button>
@@ -1878,18 +1884,7 @@ setNewSwapName('');
{activeMasterTab === 'investor' && ( {activeMasterTab === 'investor' && (
<div className="space-y-4"> <div className="space-y-4">
<div>
<label className="text-sm text-slate-600">Policy Title</label>
<input type="text" value={settings.companyPolicy?.investor?.title || ''} onChange={(e) => setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, investor: { title: e.target.value, description: settings.companyPolicy?.investor?.description || '', rules: settings.companyPolicy?.investor?.rules || [] } } })} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" />
</div>
<div>
<label className="text-sm text-slate-600">Policy Description</label>
<RichTextEditor value={settings.companyPolicy?.investor?.description || ''} onChange={(val) => setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, investor: { title: settings.companyPolicy?.investor?.title || '', description: val, rules: settings.companyPolicy?.investor?.rules || [] } } })} placeholder="Enter policy description..." minHeight={160} />
</div>
<div className="flex justify-end">
<button onClick={handleSave} className="px-4 py-2 bg-blue-600 text-white rounded-lg text-sm hover:bg-blue-700">Save Changes</button>
</div>
<div className="border-t border-slate-200 pt-4">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<label className="text-sm text-slate-600 font-medium">Policy List</label> <label className="text-sm text-slate-600 font-medium">Policy List</label>
<button onClick={() => setShowAddPolicy(true)} className="text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1"> <button onClick={() => setShowAddPolicy(true)} className="text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1">
@@ -1939,24 +1934,13 @@ setNewSwapName('');
</div> </div>
</div> </div>
)} )}
</div>
</div> </div>
)} )}
{activeMasterTab === 'merchant' && ( {activeMasterTab === 'merchant' && (
<div className="space-y-4"> <div className="space-y-4">
<div>
<label className="text-sm text-slate-600">Policy Title</label>
<input type="text" value={settings.companyPolicy?.merchant?.title || ''} onChange={(e) => setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, merchant: { title: e.target.value, description: settings.companyPolicy?.merchant?.description || '', rules: settings.companyPolicy?.merchant?.rules || [] } } })} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" />
</div>
<div>
<label className="text-sm text-slate-600">Policy Description</label>
<RichTextEditor value={settings.companyPolicy?.merchant?.description || ''} onChange={(val) => setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, merchant: { title: settings.companyPolicy?.merchant?.title || '', description: val, rules: settings.companyPolicy?.merchant?.rules || [] } } })} placeholder="Enter policy description..." minHeight={160} />
</div>
<div className="flex justify-end">
<button onClick={handleSave} className="px-4 py-2 bg-blue-600 text-white rounded-lg text-sm hover:bg-blue-700">Save Changes</button>
</div>
<div className="border-t border-slate-200 pt-4">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<label className="text-sm text-slate-600 font-medium">Policy List</label> <label className="text-sm text-slate-600 font-medium">Policy List</label>
<button onClick={() => setShowAddPolicy(true)} className="text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1"> <button onClick={() => setShowAddPolicy(true)} className="text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1">
@@ -2007,23 +1991,12 @@ setNewSwapName('');
</div> </div>
)} )}
</div> </div>
</div>
)} )}
{activeMasterTab === 'swapstation' && ( {activeMasterTab === 'swapstation' && (
<div className="space-y-4"> <div className="space-y-4">
<div>
<label className="text-sm text-slate-600">Policy Title</label>
<input type="text" value={settings.companyPolicy?.swapStation?.title || ''} onChange={(e) => setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, swapStation: { title: e.target.value, description: settings.companyPolicy?.swapStation?.description || '', rules: settings.companyPolicy?.swapStation?.rules || [] } } })} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm mt-1" />
</div>
<div>
<label className="text-sm text-slate-600">Policy Description</label>
<RichTextEditor value={settings.companyPolicy?.swapStation?.description || ''} onChange={(val) => setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, swapStation: { title: settings.companyPolicy?.swapStation?.title || '', description: val, rules: settings.companyPolicy?.swapStation?.rules || [] } } })} placeholder="Enter policy description..." minHeight={160} />
</div>
<div className="flex justify-end">
<button onClick={handleSave} className="px-4 py-2 bg-blue-600 text-white rounded-lg text-sm hover:bg-blue-700">Save Changes</button>
</div>
<div className="border-t border-slate-200 pt-4">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<label className="text-sm text-slate-600 font-medium">Policy List</label> <label className="text-sm text-slate-600 font-medium">Policy List</label>
<button onClick={() => setShowAddPolicy(true)} className="text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1"> <button onClick={() => setShowAddPolicy(true)} className="text-xs text-blue-600 hover:text-blue-700 flex items-center gap-1">
@@ -2074,28 +2047,18 @@ setNewSwapName('');
</div> </div>
)} )}
</div> </div>
</div>
)} )}
{activeMasterTab === 'rentalType' && ( {activeMasterTab === 'rentalType' && (
<div className="space-y-6"> <div className="space-y-6">
{(settings.companyPolicy?.rentalTypes || []).map((rtype, idx) => ( {(settings.companyPolicy?.rentalTypes || []).map((rtype, idx) => (
<div key={idx} className="border border-slate-200 rounded-lg overflow-hidden"> <div key={idx} className="border border-slate-200 rounded-lg overflow-hidden">
<div className="bg-slate-50 px-4 py-3 flex items-center justify-between"> <div className="bg-slate-50 px-4 py-3">
<h4 className="font-medium text-slate-700">{rtype.name}</h4> <h4 className="font-medium text-slate-700">{rtype.name}</h4>
</div> </div>
<div className="p-4 space-y-3"> <div className="p-4 space-y-4">
<input type="text" value={rtype.title} onChange={(e) => {
const updated = [...(settings.companyPolicy?.rentalTypes || [])];
updated[idx] = { ...updated[idx], title: e.target.value };
setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, rentalTypes: updated } });
}} className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm" placeholder="Policy Title" />
<RichTextEditor value={rtype.description} onChange={(val) => {
const updated = [...(settings.companyPolicy?.rentalTypes || [])];
updated[idx] = { ...updated[idx], description: val };
setSettings({ ...settings, companyPolicy: { ...settings.companyPolicy, rentalTypes: updated } });
}} placeholder="Enter policy description..." minHeight={120} />
<div className="border-t border-slate-200 pt-4 mt-4">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">
<label className="text-sm text-slate-600 font-medium">Policy List</label> <label className="text-sm text-slate-600 font-medium">Policy List</label>
</div> </div>
@@ -2165,7 +2128,7 @@ setNewSwapName('');
)} )}
</div> </div>
</div> </div>
</div>
))} ))}
<div className="flex justify-end"> <div className="flex justify-end">
<button onClick={handleSave} className="px-4 py-2 bg-blue-600 text-white rounded-lg text-sm hover:bg-blue-700">Save Changes</button> <button onClick={handleSave} className="px-4 py-2 bg-blue-600 text-white rounded-lg text-sm hover:bg-blue-700">Save Changes</button>
@@ -2173,9 +2136,11 @@ setNewSwapName('');
</div> </div>
)} )}
</div> </div>
)} )
}
{activeTab === 'plans' && ( {
activeTab === 'plans' && (
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h3 className="text-lg font-semibold text-slate-800">Plan Selection</h3> <h3 className="text-lg font-semibold text-slate-800">Plan Selection</h3>
@@ -2400,9 +2365,11 @@ setNewSwapName('');
</div> </div>
)} )}
</div> </div>
)} )
}
{(activeTab as string) === 'investment' && ( {
(activeTab as string) === 'investment' && (
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h3 className="text-lg font-semibold text-slate-800">Investment Plans</h3> <h3 className="text-lg font-semibold text-slate-800">Investment Plans</h3>
@@ -2588,9 +2555,11 @@ setNewSwapName('');
</div> </div>
))} ))}
</div> </div>
)} )
}
{(activeTab as string) === 'swapstation' && ( {
(activeTab as string) === 'swapstation' && (
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h3 className="text-lg font-semibold text-slate-800">Swap Station Plans</h3> <h3 className="text-lg font-semibold text-slate-800">Swap Station Plans</h3>
@@ -2740,9 +2709,11 @@ setNewSwapName('');
</div> </div>
))} ))}
</div> </div>
)} )
}
{(activeTab as string) === 'riderrequest' && ( {
(activeTab as string) === 'riderrequest' && (
<div className="p-6 space-y-6"> <div className="p-6 space-y-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h3 className="text-lg font-semibold text-slate-800">Rider Request Plans</h3> <h3 className="text-lg font-semibold text-slate-800">Rider Request Plans</h3>
@@ -2916,11 +2887,12 @@ setNewSwapName('');
</div> </div>
))} ))}
</div> </div>
)} )
</div> }
</div> </div >
</div >
</div> </div >
); );
} }