diff --git a/app.json b/app.json index dabd276..501c0ba 100644 --- a/app.json +++ b/app.json @@ -42,6 +42,7 @@ } ], "expo-font", + "expo-image-picker", "expo-web-browser", [ "@react-native-firebase/app", diff --git a/app/(application)/banner/[id].tsx b/app/(application)/banner/[id].tsx index e38ea96..201c8f0 100644 --- a/app/(application)/banner/[id].tsx +++ b/app/(application)/banner/[id].tsx @@ -34,7 +34,7 @@ export default function EditBanner() { const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], - allowsEditing: true, + allowsEditing: false, quality: 1, aspect: [1535, 450], }); diff --git a/app/(application)/banner/create.tsx b/app/(application)/banner/create.tsx index 31eb152..725e885 100644 --- a/app/(application)/banner/create.tsx +++ b/app/(application)/banner/create.tsx @@ -33,7 +33,7 @@ export default function CreateBanner() { const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], - allowsEditing: true, + allowsEditing: false, quality: 1, aspect: [1535, 450], }); diff --git a/app/(application)/discussion/create.tsx b/app/(application)/discussion/create.tsx index 257218c..e457c71 100644 --- a/app/(application)/discussion/create.tsx +++ b/app/(application)/discussion/create.tsx @@ -84,6 +84,9 @@ export default function CreateDiscussionGeneral() { checkForm(); }, [error, dataForm]); + useEffect(() => { + dispatch(setMemberChoose([])) + }, []) function handleBack() { dispatch(setMemberChoose([])) @@ -101,7 +104,7 @@ export default function CreateDiscussionGeneral() { dispatch(setUpdateDiscussionGeneralDetail(!update)) Toast.show({ type: 'small', text1: 'Berhasil menambahkan data', }) router.back() - }else{ + } else { Toast.show({ type: 'small', text1: response.message, }) } } catch (error) { @@ -171,6 +174,7 @@ export default function CreateDiscussionGeneral() { error={error.desc} errorText="Diskusi tidak boleh kosong" onChange={(val) => { validationForm("desc", val) }} + multiline /> validationForm("desc", val)} + multiline /> diff --git a/app/(application)/division/[id]/(fitur-division)/calendar/create.tsx b/app/(application)/division/[id]/(fitur-division)/calendar/create.tsx index 23b663d..f8990e3 100644 --- a/app/(application)/division/[id]/(fitur-division)/calendar/create.tsx +++ b/app/(application)/division/[id]/(fitur-division)/calendar/create.tsx @@ -10,6 +10,8 @@ import { stringToDateTime } from "@/lib/fun_stringToDate"; import { Stack, router, useLocalSearchParams } from "expo-router"; import { useState } from "react"; import { + KeyboardAvoidingView, + Platform, SafeAreaView, ScrollView, View @@ -141,94 +143,99 @@ export default function CalendarDivisionCreate() { ), }} /> - - - validationForm("title", val)} - error={error.title} - errorText="Nama acara tidak boleh kosong" - /> - validationForm("dateStart", val)} - mode="date" - value={data.dateStart} - label="Tanggal Acara" - required - error={error.dateStart} - errorText="Tanggal acara tidak boleh kosong" - placeholder="Pilih Tanggal Acara" - /> - - - validationForm("timeStart", val)} - mode="time" - value={data.timeStart} - label="Waktu Awal" - required - error={error.timeStart} - errorText="Waktu awal tidak valid" - placeholder="--:--" - /> - - - validationForm("timeEnd", val)} - mode="time" - value={data.timeEnd} - label="Waktu Akhir" - required - error={error.timeEnd} - errorText="Waktu akhir tidak valid" - placeholder="--:--" - /> + + + + validationForm("title", val)} + error={error.title} + errorText="Nama acara tidak boleh kosong" + /> + validationForm("dateStart", val)} + mode="date" + value={data.dateStart} + label="Tanggal Acara" + required + error={error.dateStart} + errorText="Tanggal acara tidak boleh kosong" + placeholder="Pilih Tanggal Acara" + /> + + + validationForm("timeStart", val)} + mode="time" + value={data.timeStart} + label="Waktu Awal" + required + error={error.timeStart} + errorText="Waktu awal tidak valid" + placeholder="--:--" + /> + + + validationForm("timeEnd", val)} + mode="time" + value={data.timeEnd} + label="Waktu Akhir" + required + error={error.timeEnd} + errorText="Waktu akhir tidak valid" + placeholder="--:--" + /> + + validationForm("linkMeet", val)} + /> + { setSelect(true) }} + /> + validationForm("repeatValue", val)} + error={error.repeatValue} + errorText="Jumlah pengulangan tidak valid" + disable={choose.val == "once"} + /> + validationForm("desc", val)} + multiline + /> - validationForm("linkMeet", val)} - /> - { setSelect(true) }} - /> - validationForm("repeatValue", val)} - error={error.repeatValue} - errorText="Jumlah pengulangan tidak valid" - disable={choose.val == "once"} - /> - validationForm("desc", val)} - multiline - /> - - + + { - handleLoad(true); - }, [path]); - const handleCheckboxChange = (index: number) => { setDariSelectAll(false); if (selectedFiles.some((i: any) => i.id == data[index].id)) { @@ -308,6 +304,10 @@ export default function DocumentDivision() { setRefreshing(false) }; + useEffect(() => { + handleLoad(true); + }, [path]); + return ( { setRename(false) }} - onSubmit={() => { - handleRename(); - }} + onSubmit={() => { handleRename() }} disableSubmit={bodyRename.name == ""} > diff --git a/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-file.tsx b/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-file.tsx index 9da4b3d..36c37a2 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-file.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-file.tsx @@ -36,16 +36,18 @@ export default function TaskDivisionAddFile() { const pickDocumentAsync = async () => { let result = await DocumentPicker.getDocumentAsync({ type: ["*/*"], - multiple: false, + multiple: true, }); if (!result.canceled) { - if (result.assets?.[0].uri) { - const check = await handleCheckFile(result.assets?.[0]); - if (check) { - setFileForm([...fileForm, result.assets?.[0]]); - setListFile([...listFile, result.assets?.[0].name]); - } else { - Toast.show({ type: 'small', text1: 'File sudah ada', }) + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets?.[i].uri) { + const check = await handleCheckFile(result.assets?.[i]); + if (check) { + setFileForm((prev) => [...prev, result.assets?.[i]]); + setListFile((prev) => [...prev, result.assets?.[i].name]); + } else { + Toast.show({ type: 'small', text1: 'File sudah ada', }) + } } } } diff --git a/app/(application)/division/[id]/(fitur-division)/task/create.tsx b/app/(application)/division/[id]/(fitur-division)/task/create.tsx index db44ec5..ebf87ea 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/create.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/create.tsx @@ -52,11 +52,13 @@ export default function CreateTaskDivision() { const pickDocumentAsync = async () => { let result = await DocumentPicker.getDocumentAsync({ type: ["*/*"], - multiple: false + multiple: true }); if (!result.canceled) { - if (result.assets[0].uri) { - setFileForm([...fileForm, result.assets[0]]) + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets[i].uri) { + setFileForm((prev) => [...prev, result.assets[i]]) + } } } }; diff --git a/app/(application)/edit-profile.tsx b/app/(application)/edit-profile.tsx index aa7cea5..a9687f1 100644 --- a/app/(application)/edit-profile.tsx +++ b/app/(application)/edit-profile.tsx @@ -187,7 +187,7 @@ export default function EditProfile() { const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], - allowsEditing: true, + allowsEditing: false, quality: 1, aspect: [1, 1], }); diff --git a/app/(application)/member/create.tsx b/app/(application)/member/create.tsx index f76801f..6a39a72 100644 --- a/app/(application)/member/create.tsx +++ b/app/(application)/member/create.tsx @@ -36,6 +36,7 @@ export default function CreateMember() { const [chooseGender, setChooseGender] = useState({ val: "", label: "" }); const [selectedImage, setSelectedImage] = useState(undefined); const entityUser = useSelector((state: any) => state.user); + const entities = useSelector((state: any) => state.entities) const [isSelect, setSelect] = useState(false); const [disableBtn, setDisableBtn] = useState(true) const [valChoose, setValChoose] = useState("") @@ -142,6 +143,12 @@ export default function CreateMember() { checkForm() }, [error, dataForm]) + useEffect(() => { + if(entityUser.role !="supadmin" && entityUser.role != "developer"){ + validationForm("group", entities.idGroup, entities.group) + } + }, []) + async function handleCreate() { try { @@ -162,7 +169,7 @@ export default function CreateMember() { fd.append("file", "undefined") } - const response = await apiCreateUser(fd) + const response = await apiCreateUser({data: fd}) if (response.success) { Toast.show({ type: 'small', text1: 'Berhasil menambahkan data', }) dispatch(setUpdateMember(!update)) @@ -179,7 +186,7 @@ export default function CreateMember() { const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], - allowsEditing: true, + allowsEditing: false, quality: 1, aspect: [1, 1], }); diff --git a/app/(application)/member/edit/[id].tsx b/app/(application)/member/edit/[id].tsx index b25575e..53c7183 100644 --- a/app/(application)/member/edit/[id].tsx +++ b/app/(application)/member/edit/[id].tsx @@ -212,7 +212,7 @@ export default function EditMember() { const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], - allowsEditing: true, + allowsEditing: false, quality: 1, aspect: [1, 1], }); diff --git a/app/(application)/project/[id]/add-file.tsx b/app/(application)/project/[id]/add-file.tsx index da7f9eb..93dda52 100644 --- a/app/(application)/project/[id]/add-file.tsx +++ b/app/(application)/project/[id]/add-file.tsx @@ -30,16 +30,19 @@ export default function ProjectAddFile() { const pickDocumentAsync = async () => { let result = await DocumentPicker.getDocumentAsync({ type: ["*/*"], - multiple: false + multiple: true }); + if (!result.canceled) { - if (result.assets?.[0].uri) { - const check = await handleCheckFile(result.assets?.[0]) - if (check) { - setFileForm([...fileForm, result.assets?.[0]]) - setListFile([...listFile, result.assets?.[0].name]) - } else { - Toast.show({ type: 'small', text1: 'File sudah ada', }) + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets?.[i].uri) { + const check = await handleCheckFile(result.assets?.[i]) + if (check) { + setFileForm((prev) => [...prev, result.assets?.[i]]) + setListFile((prev) => [...prev, result.assets?.[i].name]) + } else { + Toast.show({ type: 'small', text1: 'File yg telah terupload tidak bisa diupload ulang', }) + } } } } diff --git a/app/(application)/project/create.tsx b/app/(application)/project/create.tsx index 5d01ac5..b76a956 100644 --- a/app/(application)/project/create.tsx +++ b/app/(application)/project/create.tsx @@ -146,11 +146,13 @@ export default function CreateProject() { const pickDocumentAsync = async () => { let result = await DocumentPicker.getDocumentAsync({ type: ["*/*"], - multiple: false + multiple: true }); if (!result.canceled) { - if (result.assets[0].uri) { - setFileForm([...fileForm, result.assets[0]]) + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets[i].uri) { + setFileForm((prev) => [...prev, result.assets[i]]) + } } } }; diff --git a/components/document/headerDocument.tsx b/components/document/headerDocument.tsx index d93304f..90d42da 100644 --- a/components/document/headerDocument.tsx +++ b/components/document/headerDocument.tsx @@ -28,7 +28,7 @@ export default function HeaderRightDocument({ path }: { path: string }) { async function handleCreateFolder() { try { const hasil = await decryptToken(String(token?.current)) - const response = await apiCreateFolderDocument({ user: hasil, name, path, idDivision: id }) + 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)) diff --git a/components/inputDate.tsx b/components/inputDate.tsx index 4cdeded..d496987 100644 --- a/components/inputDate.tsx +++ b/components/inputDate.tsx @@ -27,7 +27,7 @@ type Props = { export function InputDate({ label, value, placeholder, onChange, info, disable, error, errorText, required, mode, round, width, }: Props) { const [modal, setModal] = useState(false); - const onChangeDate = ({ type }: { type: string }, selectedDate: any) => { + const onChangeDate = (type: string, selectedDate: any) => { if (type === "set") { if (mode == "date") { onChange(dayjs(selectedDate).format("DD-MM-YYYY")) @@ -60,10 +60,10 @@ export function InputDate({ label, value, placeholder, onChange, info, disable, { modal && ( { onChangeDate(event.type, date) }} onTouchCancel={() => setModal(false)} /> ) diff --git a/lib/api.ts b/lib/api.ts index 75c672c..250c139 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -2,8 +2,8 @@ import axios from 'axios'; const api = axios.create({ // baseURL: 'http://10.0.2.2:3000/api', - baseURL: 'https://stg-darmasaba.wibudev.com/api', - // baseURL: 'http://192.168.1.135:3000/api', + // baseURL: 'https://stg-darmasaba.wibudev.com/api', + baseURL: 'http://192.168.1.89:3000/api', }); export const apiCheckPhoneLogin = async (body: { phone: string }) => { @@ -150,7 +150,7 @@ export const apiGetUser = async ({ user, active, search, group, page }: { user: }; -export const apiCreateUser = async (data: FormData) => { +export const apiCreateUser = async ({data}: {data: FormData}) => { const response = await api.post('/mobile/user', data, { headers: { 'Content-Type': 'multipart/form-data', @@ -219,7 +219,7 @@ export const apiEditDiscussionGeneral = async (data: { user: string, title: stri }; export const apiCreateDiscussionGeneral = async ({ data }: { data: { idGroup: string, title: string, desc: string, user: string, member: [] } }) => { - const response = await api.post(`/mobile/discussion-general/`, data) + const response = await api.post(`/mobile/discussion-general`, data) return response.data; }; @@ -604,7 +604,7 @@ export const apiGetDocumentInformasi = async ({ user, item, cat }: { user: strin }; export const apiDocumentRename = async (data: { name: string, user: string, id: string, path: string, idDivision: string, extension: string }) => { - const response = await api.put(`/mobile/document/`, data) + const response = await api.put(`/mobile/document`, data) return response.data; }; @@ -613,8 +613,8 @@ export const apiDocumentDelete = async (data: { user: string, data: any[] }) => return response.data }; -export const apiCreateFolderDocument = async (data: { name: string, path: string, idDivision: string, user: string }) => { - const response = await api.post(`/mobile/document/`, data) +export const apiCreateFolderDocument = async ({ data }: { data: { name: string, path: string, idDivision: string, user: string } }) => { + const response = await api.post(`/mobile/document`, data) return response.data; }; @@ -646,12 +646,12 @@ export const apiShareDocument = async (data: { dataDivision: any[], dataItem: an }; export const apiRegisteredToken = async (data: { user: string, token: string }) => { - const response = await api.post(`/mobile/auth-token/`, data) + const response = await api.post(`/mobile/auth-token`, data) return response.data; }; export const apiUnregisteredToken = async (data: { user: string, token: string }) => { - const response = await api.put(`/mobile/auth-token/`, data) + const response = await api.put(`/mobile/auth-token`, data) return response.data; }; @@ -661,6 +661,6 @@ export const apiGetNotification = async ({ user, page }: { user: string, page?: }; export const apiReadOneNotification = async (data: { user: string, id: string }) => { - const response = await api.put(`/mobile/home/notification/`, data) + const response = await api.put(`/mobile/home/notification`, data) return response.data; }; \ No newline at end of file