Merge pull request 'amalia/03-sept-25' (#34) from amalia/03-sept-25 into join

Reviewed-on: bip/mobile-darmasaba#34
This commit is contained in:
2025-09-03 17:37:36 +08:00
8 changed files with 75 additions and 20 deletions

View File

@@ -4,7 +4,7 @@ export default {
expo: { expo: {
name: "mobile-darmasaba", name: "mobile-darmasaba",
slug: "mobile-darmasaba", slug: "mobile-darmasaba",
version: "1.0.0", version: "1.0.2",
jsEngine: "jsc", jsEngine: "jsc",
orientation: "portrait", orientation: "portrait",
icon: "./assets/images/icon.png", icon: "./assets/images/icon.png",
@@ -21,12 +21,19 @@ export default {
}, },
android: { android: {
package: "mobiledarmasaba.app", package: "mobiledarmasaba.app",
versionCode: 1, versionCode: 6,
adaptiveIcon: { adaptiveIcon: {
foregroundImage: "./assets/images/splash-icon.png", foregroundImage: "./assets/images/splash-icon.png",
backgroundColor: "#ffffff" backgroundColor: "#ffffff"
}, },
googleServicesFile: "./google-services.json" googleServicesFile: "./google-services.json",
permissions: [
"READ_EXTERNAL_STORAGE",
"WRITE_EXTERNAL_STORAGE",
"READ_MEDIA_IMAGES", // Android 13+
"READ_MEDIA_VIDEO", // Android 13+
"READ_MEDIA_AUDIO" // Android 13+
]
}, },
web: { web: {
bundler: "metro", bundler: "metro",

View File

@@ -148,7 +148,7 @@ export default function RootLayout() {
}} }}
/> />
</Stack> </Stack>
<StatusBar style="light" translucent={false} backgroundColor="black" /> <StatusBar style="inverted" translucent={false} backgroundColor="black" />
<ToastCustom /> <ToastCustom />
</Provider> </Provider>
) )

38
bump-version.js Normal file
View File

@@ -0,0 +1,38 @@
const fs = require("fs");
const path = require("path");
const configPath = path.join(__dirname, "app.config.js");
let configFile = fs.readFileSync(configPath, "utf8");
// --- Update versionCode ---
const codeRegex = /versionCode:\s*(\d+)/;
const codeMatch = configFile.match(codeRegex);
if (!codeMatch) {
console.error("❌ Tidak menemukan versionCode di app.config.js");
process.exit(1);
}
const currentCode = parseInt(codeMatch[1], 10);
const newCode = currentCode + 1;
configFile = configFile.replace(codeRegex, `versionCode: ${newCode}`);
// --- Update versionName ---
const nameRegex = /version:\s*"(.*?)"/;
const nameMatch = configFile.match(nameRegex);
if (!nameMatch) {
console.error("❌ Tidak menemukan version di app.config.js");
process.exit(1);
}
let [major, minor, patch] = nameMatch[1].split(".").map(Number);
patch += 1; // bump patch version
const newName = `${major}.${minor}.${patch}`;
configFile = configFile.replace(nameRegex, `version: "${newName}"`);
// --- Simpan file ---
fs.writeFileSync(configPath, configFile, "utf8");
console.log(`✅ versionCode: ${currentCode}${newCode}`);
console.log(`✅ versionName: ${nameMatch[1]}${newName}`);

View File

@@ -1,8 +1,10 @@
import Styles from "@/constants/Styles" import Styles from "@/constants/Styles"
import { apiCheckPhoneLogin, apiSendOtp } from "@/lib/api" import { apiCheckPhoneLogin, apiSendOtp } from "@/lib/api"
import { useAuthSession } from "@/providers/AuthProvider"
import AsyncStorage from "@react-native-async-storage/async-storage" import AsyncStorage from "@react-native-async-storage/async-storage"
import { StatusBar } from "expo-status-bar"
import { useState } from "react" import { useState } from "react"
import { Image, SafeAreaView, View } from "react-native" import { Image, Platform, SafeAreaView, View } from "react-native"
import Toast from "react-native-toast-message" import Toast from "react-native-toast-message"
import { ButtonForm } from "../buttonForm" import { ButtonForm } from "../buttonForm"
import { InputForm } from "../inputForm" import { InputForm } from "../inputForm"
@@ -10,7 +12,6 @@ import ModalLoading from "../modalLoading"
import Text from "../Text" import Text from "../Text"
import ToastCustom from "../toastCustom" import ToastCustom from "../toastCustom"
type Props = { type Props = {
onValidate: ({ phone, otp }: { phone: string, otp: number }) => void onValidate: ({ phone, otp }: { phone: string, otp: number }) => void
} }
@@ -19,20 +20,27 @@ export default function ViewLogin({ onValidate }: Props) {
const [loadingLogin, setLoadingLogin] = useState(false) const [loadingLogin, setLoadingLogin] = useState(false)
const [disableLogin, setDisableLogin] = useState(true) const [disableLogin, setDisableLogin] = useState(true)
const [phone, setPhone] = useState('') const [phone, setPhone] = useState('')
const { signIn, encryptToken } = useAuthSession();
const handleCheckPhone = async () => { const handleCheckPhone = async () => {
try { try {
setLoadingLogin(true) setLoadingLogin(true)
const response = await apiCheckPhoneLogin({ phone: `62${phone}` }); const response = await apiCheckPhoneLogin({ phone: `62${phone}` })
if (response.success) { if (response.success) {
if (response.isWithoutOTP) {
const encrypted = await encryptToken(response.id)
signIn(encrypted)
} else {
const otp = Math.floor(1000 + Math.random() * 9000) const otp = Math.floor(1000 + Math.random() * 9000)
const responseOtp = await apiSendOtp({ phone: `62${phone}`, otp }) const responseOtp = await apiSendOtp({ phone: `62${phone}`, otp })
if (responseOtp == 200) { if (responseOtp == 200) {
await AsyncStorage.setItem('user', response.id); await AsyncStorage.setItem('user', response.id)
return onValidate({ phone: `62${phone}`, otp }) return onValidate({ phone: `62${phone}`, otp })
} }
} }
} else {
return Toast.show({ type: 'small', text1: response.message, position: 'top' }) return Toast.show({ type: 'small', text1: response.message, position: 'top' })
}
} catch (error) { } catch (error) {
return Toast.show({ type: 'small', text1: 'Terjadi kesalahan', position: 'top' }) return Toast.show({ type: 'small', text1: 'Terjadi kesalahan', position: 'top' })
} finally { } finally {
@@ -42,6 +50,7 @@ export default function ViewLogin({ onValidate }: Props) {
return ( return (
<SafeAreaView> <SafeAreaView>
<StatusBar style={Platform.OS === 'ios' ? 'auto' : 'light'} translucent={false} backgroundColor="black" />
<ToastCustom /> <ToastCustom />
<View style={[Styles.p20, Styles.h100]}> <View style={[Styles.p20, Styles.h100]}>
<View style={{ alignItems: "center", marginVertical: 50 }}> <View style={{ alignItems: "center", marginVertical: 50 }}>

View File

@@ -2,8 +2,9 @@ import Styles from "@/constants/Styles";
import { apiSendOtp } from "@/lib/api"; import { apiSendOtp } from "@/lib/api";
import { useAuthSession } from "@/providers/AuthProvider"; import { useAuthSession } from "@/providers/AuthProvider";
import AsyncStorage from "@react-native-async-storage/async-storage"; import AsyncStorage from "@react-native-async-storage/async-storage";
import { StatusBar } from "expo-status-bar";
import { useState } from "react"; import { useState } from "react";
import { Image, View } from "react-native"; import { Image, Platform, View } from "react-native";
import { OtpInput } from "react-native-otp-entry"; import { OtpInput } from "react-native-otp-entry";
import Toast from 'react-native-toast-message'; import Toast from 'react-native-toast-message';
import { ButtonForm } from "../buttonForm"; import { ButtonForm } from "../buttonForm";
@@ -56,6 +57,7 @@ export default function ViewVerification({ phone, otp }: Props) {
return ( return (
<> <>
<StatusBar style={Platform.OS === 'ios' ? 'auto' : 'light'} translucent={false} backgroundColor="black"/>
<ToastCustom /> <ToastCustom />
<View style={Styles.wrapLogin} > <View style={Styles.wrapLogin} >
<View style={{ alignItems: "center", marginVertical: 50 }}> <View style={{ alignItems: "center", marginVertical: 50 }}>

View File

@@ -1,7 +1,7 @@
{ {
"cli": { "cli": {
"version": ">= 16.10.0", "version": ">= 16.10.0",
"appVersionSource": "remote" "appVersionSource": "local"
}, },
"build": { "build": {
"development": { "development": {

View File

@@ -2,9 +2,6 @@ import axios from 'axios';
import Constants from 'expo-constants'; import Constants from 'expo-constants';
const api = axios.create({ const api = axios.create({
// baseURL: 'http://10.0.2.2:3000/api',
// baseURL: 'https://stg-darmasaba.wibudev.com/api',
// baseURL: 'http://192.168.154.198:3000/api',
baseURL: Constants?.expoConfig?.extra?.URL_API baseURL: Constants?.expoConfig?.extra?.URL_API
}); });

View File

@@ -9,7 +9,9 @@
"ios": "expo run:ios", "ios": "expo run:ios",
"web": "expo start --web", "web": "expo start --web",
"test": "jest --watchAll", "test": "jest --watchAll",
"lint": "expo lint" "lint": "expo lint",
"bump": "node bump-version.js",
"build:android": "npm run bump && eas build -p android --profile production"
}, },
"jest": { "jest": {
"preset": "jest-expo" "preset": "jest-expo"