upd: loading overlay

Deskripsi:
- update loading saat aksi tambah dan edit pada fitur pengumuman, diskusi umum dan diskusi divisi

No Issues
This commit is contained in:
2026-01-19 16:36:37 +08:00
parent e61fb83bfd
commit 588df062f1
7 changed files with 64 additions and 2 deletions

View File

@@ -4,6 +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 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";
@@ -153,6 +154,7 @@ export default function CreateAnnouncement() {
), ),
}} }}
/> />
<LoadingOverlay visible={loading} />
<ScrollView <ScrollView
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
style={[Styles.h100]} style={[Styles.h100]}

View File

@@ -4,6 +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 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';
@@ -204,6 +205,7 @@ export default function EditAnnouncement() {
), ),
}} }}
/> />
<LoadingOverlay visible={loading} />
<ScrollView <ScrollView
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
style={[Styles.h100]} style={[Styles.h100]}

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 LoadingOverlay from "@/components/loadingOverlay";
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";
@@ -185,6 +186,7 @@ export default function CreateDiscussionGeneral() {
), ),
}} }}
/> />
<LoadingOverlay visible={loading} />
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}> <ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>
<View style={[Styles.p15, Styles.mb100]}> <View style={[Styles.p15, Styles.mb100]}>
{ {

View File

@@ -5,6 +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 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";
@@ -182,6 +183,7 @@ export default function EditDiscussionGeneral() {
), ),
}} }}
/> />
<LoadingOverlay visible={loading} />
<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,6 +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 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";
@@ -149,7 +150,8 @@ export default function DiscussionDivisionEdit() {
), ),
}} }}
/> />
<ScrollView> <LoadingOverlay visible={loading} />
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>
<View style={[Styles.p15]}> <View style={[Styles.p15]}>
<InputForm <InputForm
label="Diskusi" label="Diskusi"

View File

@@ -4,6 +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 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"
@@ -101,7 +102,8 @@ export default function CreateDiscussionDivision() {
}} /> }} />
}} }}
/> />
<ScrollView> <LoadingOverlay visible={loading} />
<ScrollView showsVerticalScrollIndicator={false} style={[Styles.h100]}>
<View style={[Styles.p15, Styles.mb100]}> <View style={[Styles.p15, Styles.mb100]}>
<InputForm <InputForm
label="Diskusi" label="Diskusi"

View File

@@ -0,0 +1,50 @@
import React from "react";
import { View, ActivityIndicator, StyleSheet, Text } from "react-native";
type Props = {
visible: boolean;
text?: string;
};
export default function LoadingOverlay({
visible,
text = "Loading...",
}: Props) {
if (!visible) return null;
return (
<View style={styles.overlay}>
<View style={styles.box}>
<ActivityIndicator size="small" color="#2c3e50" />
<Text style={styles.text}>{text}</Text>
</View>
</View>
);
}
const styles = StyleSheet.create({
overlay: {
...StyleSheet.absoluteFillObject,
backgroundColor: "rgba(0,0,0,0.35)",
justifyContent: "center",
alignItems: "center",
zIndex: 9999,
},
box: {
paddingVertical: 5,
paddingHorizontal: 15,
backgroundColor: "#fff",
borderRadius: 8,
alignItems: "center",
elevation: 6, // Android
shadowColor: "#000", // iOS
shadowOpacity: 0.25,
shadowRadius: 5,
shadowOffset: { width: 0, height: 4 },
},
text: {
marginTop: 5,
fontSize: 14,
color: "#2c3e50",
},
});