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/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"
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)/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() {
/>
-
+
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/[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)/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)/home.tsx b/app/(application)/home.tsx
index d56537e..10cce08 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,13 @@ export default function Home() {
});
}
+ const handleRefresh = async () => {
+ setRefreshing(true)
+ handleUserLogin()
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ setRefreshing(false)
+ };
+
return (
-
-
+
+ }
+ showsVerticalScrollIndicator={false}
+ >
+
-
-
-
-
-
-
+
+
+
+
+
+
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)/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
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() {
/>
}}
/>
-
+
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 (
-
+
([])
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
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 (
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 ? ()
:
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]);
diff --git a/components/modalSelect.tsx b/components/modalSelect.tsx
index e253c65..57a5c29 100644
--- a/components/modalSelect.tsx
+++ b/components/modalSelect.tsx
@@ -135,7 +135,7 @@ export default function ModalSelect({ open, close, title, category, idParent, on
selectMember.length > 0
?
-
+
{
selectMember.map((item: any, index: any) => (
}
-
+
{
category != 'status-task' ?
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 = (
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;
};