From 4e54041a39707bb8e9faca25a7ec997e6cce6537 Mon Sep 17 00:00:00 2001 From: kennethoyahebholo Date: Fri, 9 Feb 2024 13:18:44 +0100 Subject: [PATCH 01/12] Revert "Merge pull request #7 from Daddysboi/staging-sync-v2" This reverts commit a0bb10a99a1a8cb21497bab204e32ed8663d01d2, reversing changes made to bf900787e07f2be8279df9cab9c21cc6f9d48f16. --- src/App.css | 30 ++-- src/App.js | 12 +- src/Components/Dashboard/Dashboard.js | 170 +++++------------- src/Components/Dashboard/Header.Dashboard.js | 23 +-- .../Dashboard/Home/Home.Dashboard.js | 159 +++------------- .../Dashboard/Home/TransactionPopup.Home.js | 94 ++++------ .../Dashboard/Resolution.Dashboard.js | 132 +------------- src/Components/Dashboard/Tracker.Dashboard.js | 145 +-------------- src/Data/Table_transaction_data.json | 0 src/Pages/PrivacyPolicy.js | 31 ++-- src/Pages/SignIn.js | 4 +- src/Pages/SignUp.js | 47 +---- src/Pages/TermsofService.js | 32 ++-- 13 files changed, 175 insertions(+), 704 deletions(-) delete mode 100644 src/Data/Table_transaction_data.json diff --git a/src/App.css b/src/App.css index c2979dc..b1fa935 100644 --- a/src/App.css +++ b/src/App.css @@ -1,5 +1,5 @@ -@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;500;700;800;900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;500;700;800;900&display=swap"); .paystack-button { @@ -8,15 +8,25 @@ font-size: 10px; letter-spacing: 0.1rem; text-transform: uppercase; - background-color: #0fef31; + background-color: #00ff00; font-weight: bold; - color: #e0eafc; + color: #ffffff; border: none; border-radius: 5px; - width: 30%; - height: 30px; - margin-top: 10px; - &:hover{ - background-color: #026712; - } -} \ No newline at end of file + width: 5rem; + height: 2rem; + margin: 2rem 0; + + transition: background-color 0.3s; + display: block; +} + +.paystack-button:hover { + background-color: #00cc00; +} + +.paystack-button:focus { + outline: none; +} + + diff --git a/src/App.js b/src/App.js index 14da5aa..513854e 100644 --- a/src/App.js +++ b/src/App.js @@ -22,7 +22,6 @@ import ForgotPassword from "./Pages/ForgotPassword"; import ResetPassword from "./Pages/ResetPassword"; import Otp from "./Pages/Otp"; import ConfirmTransaction from "./Pages/ConfirmTransaction"; -import AuthGuard from "./AuthGuard"; export const userContext = createContext(); @@ -33,19 +32,12 @@ const router = createBrowserRouter( } /> } /> - } /> } /> - - - - } - /> + } /> + }> }> } /> - active && - css` - color: #4db6ac; - border-radius: 0.5rem; - padding: 0.5rem; - `} - &:hover { - color: #4db6ac; - border-radius: 0.5rem; - padding: 0.5rem; - } - @media only screen and (min-width: 320px) and (max-width: 480px) { - } - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } -`; - -const StyledBtnName = styled.span` - @media only screen and (min-width: 320px) and (max-width: 480px) { - display: none; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } -`; - -const StyledFontAwesomeIcon = styled(FontAwesomeIcon)` - padding-right: 0.5rem; `; const SignoutLink = styled(Link)` @@ -135,16 +76,6 @@ const SignoutLink = styled(Link)` color: #ffffff; font-size: 0.6rem; text-decoration: none; - ${({ active }) => - active && - css` - color: #4db6ac; - border-radius: 0.5rem; - `} - &:hover { - color: #4db6ac; - border-radius: 0.5rem; - } `; const StyledRight = styled.div` @@ -155,30 +86,8 @@ const StyledRight = styled.div` &::-webkit-scrollbar { width: 0; } - @media only screen and (min-width: 320px) and (max-width: 480px) { - margin-left: 5rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - margin-left: 8rem; - } `; -const StyledFontAwesomeIconSignOut = styled(FontAwesomeIcon)` - padding-right: 0.5rem; -`; - -const StyledSignOutTxt = styled.span` - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - display: none; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } -`; const initialState = { page: "home", initialLoad: true, @@ -200,15 +109,14 @@ const Dashboard = () => { const [state, dispatch] = useReducer(reducer, initialState); const { page, initialLoad } = state; const { userId } = useParams(); - const { setProfile, setUser } = useContext(userContext); const { user } = useAppSelector((state) => state.user); console.log("my user", user); const logOut = () => { googleLogout(); - setUser({}); - setProfile({}); + setUser({}); // Clear user state + setProfile({}); // Clear profile state localStorage.removeItem("token"); localStorage.removeItem(USER_TOKEN); localStorage.removeItem(USER_ID); @@ -234,56 +142,76 @@ const Dashboard = () => { active={page === "home"} onClick={() => navigateTo("home")} > - - Home + + Home navigateTo("profile")} > - - Profile + + Profile navigateTo("transactions")} > - - Transactions + + Transactions navigateTo("wallet")} > - - Wallet + + Wallet navigateTo("settings")} > - - Settings + + Settings navigateTo("tracker")} > - - Tracking + + Order Tracker navigateTo("resolution")} > - - Resolution + + Resolution - - Sign Out + Sign Out diff --git a/src/Components/Dashboard/Header.Dashboard.js b/src/Components/Dashboard/Header.Dashboard.js index 20f7474..285cba6 100644 --- a/src/Components/Dashboard/Header.Dashboard.js +++ b/src/Components/Dashboard/Header.Dashboard.js @@ -1,13 +1,12 @@ import React, { useState, useEffect, useContext } from "react"; import styled from "styled-components"; import { NavLink } from "react-router-dom"; +import logo from "../../assets/logo/favicon.png"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faUser } from "@fortawesome/free-regular-svg-icons"; import axios from "axios"; import Switch from "react-switch"; - import { userContext } from "../../App"; -import logo from "../../assets/logo/favicon.png"; const StyledContainer = styled.div` display: flex; @@ -20,26 +19,19 @@ const StyledContainer = styled.div` top: 0; background: #ffffff; z-index: 1; - align-items: center; - justify-content: space-between; `; const StyledLogo = styled(NavLink)` color: #f26600; font-size: 2rem; text-decoration: none; - - font-weight: 600; `; const StyledImg = styled.img` height: 2rem; - padding-right: 0.5rem; `; -const StyledAccount = styled.div` - font-size: 0.9rem; -`; +const StyledAccount = styled.div``; const StyledNavLink = styled(NavLink)` color: black; @@ -54,7 +46,7 @@ const StyledProfilePix = styled.img` `; const StyledAccountIcon = styled(FontAwesomeIcon)` - font-size: 1rem; + font-size: 1.5rem; color: gray; `; @@ -100,6 +92,7 @@ const Header = () => { if (res.status === 200) { const contentType = res.headers["content-type"]; if (contentType.includes("image")) { + // console.log("Image data:", res.data); setUserData((prevUserData) => ({ ...prevUserData, profilePicture: url, @@ -107,6 +100,8 @@ const Header = () => { } } else { console.error("Failed to fetch user data"); + const jsonData = JSON.parse(new TextDecoder().decode(res.data)); + console.log("JSON data:", jsonData); } } catch (error) { console.error("Error loading user data:", error); @@ -131,13 +126,13 @@ const Header = () => { ) : ( <> - {profile && profile.picture ? ( - + {profile.picture ? ( + ) : ( )} - {profile && profile.name ? profile.name : "User"} + {profile.name || "User"} )} diff --git a/src/Components/Dashboard/Home/Home.Dashboard.js b/src/Components/Dashboard/Home/Home.Dashboard.js index fe8baaf..a36a14a 100644 --- a/src/Components/Dashboard/Home/Home.Dashboard.js +++ b/src/Components/Dashboard/Home/Home.Dashboard.js @@ -13,26 +13,6 @@ const StyledCardContainerTop = styled.div` gap: 1rem; margin-bottom: 2rem; flex-wrap: wrap; - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - width: 5rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } -`; - -const StyledCardPair = styled.div` - display: flex; - gap: 1rem; - - @media only screen and (min-width: 320px) and (max-width: 480px) { - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } `; const StyledCard = styled.div` @@ -41,14 +21,6 @@ const StyledCard = styled.div` width: 8.7rem; height: 5rem; padding: 0.2rem 1.2rem; - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - width: 5rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } `; const StyledCardTxt = styled.p` @@ -59,14 +31,6 @@ const StyledCardContainerMid = styled.div` display: flex; flex-wrap: wrap; gap: 3rem; - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - margin-bottom: 2rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } `; const StyledWalletCard = styled.div` @@ -101,18 +65,10 @@ const StyledBtnCreate = styled.button` const StyledCardOngoing = styled.div` height: 14rem; + font-size: 1rem; font-weight: 400; width: 30rem; - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - width: 15rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - width: 17rem; - } `; const StyledCardOngoingTop = styled.div` @@ -138,17 +94,7 @@ const StyledLine = styled.div` background: #000000; opacity: 0.2; margin-bottom: 1rem; - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - width: 12rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - width: 14rem; - } `; - const StyledDetailsBtn = styled.button` background-color: #4db6ac; color: #ffffff; @@ -157,34 +103,6 @@ const StyledDetailsBtn = styled.button` border: none; `; -const StyledHeaderBtm = styled.h4` - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - display: none; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } -`; - -const StyledFontAwesomeIcon = styled(FontAwesomeIcon)` - margin-right: 0.5rem; - color: #4db6ac; - - &:hover { - color: #02041d; - } - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - display: none; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - } -`; - const StyledCardContainerBtm = styled.div` height: 8rem; border-radius: 0.5rem; @@ -193,15 +111,6 @@ const StyledCardContainerBtm = styled.div` margin-top: 1rem; /* width: 50vw; */ - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - display: none; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - height: 13rem; - } // Small screens, laptops @media only screen and (min-width: 769px) and (max-width: 1024px) { height: 13rem; @@ -223,26 +132,6 @@ const StyledTh = styled.th` font-weight: 400; padding-right: 2.2rem; padding-bottom: 0.5rem; - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - padding-right: 2.2rem; - } - - // iPads, Tablets - @media only screen and (min-width: 481px) and (max-width: 768px) { - padding-right: 1rem; - } - // Small screens, laptops - @media only screen and (min-width: 769px) and (max-width: 1024px) { - } - - // Desktops, large screens - @media only screen and (min-width: 1025px) and (max-width: 1200px) { - } - - // Extra large screens, TV - @media only screen and (min-width: 1201px) { - } `; const StyledTd = styled.td` font-size: 0.7rem; @@ -288,26 +177,22 @@ const Home = () => {
- - - Total Transactions -

{totalTransactions}

-
- - Wallet Balance -

NGN {walletBalance.toFixed(2)}

-
-
- - - Withdrawal -

{withdrawalCount}

-
- - Deposit -

NGN {depositCount.toFixed(2)}

-
-
+ + Total Transactions +

{totalTransactions}

+
+ + Wallet Balance +

NGN {walletBalance.toFixed(2)}

+
+ + Withdrawal +

{withdrawalCount}

+
+ + Deposit +

NGN {depositCount.toFixed(2)}

+
@@ -329,13 +214,13 @@ const Home = () => {
- {}} + style={{ marginRight: "0.5rem", color: "#4db6ac" }} /> - {}} + style={{ color: "#4db6ac" }} />
@@ -367,7 +252,7 @@ const Home = () => {
- Recent Transactions +

Recent Transactions

diff --git a/src/Components/Dashboard/Home/TransactionPopup.Home.js b/src/Components/Dashboard/Home/TransactionPopup.Home.js index c04be6d..7a59df2 100644 --- a/src/Components/Dashboard/Home/TransactionPopup.Home.js +++ b/src/Components/Dashboard/Home/TransactionPopup.Home.js @@ -10,6 +10,8 @@ import { faTools, faMoneyBillWave, } from "@fortawesome/free-solid-svg-icons"; +import { toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; import { PaystackButton } from "react-paystack"; import styled from "styled-components"; import axios from "axios"; @@ -20,9 +22,13 @@ import { useAppDispatch } from "../../../redux/hooks"; const StyledModal = styled(Modal)` margin-top: 15rem; + background-color: #ffffff; + align-items: center; justify-content: center; + /* margin: 5rem; */ + width: 100%; .close-button { position: absolute; @@ -33,14 +39,9 @@ const StyledModal = styled(Modal)` .bm-burger-bars { background: #373a47; } - // Mobile devices - @media only screen and (min-width: 320px) and (max-width: 480px) { - margin-left: 10rem; - } `; - const StyledHeader = styled.h2` - font-size: 1.2rem; + font-size: 1.5rem; `; const StyledBtnRole = styled.button` @@ -51,13 +52,13 @@ const StyledBtnRole = styled.button` border-radius: 5px; cursor: pointer; transition: background-color 0.3s; + &:hover { background-color: transparent; border: 2px solid #f8701c; color: #f8701c; } `; - const StyledButton = styled.button` background-color: #f26600; color: #ffffff; @@ -67,7 +68,7 @@ const StyledButton = styled.button` cursor: pointer; transition: background-color 0.3s; position: absolute; - bottom: 1rem; + bottom: 0.5rem; right: 6rem; &:hover { @@ -81,11 +82,8 @@ const StyledFormDiv = styled.div` background-color: transparent; padding: 20px; border-radius: 10px; -`; - -const Styledlabel = styled.label` - margin-top: 1rem; - font-size: 0.7rem; + /* position: relative; */ + /* box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); */ `; const StyledBackButton = styled.button` @@ -97,8 +95,7 @@ const StyledBackButton = styled.button` cursor: pointer; transition: background-color 0.3s, color 0.3s; position: absolute; - bottom: 1rem; - padding: 8px; + bottom: 0.5rem; right: 2rem; &:hover { background-color: #f26600; @@ -107,19 +104,15 @@ const StyledBackButton = styled.button` `; const StyledInput = styled.input` + /* width: 100%; */ + /* margin: 10px 0; */ padding: 0.2rem; - border: 1px solid rgba(223, 140, 82, 0.3); + border: 1px solid #000000; border-radius: 3px; display: block; `; -const StyledError = styled.p` - color: red; - font-size: 0.5rem; -`; - Modal.setAppElement("#root"); - const TransactionFormPopup = ({ isOpen, onRequestClose, @@ -253,7 +246,7 @@ const TransactionFormPopup = ({ return ( Create Transaction - Select your role: +
{formik.errors.role && formik.touched.role && ( - {formik.errors.role} +
{formik.errors.role}
)}
); @@ -283,9 +276,7 @@ const TransactionFormPopup = ({ return ( Transaction Type - - Select transaction type: - +
{formik.errors.transactionType && formik.touched.transactionType && ( - {formik.errors.transactionType} +
{formik.errors.transactionType}
)} ); @@ -318,7 +309,7 @@ const TransactionFormPopup = ({ Transaction Details {formik.values.transactionType && (
- Transaction amount: + {formik.errors.amount && formik.touched.amount && ( - {formik.errors.amount} +
{formik.errors.amount}
)}
)} {formik.values.transactionType && (
- - Delivery address: - + {formik.errors.deliveryAddress && formik.touched.deliveryAddress && ( - {formik.errors.deliveryAddress} +
{formik.errors.deliveryAddress}
)} {formik.values.transactionType && (
- + + {formik.errors.productName && formik.touched.productName && ( - {formik.errors.productName} +
{formik.errors.productName}
)}
)} @@ -373,7 +362,7 @@ const TransactionFormPopup = ({ {currentStep === "payment" && (
- + + Agree with terms and conditions + {formik.errors.termsAndConditions && formik.touched.termsAndConditions && ( - - {formik.errors.termsAndConditions} - +
{formik.errors.termsAndConditions}
)}
)} @@ -398,9 +384,7 @@ const TransactionFormPopup = ({ return (
Invite Counterparty - - Counterparty name: - + {formik.errors.counterpartyName && formik.touched.counterpartyName && ( - {formik.errors.counterpartyName} +
{formik.errors.counterpartyName}
)} - Email: + {formik.errors.counterpartyEmail}
)} - Phone Number: + {formik.errors.counterpartyPhone && formik.touched.counterpartyPhone && ( - {formik.errors.counterpartyPhone} +
{formik.errors.counterpartyPhone}
)}
); @@ -447,9 +431,7 @@ const TransactionFormPopup = ({ return (
Set Conditions - - Enter terms for purchase: - + {formik.errors.setConditions && formik.touched.setConditions && ( - {formik.errors.setConditions} +
{formik.errors.setConditions}
)}
); @@ -478,7 +460,7 @@ const TransactionFormPopup = ({ { - const [loading, setLoading] = useState(false); - const dispatch = useAppDispatch(); - const disputeFormik = useFormik({ - initialValues: { - transactionId: "", - reason: "", - description: "", - }, - validationSchema: disputeValidationSchema, - onSubmit: async (values, { resetForm }) => { - setLoading(true); - let request = { - transactionId: values.transactionId, - reason: values.reason, - description: values.description, - }; - dispatch(disputeTransaction(request)) - .then((resp) => { - if (resp?.payload?.status !== 201) { - toast.error(resp?.payload?.message || "Something went wrong"); - setLoading(false); - return; - } - toast.success( - resp?.payload?.message || "Dispute submitted successfully" - ); - resetForm(); - setLoading(false); - }) - .catch((error) => { - toast.error(error?.message || "Something went wrong"); - setLoading(false); - }); - }, - }); - - return ( - - Dispute Transaction - - - 0 && - disputeFormik.errors.transactionId - } - /> - 0 && disputeFormik.errors.reason} - /> - 0 && disputeFormik.errors.description - } - /> - - {loading ? "Submitting..." : "Dispute"} - - - - - ); + return
Resolution
; }; export default Resolution; diff --git a/src/Components/Dashboard/Tracker.Dashboard.js b/src/Components/Dashboard/Tracker.Dashboard.js index 98be2ef..3d0e31f 100644 --- a/src/Components/Dashboard/Tracker.Dashboard.js +++ b/src/Components/Dashboard/Tracker.Dashboard.js @@ -1,148 +1,7 @@ -import React, { useState } from "react"; -import styled from "styled-components"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faCodeCommit } from "@fortawesome/free-solid-svg-icons"; - -const TrackerContainer = styled.div` - margin: 0 auto; - padding: 20px; -`; - -const TrackerHeader = styled.h2` - font-size: 1.5rem; - margin-bottom: 20px; -`; - -const MilestoneList = styled.ul` - list-style: none; - padding: 0; - margin-top: 4rem; -`; - -const StyledInput = styled.input` - width: 20rem; - min-height: 42px; - padding: 0.5rem; - box-sizing: border-box; - border-radius: 0.3rem; - border: 1px solid rgba(223, 140, 82, 0.3); - outline: none; - &::placeholder { - opacity: 0.5; - } - &:focus { - border: 1px solid rgb(194, 194, 194); - } -`; - -const MilestoneItem = styled.li` - display: flex; - align-items: center; - margin-bottom: 20px; - position: relative; -`; - -const IconWrapper = styled.div` - margin-right: 10px; - transform: rotate(90deg); -`; - -const Line = styled.div` - width: 1px; - background-color: #4db6ac; - position: absolute; - top: ${({ top }) => top}px; - bottom: ${({ bottom }) => bottom}px; - left: 5px; -`; - -const MilestoneText = styled.div` - display: flex; - align-items: flex-start; -`; - -const LocationText = styled.div` - font-size: 1rem; - margin-right: 10px; -`; - -const DateTimeWrapper = styled.div` - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; -`; - -const DateText = styled.div` - color: #4db6ac; - font-size: 0.55rem; -`; - -const TimeText = styled.div` - font-size: 0.55rem; - color: #4db6ac; -`; - -const SubmitButton = styled.button` - background-color: #4db6ac; - border: none; - padding: 10px 20px; - border-radius: 5px; - color: white; - cursor: pointer; - transition: background-color 0.3s ease; - margin-left: 3rem; - min-height: 42px; - - &:hover { - background-color: #45a99e; - } -`; +import React from "react"; const Tracker = () => { - const [currentLocation, setCurrentLocation] = useState(""); - const [milestones, setMilestones] = useState([]); - - const handleSubmit = () => { - if (currentLocation.trim() !== "") { - const timestamp = new Date().toLocaleString().replace(/\//g, "-"); // Replace / with - - setMilestones([...milestones, { location: currentLocation, timestamp }]); - setCurrentLocation(""); - } - }; - - return ( - - Order Tracking -
- setCurrentLocation(e.target.value)} - /> - Submit Location -
- -

Current Stop

- {milestones.map((milestone, index) => ( - - {index !== 0 && } - - - - - {milestone.location} - - {milestone.timestamp.split(" ")[0]} - {milestone.timestamp.split(" ")[1]} - - - - ))} -
-
- ); + return
Tracker Coming soon
; }; export default Tracker; diff --git a/src/Data/Table_transaction_data.json b/src/Data/Table_transaction_data.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/Pages/PrivacyPolicy.js b/src/Pages/PrivacyPolicy.js index c61bf38..02bf432 100644 --- a/src/Pages/PrivacyPolicy.js +++ b/src/Pages/PrivacyPolicy.js @@ -1,24 +1,15 @@ -import styled from "styled-components"; - -const StyledContainer = styled.div` - padding: 3rem; -`; - -const StyledSubHead = styled.div` - font-size: 1rem; - font-weight: bold; -`; +import React from "react"; const PrivacyPolicy = () => { return ( - +

Privacy Policy

- Introduction +

Introduction

Welcome to Settl's Privacy Policy. This Privacy Policy describes how Settl ("we," "us," or "our") collects, uses, and shares information @@ -29,7 +20,7 @@ const PrivacyPolicy = () => {

- Information We Collect +

Information We Collect

We collect several types of information from and about users of our Services, including: @@ -47,7 +38,7 @@ const PrivacyPolicy = () => {

- How We Use Your Information +

How We Use Your Information

We use information that we collect about you or that you provide to us, including any personal information, for various purposes @@ -55,7 +46,7 @@ const PrivacyPolicy = () => {

- Sharing of Your Information +

Sharing of Your Information

We may share your personal information with:

  • Our subsidiaries and affiliates.
  • @@ -64,7 +55,7 @@ const PrivacyPolicy = () => {
- Security +

Security

We have implemented measures designed to secure your personal information from accidental loss and from unauthorized access, use, @@ -73,7 +64,7 @@ const PrivacyPolicy = () => {

- Changes to Our Privacy Policy +

Changes to Our Privacy Policy

We may update our Privacy Policy from time to time. If we make changes, we will notify you by revising the date at the top of the @@ -82,14 +73,14 @@ const PrivacyPolicy = () => {

- Contact Information +

Contact Information

If you have any questions about this Privacy Policy, please contact - us at support@settl.com + us at:

- +
); }; diff --git a/src/Pages/SignIn.js b/src/Pages/SignIn.js index 8b49d5d..7666254 100644 --- a/src/Pages/SignIn.js +++ b/src/Pages/SignIn.js @@ -104,13 +104,14 @@ const loginValidationSchema = Yup?.object()?.shape({ const SignIn = () => { const [loading, setLoading] = useState(false); const dispatch = useAppDispatch(); - const { user, setUser, setProfile } = useContext(userContext); + const { user, setUser, profile, setProfile } = useContext(userContext); const inputRef = useRef(); const navigate = useNavigate(); const googleLogin = useGoogleLogin({ onSuccess: (codeResponse) => { setUser(codeResponse); + navigate(`/dashboard`); }, onError: (error) => console.log("Login Failed:", error), }); @@ -127,7 +128,6 @@ const SignIn = () => { }) .then((res) => { setProfile(res.data); - navigate(`/dashboard`); }) .catch((err) => { console.error("Google API Error:", err); diff --git a/src/Pages/SignUp.js b/src/Pages/SignUp.js index feb84e2..e7cc6d7 100644 --- a/src/Pages/SignUp.js +++ b/src/Pages/SignUp.js @@ -1,21 +1,18 @@ -import React, { useState, useRef, useContext, useEffect } from "react"; +import React, { useState, useRef } from "react"; import { NavLink, Link, useNavigate } from "react-router-dom"; import { styled } from "styled-components"; import { useFormik } from "formik"; import { toast } from "react-toastify"; -import "react-toastify/dist/ReactToastify.css"; -import { useGoogleLogin } from "@react-oauth/google"; import * as Yup from "yup"; import { sendOtp } from "../features/registerSlice"; import { useAppDispatch } from "../redux/hooks"; import { TailSpin as Loader } from "react-loader-spinner"; -import axios from "axios"; - import AuthBackground from "../Components/LayoutComponents/AuthBackground"; import AppSelectInput from "../Components/ReUseableComponent/AppSelectInput"; import AppInput from "../Components/ReUseableComponent/AppInput"; + import googleImg from "../assets/images/flat-color-icons_google.svg"; -import { userContext } from "../App"; +import "react-toastify/dist/ReactToastify.css"; //Form const StyledForm = styled.form` @@ -110,7 +107,6 @@ const Signup = () => { const [loading, setLoading] = useState(false); const dispatch = useAppDispatch(); const inputRef = useRef(); - const { user, setUser, setProfile } = useContext(userContext); const navigate = useNavigate(); @@ -124,7 +120,6 @@ const Signup = () => { role: "", }, validationSchema: RegisterSchema, //causin problems so i comment it out - onSubmit: async (values, { resetForm }) => { console.log(values); setLoading(true); @@ -154,36 +149,6 @@ const Signup = () => { }, }); - const googleLogin = useGoogleLogin({ - onSuccess: (codeResponse) => { - // console.log("Google login success:", codeResponse); - // setUser(codeResponse); - // localStorage.setItem("googleUser", JSON.stringify(codeResponse)); - }, - onError: (error) => console.log("Login Failed:", error), - }); - - useEffect(() => { - // if (user && user.access_token) { - // axios - // .get("https://www.googleapis.com/oauth2/v1/userinfo", { - // params: { access_token: user.access_token }, - // headers: { - // Authorization: `Bearer ${user.access_token}`, - // Accept: "application/json", - // }, - // }) - // .then((res) => { - // setProfile(res.data); - // localStorage.setItem("googleUser", JSON.stringify(res.data)); - // navigate(`/dashboard`); - // }) - // .catch((err) => { - // console.error("Google API Error:", err); - // }); - // } - }, [user]); - const roleOptions = [ { label: "Buyer", value: "buyer" }, { label: "Seller", value: "seller" }, @@ -259,14 +224,14 @@ const Signup = () => { registerFormik.errors.confirmPassword } /> - {/* 0 && registerFormik.errors.role} - /> */} + /> {loading && ( { or - googleLogin()}> + {}}> googleImg { return ( - +

Terms and Conditions

- 1. Acceptance of Terms +

1. Acceptance of Terms

By using Settl's services, you agree to comply with and be bound by these Terms and Conditions. @@ -25,7 +17,7 @@ const TermsAndConditions = () => {

- 2. User Responsibilities +

2. User Responsibilities

You are responsible for maintaining the confidentiality of your account and password and for restricting access to your account. @@ -33,7 +25,7 @@ const TermsAndConditions = () => {

- 3. Prohibited Conduct +

3. Prohibited Conduct

You shall not engage in any conduct that, in our sole discretion, restricts or inhibits any other user from using or enjoying the @@ -42,7 +34,7 @@ const TermsAndConditions = () => {

- 4. Limitation of Liability +

4. Limitation of Liability

We shall not be liable for any indirect, incidental, special, consequential, or punitive damages, or any loss of profits or @@ -51,15 +43,15 @@ const TermsAndConditions = () => {

- 5. Governing Law +

5. Governing Law

These Terms and Conditions are governed by and construed in - accordance with the laws of Nigeria. + accordance with the laws of [Your Jurisdiction].

- 6. Changes to Terms +

6. Changes to Terms

We reserve the right to change these Terms and Conditions at any time. Updated terms will be effective upon posting. @@ -67,14 +59,14 @@ const TermsAndConditions = () => {

- Contact Information +

Contact Information

If you have any questions about these Terms and Conditions, please - contact us at support@settl.com + contact us at:

- +
); }; From 21be4c7f984bb4632c9ec71de4df3b6f38467f9c Mon Sep 17 00:00:00 2001 From: kennethoyahebholo Date: Fri, 9 Feb 2024 13:30:55 +0100 Subject: [PATCH 02/12] navigation bug fix --- src/Pages/ConfirmTransaction.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Pages/ConfirmTransaction.js b/src/Pages/ConfirmTransaction.js index 1addc2b..f272fce 100644 --- a/src/Pages/ConfirmTransaction.js +++ b/src/Pages/ConfirmTransaction.js @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; -import { useLocation } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { TailSpin as Loader } from "react-loader-spinner"; import styled from "styled-components"; import { toast } from "react-toastify"; @@ -35,8 +35,8 @@ const ConfirmTransaction = () => { const action = params.get("action"); const transactionId = params.get("transactionId"); const dispatch = useAppDispatch(); - const [processingTransaction, setProcessingTransaction] = useState(false); const [loading, setLoading] = useState(true); + const navigate = useNavigate(); const handleAcceptOrDeclineTransaction = async () => { // Perform decision based on the action parameter From 2fddb9356bbe99e0bdf6e139bc488219c17e8084 Mon Sep 17 00:00:00 2001 From: Temi Date: Sun, 11 Feb 2024 18:42:15 +0100 Subject: [PATCH 03/12] dashboard updates --- src/App.js | 2 - src/Components/Dashboard/Header.Dashboard.js | 28 --- .../Dashboard/Home/Home.Dashboard.js | 93 ++++---- src/api/mockApi.js | 17 -- src/contexts/AuthContext.js | 220 ------------------ src/contexts/UserContext.js | 18 -- 6 files changed, 40 insertions(+), 338 deletions(-) delete mode 100644 src/api/mockApi.js delete mode 100644 src/contexts/AuthContext.js delete mode 100644 src/contexts/UserContext.js diff --git a/src/App.js b/src/App.js index 17d2667..a04934c 100644 --- a/src/App.js +++ b/src/App.js @@ -31,7 +31,6 @@ const router = createBrowserRouter( } /> } /> } /> - } /> } /> } /> - } /> diff --git a/src/Components/Dashboard/Header.Dashboard.js b/src/Components/Dashboard/Header.Dashboard.js index 20f7474..fba378e 100644 --- a/src/Components/Dashboard/Header.Dashboard.js +++ b/src/Components/Dashboard/Header.Dashboard.js @@ -90,34 +90,6 @@ const Header = () => { // setIsSellerMode(checked); // }; - useEffect(() => { - const fetchImage = async () => { - try { - const url = - "https://res.cloudinary.com/daj31htoa/image/upload/v1706072203/WhatsApp_Image_2022-12-22_at_4.29.04_AM_-_Copy_b0ui8d.jpg"; - const res = await axios.get(url, userData, {}); - - if (res.status === 200) { - const contentType = res.headers["content-type"]; - if (contentType.includes("image")) { - setUserData((prevUserData) => ({ - ...prevUserData, - profilePicture: url, - })); - } - } else { - console.error("Failed to fetch user data"); - } - } catch (error) { - console.error("Error loading user data:", error); - } finally { - setIsLoading(false); - } - }; - - fetchImage(); - }, []); - return ( diff --git a/src/Components/Dashboard/Home/Home.Dashboard.js b/src/Components/Dashboard/Home/Home.Dashboard.js index 7d3ae28..fcc48a7 100644 --- a/src/Components/Dashboard/Home/Home.Dashboard.js +++ b/src/Components/Dashboard/Home/Home.Dashboard.js @@ -6,6 +6,9 @@ import { faArrowCircleRight, faWallet, } from "@fortawesome/free-solid-svg-icons"; +import axios from "axios"; + +import Table_transaction_data from "../../../Data/Table_transaction_data.json"; import TransactionFormPopup from "./TransactionPopup.Home"; const StyledCardContainerTop = styled.div` @@ -263,7 +266,7 @@ const Home = () => { const [totalTransactions, setTotalTransactions] = useState(0); const [walletBalance, setWalletBalance] = useState(0); const [withdrawalCount, setWithdrawalCount] = useState(0); - const [depositCount, setDepositCount] = useState(0); + const [revenue, setRevenue] = useState(0); const [isTransactionFormOpen, setTransactionFormOpen] = useState(false); const handleCreateTransaction = () => { @@ -271,23 +274,21 @@ const Home = () => { }; useEffect(() => { - const fetchData = async () => { - try { - url = ""; - const { data } = await axios.get(url); - - setTotalTransactions(data.totalTransactions || 0); - setWalletBalance(data.walletBalance || 0); - setWithdrawalCount(data.withdrawalCount || 0); - setDepositCount(data.depositCount || 0); - setOngoingTransactions(data.ongoingTransactions || []); - setRecentTransactions(data.recentTransactions || []); - } catch (error) { - console.error("Error fetching data:", error); - } - }; - - fetchData(); + // const fetchData = async () => { + // try { + // const url = ""; + // const { data } = await axios.get(url); + // setTotalTransactions(data.totalTransactions || 0); + // setWalletBalance(data.walletBalance || 0); + // setWithdrawalCount(data.withdrawalCount || 0); + // setRevenue(data.revenue || 0); + // setOngoingTransactions(data.ongoingTransactions || []); + // setRecentTransactions(data.recentTransactions || []); + // } catch (error) { + // console.error("Error fetching data:", error); + // } + // }; + // fetchData(); }, []); return ( @@ -307,12 +308,12 @@ const Home = () => { - Withdrawal + No of Withdrawals

{withdrawalCount}

- Deposit -

NGN {depositCount.toFixed(2)}

+ Revenue +

NGN {revenue.toFixed(2)}

@@ -390,38 +391,24 @@ const Home = () => {
- - 2341 - New pair of shoes - 23/1/2024 - 8/2/2024 - N40,000 - pending - - - 2342 - LV Shirt - 20/1/2024 - 6/1/2024 - N16,000 - pending - - - 2343 - Man. Utd track suit - 10/1/2024 - 23/1/2024 - N25,000 - complete - - - 2344 - Torbo P cap - 10/1/2024 - 8/1/2024 - N2,500 - complete - + {Table_transaction_data.map((transaction) => ( + + + {transaction.id} + + {transaction.title} + + {transaction.dateCreated} + + + {transaction.dateDue} + + + {transaction.amount} + + {transaction.status} + + ))}
{" "} diff --git a/src/api/mockApi.js b/src/api/mockApi.js deleted file mode 100644 index 948f8f0..0000000 --- a/src/api/mockApi.js +++ /dev/null @@ -1,17 +0,0 @@ -// src/api/mockApi.js -import axios from "axios"; - -const baseURL = "http://localhost:3000"; // Update with your mock server URL - -const instance = axios.create({ - baseURL, -}); - -export const mockGoogleSignInEndpoint = async (token) => { - try { - const response = await instance.post("/mock-google-signin", { token }); - return response.data; - } catch (error) { - throw error; - } -}; diff --git a/src/contexts/AuthContext.js b/src/contexts/AuthContext.js deleted file mode 100644 index 9a5f582..0000000 --- a/src/contexts/AuthContext.js +++ /dev/null @@ -1,220 +0,0 @@ -import React, { useState } from "react"; -import { useFormik } from "formik"; -import * as Yup from "yup"; -import Modal from "react-modal"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { - faUser, - faTimes, - faShoppingCart, - faTools, - faMoneyBillWave, -} from "@fortawesome/free-solid-svg-icons"; -import { toast } from "react-toastify"; -import "react-toastify/dist/ReactToastify.css"; -import { PaystackButton } from "react-paystack"; -import styled from "styled-components"; -import axios from "axios"; - -const StyledModal = styled(Modal)` - margin-top: 15rem; - - background-color: #ffffff; - - align-items: center; - justify-content: center; - /* margin: 5rem; */ - width: 100%; - - .close-button { - position: absolute; - top: 1.5rem; - right: 2rem; - cursor: pointer; - } - .bm-burger-bars { - background: #373a47; - } -`; -const StyledHeader = styled.h2` - font-size: 1.5rem; -`; - -const StyledBtnRole = styled.button` - background-color: #f26600; - color: #ffffff; - padding: 8px; - border: none; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.3s; - - &:hover { - background-color: transparent; - border: 2px solid #f8701c; - color: #f8701c; - } -`; -const StyledButton = styled.button` - background-color: #f26600; - color: #ffffff; - padding: 8px; - border: none; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.3s; - position: absolute; - bottom: 0.5rem; - right: 6rem; - - &:hover { - background-color: transparent; - border: 2px solid #f8701c; - color: #f8701c; - } -`; - -const StyledFormDiv = styled.div` - background-color: transparent; - padding: 20px; - border-radius: 10px; - - /* position: relative; */ - /* box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); */ -`; - -const StyledBackButton = styled.button` - background-color: #ffffff; - color: #f26600; - padding: 0.3rem 0.5rem; - border: 1px solid #f26600; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.3s, color 0.3s; - position: absolute; - bottom: 0.5rem; - right: 2rem; - &:hover { - background-color: #f26600; - color: #ffffff; - } -`; - -const StyledInput = styled.input` - /* width: 100%; */ - padding: 0.2rem; - /* margin: 10px 0; */ - border: 1px solid #000000; - border-radius: 3px; - display: block; -`; - -Modal.setAppElement("#root"); -const publicKey = process.env.REACT_APP_PAYSTACK_PUBLIC_KEY; -const TransactionFormPopup = ({ - isOpen, - onRequestClose, - onCreateTransaction, - currentStep, -}) => { - const [currentModalStep, setCurrentModalStep] = useState(1); - const formik = useFormik({ - initialValues: { - role: "", - transactionType: "", - amount: "", - deliveryAddress: "", - productName: "", - counterpartyName: "", - counterpartyEmail: "", - counterpartyPhone: "", - setConditions: "", - termsAndConditions: false, - }, - validationSchema: Yup.object({ - role: Yup.string().required("Please select your role"), - transactionType: Yup.string().required("Please select transaction type"), - amount: Yup.number() - .required("Please enter transaction amount") - .positive("Amount must be positive"), - deliveryAddress: Yup.string().required("Please enter delivery address"), - productName: Yup.string().required("Please enter the product name"), - counterpartyName: Yup.string().when("role", { - is: "buyer", - then: () => Yup.string().required("Please enter counterparty name"), - }), - counterpartyEmail: Yup.string().when("role", { - is: "buyer", - then: () => - Yup.string() - .email("Invalid email format") - .required("Please enter counterparty email"), - }), - counterpartyPhone: Yup.string().when("role", { - is: "buyer", - then: () => - Yup.string().required("Please enter counterparty phone number"), - }), - setConditions: Yup.string().when("currentStep", { - is: "setConditions", - then: () => - Yup.string().required("Please enter terms for seller to review"), - }), - termsAndConditions: Yup.boolean().when("currentStep", { - is: "payment", - then: () => - Yup.boolean().oneOf([true], "Please accept terms and conditions"), - }), - }), - onSubmit: (values) => { - console.log("Form submitted with values:", values); - onCreateTransaction(values); - }, - }); - - const handlePaymentSuccess = async ({ reference }) => { - alert( - `Your transaction was successful! Transaction reference: ${reference}` - ); - - const requestData = { - reference, - formData: formik.values, - }; - - try { - url = "https://jsonplaceholder.typicode.com/posts/1"; - const response = await axios.post(url, requestData, { - withCredentials: true, - }); - - console.log("Backend response:", response.data); - } catch (error) { - console.error("Error sending data to backend:", error); - } - }; - - const componentProps = { - email: formik.values.counterpartyEmail, - amount: parseFloat(formik.values.amount) * 100, - metadata: { - name: formik.values.counterpartyName, - phone: formik.values.counterpartyPhone, - }, - publicKey, - text: "Pay", - onSuccess: handlePaymentSuccess, - onClose: () => alert("Transaction Cancelled"), - }; - const handleNext = () => { - setCurrentModalStep(currentModalStep + 1); - }; - - const handleBack = () => { - setCurrentModalStep(currentModalStep - 1); - }; - - return; -}; - -export default TransactionFormPopup; diff --git a/src/contexts/UserContext.js b/src/contexts/UserContext.js deleted file mode 100644 index 18158eb..0000000 --- a/src/contexts/UserContext.js +++ /dev/null @@ -1,18 +0,0 @@ -//unUsed Contxt -import { createContext, useContext, useState } from "react"; - -const UserContext = createContext(); - -export const UserProvider = ({ children }) => { - const [userData, setUserData] = useState(null); - - return ( - - {children} - - ); -}; - -export const useUser = () => { - return useContext(UserContext); -}; From b40a8153498300435126b67dcaf402a84bb024f3 Mon Sep 17 00:00:00 2001 From: Temi Date: Mon, 12 Feb 2024 00:04:41 +0100 Subject: [PATCH 04/12] authguard bug fix --- src/App.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/App.js b/src/App.js index a04934c..4ea9f86 100644 --- a/src/App.js +++ b/src/App.js @@ -36,14 +36,7 @@ const router = createBrowserRouter( path="/reset-password/:userId/:resetString" element={} /> - - - - } - /> + } /> }> } /> Date: Mon, 12 Feb 2024 00:38:02 +0100 Subject: [PATCH 05/12] minor changes --- .../Dashboard/Home/Home.Dashboard.js | 18 +++++++++++++----- src/Pages/SignIn.js | 10 ++++++++-- src/Pages/SignUp.js | 18 ++++++++++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/Components/Dashboard/Home/Home.Dashboard.js b/src/Components/Dashboard/Home/Home.Dashboard.js index fcc48a7..6d58c11 100644 --- a/src/Components/Dashboard/Home/Home.Dashboard.js +++ b/src/Components/Dashboard/Home/Home.Dashboard.js @@ -160,10 +160,10 @@ const StyledLine = styled.div` `; const StyledDetailsBtn = styled.button` - background-color: #4db6ac; + background-color: #f26600; color: #ffffff; border-radius: 0.4rem; - padding: 0.3rem 1rem; + padding: 0.5rem 1rem; border: none; `; @@ -332,8 +332,14 @@ const Home = () => { Ongoing Transactions:{" "} - - 3 + + 1
@@ -371,7 +377,9 @@ const Home = () => { New pair of shoes Counterparty: Footwarefairy - View Details + + Mark Transaction as Complete + diff --git a/src/Pages/SignIn.js b/src/Pages/SignIn.js index 8b49d5d..3700701 100644 --- a/src/Pages/SignIn.js +++ b/src/Pages/SignIn.js @@ -210,7 +210,9 @@ const SignIn = () => {
- Forgot Password + + Forgot Password + @@ -234,7 +236,11 @@ const SignIn = () => {
- Haven't registered? Sign up + Haven't registered?{" "} + + {" "} + Sign up +
diff --git a/src/Pages/SignUp.js b/src/Pages/SignUp.js index 8fe1b28..5d61347 100644 --- a/src/Pages/SignUp.js +++ b/src/Pages/SignUp.js @@ -294,13 +294,23 @@ const Signup = () => {
- Already have an account? Sign In + Already have an account?{" "} + + {" "} + Sign In + By creating an account you agree with our span{" "} - Terms of Service, - Privacy Policy , and our default - Notification Settings. + + Terms of Service + + , + + {" "} + Privacy Policy{" "} + + , and our default Notification Settings.
From af544eba9213af69a711cc7bd6effb99d7f4908f Mon Sep 17 00:00:00 2001 From: kennethoyahebholo Date: Mon, 12 Feb 2024 11:33:10 +0100 Subject: [PATCH 06/12] bug fixes --- .../Dashboard/Home/TransactionPopup.Home.js | 1 - src/Data/Table_transaction_data.json | 34 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/Data/Table_transaction_data.json diff --git a/src/Components/Dashboard/Home/TransactionPopup.Home.js b/src/Components/Dashboard/Home/TransactionPopup.Home.js index d2ef715..07f43f9 100644 --- a/src/Components/Dashboard/Home/TransactionPopup.Home.js +++ b/src/Components/Dashboard/Home/TransactionPopup.Home.js @@ -12,7 +12,6 @@ import { toast } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; import { PaystackButton } from "react-paystack"; import styled from "styled-components"; -import { toast } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; import { TailSpin as Loader } from "react-loader-spinner"; diff --git a/src/Data/Table_transaction_data.json b/src/Data/Table_transaction_data.json new file mode 100644 index 0000000..976f372 --- /dev/null +++ b/src/Data/Table_transaction_data.json @@ -0,0 +1,34 @@ +[ + { + "id": "2341", + "title": "New pair of shoes", + "dateCreated": "23/1/2024", + "dateDue": "8/2/2024", + "amount": "N40,000", + "status": "pending" + }, + { + "id": "2342", + "title": "LV Shirt", + "dateCreated": "20/1/2024", + "dateDue": "6/1/2024", + "amount": "N16,000", + "status": "pending" + }, + { + "id": "2343", + "title": "Man. Utd track suit", + "dateCreated": "10/1/2024", + "dateDue": "23/1/2024", + "amount": "N25,000", + "status": "complete" + }, + { + "id": "2344", + "title": "Torbo P cap", + "dateCreated": "10/1/2024", + "dateDue": "8/1/2024", + "amount": "N2,500", + "status": "complete" + } +] From 15fd2024ae5b608db6f7b949d021e3eef7957d8f Mon Sep 17 00:00:00 2001 From: kennethoyahebholo Date: Mon, 12 Feb 2024 12:03:47 +0100 Subject: [PATCH 07/12] bug fixes fn --- .../Dashboard/Home/Home.Dashboard.js | 12 ++++ .../Dashboard/Home/TransactionPopup.Home.js | 67 +++++++++++-------- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/Components/Dashboard/Home/Home.Dashboard.js b/src/Components/Dashboard/Home/Home.Dashboard.js index 06a368f..0b42f8a 100644 --- a/src/Components/Dashboard/Home/Home.Dashboard.js +++ b/src/Components/Dashboard/Home/Home.Dashboard.js @@ -18,6 +18,18 @@ const StyledCardContainerTop = styled.div` flex-wrap: wrap; `; +const StyledCardPair = styled.div` + display: flex; + gap: 1rem; + + @media only screen and (min-width: 320px) and (max-width: 480px) { + } + + // iPads, Tablets + @media only screen and (min-width: 481px) and (max-width: 768px) { + } +`; + const StyledCard = styled.div` border-radius: 5px; box-shadow: 2px 2px 2px 2px rgba(0.1, 0.1, 0.1, 0.1); diff --git a/src/Components/Dashboard/Home/TransactionPopup.Home.js b/src/Components/Dashboard/Home/TransactionPopup.Home.js index 07f43f9..2f2b5ed 100644 --- a/src/Components/Dashboard/Home/TransactionPopup.Home.js +++ b/src/Components/Dashboard/Home/TransactionPopup.Home.js @@ -22,13 +22,9 @@ import { useAppDispatch } from "../../../redux/hooks"; const StyledModal = styled(Modal)` margin-top: 15rem; - background-color: #ffffff; - align-items: center; justify-content: center; - /* margin: 5rem; */ - width: 100%; .close-button { position: absolute; @@ -39,6 +35,10 @@ const StyledModal = styled(Modal)` .bm-burger-bars { background: #373a47; } + // Mobile devices + @media only screen and (min-width: 320px) and (max-width: 480px) { + margin-left: 10rem; + } `; const StyledHeader = styled.h2` font-size: 1.5rem; @@ -46,6 +46,7 @@ const StyledHeader = styled.h2` const StyledBtnRole = styled.button` background-color: #f26600; + border: 2px solid #f8701c; color: #ffffff; padding: 8px; border: none; @@ -61,6 +62,7 @@ const StyledBtnRole = styled.button` `; const StyledButton = styled.button` background-color: #f26600; + border: 2px solid #f8701c; color: #ffffff; padding: 7px 8px; border: none; @@ -83,8 +85,11 @@ const StyledFormDiv = styled.div` background-color: transparent; padding: 20px; border-radius: 10px; - /* position: relative; */ - /* box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); */ +`; + +const Styledlabel = styled.label` + margin-top: 1rem; + font-size: 0.7rem; `; const StyledBackButton = styled.button` @@ -106,10 +111,8 @@ const StyledBackButton = styled.button` `; const StyledInput = styled.input` - /* width: 100%; */ - /* margin: 10px 0; */ padding: 0.2rem; - border: 1px solid #000000; + border: 1px solid rgba(223, 140, 82, 0.3); border-radius: 3px; display: block; `; @@ -127,6 +130,7 @@ const StyledError = styled.p` `; Modal.setAppElement("#root"); + const TransactionFormPopup = ({ isOpen, onRequestClose, @@ -292,7 +296,9 @@ const TransactionFormPopup = ({ return ( Transaction Type - + + Select transaction type: +
Transaction Details {formik.values.transactionType && (
- + Transaction amount: {formik.errors.amount && formik.touched.amount && ( -
{formik.errors.amount}
+ {formik.errors.amount} )}
)} {formik.values.transactionType && (
- + Transaction amount: {formik.errors.deliveryAddress && formik.touched.deliveryAddress && ( -
{formik.errors.deliveryAddress}
+ {formik.errors.deliveryAddress} )} {formik.values.transactionType && (
- + + Delivery address: + {formik.errors.productName && formik.touched.productName && ( -
{formik.errors.productName}
+ {formik.errors.productName} )}
)} @@ -383,7 +389,7 @@ const TransactionFormPopup = ({ {currentStep === "payment" && (
- + Agree with terms and conditions{" "} + + {formik.errors.termsAndConditions && formik.touched.termsAndConditions && ( -
{formik.errors.termsAndConditions}
+ + {formik.errors.termsAndConditions} + )}
)} @@ -405,7 +414,9 @@ const TransactionFormPopup = ({ return (
Invite Counterparty - + + Counterparty name: + {formik.errors.counterpartyName && formik.touched.counterpartyName && ( -
{formik.errors.counterpartyName}
+ {formik.errors.counterpartyName} )} @@ -448,7 +459,7 @@ const TransactionFormPopup = ({ /> {formik.errors.counterpartyPhone && formik.touched.counterpartyPhone && ( -
{formik.errors.counterpartyPhone}
+ {formik.errors.counterpartyPhone} )}
); @@ -456,7 +467,9 @@ const TransactionFormPopup = ({ return (
Set Conditions - + + Enter terms for purchase: + {formik.errors.setConditions && formik.touched.setConditions && ( -
{formik.errors.setConditions}
+ {formik.errors.setConditions} )}
); From 59d50d617f217127592d6d375b4907f73b25e4cf Mon Sep 17 00:00:00 2001 From: kennethoyahebholo Date: Mon, 12 Feb 2024 15:29:09 +0100 Subject: [PATCH 08/12] bug resolved --- .../Dashboard/Home/TransactionPopup.Home.js | 154 ++++++++++++------ src/Components/Dashboard/Home/styles.css | 19 +++ src/features/transactionSlice.js | 27 +++ src/services/CONSTANTS.js | 1 + src/services/transactions.services.js | 22 ++- 5 files changed, 169 insertions(+), 54 deletions(-) create mode 100644 src/Components/Dashboard/Home/styles.css diff --git a/src/Components/Dashboard/Home/TransactionPopup.Home.js b/src/Components/Dashboard/Home/TransactionPopup.Home.js index 2f2b5ed..c436214 100644 --- a/src/Components/Dashboard/Home/TransactionPopup.Home.js +++ b/src/Components/Dashboard/Home/TransactionPopup.Home.js @@ -15,11 +15,15 @@ import styled from "styled-components"; import "react-toastify/dist/ReactToastify.css"; import { TailSpin as Loader } from "react-loader-spinner"; -import { createTransaction } from "../../../features/transactionSlice"; -import FormList from "antd/es/form/FormList"; +import { + createTransaction, + verifyTransactionDetails, +} from "../../../features/transactionSlice"; import { USER_ID } from "../../../services/CONSTANTS"; import { useAppDispatch } from "../../../redux/hooks"; +import "./styles.css"; + const StyledModal = styled(Modal)` margin-top: 15rem; background-color: #ffffff; @@ -69,7 +73,7 @@ const StyledButton = styled.button` border-radius: 5px; cursor: pointer; transition: background-color 0.3s; - position: absolute; + // position: absolute; bottom: 0.5rem; right: 6rem; @@ -95,15 +99,15 @@ const Styledlabel = styled.label` const StyledBackButton = styled.button` background-color: #ffffff; color: #f26600; - padding: 0.3rem 0.5rem; + // padding: 0.3rem 0.5rem; border: 1px solid #f26600; border-radius: 5px; cursor: pointer; transition: background-color 0.3s, color 0.3s; - position: absolute; + // position: absolute; bottom: 1rem; padding: 6px 10px; - right: 2rem; + // right: 2rem; &:hover { background-color: #f26600; color: #ffffff; @@ -138,6 +142,7 @@ const TransactionFormPopup = ({ currentStep, }) => { const [currentModalStep, setCurrentModalStep] = useState(1); + const [showPaystackButton, setShowPaystackButton] = useState(false); const [loading, setLoading] = useState(false); const userId = localStorage.getItem(USER_ID); const isSecure = window.location.protocol === "https:"; @@ -146,6 +151,7 @@ const TransactionFormPopup = ({ }/confirm-transaction`; const encodedLink = encodeURI(text); const dispatch = useAppDispatch(); + const formik = useFormik({ initialValues: { role: "", @@ -195,7 +201,6 @@ const TransactionFormPopup = ({ }), onSubmit: (values) => { console.log("Form submitted with values:", values); - // onCreateTransaction(values); }, }); @@ -260,6 +265,38 @@ const TransactionFormPopup = ({ setCurrentModalStep(currentModalStep - 1); }; + const handleVerifyDetails = async () => { + setLoading(true); + let request = { + formData: { + transactionType: formik.values.transactionType, + amount: parsedAmount, + deliveryAddress: formik.values.deliveryAddress, + productName: formik.values.productName, + counterpartyName: formik.values.counterpartyName, + counterpartyEmail: formik.values.counterpartyEmail, + counterpartyPhone: formik.values.counterpartyPhone, + setConditions: formik.values.setConditions, + termsAndConditions: formik.values.termsAndConditions, + }, + }; + dispatch(verifyTransactionDetails(request)) + .then((resp) => { + if (resp?.payload?.status !== 200) { + toast.error(resp?.payload?.message || "Something went wrong"); + setLoading(false); + return; + } + setShowPaystackButton(true); + toast.success(resp?.payload?.message || "Please check your inbox"); + setLoading(false); + }) + .catch((error) => { + toast.error(error?.message || "Something went wrong"); + setLoading(false); + }); + }; + const renderStepContent = () => { switch (currentModalStep) { // case 1: @@ -352,7 +389,9 @@ const TransactionFormPopup = ({ )} {formik.values.transactionType && (
- Transaction amount: + + Delivery Address: + - - Delivery address: + + Product name: - <> - {loading && ( + {loading ? ( +
- )} - {loading ? ( - "Confirming transaction..." - ) : ( - <> - {renderStepContent()} -
- {currentModalStep !== 1 && ( - - Back - - )} - {currentModalStep !== 4 && currentModalStep !== 1 && ( - { - handleNext(); - }} - > - Save & Next - - )} - {currentModalStep === 4 && ( - { - // formik.handleSubmit(); - handlePayment(); - }} - className="paystack-button" - {...componentProps} - /> - )} -
-
- -
- - )} - + Confirming transaction... +
+ ) : ( + <> + {showPaystackButton ? ( + + ) : ( + <> + {renderStepContent()} +
+ {currentModalStep !== 1 && ( + + Back + + )} + + {currentModalStep !== 1 && ( + { + { + currentModalStep === 4 + ? handleVerifyDetails() + : handleNext(); + } + }} + > + {currentModalStep === 4 ? "Proceed" : "Save & Next"} + + )} +
+
+ +
+ + )} + + )} ); }; diff --git a/src/Components/Dashboard/Home/styles.css b/src/Components/Dashboard/Home/styles.css new file mode 100644 index 0000000..3b0969a --- /dev/null +++ b/src/Components/Dashboard/Home/styles.css @@ -0,0 +1,19 @@ +.paystack-button { + background-color: #f26600; + border: 2px solid #f8701c; + color: #ffffff; + padding: 7px 8px; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; + bottom: 0.5rem; + right: 6rem; + + &:hover { + background-color: transparent; + border: 1px solid #f8701c; + color: #f8701c; + padding: 6px; + } +} diff --git a/src/features/transactionSlice.js b/src/features/transactionSlice.js index 9101f2b..70818a0 100644 --- a/src/features/transactionSlice.js +++ b/src/features/transactionSlice.js @@ -2,6 +2,7 @@ import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; import { CreateTransaction, VerifyTransaction, + VerifyTransactionDetails, } from "../services/transactions.services"; const initialState = { @@ -25,6 +26,20 @@ export const createTransaction = createAsyncThunk( } ); +export const verifyTransactionDetails = createAsyncThunk( + "verifyTransactionDetails", + async ({ formData }) => { + try { + const resp = await VerifyTransactionDetails({ + formData, + }); + return resp; + } catch (error) { + throw error; // Throw the error to let Redux Toolkit handle the rejection + } + } +); + export const verifyTransaction = createAsyncThunk( "verifyTransaction", async ({ transactionId, action }) => { @@ -74,6 +89,18 @@ export const transactionSlice = createSlice({ // state.user = null; state.isLoading = false; }); + // verify transactions details actions + builder.addCase(verifyTransactionDetails.pending, (state) => { + state.isLoading = true; + }); + builder.addCase(verifyTransactionDetails.fulfilled, (state) => { + state.isLoading = false; + }); + builder.addCase(verifyTransactionDetails.rejected, (state) => { + state.isLoggedIn = false; + // state.user = null; + state.isLoading = false; + }); }, }); diff --git a/src/services/CONSTANTS.js b/src/services/CONSTANTS.js index 8404952..9379655 100644 --- a/src/services/CONSTANTS.js +++ b/src/services/CONSTANTS.js @@ -9,6 +9,7 @@ export const CONTACT_OUR_SUPPORT = "contact-our-support"; export const DISPUTE_TRANSACTION = "dispute-transaction"; export const CREATE_TRANSACTION = "create-transaction"; export const VERIFY_TRANSACTION = "verify-transaction"; +export const VERIFY_TRANSACTION_DETAILS = "verify-transaction-details"; export const GET_USER_BY_ID = "getUserById"; diff --git a/src/services/transactions.services.js b/src/services/transactions.services.js index 49b23e0..e609c25 100644 --- a/src/services/transactions.services.js +++ b/src/services/transactions.services.js @@ -1,6 +1,10 @@ import axios from "axios"; -import { CREATE_TRANSACTION, VERIFY_TRANSACTION } from "../services/CONSTANTS"; +import { + CREATE_TRANSACTION, + VERIFY_TRANSACTION, + VERIFY_TRANSACTION_DETAILS, +} from "../services/CONSTANTS"; export const CreateTransaction = async ({ reference, @@ -26,6 +30,22 @@ export const CreateTransaction = async ({ return response.data; }; +export const VerifyTransactionDetails = async ({ formData }) => { + const transactionData = { + formData, + }; + const response = await axios.post( + `${process.env.REACT_APP_API_BASE_URL}/${VERIFY_TRANSACTION_DETAILS}`, + transactionData, + { + headers: { + "Access-Control-Allow-Origin": "*", + }, + } + ); + return response.data; +}; + export const VerifyTransaction = async ({ transactionId, action }) => { const transactionData = { transactionId, From af5744581c0aa1d2b2e4ed2e2ca438b9b27fb5f5 Mon Sep 17 00:00:00 2001 From: Temi Date: Mon, 12 Feb 2024 16:01:56 +0100 Subject: [PATCH 09/12] lase demo commit --- package-lock.json | 13 + package.json | 1 + src/Components/Dashboard/Dashboard.js | 5 +- .../Dashboard/Home/Home.Dashboard.js | 9 +- src/Components/Dashboard/Tracker.Dashboard.js | 4 +- .../Dashboard/Transactions.Dashboard.js | 266 +++++++++++++++++- .../ReUseableComponent/EventTimeLine.js | 131 +++++++++ src/assets/images/photo.jpeg | Bin 0 -> 82693 bytes src/utils/Payment.js | 24 -- src/utils/Wallet.js | 5 - 10 files changed, 421 insertions(+), 37 deletions(-) create mode 100644 src/Components/ReUseableComponent/EventTimeLine.js create mode 100644 src/assets/images/photo.jpeg delete mode 100644 src/utils/Payment.js delete mode 100644 src/utils/Wallet.js diff --git a/package-lock.json b/package-lock.json index 21f561f..b5fd76e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@ant-design/icons": "^5.2.6", "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", "@fortawesome/free-regular-svg-icons": "^6.5.1", "@fortawesome/free-solid-svg-icons": "^6.5.1", "@fortawesome/react-fontawesome": "^0.2.0", @@ -2558,6 +2559,18 @@ "node": ">=6" } }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.5.1.tgz", + "integrity": "sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@fortawesome/free-regular-svg-icons": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz", diff --git a/package.json b/package.json index f3bc2f0..614fe36 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@ant-design/icons": "^5.2.6", "@fortawesome/fontawesome-svg-core": "^6.5.1", + "@fortawesome/free-brands-svg-icons": "^6.5.1", "@fortawesome/free-regular-svg-icons": "^6.5.1", "@fortawesome/free-solid-svg-icons": "^6.5.1", "@fortawesome/react-fontawesome": "^0.2.0", diff --git a/src/Components/Dashboard/Dashboard.js b/src/Components/Dashboard/Dashboard.js index ef61dc2..a895f86 100644 --- a/src/Components/Dashboard/Dashboard.js +++ b/src/Components/Dashboard/Dashboard.js @@ -29,6 +29,7 @@ import { USER_ID, USER_TOKEN } from "../../services/CONSTANTS"; const StyledContainer = styled.div` display: flex; height: 100vh; + background-color: #f8f7f7; overflow: hidden; `; @@ -290,10 +291,10 @@ const Dashboard = () => { {page === "home" && } {page === "profile" && } - {page === "transactions" && } + {page === "transactions" && } {page === "wallet" && } {page === "settings" && } - {page === "tracker" && } + {page === "tracker" && } {page === "resolution" && } diff --git a/src/Components/Dashboard/Home/Home.Dashboard.js b/src/Components/Dashboard/Home/Home.Dashboard.js index 6d58c11..c0d2f3b 100644 --- a/src/Components/Dashboard/Home/Home.Dashboard.js +++ b/src/Components/Dashboard/Home/Home.Dashboard.js @@ -6,7 +6,6 @@ import { faArrowCircleRight, faWallet, } from "@fortawesome/free-solid-svg-icons"; -import axios from "axios"; import Table_transaction_data from "../../../Data/Table_transaction_data.json"; import TransactionFormPopup from "./TransactionPopup.Home"; @@ -43,6 +42,7 @@ const StyledCard = styled.div` box-shadow: 2px 2px 2px 2px rgba(0.1, 0.1, 0.1, 0.1); width: 8.7rem; height: 5rem; + background-color: #fff; padding: 0.2rem 1.2rem; // Mobile devices @media only screen and (min-width: 320px) and (max-width: 480px) { @@ -139,6 +139,7 @@ const StyledCardOngoingBtm = styled.div` border-radius: 0.5rem; box-shadow: 2px 2px 2px 2px rgba(0.1, 0.1, 0.1, 0.1); padding: 1rem 2rem 0 2rem; + background-color: #fff; margin-top: 1rem; `; @@ -165,6 +166,11 @@ const StyledDetailsBtn = styled.button` border-radius: 0.4rem; padding: 0.5rem 1rem; border: none; + &:hover { + border: 1px solid #f26600; + color: #f26600; + background-color: #fff; + } `; const StyledHeaderBtm = styled.h4` @@ -200,6 +206,7 @@ const StyledCardContainerBtm = styled.div` border-radius: 0.5rem; box-shadow: 2px 2px 2px 2px rgba(0.1, 0.1, 0.1, 0.1); padding: 1rem 2rem 0 2rem; + background-color: #fff; margin-top: 1rem; /* width: 50vw; */ diff --git a/src/Components/Dashboard/Tracker.Dashboard.js b/src/Components/Dashboard/Tracker.Dashboard.js index fdda914..df8526b 100644 --- a/src/Components/Dashboard/Tracker.Dashboard.js +++ b/src/Components/Dashboard/Tracker.Dashboard.js @@ -68,12 +68,12 @@ const IconWrapper = styled.div` `; const Line = styled.div` - width: 1px; + /* width: 1px; background-color: #4db6ac; position: absolute; top: ${({ top }) => top}px; bottom: ${({ bottom }) => bottom}px; - left: 5px; + left: 5px; */ `; const MilestoneText = styled.div` diff --git a/src/Components/Dashboard/Transactions.Dashboard.js b/src/Components/Dashboard/Transactions.Dashboard.js index f991199..64a2c89 100644 --- a/src/Components/Dashboard/Transactions.Dashboard.js +++ b/src/Components/Dashboard/Transactions.Dashboard.js @@ -1,7 +1,267 @@ -import React from "react"; +import { useState } from "react"; +import styled from "styled-components"; +import img from "../../assets/images/photo.jpeg"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faChevronDown, faPlusCircle } from "@fortawesome/free-solid-svg-icons"; +import { + faTelegram, + faTelegramPlane, +} from "@fortawesome/free-brands-svg-icons"; -const Transactions = () => { - return
Transactions Coming soon
; +import EventTimeline from "../ReUseableComponent/EventTimeLine"; + +const StyledContainer = styled.div` + display: flex; + gap: 2rem; + height: 30rem; + width: 50rem; + font-size: 0.7rem; +`; + +const StyledLeft = styled.div` + display: flex; + flex: 1.5; + flex-direction: column; + gap: 2rem; +`; + +const StyledLeftTop = styled.div` + flex: 1; + background-color: #fff; + box-shadow: 0 0 2px 2px rgba(0.1, 0.1, 0.1, 0.05); + border-radius: 0.5rem; + padding: 1rem; + display: flex; + flex-direction: column; + justify-content: space-between; +`; +const StyledSpanCtn = styled.span` + display: flex; + flex-direction: row; + justify-content: space-between; +`; + +const StyledHeader = styled.span` + font-size: 1rem; + display: flex; + align-items: space-between; +`; +const StyledSpanHead = styled.span` + font-size: 0.7rem; + opacity: 0.5; +`; + +const StyledSpan = styled.span``; + +const StyledImg = styled.img` + height: 1.5rem; + margin-right: 1rem; + border-radius: 1.5rem; +`; + +const StyledLeftBtm = styled.div` + border-radius: 0.5rem; + background-color: #fff; + box-shadow: 0 0 2px 2px rgba(0.1, 0.1, 0.1, 0.05); + padding: 1rem; + flex: 1; +`; + +const StyledRight = styled.div` + border-radius: 0.5rem; + flex: 1; + box-shadow: 0 0 2px 2px rgba(0.1, 0.1, 0.1, 0.05); + padding: 1rem; + background-color: #fff; +`; + +const ChatBox = styled.div` + margin-top: 1rem; + height: 9rem; + background-color: #f8f7f7; + width: 20rem; + box-shadow: 0 0 2px 2px rgba(0.1, 0.1, 0.1, 0.1); + border-radius: 0.3rem; + display: flex; + flex-direction: column; + padding: 0; +`; + +const ChatArea = styled.div` + flex: 5; +`; +const MsgArea = styled.div` + flex: 1; + border: 1px solid rgba(0.1, 0.1, 0.1, 0.1); + border-radius: 0 0 0.3rem 0.3rem; +`; + +const StyledTranStatusCtn = styled.span` + display: flex; + gap: 3rem; + margin-top: 1rem; +`; +const StyledTranStatus = styled.div` + display: flex; + flex-direction: column; +`; + +const StyledBtnTop = styled.button` + background-color: #f26600; + color: #ffffff; + border-radius: 0.4rem; + padding: 0.5rem 1rem; + border: none; + border: 1px solid #f26600; + width: 14rem; + margin-bottom: 0.5rem; + &:hover { + border: 1px solid #f26600; + color: #f26600; + background-color: #fff; + } +`; + +const StyledBtnBtn = styled.button` + border: 1px solid #f26600; + background-color: #fff; + color: #f26600; + border-radius: 0.4rem; + padding: 0.5rem 1rem; + margin-bottom: 0.5rem; + width: 7rem; + &:hover { + background-color: #f26600; + border: 1px solid #f26600; + color: #ffffff; + } +`; +const Transactions = ({ navigateTo }) => { + const [state, setState] = useState(""); + const handleClick = (action) => { + switch (action) { + case "resolution": + navigateTo("resolution"); + break; + case "tracker": + navigateTo("tracker"); + break; + default: + break; + } + }; + return ( +
+ + + +
+ + Red Nike Shoes + +
+
+ + Seller + Amount + + + + + + + + Footwarefairy + 08031574374 + + + NGN5000 + +
+
+ + Date Created + Date Due + + + 23/1/2024 + 28/1/2024 + +
+
+ + Status + Transaction Type + + + Ongoing + Product + +
+
+ +
+ + + Agreed Terms/Conditions + + + + + {" "} + + + + + + Write Message + + + + + + + + +
+
+
+ + + + Transaction Progress + + + + Update transaction progress to keep other party updates + + + + + + + +
+ handleClick("resolution")}> + Dispute + {" "} + handleClick("tracker")}> + Track Order + +
+ Mark Transaction as Complete +
+
+
+
+ ); }; export default Transactions; diff --git a/src/Components/ReUseableComponent/EventTimeLine.js b/src/Components/ReUseableComponent/EventTimeLine.js new file mode 100644 index 0000000..96c129d --- /dev/null +++ b/src/Components/ReUseableComponent/EventTimeLine.js @@ -0,0 +1,131 @@ +import React from "react"; + +const EventTimeline = ({ orderAccepted, orderDispatched, orderCompleted }) => { + const circleRadius = 15; + const textXOffset = 5; // Offset for text from circle + const dummyDateXOffset = 5; // Offset for dummy date from text + + return ( + + + {orderAccepted && ( + <> + + Transaction Accepted + + + Jan 1, 2024 + + + + ✓ + + + )} + + + + {orderDispatched && ( + <> + + Sent for delivery + + + Jan 15, 2024 + + + )} + + + {orderCompleted && ( + <> + + Transaction Completed + + + Jan 20, 2024 + + + ✓ + + + )} + + ); +}; + +export default EventTimeline; diff --git a/src/assets/images/photo.jpeg b/src/assets/images/photo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ca55824184cf528ba3087326a3b0f32c46906a1a GIT binary patch literal 82693 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 z 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 W&G;HBhQ0FM@yE~oD6K^;&;Qx|#PR0< literal 0 HcmV?d00001 diff --git a/src/utils/Payment.js b/src/utils/Payment.js deleted file mode 100644 index 595a04e..0000000 --- a/src/utils/Payment.js +++ /dev/null @@ -1,24 +0,0 @@ -export const handlePaymentSuccess = async ({ reference }) => { - try { - // Make API call to backend to store transaction details and update wallet - const response = await axios.post("/api/transactions", { - reference, - // other transaction details... - }); - - if (response.data.success) { - // Update wallet balance after successful payment - updateWallet(response.data.updatedWalletBalance); - - // Send invitation to buyer - sendInvitation(response.data.buyerEmail); - - // Additional logic for handling transaction status - // ... - } else { - console.error("Transaction failed:", response.data.message); - } - } catch (error) { - console.error("Error handling payment success:", error); - } -}; diff --git a/src/utils/Wallet.js b/src/utils/Wallet.js deleted file mode 100644 index 51c08e4..0000000 --- a/src/utils/Wallet.js +++ /dev/null @@ -1,5 +0,0 @@ -const [walletBalance, setWalletBalance] = useState(0); - -const updateWallet = (newBalance) => { - setWalletBalance(newBalance); -}; From cf25fe5c288a9bb3de094114eca4dd854806d798 Mon Sep 17 00:00:00 2001 From: Temi Date: Mon, 12 Feb 2024 16:11:30 +0100 Subject: [PATCH 10/12] meged with staging --- src/App.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/App.css b/src/App.css index b1fa935..3377350 100644 --- a/src/App.css +++ b/src/App.css @@ -1,7 +1,7 @@ @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;500;700;800;900&display=swap"); - +/* .paystack-button { cursor: pointer; text-align: center; @@ -29,4 +29,4 @@ outline: none; } - + */ From a2cd6b9195522bc91c0bdad5521b401b034975fa Mon Sep 17 00:00:00 2001 From: kennethoyahebholo Date: Mon, 12 Feb 2024 17:18:01 +0100 Subject: [PATCH 11/12] bug bug --- src/App.js | 1 + src/Components/Dashboard/Dashboard.js | 2 +- src/Components/Dashboard/Home/TransactionPopup.Home.js | 10 +++++----- src/services/user.services.js | 1 + 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index dedaaf5..e6202a5 100644 --- a/src/App.js +++ b/src/App.js @@ -21,6 +21,7 @@ import ForgotPassword from "./Pages/ForgotPassword"; import ResetPassword from "./Pages/ResetPassword"; import Otp from "./Pages/Otp"; import ConfirmTransaction from "./Pages/ConfirmTransaction"; +import AuthGuard from "./AuthGuard"; export const userContext = createContext(); diff --git a/src/Components/Dashboard/Dashboard.js b/src/Components/Dashboard/Dashboard.js index 0a05ede..1d91550 100644 --- a/src/Components/Dashboard/Dashboard.js +++ b/src/Components/Dashboard/Dashboard.js @@ -115,7 +115,7 @@ const Dashboard = () => { const logOut = () => { googleLogout(); - setUser({}); // Clear user state + // setUser({}); // Clear user state setProfile({}); // Clear profile state localStorage.removeItem("token"); localStorage.removeItem(USER_TOKEN); diff --git a/src/Components/Dashboard/Home/TransactionPopup.Home.js b/src/Components/Dashboard/Home/TransactionPopup.Home.js index c436214..3aea7dc 100644 --- a/src/Components/Dashboard/Home/TransactionPopup.Home.js +++ b/src/Components/Dashboard/Home/TransactionPopup.Home.js @@ -243,7 +243,7 @@ const TransactionFormPopup = ({ }; const componentProps = { - email: formik.values.counterpartyEmail, + email: formik.values.counterpartyEmail?.toLowerCase(), amount: parsedAmount * 100, metadata: { name: formik.values.counterpartyName, @@ -274,7 +274,7 @@ const TransactionFormPopup = ({ deliveryAddress: formik.values.deliveryAddress, productName: formik.values.productName, counterpartyName: formik.values.counterpartyName, - counterpartyEmail: formik.values.counterpartyEmail, + counterpartyEmail: formik.values.counterpartyEmail?.toLowerCase(), counterpartyPhone: formik.values.counterpartyPhone, setConditions: formik.values.setConditions, termsAndConditions: formik.values.termsAndConditions, @@ -610,11 +610,11 @@ const TransactionFormPopup = ({ )}
-
- -
)} +
+ +
)} diff --git a/src/services/user.services.js b/src/services/user.services.js index c865889..3668bc1 100644 --- a/src/services/user.services.js +++ b/src/services/user.services.js @@ -5,6 +5,7 @@ import { USER_TOKEN } from "./CONSTANTS"; export const GetUserById = async (userId) => { const token = localStorage.getItem(USER_TOKEN); const id = JSON.parse(userId); + const response = await axios.get( `${process.env.REACT_APP_API_BASE_URL}/${GET_USER_BY_ID}/${id}`, { From df9fced7fd49c38eaf7a3071baa12b663765ca02 Mon Sep 17 00:00:00 2001 From: Temi Date: Mon, 12 Feb 2024 17:41:40 +0100 Subject: [PATCH 12/12] final comit --- src/Components/Dashboard/Dashboard.js | 170 ++++++++++++++++++-------- 1 file changed, 121 insertions(+), 49 deletions(-) diff --git a/src/Components/Dashboard/Dashboard.js b/src/Components/Dashboard/Dashboard.js index 958ce68..a895f86 100644 --- a/src/Components/Dashboard/Dashboard.js +++ b/src/Components/Dashboard/Dashboard.js @@ -1,17 +1,6 @@ import React, { useReducer, useEffect, useContext } from "react"; import { useParams, Link } from "react-router-dom"; import styled, { css } from "styled-components"; -import Home from "./Home/Home.Dashboard"; -import Settings from "./Settings.Dashboard"; -import Transactions from "./Transactions.Dashboard"; -import Wallet from "./Wallet.Dashboard"; -import Profile from "./Profile.Dashboard"; -import DashboardHeader from "./Header.Dashboard"; -import Tracker from "./Tracker.Dashboard"; -import Resolution from "./Resolution.Dashboard"; -import { USER_ID, USER_TOKEN } from "../../services/CONSTANTS"; -import { googleLogout } from "@react-oauth/google"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faHome, faUser, @@ -20,8 +9,22 @@ import { faReceipt, faTruck, faHandshake, + faSignOut, } from "@fortawesome/free-solid-svg-icons"; import { useAppSelector } from "../../redux/hooks"; +import { googleLogout } from "@react-oauth/google"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { userContext } from "../../App"; +import Home from "./Home/Home.Dashboard"; +import Settings from "./Settings.Dashboard"; +import Transactions from "./Transactions.Dashboard"; +import Wallet from "./Wallet.Dashboard"; +import Profile from "./Profile.Dashboard"; +import DashboardHeader from "./Header.Dashboard"; +import Tracker from "./Tracker.Dashboard"; +import Resolution from "./Resolution.Dashboard"; +import { USER_ID, USER_TOKEN } from "../../services/CONSTANTS"; const StyledContainer = styled.div` display: flex; @@ -53,6 +56,30 @@ const StyledSideBar = styled.div` left: 0; top: 5rem; color: #ffffff; + width: 12rem; + + // Mobile devices + @media only screen and (min-width: 320px) and (max-width: 480px) { + width: 5rem; + } + + // iPads, Tablets + @media only screen and (min-width: 481px) and (max-width: 768px) { + width: 9rem; + padding-left: 0.1rem; + } + + // Small screens, laptops + @media only screen and (min-width: 769px) and (max-width: 1024px) { + } + + // Desktops, large screens + @media only screen and (min-width: 1025px) and (max-width: 1200px) { + } + + // Extra large screens, TV + @media only screen and (min-width: 1201px) { + } `; const StyledBtnContainer = styled.div` @@ -67,6 +94,38 @@ const StyledBtn = styled.button` text-align: left; color: #ffffff; font-weight: 200; + padding: 0.5rem; + ${({ active }) => + active && + css` + color: #4db6ac; + border-radius: 0.5rem; + padding: 0.5rem; + `} + &:hover { + color: #4db6ac; + border-radius: 0.5rem; + padding: 0.5rem; + } + @media only screen and (min-width: 320px) and (max-width: 480px) { + } + // iPads, Tablets + @media only screen and (min-width: 481px) and (max-width: 768px) { + } +`; + +const StyledBtnName = styled.span` + @media only screen and (min-width: 320px) and (max-width: 480px) { + display: none; + } + + // iPads, Tablets + @media only screen and (min-width: 481px) and (max-width: 768px) { + } +`; + +const StyledFontAwesomeIcon = styled(FontAwesomeIcon)` + padding-right: 0.5rem; `; const SignoutLink = styled(Link)` @@ -77,6 +136,16 @@ const SignoutLink = styled(Link)` color: #ffffff; font-size: 0.6rem; text-decoration: none; + ${({ active }) => + active && + css` + color: #4db6ac; + border-radius: 0.5rem; + `} + &:hover { + color: #4db6ac; + border-radius: 0.5rem; + } `; const StyledRight = styled.div` @@ -87,8 +156,30 @@ const StyledRight = styled.div` &::-webkit-scrollbar { width: 0; } + @media only screen and (min-width: 320px) and (max-width: 480px) { + margin-left: 5rem; + } + + // iPads, Tablets + @media only screen and (min-width: 481px) and (max-width: 768px) { + margin-left: 8rem; + } `; +const StyledFontAwesomeIconSignOut = styled(FontAwesomeIcon)` + padding-right: 0.5rem; +`; + +const StyledSignOutTxt = styled.span` + // Mobile devices + @media only screen and (min-width: 320px) and (max-width: 480px) { + display: none; + } + + // iPads, Tablets + @media only screen and (min-width: 481px) and (max-width: 768px) { + } +`; const initialState = { page: "home", initialLoad: true, @@ -110,14 +201,15 @@ const Dashboard = () => { const [state, dispatch] = useReducer(reducer, initialState); const { page, initialLoad } = state; const { userId } = useParams(); + const { setProfile, setUser } = useContext(userContext); const { user } = useAppSelector((state) => state.user); console.log("my user", user); const logOut = () => { googleLogout(); - setUser({}); // Clear user state - setProfile({}); // Clear profile state + setUser({}); + setProfile({}); localStorage.removeItem("token"); localStorage.removeItem(USER_TOKEN); localStorage.removeItem(USER_ID); @@ -143,76 +235,56 @@ const Dashboard = () => { active={page === "home"} onClick={() => navigateTo("home")} > - - Home + + Home navigateTo("profile")} > - - Profile + + Profile navigateTo("transactions")} > - - Transactions + + Transactions navigateTo("wallet")} > - - Wallet + + Wallet navigateTo("settings")} > - - Settings + + Settings navigateTo("tracker")} > - - Order Tracker + + Tracking navigateTo("resolution")} > - - Resolution + + Resolution - Sign Out + + Sign Out