feat: update admin features, user confirmation, and native configs

- Admin: Update layout, notification bell, and event detail screen
- User: Improve event confirmation flow
- Config: Update AndroidManifest, Info.plist, entitlements, and app.config.js

### No Issue
This commit is contained in:
2026-03-11 11:29:20 +08:00
parent ad32eb6fe6
commit 4efdbd3c7b
9 changed files with 132 additions and 26 deletions

View File

@@ -37,7 +37,7 @@
</intent-filter> </intent-filter>
<intent-filter android:autoVerify="true" data-generated="true"> <intent-filter android:autoVerify="true" data-generated="true">
<action android:name="android.intent.action.VIEW"/> <action android:name="android.intent.action.VIEW"/>
<data android:scheme="https" android:host="cld-dkr-staging-hipmi.wibudev.com" android:pathPrefix="/"/> <data android:scheme="https" android:host="cld-dkr-hipmi-stg.wibudev.com" android:pathPrefix="/"/>
<category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.DEFAULT"/>
</intent-filter> </intent-filter>

View File

@@ -34,7 +34,7 @@ export default {
associatedDomains: [ associatedDomains: [
"applinks:cld-dkr-hipmi-stg.wibudev.com", "applinks:cld-dkr-hipmi-stg.wibudev.com",
], ],
buildNumber: "3", buildNumber: "4",
}, },
android: { android: {

View File

@@ -9,7 +9,7 @@ import {
TextCustom, TextCustom,
ViewWrapper, ViewWrapper,
} from "@/components"; } from "@/components";
import { AccentColor, MainColor } from "@/constants/color-palet"; import { MainColor } from "@/constants/color-palet";
import { useAuth } from "@/hooks/use-auth"; import { useAuth } from "@/hooks/use-auth";
import { import {
apiEventConfirmationAction, apiEventConfirmationAction,
@@ -60,7 +60,7 @@ export default function UserEventConfirmation() {
useFocusEffect( useFocusEffect(
useCallback(() => { useCallback(() => {
checkTokenAndDataParticipants() || console.log("Token is null"); checkTokenAndDataParticipants() || console.log("Token is null");
}, [token, id, user?.id]) }, [token, id, user?.id]),
); );
const checkTokenAndDataParticipants = async () => { const checkTokenAndDataParticipants = async () => {
@@ -113,7 +113,7 @@ export default function UserEventConfirmation() {
confirmationStart, confirmationStart,
confirmationEnd, confirmationEnd,
null, null,
"[]" "[]",
); );
// --- [4] Status waktu event (untuk pesan UI) --- // --- [4] Status waktu event (untuk pesan UI) ---
@@ -218,9 +218,14 @@ export default function UserEventConfirmation() {
if (isWithinConfirmationWindow) { if (isWithinConfirmationWindow) {
if (konfirmasi === false) { if (konfirmasi === false) {
return ( return (
<TamplateBox data={data}> // <TamplateBox data={data}>
<TamplateText text="Konfirmasi Kehadiran" /> // <TamplateText text="Konfirmasi Kehadiran" />
</TamplateBox> // </TamplateBox>
<UserParticipan_And_DuringEvent
id={data.id}
userId={user?.id as string}
data={data}
/>
); );
} }
return ( return (
@@ -261,17 +266,15 @@ export default function UserEventConfirmation() {
<Stack.Screen <Stack.Screen
options={{ options={{
title: "Konfirmasi Event", title: "Konfirmasi Event",
// headerLeft: () => ( headerLeft: () => (
// <Ionicons <Ionicons
// name="arrow-back" name="arrow-back"
// size={20} size={20}
// color={MainColor.yellow} color={MainColor.yellow}
// onPress={() => onPress={() => router.navigate("/")}
// router.navigate("/(application)/(user)/event/create") />
// } ),
// /> }}
// ),
}}
/> />
<ViewWrapper>{handlerReturn()}</ViewWrapper> <ViewWrapper>{handlerReturn()}</ViewWrapper>
</> </>
@@ -497,7 +500,6 @@ const UserNotParticipan_And_DuringEvent = ({
); );
}; };
// 🟡 ZONA ACARA BERLANGSUN // 🟡 ZONA ACARA BERLANGSUN
// User sudah terdaftar & Event sedang berlangsung & user harus konfirmasi // User sudah terdaftar & Event sedang berlangsung & user harus konfirmasi
const UserParticipan_And_DuringEvent = ({ const UserParticipan_And_DuringEvent = ({

View File

@@ -17,6 +17,7 @@ import {
ICON_SIZE_XLARGE, ICON_SIZE_XLARGE,
} from "@/constants/constans-value"; } from "@/constants/constans-value";
import { useAuth } from "@/hooks/use-auth"; import { useAuth } from "@/hooks/use-auth";
import { useNotificationStore } from "@/hooks/use-notification-store";
import AdminNotificationBell from "@/screens/Admin/AdminNotificationBell"; import AdminNotificationBell from "@/screens/Admin/AdminNotificationBell";
import { import {
adminListMenu, adminListMenu,

View File

@@ -184,6 +184,11 @@
14B3DE54EE4049AEB1EADA6B /* Remove signature files (Xcode workaround) */, 14B3DE54EE4049AEB1EADA6B /* Remove signature files (Xcode workaround) */,
B4CF5E09DBB44A4FB9CB91B9 /* Remove signature files (Xcode workaround) */, B4CF5E09DBB44A4FB9CB91B9 /* Remove signature files (Xcode workaround) */,
C894BD25C8224984AAD73398 /* Remove signature files (Xcode workaround) */, C894BD25C8224984AAD73398 /* Remove signature files (Xcode workaround) */,
F0C608193824414E93E23BC7 /* Remove signature files (Xcode workaround) */,
A3E2EDBCFB514A6487E28BEC /* Remove signature files (Xcode workaround) */,
0D62979D96BF4B99AB9FBE7C /* Remove signature files (Xcode workaround) */,
49B80EF12BE8476C86534CEA /* Remove signature files (Xcode workaround) */,
6218417B3C954EFF9B5F4853 /* Remove signature files (Xcode workaround) */,
); );
buildRules = ( buildRules = (
); );
@@ -1013,6 +1018,91 @@
rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";
"; ";
}; };
F0C608193824414E93E23BC7 /* Remove signature files (Xcode workaround) */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
name = "Remove signature files (Xcode workaround)";
inputPaths = (
);
outputPaths = (
);
shellPath = /bin/sh;
shellScript = "
echo \"Remove signature files (Xcode workaround)\";
rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";
";
};
A3E2EDBCFB514A6487E28BEC /* Remove signature files (Xcode workaround) */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
name = "Remove signature files (Xcode workaround)";
inputPaths = (
);
outputPaths = (
);
shellPath = /bin/sh;
shellScript = "
echo \"Remove signature files (Xcode workaround)\";
rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";
";
};
0D62979D96BF4B99AB9FBE7C /* Remove signature files (Xcode workaround) */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
name = "Remove signature files (Xcode workaround)";
inputPaths = (
);
outputPaths = (
);
shellPath = /bin/sh;
shellScript = "
echo \"Remove signature files (Xcode workaround)\";
rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";
";
};
49B80EF12BE8476C86534CEA /* Remove signature files (Xcode workaround) */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
name = "Remove signature files (Xcode workaround)";
inputPaths = (
);
outputPaths = (
);
shellPath = /bin/sh;
shellScript = "
echo \"Remove signature files (Xcode workaround)\";
rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";
";
};
6218417B3C954EFF9B5F4853 /* Remove signature files (Xcode workaround) */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
name = "Remove signature files (Xcode workaround)";
inputPaths = (
);
outputPaths = (
);
shellPath = /bin/sh;
shellScript = "
echo \"Remove signature files (Xcode workaround)\";
rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";
";
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */

View File

@@ -6,7 +6,7 @@
<string>development</string> <string>development</string>
<key>com.apple.developer.associated-domains</key> <key>com.apple.developer.associated-domains</key>
<array> <array>
<string>applinks:cld-dkr-staging-hipmi.wibudev.com</string> <string>applinks:cld-dkr-hipmi-stg.wibudev.com</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View File

@@ -39,7 +39,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>3</string> <string>4</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>

View File

@@ -4,10 +4,16 @@ import { ICON_SIZE_SMALL } from "@/constants/constans-value";
import { useNotificationStore } from "@/hooks/use-notification-store"; import { useNotificationStore } from "@/hooks/use-notification-store";
import { Ionicons } from "@expo/vector-icons"; import { Ionicons } from "@expo/vector-icons";
import { router } from "expo-router"; import { router } from "expo-router";
import { useEffect } from "react";
import { Text, View } from "react-native"; import { Text, View } from "react-native";
export default function AdminNotificationBell() { export default function AdminNotificationBell() {
const { unreadCount } = useNotificationStore(); const { unreadCount, syncUnreadCount } = useNotificationStore();
useEffect(() => {
console.log("Syncing unread count");
syncUnreadCount();
}, [syncUnreadCount]);
return ( return (
<View style={{ position: "relative" }}> <View style={{ position: "relative" }}>

View File

@@ -1,5 +1,5 @@
/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable react-hooks/exhaustive-deps */
import { ActionIcon, AlertDefaultSystem } from "@/components"; import { ActionIcon, AlertDefaultSystem, Spacing } from "@/components";
import { IconDot } from "@/components/_Icon/IconComponent"; import { IconDot } from "@/components/_Icon/IconComponent";
import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle";
import AdminButtonReject from "@/components/_ShareComponent/Admin/ButtonReject"; import AdminButtonReject from "@/components/_ShareComponent/Admin/ButtonReject";
@@ -16,6 +16,7 @@ import Toast from "react-native-toast-message";
import { BoxEventDetail } from "./BoxEventDetail"; import { BoxEventDetail } from "./BoxEventDetail";
import { EventDetailDrawer } from "./EventDetailDrawer"; import { EventDetailDrawer } from "./EventDetailDrawer";
import { EventDetailQRCode } from "./EventDetailQRCode"; import { EventDetailQRCode } from "./EventDetailQRCode";
import { View } from "react-native";
export function Admin_ScreenEventDetail() { export function Admin_ScreenEventDetail() {
const { user } = useAuth(); const { user } = useAuth();
@@ -24,7 +25,6 @@ export function Admin_ScreenEventDetail() {
const [data, setData] = useState<any | null>(null); const [data, setData] = useState<any | null>(null);
const [loadData, setLoadData] = useState(false); const [loadData, setLoadData] = useState(false);
useFocusEffect( useFocusEffect(
useCallback(() => { useCallback(() => {
onLoadData(); onLoadData();
@@ -135,7 +135,11 @@ export function Admin_ScreenEventDetail() {
<> <>
<NewWrapper <NewWrapper
headerComponent={headerComponent} headerComponent={headerComponent}
footerComponent={footerComponent} // footerComponent={
// <View style={{ paddingInline: 8 }}>
// {footerComponent}
// </View>
// }
> >
<BoxEventDetail data={data} status={status as string} /> <BoxEventDetail data={data} status={status as string} />
@@ -146,6 +150,9 @@ export function Admin_ScreenEventDetail() {
{(status === "publish" || status === "history") && ( {(status === "publish" || status === "history") && (
<EventDetailQRCode userId={user?.id || ""} isLoading={loadData} /> <EventDetailQRCode userId={user?.id || ""} isLoading={loadData} />
)} )}
{footerComponent}
<Spacing />
</NewWrapper> </NewWrapper>
<EventDetailDrawer <EventDetailDrawer