From 9a86ccae560dd16c3badf091591e5a05bf1aa3e9 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 13 May 2025 17:43:31 +0800 Subject: [PATCH] upd: project Deskripsi: - on progress tambah project No Issues --- app/(application)/project/create.tsx | 175 ++++++++++++++++++---- app/(application)/project/create/task.tsx | 153 +++++++++++++++++++ lib/store.ts | 2 + lib/taskCreate.ts | 14 ++ 4 files changed, 318 insertions(+), 26 deletions(-) create mode 100644 app/(application)/project/create/task.tsx create mode 100644 lib/taskCreate.ts diff --git a/app/(application)/project/create.tsx b/app/(application)/project/create.tsx index 37d91c3..c817f22 100644 --- a/app/(application)/project/create.tsx +++ b/app/(application)/project/create.tsx @@ -1,50 +1,173 @@ +import BorderBottomItem from "@/components/borderBottomItem"; import ButtonBackHeader from "@/components/buttonBackHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSelect from "@/components/buttonSelect"; +import ImageUser from "@/components/imageNew"; import { InputForm } from "@/components/inputForm"; +import ModalSelect from "@/components/modalSelect"; import SelectForm from "@/components/selectForm"; import Styles from "@/constants/Styles"; +import { setMemberChoose } from "@/lib/memberChoose"; +import { useAuthSession } from "@/providers/AuthProvider"; import { router, Stack } from "expo-router"; import { useState } from "react"; -import { SafeAreaView, ScrollView, ToastAndroid, View } from "react-native"; +import { SafeAreaView, ScrollView, Text, ToastAndroid, View } from "react-native"; +import { useDispatch, useSelector } from "react-redux"; export default function CreateProject() { - const [chooseGroup, setChooseGroup] = useState({ val: '', label: '' }) + const { token, decryptToken } = useAuthSession(); + const [chooseGroup, setChooseGroup] = useState({ val: "", label: "" }); + const dispatch = useDispatch(); + const [valSelect, setValSelect] = useState<"group" | "member">("group"); + const [disableBtn, setDisableBtn] = useState(true); + const [isSelect, setSelect] = useState(false); + const [valChoose, setValChoose] = useState(""); + const entitiesMember = useSelector((state: any) => state.memberChoose) + const [dataForm, setDataForm] = useState({ + idGroup: "", + title: "", + }); + const [error, setError] = useState({ + group: false, + title: false, + task: false, + }); + const taskCreate = useSelector((state: any) => state.taskCreate) + + console.log('taskCreate', taskCreate) + + function validationForm(cat: string, val: any, label?: string) { + if (cat == "group") { + setChooseGroup({ val, label: String(label) }); + dispatch(setMemberChoose([])); + setDataForm({ ...dataForm, idGroup: val }); + if (val == "" || val == "null") { + setError({ ...error, group: true }); + } else { + setError({ ...error, group: false }); + } + } else if (cat == "title") { + setDataForm({ ...dataForm, title: val }); + if (val == "" || val == "null") { + setError({ ...error, title: true }); + } else { + setError({ ...error, title: false }); + } + } + } + + + function handleBack() { + dispatch(setMemberChoose([])) + router.back() + } return ( { router.back() }} />, - headerTitle: 'Tambah Kegiatan', - headerTitleAlign: 'center', - headerRight: () => { - ToastAndroid.show('Berhasil menambah data', ToastAndroid.SHORT) - router.push('/project?status=0') - }} /> + headerLeft: () => ( + { + handleBack() + }} + /> + ), + headerTitle: "Tambah Kegiatan", + headerTitleAlign: "center", + headerRight: () => ( + { + ToastAndroid.show("Berhasil menambah data", ToastAndroid.SHORT); + router.push("/project?status=0"); + }} + /> + ), }} /> - { }} /> - - - - - {/* { - AlertKonfirmasi({ - title: 'Konfirmasi', - desc: 'Apakah anda yakin ingin menambahkan data?', - onPress: () => { - ToastAndroid.show('Berhasil menambahkan data', ToastAndroid.SHORT) - router.push('/project?status=0') + setValChoose(chooseGroup.val); + setValSelect("group"); + setSelect(true); + }} + /> + { validationForm("title", val) }} + /> + { + router.push(`/project/create/task`) + }} /> + + { + if (chooseGroup.val != "") { + setSelect(true); + setValSelect("member"); + } else { + ToastAndroid.show( + "Pilih Lembaga Desa terlebih dahulu", + ToastAndroid.SHORT + ); + } + }} + /> + { + entitiesMember.length > 0 && + + + Anggota + Total {entitiesMember.length} Anggota + + + + { + entitiesMember.map((item: { img: any; name: any; }, index: any) => { + return ( + + } + title={item.name} + /> + ) + }) } - }) - }} /> */} + + + } + + { + validationForm(valSelect, value.val, value.label); + }} + title={valSelect == "group" ? "Lembaga Desa" : "Pilih Anggota"} + open={isSelect} + idParent={valSelect == "member" ? chooseGroup.val : ""} + valChoose={valChoose} + /> - ) -} \ No newline at end of file + ); +} diff --git a/app/(application)/project/create/task.tsx b/app/(application)/project/create/task.tsx new file mode 100644 index 0000000..0fc8424 --- /dev/null +++ b/app/(application)/project/create/task.tsx @@ -0,0 +1,153 @@ +import ButtonBackHeader from "@/components/buttonBackHeader"; +import ButtonSaveHeader from "@/components/buttonSaveHeader"; +import { InputForm } from "@/components/inputForm"; +import Styles from "@/constants/Styles"; +import { setTaskCreate } from "@/lib/taskCreate"; +import dayjs from "dayjs"; +import { router, Stack } from "expo-router"; +import { useEffect, useState } from "react"; +import { + SafeAreaView, + ScrollView, + Text, + View +} from "react-native"; +import DateTimePicker, { + DateType +} from "react-native-ui-datepicker"; +import { useDispatch, useSelector } from "react-redux"; + +export default function CreateProjectAddTask() { + const dispatch = useDispatch() + const [disable, setDisable] = useState(true); + const [range, setRange] = useState<{ + startDate: DateType; + endDate: DateType; + }>({ startDate: undefined, endDate: undefined }); + const [error, setError] = useState({ + startDate: false, + endDate: false, + title: false, + }) + const [title, setTitle] = useState(''); + const taskCreate = useSelector((state: any) => state.taskCreate) + + const from = range.startDate + ? dayjs(range.startDate).format("DD-MM-YYYY") + : ""; + const to = range.endDate ? dayjs(range.endDate).format("DD-MM-YYYY") : ""; + + function checkAll() { + if (from == "" || to == "" || title == "" || title == "null" || error.startDate || error.endDate || error.title) { + setDisable(true) + } else { + setDisable(false) + } + } + + function onValidation(cat: string, val: string) { + if (cat == "title") { + setTitle(val) + if (val == "" || val == "null") { + setError(error => ({ ...error, title: true })) + } else { + setError(error => ({ ...error, title: false })) + } + } + } + + useEffect(() => { + checkAll() + }, [from, to, title, error]) + + async function handleCreate() { + try { + dispatch(setTaskCreate([...taskCreate, { + name: title, + dateStart: from, + dateEnd: to, + }])) + router.back(); + } catch (error) { + console.error(error); + } + } + + return ( + + ( + { + router.back(); + }} + /> + ), + headerTitle: "Tambah Tugas", + headerTitleAlign: "center", + headerRight: () => ( + { handleCreate() }} + /> + ), + }} + /> + + + + setRange(param)} + styles={{ + selected: Styles.selectedDate, + selected_label: Styles.cWhite, + range_fill: Styles.selectRangeDate, + }} + /> + + + + + + Tanggal Mulai * + + + {from} + + + + + Tanggal Berakhir * + + + {to} + + + + { + (error.endDate || error.startDate) && Tanggal tidak boleh kosong + } + + { + onValidation("title", e) + }} + /> + + + + ); +} diff --git a/lib/store.ts b/lib/store.ts index eef7768..d22690c 100644 --- a/lib/store.ts +++ b/lib/store.ts @@ -9,6 +9,7 @@ import memberChoose from './memberChoose'; import memberUpdate from './memberSlice'; import positionUpdate from './positionSlice'; import projectUpdate from './projectUpdate'; +import taskCreate from './taskCreate'; import userReducer from './userSlice'; const store = configureStore({ @@ -24,6 +25,7 @@ const store = configureStore({ memberChoose: memberChoose, announcementUpdate: announcementUpdate, projectUpdate: projectUpdate, + taskCreate: taskCreate, } }); diff --git a/lib/taskCreate.ts b/lib/taskCreate.ts new file mode 100644 index 0000000..387a015 --- /dev/null +++ b/lib/taskCreate.ts @@ -0,0 +1,14 @@ +import { createSlice } from '@reduxjs/toolkit'; + +const taskCreate = createSlice({ + name: 'taskCreate', + initialState: [], + reducers: { + setTaskCreate: (state, action) => { + return action.payload; + }, + }, +}); + +export const { setTaskCreate } = taskCreate.actions; +export default taskCreate.reducer; \ No newline at end of file