import { json, type ActionFunctionArgs, type LoaderFunctionArgs } from '@remix-run/node'; import { Form, useActionData, useLoaderData, useNavigation } from '@remix-run/react'; import { useState } from 'react'; import { requireAuth } from '~/lib/auth-middleware.server'; import { DashboardLayout } from '~/components/layout/DashboardLayout'; import { getAppSettings, updateSettings, type AppSettings, initializeDefaultSettings } from '~/lib/settings-management.server'; export async function loader({ request }: LoaderFunctionArgs) { const user = await requireAuth(request, 2); // Admin level required (1=superadmin, 2=admin) try { // Initialize default settings if needed await initializeDefaultSettings(); const settings = await getAppSettings(); return json({ user, settings, success: true }); } catch (error) { console.error('Settings loader error:', error); return json({ user, settings: null, success: false, error: 'Failed to load settings' }); } } export async function action({ request }: ActionFunctionArgs) { await requireAuth(request, 2); // Admin level required const formData = await request.formData(); const intent = formData.get('intent'); if (intent === 'updateSettings') { try { const settings: Partial = { dateFormat: formData.get('dateFormat') as 'ar-SA' | 'en-US', currency: formData.get('currency') as string, numberFormat: formData.get('numberFormat') as 'ar-SA' | 'en-US', currencySymbol: formData.get('currencySymbol') as string, dateDisplayFormat: formData.get('dateDisplayFormat') as string, }; await updateSettings(settings); return json({ success: true, message: 'Settings updated successfully' }); } catch (error) { console.error('Settings update error:', error); return json({ success: false, error: 'Failed to update settings' }); } } return json({ success: false, error: 'Invalid action' }); } export default function SettingsPage() { const { user, settings, success, error } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const isSubmitting = navigation.state === 'submitting'; const [formData, setFormData] = useState( settings || { dateFormat: 'ar-SA', currency: 'JOD', numberFormat: 'ar-SA', currencySymbol: 'د.أ', dateDisplayFormat: 'dd/MM/yyyy' } ); const handleInputChange = (key: keyof AppSettings, value: string) => { setFormData(prev => ({ ...prev, [key]: value })); }; if (!success || !settings) { return (

خطأ في تحميل الإعدادات

{error || 'Failed to load settings'}

); } return (

⚙️ إعدادات النظام

تكوين إعدادات التطبيق العامة

{actionData?.success && (

✅ {actionData.message}

)} {actionData?.error && (

❌ {actionData.error}

)}
{/* Date Format Settings */}

📅 إعدادات التاريخ

معاينة: {new Date().toLocaleDateString(formData.dateFormat)}

{/* Currency Settings */}

💰 إعدادات العملة

handleInputChange('currencySymbol', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="د.أ" />

معاينة: {(1234.56).toLocaleString(formData.numberFormat, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {formData.currencySymbol}

{/* Number Format Settings */}

🔢 إعدادات الأرقام

معاينة الأرقام: {(123456.789).toLocaleString(formData.numberFormat)}

معاينة الكيلومترات: {(45000).toLocaleString(formData.numberFormat)} كم

{/* Action Buttons */}
{/* Settings Preview Section */}

👁️ معاينة الإعدادات

التاريخ والوقت

التاريخ: {new Date().toLocaleDateString(formData.dateFormat)}

التاريخ والوقت: {new Date().toLocaleString(formData.dateFormat)}

العملة والأرقام

السعر: {(250.75).toLocaleString(formData.numberFormat, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {formData.currencySymbol}

الكيلومترات: {(87500).toLocaleString(formData.numberFormat)} كم

أرقام كبيرة

المبلغ الإجمالي: {(1234567.89).toLocaleString(formData.numberFormat, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} {formData.currencySymbol}

); }