You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.2 KiB
JavaScript

import React, { useEffect, useRef } from 'react'
import { useForm } from '@inertiajs/react'
import Modal from '@/Components/Modal'
import Button from '@/Components/Button'
export default function ImportModal(props) {
const { modalState } = props
const { data, setData, post, progress, processing, errors, clearErrors } =
useForm({
file: null,
})
const inputFileImport = useRef()
const handleReset = () => {
setData({ file: null })
inputFileImport.current.value = ''
clearErrors()
}
const handleCancel = () => {
modalState.toggle()
handleReset()
}
const handleClose = () => {
handleReset()
modalState.toggle()
}
function handleSubmit(e) {
e.preventDefault()
post(route('customer.import'), {
forceFormData: false,
onSuccess: () => Promise.all([handleReset(), modalState.toggle()]),
})
return
}
return (
<Modal
isOpen={modalState.isOpen}
toggle={handleClose}
title={'Import Customer'}
>
<div
className={`flex flex-row items-center gap-2 border rounded-md ${
errors.file && 'border-red-600'
}`}
onClick={() => {
console.log(inputFileImport.current.click())
}}
>
<div className="px-2 py-1 bg-gray-200 hover:bg-gray-400 font-bold rounded-l-md">
Pilih File:{' '}
</div>
<div>{data.file ? data.file.name : 'Pilih File'}</div>
</div>
<div className="text-sm text-red-600">{errors.file}</div>
<input
ref={inputFileImport}
type="file"
className="hidden"
onChange={(e) => setData('file', e.target.files[0])}
/>
{progress && (
<div className="w-full bg-gray-200 rounded-full dark:bg-gray-700">
<div
className="bg-blue-600 text-xs font-medium text-blue-100 text-center p-0.5 leading-none rounded-full"
style={{ width: progress.percentage + '%' }}
>
{' '}
{progress.percentage}%
</div>
</div>
)}
<p className="text-sm text-gray-500">
Unduh format file import{' '}
<a
className="underline text-blue-500"
href="/customers.csv"
download="customers.csv"
>
disini
</a>
</p>
<div className="flex justify-between mt-4 space-x-4">
<Button onClick={handleSubmit} processing={processing}>
Upload
</Button>
<Button
type="secondary"
onClick={handleCancel}
processing={processing}
>
Batal
</Button>
</div>
</Modal>
)
}