Integrasi API: Donation & Admin Donation

Fix:
- app/(application)/(user)/donation/[id]/fund-disbursement.tsx
- app/(application)/(user)/donation/[id]/list-of-donatur.tsx
- app/(application)/admin/donation/[id]/[status]/index.tsx
- app/(application)/admin/donation/[id]/detail-disbursement-of-funds.tsx
- app/(application)/admin/donation/[id]/disbursement-of-funds.tsx
- app/(application)/admin/donation/[id]/list-disbursement-of-funds.tsx
- service/api-admin/api-admin-donation.ts
- service/api-client/api-donation.ts
- utils/pickFile.ts: Sudah bisa memilih ukuran crop tapi hanya di android

### No issue
This commit is contained in:
2025-10-29 17:35:18 +08:00
parent 1e1b18f860
commit b3209dc7ee
9 changed files with 545 additions and 119 deletions

View File

@@ -13,19 +13,28 @@ export interface IFileData {
export type AllowedFileType = "image" | "pdf" | undefined;
export type AspectRatio = [number, number];
export interface PickFileOptions {
setImageUri?: (file: IFileData) => void;
setPdfUri?: (file: IFileData) => void;
allowedType?: AllowedFileType; // <-- Tambahkan prop ini
aspectRatio?: AspectRatio;
}
export default async function pickFile({
setImageUri,
setPdfUri,
allowedType,
aspectRatio,
}: PickFileOptions): Promise<void> {
if (allowedType === "image") {
await pickImage(setImageUri);
if (aspectRatio) {
await pickImage(setImageUri, aspectRatio);
} else {
// Jika tidak, tawarkan pilihan rasio (default [4,3])
showAspectRatioChoice(setImageUri);
}
} else if (allowedType === "pdf") {
await pickPdf(setPdfUri);
} else {
@@ -36,15 +45,45 @@ export default async function pickFile({
[
{ text: "Batal", style: "cancel" },
{ text: "Dokumen (PDF)", onPress: () => pickPdf(setPdfUri) },
{ text: "Gambar", onPress: () => pickImage(setImageUri) },
{ text: "Gambar", onPress: () => pickImage(setImageUri, aspectRatio) },
],
{ cancelable: true }
);
}
}
function showAspectRatioChoice(setImageUri?: (file: IFileData) => void) {
Alert.alert(
"Pilih Rasio Gambar",
"Pilih rasio crop yang diinginkan:",
[
{ text: "Batal", style: "cancel" },
{
text: "1:1 (Kotak)",
onPress: () => pickImage(setImageUri, [1, 1]),
},
// {
// text: "4:3 (Default)",
// onPress: () => pickImage(setImageUri, [4, 3]),
// },
// {
// text: "9:16 (Landscape)",
// onPress: () => pickImage(setImageUri, [9, 16]),
// },
{
text: "3:4 (Potret)",
onPress: () => pickImage(setImageUri, [3, 4]),
},
],
{ cancelable: true }
);
}
// --- Fungsi internal: pickImage ---
async function pickImage(setImageUri?: (file: IFileData) => void) {
async function pickImage(
setImageUri?: (file: IFileData) => void,
aspectRatio: AspectRatio = [4, 3] // Default [4, 3]
) {
const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();
if (status !== "granted") {
Alert.alert(
@@ -57,7 +96,7 @@ async function pickImage(setImageUri?: (file: IFileData) => void) {
const result = await ImagePicker.launchImageLibraryAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Images,
allowsEditing: true,
aspect: [4, 3],
aspect: aspectRatio, // 🎯 Gunakan rasio dinamis
quality: 1,
});