fix: photo upload issues with file limit and date formatting
- Add 20-file limit validation to PhotoUpload component - Prevent Multer "Unexpected field" errors by enforcing client-side limit - Fix JSON parsing error in dateFormatter when value is already an object - Add missing translation keys for upload error messages - Handle both string and object values for date format settings These fixes resolve the 400 error when uploading more than 20 files and the "Unexpected token o in JSON" error during email queue creation. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -11,7 +11,21 @@ async function formatDate(date, language = 'en') {
|
|||||||
try {
|
try {
|
||||||
// Get date format setting from database
|
// Get date format setting from database
|
||||||
const setting = await db('app_settings').where('setting_key', 'general_date_format').first();
|
const setting = await db('app_settings').where('setting_key', 'general_date_format').first();
|
||||||
const dateConfig = setting ? JSON.parse(setting.setting_value) : DEFAULT_FORMAT;
|
let dateConfig = DEFAULT_FORMAT;
|
||||||
|
|
||||||
|
if (setting && setting.setting_value) {
|
||||||
|
// Handle both string and object values
|
||||||
|
if (typeof setting.setting_value === 'string') {
|
||||||
|
try {
|
||||||
|
dateConfig = JSON.parse(setting.setting_value);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Failed to parse date format setting:', e.message);
|
||||||
|
dateConfig = DEFAULT_FORMAT;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dateConfig = setting.setting_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const dateObj = date instanceof Date ? date : new Date(date);
|
const dateObj = date instanceof Date ? date : new Date(date);
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 450 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 390 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 412 KiB |
@@ -32,6 +32,20 @@ export const PhotoUpload: React.FC<PhotoUploadProps> = ({ eventId, onUploadCompl
|
|||||||
const imageFiles = files.filter(file =>
|
const imageFiles = files.filter(file =>
|
||||||
['image/jpeg', 'image/png', 'image/webp'].includes(file.type)
|
['image/jpeg', 'image/png', 'image/webp'].includes(file.type)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Check total file count with existing files
|
||||||
|
const totalFiles = selectedFiles.length + imageFiles.length;
|
||||||
|
if (totalFiles > 20) {
|
||||||
|
const allowedNewFiles = 20 - selectedFiles.length;
|
||||||
|
if (allowedNewFiles <= 0) {
|
||||||
|
toast.error(t('upload.maxFilesReached') || 'Maximum 20 files allowed');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toast.warning(t('upload.someFilesSkipped') || `Only ${allowedNewFiles} more files can be added (20 max)`);
|
||||||
|
setSelectedFiles(prev => [...prev, ...imageFiles.slice(0, allowedNewFiles)]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setSelectedFiles(prev => [...prev, ...imageFiles]);
|
setSelectedFiles(prev => [...prev, ...imageFiles]);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -41,6 +55,12 @@ export const PhotoUpload: React.FC<PhotoUploadProps> = ({ eventId, onUploadCompl
|
|||||||
|
|
||||||
const handleUpload = async () => {
|
const handleUpload = async () => {
|
||||||
if (selectedFiles.length === 0) return;
|
if (selectedFiles.length === 0) return;
|
||||||
|
|
||||||
|
// Validate file count
|
||||||
|
if (selectedFiles.length > 20) {
|
||||||
|
toast.error(t('upload.tooManyFiles') || 'Maximum 20 files can be uploaded at once');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setIsUploading(true);
|
setIsUploading(true);
|
||||||
setUploadProgress(0);
|
setUploadProgress(0);
|
||||||
|
|||||||
@@ -47,7 +47,10 @@
|
|||||||
"uploadComplete": "Upload complete!",
|
"uploadComplete": "Upload complete!",
|
||||||
"uploadFailed": "Upload failed",
|
"uploadFailed": "Upload failed",
|
||||||
"someFilesFailed": "Some files failed to upload",
|
"someFilesFailed": "Some files failed to upload",
|
||||||
"uploadPhotos": "Upload Photos"
|
"uploadPhotos": "Upload Photos",
|
||||||
|
"maxFilesReached": "Maximum 20 files allowed",
|
||||||
|
"someFilesSkipped": "Some files were skipped (20 file limit)",
|
||||||
|
"tooManyFiles": "Maximum 20 files can be uploaded at once"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
|
|||||||
Reference in New Issue
Block a user