Cara Kerja Dropup
Dropup dibangun dengan konsep headless UI - menangani semua logika upload file yang kompleks sambil memberi Anda kontrol penuh atas presentasi visual.
Arsitektur
┌─────────────────────────────────────────────────────────────┐
│ Komponen React Anda │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Zona Drop │ │ Daftar File │ │ Tombol Upload │ │
│ │ (UI Anda) │ │ (UI Anda) │ │ (UI Anda) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Hook useDropup ││
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────┐ ││
│ │ │ Mesin │ │ Manajer │ │ Mesin │ │ Adapter │ ││
│ │ │ Validasi │ │ State │ │ Upload │ │Platform │ ││
│ │ └───────────┘ └───────────┘ └───────────┘ └─────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Komponen Utama
1. Manajer State
Dropup menggunakan useReducer React untuk manajemen state yang dapat diprediksi:
- Melacak semua file dan statusnya
- Mengelola state seret
- Menangani progres upload
- Menyediakan nilai yang dihitung
2. Mesin Validasi
Sebelum file ditambahkan, mereka melalui validasi:
const { files } = useDropup({
accept: 'image/*', // Validasi tipe file
maxSize: 5 * 1024 * 1024, // Ukuran file maksimum
minSize: 1024, // Ukuran file minimum
maxFiles: 10, // Jumlah file maksimum
maxWidth: 4096, // Lebar gambar maksimum
maxHeight: 4096, // Tinggi gambar maksimum
customRules: [ // Validasi kustom
(file) => file.name.length < 100 || 'Nama file terlalu panjang'
],
});
3. Mesin Upload
Mesin upload menangani:
- Upload sederhana (satu request per file)
- Upload chunked (memecah file besar)
- Logika retry dengan exponential backoff
- Manajemen upload konkuren
- Pelacakan progres
4. Adapter Platform
Dropup bekerja lintas platform:
- Web - Menggunakan API browser native
- React Native - Menggunakan penanganan file native
- SSR - Aman untuk server-side rendering
Alur Data
Aksi Pengguna → Validasi → Update State → Upload → Callback
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Pilih/ Terima/Tolak files[] XHR/Fetch onComplete
Lepas file Diupdate Progres onError
Prinsip Desain
1. Headless First
Tidak ada komponen UI bawaan - Anda membangun persis apa yang Anda butuhkan:
// Anda mengontrol seluruh UI
<div {...getDropProps()}>
<ZonaDropKustomAnda />
<input {...getInputProps()} />
</div>
2. Keamanan Tipe
Dukungan TypeScript penuh dengan tipe yang komprehensif:
import type { DropupFile, UseDropupOptions } from '@samithahansaka/dropup';
const options: UseDropupOptions = {
accept: 'image/*',
onUploadComplete: (file: DropupFile) => {
console.log(file.uploadedUrl);
},
};
3. Tree Shakeable
Import hanya apa yang Anda butuhkan:
// Core saja (~10KB)
import { useDropup } from '@samithahansaka/dropup';
// Tambahkan dukungan cloud saat dibutuhkan
import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';
// Tambahkan pemrosesan gambar saat dibutuhkan
import { compressImage } from '@samithahansaka/dropup/image';
4. Progressive Enhancement
Mulai sederhana, tambahkan fitur sesuai kebutuhan:
// Penggunaan dasar
const { files } = useDropup();
// Tambahkan validasi
const { files } = useDropup({ maxSize: 10_000_000 });
// Tambahkan auto-upload
const { files } = useDropup({
maxSize: 10_000_000,
upload: { url: '/api/upload' },
autoUpload: true,
});
// Tambahkan cloud storage
const { files } = useDropup({
upload: createS3Uploader({ getPresignedUrl }),
});