Compare commits
19 Commits
amalia/19-
...
join
| Author | SHA1 | Date | |
|---|---|---|---|
| f939ddb5f5 | |||
| e135c9dc11 | |||
| 144db584d0 | |||
| 90551399a5 | |||
| 0d46d76c70 | |||
| e3d2752a4c | |||
| 4dcfcbb7a7 | |||
| f27707eb74 | |||
| e4e8b44c45 | |||
| 79c9c9046c | |||
| f6122fb35a | |||
| 2ae88ff2e3 | |||
| fbf25bdd59 | |||
| 600218cb11 | |||
| 18eea92cfd | |||
| 1c3aa308d1 | |||
| c21d928701 | |||
| d8a50cbc75 | |||
| 59459e2c22 |
@@ -92,8 +92,8 @@ android {
|
|||||||
applicationId 'mobiledarmasaba.app'
|
applicationId 'mobiledarmasaba.app'
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 16
|
versionCode 17
|
||||||
versionName "2.1.0"
|
versionName "2.2.0"
|
||||||
}
|
}
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
debug {
|
debug {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove"/>
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
|
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
|
||||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
|
|
||||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
|
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ export default {
|
|||||||
expo: {
|
expo: {
|
||||||
name: "Desa+",
|
name: "Desa+",
|
||||||
slug: "mobile-darmasaba",
|
slug: "mobile-darmasaba",
|
||||||
version: "2.1.0", // Versi aplikasi (App Store)
|
version: "2.2.0", // Versi aplikasi (App Store)
|
||||||
jsEngine: "jsc",
|
jsEngine: "jsc",
|
||||||
orientation: "portrait",
|
orientation: "portrait",
|
||||||
icon: "./assets/images/logo-icon-small.png",
|
icon: "./assets/images/logo-icon-small.png",
|
||||||
@@ -14,7 +14,7 @@ export default {
|
|||||||
ios: {
|
ios: {
|
||||||
supportsTablet: true,
|
supportsTablet: true,
|
||||||
bundleIdentifier: "mobiledarmasaba.app",
|
bundleIdentifier: "mobiledarmasaba.app",
|
||||||
buildNumber: "9",
|
buildNumber: "10",
|
||||||
infoPlist: {
|
infoPlist: {
|
||||||
ITSAppUsesNonExemptEncryption: false,
|
ITSAppUsesNonExemptEncryption: false,
|
||||||
CFBundleDisplayName: "Desa+"
|
CFBundleDisplayName: "Desa+"
|
||||||
@@ -23,7 +23,7 @@ export default {
|
|||||||
},
|
},
|
||||||
android: {
|
android: {
|
||||||
package: "mobiledarmasaba.app",
|
package: "mobiledarmasaba.app",
|
||||||
versionCode: 16,
|
versionCode: 19,
|
||||||
adaptiveIcon: {
|
adaptiveIcon: {
|
||||||
foregroundImage: "./assets/images/logo-icon-small.png",
|
foregroundImage: "./assets/images/logo-icon-small.png",
|
||||||
backgroundColor: "#ffffff"
|
backgroundColor: "#ffffff"
|
||||||
@@ -32,9 +32,7 @@ export default {
|
|||||||
permissions: [
|
permissions: [
|
||||||
"READ_EXTERNAL_STORAGE",
|
"READ_EXTERNAL_STORAGE",
|
||||||
"WRITE_EXTERNAL_STORAGE",
|
"WRITE_EXTERNAL_STORAGE",
|
||||||
"READ_MEDIA_IMAGES", // Android 13+
|
"READ_MEDIA_AUDIO"
|
||||||
"READ_MEDIA_VIDEO", // Android 13+
|
|
||||||
"READ_MEDIA_AUDIO" // Android 13+
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
web: {
|
web: {
|
||||||
|
|||||||
@@ -1,21 +1,18 @@
|
|||||||
import AppHeader from "@/components/AppHeader";
|
import AppHeader from "@/components/AppHeader";
|
||||||
import BorderBottomItem from "@/components/borderBottomItem";
|
|
||||||
import DrawerBottom from "@/components/drawerBottom";
|
import DrawerBottom from "@/components/drawerBottom";
|
||||||
import ImageUser from "@/components/imageNew";
|
import ImageUser from "@/components/imageNew";
|
||||||
import MenuItemRow from "@/components/menuItemRow";
|
import MenuItemRow from "@/components/menuItemRow";
|
||||||
import ModalConfirmation from "@/components/ModalConfirmation";
|
import ModalConfirmation from "@/components/ModalConfirmation";
|
||||||
import SkeletonTwoItem from "@/components/skeletonTwoItem";
|
|
||||||
import Text from '@/components/Text';
|
import Text from '@/components/Text';
|
||||||
import { ColorsStatus } from "@/constants/ColorsStatus";
|
|
||||||
import { ConstEnv } from "@/constants/ConstEnv";
|
import { ConstEnv } from "@/constants/ConstEnv";
|
||||||
import Styles from "@/constants/Styles";
|
import Styles from "@/constants/Styles";
|
||||||
import { apiDeleteMemberDiscussionGeneral, apiGetDiscussionGeneralOne } from "@/lib/api";
|
import { apiDeleteMemberDiscussionGeneral, apiGetDiscussionGeneralOne } from "@/lib/api";
|
||||||
import { useAuthSession } from "@/providers/AuthProvider";
|
import { useAuthSession } from "@/providers/AuthProvider";
|
||||||
import { useTheme } from "@/providers/ThemeProvider";
|
import { useTheme } from "@/providers/ThemeProvider";
|
||||||
import { Feather, MaterialCommunityIcons } from "@expo/vector-icons";
|
import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons";
|
||||||
import { router, Stack, useLocalSearchParams } from "expo-router";
|
import { router, Stack, useLocalSearchParams } from "expo-router";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { SafeAreaView, ScrollView, View } from "react-native";
|
import { Pressable, SafeAreaView, ScrollView, View } from "react-native";
|
||||||
import Toast from "react-native-toast-message";
|
import Toast from "react-native-toast-message";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
|
|
||||||
@@ -25,6 +22,8 @@ type Props = {
|
|||||||
img: string
|
img: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SKELETON_COUNT = 5
|
||||||
|
|
||||||
export default function MemberDiscussionDetail() {
|
export default function MemberDiscussionDetail() {
|
||||||
const { token, decryptToken } = useAuthSession()
|
const { token, decryptToken } = useAuthSession()
|
||||||
const { colors } = useTheme();
|
const { colors } = useTheme();
|
||||||
@@ -35,13 +34,12 @@ export default function MemberDiscussionDetail() {
|
|||||||
const [chooseUser, setChooseUser] = useState({ idUser: '', name: '', img: '' })
|
const [chooseUser, setChooseUser] = useState({ idUser: '', name: '', img: '' })
|
||||||
const update = useSelector((state: any) => state.discussionGeneralDetailUpdate)
|
const update = useSelector((state: any) => state.discussionGeneralDetailUpdate)
|
||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
const arrSkeleton = Array.from({ length: 5 }, (_, index) => index)
|
|
||||||
const [showDeleteModal, setShowDeleteModal] = useState(false)
|
const [showDeleteModal, setShowDeleteModal] = useState(false)
|
||||||
|
const canManage = entityUser.role !== "user" && entityUser.role !== "coadmin"
|
||||||
|
|
||||||
|
async function handleLoad(showLoadingIndicator: boolean) {
|
||||||
async function handleLoad(loading: boolean) {
|
|
||||||
try {
|
try {
|
||||||
setLoading(loading)
|
setLoading(showLoadingIndicator)
|
||||||
const hasil = await decryptToken(String(token?.current))
|
const hasil = await decryptToken(String(token?.current))
|
||||||
const response = await apiGetDiscussionGeneralOne({ id: id, user: hasil, cat: 'anggota' })
|
const response = await apiGetDiscussionGeneralOne({ id: id, user: hasil, cat: 'anggota' })
|
||||||
setData(response.data)
|
setData(response.data)
|
||||||
@@ -52,26 +50,18 @@ export default function MemberDiscussionDetail() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => { handleLoad(false) }, [update]);
|
||||||
handleLoad(false)
|
useEffect(() => { handleLoad(true) }, []);
|
||||||
}, [update]);
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
handleLoad(true)
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
async function handleDeleteUser() {
|
async function handleDeleteUser() {
|
||||||
try {
|
try {
|
||||||
const hasil = await decryptToken(String(token?.current))
|
const hasil = await decryptToken(String(token?.current))
|
||||||
await apiDeleteMemberDiscussionGeneral({ user: hasil, idUser: chooseUser.idUser }, id)
|
await apiDeleteMemberDiscussionGeneral({ user: hasil, idUser: chooseUser.idUser }, id)
|
||||||
Toast.show({ type: 'small', text1: 'Berhasil mengeluarkan anggota dari diskusi', })
|
Toast.show({ type: 'small', text1: 'Berhasil mengeluarkan anggota dari diskusi' })
|
||||||
handleLoad(false)
|
handleLoad(false)
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
const message = error?.response?.data?.message || "Gagal mengeluarkan anggota"
|
Toast.show({ type: 'small', text1: error?.response?.data?.message || "Gagal mengeluarkan anggota" })
|
||||||
|
|
||||||
Toast.show({ type: 'small', text1: message })
|
|
||||||
} finally {
|
} finally {
|
||||||
setModal(false)
|
setModal(false)
|
||||||
}
|
}
|
||||||
@@ -81,9 +71,6 @@ export default function MemberDiscussionDetail() {
|
|||||||
<SafeAreaView style={[Styles.flex1, { backgroundColor: colors.background }]}>
|
<SafeAreaView style={[Styles.flex1, { backgroundColor: colors.background }]}>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
options={{
|
options={{
|
||||||
// headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
||||||
headerTitle: 'Anggota Diskusi',
|
|
||||||
headerTitleAlign: 'center',
|
|
||||||
header: () => (
|
header: () => (
|
||||||
<AppHeader
|
<AppHeader
|
||||||
title="Anggota Diskusi"
|
title="Anggota Diskusi"
|
||||||
@@ -93,49 +80,82 @@ export default function MemberDiscussionDetail() {
|
|||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<ScrollView style={[Styles.h100, Styles.flex1, { backgroundColor: colors.background }]}>
|
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, Styles.flex1, { backgroundColor: colors.background }]}>
|
||||||
<View style={[Styles.p15]}>
|
<View style={[Styles.p15, Styles.mb100]}>
|
||||||
<Text style={[Styles.textDefault, Styles.mv05]}>{data.length} Anggota</Text>
|
|
||||||
<View style={[Styles.wrapPaper, { backgroundColor: colors.card, borderColor: colors.background }]}>
|
{/* Tombol tambah anggota */}
|
||||||
{
|
{canManage && (
|
||||||
entityUser.role != "user" && entityUser.role != "coadmin" &&
|
<View style={[Styles.wrapPaper, Styles.sectionCard, Styles.mb15,
|
||||||
<BorderBottomItem
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18' }]}>
|
||||||
onPress={() => { router.push(`/discussion/add-member/${id}`) }}
|
<Pressable
|
||||||
borderType="none"
|
onPress={() => router.push(`/discussion/add-member/${id}`)}
|
||||||
icon={
|
style={Styles.sectionActionRow}
|
||||||
<View style={[Styles.iconContent, ColorsStatus.gray]}>
|
>
|
||||||
<Feather name="user-plus" size={25} color={'#384288'} />
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.icon + '18' }]}>
|
||||||
|
<MaterialCommunityIcons name="account-plus-outline" size={18} color={colors.icon} />
|
||||||
|
</View>
|
||||||
|
<View style={Styles.flex1}>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, { color: colors.text }]}>Tambah Anggota</Text>
|
||||||
|
</View>
|
||||||
|
<MaterialCommunityIcons name="chevron-right" size={18} color={colors.dimmed} />
|
||||||
|
</Pressable>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Full list */}
|
||||||
|
<View style={[Styles.wrapPaper, Styles.sectionCard,
|
||||||
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18', padding: 0, overflow: 'hidden' }]}>
|
||||||
|
<View style={[Styles.sectionActionRow, { padding: 16, borderBottomWidth: 1, borderBottomColor: colors.icon + '14' }]}>
|
||||||
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
|
<MaterialIcons name="people" size={18} color={colors.dimmed} />
|
||||||
|
</View>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, Styles.flex1, { color: colors.text }]}>Anggota</Text>
|
||||||
|
{!loading && (
|
||||||
|
<Text style={[Styles.textMediumNormal, { color: colors.dimmed }]}>{data.length} anggota</Text>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
{loading
|
||||||
|
? Array.from({ length: SKELETON_COUNT }).map((_, i) => (
|
||||||
|
<View
|
||||||
|
key={i}
|
||||||
|
style={[Styles.rowItemsCenter, Styles.ph15,
|
||||||
|
{ paddingVertical: 14, gap: 14, borderBottomWidth: i < SKELETON_COUNT - 1 ? 1 : 0, borderBottomColor: colors.icon + '14' }]}
|
||||||
|
>
|
||||||
|
<View style={[Styles.userProfileExtraSmall, { backgroundColor: colors.icon + '20', borderRadius: 100 }]} />
|
||||||
|
<View style={{ height: 13, borderRadius: 6, flex: 1, backgroundColor: colors.icon + '20', maxWidth: 140 + (i % 3) * 30 }} />
|
||||||
|
</View>
|
||||||
|
))
|
||||||
|
: data.length === 0
|
||||||
|
? (
|
||||||
|
<View style={[Styles.contentItemCenter, { paddingVertical: 40 }]}>
|
||||||
|
<MaterialIcons name="people-outline" size={34} color={colors.icon + '50'} />
|
||||||
|
<Text style={[Styles.textMediumNormal, Styles.mt10, { color: colors.dimmed }]}>Belum ada anggota</Text>
|
||||||
</View>
|
</View>
|
||||||
}
|
)
|
||||||
title="Tambah Anggota"
|
: data.map((item, index) => (
|
||||||
/>
|
<Pressable
|
||||||
}
|
key={index}
|
||||||
{
|
onPress={() => { setChooseUser(item); setModal(true) }}
|
||||||
loading ?
|
style={({ pressed }) => [
|
||||||
arrSkeleton.map((item, index) => {
|
Styles.rowItemsCenter, Styles.ph15,
|
||||||
return (
|
{
|
||||||
<SkeletonTwoItem key={index} />
|
paddingVertical: 13, gap: 14,
|
||||||
)
|
borderBottomWidth: index < data.length - 1 ? 1 : 0,
|
||||||
})
|
borderBottomColor: colors.icon + '14',
|
||||||
:
|
backgroundColor: pressed ? colors.icon + '0E' : 'transparent',
|
||||||
data.map((item, index) => {
|
},
|
||||||
return (
|
]}
|
||||||
<BorderBottomItem
|
>
|
||||||
key={index}
|
<ImageUser src={`${ConstEnv.url_storage}/files/${item.img}`} size="xs" />
|
||||||
borderType="bottom"
|
<Text style={[Styles.textDefault, Styles.flex1, { color: colors.text }]} numberOfLines={1}>
|
||||||
icon={
|
{item.name}
|
||||||
<ImageUser src={`${ConstEnv.url_storage}/files/${item.img}`} size="sm" />
|
</Text>
|
||||||
}
|
<MaterialCommunityIcons name="chevron-right" size={18} color={colors.icon + '60'} />
|
||||||
title={item.name}
|
</Pressable>
|
||||||
onPress={() => {
|
))
|
||||||
setChooseUser(item)
|
|
||||||
setModal(true)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
@@ -149,20 +169,16 @@ export default function MemberDiscussionDetail() {
|
|||||||
router.push(`/member/${chooseUser.idUser}`)
|
router.push(`/member/${chooseUser.idUser}`)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{
|
{canManage && (
|
||||||
entityUser.role != "user" && entityUser.role != "coadmin" &&
|
|
||||||
<MenuItemRow
|
<MenuItemRow
|
||||||
icon={<MaterialCommunityIcons name="account-remove" color={colors.text} size={25} />}
|
icon={<MaterialCommunityIcons name="account-remove" color={colors.text} size={25} />}
|
||||||
title="Keluarkan"
|
title="Keluarkan"
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
setModal(false)
|
setModal(false)
|
||||||
setTimeout(() => {
|
setTimeout(() => setShowDeleteModal(true), 600)
|
||||||
setShowDeleteModal(true)
|
|
||||||
}, 600)
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
}
|
)}
|
||||||
|
|
||||||
</View>
|
</View>
|
||||||
</DrawerBottom>
|
</DrawerBottom>
|
||||||
|
|
||||||
@@ -170,10 +186,7 @@ export default function MemberDiscussionDetail() {
|
|||||||
visible={showDeleteModal}
|
visible={showDeleteModal}
|
||||||
title="Konfirmasi"
|
title="Konfirmasi"
|
||||||
message="Apakah anda yakin ingin mengeluarkan anggota?"
|
message="Apakah anda yakin ingin mengeluarkan anggota?"
|
||||||
onConfirm={() => {
|
onConfirm={() => { setShowDeleteModal(false); handleDeleteUser() }}
|
||||||
setShowDeleteModal(false)
|
|
||||||
handleDeleteUser()
|
|
||||||
}}
|
|
||||||
onCancel={() => setShowDeleteModal(false)}
|
onCancel={() => setShowDeleteModal(false)}
|
||||||
confirmText="Hapus"
|
confirmText="Hapus"
|
||||||
cancelText="Batal"
|
cancelText="Batal"
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
import ModalConfirmation from "@/components/ModalConfirmation"
|
|
||||||
import AppHeader from "@/components/AppHeader"
|
import AppHeader from "@/components/AppHeader"
|
||||||
import BorderBottomItem from "@/components/borderBottomItem"
|
|
||||||
import ButtonBackHeader from "@/components/buttonBackHeader"
|
|
||||||
import HeaderRightCalendarDetail from "@/components/calendar/headerCalendarDetail"
|
|
||||||
import DrawerBottom from "@/components/drawerBottom"
|
import DrawerBottom from "@/components/drawerBottom"
|
||||||
|
import HeaderRightCalendarDetail from "@/components/calendar/headerCalendarDetail"
|
||||||
import ImageUser from "@/components/imageNew"
|
import ImageUser from "@/components/imageNew"
|
||||||
import MenuItemRow from "@/components/menuItemRow"
|
import MenuItemRow from "@/components/menuItemRow"
|
||||||
import Skeleton from "@/components/skeleton"
|
import ModalConfirmation from "@/components/ModalConfirmation"
|
||||||
import Text from "@/components/Text"
|
import Text from "@/components/Text"
|
||||||
import { ConstEnv } from "@/constants/ConstEnv"
|
import { ConstEnv } from "@/constants/ConstEnv"
|
||||||
import Styles from "@/constants/Styles"
|
import Styles from "@/constants/Styles"
|
||||||
@@ -14,7 +11,7 @@ import { apiDeleteCalendarMember, apiGetCalendarOne, apiGetDivisionOneFeature }
|
|||||||
import { setUpdateCalendar } from "@/lib/calendarUpdate"
|
import { setUpdateCalendar } from "@/lib/calendarUpdate"
|
||||||
import { useAuthSession } from "@/providers/AuthProvider"
|
import { useAuthSession } from "@/providers/AuthProvider"
|
||||||
import { useTheme } from "@/providers/ThemeProvider"
|
import { useTheme } from "@/providers/ThemeProvider"
|
||||||
import { MaterialCommunityIcons } from "@expo/vector-icons"
|
import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"
|
||||||
import Clipboard from "@react-native-clipboard/clipboard"
|
import Clipboard from "@react-native-clipboard/clipboard"
|
||||||
import { router, Stack, useLocalSearchParams } from "expo-router"
|
import { router, Stack, useLocalSearchParams } from "expo-router"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
@@ -156,135 +153,142 @@ export default function DetailEventCalendar() {
|
|||||||
setRefreshing(false)
|
setRefreshing(false)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const canManage = !((entityUser.role === "user" || entityUser.role === "coadmin") && !isMemberDivision)
|
||||||
|
|
||||||
|
const repeatLabel: Record<string, string> = {
|
||||||
|
once: 'Acara 1 Kali',
|
||||||
|
daily: 'Setiap Hari',
|
||||||
|
weekly: 'Mingguan',
|
||||||
|
monthly: 'Bulanan',
|
||||||
|
yearly: 'Tahunan',
|
||||||
|
}
|
||||||
|
|
||||||
|
function InfoRow({ icon, label, value, onCopy }: { icon: string, label: string, value?: string, onCopy?: () => void }) {
|
||||||
|
return (
|
||||||
|
<View style={[Styles.sectionActionRow, { paddingVertical: 10, borderBottomWidth: 1, borderBottomColor: colors.icon + '14' }]}>
|
||||||
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
|
<MaterialCommunityIcons name={icon as any} size={18} color={colors.dimmed} />
|
||||||
|
</View>
|
||||||
|
<View style={Styles.flex1}>
|
||||||
|
<Text style={[Styles.textSmallSemiBold, { color: colors.dimmed, marginBottom: 2 }]}>{label}</Text>
|
||||||
|
{loading
|
||||||
|
? <View style={{ height: 13, borderRadius: 6, backgroundColor: colors.icon + '20', width: '70%' }} />
|
||||||
|
: <Text style={[Styles.textDefault, { color: colors.text }]}>{value || '-'}</Text>
|
||||||
|
}
|
||||||
|
</View>
|
||||||
|
{onCopy && !loading && value && (
|
||||||
|
<Pressable onPress={onCopy} style={{ padding: 4 }}>
|
||||||
|
<MaterialCommunityIcons name="content-copy" size={16} color={colors.dimmed} />
|
||||||
|
</Pressable>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SafeAreaView style={{ flex: 1, backgroundColor: colors.background }}>
|
<SafeAreaView style={[Styles.flex1, { backgroundColor: colors.background }]}>
|
||||||
<Stack.Screen
|
<Stack.Screen
|
||||||
options={{
|
options={{
|
||||||
// headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
|
|
||||||
headerTitle: 'Detail Acara',
|
|
||||||
headerTitleAlign: 'center',
|
|
||||||
// headerRight: () => (entityUser.role == "user" || entityUser.role == "coadmin") && !isMemberDivision ? <></> : <HeaderRightCalendarDetail id={String(data?.idCalendar)} idReminder={String(detail)} />
|
|
||||||
header: () => (
|
header: () => (
|
||||||
<AppHeader
|
<AppHeader
|
||||||
title="Detail Acara"
|
title="Detail Acara"
|
||||||
showBack={true}
|
showBack={true}
|
||||||
onPressLeft={() => router.back()}
|
onPressLeft={() => router.back()}
|
||||||
right={
|
right={
|
||||||
(entityUser.role == "user" || entityUser.role == "coadmin") && !isMemberDivision ? <></> : <HeaderRightCalendarDetail id={String(data?.idCalendar)} idReminder={String(detail)} />
|
(entityUser.role === "user" || entityUser.role === "coadmin") && !isMemberDivision
|
||||||
|
? <></> : <HeaderRightCalendarDetail id={String(data?.idCalendar)} idReminder={String(detail)} />
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<ScrollView
|
<ScrollView
|
||||||
style={[Styles.h100]}
|
showsVerticalScrollIndicator={false}
|
||||||
refreshControl={
|
style={Styles.h100}
|
||||||
<RefreshControl
|
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} tintColor={colors.icon} />}
|
||||||
refreshing={refreshing}
|
|
||||||
onRefresh={handleRefresh}
|
|
||||||
tintColor={colors.icon}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<View style={[Styles.p15]}>
|
<View style={[Styles.p15, Styles.mb100]}>
|
||||||
<View style={[Styles.wrapPaper, Styles.mb15, { backgroundColor: colors.card, borderColor: colors.background }]}>
|
|
||||||
<View style={[Styles.rowItemsCenter, { alignItems: 'flex-start' }]}>
|
|
||||||
<MaterialCommunityIcons name="calendar-text" size={30} color={colors.text} style={Styles.mr10} />
|
|
||||||
{
|
|
||||||
loading ?
|
|
||||||
<Skeleton width={80} height={10} borderRadius={10} widthType="percent" />
|
|
||||||
: <Text style={[Styles.textDefault, Styles.w90]}>{data?.title}</Text>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
{/* Info acara */}
|
||||||
|
<View style={[Styles.wrapPaper, Styles.sectionCard, Styles.noShadow, Styles.mb15,
|
||||||
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18', padding: 0, overflow: 'hidden' }]}>
|
||||||
|
<View style={{ padding: 16, borderBottomWidth: 1, borderBottomColor: colors.icon + '14' }}>
|
||||||
|
<View style={Styles.sectionActionRow}>
|
||||||
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
|
<MaterialCommunityIcons name="calendar-text" size={18} color={colors.dimmed} />
|
||||||
|
</View>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, Styles.flex1, { color: colors.text }]}>Detail Acara</Text>
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
<View style={[Styles.rowItemsCenter, Styles.mt10]}>
|
<View style={{ paddingHorizontal: 16 }}>
|
||||||
<MaterialCommunityIcons name="calendar-month-outline" size={30} color={colors.text} style={Styles.mr10} />
|
<InfoRow icon="format-title" label="Judul" value={data?.title} />
|
||||||
{
|
<InfoRow icon="calendar-month-outline" label="Tanggal" value={data?.dateStart} />
|
||||||
loading ?
|
<InfoRow icon="clock-outline" label="Waktu" value={data ? `${data.timeStart} – ${data.timeEnd}` : undefined} />
|
||||||
<Skeleton width={80} height={10} borderRadius={10} widthType="percent" />
|
<InfoRow icon="repeat" label="Pengulangan" value={data?.repeatEventTyper ? repeatLabel[data.repeatEventTyper] : undefined} />
|
||||||
:
|
<InfoRow icon="link-variant" label="Link Meet" value={data?.linkMeet} onCopy={data?.linkMeet ? () => handleCopy(data.linkMeet) : undefined} />
|
||||||
<Text style={[Styles.textDefault]}>{data?.dateStart}</Text>
|
<View style={[Styles.sectionActionRow, { paddingVertical: 10, alignItems: 'flex-start' }]}>
|
||||||
}
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
|
<MaterialCommunityIcons name="card-text-outline" size={18} color={colors.dimmed} />
|
||||||
|
</View>
|
||||||
|
<View style={Styles.flex1}>
|
||||||
|
<Text style={[Styles.textSmallSemiBold, { color: colors.dimmed, marginBottom: 2 }]}>Deskripsi</Text>
|
||||||
|
{loading
|
||||||
|
? <View style={{ height: 13, borderRadius: 6, backgroundColor: colors.icon + '20', width: '80%' }} />
|
||||||
|
: <Text style={[Styles.textDefault, { color: colors.text, lineHeight: 22 }]}>{data?.desc || '-'}</Text>
|
||||||
|
}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
</View>
|
</View>
|
||||||
<View style={[Styles.rowItemsCenter, Styles.mt10]}>
|
</View>
|
||||||
<MaterialCommunityIcons name="clock-outline" size={30} color={colors.text} style={Styles.mr10} />
|
|
||||||
{
|
{/* Daftar anggota */}
|
||||||
loading ?
|
<View style={[Styles.wrapPaper, Styles.sectionCard, Styles.noShadow,
|
||||||
<Skeleton width={80} height={10} borderRadius={10} widthType="percent" />
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18', padding: 0, overflow: 'hidden' }]}>
|
||||||
:
|
|
||||||
<Text style={[Styles.textDefault]}>{data?.timeStart} | {data?.timeEnd}</Text>
|
<View style={[Styles.sectionActionRow, { padding: 16, borderBottomWidth: 1, borderBottomColor: colors.icon + '14' }]}>
|
||||||
}
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
|
<MaterialIcons name="people" size={18} color={colors.dimmed} />
|
||||||
|
</View>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, Styles.flex1, { color: colors.text }]}>Anggota</Text>
|
||||||
|
<Text style={[Styles.textMediumNormal, { color: colors.dimmed }]}>{member.length} anggota</Text>
|
||||||
</View>
|
</View>
|
||||||
<View style={[Styles.rowItemsCenter, Styles.mt10]}>
|
|
||||||
<MaterialCommunityIcons name="repeat" size={30} color={colors.text} style={Styles.mr10} />
|
{member.length === 0
|
||||||
{
|
? (
|
||||||
loading ?
|
<View style={[Styles.contentItemCenter, { paddingVertical: 40 }]}>
|
||||||
<Skeleton width={80} height={10} borderRadius={10} widthType="percent" />
|
<MaterialIcons name="people-outline" size={34} color={colors.icon + '50'} />
|
||||||
:
|
<Text style={[Styles.textMediumNormal, Styles.mt10, { color: colors.dimmed }]}>Belum ada anggota</Text>
|
||||||
<Text style={[Styles.textDefault]}>
|
</View>
|
||||||
|
)
|
||||||
|
: member.map((item, index) => (
|
||||||
|
<Pressable
|
||||||
|
key={index}
|
||||||
|
onPress={() => {
|
||||||
|
if (!canManage) return
|
||||||
|
setMemberChoose({ id: item.idUser, name: item.name })
|
||||||
|
setModalMember(true)
|
||||||
|
}}
|
||||||
|
style={({ pressed }) => [
|
||||||
|
Styles.rowItemsCenter, Styles.ph15,
|
||||||
{
|
{
|
||||||
data?.repeatEventTyper.toString() === 'once' ? 'Acara 1 Kali' :
|
paddingVertical: 12, gap: 14,
|
||||||
data?.repeatEventTyper.toString() === 'daily' ? 'Setiap Hari' :
|
borderBottomWidth: index < member.length - 1 ? 1 : 0,
|
||||||
data?.repeatEventTyper.toString() === 'weekly' ? 'Mingguan' :
|
borderBottomColor: colors.icon + '14',
|
||||||
data?.repeatEventTyper.toString() === 'monthly' ? 'Bulanan' :
|
backgroundColor: pressed && canManage ? colors.icon + '0E' : 'transparent',
|
||||||
data?.repeatEventTyper.toString() === 'yearly' ? 'Tahunan' :
|
},
|
||||||
''
|
]}
|
||||||
}
|
>
|
||||||
</Text>
|
<ImageUser src={`${ConstEnv.url_storage}/files/${item.img}`} size="xs" />
|
||||||
}
|
<View style={Styles.flex1}>
|
||||||
</View>
|
<Text style={[Styles.textDefault, { color: colors.text }]} numberOfLines={1}>{item.name}</Text>
|
||||||
<View style={[Styles.rowItemsCenter, Styles.mt10]}>
|
<Text style={[Styles.textMediumNormal, { color: colors.dimmed }]} numberOfLines={1}>{item.email}</Text>
|
||||||
<MaterialCommunityIcons name="link-variant" size={30} color={colors.text} style={Styles.mr10} />
|
</View>
|
||||||
{
|
{canManage && <MaterialCommunityIcons name="chevron-right" size={18} color={colors.icon + '60'} />}
|
||||||
loading ?
|
</Pressable>
|
||||||
<Skeleton width={80} height={10} borderRadius={10} widthType="percent" />
|
))
|
||||||
:
|
}
|
||||||
data?.linkMeet ?
|
|
||||||
<Pressable onPress={() => { handleCopy(data.linkMeet) }}>
|
|
||||||
<Text style={[Styles.textDefault]}>{data.linkMeet}</Text>
|
|
||||||
</Pressable>
|
|
||||||
: <Text style={[Styles.textDefault]}>-</Text>
|
|
||||||
}
|
|
||||||
</View>
|
|
||||||
<View style={[Styles.rowItemsCenter, Styles.mt10, { alignItems: 'flex-start' }]}>
|
|
||||||
<MaterialCommunityIcons name="card-text-outline" size={30} color={colors.text} style={Styles.mr10} />
|
|
||||||
{
|
|
||||||
loading ?
|
|
||||||
<Skeleton width={80} height={10} borderRadius={10} widthType="percent" />
|
|
||||||
:
|
|
||||||
<Text style={[Styles.textDefault, Styles.w90]}>{data?.desc}</Text>
|
|
||||||
}
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
<View style={[Styles.mb15]}>
|
|
||||||
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
|
|
||||||
<Text style={[Styles.textDefaultSemiBold]}>Anggota</Text>
|
|
||||||
<Text style={[Styles.textDefault]}>Total {member.length} Anggota</Text>
|
|
||||||
</View>
|
|
||||||
|
|
||||||
<View style={[Styles.wrapPaper, { backgroundColor: colors.card, borderColor: colors.background }]}>
|
|
||||||
{
|
|
||||||
member.map((item, index) => (
|
|
||||||
<BorderBottomItem
|
|
||||||
key={index}
|
|
||||||
borderType="bottom"
|
|
||||||
icon={<ImageUser src={`${ConstEnv.url_storage}/files/${item.img}`} />}
|
|
||||||
title={item.name}
|
|
||||||
subtitle={item.email}
|
|
||||||
onPress={() => {
|
|
||||||
if ((entityUser.role == "user" || entityUser.role == "coadmin") && !isMemberDivision) {
|
|
||||||
null
|
|
||||||
} else {
|
|
||||||
setMemberChoose({ id: item.idUser, name: item.name })
|
|
||||||
setModalMember(true)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ export default function AddMemberDivision() {
|
|||||||
return (
|
return (
|
||||||
<Pressable
|
<Pressable
|
||||||
key={index}
|
key={index}
|
||||||
style={[Styles.itemSelectModal]}
|
style={[Styles.itemSelectModal, { borderBottomColor: colors.icon + '20' }]}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
!found && onChoose(item.id, item.name, item.img)
|
!found && onChoose(item.id, item.name, item.img)
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
import ModalConfirmation from "@/components/ModalConfirmation"
|
|
||||||
import AppHeader from "@/components/AppHeader"
|
import AppHeader from "@/components/AppHeader"
|
||||||
import BorderBottomItem from "@/components/borderBottomItem"
|
|
||||||
import HeaderRightDivisionInfo from "@/components/division/headerDivisionInfo"
|
|
||||||
import DrawerBottom from "@/components/drawerBottom"
|
import DrawerBottom from "@/components/drawerBottom"
|
||||||
|
import HeaderRightDivisionInfo from "@/components/division/headerDivisionInfo"
|
||||||
import ImageUser from "@/components/imageNew"
|
import ImageUser from "@/components/imageNew"
|
||||||
|
import MenuItemRow from "@/components/menuItemRow"
|
||||||
|
import ModalConfirmation from "@/components/ModalConfirmation"
|
||||||
import SectionCancel from "@/components/sectionCancel"
|
import SectionCancel from "@/components/sectionCancel"
|
||||||
import Skeleton from "@/components/skeleton"
|
|
||||||
import SkeletonTwoItem from "@/components/skeletonTwoItem"
|
|
||||||
import Text from "@/components/Text"
|
import Text from "@/components/Text"
|
||||||
import { ColorsStatus } from "@/constants/ColorsStatus"
|
|
||||||
import { ConstEnv } from "@/constants/ConstEnv"
|
import { ConstEnv } from "@/constants/ConstEnv"
|
||||||
import Styles from "@/constants/Styles"
|
import Styles from "@/constants/Styles"
|
||||||
import { apiDeleteMemberDivision, apiGetDivisionOneDetail, apiGetDivisionOneFeature, apiUpdateStatusAdminDivision } from "@/lib/api"
|
import { apiDeleteMemberDivision, apiGetDivisionOneDetail, apiGetDivisionOneFeature, apiUpdateStatusAdminDivision } from "@/lib/api"
|
||||||
import { useAuthSession } from "@/providers/AuthProvider"
|
import { useAuthSession } from "@/providers/AuthProvider"
|
||||||
import { useTheme } from "@/providers/ThemeProvider"
|
import { useTheme } from "@/providers/ThemeProvider"
|
||||||
import { Feather, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"
|
import { MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"
|
||||||
import { router, Stack, useLocalSearchParams } from "expo-router"
|
import { router, Stack, useLocalSearchParams } from "expo-router"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import { Pressable, RefreshControl, SafeAreaView, ScrollView, View } from "react-native"
|
import { Pressable, RefreshControl, SafeAreaView, ScrollView, View } from "react-native"
|
||||||
@@ -50,8 +47,8 @@ export default function InformationDivision() {
|
|||||||
const [dataMember, setDataMember] = useState<PropsMember[]>([])
|
const [dataMember, setDataMember] = useState<PropsMember[]>([])
|
||||||
const [refresh, setRefresh] = useState(false)
|
const [refresh, setRefresh] = useState(false)
|
||||||
const update = useSelector((state: any) => state.divisionUpdate)
|
const update = useSelector((state: any) => state.divisionUpdate)
|
||||||
const arrSkeleton = Array.from({ length: 5 }, (_, index) => index)
|
|
||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
|
const SKELETON_COUNT = 5
|
||||||
const [isMemberDivision, setIsMemberDivision] = useState(false)
|
const [isMemberDivision, setIsMemberDivision] = useState(false)
|
||||||
const [isAdminDivision, setIsAdminDivision] = useState(false)
|
const [isAdminDivision, setIsAdminDivision] = useState(false)
|
||||||
const [dataMemberChoose, setDataMemberChoose] = useState({
|
const [dataMemberChoose, setDataMemberChoose] = useState({
|
||||||
@@ -186,109 +183,123 @@ export default function InformationDivision() {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<ScrollView
|
<ScrollView
|
||||||
refreshControl={
|
showsVerticalScrollIndicator={false}
|
||||||
<RefreshControl
|
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} tintColor={colors.icon} />}
|
||||||
refreshing={refreshing}
|
|
||||||
onRefresh={handleRefresh}
|
|
||||||
tintColor={colors.icon}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
style={[Styles.h100, { backgroundColor: colors.background }]}
|
style={[Styles.h100, { backgroundColor: colors.background }]}
|
||||||
>
|
>
|
||||||
<View style={[Styles.p15]}>
|
<View style={[Styles.p15, Styles.mb100]}>
|
||||||
{
|
|
||||||
dataDetail?.isActive == false && (
|
{dataDetail?.isActive === false && <SectionCancel title="Divisi nonaktif" />}
|
||||||
<SectionCancel title={'Divisi nonaktif'} />
|
|
||||||
)
|
{/* Deskripsi */}
|
||||||
}
|
<View style={[Styles.wrapPaper, Styles.sectionCard, Styles.noShadow, Styles.mb15,
|
||||||
<View style={[Styles.mb15]}>
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18' }]}>
|
||||||
<Text style={[Styles.textDefaultSemiBold, Styles.mb05]}>Deskripsi Divisi</Text>
|
<View style={[Styles.sectionActionRow, { marginBottom: 12 }]}>
|
||||||
<View style={[Styles.wrapPaper, Styles.noShadow, { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.icon + '20' }]}>
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
{loading ?
|
<MaterialIcons name="info-outline" size={18} color={colors.dimmed} />
|
||||||
arrSkeleton.map((item, index) => {
|
</View>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, Styles.flex1, { color: colors.text }]}>Deskripsi</Text>
|
||||||
|
</View>
|
||||||
|
{loading
|
||||||
|
? Array.from({ length: 3 }).map((_, i) => (
|
||||||
|
<View key={i} style={{ height: 13, borderRadius: 6, marginBottom: 8, backgroundColor: colors.icon + '20', width: i === 2 ? '60%' : '100%' }} />
|
||||||
|
))
|
||||||
|
: <Text style={[Styles.textDefault, { color: colors.text, lineHeight: 22 }]}>{dataDetail?.desc}</Text>
|
||||||
|
}
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* Tombol tambah anggota */}
|
||||||
|
{((entityUser.role !== "user" && entityUser.role !== "coadmin") || isAdminDivision) && dataDetail?.isActive && (
|
||||||
|
<View style={[Styles.wrapPaper, Styles.sectionCard, Styles.mb15,
|
||||||
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18' }]}>
|
||||||
|
<Pressable
|
||||||
|
onPress={() => router.push(`/division/${id}/add-member`)}
|
||||||
|
style={Styles.sectionActionRow}
|
||||||
|
>
|
||||||
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.icon + '18' }]}>
|
||||||
|
<MaterialCommunityIcons name="account-plus-outline" size={18} color={colors.icon} />
|
||||||
|
</View>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, Styles.flex1, { color: colors.text }]}>Tambah Anggota</Text>
|
||||||
|
<MaterialCommunityIcons name="chevron-right" size={18} color={colors.dimmed} />
|
||||||
|
</Pressable>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Daftar anggota */}
|
||||||
|
<View style={[Styles.wrapPaper, Styles.sectionCard,
|
||||||
|
{ backgroundColor: colors.card, borderColor: colors.icon + '18', padding: 0, overflow: 'hidden' }]}>
|
||||||
|
|
||||||
|
{/* Header */}
|
||||||
|
<View style={[Styles.sectionActionRow, { padding: 16, borderBottomWidth: 1, borderBottomColor: colors.icon + '14' }]}>
|
||||||
|
<View style={[Styles.sectionIconBox, { backgroundColor: colors.dimmed + '18' }]}>
|
||||||
|
<MaterialIcons name="people" size={18} color={colors.dimmed} />
|
||||||
|
</View>
|
||||||
|
<Text style={[Styles.textDefaultSemiBold, Styles.flex1, { color: colors.text }]}>Anggota</Text>
|
||||||
|
{!loading && (
|
||||||
|
<Text style={[Styles.textMediumNormal, { color: colors.dimmed }]}>{dataMember.length} anggota</Text>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{loading
|
||||||
|
? Array.from({ length: SKELETON_COUNT }).map((_, i) => (
|
||||||
|
<View key={i} style={[Styles.rowItemsCenter, Styles.ph15,
|
||||||
|
{ paddingVertical: 14, gap: 14, borderBottomWidth: i < SKELETON_COUNT - 1 ? 1 : 0, borderBottomColor: colors.icon + '14' }]}>
|
||||||
|
<View style={[Styles.userProfileExtraSmall, { backgroundColor: colors.icon + '20', borderRadius: 100 }]} />
|
||||||
|
<View style={{ height: 13, borderRadius: 6, flex: 1, backgroundColor: colors.icon + '20', maxWidth: 140 + (i % 3) * 30 }} />
|
||||||
|
</View>
|
||||||
|
))
|
||||||
|
: dataMember.length === 0
|
||||||
|
? (
|
||||||
|
<View style={[Styles.contentItemCenter, { paddingVertical: 40 }]}>
|
||||||
|
<MaterialIcons name="people-outline" size={34} color={colors.icon + '50'} />
|
||||||
|
<Text style={[Styles.textMediumNormal, Styles.mt10, { color: colors.dimmed }]}>Belum ada anggota</Text>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
: dataMember.map((item, index) => {
|
||||||
|
const canPress = dataDetail?.isActive && (isAdminDivision || (entityUser.role !== "user" && entityUser.role !== "coadmin"))
|
||||||
return (
|
return (
|
||||||
<Skeleton key={index} width={100} height={10} widthType="percent" borderRadius={10} />
|
<Pressable
|
||||||
|
key={index}
|
||||||
|
onPress={() => canPress && handleChooseMember(item)}
|
||||||
|
style={({ pressed }) => [
|
||||||
|
Styles.rowItemsCenter, Styles.ph15,
|
||||||
|
{
|
||||||
|
paddingVertical: 13, gap: 14,
|
||||||
|
borderBottomWidth: index < dataMember.length - 1 ? 1 : 0,
|
||||||
|
borderBottomColor: colors.icon + '14',
|
||||||
|
backgroundColor: pressed && canPress ? colors.icon + '0E' : 'transparent',
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<ImageUser src={`${ConstEnv.url_storage}/files/${item.img}`} size="xs" />
|
||||||
|
<Text style={[Styles.textDefault, Styles.flex1, { color: colors.text }]} numberOfLines={1}>
|
||||||
|
{item.name}
|
||||||
|
</Text>
|
||||||
|
<Text style={[Styles.textMediumNormal, { color: item.isAdmin ? colors.tabActive : colors.dimmed }]}>
|
||||||
|
{item.isAdmin ? 'Admin' : 'Anggota'}
|
||||||
|
</Text>
|
||||||
|
{canPress && <MaterialCommunityIcons name="chevron-right" size={18} color={colors.icon + '60'} />}
|
||||||
|
</Pressable>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
:
|
}
|
||||||
<Text>{dataDetail?.desc}</Text>
|
|
||||||
}
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
<View style={[Styles.mb15]}>
|
|
||||||
<Text style={[Styles.textDefault, Styles.mv05]}>{dataMember.length} Anggota</Text>
|
|
||||||
<View style={[Styles.wrapPaper, Styles.noShadow, { backgroundColor: colors.card, borderWidth: 1, borderColor: colors.icon + '20' }]}>
|
|
||||||
{
|
|
||||||
((entityUser.role != "user" && entityUser.role != "coadmin") || isAdminDivision) &&
|
|
||||||
dataDetail?.isActive && (
|
|
||||||
<BorderBottomItem
|
|
||||||
onPress={() => { router.push(`/division/${id}/add-member`) }}
|
|
||||||
borderType="none"
|
|
||||||
icon={
|
|
||||||
<View style={[Styles.iconContent]}>
|
|
||||||
<Feather name="user-plus" size={25} color={'black'} />
|
|
||||||
</View>
|
|
||||||
}
|
|
||||||
title="Tambah Anggota"
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
loading ?
|
|
||||||
arrSkeleton.map((item, index) => {
|
|
||||||
return (
|
|
||||||
<SkeletonTwoItem key={index} />
|
|
||||||
)
|
|
||||||
})
|
|
||||||
:
|
|
||||||
dataMember.map((item, index) => {
|
|
||||||
return (
|
|
||||||
<BorderBottomItem
|
|
||||||
key={index}
|
|
||||||
borderType="bottom"
|
|
||||||
onPress={() => { dataDetail?.isActive && (isAdminDivision || (entityUser.role != "user" && entityUser.role != "coadmin")) && handleChooseMember(item) }}
|
|
||||||
icon={
|
|
||||||
<ImageUser src={`${ConstEnv.url_storage}/files/${item.img}`} size="sm" />
|
|
||||||
}
|
|
||||||
title={item.name}
|
|
||||||
rightTopInfo={item.isAdmin ? "Admin" : "Anggota"}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<DrawerBottom animation="slide" isVisible={isModal} setVisible={setModal} title={dataMemberChoose.name}>
|
<DrawerBottom animation="slide" isVisible={isModal} setVisible={setModal} title={dataMemberChoose.name}>
|
||||||
<View>
|
<View style={Styles.rowItemsCenter}>
|
||||||
<Pressable style={[Styles.wrapItemBorderBottom]} onPress={() => { handleMemberAdmin() }}>
|
<MenuItemRow
|
||||||
<View style={[Styles.rowItemsCenter]}>
|
icon={<MaterialIcons name="verified-user" color={colors.text} size={25} />}
|
||||||
<View style={[Styles.iconContent]}>
|
title={dataMemberChoose.isAdmin ? 'Berhentikan admin' : 'Jadikan admin'}
|
||||||
<MaterialIcons name="verified-user" size={25} color={'black'} />
|
onPress={handleMemberAdmin}
|
||||||
</View>
|
/>
|
||||||
<View style={[Styles.rowSpaceBetween, { width: '88%' }]}>
|
<MenuItemRow
|
||||||
<View style={[Styles.ml10]}>
|
icon={<MaterialCommunityIcons name="account-remove" color={colors.text} size={25} />}
|
||||||
<Text style={[Styles.textDefault]}>{dataMemberChoose.isAdmin ? 'Memberhentikan sebagai admin' : 'Jadikan admin'}</Text>
|
title="Keluarkan"
|
||||||
</View>
|
onPress={handleMemberOut}
|
||||||
</View>
|
/>
|
||||||
</View>
|
|
||||||
</Pressable>
|
|
||||||
|
|
||||||
<Pressable style={[Styles.wrapItemBorderBottom]} onPress={() => { handleMemberOut() }}>
|
|
||||||
<View style={[Styles.rowItemsCenter]}>
|
|
||||||
<View style={[Styles.iconContent, ColorsStatus.info]}>
|
|
||||||
<MaterialCommunityIcons name="close-circle" size={25} color={colors.primary} />
|
|
||||||
</View>
|
|
||||||
<View style={[Styles.rowSpaceBetween, { width: '88%' }]}>
|
|
||||||
<View style={[Styles.ml10]}>
|
|
||||||
<Text style={[Styles.textDefault]}>Keluarkan dari divisi</Text>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</View>
|
|
||||||
</Pressable>
|
|
||||||
</View>
|
</View>
|
||||||
</DrawerBottom>
|
</DrawerBottom>
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ type Props = {
|
|||||||
onError?: (val:boolean) => void
|
onError?: (val:boolean) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ImageUser({ src, size, border, onError }: Props) {
|
export default function ImageUser({ src, size, border = true, onError }: Props) {
|
||||||
const [error, setError] = useState(false)
|
const [error, setError] = useState(false)
|
||||||
const { colors } = useTheme()
|
const { colors } = useTheme()
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const AnnouncementStyles = StyleSheet.create({
|
|||||||
// list (index.tsx)
|
// list (index.tsx)
|
||||||
announcementListContainer: { padding: 15, paddingBottom: 0 },
|
announcementListContainer: { padding: 15, paddingBottom: 0 },
|
||||||
announcementListInner: { marginTop: 10 },
|
announcementListInner: { marginTop: 10 },
|
||||||
announcementListCard: { borderRadius: 10, borderWidth: 1, padding: 12 },
|
announcementListCard: { borderRadius: 8, borderWidth: 1, padding: 12 },
|
||||||
announcementListCardHeader: { marginBottom: 6 },
|
announcementListCardHeader: { marginBottom: 6 },
|
||||||
announcementListTitleRow: { flex: 1, gap: 8, marginRight: 8, flexDirection: 'row', alignItems: 'center' },
|
announcementListTitleRow: { flex: 1, gap: 8, marginRight: 8, flexDirection: 'row', alignItems: 'center' },
|
||||||
announcementListIconBox: { width: 28, height: 28, borderRadius: 8, alignItems: 'center', justifyContent: 'center' },
|
announcementListIconBox: { width: 28, height: 28, borderRadius: 8, alignItems: 'center', justifyContent: 'center' },
|
||||||
@@ -18,11 +18,11 @@ const AnnouncementStyles = StyleSheet.create({
|
|||||||
|
|
||||||
// detail ([id].tsx)
|
// detail ([id].tsx)
|
||||||
announcementDetailContainer: { padding: 15, paddingBottom: 50, gap: 12 },
|
announcementDetailContainer: { padding: 15, paddingBottom: 50, gap: 12 },
|
||||||
announcementDetailCard: { borderRadius: 10 },
|
announcementDetailCard: { borderRadius: 8 },
|
||||||
announcementDetailSkeletonGap: { gap: 8 },
|
announcementDetailSkeletonGap: { gap: 8 },
|
||||||
announcementDetailSkeletonIconRow: { gap: 10, marginBottom: 2 },
|
announcementDetailSkeletonIconRow: { gap: 10, marginBottom: 2 },
|
||||||
announcementDetailTitleRow: { gap: 10, marginBottom: 10 },
|
announcementDetailTitleRow: { gap: 10, marginBottom: 10 },
|
||||||
announcementDetailIconBox: { width: 38, height: 38, borderRadius: 10 },
|
announcementDetailIconBox: { width: 38, height: 38, borderRadius: 8 },
|
||||||
announcementDetailTitleText: { fontSize: 17, lineHeight: 24, flex: 1 },
|
announcementDetailTitleText: { fontSize: 17, lineHeight: 24, flex: 1 },
|
||||||
announcementDetailSectionLabelRow: { marginBottom: 8, gap: 6 },
|
announcementDetailSectionLabelRow: { marginBottom: 8, gap: 6 },
|
||||||
announcementDetailFileCardPadding: { padding: 10 },
|
announcementDetailFileCardPadding: { padding: 10 },
|
||||||
@@ -33,7 +33,7 @@ const AnnouncementStyles = StyleSheet.create({
|
|||||||
announcementDetailGroupSeparator: { marginTop: 12, paddingTop: 12, borderTopWidth: 1 },
|
announcementDetailGroupSeparator: { marginTop: 12, paddingTop: 12, borderTopWidth: 1 },
|
||||||
announcementDetailGroupLabel: { marginBottom: 6 },
|
announcementDetailGroupLabel: { marginBottom: 6 },
|
||||||
announcementDetailDivisionRow: { gap: 8, paddingVertical: 6 },
|
announcementDetailDivisionRow: { gap: 8, paddingVertical: 6 },
|
||||||
announcementDetailDivisionIconCircle: { width: 26, height: 26, borderRadius: 13, alignItems: 'center', justifyContent: 'center' },
|
announcementDetailDivisionIconCircle: { width: 26, height: 26, borderRadius: 100, alignItems: 'center', justifyContent: 'center' },
|
||||||
});
|
});
|
||||||
|
|
||||||
export default AnnouncementStyles;
|
export default AnnouncementStyles;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { StyleSheet } from "react-native";
|
|||||||
|
|
||||||
const ApprovalStyles = StyleSheet.create({
|
const ApprovalStyles = StyleSheet.create({
|
||||||
approvalBadge: { borderRadius: 20, paddingHorizontal: 10, paddingVertical: 3, alignSelf: 'flex-start' },
|
approvalBadge: { borderRadius: 20, paddingHorizontal: 10, paddingVertical: 3, alignSelf: 'flex-start' },
|
||||||
approvalItem: { borderWidth: 1, borderRadius: 10, padding: 12, marginBottom: 10 },
|
approvalItem: { borderWidth: 1, borderRadius: 8, padding: 12, marginBottom: 10 },
|
||||||
approvalItemHeader: { justifyContent: 'space-between', marginBottom: 8 },
|
approvalItemHeader: { justifyContent: 'space-between', marginBottom: 8 },
|
||||||
approvalIconMr: { marginRight: 6 },
|
approvalIconMr: { marginRight: 6 },
|
||||||
approvalNoteBox: { borderRadius: 8, padding: 8, marginTop: 4 },
|
approvalNoteBox: { borderRadius: 8, padding: 8, marginTop: 4 },
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
import { StyleSheet } from "react-native";
|
import { StyleSheet } from "react-native";
|
||||||
|
|
||||||
const BorderStyles = StyleSheet.create({
|
const BorderStyles = StyleSheet.create({
|
||||||
round05: { borderRadius: 5 },
|
round04: { borderRadius: 4 },
|
||||||
|
round05: { borderRadius: 8 },
|
||||||
round08: { borderRadius: 8 },
|
round08: { borderRadius: 8 },
|
||||||
round10: { borderRadius: 10 },
|
round10: { borderRadius: 10 },
|
||||||
|
round12: { borderRadius: 12 },
|
||||||
round15: { borderRadius: 15 },
|
round15: { borderRadius: 15 },
|
||||||
round20: { borderRadius: 20 },
|
round20: { borderRadius: 20 },
|
||||||
round30: { borderRadius: 30 },
|
round30: { borderRadius: 30 },
|
||||||
|
roundFull: { borderRadius: 100 },
|
||||||
borderRight: { borderRightWidth: 1, borderRightColor: '#d6d8f6' },
|
borderRight: { borderRightWidth: 1, borderRightColor: '#d6d8f6' },
|
||||||
borderLeft: { borderLeftWidth: 1, borderLeftColor: '#d6d8f6' },
|
borderLeft: { borderLeftWidth: 1, borderLeftColor: '#d6d8f6' },
|
||||||
borderBottom: { borderBottomWidth: 1, borderBottomColor: '#d6d8f6' },
|
borderBottom: { borderBottomWidth: 1, borderBottomColor: '#d6d8f6' },
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { StyleSheet } from "react-native";
|
|||||||
|
|
||||||
const ButtonStyles = StyleSheet.create({
|
const ButtonStyles = StyleSheet.create({
|
||||||
btnIconHeader: { padding: 3 },
|
btnIconHeader: { padding: 3 },
|
||||||
btnFiturMenu: { padding: 13, borderRadius: 15, borderWidth: 1 },
|
btnFiturMenu: { padding: 13, borderRadius: 20, borderWidth: 1 },
|
||||||
btnRound: {
|
btnRound: {
|
||||||
backgroundColor: '#1F3C88',
|
backgroundColor: '#1F3C88',
|
||||||
borderWidth: 0,
|
borderWidth: 0,
|
||||||
@@ -37,8 +37,8 @@ const ButtonStyles = StyleSheet.create({
|
|||||||
padding: 5,
|
padding: 5,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
},
|
},
|
||||||
labelStatus: { paddingHorizontal: 15, paddingVertical: 4, borderRadius: 10 },
|
labelStatus: { paddingHorizontal: 15, paddingVertical: 4, borderRadius: 20 },
|
||||||
labelStatusSmall: { paddingHorizontal: 10, paddingVertical: 3, borderRadius: 10 },
|
labelStatusSmall: { paddingHorizontal: 10, paddingVertical: 3, borderRadius: 20 },
|
||||||
});
|
});
|
||||||
|
|
||||||
export default ButtonStyles;
|
export default ButtonStyles;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const CardStyles = StyleSheet.create({
|
|||||||
wrapPaper: {
|
wrapPaper: {
|
||||||
padding: 10,
|
padding: 10,
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
borderRadius: 5,
|
borderRadius: 8,
|
||||||
shadowColor: '#171717',
|
shadowColor: '#171717',
|
||||||
shadowOffset: { width: 0, height: 0 },
|
shadowOffset: { width: 0, height: 0 },
|
||||||
shadowOpacity: 0.1,
|
shadowOpacity: 0.1,
|
||||||
@@ -31,7 +31,7 @@ const CardStyles = StyleSheet.create({
|
|||||||
shadowOpacity: 0.1,
|
shadowOpacity: 0.1,
|
||||||
shadowRadius: 5,
|
shadowRadius: 5,
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
borderRadius: 5,
|
borderRadius: 8,
|
||||||
marginBottom: 15,
|
marginBottom: 15,
|
||||||
},
|
},
|
||||||
wrapGridCaraousel: {
|
wrapGridCaraousel: {
|
||||||
@@ -42,7 +42,7 @@ const CardStyles = StyleSheet.create({
|
|||||||
shadowOpacity: 0.1,
|
shadowOpacity: 0.1,
|
||||||
shadowRadius: 5,
|
shadowRadius: 5,
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
borderRadius: 5,
|
borderRadius: 8,
|
||||||
marginLeft: 5,
|
marginLeft: 5,
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
},
|
},
|
||||||
@@ -57,27 +57,27 @@ const CardStyles = StyleSheet.create({
|
|||||||
paddingVertical: 25,
|
paddingVertical: 25,
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
borderTopStartRadius: 5,
|
borderTopStartRadius: 8,
|
||||||
borderTopEndRadius: 5,
|
borderTopEndRadius: 8,
|
||||||
},
|
},
|
||||||
contentPaperGrid: {
|
contentPaperGrid: {
|
||||||
height: 125,
|
height: 125,
|
||||||
borderBottomEndRadius: 5,
|
borderBottomEndRadius: 8,
|
||||||
borderBottomStartRadius: 5,
|
borderBottomStartRadius: 8,
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
justifyContent: 'space-evenly',
|
justifyContent: 'space-evenly',
|
||||||
},
|
},
|
||||||
contentPaperGrid2: {
|
contentPaperGrid2: {
|
||||||
height: 100,
|
height: 100,
|
||||||
borderBottomEndRadius: 5,
|
borderBottomEndRadius: 8,
|
||||||
borderBottomStartRadius: 5,
|
borderBottomStartRadius: 8,
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
paddingVertical: 15,
|
paddingVertical: 15,
|
||||||
justifyContent: 'flex-start',
|
justifyContent: 'flex-start',
|
||||||
},
|
},
|
||||||
wrapGridItem: {
|
wrapGridItem: {
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderRadius: 5,
|
borderRadius: 8,
|
||||||
padding: 10,
|
padding: 10,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
@@ -88,13 +88,13 @@ const CardStyles = StyleSheet.create({
|
|||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
backgroundColor: 'transparent',
|
backgroundColor: 'transparent',
|
||||||
borderRadius: 10,
|
borderRadius: 8,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
paddingHorizontal: 12,
|
paddingHorizontal: 12,
|
||||||
paddingVertical: 10,
|
paddingVertical: 10,
|
||||||
gap: 12,
|
gap: 12,
|
||||||
},
|
},
|
||||||
sectionCard: { borderRadius: 12, padding: 16, borderWidth: 1 },
|
sectionCard: { borderRadius: 8, padding: 16, borderWidth: 1 },
|
||||||
sectionHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 12 },
|
sectionHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 12 },
|
||||||
sectionHeaderRow: {
|
sectionHeaderRow: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
@@ -110,12 +110,12 @@ const CardStyles = StyleSheet.create({
|
|||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
},
|
},
|
||||||
sectionActionRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },
|
sectionActionRow: { flexDirection: 'row', alignItems: 'center', gap: 10 },
|
||||||
sectionBadge: { borderRadius: 10, paddingHorizontal: 8, paddingVertical: 2 },
|
sectionBadge: { borderRadius: 20, paddingHorizontal: 8, paddingVertical: 2 },
|
||||||
wrapBar: { height: 20, backgroundColor: '#ccc', borderRadius: 10, margin: 0, width: '100%' },
|
wrapBar: { height: 20, backgroundColor: '#ccc', borderRadius: 10, margin: 0, width: '100%' },
|
||||||
contentBar: { height: 20, backgroundColor: '#3B82F6', borderRadius: 10 },
|
contentBar: { height: 20, backgroundColor: '#3B82F6', borderRadius: 10 },
|
||||||
toastContainer: {
|
toastContainer: {
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
borderRadius: 10,
|
borderRadius: 8,
|
||||||
padding: 10,
|
padding: 10,
|
||||||
width: '90%',
|
width: '90%',
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
@@ -135,7 +135,7 @@ const CardStyles = StyleSheet.create({
|
|||||||
loadingBox: {
|
loadingBox: {
|
||||||
paddingVertical: 15,
|
paddingVertical: 15,
|
||||||
paddingHorizontal: 40,
|
paddingHorizontal: 40,
|
||||||
borderRadius: 5,
|
borderRadius: 8,
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
gap: 10,
|
gap: 10,
|
||||||
},
|
},
|
||||||
@@ -143,16 +143,16 @@ const CardStyles = StyleSheet.create({
|
|||||||
flex: 1,
|
flex: 1,
|
||||||
justifyContent: "center",
|
justifyContent: "center",
|
||||||
marginHorizontal: 15,
|
marginHorizontal: 15,
|
||||||
borderRadius: 15,
|
borderRadius: 8,
|
||||||
backgroundColor: '#19345E',
|
backgroundColor: '#19345E',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
width: '92%',
|
width: '92%',
|
||||||
resizeMode: 'stretch',
|
resizeMode: 'stretch',
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
},
|
},
|
||||||
wrapItemDiscussion: { padding: 15, borderRadius: 5, borderBottomWidth: 1 },
|
wrapItemDiscussion: { padding: 15, borderRadius: 8, borderBottomWidth: 1 },
|
||||||
wrapItemBorderBottom: { padding: 10, borderBottomWidth: 1 },
|
wrapItemBorderBottom: { padding: 10, borderBottomWidth: 1 },
|
||||||
wrapItemBorderAll: { padding: 10, borderWidth: 1, borderRadius: 5, marginBottom: 5 },
|
wrapItemBorderAll: { padding: 10, borderWidth: 1, borderRadius: 8, marginBottom: 5 },
|
||||||
wrapItemBorderNone: { padding: 10, marginBottom: 5 },
|
wrapItemBorderNone: { padding: 10, marginBottom: 5 },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ const ComponentStyles = StyleSheet.create({
|
|||||||
userProfileExtraSmall: { width: 35, height: 35, borderRadius: 100 },
|
userProfileExtraSmall: { width: 35, height: 35, borderRadius: 100 },
|
||||||
userProfileSmall: { width: 48, height: 48, borderRadius: 100 },
|
userProfileSmall: { width: 48, height: 48, borderRadius: 100 },
|
||||||
userProfileBig: { width: 100, height: 100, borderRadius: 100 },
|
userProfileBig: { width: 100, height: 100, borderRadius: 100 },
|
||||||
imgListBanner: { width: 100, height: 50, borderRadius: 5 },
|
imgListBanner: { width: 100, height: 50, borderRadius: 8 },
|
||||||
iconContent: { padding: 10, borderRadius: 100, backgroundColor: '#E5E7EB' },
|
iconContent: { padding: 10, borderRadius: 100, backgroundColor: '#E5E7EB' },
|
||||||
|
|
||||||
// chip
|
// chip
|
||||||
chip: {
|
chip: {
|
||||||
paddingVertical: 5,
|
paddingVertical: 5,
|
||||||
paddingHorizontal: 15,
|
paddingHorizontal: 15,
|
||||||
borderRadius: 5,
|
borderRadius: 20,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderColor: "transparent",
|
borderColor: "transparent",
|
||||||
marginRight: 10,
|
marginRight: 10,
|
||||||
@@ -26,14 +26,14 @@ const ComponentStyles = StyleSheet.create({
|
|||||||
top: -6,
|
top: -6,
|
||||||
left: -6,
|
left: -6,
|
||||||
backgroundColor: "#384288",
|
backgroundColor: "#384288",
|
||||||
borderRadius: 10,
|
borderRadius: 8,
|
||||||
padding: 2,
|
padding: 2,
|
||||||
},
|
},
|
||||||
|
|
||||||
// badge & progress
|
// badge & progress
|
||||||
badgeCol: { alignItems: 'center', gap: 6 },
|
badgeCol: { alignItems: 'center', gap: 6 },
|
||||||
progressBadge: { borderRadius: 10, paddingHorizontal: 12, paddingVertical: 5, borderWidth: 1, alignItems: 'center' },
|
progressBadge: { borderRadius: 8, paddingHorizontal: 12, paddingVertical: 5, borderWidth: 1, alignItems: 'center' },
|
||||||
taskCountBadge: { borderRadius: 6, paddingHorizontal: 7, paddingVertical: 2 },
|
taskCountBadge: { borderRadius: 8, paddingHorizontal: 7, paddingVertical: 2 },
|
||||||
positionBadge: { borderRadius: 20, paddingHorizontal: 8, paddingVertical: 3 },
|
positionBadge: { borderRadius: 20, paddingHorizontal: 8, paddingVertical: 3 },
|
||||||
textProgressPercent: { fontSize: 22, fontWeight: 'bold', lineHeight: 28 },
|
textProgressPercent: { fontSize: 22, fontWeight: 'bold', lineHeight: 28 },
|
||||||
progressTrack: { height: 8, borderRadius: 4, overflow: 'hidden' },
|
progressTrack: { height: 8, borderRadius: 4, overflow: 'hidden' },
|
||||||
@@ -41,11 +41,11 @@ const ComponentStyles = StyleSheet.create({
|
|||||||
reportContent: { borderLeftWidth: 3, paddingLeft: 12 },
|
reportContent: { borderLeftWidth: 3, paddingLeft: 12 },
|
||||||
expandBtn: { flexDirection: 'row', alignItems: 'center', alignSelf: 'flex-start', marginTop: 8, gap: 4 },
|
expandBtn: { flexDirection: 'row', alignItems: 'center', alignSelf: 'flex-start', marginTop: 8, gap: 4 },
|
||||||
fileGrid: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },
|
fileGrid: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },
|
||||||
fileCard: { width: '48%', borderRadius: 10, borderWidth: 1, padding: 12, flexDirection: 'row', alignItems: 'center', gap: 10 },
|
fileCard: { width: '48%', borderRadius: 8, borderWidth: 1, padding: 12, flexDirection: 'row', alignItems: 'center', gap: 10 },
|
||||||
|
|
||||||
// calendar
|
// calendar
|
||||||
signDate: { width: 20, height: 2, borderRadius: 3, marginTop: 3 },
|
signDate: { width: 20, height: 2, borderRadius: 4, marginTop: 3 },
|
||||||
selectedDate: { backgroundColor: '#238be6', borderRadius: 5 },
|
selectedDate: { backgroundColor: '#238be6', borderRadius: 4 },
|
||||||
selectRangeDate: { backgroundColor: '#228be61f' },
|
selectRangeDate: { backgroundColor: '#228be61f' },
|
||||||
calendarDotRow: { flexDirection: 'row', gap: 2, height: 6, marginTop: 1 },
|
calendarDotRow: { flexDirection: 'row', gap: 2, height: 6, marginTop: 1 },
|
||||||
calendarDot: { width: 5, height: 5, borderRadius: 3 },
|
calendarDot: { width: 5, height: 5, borderRadius: 3 },
|
||||||
@@ -55,7 +55,7 @@ const ComponentStyles = StyleSheet.create({
|
|||||||
villageEventBadge: { paddingHorizontal: 6, paddingVertical: 2, borderRadius: 4, marginRight: 6 },
|
villageEventBadge: { paddingHorizontal: 6, paddingVertical: 2, borderRadius: 4, marginRight: 6 },
|
||||||
|
|
||||||
// event item
|
// event item
|
||||||
itemEvent: { padding: 10, borderRadius: 10, flexDirection: 'row', alignContent: 'stretch', marginBottom: 10 },
|
itemEvent: { padding: 10, borderRadius: 8, flexDirection: 'row', alignContent: 'stretch', marginBottom: 10 },
|
||||||
dividerEvent: { width: 7, borderRadius: 5, marginRight: 10 },
|
dividerEvent: { width: 7, borderRadius: 5, marginRight: 10 },
|
||||||
|
|
||||||
// member
|
// member
|
||||||
@@ -75,16 +75,16 @@ const ComponentStyles = StyleSheet.create({
|
|||||||
memberInfoContent: { flex: 1, marginLeft: 10 },
|
memberInfoContent: { flex: 1, marginLeft: 10 },
|
||||||
|
|
||||||
// discussion
|
// discussion
|
||||||
discussionCard: { borderRadius: 10, borderWidth: 1, padding: 14 },
|
discussionCard: { borderRadius: 8, borderWidth: 1, padding: 14 },
|
||||||
discussionIconCircle: { width: 40, height: 40, borderRadius: 20, alignItems: 'center', justifyContent: 'center', flexShrink: 0 },
|
discussionIconCircle: { width: 40, height: 40, borderRadius: 100, alignItems: 'center', justifyContent: 'center', flexShrink: 0 },
|
||||||
discussionIconCircleLg: { width: 44, height: 44, borderRadius: 22, alignItems: 'center', justifyContent: 'center' },
|
discussionIconCircleLg: { width: 44, height: 44, borderRadius: 100, alignItems: 'center', justifyContent: 'center' },
|
||||||
discussionStatusPill: { alignSelf: 'flex-start', marginTop: 3, paddingHorizontal: 8, paddingVertical: 2, borderRadius: 20, borderWidth: 1 },
|
discussionStatusPill: { alignSelf: 'flex-start', marginTop: 3, paddingHorizontal: 8, paddingVertical: 2, borderRadius: 20, borderWidth: 1 },
|
||||||
discussionStatusText: { fontSize: 11, fontWeight: '600' },
|
discussionStatusText: { fontSize: 11, fontWeight: '600' },
|
||||||
discussionCardIndent: { marginLeft: 50 },
|
discussionCardIndent: { marginLeft: 50 },
|
||||||
discussionSeparator: { height: 8 },
|
discussionSeparator: { height: 8 },
|
||||||
discussionCommentText: { fontSize: 12, marginLeft: 5 },
|
discussionCommentText: { fontSize: 12, marginLeft: 5 },
|
||||||
discussionDateText: { fontSize: 11 },
|
discussionDateText: { fontSize: 11 },
|
||||||
discussionCommentCard: { borderRadius: 10, borderWidth: 1, padding: 12, marginBottom: 8, flexDirection: 'row' },
|
discussionCommentCard: { borderRadius: 8, borderWidth: 1, padding: 12, marginBottom: 8, flexDirection: 'row' },
|
||||||
discussionEditedText: { fontSize: 10, fontStyle: 'italic' },
|
discussionEditedText: { fontSize: 10, fontStyle: 'italic' },
|
||||||
discussionHeaderPadding: { paddingTop: 12 },
|
discussionHeaderPadding: { paddingTop: 12 },
|
||||||
discussionListPadding: { paddingTop: 8 },
|
discussionListPadding: { paddingTop: 8 },
|
||||||
@@ -98,7 +98,7 @@ const ComponentStyles = StyleSheet.create({
|
|||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
left: 24,
|
left: 24,
|
||||||
right: 24,
|
right: 24,
|
||||||
borderRadius: 16,
|
borderRadius: 8,
|
||||||
padding: 20,
|
padding: 20,
|
||||||
shadowColor: '#000',
|
shadowColor: '#000',
|
||||||
shadowOffset: { width: 0, height: 4 },
|
shadowOffset: { width: 0, height: 4 },
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { StyleSheet } from "react-native";
|
|||||||
|
|
||||||
const InputStyles = StyleSheet.create({
|
const InputStyles = StyleSheet.create({
|
||||||
inputRoundForm: {
|
inputRoundForm: {
|
||||||
borderRadius: 5,
|
borderRadius: 12,
|
||||||
borderColor: '#d6d8f6',
|
borderColor: '#d6d8f6',
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
paddingVertical: 10,
|
paddingVertical: 10,
|
||||||
@@ -25,7 +25,7 @@ const InputStyles = StyleSheet.create({
|
|||||||
lineHeight: 45,
|
lineHeight: 45,
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderRadius: 15,
|
borderRadius: 12,
|
||||||
borderColor: 'gray',
|
borderColor: 'gray',
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,31 +6,31 @@ const ModalStyles = StyleSheet.create({
|
|||||||
width: '100%',
|
width: '100%',
|
||||||
paddingBottom: 20,
|
paddingBottom: 20,
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
borderTopRightRadius: 18,
|
borderTopRightRadius: 20,
|
||||||
borderTopLeftRadius: 18,
|
borderTopLeftRadius: 20,
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
},
|
},
|
||||||
modalContentNew: {
|
modalContentNew: {
|
||||||
width: '100%',
|
width: '100%',
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
borderTopRightRadius: 18,
|
borderTopRightRadius: 20,
|
||||||
borderTopLeftRadius: 18,
|
borderTopLeftRadius: 20,
|
||||||
paddingTop: 5,
|
paddingTop: 5,
|
||||||
paddingBottom: 5,
|
paddingBottom: 5,
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
},
|
},
|
||||||
modalFloatContent: {
|
modalFloatContent: {
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
borderRadius: 18,
|
borderRadius: 20,
|
||||||
paddingTop: 5,
|
paddingTop: 5,
|
||||||
paddingBottom: 10,
|
paddingBottom: 10,
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
},
|
},
|
||||||
titleContainer: {
|
titleContainer: {
|
||||||
backgroundColor: 'white',
|
backgroundColor: 'white',
|
||||||
borderTopRightRadius: 10,
|
borderTopRightRadius: 20,
|
||||||
borderTopLeftRadius: 10,
|
borderTopLeftRadius: 20,
|
||||||
paddingHorizontal: 20,
|
paddingHorizontal: 20,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
@@ -65,7 +65,7 @@ const ModalStyles = StyleSheet.create({
|
|||||||
},
|
},
|
||||||
modalConfirmContainer: {
|
modalConfirmContainer: {
|
||||||
width: '80%',
|
width: '80%',
|
||||||
borderRadius: 14,
|
borderRadius: 8,
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
shadowColor: '#000',
|
shadowColor: '#000',
|
||||||
@@ -92,7 +92,7 @@ const ModalStyles = StyleSheet.create({
|
|||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
width: 300,
|
width: 300,
|
||||||
height: 300,
|
height: 300,
|
||||||
borderRadius: 150,
|
borderRadius: 100,
|
||||||
backgroundColor: 'rgba(255, 255, 255, 0.05)',
|
backgroundColor: 'rgba(255, 255, 255, 0.05)',
|
||||||
top: -50,
|
top: -50,
|
||||||
right: -50,
|
right: -50,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const NotificationStyles = StyleSheet.create({
|
|||||||
notifItemRow: {
|
notifItemRow: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
borderRadius: 10,
|
borderRadius: 8,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
paddingHorizontal: 12,
|
paddingHorizontal: 12,
|
||||||
paddingVertical: 10,
|
paddingVertical: 10,
|
||||||
@@ -17,7 +17,7 @@ const NotificationStyles = StyleSheet.create({
|
|||||||
notifIconContainer: {
|
notifIconContainer: {
|
||||||
width: 42,
|
width: 42,
|
||||||
height: 42,
|
height: 42,
|
||||||
borderRadius: 21,
|
borderRadius: 100,
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
flexShrink: 0,
|
flexShrink: 0,
|
||||||
|
|||||||
@@ -394,7 +394,7 @@
|
|||||||
);
|
);
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
|
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = mobiledarmasaba.app;
|
PRODUCT_BUNDLE_IDENTIFIER = mobiledarmasaba.app;
|
||||||
PRODUCT_NAME = Desa;
|
PRODUCT_NAME = "Desa";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Desa/Desa-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Desa/Desa-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@@ -429,7 +429,7 @@
|
|||||||
);
|
);
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
|
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = mobiledarmasaba.app;
|
PRODUCT_BUNDLE_IDENTIFIER = mobiledarmasaba.app;
|
||||||
PRODUCT_NAME = Desa;
|
PRODUCT_NAME = "Desa";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Desa/Desa-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Desa/Desa-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2.1.0</string>
|
<string>2.2.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>9</string>
|
<string>10</string>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
|||||||
Reference in New Issue
Block a user