diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index 07e2420..b1e8c16 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -37,24 +37,30 @@ "LoginPage": { "text_field_phone_number": "شماره تلفن", "text_field_enter_your_phone_number": "شماره تلفن خود را وارد کنید", + "text_field_verification_code": "کد یکبار مصرف", + "text_field_enter_your_verification_code": "کد یکبار مصرف خود را وارد کنید", "button_submit": "ورود", "link_routing_back_to": "بازگشت به", "link_routing_previuos_page": "صفحه قبل", "link_routing_main_page": "صفحه اصلی", "error_message_required": "اجباری!", - "button_make_account": "ایجاد حساب" + "button_make_account": "ایجاد حساب", + "button_request_verification": "دریافت کد یکبارمصرف" }, "RegisterPage": { "link_routing_back_to": "بازگشت به", "link_routing_login_navy": "صفحه ورود", "text_field_phone_number": "شماره تلفن", "text_field_enter_your_phone_number": "شماره تلفن خود را وارد کنید", + "text_field_verification_code": "کد یکبار مصرف", + "text_field_enter_your_verification_code": "کد یکبار مصرف خود را وارد کنید", "text_field_national_id": "کد ملی", "text_field_enter_your_national_id": "کد ملی خود را وارد کنید", "text_field_navgan_id": "شماره ناوگان", "text_field_enter_your_navgan_id": "شماره ناوگان خود را وارد کنید", "error_message_required": "اجباری!", - "button_request_verification": "دریافت کد یکبارمصرف" + "button_request_verification": "دریافت کد یکبارمصرف", + "button_submit": "ورود" }, "Dashboard": { "dashboard_page": "داشبورد" diff --git a/src/components/dashboard/loan-request/index.jsx b/src/components/dashboard/loan-request/index.jsx index 385d6dc..b51837c 100644 --- a/src/components/dashboard/loan-request/index.jsx +++ b/src/components/dashboard/loan-request/index.jsx @@ -412,6 +412,7 @@ const DashboardLoanRequestComponent = () => { width={300} height={300} src="/images/login.svg" + priority alt={t("app_name")} /> @@ -420,6 +421,7 @@ const DashboardLoanRequestComponent = () => { width={300} height={300} src="/images/login.svg" + priority alt={t("app_name")} /> diff --git a/src/components/login-navy/SendToken.jsx b/src/components/login-navy/SendToken.jsx new file mode 100644 index 0000000..d7fb84b --- /dev/null +++ b/src/components/login-navy/SendToken.jsx @@ -0,0 +1,130 @@ +// import Notifications from "@/core/components/notifications"; +import StyledForm from "@/core/components/StyledForm"; +import { LOGIN } from "@/core/data/apiRoutes"; +import CenterLayout from "@/layouts/CenterLayout"; +import FullPageLayout from "@/layouts/FullPageLayout"; +import useDirection from "@/lib/app/hooks/useDirection"; +import useUser from "@/lib/app/hooks/useUser"; +import LoginIcon from "@mui/icons-material/Login"; +import { + Box, + Button, + Container, + Grid, + Paper, + Stack, + TextField, + Typography +} from "@mui/material"; +import axios from "axios"; +import { Field, Formik } from "formik"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import * as Yup from "yup"; + +const SendToken = ({ PhoneNumber }) => { + const t = useTranslations(); + const { directionApp } = useDirection(); + const { setToken } = useUser(); + + const initialValues = { + phone_number: PhoneNumber, + verification_code: "", + }; + const validationSchema = Yup.object().shape({ + verification_code: Yup.string().required( + t("LoginPage.error_message_required") + ), + }); + + const handleSubmit = async (values, props) => { + await axios + .post(LOGIN, { + phone_number: values.phone_number, + verification_code: values.verification_code, + }) + .then(function (response) { + setToken(response.data.token); + }) + .catch(function (error) { + Notifications(directionApp, error.response, t); + props.setSubmitting(false); + }); + }; + + return ( + + + + + + {(props) => ( + + + {t("app_name")} + + + {t("login_navy")} + + + + + + + + + + + + + )} + + + + + + ); +}; + +export default SendToken; diff --git a/src/components/login-navy/SendUserData.jsx b/src/components/login-navy/SendUserData.jsx new file mode 100644 index 0000000..c3197b8 --- /dev/null +++ b/src/components/login-navy/SendUserData.jsx @@ -0,0 +1,164 @@ +// import Notifications from "@/core/components/notifications"; +import LinkRouting from "@/core/components/LinkRouting"; +import StyledForm from "@/core/components/StyledForm"; +import { LOGIN_SEND_OTP_TOKEN } from "@/core/data/apiRoutes"; +import CenterLayout from "@/layouts/CenterLayout"; +import FullPageLayout from "@/layouts/FullPageLayout"; +import useDirection from "@/lib/app/hooks/useDirection"; +import FingerprintIcon from "@mui/icons-material/Fingerprint"; +import PersonAddIcon from "@mui/icons-material/PersonAdd"; +import { + Box, + Button, + Container, + Grid, + Paper, + Stack, + TextField, + Typography +} from "@mui/material"; +import axios from "axios"; +import { Field, Formik } from "formik"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import { useSearchParams } from "next/navigation"; +import * as Yup from "yup"; + +const SendUserData = ({ setOtpToken, setPhoneNumber }) => { + const t = useTranslations(); + const { directionApp } = useDirection(); + + const searchParams = useSearchParams(); + const backUrlDecodedPath = searchParams.get("back_url"); + + const initialValues = { + phone_number: "", + }; + const validationSchema = Yup.object().shape({ + phone_number: Yup.string().required(t("LoginPage.error_message_required")), + }); + + const handleSubmit = async (values, props) => { + await axios + .post(LOGIN_SEND_OTP_TOKEN, { + phone_number: values.phone_number, + }) + .then(function (response) { + setPhoneNumber(values.phone_number); + setOtpToken(true); + }) + .catch(function (error) { + // Notifications(directionApp, error.response, t); + props.setSubmitting(false); + }); + }; + + return ( + + + + + + {(props) => ( + + + {t("app_name")} + + + {t("login_navy")} + + + + + + + + + + + + + + + + + + )} + + + + + + + {t("LoginPage.link_routing_back_to")}{" "} + {backUrlDecodedPath + ? t("LoginPage.link_routing_previuos_page") + : t("LoginPage.link_routing_main_page")} + + + + ); +}; + +export default SendUserData; diff --git a/src/components/login-navy/index.jsx b/src/components/login-navy/index.jsx index e3fd879..ba30668 100644 --- a/src/components/login-navy/index.jsx +++ b/src/components/login-navy/index.jsx @@ -1,161 +1,18 @@ -import LinkRouting from "@/core/components/LinkRouting"; -// import Notifications from "@/core/components/notifications"; -import StyledForm from "@/core/components/StyledForm"; -// import { GET_USER_TOKEN } from "@/core/data/apiRoutes"; -import CenterLayout from "@/layouts/CenterLayout"; -import FullPageLayout from "@/layouts/FullPageLayout"; -import useDirection from "@/lib/app/hooks/useDirection"; -import useUser from "@/lib/app/hooks/useUser"; -import LoginIcon from "@mui/icons-material/Login"; -import PersonAddIcon from "@mui/icons-material/PersonAdd"; -import { - Box, - Button, - Container, - Grid, - Paper, - Stack, - TextField, - Typography, -} from "@mui/material"; -// import axios from "axios"; -import { Field, Formik } from "formik"; -import { useTranslations } from "next-intl"; -import Image from "next/image"; -import { useSearchParams } from "next/navigation"; -import * as Yup from "yup"; +import SendUserData from "./SendUserData"; +import { useState } from "react"; +import SendToken from "./SendToken"; const LoginComponent = () => { - const t = useTranslations(); - const { directionApp } = useDirection(); - const { setToken } = useUser(); // pass token to set token + const [otpToken, setOtpToken] = useState(false); + const [PhoneNumber, setPhoneNumber] = useState(""); - // gettin url query - const searchParams = useSearchParams(); - const backUrlDecodedPath = searchParams.get("back_url"); - - // formik properties - // const handleSubmit = async (values, props) => { - // await axios - // .post(GET_USER_TOKEN, { - // phone_number: values.phone_number, - // }) - // .then(function (response) { - // setToken(response.data.token); - // }) - // .catch(function (error) { - // Notifications(directionApp, error.response, t); - // props.setSubmitting(false); - // }); - // }; - const initialValues = { - phone_number: "", - }; - const validationSchema = Yup.object().shape({ - phone_number: Yup.string().required(t("LoginPage.error_message_required")), - }); - - return ( - - - - - - {(props) => ( - - - {t("app_name")} - - - {t("login_navy")} - - - - - - - - - - - - - - - - - - )} - - - - - - - {t("LoginPage.link_routing_back_to")}{" "} - {backUrlDecodedPath - ? t("LoginPage.link_routing_previuos_page") - : t("LoginPage.link_routing_main_page")} - - - - ); + if (!otpToken) { + return ( + + ); + } else { + return ; + } }; export default LoginComponent; diff --git a/src/components/login-welfare-services/index.jsx b/src/components/login-welfare-services/index.jsx index 33dfa38..3ec6b1b 100644 --- a/src/components/login-welfare-services/index.jsx +++ b/src/components/login-welfare-services/index.jsx @@ -70,7 +70,12 @@ const LoginComponent = () => { - {t("app_name")} + {t("app_name")} {t("login_welfare_services")} @@ -87,13 +92,16 @@ const LoginComponent = () => { )} type={"text"} error={ - props.touched.phone_number && props.errors.phone_number + props.touched.phone_number && + props.errors.phone_number ? true : false } fullWidth helperText={ - props.touched.phone_number ? props.errors.phone_number : null + props.touched.phone_number + ? props.errors.phone_number + : null } /> { }} > - + + + + + )} + + + + + + ); +}; + +export default SendToken; diff --git a/src/components/register-navy/SendUserData.jsx b/src/components/register-navy/SendUserData.jsx new file mode 100644 index 0000000..8766d44 --- /dev/null +++ b/src/components/register-navy/SendUserData.jsx @@ -0,0 +1,195 @@ +import LinkRouting from "@/core/components/LinkRouting"; +import StyledForm from "@/core/components/StyledForm"; +import { REGISTER_SEND_OTP_TOKEN } from "@/core/data/apiRoutes"; +import CenterLayout from "@/layouts/CenterLayout"; +import FullPageLayout from "@/layouts/FullPageLayout"; +import FingerprintIcon from "@mui/icons-material/Fingerprint"; +import { + Box, + Button, + Container, + Paper, + Stack, TextField, Typography +} from "@mui/material"; +import axios from "axios"; +import { Field, Formik } from "formik"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import { useSearchParams } from "next/navigation"; +import * as Yup from "yup"; + +const SendUserData = ({ + setOtpToken, + setPhoneNumber, + setNationalId, + setNavganId, + setTypeId, +}) => { + const t = useTranslations(); + + const searchParams = useSearchParams(); + const backUrlDecodedPath = searchParams.get("back_url"); + + const initialValues = { + type_id: "1", + phone_number: "", + national_id: "", + navgan_id: "", + }; + const validationSchema = Yup.object().shape({ + phone_number: Yup.string().required( + t("RegisterPage.error_message_required") + ), + national_id: Yup.string().required( + t("RegisterPage.error_message_required") + ), + navgan_id: Yup.string().required(t("RegisterPage.error_message_required")), + }); + + const handleSubmit = async (values, props) => { + await axios + .post(REGISTER_SEND_OTP_TOKEN, { + type_id: values.type_id, + national_id: values.national_id, + navgan_id: values.navgan_id, + phone_number: values.phone_number, + }) + .then(function (response) { + setPhoneNumber(values.phone_number); + setNationalId(values.national_id); + setNavganId(values.navgan_id); + setTypeId(values.type_id); + setOtpToken(true) + }) + .catch(function (error) { + Notifications(directionApp, error.response, t); + props.setSubmitting(false); + }); + }; + + return ( + + + + + + {(props) => ( + + + {t("app_name")} + + + {t("register_navy")} + + + + + + + + + + + )} + + + + + + + {t("RegisterPage.link_routing_back_to")}{" "} + {t("RegisterPage.link_routing_login_navy")} + + + + ); +}; + +export default SendUserData; diff --git a/src/components/register-navy/index.jsx b/src/components/register-navy/index.jsx index 6aa2271..7a136c7 100644 --- a/src/components/register-navy/index.jsx +++ b/src/components/register-navy/index.jsx @@ -1,191 +1,34 @@ -import StyledForm from "@/core/components/StyledForm"; -import { - Box, - Button, - Container, - Paper, - Stack, - Typography, - TextField, -} from "@mui/material"; -import { Field, Formik } from "formik"; -import Image from "next/image"; -import FingerprintIcon from "@mui/icons-material/Fingerprint"; -import FullPageLayout from "@/layouts/FullPageLayout"; -import CenterLayout from "@/layouts/CenterLayout"; -import { useTranslations } from "next-intl"; -import * as Yup from "yup"; -import LinkRouting from "@/core/components/LinkRouting"; -import { useSearchParams } from "next/navigation"; -import useDirection from "@/lib/app/hooks/useDirection"; -import useUser from "@/lib/app/hooks/useUser"; -// import { GET_USER_TOKEN } from "@/core/data/apiRoutes"; -// import axios from "axios"; +import { useState } from "react"; +import SendToken from "./SendToken"; +import SendUserData from "./SendUserData"; const RegisterNavyComponent = () => { - const t = useTranslations(); + const [otpToken, setOtpToken] = useState(false); + const [PhoneNumber, setPhoneNumber] = useState(""); + const [nationalId, setNationalId] = useState(""); + const [navganId, setNavganId] = useState(""); + const [typeId, setTypeId] = useState(""); - const { directionApp } = useDirection(); - const { setToken } = useUser(); - - const searchParams = useSearchParams(); - const backUrlDecodedPath = searchParams.get("back_url"); - - const initialValues = { - type_id: "1", - phone_number: "", - national_id: "", - navgan_id: "", - }; - const validationSchema = Yup.object().shape({ - phone_number: Yup.string().required( - t("RegisterPage.error_message_required") - ), - national_id: Yup.string().required( - t("RegisterPage.error_message_required") - ), - navgan_id: Yup.string().required(t("RegisterPage.error_message_required")), - }); - // const handleSubmit = async (values, props) => { - // await axios - // .post(GET_USER_TOKEN, { - // type_id: values.type_id, - // national_id: values.national_id, - // navgan_id: values.navgan_id, - // phone_number: values.phone_number, - // }) - // .then(function (response) { - // setToken(response.data.token); - // }) - // .catch(function (error) { - // Notifications(directionApp, error.response, t); - // props.setSubmitting(false); - // }); - // }; - - return ( - - - - - - {(props) => ( - - - {t("app_name")} - - - {t("register_navy")} - - - - - - - - - - - )} - - - - - - - {t("RegisterPage.link_routing_back_to")}{" "} - {t("RegisterPage.link_routing_login_navy")} - - - - ); + if (!otpToken) { + return ( + + ); + } else { + return ( + + ); + } }; export default RegisterNavyComponent; diff --git a/src/components/register-welfare-services/index.jsx b/src/components/register-welfare-services/index.jsx index e69de29..b9a35c5 100644 --- a/src/components/register-welfare-services/index.jsx +++ b/src/components/register-welfare-services/index.jsx @@ -0,0 +1,169 @@ +import StyledForm from "@/core/components/StyledForm"; +import { + Box, + Button, + Container, + Paper, + Stack, + Typography, + TextField, +} from "@mui/material"; +import { Field, Formik } from "formik"; +import Image from "next/image"; +import FingerprintIcon from "@mui/icons-material/Fingerprint"; +import FullPageLayout from "@/layouts/FullPageLayout"; +import CenterLayout from "@/layouts/CenterLayout"; +import { useTranslations } from "next-intl"; +import * as Yup from "yup"; +import LinkRouting from "@/core/components/LinkRouting"; +import { useSearchParams } from "next/navigation"; +import useDirection from "@/lib/app/hooks/useDirection"; +import useUser from "@/lib/app/hooks/useUser"; +// import { GET_USER_TOKEN } from "@/core/data/apiRoutes"; +// import axios from "axios"; + +const RegisterNavyComponent = () => { + const t = useTranslations(); + + const { directionApp } = useDirection(); + const { setToken } = useUser(); + + const searchParams = useSearchParams(); + const backUrlDecodedPath = searchParams.get("back_url"); + + const initialValues = { + type_id: "2", + phone_number: "", + national_id: "", + navgan_id: "", + }; + const validationSchema = Yup.object().shape({ + phone_number: Yup.string().required( + t("RegisterPage.error_message_required") + ), + national_id: Yup.string().required( + t("RegisterPage.error_message_required") + ), + }); + // const handleSubmit = async (values, props) => { + // await axios + // .post(GET_USER_TOKEN, { + // type_id: values.type_id, + // national_id: values.national_id, + // navgan_id: values.navgan_id, + // phone_number: values.phone_number, + // }) + // .then(function (response) { + // setToken(response.data.token); + // }) + // .catch(function (error) { + // Notifications(directionApp, error.response, t); + // props.setSubmitting(false); + // }); + // }; + + return ( + + + + + + {(props) => ( + + + {t("app_name")} + + + {t("register_navy")} + + + + + + + + + + )} + + + + + + + {t("RegisterPage.link_routing_back_to")}{" "} + {t("RegisterPage.link_routing_login_navy")} + + + + ); +}; + +export default RegisterNavyComponent; diff --git a/src/components/register-welfare-services/sendToken.jsx b/src/components/register-welfare-services/sendToken.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/core/data/apiRoutes.js b/src/core/data/apiRoutes.js index e69de29..bd04212 100644 --- a/src/core/data/apiRoutes.js +++ b/src/core/data/apiRoutes.js @@ -0,0 +1,9 @@ +const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL + "/api"; + +export const LOGIN_SEND_OTP_TOKEN = BASE_URL + "/login/send_otp"; +export const LOGIN = BASE_URL + "/login"; +export const REGISTER_SEND_OTP_TOKEN = BASE_URL + "/register/send_otp"; +export const REGISTER = BASE_URL + "/register"; +export const USER_INFO = BASE_URL + "/hamidGiveme"; + + diff --git a/src/lib/app/contexts/user.jsx b/src/lib/app/contexts/user.jsx index 49d55af..e859c58 100644 --- a/src/lib/app/contexts/user.jsx +++ b/src/lib/app/contexts/user.jsx @@ -1,7 +1,4 @@ -import { - GET_USER_ROUTE, - SET_LANGUAGE -} from "@/core/data/apiRoutes"; +import { USER_INFO } from "@/core/data/apiRoutes"; import axios from "axios"; import { createContext, useCallback, useEffect, useReducer } from "react"; @@ -51,27 +48,7 @@ export const UserProvider = ({ children }) => { dispatch({ type: "CHANGE_USER", user }); }, []); - const changeUserLanguage = useCallback( - (language) => { - dispatch({ type: "CHANGE_USER_LANGUAGE", language }); - axios - .post( - SET_LANGUAGE, - { language: language }, - { - headers: { - authorization: `Bearer ${state.token}`, - }, - } - ) - .then(() => { - getUser((data) => { - changeUser(data); - }); - }); - }, - [state.token] - ); + const changeUserLanguage = useCallback(/* for multi language app */); const changeAuthState = useCallback((isAuth) => { dispatch({ type: "CHANGE_AUTH_STATE", isAuth }); @@ -92,7 +69,7 @@ export const UserProvider = ({ children }) => { const getUser = useCallback( (callback = () => {}) => { axios - .get(GET_USER_ROUTE, { + .get(USER_INFO, { headers: { authorization: `Bearer ${state.token}` }, }) .then(({ data }) => {