Files
mobile-darmasaba/components/document/headerDocument.tsx
amaliadwiy 6a24b95cdd upd: loading button
Deskripsi:
- tambah folder bar
- rename file pada dokumen divisi

No Issues
2025-08-29 14:58:16 +08:00

170 lines
5.8 KiB
TypeScript

import Styles from "@/constants/Styles";
import { apiCreateFolderDocument, apiUploadFileDocument } from "@/lib/api";
import { setUpdateDokumen } from "@/lib/dokumenUpdate";
import { useAuthSession } from "@/providers/AuthProvider";
import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons";
import * as DocumentPicker from "expo-document-picker";
import { useLocalSearchParams } from "expo-router";
import { useState } from "react";
import { ActivityIndicator, View } from "react-native";
import Toast from "react-native-toast-message";
import { useDispatch, useSelector } from "react-redux";
import ButtonMenuHeader from "../buttonMenuHeader";
import DrawerBottom from "../drawerBottom";
import { InputForm } from "../inputForm";
import MenuItemRow from "../menuItemRow";
import ModalFloat from "../modalFloat";
export default function HeaderRightDocument({ path }: { path: string }) {
const [isVisible, setVisible] = useState(false);
const [newFolder, setNewFolder] = useState(false);
const { id } = useLocalSearchParams<{ id: string }>();
const [name, setName] = useState("");
const { token, decryptToken } = useAuthSession()
const dispatch = useDispatch()
const update = useSelector((state: any) => state.dokumenUpdate)
const [loading, setLoading] = useState(false)
const [loadingFolder, setLoadingFolder] = useState(false)
async function handleCreateFolder() {
try {
setLoadingFolder(true)
const hasil = await decryptToken(String(token?.current))
const response = await apiCreateFolderDocument({ data: { user: hasil, name, path, idDivision: id } })
if (response.success) {
Toast.show({ type: 'small', text1: 'Berhasil membuat folder baru', })
dispatch(setUpdateDokumen(!update))
} else {
Toast.show({ type: 'small', text1: response.message, })
}
} catch (error) {
console.error(error)
Toast.show({ type: 'small', text1: 'Terjadi kesalahan', })
} finally {
setLoadingFolder(false)
setNewFolder(false)
}
}
const pickDocumentAsync = async () => {
let result = await DocumentPicker.getDocumentAsync({
type: ["*/*"],
multiple: true,
});
if (!result.canceled) {
let file: any[] = []
for (let i = 0; i < result.assets?.length; i++) {
if (result.assets?.[i].uri) {
file.push(result.assets?.[i])
}
}
handleUploadFile(file)
}
};
async function handleUploadFile(file: any[]) {
try {
setLoading(true)
const hasil = await decryptToken(String(token?.current))
const fd = new FormData()
for (let i = 0; i < file.length; i++) {
fd.append(`file${i}`, {
uri: file[i].uri,
type: "application/octet-stream",
name: file[i].name,
} as any);
}
fd.append(
"data",
JSON.stringify({
idPath: path,
idDivision: id,
user: hasil,
})
)
const response = await apiUploadFileDocument({ data: fd })
if (response.success) {
Toast.show({ type: 'small', text1: 'Berhasil mengunggah file', })
dispatch(setUpdateDokumen(!update))
} else {
Toast.show({ type: 'small', text1: response.message, })
}
} catch (error) {
console.error(error)
Toast.show({ type: 'small', text1: 'Terjadi kesalahan', })
} finally {
setVisible(false)
setLoading(false)
}
}
return (
<>
<ButtonMenuHeader
onPress={() => {
setVisible(true);
}}
/>
<DrawerBottom
animation="slide"
isVisible={isVisible}
setVisible={() => { setVisible(false) }}
title="Menu"
>
<View style={Styles.rowItemsCenter}>
{
loading ?
<View style={[Styles.contentItemCenter, Styles.w100, Styles.h100]}>
<ActivityIndicator size="large" />
</View>
:
<>
<MenuItemRow
icon={
<MaterialCommunityIcons
name="folder-open"
color="black"
size={25}
/>
}
title="Tambah Folder"
onPress={() => {
setVisible(false);
setTimeout(() => {
setNewFolder(true);
}, 600);
}}
/>
<MenuItemRow
icon={<MaterialIcons name="upload-file" color="black" size={25} />}
title="Upload File"
onPress={pickDocumentAsync}
/>
</>
}
</View>
</DrawerBottom>
<ModalFloat
title="Buat Folder Baru"
isVisible={newFolder}
setVisible={() => { setNewFolder(false) }}
disableSubmit={name == "" || loadingFolder}
onSubmit={() => { handleCreateFolder() }}
>
<View>
<InputForm
type="default"
placeholder="Nama Folder"
required
label="Nama Folder"
onChange={(value: string) => { setName(value) }}
/>
</View>
</ModalFloat>
</>
);
}