From 346af173b20c1c0ffe05b69fefaea2bb5e973849 Mon Sep 17 00:00:00 2001 From: rockyeverlast Date: Thu, 6 Mar 2025 13:16:38 +0530 Subject: [PATCH] API implementation for CMS and Master module --- .env | 3 +- .gitignore | 1 + dev-dist/sw.js | 2 +- index.html | 25 +- package-lock.json | 1 + src/App.tsx | 8 +- src/Pages/ForgotPassword.tsx | 155 ++++++++++++ src/Pages/Login.tsx | 21 +- .../ManageCMS/AboutUs/AboutUsAddModel.tsx | 2 +- src/Pages/ManageCMS/FAQ/EditDetails.tsx | 2 +- src/Pages/ManageCMS/FAQ/FAQ.tsx | 2 +- .../ManageCMS/PrivacyPolicy/PrivacyPolicy.tsx | 12 +- .../PrivacyPolicy/PrivacyPolicyAddModel.tsx | 121 ++++++++-- .../TermsAndConditions/TermsAndConditions.tsx | 31 ++- .../TermsAndConditionsAddModel.tsx | 116 +++++++-- src/Pages/ManageGroups/AddGroup.tsx | 2 +- src/Pages/ManageGroups/ManageGroups.tsx | 2 +- src/Pages/ManageJobs/ManageJobs.tsx | 2 +- src/Pages/ManageJobs/ManageJobsAdd.tsx | 3 +- src/Pages/ManageJobs/ViewManageJob.tsx | 3 +- src/Pages/ManagePost/ManagePost.tsx | 2 +- src/Pages/ManagePost/ViewDailog.tsx | 4 +- .../RegisterUsers/EditRegisterUsers.tsx | 8 +- .../RegisterUsers/RegisterUsers.tsx | 4 +- .../AgencyMaster/AgencyMaster.tsx | 105 ++++++-- .../AgencyMaster/EditAgencyMaster.tsx | 2 +- .../AgencyMaster/ViewAgencyMaster.tsx | 221 +++++++++-------- .../MasterModule/Country/CountryAddModel.tsx | 2 +- .../JobStatus/EditJobStatusModel.tsx | 22 +- .../MasterModule/JobStatus/JobStatus.tsx | 12 +- .../JobStatus/JobStatusAddModel.tsx | 2 +- .../MasterModule/JobType/JobAddModel.tsx | 2 +- .../TemplateMaster/TemplateAddModel.tsx | 226 ++++++++++++++---- .../TemplateMaster/TemplateMaster.tsx | 108 +++++++-- .../WorkspaceMode/EditWorkModel.tsx | 6 +- .../WorkspaceMode/WorkAddModel.tsx | 2 +- .../WorkspaceMode/WorkspaceMode.tsx | 2 +- src/Pages/SetNewPassword.tsx | 133 +++++++++++ src/Pages/SubAdmin/SubAdmin.tsx | 2 +- src/Pages/SubAdmin/ViewSubAdmin.tsx | 11 +- src/Pages/VerifyEnterOTP.tsx | 155 ++++++++++++ .../Service/agency.master.module.service.ts | 60 +++++ src/Redux/Service/forget.password.service.ts | 36 --- src/Redux/Service/job.type.service.ts | 97 ++++++++ src/Redux/Service/manage.aboutus.service.ts | 16 +- src/Redux/Service/manage.subadmin.service.ts | 31 ++- src/Redux/Service/master.module.service.ts | 26 -- src/Redux/Service/privacy.policy.service.ts | 10 +- src/Redux/Service/template.master.service.ts | 104 ++++++++ .../Service/terms.and.condition.service.ts | 58 +++-- src/Redux/Store.tsx | 15 +- src/Routes/Routes.ts | 2 +- src/components/ActionIcons/Delete.tsx | 2 +- src/components/Charts/BarChart.tsx | 4 +- src/components/Charts/SemiDoughnutChart.tsx | 2 +- src/components/DataTable.tsx | 6 +- src/components/EditSubAdmin.tsx | 4 +- src/components/Sipnner/Spinner.tsx | 2 +- src/components/ui/pagination.tsx | 5 +- src/components/ui/pin-input.tsx | 27 +++ src/components/ui/toaster.tsx | 11 +- tsconfig.node.tsbuildinfo | 1 + 62 files changed, 1615 insertions(+), 449 deletions(-) create mode 100644 src/Pages/ForgotPassword.tsx create mode 100644 src/Pages/SetNewPassword.tsx create mode 100644 src/Pages/VerifyEnterOTP.tsx create mode 100644 src/Redux/Service/agency.master.module.service.ts delete mode 100644 src/Redux/Service/forget.password.service.ts create mode 100644 src/Redux/Service/job.type.service.ts delete mode 100644 src/Redux/Service/master.module.service.ts create mode 100644 src/Redux/Service/template.master.service.ts create mode 100644 src/components/ui/pin-input.tsx create mode 100644 tsconfig.node.tsbuildinfo diff --git a/.env b/.env index 78f19ee..25f5e16 100644 --- a/.env +++ b/.env @@ -2,4 +2,5 @@ VITE_API_URL='https://ssa.betadelivery.com/apia/v1' # VITE_API_URL='http://192.16.50.44/seo-backend/apia/v1' VITE_USER_NAME="Admin" VITE_PASSWORD="71%@L%es^bUX94`J9XT*@bh,._WWM{$%^^&&" -VITE_APP_NAME=MyViteApp \ No newline at end of file +VITE_APP_NAME=MyViteApp +VITE_IMG_TEMPLATES='https://ssa.betadelivery.com/storage/app/public/uploads/post_templates/' \ No newline at end of file diff --git a/.gitignore b/.gitignore index a547bf3..7ceb59f 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +.env diff --git a/dev-dist/sw.js b/dev-dist/sw.js index 0a9d960..0132957 100644 --- a/dev-dist/sw.js +++ b/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.ch9snbb3598" + "revision": "0.0cibk256ds" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/index.html b/index.html index a289c81..9ea699c 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,16 @@ - - - - - SEO Admin - - -
- - - + + + + + + SEO Admin + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5836759..c9b20b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1676,6 +1676,7 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { diff --git a/src/App.tsx b/src/App.tsx index a4eae2f..c09ef99 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,12 +4,15 @@ import GlobalStateContext from "./Contexts/GlobalStateContext"; import DefaultLayout from "./Layouts/DefaultLayout"; import Login from "./Pages/Login"; import { RouteLink } from "./Routes/Routes"; +import ForgotPassword from "./Pages/ForgotPassword"; +import VerifyEnterOTP from "./Pages/VerifyEnterOTP"; +import SetNewPassword from "./Pages/SetNewPassword"; function App() { const context = useContext(GlobalStateContext); if (!context) throw new Error("App must be used within a GlobalStateProvider"); - const { isAuthenticate, setIsAuthenticate } = context; + const { isAuthenticate, setIsAuthenticate } = context; useEffect(() => { const token = localStorage.getItem("token"); @@ -23,6 +26,9 @@ function App() { {/* Redirect logged-in users away from login */} : } /> + } /> + } /> + } /> {/* Protected Routes */} { + const navigate = useNavigate(); + const [isLoading, setIsLoading] = useState(false); + const { + register, + handleSubmit, + formState: { errors }, + } = useForm(); + + const onSubmit = handleSubmit(async (data) => { + setIsLoading(true); + try { + const res = await axios.post( + `${import.meta.env.VITE_API_URL}/send-otp`, + { + mobile_number: Number(data.mobileNumber), + }, + ); + + if (res.status === 200) { + navigate(`/forgot-password/verify?phone=${data.mobileNumber}`) + } else { + alert(res.data.message || "Something went wrong"); + } + console.log("============", res); + + } catch (error) { + console.log('error', error); + + if (error) { + toaster.create({ + // title: error?.response?.data?.message, + title: "Something Went Wrong", + type: "info", + }) + // console.log("Login failed", error?.response?.data?.message); + setIsLoading(false); + } + } + }); + + return ( + + + + + + + +
+ +
+ + + + + Forgot Password + + + + + { + const target = e.target as HTMLInputElement; + target.value = target.value.replace(/\D/g, "").slice(0, 10); + }} + /> + + + + + + +
+
+ ); +}; + +export default ForgotPassword; diff --git a/src/Pages/Login.tsx b/src/Pages/Login.tsx index 585aada..3b5382b 100644 --- a/src/Pages/Login.tsx +++ b/src/Pages/Login.tsx @@ -5,7 +5,6 @@ import { Image, Input, Text, - Theme, VStack, } from "@chakra-ui/react"; import axios from "axios"; @@ -19,8 +18,8 @@ import { Button } from "../components/ui/button"; import { Field } from "../components/ui/field"; import { toaster, Toaster } from "../components/ui/toaster"; import { PasswordInput } from "../components/ui/password-input"; -import { useNavigate } from "react-router-dom"; -import ForgetPassword from "./ForgetPassword"; +import { Link, useNavigate } from "react-router-dom"; +// import ForgetPassword from "./ForgetPassword"; interface FormValues { mobileNumber: number; @@ -63,8 +62,8 @@ const Login = () => { }, } ); - console.log("============",res); - + console.log("============", res); + if (res.data) { setIsAuthenticate(true); @@ -80,7 +79,7 @@ const Login = () => { } } catch (error) { console.log('error', error); - + if (error) { toaster.create({ // title: error?.response?.data?.message, @@ -182,7 +181,15 @@ const Login = () => { Login - + {/* */} + + + Forgot Password + + diff --git a/src/Pages/ManageCMS/AboutUs/AboutUsAddModel.tsx b/src/Pages/ManageCMS/AboutUs/AboutUsAddModel.tsx index e9a3a6a..7424d1e 100644 --- a/src/Pages/ManageCMS/AboutUs/AboutUsAddModel.tsx +++ b/src/Pages/ManageCMS/AboutUs/AboutUsAddModel.tsx @@ -21,7 +21,7 @@ function AboutUsAddModel({ aboutUsData }: { aboutUsData: any }) { const [isOpen, setIsOpen] = useState(false); // RTK Query Mutation Hook - const [updateAboutUs, { isLoading }] = useUpdateAboutUsMutation(); + const [updateAboutUs] = useUpdateAboutUsMutation(); // React Hook Form const { diff --git a/src/Pages/ManageCMS/FAQ/EditDetails.tsx b/src/Pages/ManageCMS/FAQ/EditDetails.tsx index 22cb0f9..b712125 100644 --- a/src/Pages/ManageCMS/FAQ/EditDetails.tsx +++ b/src/Pages/ManageCMS/FAQ/EditDetails.tsx @@ -91,7 +91,7 @@ import { DialogTitle, DialogTrigger, } from "../../../components/ui/dialog"; -import { Field, Input, Span, Stack, Textarea } from "@chakra-ui/react"; +import { Field, Input, Stack, Textarea } from "@chakra-ui/react"; import Edit from "../../../components/ActionIcons/Edit"; interface RowData { diff --git a/src/Pages/ManageCMS/FAQ/FAQ.tsx b/src/Pages/ManageCMS/FAQ/FAQ.tsx index 331b1c2..cc0a840 100644 --- a/src/Pages/ManageCMS/FAQ/FAQ.tsx +++ b/src/Pages/ManageCMS/FAQ/FAQ.tsx @@ -30,7 +30,7 @@ const managepost: any[] = [ {/* */} - + } diff --git a/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicy.tsx b/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicy.tsx index 65e4510..357faad 100644 --- a/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicy.tsx +++ b/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicy.tsx @@ -8,7 +8,10 @@ import { useContext, useEffect } from "react"; const PrivacyPolicy = () => { - const { data, isLoading, isFetching } = useGetPrivacyPolicyQuery(); + const { data, isLoading, isFetching, refetch } = useGetPrivacyPolicyQuery(); + + console.log('PRIVACY', data?.data); + const context = useContext(GlobalStateContext); if (!context) throw new Error('App must be used within a GlobalStateProvider'); @@ -35,16 +38,15 @@ const PrivacyPolicy = () => { Privacy Policy 🎓 {privacy_language?.language_name} - + - {content} - + dangerouslySetInnerHTML={{ __html: content }} + /> )} diff --git a/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicyAddModel.tsx b/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicyAddModel.tsx index fda8072..39b512b 100644 --- a/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicyAddModel.tsx +++ b/src/Pages/ManageCMS/PrivacyPolicy/PrivacyPolicyAddModel.tsx @@ -9,27 +9,77 @@ import { DialogTitle, DialogTrigger, } from "../../../components/ui/dialog"; -import { Field, Stack, Text, Textarea } from "@chakra-ui/react"; +import { Field, Stack, Text } from "@chakra-ui/react"; import { Button } from "../../../components/ui/button"; +import { useUpdatePrivacyPolicyMutation } from "../../../Redux/Service/privacy.policy.service"; +import { Controller, useForm } from "react-hook-form"; +import { useState } from "react"; +import ReactQuill from "react-quill"; + +function PrivacyPolicyAddModel({ policyData, refetch }: { policyData: any, refetch: VoidFunction }) { + const [isOpen, setIsOpen] = useState(false); + const [selectedId, setSelectedId] = useState(null); + const [updatePrivacyPolicy] = useUpdatePrivacyPolicyMutation() + const { + control, + handleSubmit, + reset, + setValue, + } = useForm({ + defaultValues: { + content: "", + languageCode: "", + }, + }); + + console.log('POLICY', policyData); + + const handleEditClick = (data: any) => { + setSelectedId(data?.id) + setValue("content", data.content); // Pre-fill the content field + setValue("languageCode", data.privacy_language.language_code); // Pre-fill the language code + setIsOpen(true); // Open dialog + }; + + const onSubmit = async (formData: any) => { + if (!formData.content.trim()) return; // Prevent empty updates + + try { + await updatePrivacyPolicy({ + id: selectedId, + content: formData.content, + language_code: formData.languageCode, + }).unwrap(); + setIsOpen(false); // Close dialog on success + reset(); // Reset the form + refetch() + } catch (error) { + console.error("Update failed:", error); + } + }; -function PrivacyPolicyAddModel() { return ( - - - {/* */} - - + + {policyData?.map((item: any) => ( + + + + ))} PrivacyPolicy -