របៀបដែល Dropup ដំណើរការ
Dropup ត្រូវបានបង្កើតឡើងជុំវិញគំនិតនៃ UI គ្មានចំណុចប្រទាក់ - វាដោះស្រាយតក្កវិជ្ជាផ្ទុកឯកសារឡើងស្មុគស្មាញទាំងអស់ ខណៈពេលដែលផ្តល់ឱ្យអ្នកនូវការគ្រប់គ្រងពេញលេញលើការបង្ហាញរូបភាព។
ស្ថាបត្យកម្ម
┌─────────────────────────────────────────────────────────────┐
│ React Component របស់អ្នក │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ តំបន់ទម្លាក់ │ │ បញ្ជីឯកសារ │ │ ប៊ូតុងផ្ទុកឡើង │ │
│ │ (UI របស់អ្នក) │ │ (UI របស់អ្នក) │ │ (UI របស់អ្នក) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ useDropup Hook ││
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────┐ ││
│ │ │ម៉ាស៊ីន │ │អ្នកគ្រប់គ្រង │ │ម៉ាស៊ីន │ │ Adapter │ ││
│ │ │ផ្ទៀងផ្ទាត់ │ │ស្ថានភាព │ │ផ្ទុកឡើង │ │វេទិកា │ ││
│ │ └───────────┘ └───────────┘ └───────────┘ └─────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
សមាសភាគសំខាន់ៗ
1. អ្នកគ្រប់គ្រងស្ថានភាព
Dropup ប្រើ useReducer របស់ React សម្រាប់ការគ្រប់គ្រងស្ថានភាពដែលអាចទស្សន៍ទាយបាន៖
- តាមដានឯកសារទាំងអស់ និងស្ថានភាពរបស់ពួកគេ
- គ្រប់គ្រងស្ថានភាពអូស
- ដោះស្រាយវឌ្ឍនភាពការផ្ទុកឡើង
- ផ្តល់តម្លៃដែលបានគណនា
2. ម៉ាស៊ីនផ្ទៀងផ្ទាត់
មុនពេលឯកសារត្រូវបានបន្ថែម ពួកគេឆ្លងកាត់ការផ្ទៀងផ្ទាត់៖
const { files } = useDropup({
accept: 'image/*', // ការផ្ទៀងផ្ទាត់ប្រភេទឯកសារ
maxSize: 5 * 1024 * 1024, // ទំហំឯកសារអតិបរមា
minSize: 1024, // ទំហំឯកសារអប្បបរមា
maxFiles: 10, // ចំនួនឯកសារអតិបរមា
maxWidth: 4096, // ទទឹងរូបភាពអតិបរមា
maxHeight: 4096, // កម្ពស់រូបភាពអតិបរមា
customRules: [ // ការផ្ទៀងផ្ទាត់ផ្ទាល់ខ្លួន
(file) => file.name.length < 100 || 'ឈ្មោះឯកសារវែងពេក'
],
});
3. ម៉ាស៊ីនផ្ទុកឡើង
ម៉ាស៊ីនផ្ទុកឡើងដោះស្រាយ៖
- ការផ្ទុកឡើងធម្មតា (សំណើមួយក្នុងមួយឯកសារ)
- ការផ្ទុកឡើងជាបំណែក (បំបែកឯកសារធំ)
- តក្កវិជ្ជាព្យាយាមឡើងវិញជាមួយ exponential backoff
- ការគ្រប់គ្រងការផ្ទុកឡើងដំណាលគ្នា
- ការតាមដានវឌ្ឍនភាព
4. Adapter វេទិកា
Dropup ដំណើរការឆ្លងកាត់វេទិកា៖
- Web - ប្រើ browser APIs ដើម
- React Native - ប្រើការដោះស្រាយឯកសារ native
- SSR - មានសុវត្ថិភាពសម្រាប់ server-side rendering
លំហូរទិន្នន័យ
សកម្មភាពអ្នកប្រើ → ការផ្ទៀងផ្ទាត់ → ធ្វើបច្ចុប្បន្នភាពស្ថានភាព → ផ្ទុកឡើង → Callbacks
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
ជ្រើសរើស/ ទទួលយក/បដិសេធ files[] XHR/Fetch onComplete
ទម្លាក់ឯកសារ បានធ្វើបច្ចុប្បន្នភាព វឌ្ឍនភាព onError
គោលការណ៍រចនា
1. គ្មានចំណុចប្រទាក់ជាមុន
គ្មានសមាសភាគ UI ដែលបានបង្កើតទុក - អ្នកបង្កើតអ្វីដែលអ្នកត្រូវការ៖
// អ្នកគ្រប់គ្រង UI ទាំងមូល
<div {...getDropProps()}>
<YourCustomDropZone />
<input {...getInputProps()} />
</div>
2. សុវត្ថិភាពប្រភេទ
ការគាំទ្រ TypeScript ពេញលេញជាមួយប្រភេទទូលំទូលាយ៖
import type { DropupFile, UseDropupOptions } from '@samithahansaka/dropup';
const options: UseDropupOptions = {
accept: 'image/*',
onUploadComplete: (file: DropupFile) => {
console.log(file.uploadedUrl);
},
};
3. Tree Shakeable
នាំចូលតែអ្វីដែលអ្នកត្រូវការ៖
// ស្នូលតែប៉ុណ្ណោះ (~10KB)
import { useDropup } from '@samithahansaka/dropup';
// បន្ថែមការគាំទ្រពពកនៅពេលចាំបាច់
import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';
// បន្ថែមការដំណើរការរូបភាពនៅពេលចាំបាច់
import { compressImage } from '@samithahansaka/dropup/image';
4. ការពង្រឹងបន្តិចម្តងៗ
ចាប់ផ្តើមសាមញ្ញ បន្ថែមមុខងារតាមតម្រូវការ៖
// ការប្រើប្រាស់មូលដ្ឋាន
const { files } = useDropup();
// បន្ថែមការផ្ទៀងផ្ទាត់
const { files } = useDropup({ maxSize: 10_000_000 });
// បន្ថែមការផ្ទុកឡើងស្វ័យប្រវត្តិ
const { files } = useDropup({
maxSize: 10_000_000,
upload: { url: '/api/upload' },
autoUpload: true,
});
// បន្ថែមការផ្ទុកលើពពក
const { files } = useDropup({
upload: createS3Uploader({ getPresignedUrl }),
});