diff --git a/.env b/.env index 8f57720..8a2ac07 100755 --- a/.env +++ b/.env @@ -14,4 +14,7 @@ REACT_APP_USERS_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfituse REACT_APP_SESSION_EXPIRE_MINUTES=15 REACT_APP_TRACKING="Tracking" -REACT_APP_RESOURCES="Resources" \ No newline at end of file +REACT_APP_RESOURCES="Resources" +REACT_APP_HISTORY="History" + +REACT_APP_TRACKING_SHOW=1 \ No newline at end of file diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..6e7f41d --- /dev/null +++ b/.env.development @@ -0,0 +1,20 @@ +SKIP_PREFLIGHT_CHECK=true + +REACT_APP_FACEBOOK="https://www.facebook.com/profile.php?id=100066498622246" +REACT_APP_TWITTER="https://twitter.com/fluxtra" + +REACT_APP_APPSITE=" https://myfitapp.mermsemr.com" +#REACT_APP_APPSITE="http://localhost:7012" + + +REACT_APP_AUX_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfit" +REACT_APP_USERS_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfituser" +# REACT_APP_PASSWORD_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfituser/resetpass" + +REACT_APP_SESSION_EXPIRE_MINUTES=15 + +REACT_APP_TRACKING="Tracking" +REACT_APP_RESOURCES="Resources" +REACT_APP_HISTORY="History" + +REACT_APP_TRACKING_SHOW=1 diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..f87d2cf --- /dev/null +++ b/.env.production @@ -0,0 +1,20 @@ +SKIP_PREFLIGHT_CHECK=true + +REACT_APP_FACEBOOK="https://www.facebook.com/profile.php?id=100066498622246" +REACT_APP_TWITTER="https://twitter.com/fluxtra" + +REACT_APP_APPSITE=" https://myfitapp.mermsemr.com" +#REACT_APP_APPSITE="http://localhost:7012" + + +REACT_APP_AUX_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfit" +REACT_APP_USERS_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfituser" +# REACT_APP_PASSWORD_ENDPOINT="https://devapi.mermsemr.com/en/desktop/api/v2/myfituser/resetpass" + +REACT_APP_SESSION_EXPIRE_MINUTES=15 + +REACT_APP_TRACKING="Tracking" +REACT_APP_RESOURCES="Resources" +REACT_APP_HISTORY="History" + +REACT_APP_TRACKING_SHOW=0 diff --git a/src/Routers.jsx b/src/Routers.jsx index fdb85ea..247f3c8 100755 --- a/src/Routers.jsx +++ b/src/Routers.jsx @@ -3,6 +3,7 @@ import FourZeroFour from "./components/FourZeroFour"; import ScrollToTop from "./components/Helpers/ScrollToTop"; import MyCollection from "./components/MyCollection"; import Notification from "./components/Notification"; +import ThankYou from "./components/AuthPages/ThankYou"; import AuthRoute from "./middleware/AuthRoute"; import AcitveBidsPage from "./views/AcitveBidsPage"; import AuthProfilePage from "./views/AuthProfilePage"; @@ -50,6 +51,11 @@ export default function Routers() { path="/update-password" element={} /> + } + /> } /> } /> } /> diff --git a/src/components/AuthPages/ForgotPassword/index.jsx b/src/components/AuthPages/ForgotPassword/index.jsx index 5a4e973..1642185 100755 --- a/src/components/AuthPages/ForgotPassword/index.jsx +++ b/src/components/AuthPages/ForgotPassword/index.jsx @@ -20,11 +20,10 @@ export default function ForgotPassword() { function validationChecker(email) { const emailCheck = /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/; if (email === "") { - setValidation("email is required"); + setValidation(""); } else if (!email.match(emailCheck)) { setValidation('Please input a valid email address'); } else { - setValidation(""); setButtonDisabled(false) } } @@ -36,6 +35,10 @@ export default function ForgotPassword() { } const reset = await user.resetPassword(resetEmail); setLoading(true) + + const {raw_data, uuid} = reset.data + localStorage.setItem('reset_uuid', uuid) + localStorage.setItem('reset_raw', JSON.stringify(raw_data)) if (reset.status == 200){ setTimeout(() => { navigate("/verify-you", {replace : true}); diff --git a/src/components/AuthPages/ThankYou/index.jsx b/src/components/AuthPages/ThankYou/index.jsx index 5feabbd..67db609 100755 --- a/src/components/AuthPages/ThankYou/index.jsx +++ b/src/components/AuthPages/ThankYou/index.jsx @@ -1,8 +1,11 @@ import React from "react"; +import AuthLayout from "../../AuthPages/AuthLayout"; export default function ThankYou({ className }) { return ( -
+ +
+ + ); } diff --git a/src/components/AuthPages/UpdatePassword/index.jsx b/src/components/AuthPages/UpdatePassword/index.jsx index 1baf5be..35c4055 100755 --- a/src/components/AuthPages/UpdatePassword/index.jsx +++ b/src/components/AuthPages/UpdatePassword/index.jsx @@ -1,17 +1,87 @@ import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; import titleShape from "../../../assets/images/shape/title-shape-two.svg"; import InputCom from "../../Helpers/Inputs/InputCom"; import AuthLayout from "../AuthLayout"; import ThankYou from "../ThankYou"; +import usersService from "../../../services/UsersService"; export default function UpdatePassword() { - const [updated, setValue] = useState(false); + const [values, setValues] = useState({ + password: '', + confirmPassword: '', + }) const [message, setMessage] = useState(false); - const updatePassword = () => { - setValue(!updated); - setTimeout(() => { - setMessage(!message); - }, 100); + const [validation, setValidation] = useState(""); + const [loading, setLoading] = useState(false); + const updatePass = new usersService() + const navigate = useNavigate() + + const onChange = (e) => { + setValues((prev) => ({ ...prev, [e.target.name]: e.target.value })); + }; + + const updatePassword = async (e) => { + const {username} = JSON.parse(localStorage.getItem('reset_raw')) + const otpCode = localStorage.getItem('otp') + + setLoading(true) + + if(!values.password || !values.confirmPassword){ + setLoading(false) + setValidation("Please Fill empty inputs") + return + } + + const regex = /^[A-Za-z]\w{7,14}$/ + if(regex.test(values.password) == false) { + setLoading(false) + setValidation("it must be a least 7 alphanumeric characters") + return + } + + if (values.password != values.confirmPassword){ + setLoading(false) + setValidation("Password does not match") + return + } + + const newPassword = { + username: username, + reset_uuid: localStorage.getItem('reset_uuid'), + random_text: otpCode, + member_uid: localStorage.getItem('member_uid'), + new_password: values.password, + stage: 300 + } + + delete values.confirmPassword + + try { + const confirm = await updatePass.resetPassword(newPassword) + console.log(confirm) + + if(confirm.status != 200){ + setLoading(false) + setValidation("Sorry, could not verify code") + return + } + + localStorage.removeItem('reset_uuid') + localStorage.removeItem('reset_raw') + localStorage.removeItem('otp') + + if(confirm.status == 200){ + setValidation("Password updated") + setTimeout(() => { + setLoading(false) + navigate("/confirm-reset", {replace : true}); + }, 2000); + } + } catch (error) { + setLoading(false) + setValidation("An error occurred") + } }; return ( @@ -19,7 +89,6 @@ export default function UpdatePassword() { - {updated === false ? (
@@ -32,7 +101,7 @@ export default function UpdatePassword() {
-
+ {/*
-
+
*/}
+ {validation &&

{validation}

}
- - ) : ( - - )} + + {/* // : ( + // + // )} */}
); diff --git a/src/components/AuthPages/VerifyYou/Otp.jsx b/src/components/AuthPages/VerifyYou/Otp.jsx index ea07d94..827ae98 100755 --- a/src/components/AuthPages/VerifyYou/Otp.jsx +++ b/src/components/AuthPages/VerifyYou/Otp.jsx @@ -1,18 +1,26 @@ import React, { useEffect } from "react"; -export default function Otp() { +export default function Otp({handleChange, value}) { useEffect(() => { const otp = document.querySelector("#otp-inputs"); // eslint-disable-next-line no-restricted-syntax for (const pin of otp.children) { // eslint-disable-next-line no-loop-func - pin.onkeyup = () => { - if (pin.nextSibling) { - pin.nextSibling.children.otp.focus(); + pin.onkeyup = (value) => { + if(pin.children){ + if(value.key === '' || value.key === ' ' || value.key === 'ArrowRight' || value.key === 'ArrowLeft' || value.key === 'ArrowUp' || value.key === 'ArrowDown' || value.key === 'Tab') return; + if(value.key === 'Backspace'){ + if(pin.previousSibling){ + pin.previousSibling.children.otp.focus(); + } else {return;} + } else { + pin.nextSibling.children.otp.focus(); + } } - }; - } - }); + }; + } + }, []); + return ( <>
@@ -33,6 +44,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_two' + value={value.value_two} + onChange={handleChange} />
@@ -41,6 +55,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_three' + value={value.value_three} + onChange={handleChange} />
@@ -49,6 +66,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_four' + value={value.value_four} + onChange={handleChange} />
@@ -57,6 +77,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_five' + value={value.value_five} + onChange={handleChange} />
@@ -65,6 +88,9 @@ export default function Otp() { type="text" maxLength={1} id="otp" + name='value_six' + value={value.value_six} + onChange={handleChange} />
diff --git a/src/components/AuthPages/VerifyYou/index.jsx b/src/components/AuthPages/VerifyYou/index.jsx index 9bd0816..c170da0 100755 --- a/src/components/AuthPages/VerifyYou/index.jsx +++ b/src/components/AuthPages/VerifyYou/index.jsx @@ -1,9 +1,90 @@ -import React from "react"; +import React,{useState} from "react"; +import {useNavigate} from "react-router-dom" import titleShape from "../../../assets/images/shape/text-shape-three.svg"; import AuthLayout from "../AuthLayout"; import Otp from "./Otp"; +import usersService from "../../../services/UsersService"; export default function VerifyYou() { + const [loading, setLoading] = useState(false); + const [validation, setValidation] = useState(""); + const verifyOTP = new usersService() + const navigate = useNavigate() + + const [verificationCode, setVerificationCode] = useState({ + value_one: '', + value_two: '' + }) + + const handleVerificationInput = ({target:{name, value}}) => { + setVerificationCode(prev => { + return {...prev, [name]:value} + }) + } + + const handleSubmit = async() => { + setValidation("") + setLoading(true) + + let otpCode = ''; + for(let values in verificationCode){ + otpCode+=verificationCode[values] + } + + // Validating otp code + if(!otpCode) { + setLoading(false) + setValidation("Please enter your otp code") + return + } + if(otpCode.length < 6) { + setLoading(false) + setValidation("OTP code incomplete") + return + } + + const {username} = JSON.parse(localStorage.getItem('reset_raw')) + const verifyEmail = { + username: username, + stage: 200, + reset_uuid: localStorage.getItem('reset_uuid'), + random_text: otpCode + } + + localStorage.setItem('otp', otpCode) + + try { + const verify = await verifyOTP.resetPassword(verifyEmail); + console.log(verify) + localStorage.setItem('member_uid', verify.data.member_uid); + if (verify.status != 200){ + setValidation("Sorry, could not verify code") + setLoading(false) + return + } + + if (verify.status == 200){ + + if(verify?.data.error_msg == "Unable to continue"){ + setLoading(false) + setValidation("Incorrect otp code") + return + } + + setValidation("verified successfully") + + setTimeout(() => { + setLoading(false) + navigate("/update-password", {replace : true}); + }, 2000); + return + } + } catch (error) { + setLoading(false) + setValidation('An error occurred') + } + } + return ( <>
- + + {validation &&

{validation}

}

Dont’t have an aceount ? - - Please resend + + Sign Up

diff --git a/src/components/Reminders/ReminderTable.jsx b/src/components/Reminders/ReminderTable.jsx index 400fefc..aa2aaaf 100755 --- a/src/components/Reminders/ReminderTable.jsx +++ b/src/components/Reminders/ReminderTable.jsx @@ -82,127 +82,138 @@ export default function ReminderTable({ className }) {
- - - - - - - + <> + + + + + + + + + { userReminders[0].reminders.length > 0 && ( selectedCategory == "All category" ? ( userReminders[0].reminders.map((reminder, index) => ( - - */} + + + + + - - - - - + + + + {/* */} + )) ) : userReminders[0].reminders.map((reminder, index) => { if(reminder.category == selectedCategory){ return ( - - */} + + + + + - - - - + + + {/* */} + ) } }) diff --git a/src/index.css b/src/index.css index 857404e..8882336 100755 --- a/src/index.css +++ b/src/index.css @@ -365,9 +365,15 @@ input[type="number"] { .trending-products .slick-list { margin: 0 -16px; } -.update-table table tr:last-child { + +/* .update-table table tr:last-child { border-bottom: none; +} */ + +.update-table table tr.spacer { + height: 10px; } + /* TODO: =================================HomePage end================================ */ /* TODO: =================================my wallet end================================ */ .circle-count { diff --git a/src/services/UsersService.js b/src/services/UsersService.js index ac406ef..5ce3c2d 100644 --- a/src/services/UsersService.js +++ b/src/services/UsersService.js @@ -36,6 +36,13 @@ class usersService { return this.getAuxEnd("/reminders", reqData); } + getUserHomeStats(){ + var reqData = { + member_id: localStorage.getItem("member_id") + }; + return this.getAuxEnd("/home-stats", reqData); + } + getUserLoginHistory(){ var reqData = { member_id: localStorage.getItem("member_id")
ItemStartEndReminder.
ItemStartEndReminder.
-
-
- data -
-
-

- {reminder.description.substring(0, 30)+ ' ...'} -

- - - Added - {/* {new Date(reminder.added).toLocaleString().replace(/-/g, '/')} */} - {reminder.added.split(' ')[0]} + <> + {/*
+
+
+ data +
+
+

+ {reminder.description.substring(0, 30)+ ' ...'} +

+ + + Added + {/* {new Date(reminder.added).toLocaleString().replace(/-/g, '/')} */} + {reminder.added.split(' ')[0]} + + +
+
+
+
+ + + {/* {new Date(reminder.start_date).toLocaleString().replace(/-/g, '/')} */} + {reminder.start_date.split(' ')[0]} + +
+
+
+ + {/* {new Date(reminder.end_date).toLocaleString().replace(/-/g, '/')} */} + {reminder.end_date.split(' ')[0]} + +
+
+ + {reminder.reminder} - - - - -
- - - {/* {new Date(reminder.start_date).toLocaleString().replace(/-/g, '/')} */} - {reminder.start_date.split(' ')[0]} - -
-
-
- - {/* {new Date(reminder.end_date).toLocaleString().replace(/-/g, '/')} */} - {reminder.end_date.split(' ')[0]} - -
-
- - {reminder.reminder} - - - Edit -
+ Edit +
-
-
- data -
-
-

- {reminder.description.substring(0, 30)+ ' ...'} -

- - - Added - {new Date(reminder.added).toLocaleString().replace(/-/g, '/')} + <> + {/*
+
+
+ data +
+
+

+ {reminder.description.substring(0, 30)+ ' ...'} +

+ + + Added + {new Date(reminder.added).toLocaleString().replace(/-/g, '/')} + + +
+
+
+
+ + + {new Date(reminder.start_date).toLocaleString().replace(/-/g, '/')} + +
+
+
+ + {new Date(reminder.end_date).toLocaleString().replace(/-/g, '/')} + +
+
+ + {reminder.reminder} - - - - -
- - - {new Date(reminder.start_date).toLocaleString().replace(/-/g, '/')} - -
-
-
- - {new Date(reminder.end_date).toLocaleString().replace(/-/g, '/')} - -
-
- - {reminder.reminder} - - - {/* */} - Edit - + {/* */} + Edit +