2023-05-13 16:29:06 -04:00
|
|
|
import { useState } from 'react';
|
2023-04-04 23:18:58 -04:00
|
|
|
import { FileUp } from 'lucide-react';
|
2023-05-13 16:29:06 -04:00
|
|
|
import { cn } from '~/utils/';
|
2023-04-05 21:21:02 +08:00
|
|
|
|
2023-05-18 11:09:31 -07:00
|
|
|
const FileUpload = ({
|
|
|
|
|
onFileSelected,
|
|
|
|
|
successText = null,
|
|
|
|
|
invalidText = null,
|
|
|
|
|
validator = null,
|
|
|
|
|
text = null,
|
|
|
|
|
id = '1'
|
|
|
|
|
}) => {
|
2023-05-13 16:29:06 -04:00
|
|
|
const [statusColor, setStatusColor] = useState('text-gray-600');
|
|
|
|
|
const [status, setStatus] = useState(null);
|
2023-04-04 23:18:58 -04:00
|
|
|
|
2023-05-18 11:09:31 -07:00
|
|
|
const handleFileChange = (event) => {
|
2023-04-04 23:18:58 -04:00
|
|
|
const file = event.target.files[0];
|
|
|
|
|
if (!file) return;
|
|
|
|
|
|
|
|
|
|
const reader = new FileReader();
|
2023-05-18 11:09:31 -07:00
|
|
|
reader.onload = (e) => {
|
2023-04-04 23:18:58 -04:00
|
|
|
const jsonData = JSON.parse(e.target.result);
|
2023-05-13 16:29:06 -04:00
|
|
|
if (validator && !validator(jsonData)) {
|
|
|
|
|
setStatus('invalid');
|
|
|
|
|
setStatusColor('text-red-600');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (validator) {
|
|
|
|
|
setStatus('success');
|
|
|
|
|
setStatusColor('text-green-500 dark:text-green-500');
|
|
|
|
|
}
|
2023-05-18 11:09:31 -07:00
|
|
|
|
2023-05-13 16:29:06 -04:00
|
|
|
onFileSelected(jsonData);
|
2023-04-04 23:18:58 -04:00
|
|
|
};
|
|
|
|
|
reader.readAsText(file);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<label
|
2023-05-13 16:29:06 -04:00
|
|
|
htmlFor={`file-upload-${id}`}
|
|
|
|
|
className={cn(
|
|
|
|
|
'mr-1 flex h-auto cursor-pointer items-center rounded bg-transparent px-2 py-1 text-xs font-medium font-normal transition-colors hover:bg-slate-200 hover:text-green-700 dark:bg-transparent dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-green-500',
|
|
|
|
|
statusColor
|
|
|
|
|
)}
|
2023-04-04 23:18:58 -04:00
|
|
|
>
|
2023-04-10 00:41:34 +08:00
|
|
|
<FileUp className="mr-1 flex w-[22px] items-center stroke-1" />
|
2023-05-18 11:09:31 -07:00
|
|
|
<span className="flex text-xs ">
|
|
|
|
|
{!status ? text || 'Import' : status === 'success' ? successText : invalidText}
|
|
|
|
|
</span>
|
2023-04-04 23:18:58 -04:00
|
|
|
<input
|
2023-05-13 16:29:06 -04:00
|
|
|
id={`file-upload-${id}`}
|
2023-04-05 16:16:11 +08:00
|
|
|
value=""
|
2023-04-04 23:18:58 -04:00
|
|
|
type="file"
|
|
|
|
|
className="hidden "
|
|
|
|
|
accept=".json"
|
|
|
|
|
onChange={handleFileChange}
|
|
|
|
|
/>
|
|
|
|
|
</label>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default FileUpload;
|