Merge pull request 'upd: redesign' (#27) from amalia/20-feb-26 into join

Reviewed-on: #27
This commit is contained in:
2026-02-23 10:17:00 +08:00
28 changed files with 256 additions and 189 deletions

View File

@@ -4,7 +4,7 @@ import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingOverlay from "@/components/loadingOverlay"; import LoadingCenter from "@/components/loadingCenter";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
import ModalSelectMultiple from "@/components/modalSelectMultiple"; import ModalSelectMultiple from "@/components/modalSelectMultiple";
import Text from "@/components/Text"; import Text from "@/components/Text";
@@ -174,7 +174,7 @@ export default function CreateAnnouncement() {
) )
}} }}
/> />
<LoadingOverlay visible={loading} /> {loading && <LoadingCenter />}
<ScrollView <ScrollView
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
style={[Styles.h100, { backgroundColor: colors.background }]} style={[Styles.h100, { backgroundColor: colors.background }]}
@@ -205,8 +205,12 @@ export default function CreateAnnouncement() {
{ {
fileForm.length > 0 fileForm.length > 0
&& &&
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}> <>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text style={[Styles.textDefaultSemiBold]}>File</Text> <Text style={[Styles.textDefaultSemiBold]}>File</Text>
<Text style={[Styles.textDefault]}>{fileForm.length} file</Text>
</View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}>
{ {
fileForm.map((item, index) => ( fileForm.map((item, index) => (
<BorderBottomItem <BorderBottomItem
@@ -221,6 +225,7 @@ export default function CreateAnnouncement() {
)) ))
} }
</View> </View>
</>
} }
<ButtonSelect <ButtonSelect
@@ -233,6 +238,10 @@ export default function CreateAnnouncement() {
{ {
divisionMember.length > 0 divisionMember.length > 0
&& &&
<>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text style={[Styles.textDefaultSemiBold]}>Divisi</Text>
</View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, { borderColor: colors.icon + '20' }]}> <View style={[Styles.borderAll, Styles.round05, Styles.p10, { borderColor: colors.icon + '20' }]}>
{ {
divisionMember.map((item: { name: any; Division: any }, index: any) => { divisionMember.map((item: { name: any; Division: any }, index: any) => {
@@ -252,6 +261,7 @@ export default function CreateAnnouncement() {
}) })
} }
</View> </View>
</>
} }
</View> </View>
</ScrollView> </ScrollView>

View File

@@ -4,7 +4,7 @@ import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingOverlay from "@/components/loadingOverlay"; import LoadingCenter from "@/components/loadingCenter";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
import ModalSelectMultiple from "@/components/modalSelectMultiple"; import ModalSelectMultiple from "@/components/modalSelectMultiple";
import Text from '@/components/Text'; import Text from '@/components/Text';
@@ -225,7 +225,7 @@ export default function EditAnnouncement() {
) )
}} }}
/> />
<LoadingOverlay visible={loading} /> {loading && <LoadingCenter />}
<ScrollView <ScrollView
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
style={[Styles.h100, { backgroundColor: colors.background }]} style={[Styles.h100, { backgroundColor: colors.background }]}
@@ -258,13 +258,17 @@ export default function EditAnnouncement() {
{ {
(fileForm.length > 0 || dataFile.filter((val) => !val.delete).length > 0) (fileForm.length > 0 || dataFile.filter((val) => !val.delete).length > 0)
&& &&
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}> <>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text style={[Styles.textDefaultSemiBold]}>File</Text> <Text style={[Styles.textDefaultSemiBold]}>File</Text>
<Text style={[Styles.textDefault]}>{fileForm.length + dataFile.filter((val) => !val.delete).length} file</Text>
</View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}>
{ {
dataFile.filter((val) => !val.delete).map((item, index) => ( dataFile.filter((val) => !val.delete).map((item, index) => (
<BorderBottomItem <BorderBottomItem
key={index} key={index}
borderType={(fileForm.length + dataFile.length) > 1 ? "bottom" : "none"} borderType={dataFile.filter((val) => !val.delete).length - 1 == index && fileForm.length == 0 ? "none" : "bottom"}
icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />} icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />}
title={item.name + '.' + item.extension} title={item.name + '.' + item.extension}
titleWeight="normal" titleWeight="normal"
@@ -277,7 +281,7 @@ export default function EditAnnouncement() {
fileForm.map((item, index) => ( fileForm.map((item, index) => (
<BorderBottomItem <BorderBottomItem
key={index} key={index}
borderType={(fileForm.length + dataFile.length) > 1 ? "bottom" : "none"} borderType={fileForm.length - 1 == index ? "none" : "bottom"}
icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />} icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />}
title={item.name} title={item.name}
titleWeight="normal" titleWeight="normal"
@@ -287,6 +291,7 @@ export default function EditAnnouncement() {
)) ))
} }
</View> </View>
</>
} }
<ButtonSelect <ButtonSelect
value="Pilih divisi penerima pengumuman" value="Pilih divisi penerima pengumuman"
@@ -297,6 +302,10 @@ export default function EditAnnouncement() {
{ {
dataMember.length > 0 dataMember.length > 0
&& &&
<>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text style={[Styles.textDefaultSemiBold]}>Divisi</Text>
</View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, { borderColor: colors.icon + '20' }]}> <View style={[Styles.borderAll, Styles.round05, Styles.p10, { borderColor: colors.icon + '20' }]}>
{ {
dataMember.map((item: { name: any; Division: any }, index: any) => { dataMember.map((item: { name: any; Division: any }, index: any) => {
@@ -316,6 +325,7 @@ export default function EditAnnouncement() {
}) })
} }
</View> </View>
</>
} }
</View> </View>
</ScrollView> </ScrollView>

View File

@@ -1,6 +1,7 @@
import AppHeader from "@/components/AppHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingCenter from "@/components/loadingCenter";
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";
@@ -145,6 +146,7 @@ export default function EditBanner() {
) )
}} }}
/> />
{loading && <LoadingCenter />}
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, { backgroundColor: colors.background }]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, { backgroundColor: colors.background }]}>
<View style={[Styles.p15, Styles.mb100]}> <View style={[Styles.p15, Styles.mb100]}>
<View style={[Styles.mb15]}> <View style={[Styles.mb15]}>

View File

@@ -1,6 +1,7 @@
import AppHeader from "@/components/AppHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingCenter from "@/components/loadingCenter";
import Text from "@/components/Text"; import Text from "@/components/Text";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
import { apiCreateBanner, apiGetBanner } from "@/lib/api"; import { apiCreateBanner, apiGetBanner } from "@/lib/api";
@@ -99,24 +100,8 @@ export default function CreateBanner() {
<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: "Tambah Banner", headerTitle: "Tambah Banner",
headerTitleAlign: "center", headerTitleAlign: "center",
// headerRight: () => (
// <ButtonSaveHeader
// disable={title == "" || selectedImage == undefined || error || loading ? true : false}
// category="create"
// onPress={() => {
// handleCreateEntity();
// }}
// />
// ),
header: () => ( header: () => (
<AppHeader <AppHeader
title="Fitur" title="Fitur"
@@ -135,6 +120,7 @@ export default function CreateBanner() {
) )
}} }}
/> />
{loading && <LoadingCenter />}
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, { backgroundColor: colors.background }]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, { backgroundColor: colors.background }]}>
<View style={[Styles.p15]}> <View style={[Styles.p15]}>
<View style={[Styles.mb15]}> <View style={[Styles.mb15]}>
@@ -148,13 +134,13 @@ export default function CreateBanner() {
) : ( ) : (
<Pressable <Pressable
onPress={pickImageAsync} onPress={pickImageAsync}
style={[Styles.wrapPaper, Styles.contentItemCenter]} style={[Styles.wrapPaper, Styles.contentItemCenter, Styles.borderAll, { backgroundColor: colors.card, borderColor: colors.icon + '20' }]}
> >
<View <View
style={[Styles.contentItemCenter]} style={[Styles.contentItemCenter]}
> >
<Entypo name="image" size={50} color={"#aeaeae"} /> <Entypo name="image" size={50} color={colors.dimmed} />
<Text style={[Styles.textInformation, Styles.mt05]}> <Text style={[Styles.textInformation, Styles.mt05, { color: colors.dimmed }]}>
Mohon unggah gambar dalam resolusi 1650 x 720 pixel untuk Mohon unggah gambar dalam resolusi 1650 x 720 pixel untuk
memastikan memastikan
</Text> </Text>

View File

@@ -5,7 +5,7 @@ import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingOverlay from "@/components/loadingOverlay"; import LoadingCenter from "@/components/loadingCenter";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
import ModalSelect from "@/components/modalSelect"; import ModalSelect from "@/components/modalSelect";
import SelectForm from "@/components/selectForm"; import SelectForm from "@/components/selectForm";
@@ -206,7 +206,7 @@ export default function CreateDiscussionGeneral() {
) )
}} }}
/> />
<LoadingOverlay visible={loading} /> {loading && <LoadingCenter />}
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, Styles.flex1, { backgroundColor: colors.background }]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100, Styles.flex1, { backgroundColor: colors.background }]}>
<View style={[Styles.p15, Styles.mb100]}> <View style={[Styles.p15, Styles.mb100]}>
{ {
@@ -253,8 +253,12 @@ export default function CreateDiscussionGeneral() {
{ {
fileForm.length > 0 fileForm.length > 0
&& &&
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}> <>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text style={[Styles.textDefaultSemiBold]}>File</Text> <Text style={[Styles.textDefaultSemiBold]}>File</Text>
<Text style={[Styles.textDefault]}>{fileForm.length} file</Text>
</View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}>
{ {
fileForm.map((item, index) => ( fileForm.map((item, index) => (
<BorderBottomItem <BorderBottomItem
@@ -269,6 +273,7 @@ export default function CreateDiscussionGeneral() {
)) ))
} }
</View> </View>
</>
} }
<ButtonSelect <ButtonSelect
value="Pilih Anggota" value="Pilih Anggota"
@@ -293,8 +298,8 @@ export default function CreateDiscussionGeneral() {
entitiesMember.length > 0 && entitiesMember.length > 0 &&
<View> <View>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}> <View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text>Anggota</Text> <Text style={[Styles.textDefaultSemiBold]}>Anggota</Text>
<Text>Total {entitiesMember.length} Anggota</Text> <Text style={[Styles.textDefault]}>{entitiesMember.length} Anggota</Text>
</View> </View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, { borderColor: colors.icon + '20' }]}> <View style={[Styles.borderAll, Styles.round05, Styles.p10, { borderColor: colors.icon + '20' }]}>

View File

@@ -5,7 +5,7 @@ import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingOverlay from "@/components/loadingOverlay"; import LoadingCenter from "@/components/loadingCenter";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
import { apiEditDiscussionGeneral, apiGetDiscussionGeneralOne } from "@/lib/api"; import { apiEditDiscussionGeneral, apiGetDiscussionGeneralOne } from "@/lib/api";
@@ -199,7 +199,7 @@ export default function EditDiscussionGeneral() {
) )
}} }}
/> />
<LoadingOverlay visible={loading} /> {loading && <LoadingCenter />}
<ScrollView showsVerticalScrollIndicator={false} 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]}>
<InputForm <InputForm
@@ -229,13 +229,17 @@ export default function EditDiscussionGeneral() {
{ {
(fileForm.length > 0 || dataFile.filter((val) => !val.delete).length > 0) (fileForm.length > 0 || dataFile.filter((val) => !val.delete).length > 0)
&& &&
<>
<View style={[Styles.rowSpaceBetween, Styles.mv05]}>
<Text style={[Styles.textDefaultSemiBold]}>File</Text>
<Text style={[Styles.textDefault]}>{fileForm.length + dataFile.filter((val) => !val.delete).length} file</Text>
</View>
<View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}> <View style={[Styles.borderAll, Styles.round05, Styles.p10, Styles.mb10, { borderColor: colors.icon + '20' }]}>
<Text style={[Styles.textDefault]}>File</Text>
{ {
dataFile.filter((val) => !val.delete).map((item, index) => ( dataFile.filter((val) => !val.delete).map((item, index) => (
<BorderBottomItem <BorderBottomItem
key={index} key={index}
borderType={(fileForm.length + dataFile.length) > 1 ? "bottom" : "none"} borderType={dataFile.filter((val) => !val.delete).length - 1 == index && fileForm.length == 0 ? "none" : "bottom"}
icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />} icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />}
title={item.name + '.' + item.extension} title={item.name + '.' + item.extension}
titleWeight="normal" titleWeight="normal"
@@ -248,7 +252,7 @@ export default function EditDiscussionGeneral() {
fileForm.map((item, index) => ( fileForm.map((item, index) => (
<BorderBottomItem <BorderBottomItem
key={index} key={index}
borderType={(fileForm.length + dataFile.length) > 1 ? "bottom" : "none"} borderType={fileForm.length - 1 == index ? "none" : "bottom"}
icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />} icon={<MaterialCommunityIcons name="file-outline" size={25} color={colors.text} />}
title={item.name} title={item.name}
titleWeight="normal" titleWeight="normal"
@@ -258,6 +262,7 @@ export default function EditDiscussionGeneral() {
)) ))
} }
</View> </View>
</>
} }
</View> </View>
</ScrollView> </ScrollView>

View File

@@ -169,7 +169,7 @@ export default function AddMemberCalendarEvent() {
return ( return (
<Pressable <Pressable
key={index} key={index}
style={[Styles.itemSelectModal]} style={[Styles.itemSelectModal, {borderColor: colors.icon + '20'}]}
onPress={() => { onPress={() => {
!found && onChoose(item.idUser, item.name, item.img) !found && onChoose(item.idUser, item.name, item.img)
}} }}

View File

@@ -90,7 +90,7 @@ export default function CalendarHistory() {
<View style={[{ flex: 1 }]}> <View style={[{ flex: 1 }]}>
<FlatList data={item.data} <FlatList data={item.data}
renderItem={({ item, index }: { item: { title: string, timeStart: string, timeEnd: string }, index: number }) => ( renderItem={({ item, index }: { item: { title: string, timeStart: string, timeEnd: string }, index: number }) => (
<View key={index} style={[Styles.mb05, Styles.w80]}> <View key={index} style={[Styles.mb05]}>
<Text style={[Styles.textDefaultSemiBold]} numberOfLines={1} ellipsizeMode="tail">{item.title}</Text> <Text style={[Styles.textDefaultSemiBold]} numberOfLines={1} ellipsizeMode="tail">{item.title}</Text>
<Text style={[Styles.textDefault]}>{item.timeStart} | {item.timeEnd}</Text> <Text style={[Styles.textDefault]}>{item.timeStart} | {item.timeEnd}</Text>
</View> </View>

View File

@@ -4,7 +4,7 @@ import ButtonSaveHeader from "@/components/buttonSaveHeader";
import ButtonSelect from "@/components/buttonSelect"; import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingOverlay from "@/components/loadingOverlay"; import LoadingCenter from "@/components/loadingCenter";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
import Text from "@/components/Text"; import Text from "@/components/Text";
import Styles from "@/constants/Styles"; import Styles from "@/constants/Styles";
@@ -168,7 +168,7 @@ export default function DiscussionDivisionEdit() {
) )
}} }}
/> />
<LoadingOverlay visible={loading} /> {loading && <LoadingCenter />}
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>
<View style={[Styles.p15]}> <View style={[Styles.p15]}>
<InputForm <InputForm

View File

@@ -4,7 +4,7 @@ import ButtonSaveHeader from "@/components/buttonSaveHeader"
import ButtonSelect from "@/components/buttonSelect" import ButtonSelect from "@/components/buttonSelect"
import DrawerBottom from "@/components/drawerBottom" import DrawerBottom from "@/components/drawerBottom"
import { InputForm } from "@/components/inputForm" import { InputForm } from "@/components/inputForm"
import LoadingOverlay from "@/components/loadingOverlay" import LoadingCenter from "@/components/loadingCenter"
import MenuItemRow from "@/components/menuItemRow" import MenuItemRow from "@/components/menuItemRow"
import Text from "@/components/Text" import Text from "@/components/Text"
import Styles from "@/constants/Styles" import Styles from "@/constants/Styles"
@@ -119,7 +119,7 @@ export default function CreateDiscussionDivision() {
) )
}} }}
/> />
<LoadingOverlay visible={loading} /> {loading && <LoadingCenter />}
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>
<View style={[Styles.p15, Styles.mb100]}> <View style={[Styles.p15, Styles.mb100]}>
<InputForm <InputForm

View File

@@ -1,6 +1,7 @@
import AppHeader from "@/components/AppHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingCenter from "@/components/loadingCenter";
import ModalSelect from "@/components/modalSelect"; import ModalSelect from "@/components/modalSelect";
import SelectForm from "@/components/selectForm"; import SelectForm from "@/components/selectForm";
import Text from "@/components/Text"; import Text from "@/components/Text";
@@ -228,6 +229,7 @@ export default function CreateMember() {
) )
}} }}
/> />
{loading && <LoadingCenter />}
<KeyboardAvoidingView <KeyboardAvoidingView
style={[Styles.h100, { backgroundColor: colors.background }]} style={[Styles.h100, { backgroundColor: colors.background }]}
behavior={Platform.OS === 'ios' ? 'padding' : undefined} behavior={Platform.OS === 'ios' ? 'padding' : undefined}

View File

@@ -1,6 +1,7 @@
import AppHeader from "@/components/AppHeader"; import AppHeader from "@/components/AppHeader";
import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingCenter from "@/components/loadingCenter";
import ModalSelect from "@/components/modalSelect"; import ModalSelect from "@/components/modalSelect";
import SelectForm from "@/components/selectForm"; import SelectForm from "@/components/selectForm";
import Text from "@/components/Text"; import Text from "@/components/Text";
@@ -261,7 +262,7 @@ export default function EditMember() {
) )
}} }}
/> />
{loading && <LoadingCenter />}
<KeyboardAvoidingView <KeyboardAvoidingView
style={[Styles.h100, { backgroundColor: colors.background }]} style={[Styles.h100, { backgroundColor: colors.background }]}
behavior={Platform.OS === 'ios' ? 'padding' : undefined} behavior={Platform.OS === 'ios' ? 'padding' : undefined}

View File

@@ -3,6 +3,7 @@ import BorderBottomItem from "@/components/borderBottomItem"
import ButtonSaveHeader from "@/components/buttonSaveHeader" import ButtonSaveHeader from "@/components/buttonSaveHeader"
import ButtonSelect from "@/components/buttonSelect" import ButtonSelect from "@/components/buttonSelect"
import DrawerBottom from "@/components/drawerBottom" import DrawerBottom from "@/components/drawerBottom"
import LoadingCenter from "@/components/loadingCenter"
import MenuItemRow from "@/components/menuItemRow" import MenuItemRow from "@/components/menuItemRow"
import Styles from "@/constants/Styles" import Styles from "@/constants/Styles"
import { apiAddFileProject, apiCheckFileProject } from "@/lib/api" import { apiAddFileProject, apiCheckFileProject } from "@/lib/api"
@@ -155,13 +156,16 @@ export default function ProjectAddFile() {
) )
}} }}
/> />
<ScrollView style={[Styles.h100, { backgroundColor: colors.background }]}> {
<View style={[Styles.p15, Styles.mb100]}> loading && <LoadingCenter size="large" />
}
<ScrollView style={[Styles.flex1, { backgroundColor: colors.background }]}>
<View style={[Styles.p15]}>
<ButtonSelect value="Upload File" onPress={pickDocumentAsync} /> <ButtonSelect value="Upload File" onPress={pickDocumentAsync} />
{ {
listFile.length > 0 && ( listFile.length > 0 && (
<View style={[Styles.mb15]}> <View style={[Styles.mb15]}>
<Text style={[Styles.textDefaultSemiBold, Styles.mv05]}>File</Text> <Text style={[Styles.textDefaultSemiBold, Styles.mv05, { color: colors.text }]}>File</Text>
<View style={[Styles.wrapPaper, { backgroundColor: colors.card, borderColor: colors.background }]}> <View style={[Styles.wrapPaper, { backgroundColor: colors.card, borderColor: colors.background }]}>
{ {
listFile.map((item, index) => ( listFile.map((item, index) => (
@@ -182,9 +186,6 @@ export default function ProjectAddFile() {
{ {
loadingCheck && <ActivityIndicator size="small" /> loadingCheck && <ActivityIndicator size="small" />
} }
{
loading && <ActivityIndicator size="large" />
}
</View> </View>
</ScrollView> </ScrollView>
<DrawerBottom animation="slide" isVisible={isModal} setVisible={setModal} title="Menu"> <DrawerBottom animation="slide" isVisible={isModal} setVisible={setModal} title="Menu">

View File

@@ -100,7 +100,7 @@ export default function AddMemberProject() {
<Stack.Screen <Stack.Screen
options={{ options={{
// headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, // headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Tambah Anggota Kegiatan', headerTitle: 'Tambah Anggota',
headerTitleAlign: 'center', headerTitleAlign: 'center',
// headerRight: () => ( // headerRight: () => (
// <ButtonSaveHeader // <ButtonSaveHeader
@@ -113,7 +113,7 @@ export default function AddMemberProject() {
// ) // )
header: () => ( header: () => (
<AppHeader <AppHeader
title="Tambah Anggota Kegiatan" title="Tambah Anggota"
showBack={true} showBack={true}
onPressLeft={() => router.back()} onPressLeft={() => router.back()}
right={ right={
@@ -165,7 +165,7 @@ export default function AddMemberProject() {
return ( return (
<Pressable <Pressable
key={index} key={index}
style={[Styles.itemSelectModal]} style={[Styles.itemSelectModal, { borderColor: colors.icon + '20' }]}
onPress={() => { onPress={() => {
!found && onChoose(item.id, item.name, item.img) !found && onChoose(item.id, item.name, item.img)
}} }}

View File

@@ -197,7 +197,7 @@ export default function ProjectAddTask() {
/> />
</View> </View>
<View style={[Styles.mv10]}> <View style={[Styles.mv10]}>
<View style={[Styles.rowSpaceBetween]}> <View style={[Styles.rowSpaceBetween, Styles.mb10]}>
<View style={[Styles.w48]}> <View style={[Styles.w48]}>
<Text style={[Styles.mb05]}> <Text style={[Styles.mb05]}>
Tanggal Mulai <Text style={{ color: colors.error }}>*</Text> Tanggal Mulai <Text style={{ color: colors.error }}>*</Text>

View File

@@ -5,6 +5,7 @@ import ButtonSelect from "@/components/buttonSelect";
import DrawerBottom from "@/components/drawerBottom"; import DrawerBottom from "@/components/drawerBottom";
import ImageUser from "@/components/imageNew"; import ImageUser from "@/components/imageNew";
import { InputForm } from "@/components/inputForm"; import { InputForm } from "@/components/inputForm";
import LoadingCenter from "@/components/loadingCenter";
import MenuItemRow from "@/components/menuItemRow"; import MenuItemRow from "@/components/menuItemRow";
import ModalSelect from "@/components/modalSelect"; import ModalSelect from "@/components/modalSelect";
import SectionListAddTask from "@/components/project/sectionListAddTask"; import SectionListAddTask from "@/components/project/sectionListAddTask";
@@ -230,6 +231,9 @@ export default function CreateProject() {
) )
}} }}
/> />
{
loading && <LoadingCenter />
}
<ScrollView <ScrollView
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
style={[Styles.h100, { backgroundColor: colors.background }]} style={[Styles.h100, { backgroundColor: colors.background }]}

View File

@@ -183,7 +183,7 @@ export default function CreateProjectAddTask() {
/> />
</View> </View>
<View style={[Styles.mv10]}> <View style={[Styles.mv10]}>
<View style={[Styles.rowSpaceBetween]}> <View style={[Styles.rowSpaceBetween, Styles.mb10]}>
<View style={[{ width: "48%" }]}> <View style={[{ width: "48%" }]}>
<Text style={[Styles.mb05]}> <Text style={[Styles.mb05]}>
Tanggal Mulai <Text style={{ color: colors.error }}>*</Text> Tanggal Mulai <Text style={{ color: colors.error }}>*</Text>

View File

@@ -233,7 +233,7 @@ export default function UpdateProjectTask() {
</View> </View>
<View style={[Styles.mv10]}> <View style={[Styles.mv10]}>
<View style={[Styles.rowSpaceBetween]}> <View style={[Styles.rowSpaceBetween, Styles.mb10]}>
<View style={[{ width: '48%' }]}> <View style={[{ width: '48%' }]}>
<Text style={[Styles.mb05]}>Tanggal Mulai <Text style={{ color: colors.error }}>*</Text></Text> <Text style={[Styles.mb05]}>Tanggal Mulai <Text style={{ color: colors.error }}>*</Text></Text>
<View style={[Styles.wrapPaper, Styles.noShadow, Styles.borderAll, Styles.p10, { backgroundColor: colors.card, borderColor: colors.icon + '20' }]}> <View style={[Styles.wrapPaper, Styles.noShadow, Styles.borderAll, Styles.p10, { backgroundColor: colors.card, borderColor: colors.icon + '20' }]}>

View File

@@ -31,15 +31,14 @@ export default function HeaderRightAnnouncementDetail({ id }: Props) {
const hasil = await decryptToken(String(token?.current)) const hasil = await decryptToken(String(token?.current))
const response = await apiDeleteAnnouncement({ user: hasil }, id) const response = await apiDeleteAnnouncement({ user: hasil }, id)
if (response.success) { if (response.success) {
dispatch(setUpdateAnnouncement(!update))
setVisible(false)
Toast.show({ type: 'small', text1: 'Berhasil menghapus data', })
router.back() router.back()
dispatch(setUpdateAnnouncement(!update))
return Toast.show({ type: 'small', text1: 'Berhasil menghapus data', })
} }
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} finally { } finally {
setVisible(false) setShowDeleteModal(false)
} }
} }

View File

@@ -10,7 +10,7 @@ export default function ButtonNextHeader({ onPress, disable }: Props) {
return ( return (
<> <>
<ButtonHeader <ButtonHeader
item={<Feather name="chevron-right" size={20} color={disable ? "grey" : "white"} />} item={<Feather name="chevron-right" size={25} color={disable ? "grey" : "white"} />}
onPress={() => { onPress={() => {
!disable && onPress && onPress() !disable && onPress && onPress()
}} }}

View File

@@ -0,0 +1,21 @@
import Text from '@/components/Text';
import Styles from '@/constants/Styles';
import { useTheme } from '@/providers/ThemeProvider';
import { ActivityIndicator, View } from 'react-native';
type Props = {
size?: 'small' | 'large'
}
export default function LoadingCenter({ size = 'large' }: Props) {
const { colors } = useTheme();
return (
<View style={[Styles.loadingCenter]}>
<View style={[Styles.loadingBox, Styles.shadowBox, { backgroundColor: colors.modalBackground }]}>
<ActivityIndicator size={size} color={colors.dimmed} />
<Text style={{ color: colors.dimmed }}>Loading</Text>
</View>
</View>
)
}

View File

@@ -157,7 +157,7 @@ export default function ModalSelectMultiple({ open, close, title, category, choo
{ {
data.map((item: any, index: number) => { data.map((item: any, index: number) => {
return ( return (
<Pressable key={index} style={[Styles.itemSelectModal]} onPress={() => { <Pressable key={index} style={[Styles.itemSelectModal, { borderColor: colors.icon + 20 }]} onPress={() => {
handleDivisionClick(index) handleDivisionClick(index)
}}> }}>
<Text numberOfLines={1} style={[Styles.w80]}>{item.name}</Text> <Text numberOfLines={1} style={[Styles.w80]}>{item.name}</Text>
@@ -175,7 +175,7 @@ export default function ModalSelectMultiple({ open, close, title, category, choo
data.map((item: any, index: number) => { data.map((item: any, index: number) => {
return ( return (
<View key={index}> <View key={index}>
<Pressable style={[Styles.itemSelectModal]} onPress={() => { handleGroupCheck(item.id) }}> <Pressable style={[Styles.itemSelectModal, { borderColor: colors.icon + 20 }]} onPress={() => { handleGroupCheck(item.id) }}>
<Text style={[Styles.textMediumSemiBold]}>{item.name}</Text> <Text style={[Styles.textMediumSemiBold]}>{item.name}</Text>
{ {
checked[item.id] && checked[item.id]?.length === item.Division?.length checked[item.id] && checked[item.id]?.length === item.Division?.length
@@ -188,7 +188,7 @@ export default function ModalSelectMultiple({ open, close, title, category, choo
{ {
item.Division.map((child: any, v: number) => { item.Division.map((child: any, v: number) => {
return ( return (
<Pressable key={v} style={[Styles.itemSelectModal]} onPress={() => { handleCheck(item.id, child.id) }}> <Pressable key={v} style={[Styles.itemSelectModal, { borderColor: colors.icon + 20 }]} onPress={() => { handleCheck(item.id, child.id) }}>
<Text style={[Styles.ml10, Styles.textMediumNormal, Styles.w80]} numberOfLines={1} ellipsizeMode="tail" >{child.name}</Text> <Text style={[Styles.ml10, Styles.textMediumNormal, Styles.w80]} numberOfLines={1} ellipsizeMode="tail" >{child.name}</Text>
{ {
checked[item.id] && checked[item.id].includes(child.id) && <AntDesign name="check" size={20} color={colors.text} /> checked[item.id] && checked[item.id].includes(child.id) && <AntDesign name="check" size={20} color={colors.text} />

View File

@@ -77,7 +77,7 @@ export default function ModalListDetailTugasProject({ isVisible, setVisible, idT
getItem={getItem} getItem={getItem}
renderItem={({ item, index }: { item: Props, index: number }) => { renderItem={({ item, index }: { item: Props, index: number }) => {
return ( return (
<View key={index} style={[Styles.borderBottom, Styles.pv05, { borderBottomColor: colors.icon }]}> <View key={index} style={[Styles.borderBottom, Styles.pv05, { borderBottomColor: colors.icon + "20" }]}>
<Text style={[Styles.textDefaultSemiBold]}>{item.date}</Text> <Text style={[Styles.textDefaultSemiBold]}>{item.date}</Text>
<View style={[Styles.rowSpaceBetween]}> <View style={[Styles.rowSpaceBetween]}>
<View style={[{ width: "48%" }]}> <View style={[{ width: "48%" }]}>

View File

@@ -157,7 +157,6 @@ export default function SectionFile({ status, member, refreshing }: { status: nu
title={item.name + '.' + item.extension} title={item.name + '.' + item.extension}
titleWeight="normal" titleWeight="normal"
onPress={() => { setSelectFile(item); setModal(true) }} onPress={() => { setSelectFile(item); setModal(true) }}
width={65}
/> />
) )
}) })

View File

@@ -96,7 +96,6 @@ export default function SectionLink({ status, member, refreshing }: { status: nu
title={item.link} title={item.link}
titleWeight="normal" titleWeight="normal"
onPress={() => { setSelectLink(item); setModal(true) }} onPress={() => { setSelectLink(item); setModal(true) }}
width={65}
/> />
) )
}) })

View File

@@ -151,7 +151,6 @@ export default function SectionFileTask({ refreshing, isMemberDivision }: { refr
title={item.name + '.' + item.extension} title={item.name + '.' + item.extension}
titleWeight="normal" titleWeight="normal"
onPress={() => { setSelectFile(item); setModal(true) }} onPress={() => { setSelectFile(item); setModal(true) }}
width={65}
/> />
) )
}) })

View File

@@ -88,7 +88,6 @@ export default function SectionLinkTask({ refreshing, isMemberDivision }: { refr
title={item.link} title={item.link}
titleWeight="normal" titleWeight="normal"
onPress={() => { setSelectLink(item); setModal(true) }} onPress={() => { setSelectLink(item); setModal(true) }}
width={65}
/> />
) )
}) })

View File

@@ -465,6 +465,13 @@ const Styles = StyleSheet.create({
shadowRadius: 0, shadowRadius: 0,
elevation: 0, elevation: 0,
}, },
shadowBox: {
shadowColor: '#171717',
shadowOffset: { width: 0, height: 0 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 5,
},
contentItemCenter: { contentItemCenter: {
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center' alignItems: 'center'
@@ -860,6 +867,24 @@ const Styles = StyleSheet.create({
}, },
alignStart: { alignStart: {
alignItems: 'flex-start' alignItems: 'flex-start'
},
loadingCenter: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
justifyContent: 'center',
alignItems: 'center',
zIndex: 999,
backgroundColor: 'rgba(0,0,0,0.3)',
},
loadingBox: {
paddingVertical: 15,
paddingHorizontal: 40,
borderRadius: 5,
alignItems: 'center',
gap: 10,
} }
}) })