diff --git a/package.json b/package.json
index 11cad540..aa40fe6d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "opex",
- "version": "v1.0.2-beta.4",
+ "version": "v1.0.2-beta.5",
"homepage": "",
"private": true,
"dependencies": {
@@ -15,7 +15,7 @@
"i18next": "^21.8.0",
"i18next-browser-languagedetector": "^6.1.4",
"i18next-http-backend": "^1.4.0",
- "js-api-client": "https://github.com/opexdev/js-api-client.git#v1.0.1-beta.2",
+ "js-api-client": "https://github.com/opexdev/js-api-client.git#develop",
"jwt-decode": "^3.1.2",
"lightweight-charts": "^3.8.0",
"moment-jalaali": "^0.9.2",
diff --git a/public/assets/locales/en/translation.json b/public/assets/locales/en/translation.json
index ae45da0f..c384889e 100644
--- a/public/assets/locales/en/translation.json
+++ b/public/assets/locales/en/translation.json
@@ -45,6 +45,7 @@
"close": "Close",
"unit": "Unit",
"offline": "Check your connection!",
+ "improperMobileView ": "Not optimized for mobile view.",
"country": {
"iran" : "I. R. IRAN",
"germany" : "Germany",
@@ -469,11 +470,17 @@
"save": "Save"
},
"login": {
- "title": "Login/Register",
+ "title": "Login/RegistimproperMobileView er",
"wrongPassword": "Username or password is incorrect!",
"wrongOTP": "Entered OTP is incorrect!",
"wrongPasswordConfirmation": "Password and confirm password don't match.",
"forgetPassword": "Forget Password",
+ "verificationEmail": "Didn't receive the email?",
+ "resendVerifyEmail": "Resend Email",
+ "sendEmail": "Send Email",
+ "verifyEmailServerError": "Server error, try again!",
+ "verifyEmailFinished": "Verification email has been sent successfully!",
+ "emailAlreadyVerified": "Email already verified.",
"accountNotActive": "Your account has not been activated yet.",
"enter": "Enter",
"resetPassword": "Reset Password",
diff --git a/public/assets/locales/fa/translation.json b/public/assets/locales/fa/translation.json
index f9dfdb5a..bb0bd03b 100644
--- a/public/assets/locales/fa/translation.json
+++ b/public/assets/locales/fa/translation.json
@@ -45,6 +45,7 @@
"close": "بستن",
"unit": "واحد",
"offline": "اتصال اینترنت را بررسی کنید!",
+ "improperMobileView ": "فعلاً برای موبایل بهینه نشده است.",
"country": {
"iran" : "جمهوری اسلامی ایران",
"germany" : "آلمان",
@@ -474,6 +475,12 @@
"wrongOTP": "رمز دو مرحله ای صحیح نمی باشد!",
"wrongPasswordConfirmation": "رمز ورود و تکرار آن باهم مطابقت ندارند.!",
"forgetPassword": "فراموشی رمز عبور",
+ "verificationEmail": " آیا ایمیل فعالسازی را دریافت نکردهاید؟",
+ "resendVerifyEmail": "ارسال دوباره ایمیل فعالسازی",
+ "sendEmail": "ارسال ایمیل",
+ "verifyEmailServerError": "خطا در ارسال ایمیل فعالسازی، دوباره تلاش کنید",
+ "verifyEmailFinished": "ایمیل فعالسازی با موفقیت ارسال شد",
+ "emailAlreadyVerified": "ایمیل شما قبلاً فعال شده است.",
"accountNotActive": "اکانت شما هنوز فعال نشده است",
"enter": "ورود",
"resetPassword": "بازیابی رمز",
diff --git a/src/components/TextInput/TextInput.js b/src/components/TextInput/TextInput.js
index dc55ed96..031a50d2 100644
--- a/src/components/TextInput/TextInput.js
+++ b/src/components/TextInput/TextInput.js
@@ -4,7 +4,21 @@ import Select from "react-select";
import * as classes from "./TextInput.module.css";
const TextInput = (props) => {
- const {customRef,readOnly,onchange,customClass,options, lead , after ,select ,alerts ,max , ...other} = props
+ const {
+ customRef,
+ readOnly,
+ onchange,
+ customClass,
+ options,
+ lead,
+ after,
+ select,
+ alerts,
+ max,
+ ltr,
+ info,
+ ...other
+ } = props
let leadSection = null
let afterSection = null
@@ -15,6 +29,7 @@ const TextInput = (props) => {
readOnly={readOnly}
onChange={onchange}
max={max}
+ style={{direction: ltr && 'ltr'}}
{...other}
/>
diff --git a/src/main/Browser/Pages/Login/Login.js b/src/main/Browser/Pages/Login/Login.js
index f226eb36..68dca2ab 100644
--- a/src/main/Browser/Pages/Login/Login.js
+++ b/src/main/Browser/Pages/Login/Login.js
@@ -23,7 +23,7 @@ const Login = () => {
style={{backgroundImage: `url("${images.spaceStar}")`}}>
diff --git a/src/main/Browser/Pages/Login/Login.module.css b/src/main/Browser/Pages/Login/Login.module.css
index 46fc1593..21188ea8 100644
--- a/src/main/Browser/Pages/Login/Login.module.css
+++ b/src/main/Browser/Pages/Login/Login.module.css
@@ -39,6 +39,7 @@
.content :global(.accordion-header){
/*background-color: #242633fa;*/
background-color: var(--cardHeaderAlpha);
+ padding-top: 3vh;
/*color: #ecececc7;*/
}
/*.content :global(.accordion-body){
@@ -64,10 +65,22 @@
border-color: var(--cardHeader);
color: var(--textColor);
}
-.loginInput.captcha :global(.lead){
+
+
+.loginInput.passwordInput :global(.before){
width: 50%;
+}
+.loginInput.passwordInput :global(input){
+ width: 40%;
+}
+.loginInput.passwordInput :global(.after){
+ width: 10%;
+}
+.loginInput.captcha :global(.lead){
+ width: 50%;
}
+
.loginInput.captcha :global(.lead) span{
width: 100%;
height: 100%;
@@ -143,6 +156,21 @@
direction: ltr !important;
}
+
+.disable:disabled,.button[disabled] {
+ border: 0.3vh solid var(--cardHeader);
+ background: var(--cardHeader);
+ color: var(--textColor);
+ cursor: not-allowed;
+}
+
+.thisButton:disabled,.button[disabled] {
+ border: 0.3vh solid var(--cardHeader);
+ background: var(--cardHeader);
+ color: var(--textColor);
+ cursor: not-allowed;
+}
+
.twinkle{
-webkit-animation: twinkle 4s linear infinite;
-moz-animation: twinkle 4s linear infinite;
diff --git a/src/main/Browser/Pages/Login/components/EmailVerification/EmailVerification.js b/src/main/Browser/Pages/Login/components/EmailVerification/EmailVerification.js
new file mode 100644
index 00000000..8e6c2b16
--- /dev/null
+++ b/src/main/Browser/Pages/Login/components/EmailVerification/EmailVerification.js
@@ -0,0 +1,218 @@
+import React, {useEffect, useState} from 'react';
+import classes from "../../Login.module.css";
+import Button from "../../../../../../components/Button/Button";
+import {useTranslation} from "react-i18next";
+import {getCaptchaImage, getPanelToken, requestForVerifyEmail} from "js-api-client";
+import ReactTooltip from "react-tooltip";
+import LoginFormLoading from "../LoginLoading/LoginFormLoading";
+import {validateEmail} from "../../../../../../utils/utils";
+import {images} from "../../../../../../assets/images";
+import TextInput from "../../../../../../components/TextInput/TextInput";
+import Icon from "../../../../../../components/Icon/Icon";
+import Countdown from "react-countdown";
+import {useDispatch, useSelector} from "react-redux";
+import {setVerifyEmailLockInitiate} from "../../../../../../store/actions";
+
+const EmailVerification = ({returnFunc, email, disable, returnFuncDisableFalse, returnFuncDisableTrue}) => {
+
+ const clientSecret = window.env.REACT_APP_CLIENT_SECRET
+ const clientId = window.env.REACT_APP_CLIENT_ID
+
+ const {t} = useTranslation();
+ const dispatch = useDispatch();
+
+ const [loading, setLoading] = useState(false);
+ const [isLoading, setIsLoading] = useState(true);
+ const [success, setSuccess] = useState(false);
+
+ const verifyEmailLock = useSelector((state) => state.exchange.verifyEmailLock)
+
+ const [activeEmail, setActiveEmail] = useState({
+ email: {value: "", error: []},
+ captchaAnswer: {value: "", error: []},
+ });
+ const [captcha, setCaptcha] = useState({
+ image: {value: "", error: []},
+ SessionKey: {value: "", error: []},
+ expireTime: {value: "", error: []},
+ });
+
+ const captchaReq = () => {
+ setIsLoading(true)
+ getCaptchaImage()
+ .then((res) => {
+ setCaptcha({
+ image: {
+ value: `data:${res.headers['content-type']};base64,${Buffer.from(res.data).toString('base64')}`,
+ error: []
+ },
+ SessionKey: {value: res.headers['captcha-session-key'], error: []},
+ expireTime: {value: res.headers['captcha-expire-timestamp'], error: []},
+ })
+ }).catch(() => {
+ setActiveEmail({...activeEmail, captchaAnswer: {value: "", error: [t("login.captchaServerError")]}})
+ setCaptcha({...captcha, image: {value: undefined, error: []}})
+ }).finally(() => {
+ setIsLoading(false)
+ });
+ }
+
+ useEffect(() => {
+ captchaReq()
+ if (email.length > 0) return setActiveEmail({...activeEmail, email: {...activeEmail.email, value: email}})
+ }, [])
+
+
+ useEffect(() => {
+ ReactTooltip.rebuild();
+ });
+
+ if (loading) return
+
+ const submit = async (e) => {
+ e.preventDefault();
+ if (activeEmail.email.value === "") {
+ setActiveEmail({...activeEmail, email: {value: "", error: [t('login.emptyEmail')]}})
+ return;
+ }
+ if (!validateEmail(activeEmail.email.value)) {
+ setActiveEmail({...activeEmail, email: {value: "", error: [t('login.forgetPassEmailForgetError')]}})
+ return;
+ }
+ if (activeEmail.captchaAnswer.value === "") {
+ setActiveEmail({...activeEmail, captchaAnswer: {value: "", error: [t('login.emptyCaptcha')]}})
+ return;
+ }
+ if (activeEmail.captchaAnswer.value.length < 5) {
+ setActiveEmail({...activeEmail, captchaAnswer: {value: "", error: [t('login.minCaptcha')]}})
+ return;
+ }
+ setLoading(true);
+
+ const {data: {access_token: panelToken}} = await getPanelToken(clientId, clientSecret);
+ const captchaValue = `${captcha.SessionKey.value}-${activeEmail.captchaAnswer.value}`
+ requestForVerifyEmail(activeEmail.email.value, captchaValue)
+ .then(() => {
+ setSuccess(true)
+ returnFuncDisableTrue()
+ dispatch(setVerifyEmailLockInitiate(new Date().getTime() + 2 * 60 * 1000))
+ })
+ .catch((err) => {
+ if (err?.response?.data?.code === 10001 && err?.response?.data?.message === "Captcha is not valid") {
+ console.log("in captcha erro")
+ return setActiveEmail({...activeEmail, captchaAnswer: {value: "", error: [t("login.InvalidCaptcha")]}})
+ }
+ if (err?.response?.data?.code === 1002 && err?.response?.data?.message === "User already verified") {
+ return setActiveEmail({...activeEmail, captchaAnswer: {value: "", error: [t("login.emailAlreadyVerified")]}})
+ } else {
+ return setActiveEmail({
+ ...activeEmail,
+ captchaAnswer: {value: "", error: [t('login.verifyEmailServerError')]}
+ })
+ }
+ })
+ .finally(() => {
+ setLoading(false);
+ });
+
+ }
+
+ const LeadCaptchaHandler = () => {
+ if (isLoading) return

+
+ if (captcha.image.value === undefined) return
{t('captchaAnswer')}
+
+ return
+ }
+
+ const sendEmailButtonTitle = () => {
+ if (disable) {
+ return
{t('login.sendEmail')} ( {props.minutes}:{props.seconds}
}
+ onComplete={returnFuncDisableFalse}
+ />)
+ }
+ return
{t('login.sendEmail')}
+ }
+
+
+ const FormBody = () => {
+ if (success) return
{t('login.verifyEmailFinished')}
+
+ return <>
+
{t('login.resendVerifyEmail')}
+
+ setActiveEmail({...activeEmail, email: {value: e.target.value, error: []}})
+ }
+ alerts={activeEmail.email.error}
+ />
+ ${t("login.refreshCaptcha")}`}>}
+ type="text"
+ data-name="captchaAnswer"
+ data-type="input"
+ data-min={5}
+ customClass={`${classes.loginInput} ${classes.captcha}`}
+ value={activeEmail.captchaAnswer.value}
+ onchange={(e) =>
+ setActiveEmail({...activeEmail, captchaAnswer: {value: e.target.value, error: []}})
+ }
+ alerts={activeEmail.captchaAnswer.error}
+ maxLength="5"
+ />
+ >
+ }
+
+
+ const FormFooter = () => {
+ if (success) return
+
+ return <>
+
+
+ >
+ }
+
+ return (
+
+ );
+};
+
+export default EmailVerification;
diff --git a/src/main/Browser/Pages/Login/components/LoginForm/LoginForm.js b/src/main/Browser/Pages/Login/components/LoginForm/LoginForm.js
index fe18767f..94231f61 100644
--- a/src/main/Browser/Pages/Login/components/LoginForm/LoginForm.js
+++ b/src/main/Browser/Pages/Login/components/LoginForm/LoginForm.js
@@ -1,5 +1,5 @@
-import {useDispatch, useSelector} from "react-redux";
import React, {useEffect, useState} from "react";
+import {useDispatch, useSelector} from "react-redux";
import classes from "../../Login.module.css";
import TextInput from "../../../../../../components/TextInput/TextInput";
import LoginFormLoading from "../LoginLoading/LoginFormLoading";
@@ -14,12 +14,15 @@ import ForgetPassword from "../ForgetPassword/ForgetPassword";
import {setUserAccountInfoInitiate, setUserInfo, setUserTokensInitiate} from "../../../../../../store/actions";
import {useGetKycStatus} from "../../../../../../queries";
import {login, parseToken} from "js-api-client";
+import Icon from "../../../../../../components/Icon/Icon";
const LoginForm = () => {
const {t} = useTranslation();
const navigate = useNavigate();
const dispatch = useDispatch();
const location = useLocation();
+
+ const [isInputVisible, setIsInputVisible] = useState(false);
const [isLoading, setLoading] = useState(false);
const [loginError, setLoginError] = useState(false);
const [needOTP, setNeedOTP] = useState(undefined);
@@ -106,6 +109,8 @@ const LoginForm = () => {
setCredential({...credential, otp: ""})
}
+
+
return
diff --git a/src/main/Browser/Pages/Login/components/RegisterForm/RegisterForm.js b/src/main/Browser/Pages/Login/components/RegisterForm/RegisterForm.js
index 6fb82d74..ebd30025 100644
--- a/src/main/Browser/Pages/Login/components/RegisterForm/RegisterForm.js
+++ b/src/main/Browser/Pages/Login/components/RegisterForm/RegisterForm.js
@@ -9,11 +9,19 @@ import Icon from "../../../../../../components/Icon/Icon";
import {images} from "../../../../../../assets/images";
import ReactTooltip from "react-tooltip";
import {getCaptchaImage, getPanelToken, userRegister} from "js-api-client";
+import EmailVerification from "../EmailVerification/EmailVerification";
+import {setVerifyEmailLockInitiate} from "../../../../../../store/actions";
+import {useDispatch, useSelector} from "react-redux";
const RegisterForm = () => {
const {t} = useTranslation();
+ const dispatch = useDispatch();
+ const verifyEmailLock = useSelector((state) => state.exchange.verifyEmailLock)
+
const [registerStatus, setRegisterStatus] = useState("")
+ const [verifyEmail, setVerifyEmail] = useState(false);
+ const [disable, setDisable] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [captcha, setCaptcha] = useState({
image: {value: "", error: []},
@@ -28,6 +36,10 @@ const RegisterForm = () => {
password: {value: "", error: []},
confirmPassword: {value: "", error: []},
});
+ const [isInputVisible, setIsInputVisible] = useState({
+ password: false,
+ confirmPassword: false,
+ });
const clientSecret = window.env.REACT_APP_CLIENT_SECRET
const clientId = window.env.REACT_APP_CLIENT_ID
@@ -61,8 +73,14 @@ const RegisterForm = () => {
ReactTooltip.rebuild();
});
+ useEffect(() => {
+ if (verifyEmailLock && new Date().getTime() < verifyEmailLock) setDisable(true)
+ }, [verifyEmailLock]);
+
if (registerStatus === "loading") return
+ if (verifyEmail) return setVerifyEmail(false)} email={userData?.email?.value} disable={disable} returnFuncDisableFalse={() => setDisable(false)} returnFuncDisableTrue={() => setDisable(true)}/>
+
if (registerStatus === "finish") {
return
{t('login.registerFinished')}
@@ -78,9 +96,14 @@ const RegisterForm = () => {
i18nKey="login.registerFinishedSpamMail"
values={{email: window.env.REACT_APP_SYSTEM_EMAIL_ADDRESS,}}
/>
+
+
+ setVerifyEmail(true)}>{t('login.verificationEmail')}
+
}
+
if (registerStatus === "finishedWithError") {
return
{t('login.finishedWithError')}
@@ -107,6 +130,8 @@ const RegisterForm = () => {
userRegister(user, panelToken)
.then(() => {
setRegisterStatus("finish");
+ setDisable(true)
+ dispatch(setVerifyEmailLockInitiate(new Date().getTime() + 2 * 60 * 1000))
}).catch((e) => {
if (e?.response?.data?.error === "InvalidCaptcha") {
setUserData({...userData, captchaAnswer: {value: "", error: [t("login.InvalidCaptcha")]}})
@@ -224,22 +249,42 @@ const RegisterForm = () => {
/>
inputHandler(e)}
alerts={userData.password.error}
data-min={8}
+ type={isInputVisible.password ? "text" : "password"}
+ after={
+ setIsInputVisible({
+ ...isInputVisible,
+ password: !isInputVisible.password
+ })}
+ />
+ }
/>
inputHandler(e)}
alerts={userData.confirmPassword.error}
+ type={isInputVisible.confirmPassword ? "text" : "password"}
+ after={
+ setIsInputVisible({
+ ...isInputVisible,
+ confirmPassword: !isInputVisible.confirmPassword
+ })}
+ />
+ }
/>
{
alerts={userData.captchaAnswer.error}
maxLength="5"
/>
+
+
+
setVerifyEmail(true)}>{t('login.verificationEmail')}
+
+
);
diff --git a/src/store/actions/actionTypes.js b/src/store/actions/actionTypes.js
index 4f1f384e..ee1889e8 100644
--- a/src/store/actions/actionTypes.js
+++ b/src/store/actions/actionTypes.js
@@ -7,6 +7,9 @@ export const SET_THEME_INITIATE = "SET_THEME_INITIATE";
export const SET_IPG = "SET_IPG";
export const SET_IPG_INITIATE = "SET_IPG_INITIATE";
+export const SET_VERIFY_EMAIL_LOCK = "SET_VERIFY_EMAIL_LOCK";
+export const SET_VERIFY_EMAIL_LOCK_INITIATE = "SET_VERIFY_EMAIL_LOCK_INITIATE";
+
export const SET_INFO_MESSAGE = "SET_INFO_MESSAGE";
export const SET_ACTIVE_PAIR = "SET_ACTIVE_PAIR";
diff --git a/src/store/actions/exchange.js b/src/store/actions/exchange.js
index 422d526f..367fe1ba 100644
--- a/src/store/actions/exchange.js
+++ b/src/store/actions/exchange.js
@@ -61,6 +61,19 @@ export const setIPGInitiate = (lockTime) => {
lockTime,
};
};
+export const setVerifyEmailLock = (verifyEmailLockTime) => {
+ return {
+ type: actionTypes.SET_VERIFY_EMAIL_LOCK,
+ verifyEmailLockTime,
+ };
+};
+
+export const setVerifyEmailLockInitiate = (verifyEmailLockTime) => {
+ return {
+ type: actionTypes.SET_VERIFY_EMAIL_LOCK_INITIATE,
+ verifyEmailLockTime,
+ };
+};
export const setExchange = exchangeInfo => {
return {
diff --git a/src/store/actions/index.js b/src/store/actions/index.js
index b25958bb..a15a7b91 100644
--- a/src/store/actions/index.js
+++ b/src/store/actions/index.js
@@ -19,7 +19,9 @@ export {
setLastPrice,
setLastTradePrice,
setIPG,
- setIPGInitiate
+ setIPGInitiate,
+ setVerifyEmailLock,
+ setVerifyEmailLockInitiate
} from "./exchange";
diff --git a/src/store/reducers/exchangeReducer.js b/src/store/reducers/exchangeReducer.js
index b752afc0..b5af0a5c 100644
--- a/src/store/reducers/exchangeReducer.js
+++ b/src/store/reducers/exchangeReducer.js
@@ -18,6 +18,7 @@ const initialState = {
},
},
ipgLock: null,
+ verifyEmailLock: null,
};
const exchangeReducer = (state = initialState, action) => {
@@ -27,6 +28,11 @@ const exchangeReducer = (state = initialState, action) => {
...state,
ipgLock: action.lockTime,
};
+ case actionTypes.SET_VERIFY_EMAIL_LOCK:
+ return {
+ ...state,
+ verifyEmailLock: action.verifyEmailLockTime,
+ };
case actionTypes.SET_ACTIVE_PAIR:
return {
...state,
diff --git a/src/store/sagas/global.js b/src/store/sagas/global.js
index ca0aba38..12c967ba 100644
--- a/src/store/sagas/global.js
+++ b/src/store/sagas/global.js
@@ -19,6 +19,11 @@ export function* setIPGLock(action) {
yield put(actions.setIPG(action.lockTime));
}
+export function* setVerifyEmailLock(action) {
+ yield call([localStorage, 'setItem'], "verifyEmailLockTime", action.verifyEmailLockTime)
+ yield put(actions.setVerifyEmailLock(action.verifyEmailLockTime));
+}
+
export function* getExchangeLastPrice() {
const newPrices = {}
try {
@@ -78,7 +83,6 @@ export function* loadConfig(action) {
const isDark = yield call([localStorage, 'getItem'], 'isDark')
if (isDark) yield put(actions.setTheme(JSON.parse(isDark)));
-
if (action.token) {
yield put(actions.setUserTokens({refreshToken : null, accessToken: action.token}));
yield call([localStorage, 'removeItem'], "refreshToken")
@@ -91,6 +95,9 @@ export function* loadConfig(action) {
const lockTime = yield call([localStorage, 'getItem'], 'lockTime')
if (lockTime) yield put(actions.setIPG(lockTime));
+ const verifyEmailLockTime = yield call([localStorage, 'getItem'], 'verifyEmailLockTime')
+ if (verifyEmailLockTime) yield put(actions.setVerifyEmailLock(verifyEmailLockTime));
+
const refreshToken = localStorage.getItem("refreshToken")
if (refreshToken) {
diff --git a/src/store/sagas/index.js b/src/store/sagas/index.js
index 35828206..193a6785 100644
--- a/src/store/sagas/index.js
+++ b/src/store/sagas/index.js
@@ -1,7 +1,7 @@
import {takeEvery} from "redux-saga/effects";
import * as actionTypes from "../actions/actionTypes";
-import {getExchangeLastPrice, loadConfig, setActivePair, setIPGLock, setThemeSaga} from "./global";
+import {getExchangeLastPrice, loadConfig, setActivePair, setIPGLock, setThemeSaga, setVerifyEmailLock} from "./global";
import {getUserKYCStatus, logout, setUserTokens} from "./auth";
@@ -12,6 +12,7 @@ export function* watchGlobal() {
yield takeEvery(actionTypes.SET_ACTIVE_PAIR_INITIATE, setActivePair);
yield takeEvery(actionTypes.SET_USER_TOKENS_INITIATE, setUserTokens);
yield takeEvery(actionTypes.SET_IPG_INITIATE, setIPGLock);
+ yield takeEvery(actionTypes.SET_VERIFY_EMAIL_LOCK_INITIATE, setVerifyEmailLock);
yield takeEvery(actionTypes.SET_KYC_STATUS_INITIATE, getUserKYCStatus);
yield takeEvery(actionTypes.SET_LAST_PRICE_INITIATE, getExchangeLastPrice);
}
diff --git a/yarn.lock b/yarn.lock
index 8d8e03ab..d1175694 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -9712,12 +9712,12 @@ fsevents@^1.2.7:
languageName: node
linkType: hard
-"js-api-client@https://github.com/opexdev/js-api-client.git#v1.0.1-beta.2":
+"js-api-client@https://github.com/opexdev/js-api-client.git#develop":
version: 1.0.0-beta2
- resolution: "js-api-client@https://github.com/opexdev/js-api-client.git#commit=fb2e24c906a0a3e72fcd6439156e58792a77edc2"
+ resolution: "js-api-client@https://github.com/opexdev/js-api-client.git#commit=c1d7b1525b8382857476aea90ea5646680260471"
peerDependencies:
axios: ^0.22.0
- checksum: 956d60dd6dcb39120d8606f57c9ea4b74aafe7ebf5d31b0ff82fa5b6df90f513a6dd922b87d474730ddf35ad1afea85774673fe383aee3f998e921133261d61a
+ checksum: efc4752afd84c7e2cf70b8b42582f599b70d0cdd89fcd80b84660b98411e4af4ee1041bc49e9eeeac93b4ac3c705704626a368df34e448ceef5976cd24dfe8b5
languageName: node
linkType: hard
@@ -11295,7 +11295,7 @@ fsevents@^1.2.7:
i18next: ^21.8.0
i18next-browser-languagedetector: ^6.1.4
i18next-http-backend: ^1.4.0
- js-api-client: "https://github.com/opexdev/js-api-client.git#v1.0.1-beta.2"
+ js-api-client: "https://github.com/opexdev/js-api-client.git#develop"
jwt-decode: ^3.1.2
lightweight-charts: ^3.8.0
moment-jalaali: ^0.9.2