diff --git a/app/(application)/discussion/[id].tsx b/app/(application)/discussion/[id].tsx index 8a16505..6b4d3ea 100644 --- a/app/(application)/discussion/[id].tsx +++ b/app/(application)/discussion/[id].tsx @@ -1,5 +1,6 @@ import AlertKonfirmasi from "@/components/alertKonfirmasi"; import BorderBottomItem from "@/components/borderBottomItem"; +import BorderBottomItem2 from "@/components/borderBottomItem2"; import ButtonBackHeader from "@/components/buttonBackHeader"; import HeaderRightDiscussionGeneralDetail from "@/components/discussion_general/headerDiscussionDetail"; import DrawerBottom from "@/components/drawerBottom"; @@ -214,7 +215,7 @@ export default function DetailDiscussionGeneral() { loading ? : - state.memberChoose) const update = useSelector((state: any) => state.discussionGeneralDetailUpdate) const [loading, setLoading] = useState(false) + const [fileForm, setFileForm] = useState([]) + const [isModalFile, setModalFile] = useState(false) + const [indexDelFile, setIndexDelFile] = useState(0) const [dataForm, setDataForm] = useState({ idGroup: "", title: "", @@ -95,6 +102,25 @@ export default function CreateDiscussionGeneral() { router.back() } + const pickDocumentAsync = async () => { + let result = await DocumentPicker.getDocumentAsync({ + type: ["*/*"], + multiple: true + }); + if (!result.canceled) { + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets[i].uri) { + setFileForm((prev) => [...prev, result.assets[i]]) + } + } + } + }; + + function deleteFile(index: number) { + setFileForm([...fileForm.filter((val, i) => i !== index)]) + setModalFile(false) + } + async function handleCreate() { try { setLoading(true) @@ -181,6 +207,26 @@ export default function CreateDiscussionGeneral() { onChange={(val) => { validationForm("desc", val) }} multiline /> + + { + fileForm.length > 0 + && + + File + { + fileForm.map((item, index) => ( + 1 ? "bottom" : "none"} + icon={} + title={item.name} + titleWeight="normal" + onPress={() => { setIndexDelFile(index); setModalFile(true) }} + /> + )) + } + + } { @@ -240,6 +286,16 @@ export default function CreateDiscussionGeneral() { idParent={valSelect == "member" ? chooseGroup.val : ""} valChoose={valChoose} /> + + + + } + title="Hapus" + onPress={() => { deleteFile(indexDelFile) }} + /> + + ); } diff --git a/app/(application)/discussion/edit/[id].tsx b/app/(application)/discussion/edit/[id].tsx index d7bd3fa..4271d8e 100644 --- a/app/(application)/discussion/edit/[id].tsx +++ b/app/(application)/discussion/edit/[id].tsx @@ -1,10 +1,17 @@ +import Text from "@/components/Text"; +import BorderBottomItem from "@/components/borderBottomItem"; import ButtonBackHeader from "@/components/buttonBackHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader"; +import ButtonSelect from "@/components/buttonSelect"; +import DrawerBottom from "@/components/drawerBottom"; import { InputForm } from "@/components/inputForm"; +import MenuItemRow from "@/components/menuItemRow"; import Styles from "@/constants/Styles"; import { apiEditDiscussionGeneral, apiGetDiscussionGeneralOne } from "@/lib/api"; import { setUpdateDiscussionGeneralDetail } from "@/lib/discussionGeneralDetail"; import { useAuthSession } from "@/providers/AuthProvider"; +import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; +import * as DocumentPicker from "expo-document-picker"; import { router, Stack, useLocalSearchParams } from "expo-router"; import { useEffect, useState } from "react"; import { SafeAreaView, ScrollView, View } from "react-native"; @@ -17,6 +24,9 @@ export default function EditDiscussionGeneral() { const [disableBtn, setDisableBtn] = useState(false) const dispatch = useDispatch() const [loading, setLoading] = useState(false) + const [fileForm, setFileForm] = useState([]) + const [isModalFile, setModalFile] = useState(false) + const [indexDelFile, setIndexDelFile] = useState(0) const update = useSelector((state: any) => state.discussionGeneralDetailUpdate) const [dataForm, setDataForm] = useState({ title: "", @@ -78,6 +88,25 @@ export default function EditDiscussionGeneral() { checkForm() }, [error, dataForm]) + const pickDocumentAsync = async () => { + let result = await DocumentPicker.getDocumentAsync({ + type: ["*/*"], + multiple: true + }); + if (!result.canceled) { + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets[i].uri) { + setFileForm((prev) => [...prev, result.assets[i]]) + } + } + } + }; + + function deleteFile(index: number) { + setFileForm([...fileForm.filter((val, i) => i !== index)]) + setModalFile(false) + } + async function handleEdit() { try { @@ -142,8 +171,38 @@ export default function EditDiscussionGeneral() { onChange={(val) => validationForm("desc", val)} multiline /> + + { + fileForm.length > 0 + && + + File + { + fileForm.map((item, index) => ( + 1 ? "bottom" : "none"} + icon={} + title={item.name} + titleWeight="normal" + onPress={() => { setIndexDelFile(index); setModalFile(true) }} + /> + )) + } + + } + + + + } + title="Hapus" + onPress={() => { deleteFile(indexDelFile) }} + /> + + ); } diff --git a/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/edit.tsx b/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/edit.tsx index e06d56e..60d1fe5 100644 --- a/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/edit.tsx +++ b/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/edit.tsx @@ -1,10 +1,17 @@ +import BorderBottomItem from "@/components/borderBottomItem"; import ButtonBackHeader from "@/components/buttonBackHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader"; +import ButtonSelect from "@/components/buttonSelect"; +import DrawerBottom from "@/components/drawerBottom"; import { InputForm } from "@/components/inputForm"; +import MenuItemRow from "@/components/menuItemRow"; +import Text from "@/components/Text"; import Styles from "@/constants/Styles"; import { apiEditDiscussion, apiGetDiscussionOne } from "@/lib/api"; import { setUpdateDiscussion } from "@/lib/discussionUpdate"; import { useAuthSession } from "@/providers/AuthProvider"; +import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; +import * as DocumentPicker from "expo-document-picker"; import { router, Stack, useLocalSearchParams } from "expo-router"; import { useEffect, useState } from "react"; import { SafeAreaView, ScrollView, View } from "react-native"; @@ -18,6 +25,9 @@ export default function DiscussionDivisionEdit() { const update = useSelector((state: any) => state.discussionUpdate); const dispatch = useDispatch(); const [loading, setLoading] = useState(false) + const [fileForm, setFileForm] = useState([]) + const [isModalFile, setModalFile] = useState(false) + const [indexDelFile, setIndexDelFile] = useState(0) async function handleLoad() { try { @@ -49,7 +59,7 @@ export default function DiscussionDivisionEdit() { Toast.show({ type: 'small', text1: 'Berhasil mengubah data', }) dispatch(setUpdateDiscussion({ ...update, data: !update.data })); router.back(); - }else{ + } else { Toast.show({ type: 'small', text1: response.message, }) } } catch (error) { @@ -60,6 +70,27 @@ export default function DiscussionDivisionEdit() { } } + const pickDocumentAsync = async () => { + let result = await DocumentPicker.getDocumentAsync({ + type: ["*/*"], + multiple: true + }); + if (!result.canceled) { + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets[i].uri) { + setFileForm((prev) => [...prev, result.assets[i]]) + } + } + } + }; + + + + function deleteFile(index: number) { + setFileForm([...fileForm.filter((val, i) => i !== index)]) + setModalFile(false) + } + return ( + + + { + fileForm.length > 0 + && + + File + { + fileForm.map((item, index) => ( + 1 ? "bottom" : "none"} + icon={} + title={item.name} + titleWeight="normal" + onPress={() => { setIndexDelFile(index); setModalFile(true) }} + /> + )) + } + + } + + + + + } + title="Hapus" + onPress={() => { deleteFile(indexDelFile) }} + /> + + + ); } diff --git a/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/index.tsx b/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/index.tsx index 1f02b58..12a3132 100644 --- a/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/index.tsx +++ b/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/index.tsx @@ -1,5 +1,6 @@ import AlertKonfirmasi from "@/components/alertKonfirmasi"; import BorderBottomItem from "@/components/borderBottomItem"; +import BorderBottomItem2 from "@/components/borderBottomItem2"; import ButtonBackHeader from "@/components/buttonBackHeader"; import HeaderRightDiscussionDetail from "@/components/discussion/headerDiscussionDetail"; import DrawerBottom from "@/components/drawerBottom"; @@ -288,7 +289,7 @@ export default function DiscussionDetail() { loading ? : - () const [desc, setDesc] = useState('') @@ -18,6 +26,29 @@ export default function CreateDiscussionDivision() { const update = useSelector((state: any) => state.discussionUpdate) const dispatch = useDispatch(); const [loading, setLoading] = useState(false) + const [fileForm, setFileForm] = useState([]) + const [isModalFile, setModalFile] = useState(false) + const [indexDelFile, setIndexDelFile] = useState(0) + + const pickDocumentAsync = async () => { + let result = await DocumentPicker.getDocumentAsync({ + type: ["*/*"], + multiple: true + }); + if (!result.canceled) { + for (let i = 0; i < result.assets?.length; i++) { + if (result.assets[i].uri) { + setFileForm((prev) => [...prev, result.assets[i]]) + } + } + } + }; + + function deleteFile(index: number) { + setFileForm([...fileForm.filter((val, i) => i !== index)]) + setModalFile(false) + } + async function handleCreate() { try { @@ -64,8 +95,38 @@ export default function CreateDiscussionDivision() { onChange={setDesc} multiline /> + + { + fileForm.length > 0 + && + + File + { + fileForm.map((item, index) => ( + 1 ? "bottom" : "none"} + icon={} + title={item.name} + titleWeight="normal" + onPress={() => { setIndexDelFile(index); setModalFile(true) }} + /> + )) + } + + } + + + + } + title="Hapus" + onPress={() => { deleteFile(indexDelFile) }} + /> + + ) } \ No newline at end of file diff --git a/components/borderBottomItem2.tsx b/components/borderBottomItem2.tsx new file mode 100644 index 0000000..0e2ee6a --- /dev/null +++ b/components/borderBottomItem2.tsx @@ -0,0 +1,111 @@ +import { ColorsStatus } from "@/constants/ColorsStatus"; +import Styles from "@/constants/Styles"; +import { Ionicons } from "@expo/vector-icons"; +import React, { useState } from "react"; +import { Dimensions, Pressable, View } from "react-native"; +import { ScrollView } from "react-native-gesture-handler"; +import Text from "./Text"; + +type Props = { + title?: string + subtitle?: string | React.ReactNode + icon: React.ReactNode + desc?: string + rightTopInfo?: string + onPress?: () => void + onLongPress?: () => void + borderType: 'all' | 'bottom' | 'none' + leftBottomInfo?: React.ReactNode | string + rightBottomInfo?: React.ReactNode | string + titleWeight?: 'normal' | 'bold' + bgColor?: 'white' | 'transparent' + width?: number + descEllipsize?: boolean + textColor?: string, + colorPress?: boolean + titleShowAll?: boolean +} + +export default function BorderBottomItem2({ title, subtitle, icon, desc, onPress, onLongPress, rightTopInfo, borderType, leftBottomInfo, rightBottomInfo, titleWeight, bgColor, width, descEllipsize, textColor, colorPress, titleShowAll }: Props) { + const lebarDim = Dimensions.get("window").width; + const lebar = width ? lebarDim * width / 100 : 'auto'; + const textColorFix = textColor ? textColor : 'black'; + const [isTap, setIsTap] = useState(false); + + + return ( + setIsTap(true)} + onPressOut={() => setIsTap(false)} + style={({ pressed }) => [ + borderType == 'bottom' + ? Styles.wrapItemBorderBottom + : borderType == 'all' + ? Styles.wrapItemBorderAll + : Styles.wrapItemBorderNone, + bgColor && bgColor == 'white' && ColorsStatus.white, + // efek warna saat ditekan (sementara) + isTap && colorPress && ColorsStatus.pressedGray, + ]} + > + + {icon} + + + {title} + { + subtitle && + typeof subtitle == "string" + ? {subtitle} + : + {subtitle} + + } + + { + rightTopInfo && {rightTopInfo} + } + + + + {desc && {desc}} + + + + Text petama.pdf + + + + Text petama.pdf + + + + Text petama.pdf + + + + Text petama.pdf + + + { + (leftBottomInfo || rightBottomInfo) && + ( + + { + typeof leftBottomInfo == 'string' ? + {leftBottomInfo} + : + leftBottomInfo + } + { + typeof rightBottomInfo == 'string' ? + {rightBottomInfo} + : + rightBottomInfo + } + + ) + } + + ) +} \ No newline at end of file diff --git a/constants/Styles.ts b/constants/Styles.ts index 4ddf374..f090465 100644 --- a/constants/Styles.ts +++ b/constants/Styles.ts @@ -178,6 +178,9 @@ const Styles = StyleSheet.create({ ph20: { paddingHorizontal: 20, }, + pv03: { + paddingVertical: 3 + }, pv05: { paddingVertical: 5 },