From 4768007df3671b185c0373dcca0104bfaac5db8c Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 10:47:43 +0800 Subject: [PATCH 01/11] fix:tinggi scroll profile --- app/(application)/profile.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/(application)/profile.tsx b/app/(application)/profile.tsx index 626172b..877c2d5 100644 --- a/app/(application)/profile.tsx +++ b/app/(application)/profile.tsx @@ -38,7 +38,7 @@ export default function Profile() { /> }} /> - + Date: Tue, 9 Sep 2025 11:05:37 +0800 Subject: [PATCH 02/11] fix: pencarian Deskripsi: - scroll height - tanpa wrap - pake scroll map No Issues --- app/(application)/search.tsx | 76 +++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/app/(application)/search.tsx b/app/(application)/search.tsx index 8490613..933930b 100644 --- a/app/(application)/search.tsx +++ b/app/(application)/search.tsx @@ -1,5 +1,6 @@ import BorderBottomItem from "@/components/borderBottomItem"; import ButtonBackHeader from "@/components/buttonBackHeader"; +import ImageUser from "@/components/imageNew"; import InputSearch from "@/components/inputSearch"; import Text from '@/components/Text'; import { ColorsStatus } from "@/constants/ColorsStatus"; @@ -9,8 +10,8 @@ import { apiGetSearch } from "@/lib/api"; import { useAuthSession } from "@/providers/AuthProvider"; import { AntDesign, MaterialIcons } from "@expo/vector-icons"; import { router, Stack } from "expo-router"; -import { useState } from "react"; -import { FlatList, Image, SafeAreaView, View } from "react-native"; +import React, { useState } from "react"; +import { RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; import Toast from "react-native-toast-message"; type PropsUser = { @@ -40,10 +41,13 @@ export default function Search() { const [dataUser, setDataUser] = useState([]) const [dataDivisi, setDataDivisi] = useState([]) const [dataProject, setDataProject] = useState([]) + const [refreshing, setRefreshing] = useState(false) + const [search, setSearch] = useState('') async function handleSearch(cari: string) { try { - if (cari.length > 3) { + setSearch(cari) + if (cari.length >= 3) { const user = await decryptToken(String(token?.current)) const hasil = await apiGetSearch({ text: cari, user: user }) if (hasil.success) { @@ -65,6 +69,14 @@ export default function Search() { } + const handleRefresh = async () => { + setRefreshing(true) + handleSearch(search) + await new Promise(resolve => setTimeout(resolve, 2000)); + setRefreshing(false) + }; + + return ( <> @@ -80,41 +92,44 @@ export default function Search() { { dataProject.length + dataDivisi.length + dataUser.length > 0 ? - + + } + > { dataUser.length > 0 && - + ANGGOTA - String(item.id)} - renderItem={({ item }) => ( + { + dataUser.map((item, index) => ( } + icon={} title={item.name} subtitle={`${item.group}-${item.position}`} onPress={() => { router.push(`/member/${item.id}`) }} /> - )} - /> + )) + } } { dataDivisi.length > 0 && - + DIVISI - String(item.id)} - renderItem={({ item }) => ( + { + dataDivisi.map((item, index) => ( @@ -127,21 +142,20 @@ export default function Search() { router.push(`/division/${item.id}`) }} /> - )} - /> + )) + } } { dataProject.length > 0 && - + KEGIATAN - String(item.id)} - renderItem={({ item }) => ( + { + dataProject.map((item, index) => ( @@ -154,13 +168,11 @@ export default function Search() { router.push(`/project/${item.id}`) }} /> - )} - /> + )) + } } - - - + : Tidak ada data From c8de5d185acb81e63be11fba0a22199c43b310fd Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 11:09:19 +0800 Subject: [PATCH 03/11] fix : notification page Deskripsi: - load refresh notification page No Issues --- app/(application)/notification.tsx | 42 ++++++++++-------------------- 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/app/(application)/notification.tsx b/app/(application)/notification.tsx index 49c4e25..0722e26 100644 --- a/app/(application)/notification.tsx +++ b/app/(application)/notification.tsx @@ -9,7 +9,7 @@ import { pushToPage } from "@/lib/pushToPage"; import { useAuthSession } from "@/providers/AuthProvider"; import { Feather } from "@expo/vector-icons"; import { useEffect, useState } from "react"; -import { SafeAreaView, View, VirtualizedList } from "react-native"; +import { RefreshControl, SafeAreaView, View, VirtualizedList } from "react-native"; import { useDispatch, useSelector } from "react-redux"; type Props = { @@ -31,6 +31,7 @@ export default function Notification() { const arrSkeleton = Array.from({ length: 5 }, (_, index) => index) const dispatch = useDispatch() const updateNotification = useSelector((state: any) => state.notificationUpdate) + const [refreshing, setRefreshing] = useState(false) async function handleLoad(loading: boolean, thisPage: number) { try { @@ -88,33 +89,12 @@ export default function Notification() { } } - // function pushToPage(category: string, idContent: string) { - // const cat = category.split('/') - // if (cat.length > 1) { - // if (cat[2] == 'calendar') { - // router.push(`/division/${cat[1]}/calendar/${idContent}`) - // } else if (cat[2] == 'discussion') { - // router.push(`/division/${cat[1]}/discussion/${idContent}`) - // } else if (cat[2] == 'document') { - // router.push(`/division/${cat[1]}/document/${idContent}`) - // } else if (cat[2] == 'task') { - // router.push(`/division/${cat[1]}/task/${idContent}`) - // } - // } else { - // if (cat[0] == 'announcement') { - // router.push(`/announcement/${idContent}`) - // } else if (cat[0] == 'discussion-general') { - // router.push(`/discussion/${idContent}`) - // } else if (cat[0] == 'division') { - // router.push(`/division/${idContent}`) - // } else if (cat[0] == 'member') { - // router.push(`/member/${idContent}`) - // } else if (cat[0] == 'project') { - // router.push(`/project/${idContent}`) - // } - // } - // } - + const handleRefresh = async () => { + setRefreshing(true) + handleLoad(false, 1) + await new Promise(resolve => setTimeout(resolve, 2000)); + setRefreshing(false) + }; return ( @@ -156,6 +136,12 @@ export default function Notification() { onEndReached={loadMoreData} onEndReachedThreshold={0.5} showsVerticalScrollIndicator={false} + refreshControl={ + + } /> : Tidak ada data From a15724756e41a03c8e0a55618f357769909d3ca3 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 11:15:49 +0800 Subject: [PATCH 04/11] fix: diskusi divisi Deskripsi: - multiline input deskripsi pada tambah dan edit diskusi divisi No Issues --- .../[id]/(fitur-division)/discussion/[detail]/edit.tsx | 1 + .../division/[id]/(fitur-division)/discussion/create.tsx | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) 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 0e823b0..e06d56e 100644 --- a/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/edit.tsx +++ b/app/(application)/division/[id]/(fitur-division)/discussion/[detail]/edit.tsx @@ -93,6 +93,7 @@ export default function DiscussionDivisionEdit() { required value={data} onChange={setData} + multiline /> diff --git a/app/(application)/division/[id]/(fitur-division)/discussion/create.tsx b/app/(application)/division/[id]/(fitur-division)/discussion/create.tsx index 5a8faf2..ced0190 100644 --- a/app/(application)/division/[id]/(fitur-division)/discussion/create.tsx +++ b/app/(application)/division/[id]/(fitur-division)/discussion/create.tsx @@ -56,7 +56,14 @@ export default function CreateDiscussionDivision() { /> - + From 060f96e7b2d215aff57d02ee828609d509828f63 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 11:49:13 +0800 Subject: [PATCH 05/11] upd : home page Deskripsi: - load refresh pada halaman home No Issues --- app/(application)/home.tsx | 37 ++++++++++++++++++++-------- components/home/carouselHome.tsx | 7 +++++- components/home/chartDokumenHome.tsx | 13 +++++++--- components/home/chartProgresHome.tsx | 13 +++++++--- components/home/discussionHome.tsx | 13 +++++++--- components/home/divisionHome.tsx | 15 +++++++---- components/home/eventHome.tsx | 13 +++++++--- components/home/projectHome.tsx | 15 +++++++---- 8 files changed, 89 insertions(+), 37 deletions(-) diff --git a/app/(application)/home.tsx b/app/(application)/home.tsx index d56537e..8d38e1c 100644 --- a/app/(application)/home.tsx +++ b/app/(application)/home.tsx @@ -13,8 +13,8 @@ import { apiGetProfile } from "@/lib/api"; import { setEntities } from "@/lib/entitiesSlice"; import { useAuthSession } from "@/providers/AuthProvider"; import { Stack } from "expo-router"; -import { useEffect } from "react"; -import { Platform, SafeAreaView, ScrollView, View } from "react-native"; +import { useEffect, useState } from "react"; +import { Platform, RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useDispatch, useSelector } from "react-redux"; @@ -24,6 +24,7 @@ export default function Home() { const dispatch = useDispatch() const { token, decryptToken, signOut } = useAuthSession() const insets = useSafeAreaInsets() + const [refreshing, setRefreshing] = useState(false) useEffect(() => { handleUserLogin() @@ -38,6 +39,14 @@ export default function Home() { }); } + const handleRefresh = async () => { + setRefreshing(true) + // await handleLoad('data') + // await handleLoad('progress') + await new Promise(resolve => setTimeout(resolve, 2000)); + setRefreshing(false) + }; + return ( - - + + } + showsVerticalScrollIndicator={false} + > + - - - - - - + + + + + + diff --git a/components/home/carouselHome.tsx b/components/home/carouselHome.tsx index 2ce9e3a..d2610b1 100644 --- a/components/home/carouselHome.tsx +++ b/components/home/carouselHome.tsx @@ -11,7 +11,7 @@ import Carousel, { ICarouselInstance } from "react-native-reanimated-carousel"; import { useDispatch, useSelector } from "react-redux"; import Text from "../Text"; -export default function CaraouselHome() { +export default function CaraouselHome({ refreshing }: { refreshing: boolean }) { const { decryptToken, token } = useAuthSession() const ref = React.useRef(null); const width = Dimensions.get("window").width; @@ -37,6 +37,11 @@ export default function CaraouselHome() { dispatch(setEntityUser({ role: response.data.idUserRole, admin: false })) } + useEffect(() => { + if (refreshing) + handleBannerView() + }, [refreshing]); + useEffect(() => { handleBannerView() }, [dispatch]); diff --git a/components/home/chartDokumenHome.tsx b/components/home/chartDokumenHome.tsx index abcb058..f78be1f 100644 --- a/components/home/chartDokumenHome.tsx +++ b/components/home/chartDokumenHome.tsx @@ -13,7 +13,7 @@ type Props = { frontColor: string; }[] -export default function ChartDokumenHome() { +export default function ChartDokumenHome({ refreshing }: { refreshing: boolean }) { const [loading, setLoading] = useState(true) const { decryptToken, token } = useAuthSession() const [data, setData] = useState([]) @@ -25,9 +25,9 @@ export default function ChartDokumenHome() { const width = Dimensions.get("window").width; - async function handleData() { + async function handleData(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDataHome({ cat: "dokumen", user: hasil }) const maxValue = response.data.reduce((max: number, obj: { value: number; }) => Math.max(max, obj.value), -Infinity); @@ -47,7 +47,12 @@ export default function ChartDokumenHome() { } useEffect(() => { - handleData() + if (refreshing) + handleData(false) + }, [refreshing]); + + useEffect(() => { + handleData(true) }, []); return ( diff --git a/components/home/chartProgresHome.tsx b/components/home/chartProgresHome.tsx index 2746637..3b2fe67 100644 --- a/components/home/chartProgresHome.tsx +++ b/components/home/chartProgresHome.tsx @@ -13,14 +13,14 @@ type Props = { color: string; }[] -export default function ChartProgresHome() { +export default function ChartProgresHome({ refreshing }: { refreshing: boolean }) { const { decryptToken, token } = useAuthSession() const [data, setData] = useState([]) const [loading, setLoading] = useState(true) - async function handleData() { + async function handleData(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDataHome({ cat: "progress", user: hasil }) const convertedArray = response.data.map((item: { color: any; text: any; value: any; }) => ({ @@ -37,7 +37,12 @@ export default function ChartProgresHome() { } useEffect(() => { - handleData() + if (refreshing) + handleData(false) + }, [refreshing]); + + useEffect(() => { + handleData(true) }, []); return ( diff --git a/components/home/discussionHome.tsx b/components/home/discussionHome.tsx index 60bb524..1a15e4d 100644 --- a/components/home/discussionHome.tsx +++ b/components/home/discussionHome.tsx @@ -17,15 +17,15 @@ type Props = { user: string } -export default function DisccussionHome() { +export default function DisccussionHome({ refreshing }: { refreshing: boolean }) { const { decryptToken, token } = useAuthSession() const [data, setData] = useState([]) const [loading, setLoading] = useState(true) - async function handleData() { + async function handleData(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDataHome({ cat: "discussion", user: hasil }) setData(response.data) @@ -37,7 +37,12 @@ export default function DisccussionHome() { } useEffect(() => { - handleData() + if (refreshing) + handleData(false) + }, [refreshing]); + + useEffect(() => { + handleData(true) }, []); return ( diff --git a/components/home/divisionHome.tsx b/components/home/divisionHome.tsx index a493c44..2dfd8b7 100644 --- a/components/home/divisionHome.tsx +++ b/components/home/divisionHome.tsx @@ -15,7 +15,7 @@ type Props = { jumlah: number } -export default function DivisionHome() { +export default function DivisionHome({ refreshing }: { refreshing: boolean }) { const { decryptToken, token } = useAuthSession() const ref = React.useRef(null) const width = Dimensions.get("window").width @@ -23,9 +23,9 @@ export default function DivisionHome() { const [loading, setLoading] = useState(true) const arrSkeleton = Array.from({ length: 2 }, (_, index) => index) - async function handleData() { + async function handleData(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDataHome({ cat: "division", user: hasil }) setData(response.data) @@ -37,14 +37,19 @@ export default function DivisionHome() { } useEffect(() => { - handleData() + if (refreshing) + handleData(false) + }, [refreshing]); + + useEffect(() => { + handleData(true) }, []); return ( - Divisi Teraktif + Divisi Teraktif { loading ? arrSkeleton.map((item, index) => ( diff --git a/components/home/eventHome.tsx b/components/home/eventHome.tsx index 3edaac0..4c03e4f 100644 --- a/components/home/eventHome.tsx +++ b/components/home/eventHome.tsx @@ -22,14 +22,14 @@ type Props = { user_name: string } -export default function EventHome() { +export default function EventHome({ refreshing }: { refreshing: boolean }) { const { decryptToken, token } = useAuthSession() const [data, setData] = useState([]) const [loading, setLoading] = useState(true) - async function handleData() { + async function handleData(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDataHome({ cat: "event", user: hasil }) setData(response.data) @@ -41,7 +41,12 @@ export default function EventHome() { } useEffect(() => { - handleData() + if (refreshing) + handleData(false) + }, [refreshing]); + + useEffect(() => { + handleData(true) }, []); return ( diff --git a/components/home/projectHome.tsx b/components/home/projectHome.tsx index 4916841..6f5f70b 100644 --- a/components/home/projectHome.tsx +++ b/components/home/projectHome.tsx @@ -20,16 +20,16 @@ type Props = { createdAt: string } -export default function ProjectHome() { +export default function ProjectHome({ refreshing }: { refreshing: boolean }) { const { decryptToken, token } = useAuthSession() const ref = React.useRef(null); const width = Dimensions.get("window").width; const [data, setData] = useState([]) const [loading, setLoading] = useState(true) - async function handleData() { + async function handleData(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDataHome({ cat: "kegiatan", user: hasil }) setData(response.data) @@ -41,12 +41,17 @@ export default function ProjectHome() { } useEffect(() => { - handleData() + if (refreshing) + handleData(false) + }, [refreshing]); + + useEffect(() => { + handleData(true) }, []); return ( - Kegiatan Terupdate + Kegiatan Terupdate { loading ? () : From d20307fc0be76abb6354c7c868b220fa142febc6 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 11:57:33 +0800 Subject: [PATCH 06/11] upd: refresh division detail home Deskripsi: - refresh load pada halaman home detail division No Issues --- app/(application)/division/[id]/index.tsx | 36 +++++++++++++------ app/(application)/home.tsx | 3 +- .../division/discussionDivisionDetail.tsx | 17 ++++++--- components/division/fileDivisionDetail.tsx | 13 ++++--- components/division/fiturDivisionDetail.tsx | 7 ++-- components/division/taskDivisionDetail.tsx | 13 ++++--- 6 files changed, 62 insertions(+), 27 deletions(-) diff --git a/app/(application)/division/[id]/index.tsx b/app/(application)/division/[id]/index.tsx index 4e12cf3..543407a 100644 --- a/app/(application)/division/[id]/index.tsx +++ b/app/(application)/division/[id]/index.tsx @@ -10,7 +10,7 @@ import { apiGetDivisionOneDetail } from "@/lib/api" import { useAuthSession } from "@/providers/AuthProvider" import { router, Stack, useLocalSearchParams } from "expo-router" import { useEffect, useState } from "react" -import { SafeAreaView, ScrollView, View } from "react-native" +import { RefreshControl, SafeAreaView, ScrollView, View } from "react-native" type Props = { id: string, @@ -26,11 +26,12 @@ export default function DetailDivisionFitur() { const { id } = useLocalSearchParams<{ id: string }>() const [data, setData] = useState() const [loading, setLoading] = useState(true) + const [refreshing, setRefreshing] = useState(false) - async function handleLoad() { + async function handleLoad(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDivisionOneDetail({ user: hasil, id }) setData(response.data.division) @@ -42,9 +43,16 @@ export default function DetailDivisionFitur() { } useEffect(() => { - handleLoad() + handleLoad(true) }, []) + const handleRefresh = async () => { + setRefreshing(true) + handleLoad(false) + await new Promise(resolve => setTimeout(resolve, 2000)); + setRefreshing(false) + }; + return ( , }} /> - - + + } + showsVerticalScrollIndicator={false} + > + - - - - + + + + diff --git a/app/(application)/home.tsx b/app/(application)/home.tsx index 8d38e1c..10cce08 100644 --- a/app/(application)/home.tsx +++ b/app/(application)/home.tsx @@ -41,8 +41,7 @@ export default function Home() { const handleRefresh = async () => { setRefreshing(true) - // await handleLoad('data') - // await handleLoad('progress') + handleUserLogin() await new Promise(resolve => setTimeout(resolve, 2000)); setRefreshing(false) }; diff --git a/components/division/discussionDivisionDetail.tsx b/components/division/discussionDivisionDetail.tsx index 12a751d..9531cbe 100644 --- a/components/division/discussionDivisionDetail.tsx +++ b/components/division/discussionDivisionDetail.tsx @@ -16,15 +16,15 @@ type Props = { date: string; }; -export default function DiscussionDivisionDetail() { +export default function DiscussionDivisionDetail({ refreshing }: { refreshing: boolean }) { const { token, decryptToken } = useAuthSession(); const { id } = useLocalSearchParams<{ id: string }>(); const [data, setData] = useState([]); const [loading, setLoading] = useState(true) - async function handleLoad() { + async function handleLoad(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)); const response = await apiGetDivisionOneFeature({ user: hasil, @@ -40,8 +40,15 @@ export default function DiscussionDivisionDetail() { } useEffect(() => { - handleLoad(); - }, []); + if (refreshing) + handleLoad(false) + }, [refreshing]) + + useEffect(() => { + handleLoad(true) + }, []) + + return ( Diskusi diff --git a/components/division/fileDivisionDetail.tsx b/components/division/fileDivisionDetail.tsx index 01e89a2..a6825d6 100644 --- a/components/division/fileDivisionDetail.tsx +++ b/components/division/fileDivisionDetail.tsx @@ -24,7 +24,7 @@ type Props = { idStorage: string } -export default function FileDivisionDetail() { +export default function FileDivisionDetail({ refreshing }: { refreshing: boolean }) { const ref = React.useRef(null); const width = Dimensions.get("window").width; const [data, setData] = useState([]) @@ -33,9 +33,9 @@ export default function FileDivisionDetail() { const [loading, setLoading] = useState(true) const [loadingOpen, setLoadingOpen] = useState(false) - async function handleLoad() { + async function handleLoad(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDivisionOneFeature({ user: hasil, id, cat: 'new-file' }) setData(response.data) @@ -47,7 +47,12 @@ export default function FileDivisionDetail() { } useEffect(() => { - handleLoad() + if (refreshing) + handleLoad(false) + }, [refreshing]) + + useEffect(() => { + handleLoad(true) }, []) diff --git a/components/division/fiturDivisionDetail.tsx b/components/division/fiturDivisionDetail.tsx index d4682b0..9a2e2eb 100644 --- a/components/division/fiturDivisionDetail.tsx +++ b/components/division/fiturDivisionDetail.tsx @@ -16,7 +16,7 @@ type Props = { kalender: number } -export default function FiturDivisionDetail() { +export default function FiturDivisionDetail({ refreshing }: { refreshing: boolean }) { const { token, decryptToken } = useAuthSession() const { id } = useLocalSearchParams<{ id: string }>() const [data, setData] = useState({ @@ -36,7 +36,10 @@ export default function FiturDivisionDetail() { } } - + useEffect(() => { + if (refreshing) + handleLoad() + }, [refreshing]) useEffect(() => { handleLoad() diff --git a/components/division/taskDivisionDetail.tsx b/components/division/taskDivisionDetail.tsx index b589ce7..b839efc 100644 --- a/components/division/taskDivisionDetail.tsx +++ b/components/division/taskDivisionDetail.tsx @@ -18,7 +18,7 @@ type Props = { projectTitle: string } -export default function TaskDivisionDetail() { +export default function TaskDivisionDetail({ refreshing }: { refreshing: boolean }) { const { token, decryptToken } = useAuthSession() const { id } = useLocalSearchParams<{ id: string }>() const [data, setData] = useState([]) @@ -26,9 +26,9 @@ export default function TaskDivisionDetail() { const width = Dimensions.get("window").width; const [loading, setLoading] = useState(true) - async function handleLoad() { + async function handleLoad(loading: boolean) { try { - setLoading(true) + setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetDivisionOneFeature({ user: hasil, id, cat: 'today-task' }) setData(response.data) @@ -40,7 +40,12 @@ export default function TaskDivisionDetail() { } useEffect(() => { - handleLoad() + if (refreshing) + handleLoad(false) + }, [refreshing]) + + useEffect(() => { + handleLoad(true) }, []) return ( From 8d6a0d3981df38c33e205fea53c8f1ff159e0cf0 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 12:05:04 +0800 Subject: [PATCH 07/11] fixx :api tambah pengumuman --- lib/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/api.ts b/lib/api.ts index 26bc41f..213d8e1 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -234,7 +234,7 @@ export const apiGetDivisionGroup = async ({ user }: { user: string }) => { }; export const apiCreateAnnouncement = async ({ data }: { data: { title: string, desc: string, user: string, groups: any[] } }) => { - const response = await api.post(`/mobile/announcement/`, data) + const response = await api.post(`/mobile/announcement`, data) return response.data; }; From 1509d1b7023b71463594ca4bb8ea4a65a500378b Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 12:05:24 +0800 Subject: [PATCH 08/11] upd: version app --- app.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.config.js b/app.config.js index 7d27747..efc31f7 100644 --- a/app.config.js +++ b/app.config.js @@ -4,7 +4,7 @@ export default { expo: { name: "Desa+", slug: "mobile-darmasaba", - version: "1.0.2", + version: "1.0.3", jsEngine: "jsc", orientation: "portrait", icon: "./assets/images/logo-icon-small.png", @@ -22,7 +22,7 @@ export default { }, android: { package: "mobiledarmasaba.app", - versionCode: 6, + versionCode: 7, adaptiveIcon: { foregroundImage: "./assets/images/logo-icon-small.png", backgroundColor: "#ffffff" From 83291676d3cd829da86d1da181c15c51ca5cd6fa Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 12:30:40 +0800 Subject: [PATCH 09/11] upd : scroll view Deskripsi: - horizontal view hide - vertical view hide - scroll view height No Issues --- app/(application)/announcement/[id].tsx | 21 ++++++- app/(application)/announcement/create.tsx | 7 ++- app/(application)/announcement/edit/[id].tsx | 7 ++- app/(application)/banner/[id].tsx | 2 +- app/(application)/banner/create.tsx | 4 +- app/(application)/discussion/[id].tsx | 2 +- .../discussion/add-member/[id].tsx | 6 +- app/(application)/discussion/create.tsx | 2 +- app/(application)/discussion/edit/[id].tsx | 2 +- .../calendar/[detail]/add-member.tsx | 6 +- .../calendar/create-member.tsx | 6 +- .../task/[detail]/add-member.tsx | 6 +- .../(fitur-division)/task/create/member.tsx | 6 +- .../[id]/(fitur-division)/task/index.tsx | 2 +- .../division/[id]/add-member.tsx | 6 +- .../division/create/add-member.tsx | 6 +- app/(application)/member/create.tsx | 2 +- app/(application)/member/edit/[id].tsx | 4 +- app/(application)/project/[id]/add-member.tsx | 60 +++++++++++-------- app/(application)/project/[id]/cancel.tsx | 8 ++- app/(application)/project/[id]/report.tsx | 7 ++- app/(application)/project/create.tsx | 7 ++- app/(application)/project/create/member.tsx | 6 +- app/(application)/project/index.tsx | 2 +- components/modalSelect.tsx | 4 +- 25 files changed, 124 insertions(+), 67 deletions(-) diff --git a/app/(application)/announcement/[id].tsx b/app/(application)/announcement/[id].tsx index 24e82b5..3b956ee 100644 --- a/app/(application)/announcement/[id].tsx +++ b/app/(application)/announcement/[id].tsx @@ -8,7 +8,7 @@ import { useAuthSession } from "@/providers/AuthProvider"; import { Entypo, MaterialIcons } from "@expo/vector-icons"; import { router, Stack, useLocalSearchParams } from "expo-router"; import React, { useEffect, useState } from "react"; -import { Dimensions, SafeAreaView, ScrollView, View } from "react-native"; +import { Dimensions, RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; import RenderHTML from 'react-native-render-html'; import { useSelector } from "react-redux"; @@ -28,6 +28,7 @@ export default function DetailAnnouncement() { const contentWidth = Dimensions.get('window').width const [loading, setLoading] = useState(true) const arrSkeleton = Array.from({ length: 2 }, (_, index) => index) + const [refreshing, setRefreshing] = useState(false) async function handleLoad(loading: boolean) { try { @@ -56,6 +57,13 @@ export default function DetailAnnouncement() { return htmlRegex.test(text); }; + const handleRefresh = async () => { + setRefreshing(true) + handleLoad(false) + await new Promise(resolve => setTimeout(resolve, 2000)); + setRefreshing(false) + }; + return ( entityUser.role != 'user' && entityUser.role != 'coadmin' ? : <>, }} /> - + handleRefresh()} + /> + } + > { diff --git a/app/(application)/announcement/create.tsx b/app/(application)/announcement/create.tsx index 92c26a1..152e9cc 100644 --- a/app/(application)/announcement/create.tsx +++ b/app/(application)/announcement/create.tsx @@ -110,8 +110,11 @@ export default function CreateAnnouncement() { ), }} /> - - + + - - + + , }} /> - + {selectedImage != undefined ? ( diff --git a/app/(application)/banner/create.tsx b/app/(application)/banner/create.tsx index 760cf6a..94bcec2 100644 --- a/app/(application)/banner/create.tsx +++ b/app/(application)/banner/create.tsx @@ -117,8 +117,8 @@ export default function CreateBanner() { ), }} /> - - + + {selectedImage != undefined ? ( diff --git a/app/(application)/discussion/[id].tsx b/app/(application)/discussion/[id].tsx index b346042..d071514 100644 --- a/app/(application)/discussion/[id].tsx +++ b/app/(application)/discussion/[id].tsx @@ -139,7 +139,7 @@ export default function DetailDiscussionGeneral() { }} /> - + { loading ? diff --git a/app/(application)/discussion/add-member/[id].tsx b/app/(application)/discussion/add-member/[id].tsx index dec65bb..d7b3d57 100644 --- a/app/(application)/discussion/add-member/[id].tsx +++ b/app/(application)/discussion/add-member/[id].tsx @@ -116,7 +116,7 @@ export default function AddMemberDiscussionDetail() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/discussion/create.tsx b/app/(application)/discussion/create.tsx index 92124b1..dc395f1 100644 --- a/app/(application)/discussion/create.tsx +++ b/app/(application)/discussion/create.tsx @@ -142,7 +142,7 @@ export default function CreateDiscussionGeneral() { ), }} /> - + { (entityUser.role == "supadmin" || diff --git a/app/(application)/discussion/edit/[id].tsx b/app/(application)/discussion/edit/[id].tsx index c3bac2d..d7bd3fa 100644 --- a/app/(application)/discussion/edit/[id].tsx +++ b/app/(application)/discussion/edit/[id].tsx @@ -119,7 +119,7 @@ export default function EditDiscussionGeneral() { ), }} /> - + 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? data.map((item: any, index: any) => { diff --git a/app/(application)/division/[id]/(fitur-division)/calendar/create-member.tsx b/app/(application)/division/[id]/(fitur-division)/calendar/create-member.tsx index 9926406..d13e852 100644 --- a/app/(application)/division/[id]/(fitur-division)/calendar/create-member.tsx +++ b/app/(application)/division/[id]/(fitur-division)/calendar/create-member.tsx @@ -112,7 +112,7 @@ export default function CreateCalendarAddMember() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx b/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx index 3c5bf16..3fc9df8 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/[detail]/add-member.tsx @@ -118,7 +118,7 @@ export default function AddMemberTask() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx b/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx index 347dc9d..3a1f4d3 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/create/member.tsx @@ -88,7 +88,7 @@ export default function AddMemberCreateTask() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/division/[id]/(fitur-division)/task/index.tsx b/app/(application)/division/[id]/(fitur-division)/task/index.tsx index 98ed95b..f10ec0d 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/index.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/index.tsx @@ -106,7 +106,7 @@ export default function ListTask() { return ( - + 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/division/create/add-member.tsx b/app/(application)/division/create/add-member.tsx index 8ccdbe6..c79fa46 100644 --- a/app/(application)/division/create/add-member.tsx +++ b/app/(application)/division/create/add-member.tsx @@ -81,7 +81,7 @@ export default function CreateDivisionAddMember() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/member/create.tsx b/app/(application)/member/create.tsx index 1fba8e9..79baf0a 100644 --- a/app/(application)/member/create.tsx +++ b/app/(application)/member/create.tsx @@ -231,7 +231,7 @@ export default function CreateMember() { behavior={Platform.OS === 'ios' ? 'padding' : undefined} keyboardVerticalOffset={headerHeight} > - + {selectedImage != undefined ? ( diff --git a/app/(application)/member/edit/[id].tsx b/app/(application)/member/edit/[id].tsx index 8d2d7e5..f4ba6fb 100644 --- a/app/(application)/member/edit/[id].tsx +++ b/app/(application)/member/edit/[id].tsx @@ -264,8 +264,8 @@ export default function EditMember() { behavior={Platform.OS === 'ios' ? 'padding' : undefined} keyboardVerticalOffset={headerHeight} > - - + + { errorImg ? diff --git a/app/(application)/project/[id]/add-member.tsx b/app/(application)/project/[id]/add-member.tsx index 3316bd9..7f8d106 100644 --- a/app/(application)/project/[id]/add-member.tsx +++ b/app/(application)/project/[id]/add-member.tsx @@ -117,7 +117,7 @@ export default function AddMemberProject() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? - data.map((item: any, index: any) => { - const found = dataOld.some((i: any) => i.idUser == item.id) - return ( - { - !found && onChoose(item.id, item.name, item.img) - }} - > - - - - {item.name} + + { + data.map((item: any, index: any) => { + const found = dataOld.some((i: any) => i.idUser == item.id) + return ( + { + !found && onChoose(item.id, item.name, item.img) + }} + > + + + + {item.name} + { + found && sudah menjadi anggota + } + + { - found && sudah menjadi anggota + selectMember.some((i: any) => i.idUser == item.id) && } - - - { - selectMember.some((i: any) => i.idUser == item.id) && - } - - ) - } - ) + + ) + } + ) + } + + : Tidak ada data } diff --git a/app/(application)/project/[id]/cancel.tsx b/app/(application)/project/[id]/cancel.tsx index cb7b6ea..85f5b9a 100644 --- a/app/(application)/project/[id]/cancel.tsx +++ b/app/(application)/project/[id]/cancel.tsx @@ -88,8 +88,11 @@ export default function ProjectCancel() { ), }} /> - - + + onValidation(val)} + multiline /> diff --git a/app/(application)/project/[id]/report.tsx b/app/(application)/project/[id]/report.tsx index 8455332..61220a1 100644 --- a/app/(application)/project/[id]/report.tsx +++ b/app/(application)/project/[id]/report.tsx @@ -107,8 +107,11 @@ export default function ReportProject() { ), }} /> - - + + - - + + { (entityUser.role == "supadmin" || entityUser.role == "developer") && diff --git a/app/(application)/project/create/member.tsx b/app/(application)/project/create/member.tsx index 7fcd303..26734fa 100644 --- a/app/(application)/project/create/member.tsx +++ b/app/(application)/project/create/member.tsx @@ -95,7 +95,7 @@ export default function AddMemberCreateProject() { selectMember.length > 0 ? - + { selectMember.map((item: any, index: any) => ( Tidak ada member yang dipilih } - + { data.length > 0 ? diff --git a/app/(application)/project/index.tsx b/app/(application)/project/index.tsx index e168c00..f5637ca 100644 --- a/app/(application)/project/index.tsx +++ b/app/(application)/project/index.tsx @@ -120,7 +120,7 @@ export default function ListProject() { return ( - + 0 ? - + { selectMember.map((item: any, index: any) => ( } - + { category != 'status-task' ? From 1853cb573ccd259d8663c590a1d6e2d45a560fac Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 14:35:45 +0800 Subject: [PATCH 10/11] upd : modal filter Deskripsi: - update refresh modal filter saat ada perubahan data grup No Issues --- components/modalFilter.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/modalFilter.tsx b/components/modalFilter.tsx index f249c42..cd88dd7 100644 --- a/components/modalFilter.tsx +++ b/components/modalFilter.tsx @@ -33,6 +33,7 @@ export default function ModalFilter({ open, close, page, category }: Props) { const { token, decryptToken } = useAuthSession() const dispatch = useDispatch() const entities = useSelector((state: any) => state.filterGroup) + const update = useSelector((state: any) => state.groupUpdate) const [chooseGroup, setChooseGroup] = useState('') async function handleLoad() { @@ -42,10 +43,8 @@ export default function ModalFilter({ open, close, page, category }: Props) { } useEffect(() => { - if (entities.length == 0) { handleLoad() - } - }, [dispatch]); + }, [dispatch, update]); From d52453c5300a43e41f046439a897d9d18f4ab4fe Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 9 Sep 2025 16:40:26 +0800 Subject: [PATCH 11/11] upd: ios --- .gitignore | 1 - ios/Desa.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 87746a2..b169fb4 100644 --- a/.gitignore +++ b/.gitignore @@ -45,5 +45,4 @@ x.sh google-services.json service-account.json -GoogleService-Info.plist.bak diff --git a/ios/Desa.xcodeproj/project.pbxproj b/ios/Desa.xcodeproj/project.pbxproj index 3cb00ac..7a89838 100644 --- a/ios/Desa.xcodeproj/project.pbxproj +++ b/ios/Desa.xcodeproj/project.pbxproj @@ -376,7 +376,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 5W96P6CVXB; + DEVELOPMENT_TEAM = BMY6GT6W3D; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -416,7 +416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 5W96P6CVXB; + DEVELOPMENT_TEAM = BMY6GT6W3D; INFOPLIST_FILE = Desa/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = (