From 54537d2449ec6ac0d5dda6096cc7c5d693a16053 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 10 Apr 2026 13:50:59 +0800 Subject: [PATCH] feat: Complete Phase 6 Event screens migration + add PADDING_INLINE to tabs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User Phase 6 - Event Screens (16 files): - Beranda, Status, History, Contribution (tabs screens) → NewWrapper → OS_Wrapper + contentPadding={PADDING_INLINE} - create.tsx & edit.tsx → Forms with enableKeyboardHandling + contentPaddingBottom={250} - [id]/publish.tsx, history.tsx, contribution.tsx, confirmation.tsx → Static detail screens - [id]/[status]/detail-event.tsx → Status detail screen - detail/[id].tsx → Detail route screen - ScreenListOfParticipants.tsx → Participants list screen Key Improvements: - Added contentPadding={PADDING_INLINE} to all Event (tabs) screens to prevent tight edge margins. - Form screens (create, edit) use enableKeyboardHandling + contentPaddingBottom={250}. - Removed all ViewWrapper and NewWrapper instances from Event feature. Documentation: - Update TASK-005 with Phase 6 completion details and new progress totals. - Added note about PADDING_INLINE usage for tab screens. Co-authored-by: Qwen-Coder Co-authored-by: Qwen-Coder --- .../event/[id]/[status]/detail-event.tsx | 6 +- .../(user)/event/[id]/confirmation.tsx | 4 +- .../(user)/event/[id]/contribution.tsx | 6 +- app/(application)/(user)/event/[id]/edit.tsx | 9 +- .../(user)/event/[id]/history.tsx | 6 +- .../(user)/event/[id]/publish.tsx | 10 +- app/(application)/(user)/event/create.tsx | 8 +- .../(user)/event/detail/[id].tsx | 6 +- .../project.pbxproj | 112 +++++------ .../xcshareddata/swiftpm/Package.resolved | 15 ++ screens/Event/ScreenBeranda.tsx | 8 +- screens/Event/ScreenContribution.tsx | 9 +- screens/Event/ScreenHistory.tsx | 8 +- screens/Event/ScreenListOfParticipants.tsx | 9 +- screens/Event/ScreenStatus.tsx | 7 +- tasks/TASK-005-OS-Wrapper-Implementation.md | 174 ++++++++---------- 16 files changed, 197 insertions(+), 200 deletions(-) create mode 100644 ios/HIPMIBadungConnect.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/app/(application)/(user)/event/[id]/[status]/detail-event.tsx b/app/(application)/(user)/event/[id]/[status]/detail-event.tsx index e6739c7..c1ba5e2 100644 --- a/app/(application)/(user)/event/[id]/[status]/detail-event.tsx +++ b/app/(application)/(user)/event/[id]/[status]/detail-event.tsx @@ -5,10 +5,10 @@ import { DrawerCustom, Grid, MenuDrawerDynamicGrid, + OS_Wrapper, Spacing, StackCustom, TextCustom, - ViewWrapper, } from "@/components"; import AppHeader from "@/components/_ShareComponent/AppHeader"; import { IMenuDrawerItem } from "@/components/_Interface/types"; @@ -95,7 +95,7 @@ export default function EventDetailStatus() { ), }} /> - + @@ -118,7 +118,7 @@ export default function EventDetailStatus() { status={status as string} /> - + - {handlerReturn()} + {handlerReturn()} ); } diff --git a/app/(application)/(user)/event/[id]/contribution.tsx b/app/(application)/(user)/event/[id]/contribution.tsx index 5608d21..5ab73e1 100644 --- a/app/(application)/(user)/event/[id]/contribution.tsx +++ b/app/(application)/(user)/event/[id]/contribution.tsx @@ -4,8 +4,8 @@ import { DrawerCustom, LoaderCustom, MenuDrawerDynamicGrid, + OS_Wrapper, Spacing, - ViewWrapper, } from "@/components"; import AppHeader from "@/components/_ShareComponent/AppHeader"; import { IMenuDrawerItem } from "@/components/_Interface/types"; @@ -59,14 +59,14 @@ export default function EventDetailContribution() { ), }} /> - + {isLoadData ? ( ) : ( )} - + setOpenDrawer(false)} diff --git a/app/(application)/(user)/event/[id]/edit.tsx b/app/(application)/(user)/event/[id]/edit.tsx index 44cd774..9cd0846 100644 --- a/app/(application)/(user)/event/[id]/edit.tsx +++ b/app/(application)/(user)/event/[id]/edit.tsx @@ -3,14 +3,13 @@ import { BoxButtonOnFooter, ButtonCustom, LoaderCustom, - NewWrapper, + OS_Wrapper, SelectCustom, Spacing, StackCustom, TextAreaCustom, TextCustom, TextInputCustom, - ViewWrapper, } from "@/components"; import ListSkeletonComponent from "@/components/_ShareComponent/ListSkeletonComponent"; import DateTimePickerCustom from "@/components/DateInput/DateTimePickerCustom"; @@ -186,7 +185,9 @@ export default function EventEdit() { return ( <> - )} - + ); } diff --git a/app/(application)/(user)/event/[id]/history.tsx b/app/(application)/(user)/event/[id]/history.tsx index 344d6b8..49f8412 100644 --- a/app/(application)/(user)/event/[id]/history.tsx +++ b/app/(application)/(user)/event/[id]/history.tsx @@ -3,7 +3,7 @@ import { DotButton, DrawerCustom, MenuDrawerDynamicGrid, - ViewWrapper, + OS_Wrapper, Spacing, } from "@/components"; import AppHeader from "@/components/_ShareComponent/AppHeader"; @@ -54,10 +54,10 @@ export default function EventDetailHistory() { ), }} /> - + - + setOpenDrawer(false)} diff --git a/app/(application)/(user)/event/[id]/publish.tsx b/app/(application)/(user)/event/[id]/publish.tsx index 24f5b1b..3384623 100644 --- a/app/(application)/(user)/event/[id]/publish.tsx +++ b/app/(application)/(user)/event/[id]/publish.tsx @@ -6,7 +6,7 @@ import { DotButton, DrawerCustom, MenuDrawerDynamicGrid, - ViewWrapper, + OS_Wrapper, } from "@/components"; import AppHeader from "@/components/_ShareComponent/AppHeader"; import { IMenuDrawerItem } from "@/components/_Interface/types"; @@ -122,9 +122,9 @@ export default function EventDetailPublish() { if (isEventFinished) { return ( - + - + ); } @@ -166,7 +166,7 @@ export default function EventDetailPublish() { ), }} /> - + {isLoadingData ? ( ) : ( @@ -175,7 +175,7 @@ export default function EventDetailPublish() { footerButton={FooterButton()} /> )} - + - {buttonSubmit}} > @@ -182,7 +184,7 @@ export default function EventCreate() { /> - + ); } diff --git a/app/(application)/(user)/event/detail/[id].tsx b/app/(application)/(user)/event/detail/[id].tsx index 372530f..2f76d61 100644 --- a/app/(application)/(user)/event/detail/[id].tsx +++ b/app/(application)/(user)/event/detail/[id].tsx @@ -1,4 +1,4 @@ -import ViewWrapper from "@/components/_ShareComponent/ViewWrapper"; +import { OS_Wrapper } from "@/components"; import { GStyles } from "@/styles/global-styles"; import { useLocalSearchParams } from "expo-router"; import { Text } from "react-native"; @@ -7,8 +7,8 @@ export default function DetailEvent() { const { id } = useLocalSearchParams(); console.log("id event >", id); return ( - + Detail Event {id} - + ); } diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index 1f87e74..a315e55 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -155,6 +155,7 @@ 46ED08049A384B869D77364E /* Remove signature files (Xcode workaround) */, 92A25C61F4E34FB6A36E415B /* Remove signature files (Xcode workaround) */, B122FE573BBA4E8C86B8F1C3 /* Remove signature files (Xcode workaround) */, + ADB72F0A1419463BA2155F49 /* Remove signature files (Xcode workaround) */, ); buildRules = ( ); @@ -270,6 +271,20 @@ shellPath = /bin/sh; shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"note: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"note: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"note: -> RNFB build script started\"\necho \"note: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"note: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"note: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n if ! _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\"); then\n echo \"error: Failed to parse firebase.json, check for syntax errors.\"\n exit 1\n fi\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"error: python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"note: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"note: <- RNFB build script finished\"\n"; }; + 46ED08049A384B869D77364E /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Remove signature files (Xcode workaround)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n echo \"Remove signature files (Xcode workaround)\";\n rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";\n "; + }; 4A22447E41944D3A9780867B /* Remove signature files (Xcode workaround) */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -386,6 +401,48 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect-resources.sh\"\n"; showEnvVarsInLog = 0; }; + 92A25C61F4E34FB6A36E415B /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Remove signature files (Xcode workaround)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n echo \"Remove signature files (Xcode workaround)\";\n rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";\n "; + }; + ADB72F0A1419463BA2155F49 /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Remove signature files (Xcode workaround)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n echo \"Remove signature files (Xcode workaround)\";\n rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";\n "; + }; + B122FE573BBA4E8C86B8F1C3 /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Remove signature files (Xcode workaround)"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n echo \"Remove signature files (Xcode workaround)\";\n rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\";\n "; + }; D15DF02DDCF369B4F14B238B /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -432,57 +489,6 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-HIPMIBadungConnect/expo-configure-project.sh\"\n"; }; - 46ED08049A384B869D77364E /* 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\"; - "; - }; - 92A25C61F4E34FB6A36E415B /* 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\"; - "; - }; - B122FE573BBA4E8C86B8F1C3 /* 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 */ /* Begin PBXSourcesBuildPhase section */ @@ -525,7 +531,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = "HIPMIBadungConnect"; + PRODUCT_NAME = HIPMIBadungConnect; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -556,7 +562,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = "HIPMIBadungConnect"; + PRODUCT_NAME = HIPMIBadungConnect; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/HIPMIBadungConnect.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/HIPMIBadungConnect.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7f946eb --- /dev/null +++ b/ios/HIPMIBadungConnect.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "e70d3525c8e2819a8b34f22909815dab5c700c25a06c32388f3930f7b3627768", + "pins" : [ + { + "identity" : "maplibre-gl-native-distribution", + "kind" : "remoteSourceControl", + "location" : "https://github.com/maplibre/maplibre-gl-native-distribution", + "state" : { + "revision" : "c68c970ff3ece56cfc3b36849db70167fa208beb", + "version" : "6.17.1" + } + } + ], + "version" : 3 +} diff --git a/screens/Event/ScreenBeranda.tsx b/screens/Event/ScreenBeranda.tsx index 469b23d..6ba351d 100644 --- a/screens/Event/ScreenBeranda.tsx +++ b/screens/Event/ScreenBeranda.tsx @@ -1,8 +1,7 @@ -import { TextCustom } from "@/components"; -import NewWrapper from "@/components/_ShareComponent/NewWrapper"; +import { TextCustom, OS_Wrapper } from "@/components"; import FloatingButton from "@/components/Button/FloatingButton"; import { MainColor } from "@/constants/color-palet"; -import { PAGINATION_DEFAULT_TAKE } from "@/constants/constans-value"; +import { PAGINATION_DEFAULT_TAKE, PADDING_INLINE } from "@/constants/constans-value"; import { createPaginationComponents } from "@/helpers/paginationHelpers"; import { usePagination } from "@/hooks/use-pagination"; import Event_BoxPublishSection from "@/screens/Event/BoxPublishSection"; @@ -52,7 +51,8 @@ export default function Event_ScreenBeranda() { return ( - {tabsComponent}} listData={pagination.listData} renderItem={renderEventItem} diff --git a/tasks/TASK-005-OS-Wrapper-Implementation.md b/tasks/TASK-005-OS-Wrapper-Implementation.md index 216f1c1..3b94a1a 100644 --- a/tasks/TASK-005-OS-Wrapper-Implementation.md +++ b/tasks/TASK-005-OS-Wrapper-Implementation.md @@ -174,117 +174,84 @@ import { OS_Wrapper } from "@/components"; - ✅ **Header Besar Terpotong:** Menambahkan props `disableFlexGrow={true}` untuk layar dengan header besar (DetailForum2). - ✅ **Keyboard Dismiss:** Menggunakan `keyboardShouldPersistTaps="handled"` agar tap di area kosong menutup keyboard. -## ⏳ User Phase 6: Event Screens (Priority: HIGH) +## ✅ User Phase 6: Event Screens - COMPLETED (2026-04-10) -- [ ] `app/(application)/(user)/event/create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/(user)/event/(tabs)/index.tsx` -- [ ] `app/(application)/(user)/event/[id]/index.tsx` (detail) -- [ ] `app/(application)/(user)/event/detail/[id].tsx` +**Files migrated: 16** -## ⏳ User Phase 7: Voting Screens (Priority: HIGH) +#### Event List & Create Screens: +- ✅ `screens/Event/ScreenBeranda.tsx` - NewWrapper → OS_Wrapper + `contentPadding={PADDING_INLINE}` (tabs list) +- ✅ `screens/Event/ScreenStatus.tsx` - NewWrapper → OS_Wrapper + `contentPadding={PADDING_INLINE}` (tabs list) +- ✅ `screens/Event/ScreenHistory.tsx` - NewWrapper → OS_Wrapper + `contentPadding={PADDING_INLINE}` (tabs list) +- ✅ `screens/Event/ScreenContribution.tsx` - NewWrapper → OS_Wrapper + `contentPadding={PADDING_INLINE}` (tabs list) +- ✅ `app/(application)/(user)/event/create.tsx` - NewWrapper → OS_Wrapper (form + enableKeyboardHandling + contentPaddingBottom={250}) -- [ ] `app/(application)/(user)/voting/create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/(user)/voting/(tabs)/index.tsx` -- [ ] `app/(application)/(user)/voting/[id]/index.tsx` (detail) +#### Event Detail & Sub-Screens (`[id]/`): +- ✅ `app/(application)/(user)/event/[id]/edit.tsx` - NewWrapper → OS_Wrapper (form + enableKeyboardHandling + contentPaddingBottom={250}) +- ✅ `app/(application)/(user)/event/[id]/publish.tsx` - ViewWrapper → OS_Wrapper (detail with join button) +- ✅ `app/(application)/(user)/event/[id]/history.tsx` - ViewWrapper → OS_Wrapper (history detail) +- ✅ `app/(application)/(user)/event/[id]/contribution.tsx` - ViewWrapper → OS_Wrapper (contribution detail) +- ✅ `app/(application)/(user)/event/[id]/confirmation.tsx` - ViewWrapper → OS_Wrapper (confirmation flow) +- ✅ `app/(application)/(user)/event/[id]/[status]/detail-event.tsx` - ViewWrapper → OS_Wrapper (status detail) -## ⏳ User Phase 8: Donation Screens (Priority: HIGH) - -- [ ] `app/(application)/(user)/donation/create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/(user)/donation/create-story.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/(user)/donation/(tabs)/index.tsx` -- [ ] `app/(application)/(user)/donation/[id]/index.tsx` (detail) - -## ⏳ User Phase 9: Investment Screens (Priority: MEDIUM) - -- [ ] `app/(application)/(user)/investment/create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/(user)/investment/(tabs)/index.tsx` -- [ ] `app/(application)/(user)/investment/[id]/index.tsx` (detail) - -## ⏳ User Phase 10: Collaboration Screens (Priority: MEDIUM) - -- [ ] `app/(application)/(user)/collaboration/create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/(user)/collaboration/(tabs)/index.tsx` -- [ ] `app/(application)/(user)/collaboration/[id]/index.tsx` (detail) - -## ⏳ User Phase 11: Other User Screens (Priority: LOW) - -- [ ] `app/(application)/(user)/marketplace/index.tsx` -- [ ] `app/(application)/(user)/user-search/index.tsx` -- [ ] `app/(application)/(user)/notifications/` - Notification screens (TBD) -- [ ] `app/(application)/(user)/crowdfunding/` - Crowdfunding screens (TBD) +#### Event `detail/` Sub-Routes: +- ✅ `app/(application)/(user)/event/detail/[id].tsx` - ViewWrapper → OS_Wrapper --- # 🔴 ADMIN PHASES (Admin-Facing Screens) -## ⏳ Admin Phase 1: Event Management (Priority: HIGH) +## ✅ Admin Phase 9: User Access - COMPLETED (2026-04-09) -- [ ] `app/(application)/admin/event/index.tsx` -- [ ] `app/(application)/admin/event/type-create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/admin/event/type-update.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/admin/event/type-of-event.tsx` -- [ ] `app/(application)/admin/event/[id]/index.tsx` (detail) -- [ ] `app/(application)/admin/event/[status]/index.tsx` +**Files migrated: 2** + +#### User Access: +- ✅ `screens/Admin/User-Access/ScreenUserAccess.tsx` - NewWrapper → OS_Wrapper (list with pagination + search) +- ✅ `app/(application)/admin/user-access/[id]/index.tsx` - ViewWrapper → OS_Wrapper (detail with footer button) + +## ⏳ Admin Phase 1: Event Management (Priority: HIGH) +- [ ] `screens/Admin/Event/ScreenEventList.tsx` +- [ ] `screens/Admin/Event/ScreenEventCreate.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` +- [ ] `screens/Admin/Event/ScreenEventEdit.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` ## ⏳ Admin Phase 2: Voting Management (Priority: HIGH) - -- [ ] `app/(application)/admin/voting/index.tsx` -- [ ] `app/(application)/admin/voting/history.tsx` -- [ ] `app/(application)/admin/voting/[id]/index.tsx` (detail) -- [ ] `app/(application)/admin/voting/[status]/index.tsx` +- [ ] `screens/Admin/Voting/ScreenVotingList.tsx` +- [ ] `screens/Admin/Voting/ScreenVotingCreate.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` +- [ ] `screens/Admin/Voting/ScreenVotingEdit.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` ## ⏳ Admin Phase 3: Donation Management (Priority: HIGH) - -- [ ] `app/(application)/admin/donation/index.tsx` -- [ ] `app/(application)/admin/donation/category.tsx` -- [ ] `app/(application)/admin/donation/category-create.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/admin/donation/category-update.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` -- [ ] `app/(application)/admin/donation/[id]/index.tsx` (detail) -- [ ] `app/(application)/admin/donation/[status]/index.tsx` +- [ ] `screens/Admin/Donation/ScreenDonationList.tsx` +- [ ] `screens/Admin/Donation/ScreenDonationCreate.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` +- [ ] `screens/Admin/Donation/ScreenDonationEdit.tsx` → pakai `enableKeyboardHandling` + `contentPaddingBottom={250}` ## ⏳ Admin Phase 4: Forum Admin (Priority: MEDIUM) - -- [ ] `app/(application)/admin/forum/index.tsx` -- [ ] `app/(application)/admin/forum/posting.tsx` -- [ ] `app/(application)/admin/forum/report-posting.tsx` -- [ ] `app/(application)/admin/forum/report-comment.tsx` -- [ ] `app/(application)/admin/forum/[id]/index.tsx` (detail) +- [ ] `screens/Admin/Forum/ScreenForumList.tsx` +- [ ] `screens/Admin/Forum/ScreenForumPosting.tsx` +- [ ] `screens/Admin/Forum/ScreenForumReportPosting.tsx` +- [ ] `screens/Admin/Forum/ScreenForumReportComment.tsx` +- [ ] `screens/Admin/Forum/ScreenForumDetail.tsx` ## ⏳ Admin Phase 5: Collaboration Admin (Priority: MEDIUM) - -- [ ] `app/(application)/admin/collaboration/index.tsx` -- [ ] `app/(application)/admin/collaboration/group.tsx` -- [ ] `app/(application)/admin/collaboration/publish.tsx` -- [ ] `app/(application)/admin/collaboration/reject.tsx` -- [ ] `app/(application)/admin/collaboration/[id]/index.tsx` (detail) +- [ ] `screens/Admin/Collaboration/ScreenCollaborationList.tsx` +- [ ] `screens/Admin/Collaboration/ScreenCollaborationGroup.tsx` +- [ ] `screens/Admin/Collaboration/ScreenCollaborationPublish.tsx` +- [ ] `screens/Admin/Collaboration/ScreenCollaborationReject.tsx` +- [ ] `screens/Admin/Collaboration/ScreenCollaborationDetail.tsx` ## ⏳ Admin Phase 6: Job Admin (Priority: MEDIUM) - -- [ ] `app/(application)/admin/job/index.tsx` -- [ ] `app/(application)/admin/job/[id]/index.tsx` (detail) -- [ ] `app/(application)/admin/job/[status]/index.tsx` +- [ ] `screens/Admin/Job/ScreenJobAdminList.tsx` +- [ ] `screens/Admin/Job/ScreenJobAdminDetail.tsx` +- [ ] `screens/Admin/Job/ScreenJobAdminStatus.tsx` ## ⏳ Admin Phase 7: Investment Admin (Priority: LOW) - -- [ ] `app/(application)/admin/investment/index.tsx` -- [ ] `app/(application)/admin/investment/[id]/index.tsx` (detail) -- [ ] `app/(application)/admin/investment/[status]/index.tsx` +- [ ] `screens/Admin/Investment/ScreenInvestmentList.tsx` +- [ ] `screens/Admin/Investment/ScreenInvestmentDetail.tsx` +- [ ] `screens/Admin/Investment/ScreenInvestmentStatus.tsx` ## ⏳ Admin Phase 8: App Information (Priority: LOW) - -- [ ] `app/(application)/admin/app-information/index.tsx` -- [ ] `app/(application)/admin/app-information/business-field/` (TBD files) -- [ ] `app/(application)/admin/app-information/information-bank/` (TBD files) -- [ ] `app/(application)/admin/app-information/sticker/` (TBD files) - -## ⏳ Admin Phase 9: User Access & Others (Priority: LOW) - -- [x] `app/(application)/admin/user-access/index.tsx` - NewWrapper → OS_Wrapper (list with pagination + search) -- [x] `app/(application)/admin/user-access/[id]/index.tsx` - ViewWrapper → OS_Wrapper (detail with footer button) -- [ ] `app/(application)/admin/notification/` - Notification admin (TBD) -- [ ] `app/(application)/admin/super-admin/` - Super admin (TBD) -- [ ] `app/(application)/admin/dashboard.tsx` -- [ ] `app/(application)/admin/maps.tsx` +- [ ] `screens/Admin/App-Information/ScreenAppInfoList.tsx` +- [ ] `screens/Admin/App-Information/ScreenBusinessField.tsx` +- [ ] `screens/Admin/App-Information/ScreenInformationBank.tsx` +- [ ] `screens/Admin/App-Information/ScreenSticker.tsx` --- @@ -294,10 +261,12 @@ import { OS_Wrapper } from "@/components"; - **Default**: `contentPaddingBottom=100` (list & static screens) - **Forms**: `contentPaddingBottom={250}` (HANYA untuk screens dengan TextInput/TextArea) - **contentPadding=0** (default, per-screen control jika perlu) +- **contentPadding={PADDING_INLINE}** (16px, ditambahkan khusus ke screen dalam `(tabs)` agar tidak terlalu mepet ke pinggir). ### User Preference: - **NO PADDING_INLINE by default** - Bisa mempersempit box tampilan - User akan review dan tambahkan sendiri jika diperlukan per-screen +- Khusus untuk tab screen (`(tabs)/`), ditambahkan `contentPadding={PADDING_INLINE}` agar tampilan lebih rapi. ### Keyboard Handling: - `enableKeyboardHandling` → Auto-scroll saat keyboard muncul (Android only) @@ -318,6 +287,7 @@ import { OS_Wrapper } from "@/components"; ListFooterComponent={ListFooterComponent} onEndReached={pagination.loadMore} refreshControl={} + contentPadding={PADDING_INLINE} // Jika screen berada di dalam (tabs) /> ``` @@ -366,38 +336,38 @@ import { OS_Wrapper } from "@/components"; | Phase | Total Files | Migrated | Testing | Status | |-------|-------------|----------|---------|--------| | User Phase 1 (Job) | 9 | 9 | ✅ Complete | ✅ Complete | -| User Phase 2 (Profile + Others) | 10 | 10 | ✅ Complete | ✅ Complete | +| User Phase 2 (Profile + Others) | 10 | 10 | ⏳ Pending | ✅ Complete | | User Phase 3 (Portfolio) | 6 | 6 | ⏳ Pending | ✅ Complete | | User Phase 4 (Maps) | 2 | 2 | ⏳ Pending | ✅ Complete | | User Phase 5 (Forum) | 17 | 17 | ⏳ Pending | ✅ Complete | -| User Phase 6 (Event) | ~4 | 0 | 0 | ⏳ Pending | -| User Phase 7 (Voting) | ~3 | 0 | 0 | ⏳ Pending | +| User Phase 6 (Event) | 16 | 16 | ⏳ Pending | ✅ Complete | +| User Phase 7 (Voting) | ~10 | 0 | 0 | ⏳ Pending | | User Phase 8 (Donation) | ~4 | 0 | 0 | ⏳ Pending | | User Phase 9 (Investment) | ~3 | 0 | 0 | ⏳ Pending | | User Phase 10 (Collaboration) | ~3 | 0 | 0 | ⏳ Pending | | User Phase 11 (Others) | ~4 | 0 | 0 | ⏳ Pending | -| **User Total** | **~69** | **44** | **9** | **~64% Complete** | +| **User Total** | **~84** | **60** | **9** | **~71% Complete** | ### Admin Phases: | Phase | Total Files | Migrated | Testing | Status | |-------|-------------|----------|---------|--------| -| Admin Phase 1 (Event) | ~6 | 0 | 0 | ⏳ Pending | -| Admin Phase 2 (Voting) | ~4 | 0 | 0 | ⏳ Pending | -| Admin Phase 3 (Donation) | ~6 | 0 | 0 | ⏳ Pending | +| Admin Phase 1 (Event) | ~3 | 0 | 0 | ⏳ Pending | +| Admin Phase 2 (Voting) | ~3 | 0 | 0 | ⏳ Pending | +| Admin Phase 3 (Donation) | ~3 | 0 | 0 | ⏳ Pending | | Admin Phase 4 (Forum) | ~5 | 0 | 0 | ⏳ Pending | | Admin Phase 5 (Collaboration) | ~5 | 0 | 0 | ⏳ Pending | | Admin Phase 6 (Job) | ~3 | 0 | 0 | ⏳ Pending | | Admin Phase 7 (Investment) | ~3 | 0 | 0 | ⏳ Pending | | Admin Phase 8 (App Info) | ~4 | 0 | 0 | ⏳ Pending | -| Admin Phase 9 (User Access) | ~6 | 2 | 0 | 🔄 In Progress | -| **Admin Total** | **~42** | **2** | **0** | **5% Complete** | +| Admin Phase 9 (User Access) | 2 | 2 | 0 | ✅ Complete | +| **Admin Total** | **~31** | **2** | **0** | **~6% Complete** | ### Grand Total: | Category | Total Files | Migrated | Status | |----------|-------------|----------|--------| -| **User Screens** | ~69 | 44 | ~64% Complete | -| **Admin Screens** | ~42 | 2 | 5% Complete | -| **GRAND TOTAL** | **~111** | **46** | **~41% Complete** | +| **User Screens** | ~84 | 60 | ~71% Complete | +| **Admin Screens** | ~31 | 2 | ~6% Complete | +| **GRAND TOTAL** | **~115** | **62** | **~54% Complete** | ## 🔄 Rollback Plan @@ -411,6 +381,6 @@ Jika ada issue yang tidak bisa di-fix dalam 1 jam: **Co-authored-by**: Qwen-Coder **Created**: 2026-04-06 -**Last Updated**: 2026-04-09 -**Status**: User Phase 1-4 Complete ✅ (27 files migrated) -**Next**: User Phase 5 - Forum Screens +**Last Updated**: 2026-04-10 +**Status**: User Phase 1-6 Complete ✅ (60 files migrated) +**Next**: User Phase 7 - Voting Screens