From 6f5d04e73fdceadf079d43f54010432614000485 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Fri, 15 Aug 2025 17:39:32 +0800 Subject: [PATCH] API Add: - lib/api.ts ### No Issue --- bun.lock | 15 ++++++ lib/api.ts | 23 +++++++++ package.json | 1 + screens/Authentication/LoginView.tsx | 57 ++++++++++++++++----- screens/Authentication/VerificationView.tsx | 5 +- 5 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 lib/api.ts diff --git a/bun.lock b/bun.lock index d849646..fc38719 100644 --- a/bun.lock +++ b/bun.lock @@ -13,6 +13,7 @@ "@react-navigation/native-stack": "^7.3.21", "@types/lodash": "^4.17.20", "@types/react-native-vector-icons": "^6.4.18", + "axios": "^1.11.0", "dayjs": "^1.11.13", "expo": "53.0.17", "expo-blur": "~14.1.5", @@ -591,8 +592,12 @@ "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], @@ -689,6 +694,8 @@ "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], @@ -749,6 +756,8 @@ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], @@ -951,12 +960,16 @@ "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "freeport-async": ["freeport-async@2.0.0", "", {}, "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ=="], "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], @@ -1403,6 +1416,8 @@ "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "qrcode": ["qrcode@1.5.4", "", { "dependencies": { "dijkstrajs": "^1.0.1", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, "bin": { "qrcode": "bin/qrcode" } }, "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg=="], diff --git a/lib/api.ts b/lib/api.ts new file mode 100644 index 0000000..3b08fa1 --- /dev/null +++ b/lib/api.ts @@ -0,0 +1,23 @@ +const API_BASE = (path: string) => { + const url = "https://stg-hipmi.wibudev.com/"; + // const url = "http://10.169.174.254:3000/"; + return `${url}/${path}`; +}; + +export async function apiVersion() { + const response = await fetch(API_BASE("api/version")); + const data = await response.json(); + return data; +} + +export async function apiLogin({ nomor }: { nomor: string }) { + const response = await fetch(API_BASE("api/auth/login"), { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ nomor: nomor }), + }); + const data = await response.json(); + return data; +} diff --git a/package.json b/package.json index b699ec4..e2e3baa 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@react-navigation/native-stack": "^7.3.21", "@types/lodash": "^4.17.20", "@types/react-native-vector-icons": "^6.4.18", + "axios": "^1.11.0", "dayjs": "^1.11.13", "expo": "53.0.17", "expo-blur": "~14.1.5", diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index ca1f293..197b46e 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -2,16 +2,28 @@ import ButtonCustom from "@/components/Button/ButtonCustom"; import Spacing from "@/components/_ShareComponent/Spacing"; import ViewWrapper from "@/components/_ShareComponent/ViewWrapper"; import { MainColor } from "@/constants/color-palet"; +import { apiLogin, apiVersion } from "@/lib/api"; import { GStyles } from "@/styles/global-styles"; import { router } from "expo-router"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { Text, View } from "react-native"; import PhoneInput, { ICountry } from "react-native-international-phone-number"; +import Toast from "react-native-toast-message"; export default function LoginView() { + const [version, setVersion] = useState(""); const [selectedCountry, setSelectedCountry] = useState(null); const [inputValue, setInputValue] = useState(""); + useEffect(() => { + onLoadVersion(); + }, []); + + async function onLoadVersion() { + const res = await apiVersion(); + setVersion(res.data); + } + function handleInputValue(phoneNumber: string) { setInputValue(phoneNumber); } @@ -20,17 +32,35 @@ export default function LoginView() { setSelectedCountry(country); } - function handleLogin() { - const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; - const fixNumber = callingCode + inputValue; - // console.log("fixNumber", fixNumber); + async function handleLogin() { + const callingCode = + selectedCountry?.callingCode.replace(/^\+/, "").trim() || ""; + const fixNumber = inputValue.replace(/\s+/g, ""); + const realNumber = callingCode + fixNumber; - const randomAlfabet = Math.random().toString(36).substring(2, 8); - const randomNumber = Math.floor(Math.random() * 1000000); - const id = randomAlfabet + randomNumber + fixNumber; - console.log("login user id :", id); + const response = await apiLogin({ nomor: realNumber }); - router.navigate("/verification"); + if (response.success) { + Toast.show({ + type: "success", + text1: "Success", + text2: "Login berhasil", + }); + router.navigate(`/verification?kodeId=${response.kodeId}`); + } else { + Toast.show({ + type: "error", + text1: "Error", + text2: response.message, + }); + } + + // const randomAlfabet = Math.random().toString(36).substring(2, 8); + // const randomNumber = Math.floor(Math.random() * 1000000); + // const id = randomAlfabet + randomNumber + fixNumber; + // console.log("login user id :", id); + + // router.navigate("/verification"); // router.replace("/(application)/coba"); // router.navigate("/admin/dashboard") } @@ -49,15 +79,15 @@ export default function LoginView() { - powered by muku.id + {version} | powered by muku.id @@ -73,7 +103,6 @@ export default function LoginView() { Login - {/* router.navigate("/admin/investment")}> diff --git a/screens/Authentication/VerificationView.tsx b/screens/Authentication/VerificationView.tsx index d3e20b8..7f56d9c 100644 --- a/screens/Authentication/VerificationView.tsx +++ b/screens/Authentication/VerificationView.tsx @@ -3,11 +3,14 @@ import ViewWrapper from "@/components/_ShareComponent/ViewWrapper"; import ButtonCustom from "@/components/Button/ButtonCustom"; import { MainColor } from "@/constants/color-palet"; import { GStyles } from "@/styles/global-styles"; -import { router } from "expo-router"; +import { router, useLocalSearchParams } from "expo-router"; import { Text, View } from "react-native"; import { OtpInput } from "react-native-otp-entry"; export default function VerificationView() { + const { kodeId } = useLocalSearchParams(); + console.log("kodeId ", kodeId); + const handleVerification = () => { console.log("Verification clicked"); router.push("/register");