[ update changes ]

This commit is contained in:
YasinShaikh123
2025-06-18 15:34:32 +05:30
parent 021eb6e4db
commit 0531684c73
24 changed files with 952 additions and 723 deletions

4
.env
View File

@@ -4,8 +4,8 @@
# VITE_PASSWORD="71%@L%es^bUX94`J9XT*@bh,._WWM{$%^^&&" # VITE_PASSWORD="71%@L%es^bUX94`J9XT*@bh,._WWM{$%^^&&"
# VITE_APP_NAME=MyViteApp # VITE_APP_NAME=MyViteApp
# VITE_IMG_TEMPLATES='https://ssa.betadelivery.com/storage/app/public/uploads/post_templates/' # VITE_IMG_TEMPLATES='https://ssa.betadelivery.com/storage/app/public/uploads/post_templates/'
# VITE_API_URL='https://ssa.betadelivery.com/testing/apia/v1' VITE_API_URL='https://ssa.betadelivery.com/testing/apia/v1'
VITE_API_URL='https://ssa.betadelivery.com/apia/v1' # VITE_API_URL='https://ssa.betadelivery.com/apia/v1'
VITE_USER_NAME="Admin" VITE_USER_NAME="Admin"
VITE_PASSWORD="71%@L%es^bUX94`J9XT*@bh,._WWM{$%^^&&" VITE_PASSWORD="71%@L%es^bUX94`J9XT*@bh,._WWM{$%^^&&"
# VITE_PASSWORD="71%@L%es^bUX94`J9XT*%4&^%tUU^%Q^ffgt" # VITE_PASSWORD="71%@L%es^bUX94`J9XT*%4&^%tUU^%Q^ffgt"

View File

@@ -3,7 +3,8 @@
<head> <head>
<meta charset="UTF-8" name="referrer" content="strict-origin-when-cross-origin" /> <meta charset="UTF-8" name="referrer" content="strict-origin-when-cross-origin" />
<link rel="icon" type="image/png+xml" href="/src/assets/favicon.png" /> <!-- <link rel="icon" type="image/png+xml" href="/src/assets/favicon.png" /> -->
<link rel="icon" type="image/png" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SEO Admin</title> <title>SEO Admin</title>
</head> </head>

View File

@@ -160,7 +160,7 @@ const FAQ = () => {
handleDeleteFaq(selectedFaqId); handleDeleteFaq(selectedFaqId);
} }
}} }}
/> />
<Box> <Box>
<Switch <Switch
colorPalette={'teal'} colorPalette={'teal'}

View File

@@ -95,7 +95,7 @@ function FaqAddModel({ refetch }: { refetch: VoidFunction }) {
<DialogTitle alignSelf="center" color="black" fontSize="14px"> <DialogTitle alignSelf="center" color="black" fontSize="14px">
Add Add
</DialogTitle> </DialogTitle>
</DialogHeader> </DialogHeader>
<DialogBody bg="white"> <DialogBody bg="white">
<Stack py={3}> <Stack py={3}>

View File

@@ -1,4 +1,4 @@
import { Badge, HStack, Text, VStack } from "@chakra-ui/react"; import { Badge, HStack, Stack, Text, VStack } from "@chakra-ui/react";
import { useGetPrivacyPolicyQuery } from "../../../Redux/Service/privacy.policy.service"; import { useGetPrivacyPolicyQuery } from "../../../Redux/Service/privacy.policy.service";
import MainFrame from "../../../components/MainFrame"; import MainFrame from "../../../components/MainFrame";
import { Spinner } from "../../../components/Sipnner/Spinner"; import { Spinner } from "../../../components/Sipnner/Spinner";
@@ -6,54 +6,77 @@ import PrivacyPolicyAddModel from "./PrivacyPolicyAddModel";
import GlobalStateContext from "../../../Contexts/GlobalStateContext"; import GlobalStateContext from "../../../Contexts/GlobalStateContext";
import { useContext, useEffect } from "react"; import { useContext, useEffect } from "react";
const PrivacyPolicy = () => { const PrivacyPolicy = () => {
const { data, isLoading, isFetching, refetch } = useGetPrivacyPolicyQuery(); const { data, isLoading, isFetching, refetch } = useGetPrivacyPolicyQuery();
console.log('PRIVACY', data?.data); console.log("PRIVACY", data?.data);
const context = useContext(GlobalStateContext); const context = useContext(GlobalStateContext);
if (!context) throw new Error('App must be used within a GlobalStateProvider'); if (!context)
throw new Error("App must be used within a GlobalStateProvider");
const { setIsBarLoading } = context; const { setIsBarLoading } = context;
useEffect(() => { useEffect(() => {
setIsBarLoading(isFetching) setIsBarLoading(isFetching);
}, [data]) }, [data]);
console.log('Privacy Policy Data:', data?.data); console.log("Privacy Policy Data:", data?.data);
return ( return (
<MainFrame transperant={true}> <MainFrame transperant={true}>
<VStack gap={4} pb={4} pt={0}> <Stack bg={"#fff"} w={"100%"} p={4} borderRadius={4} mb={4}>
{isLoading || isFetching ? <Text color={"black"} textAlign={"left"} fontWeight={"600"}>
<Spinner /> : data?.data?.map(({ id, content, privacy_language }) => <VStack bg={'#fff'} Privacy Policy
boxShadow={'rgba(99, 99, 99, 0.2) 0px 2px 8px 0px'} rounded={'lg'} p={3} key={id}> </Text>
<HStack </Stack>
w={"100%"} <VStack gap={4} pb={4} pt={0}>
justifyContent={"space-between"} {isLoading || isFetching ? (
<Spinner />
py={0} ) : (
px={0} data?.data?.map(({ id, content, privacy_language }) => (
<VStack
bg={"#fff"}
boxShadow={"rgba(99, 99, 99, 0.2) 0px 2px 8px 0px"}
rounded={"lg"}
p={3}
key={id}
> >
<Text as={"span"} fontSize={"sm"} fontWeight={500} color={"#000"}> <HStack w={"100%"} justifyContent={"space-between"} py={0} px={0}>
Privacy Policy <Badge variant={'surface'} colorPalette="cyan" ms={2} size={'sm'} fontSize={'xs'} px={2}>🎓 {privacy_language?.language_name}</Badge> <Text
</Text> as={"span"}
fontSize={"sm"}
fontWeight={500}
color={"#000"}
>
<Badge
variant={"surface"}
colorPalette="cyan"
size={"sm"}
fontSize={"xs"}
px={2}
>
🎓 {privacy_language?.language_name}
</Badge>
</Text>
<PrivacyPolicyAddModel policyData={{ id, content, privacy_language }} refetch={refetch} /> <PrivacyPolicyAddModel
</HStack> policyData={{ id, content, privacy_language }}
<Text refetch={refetch}
as="p" />
fontSize="sm" </HStack>
fontWeight={400} <Text
color="#1D1D1D" as="p"
dangerouslySetInnerHTML={{ __html: content }} fontSize="sm"
/> fontWeight={400}
color="#1D1D1D"
</VStack>)} dangerouslySetInnerHTML={{ __html: content }}
/>
</VStack>
))
)}
</VStack> </VStack>
</MainFrame> </MainFrame>
); );
}; };
export default PrivacyPolicy; export default PrivacyPolicy;

View File

@@ -1,59 +1,67 @@
import { Badge, HStack, Spinner, Stack, Text, VStack } from "@chakra-ui/react"; import { Badge, HStack, Spinner, Stack, Text, VStack } from "@chakra-ui/react";
import MainFrame from "../../../components/MainFrame" import MainFrame from "../../../components/MainFrame";
import TermsAndConditionsAddModel from "./TermsAndConditionsAddModel"; import TermsAndConditionsAddModel from "./TermsAndConditionsAddModel";
import { useGetTermsQuery } from "../../../Redux/Service/terms.and.condition.service"; import { useGetTermsQuery } from "../../../Redux/Service/terms.and.condition.service";
const TermsAndConditions = () => { const TermsAndConditions = () => {
const { data, refetch, isLoading, isFetching } = useGetTermsQuery() const { data, refetch, isLoading, isFetching } = useGetTermsQuery();
console.log(data);
return ( return (
<MainFrame transperant={true}>
<VStack gap={4} pb={4} pt={0}>
<Stack bg={"#fff"} w={"100%"} mt={2} p={4} borderRadius={4}>
<Text color={"black"} textAlign={"left"} fontWeight={"600"}>
Terms and Conditions
</Text>
</Stack>
<MainFrame> {isLoading || isFetching ? (
<MainFrame transperant={true}> <Spinner />
<VStack gap={4} pb={4} pt={0}> ) : (
<Stack bg={"#fff"} w={"100%"} mt={2} p={4} borderRadius={4}><Text color={"black"} textAlign={"left"} fontWeight={"600"} >Terms and Conditions data?.data?.map(({ id, content, terms_cond_language }) => (
</Text></Stack> <VStack
bg={"#fff"}
{isLoading || isFetching ? ( boxShadow={"rgba(99, 99, 99, 0.2) 0px 2px 8px 0px"}
<Spinner /> rounded={"lg"}
) : ( p={3}
data?.data?.map(({ id, content, terms_cond_language }) => ( key={id}
<VStack >
bg={"#fff"} <HStack w={"100%"} justifyContent={"space-between"} py={0} px={0}>
boxShadow={"rgba(99, 99, 99, 0.2) 0px 2px 8px 0px"} <Text
rounded={"lg"} as={"span"}
p={3} fontSize={"sm"}
key={id} fontWeight={500}
> color={"#000"}
>
<HStack w={"100%"} justifyContent={"space-between"} py={0} px={0}> <Badge
<Text as={"span"} fontSize={"sm"} fontWeight={500} color={"#000"}> variant={"surface"}
<Badge colorPalette="cyan"
variant={"surface"} ms={2}
colorPalette="cyan" size={"sm"}
ms={2} fontSize={"xs"}
size={"sm"} px={2}
fontSize={"xs"} >
px={2} 🎓 {terms_cond_language?.language_name}
> </Badge>
🎓 {terms_cond_language?.language_name}
</Badge>
</Text>
{/* Pass Data to AboutUsAddModel */}
<TermsAndConditionsAddModel termsData={{ id, content, terms_cond_language }} refetch={refetch} />
</HStack>
<Text as="p" fontSize="sm" fontWeight={400} color="#1D1D1D">
{/* {content} */}
<div dangerouslySetInnerHTML={{ __html: content }} />
</Text> </Text>
</VStack>
)) {/* Pass Data to AboutUsAddModel */}
)} <TermsAndConditionsAddModel
</VStack> termsData={{ id, content, terms_cond_language }}
</MainFrame> refetch={refetch}
</MainFrame > />
) </HStack>
} <Text as="p" fontSize="sm" fontWeight={400} color="#1D1D1D">
export default TermsAndConditions {/* {content} */}
<div dangerouslySetInnerHTML={{ __html: content }} />
</Text>
</VStack>
))
)}
</VStack>
</MainFrame>
);
};
export default TermsAndConditions;

View File

@@ -1,38 +1,77 @@
import { Box, HStack, Input, Text } from "@chakra-ui/react"; import { Box, HStack, Input, Text } from "@chakra-ui/react";
import MainFrame from "../../components/MainFrame" import MainFrame from "../../components/MainFrame";
import PendingRequests from "../../Pages/ManageContact/PendingRequests" import PendingRequests from "../../Pages/ManageContact/PendingRequests";
import { InputGroup } from "../../components/ui/input-group"; import { InputGroup } from "../../components/ui/input-group";
import { LuSearch } from "react-icons/lu"; import { LuSearch } from "react-icons/lu";
import DataTable from "../../components/DataTable"; import DataTable from "../../components/DataTable";
import { useGetContactQuery } from "../../Redux/Service/manage.contactus.service";
import { useEffect, useState } from "react";
import { Spinner } from "../../components/Sipnner/Spinner";
// table data // table data
const tableHeadRow = ["Sr. No", "Email id", "Name", "Date", "Action"];
const tableHeadRow = [ const ManageContact = () => {
"Sr. No", const { data, isLoading, isError } = useGetContactQuery();
"Email id", const [localData, setLocalData] = useState([]);
"Name",
"Date",
"Action",
];
const managepost: any[] = [ useEffect(() => {
...Array.from({ length: 12 }, (_, i) => ({ if (data) {
"Sr. No": i + 1, setLocalData((data as any)?.data?.data || []);
"Email id": "ABC@gmail.com", }
"Name": "Pooja", }, [data]);
"Date": "11/02/1989",
"Action": ( const formatDateOfBirth = (dob: string): string => {
return new Date(dob).toLocaleDateString("en-GB", {
day: "2-digit",
month: "2-digit",
year: "numeric",
});
};
const managepost = localData?.map((agency: any, index: number) => ({
"Sr. No": index + 1, // Typically Sr. No starts from 1, not using id which might not be sequential
"Email id": agency?.email || "-",
Name: agency?.first_name || "-",
Date: formatDateOfBirth(agency?.created_at) || "-",
Action: (
<HStack justifyContent="center"> <HStack justifyContent="center">
<PendingRequests /> <PendingRequests />
</HStack> </HStack>
), ),
})), }));
];
if (isLoading) {
return (
<MainFrame>
<Box
display="flex"
justifyContent="center"
alignItems="center"
height="100%"
>
<Spinner />
</Box>
</MainFrame>
);
}
if (isError) {
return (
<MainFrame>
<Box
display="flex"
justifyContent="center"
alignItems="center"
height="100%"
>
<Text>Error loading data</Text>
</Box>
</MainFrame>
);
}
const ManageContact = () => {
return ( return (
<MainFrame> <MainFrame>
<Box> <Box>
<HStack <HStack
@@ -43,13 +82,16 @@ const ManageContact = () => {
px={3} px={3}
> >
<Text as={"span"} fontSize={"sm"} fontWeight={500} color={"#000"}> <Text as={"span"} fontSize={"sm"} fontWeight={500} color={"#000"}>
Contact Requests Contact Requests
</Text> </Text>
<HStack > <HStack>
<InputGroup <InputGroup
startElement={ startElement={
<LuSearch fontSize={"xs"} style={{ position: 'relative', left: '10px' }} /> <LuSearch
fontSize={"xs"}
style={{ position: "relative", left: "10px" }}
/>
} }
color={"#000"} color={"#000"}
> >
@@ -63,20 +105,20 @@ const ManageContact = () => {
size={"xs"} size={"xs"}
fontSize={"sm"} fontSize={"sm"}
placeholder="Search..." placeholder="Search..."
bgColor={'#EEEEEE'} bgColor={"#EEEEEE"}
ps={8} ps={8}
/> />
</InputGroup> </InputGroup>
{/* <Button bgColor={'#EEEEEE'} pl={3} pr={3}><IoMdAdd /> <Text>Add</Text></Button> */}
</HStack> </HStack>
</HStack> </HStack>
<DataTable <DataTable
sortableColumns={["Name", "Registration Date "]} sortableColumns={["Name", "Registration Date "]}
tableHeadRow={tableHeadRow} tableHeadRow={tableHeadRow}
data={managepost} data={managepost || []} // Ensure an empty array is passed if managepost is undefined
/> />
</Box> </Box>
</MainFrame> </MainFrame>
) );
} };
export default ManageContact
export default ManageContact;

View File

@@ -48,6 +48,9 @@ const managepost: any[] = [
), ),
})), })),
]; ];
const ManageGroups = () => { const ManageGroups = () => {
return ( return (
<MainFrame> <MainFrame>

View File

@@ -1,7 +1,10 @@
import { import {
Box, HStack, Box,
// Image, HStack,
Input, Text Image,
// Image,
Input,
Text,
} from "@chakra-ui/react"; } from "@chakra-ui/react";
import { LuSearch } from "react-icons/lu"; import { LuSearch } from "react-icons/lu";
// import { RiDeleteBin5Line } from "react-icons/ri"; // import { RiDeleteBin5Line } from "react-icons/ri";
@@ -11,6 +14,15 @@ import MainFrame from "../../components/MainFrame";
import { InputGroup } from "../../components/ui/input-group"; import { InputGroup } from "../../components/ui/input-group";
import ManageJobsAdd from "./ManageJobsAdd"; import ManageJobsAdd from "./ManageJobsAdd";
import ViewManageJob from "./ViewManageJob"; import ViewManageJob from "./ViewManageJob";
import {
useDeleteJobsPostMutation,
useGetManageJobsQuery,
} from "../../Redux/Service/manage.jobs.service";
import { useEffect, useState } from "react";
import { Spinner } from "../../components/Sipnner/Spinner";
import Delete from "../../components/ActionIcons/Delete";
import { toaster } from "../../components/ui/toaster";
import AlertDailog from "../../components/AlertDailog";
// import { useState } from "react"; // import { useState } from "react";
// import { useGetManageJobsQuery } from "../../Redux/Service/manage.jobs.service"; // import { useGetManageJobsQuery } from "../../Redux/Service/manage.jobs.service";
// import Delete from "../../components/ActionIcons/Delete"; // import Delete from "../../components/ActionIcons/Delete";
@@ -27,36 +39,93 @@ const tableHeadRow = [
"Action", "Action",
]; ];
const managepost: any[] = [ const ManageJobs = () => {
...Array.from({ length: 12 }, (_, i) => ({ const [currentPage] = useState(1);
"Sr. No": i + 1, const [localData, setLocalData] = useState([]);
"Job Title": "Freelance content writer", const { data, refetch, isLoading } = useGetManageJobsQuery(currentPage);
"Workspace mode": "Onsite", const [deleteJobsPost] = useDeleteJobsPostMutation();
Category: "IT", const [deleteModal, setDeleteModal] = useState(false);
"Sub-category": "Flutter dev", const [selectedJobsId, setSelectedJobsId] = useState<number | null>(null);
Salary: "3.5 LPA",
useEffect(() => {
if (data) {
setLocalData((data as any)?.data?.data || []);
}
}, [data]);
console.log(data?.data.data);
const handleDeleteJobs = async (jobsId: number) => {
try {
const response = await deleteJobsPost({ id: jobsId }).unwrap();
if (response?.status === "success") {
toaster.create({
title: "Success",
description: "Jobs deleted successfully",
type: "Success",
});
refetch();
}
} catch (error) {
console.error("Error deleting FAQ:", error);
toaster.create({
title: "Error",
description: "Something went wrong",
type: "error",
});
}
};
const managepost = localData?.map((agency: any, index: number) => ({
"Sr. No": index + 1,
"Job Title": agency?.job_title,
"Workspace mode": agency?.workspace?.en_name,
Category: agency?.industry?.en_name,
"Sub-category": agency?.department?.en_name,
Salary: agency?.ctc_amount,
Action: ( Action: (
<HStack justifyContent="center"> <HStack justifyContent="center">
<ViewManageJob /> <ViewManageJob />
<ManageJobsAdd /> <ManageJobsAdd />
{/* <AlertDailog <AlertDailog
AltertTiggerIcon={() => <Delete />} isOpen={deleteModal}
alertText="Delete Users" AltertTiggerIcon={() => (
<Delete
onClick={() => {
setSelectedJobsId(agency.id);
setDeleteModal(true);
}}
/>
)}
alertText="Delete FAQ"
alertIcon={<Image src={"DeleteIcon"} h={"39px"} />} alertIcon={<Image src={"DeleteIcon"} h={"39px"} />}
alertCaption="are you sure you want to delete ?" alertCaption="are you sure you want to delete ?"
onClose={() => setDeleteModal(false)}
onConfirm={() => { onConfirm={() => {
console.log("User deleted:", i + 1); // console.log("Deleting FAQ with ID:", selectedFaqId); // Correct ID
if (selectedJobsId) {
setDeleteModal(false);
handleDeleteJobs(selectedJobsId);
}
}} }}
/> */} />
</HStack> </HStack>
), ),
})), }));
];
const ManageJobs = () => { if (isLoading) {
// const [currentPage, setCurrentPage] = useState(1); return (
// const { data, refetch } = useGetManageJobsQuery(currentPage) <MainFrame>
// console.log(data?.data.data); <Box
display="flex"
justifyContent="center"
alignItems="center"
height="100%"
>
<Spinner />
</Box>
</MainFrame>
);
}
return ( return (
<MainFrame> <MainFrame>

View File

@@ -27,6 +27,7 @@ import {
SelectTrigger, SelectTrigger,
} from "../../components/ui/select"; } from "../../components/ui/select";
import View from "../../components/ActionIcons/View"; import View from "../../components/ActionIcons/View";
import { useLazyViewJobsQuery } from "../../Redux/Service/manage.jobs.service";
const frameworks = createListCollection({ const frameworks = createListCollection({
items: [ items: [
@@ -37,238 +38,258 @@ const frameworks = createListCollection({
], ],
}); });
function ViewManageJob() { function ViewManageJob() {
const [trigger, { data }] = useLazyViewJobsQuery();
console.log(data);
// const handleView = () => {
// trigger(id);
// };
const viewJobs = data;
console.log();
return ( return (
<DialogRoot placement="center"> <DialogRoot placement="center">
<DialogTrigger asChild> <DialogTrigger asChild>
<Span><View /></Span> <Span>
<View />
</Span>
</DialogTrigger> </DialogTrigger>
<DialogContent {/* {viewJobs?.map((data: any) => ( */}
bg={"#fff"} <DialogContent
// w={{ lg: "60%", md: "230px" }} bg={"#fff"}
w={{ base: "90%", md: "400px" }} // w={{ lg: "60%", md: "230px" }}
height={"80vh"} w={{ base: "90%", md: "400px" }}
overflow={"scroll"} height={"80vh"}
overflowX="hidden" overflow={"scroll"}
p={3} // Reduced padding overflowX="hidden"
bgSize={"md"} p={3} // Reduced padding
> bgSize={"md"}
<DialogHeader bg="white"> >
<DialogTitle alignSelf="center" color="black" fontSize="14px"> <DialogHeader bg="white">
Add Details <DialogTitle alignSelf="center" color="black" fontSize="14px">
</DialogTitle> Add Details
</DialogHeader> </DialogTitle>
</DialogHeader>
<DialogBody bg="white"> <DialogBody bg="white">
<Stack py={3}> <Stack py={3}>
<Field.Root> <Field.Root>
<Field.Label color="black" pt={1} fontSize="12px"> <Field.Label color="black" pt={1} fontSize="12px">
Job title Job title
</Field.Label> </Field.Label>
<Input <Input
placeholder="Enter the Job Title" placeholder="Enter the Job Title"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label color="black" pt={1} fontSize="12px">
Workspace mode
</Field.Label>
<Input
placeholder="Enter the Workspace Mode"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Category
</Field.Label>
<Input
placeholder="Enter the Category"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Sub-Category
</Field.Label>
<Input
placeholder="Enter the Sub-Category"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Salary
</Field.Label>
<Input
placeholder="Enter the Salary"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Experience
</Field.Label>
<Input
placeholder="Enter the Experience"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Job Location
</Field.Label>
<Input
placeholder="Enter the Job Location"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
{/* <Field.Label pt={1} color="black" fontSize="12px">Country Selection</Field.Label>
<Input placeholder="Enter the Country Selection" /> */}
<SelectRoot collection={frameworks} size="sm" w={"100%"}>
<SelectLabel pt={1} color="black" fontSize="12px">
Country Selection
</SelectLabel>
<SelectTrigger
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
borderRadius={"5px"}
>
<SelectValueText
placeholder="Enter the Country Selection"
pb={"6px"}
fontSize={"12px"}
/> />
</SelectTrigger> </Field.Root>
<SelectContent position={"relative"} zIndex={"9999"} bg={"#fff"}> <Field.Root>
{frameworks.items.map((movie) => ( <Field.Label color="black" pt={1} fontSize="12px">
<SelectItem Workspace mode
item={movie} </Field.Label>
key={movie.value} <Input
color={"black"} placeholder="Enter the Workspace Mode"
pl={2} bgColor="#EEEEEE"
p={1} color="black"
_hover={{ bg: "#F0F0F0" }} // Light grey background on hover border="none"
fontSize="12px" pl={1}
> fontSize="12px"
{movie.label} height="30px"
</SelectItem> />
))} </Field.Root>
</SelectContent> <Field.Root>
</SelectRoot> <Field.Label pt={1} color="black" fontSize="12px">
Category
</Field.Label>
<Input
placeholder="Enter the Category"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Sub-Category
</Field.Label>
<Input
placeholder="Enter the Sub-Category"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Salary
</Field.Label>
<Input
placeholder="Enter the Salary"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Experience
</Field.Label>
<Input
placeholder="Enter the Experience"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
<Field.Root>
<Field.Label pt={1} color="black" fontSize="12px">
Job Location
</Field.Label>
<Input
placeholder="Enter the Job Location"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
</Field.Root>
{/* <Field.Label pt={1} color="black" fontSize="12px">Country Selection</Field.Label>
<Input placeholder="Enter the Country Selection" /> */}
<SelectRoot collection={frameworks} size="sm" w={"100%"}>
<SelectLabel pt={1} color="black" fontSize="12px">
Country Selection
</SelectLabel>
<SelectTrigger
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
borderRadius={"5px"}
>
<SelectValueText
placeholder="Enter the Country Selection"
pb={"6px"}
fontSize={"12px"}
/>
</SelectTrigger>
<SelectContent
position={"relative"}
zIndex={"9999"}
bg={"#fff"}
>
{frameworks.items.map((movie) => (
<SelectItem
item={movie}
key={movie.value}
color={"black"}
pl={2}
p={1}
_hover={{ bg: "#F0F0F0" }} // Light grey background on hover
fontSize="12px"
>
{movie.label}
</SelectItem>
))}
</SelectContent>
</SelectRoot>
<Field.Root> <Field.Root>
<Field.Label pt={1} color="black" fontSize="12px"> <Field.Label pt={1} color="black" fontSize="12px">
Job type Job type
</Field.Label> </Field.Label>
<Input <Input
placeholder="Enter the Job Type" placeholder="Enter the Job Type"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
/> />
</Field.Root> </Field.Root>
<Field.Root> <Field.Root>
<Field.Label pt={1} color="black" fontSize="12px"> <Field.Label pt={1} color="black" fontSize="12px">
Skills required Skills required
</Field.Label> </Field.Label>
<Input <Input
placeholder="Enter the Skills Required" placeholder="Enter the Skills Required"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
/> />
</Field.Root> </Field.Root>
<Field.Root> <Field.Root>
<Field.Label pt={1} color="black" fontSize="12px"> <Field.Label pt={1} color="black" fontSize="12px">
Job Description* Job Description*
</Field.Label> </Field.Label>
<Input <Input
placeholder="Enter the Job Description" placeholder="Enter the Job Description"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
/> />
</Field.Root> </Field.Root>
<Field.Root> <Field.Root>
<Field.Label pt={1} color="black" fontSize="12px"> <Field.Label pt={1} color="black" fontSize="12px">
Upload Image Upload Image
</Field.Label> </Field.Label>
<Input <Input
placeholder="Upload Image" placeholder="Upload Image"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
/> />
</Field.Root> </Field.Root>
</Stack> </Stack>
</DialogBody> </DialogBody>
<DialogFooter display="flex" justifyContent="center" pt={"2"}> <DialogFooter display="flex" justifyContent="center" pt={"2"}>
<Button <Button
w="100%" w="100%"
bg="#02A0A0" bg="#02A0A0"
color={"#fff"} color={"#fff"}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
> >
Save Save
</Button> </Button>
</DialogFooter> </DialogFooter>
<DialogCloseTrigger color="black" /> <DialogCloseTrigger color="black" />
</DialogContent> </DialogContent>
{/* ))} */}
</DialogRoot> </DialogRoot>
); );
} }

View File

@@ -4,34 +4,80 @@ import DataTable from "../../../components/DataTable";
import { Switch } from "../../../components/ui/switch"; import { Switch } from "../../../components/ui/switch";
import { InputGroup } from "../../../components/ui/input-group"; import { InputGroup } from "../../../components/ui/input-group";
import { LuSearch } from "react-icons/lu"; import { LuSearch } from "react-icons/lu";
import { useGetContactQuery } from "../../../Redux/Service/deactivated.account.service";
import { useEffect, useState } from "react";
import { Spinner } from "../../../components/Sipnner/Spinner";
const tableHeadRow = [ const tableHeadRow = [
"Sr. No", "Sr. No",
"First Name", "First Name",
"Last Name", "Last Name",
"Company name", "User Type",
"Activate/Deactivate", "Activate/Deactivate",
]; ];
const manageUser: any[] = [ const DeactivatedAccounts = () => {
...Array.from({ length: 12 }, (_, i) => ({ const { data ,isLoading} = useGetContactQuery();
"Sr. No": i + 1, const [localData, setLocalData] = useState([]);
"First Name": "Ritesh",
"Last Name": "akanksha@gmail.com", useEffect(() => {
"Company name": "9876543210", if (data) {
setLocalData((data as any)?.data?.data || []);
}
}, [data]);
const manageUser = localData?.map((agency: any, index: number) => ({
"Sr. No": index + 1,
"First Name": agency?.first_name,
"Last Name": agency?.last_name,
"User Type": agency?.principal_type_xid === 3 ? "JobSeeker" : "Recruiter",
"Activate/Deactivate": ( "Activate/Deactivate": (
<Box display={'flex'} justifyContent={'center'}> <Box display={"flex"} justifyContent={"center"}>
<Switch size={'sm'} colorPalette={'teal'} /> <Switch
size={"sm"}
colorPalette={"teal"}
checked={agency.is_active === true}
// onChange={() => handleToggle(agency.id, agency.is_active ? "1" : "0")}
/>
</Box> </Box>
), ),
})), }));
];
if (isLoading) {
return (
<MainFrame>
<Box
display="flex"
justifyContent="center"
alignItems="center"
height="100%"
>
<Spinner />
</Box>
</MainFrame>
);
}
// if (isError) {
// return (
// <MainFrame>
// <Box
// display="flex"
// justifyContent="center"
// alignItems="center"
// height="100%"
// >
// <Text>Error loading data</Text>
// </Box>
// </MainFrame>
// );
// }
const DeactivatedAccounts = () => {
return ( return (
<MainFrame> <MainFrame>
<Box> <Box>
<HStack <HStack
w={"100%"} w={"100%"}
justifyContent={"space-between"} justifyContent={"space-between"}
mb={4} mb={4}
@@ -39,13 +85,16 @@ const DeactivatedAccounts = () => {
px={3} px={3}
> >
<Text as={"span"} fontSize={"sm"} fontWeight={500} color={"#000"}> <Text as={"span"} fontSize={"sm"} fontWeight={500} color={"#000"}>
Deactivated User Accounts Deactivated User Accounts
</Text> </Text>
<HStack> <HStack>
<InputGroup <InputGroup
startElement={ startElement={
<LuSearch fontSize={"xs"} style={{position:'relative',left:'10px'}} /> <LuSearch
fontSize={"xs"}
style={{ position: "relative", left: "10px" }}
/>
} }
color={"#000"} color={"#000"}
> >
@@ -59,7 +108,7 @@ const DeactivatedAccounts = () => {
size={"2xs"} size={"2xs"}
fontSize={"sm"} fontSize={"sm"}
placeholder="Search..." placeholder="Search..."
bgColor={'#EEEEEE'} bgColor={"#EEEEEE"}
ps={8} ps={8}
/> />
</InputGroup> </InputGroup>

View File

@@ -116,7 +116,7 @@ const RegisterUsers = () => {
"DOB": agency.date_of_birth ? new Date(agency.date_of_birth).toLocaleDateString('en-GB').replace(/\//g, '-') : 'N/A', "DOB": agency.date_of_birth ? new Date(agency.date_of_birth).toLocaleDateString('en-GB').replace(/\//g, '-') : 'N/A',
"Type Of User": agency.principal_type?.principal_type_title || 'N/A', "Type Of User": agency.principal_type?.principal_type_title || 'N/A',
// "Language": agency.principle_language_links.map(lang => lang.language_name).join(', ') || 'N/A', // "Language": agency.principle_language_links.map(lang => lang.language_name).join(', ') || 'N/A',
"Action": ( "Action": (
<HStack justifyContent="center"> <HStack justifyContent="center">
<EditRegisterUsers <EditRegisterUsers
// rowData={{ id: agency.id, en_name: agency.en_name, country_code: agency.country_code, phonecode: agency.phonecode, capital: agency.capital, currency: agency.currency, currency_name: agency.currency_name, currency_symbol: agency.currency_symbol }} // rowData={{ id: agency.id, en_name: agency.en_name, country_code: agency.country_code, phonecode: agency.phonecode, capital: agency.capital, currency: agency.currency, currency_name: agency.currency_name, currency_symbol: agency.currency_symbol }}

View File

@@ -175,7 +175,7 @@ const AgencyMaster = () => {
}} }}
onPageChange={handlePageChange} onPageChange={handlePageChange}
/> />
</Box> </Box>
</MainFrame> </MainFrame>
) )
} }

View File

@@ -28,7 +28,7 @@ function ViewAgencyAddModel({ refetch }: { refetch: VoidFunction }) {
...prev, ...prev,
[name]: value, [name]: value,
})); }));
} }
const handleSubmit = async () => { const handleSubmit = async () => {
console.log("New Data:", formData); console.log("New Data:", formData);

View File

@@ -1,13 +1,13 @@
import { import {
Box, Box,
Center, Center,
HStack, HStack,
IconButton, IconButton,
Image, Image,
Input, Input,
Stack, Stack,
Text, Text,
VStack, VStack,
} from "@chakra-ui/react"; } from "@chakra-ui/react";
import axios from "axios"; import axios from "axios";
import { useState } from "react"; import { useState } from "react";
@@ -19,154 +19,179 @@ import { InputGroup } from "../components/ui/input-group";
import { LuEye, LuEyeOff } from "react-icons/lu"; import { LuEye, LuEyeOff } from "react-icons/lu";
const SetNewPassword = () => { const SetNewPassword = () => {
const [password, setPassword] = useState(""); const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState("");
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const navigate = useNavigate(); const navigate = useNavigate();
const queryParams = new URLSearchParams(window.location.search); const queryParams = new URLSearchParams(window.location.search);
const id = queryParams.get("id"); const id = queryParams.get("id");
const [showOldPassword, setShowOldPassword] = useState(false); const [showOldPassword, setShowOldPassword] = useState(false);
const [showNewPassword, setShowNewPassword] = useState(false); const [showNewPassword, setShowNewPassword] = useState(false);
const handlePasswordSubmit = async () => { const handlePasswordSubmit = async () => {
// Validation // Validation
if (password.length < 8) { if (password.length < 8) {
toaster.create({ toaster.create({
title: "Password must be at least 8 characters long", title: "Password must be at least 8 characters long",
type: "error", type: "error",
}); });
return; return;
}
if (password !== confirmPassword) {
toaster.create({
title: "Passwords do not match",
type: "error",
});
return;
}
setIsLoading(true);
try {
const res = await axios.post(
`${import.meta.env.VITE_API_URL}/update-password`,
{
password: password,
confirm_password: confirmPassword,
id: Number(id),
} }
);
if (password !== confirmPassword) { if (res.data.status === "success") {
toaster.create({ toaster.create({
title: "Passwords do not match", title: "Password updated successfully",
type: "error", type: "success",
}); });
return; navigate("/login"); // Redirect to login page
} } else {
toaster.create({
title: res.data.message || "Failed to update password",
type: "error",
});
}
} catch (error: any) {
toaster.create({
title: error.response?.data?.message || "Something went wrong",
type: "error",
});
} finally {
setIsLoading(false);
}
};
setIsLoading(true); return (
<VStack w="100%" h="100vh" bg="#ffffff">
<HStack
boxShadow="rgba(99, 99, 99, 0.2) 0px 2px 8px 0px"
w="100%"
ps={8}
h="7%"
justifyContent="flex-start"
>
<Image w={50} src={logo} />
</HStack>
try { <Center w="100%" h="93%" p={8}>
const res = await axios.post(`${import.meta.env.VITE_API_URL}/update-password`, { <Box p={8} borderWidth={1} borderRadius="lg" boxShadow="lg" w={"400px"}>
password: password, <Text
confirm_password: confirmPassword, fontSize="20px"
id: Number(id) fontWeight="bold"
}); color="#313039"
marginBottom={"20px"}
>
Create a Password
</Text>
if (res.data.status === 'success') { <Stack>
toaster.create({ <Box mb={3}>
title: "Password updated successfully", <Text color="black" fontSize="12px" mb={2}>
type: "success", New password
}); </Text>
navigate("/login"); // Redirect to login page <InputGroup
} else { width={"100%"}
toaster.create({ endElement={
title: res.data.message || "Failed to update password", <IconButton
type: "error", aria-label={
}); showOldPassword ? "Hide password" : "Show password"
} }
} catch (error: any) { size="sm"
toaster.create({ onClick={() => setShowOldPassword(!showOldPassword)}
title: error.response?.data?.message || "Something went wrong", // _hover={{ bg: "transparent" }}
type: "error", bg={"transparent"}
}); color={"#000"}
} finally { height={"fit-content"}
setIsLoading(false); mr={2}
} >
}; {showOldPassword ? <LuEye /> : <LuEyeOff />}
</IconButton>
}
>
<Input
color="black"
pl={1}
fontSize="12px"
type={showOldPassword ? "password" : "text"}
border="1px solid grey"
value={password}
onChange={(e) => setPassword(e.target.value)}
size={"sm"}
/>
</InputGroup>
</Box>
return ( <Box>
<VStack w="100%" h="100vh" bg="#ffffff"> <Text color="black" mb={2} fontSize="12px">
<HStack Confirm password
boxShadow="rgba(99, 99, 99, 0.2) 0px 2px 8px 0px" </Text>
w="100%" <InputGroup
ps={8} width={"100%"}
h="7%" endElement={
justifyContent="flex-start" <IconButton
> aria-label={
<Image w={50} src={logo} /> showNewPassword ? "Hide password" : "Show password"
</HStack> }
size="sm"
// variant="outline"
onClick={() => setShowNewPassword(!showNewPassword)}
bg={"transparent"}
color={"#000"}
mr={2}
>
{showNewPassword ? <LuEye /> : <LuEyeOff />}
</IconButton>
}
>
<Input
color="black"
pl={1}
fontSize="12px"
type={showNewPassword ? "password" : "text"}
border="1px solid grey"
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
size={"sm"}
/>
</InputGroup>
</Box>
</Stack>
<Center w="100%" h="93%" p={8}> <Button
<Box p={8} borderWidth={1} borderRadius="lg" boxShadow="lg"> loading={isLoading}
<Text fontSize="24px" fontWeight="bold" color="#313039" textAlign="center"> mt={6}
Create a Password w="100%"
</Text> bg="#02A0A0"
color="white"
onClick={handlePasswordSubmit}
>
Confirm Password
</Button>
</Box>
</Center>
<Stack p={2}> <Toaster />
<Text color="black" pt={1} fontSize="12px">New password</Text> </VStack>
<InputGroup );
width={'100%'}
endElement={
<IconButton
aria-label={showOldPassword ? "Hide password" : "Show password"}
size="sm"
// variant="outline"
onClick={() => setShowOldPassword(!showOldPassword)}
_hover={{ bg: "transparent" }}
height={'fit-content'}
mr={2}
>
{showOldPassword ? <LuEye /> : <LuEyeOff />}
</IconButton>
}>
<Input
color="black"
pl={1}
fontSize="12px"
type={showOldPassword ? "password" : "text"}
border="1px solid grey"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</InputGroup>
<Text color="black" pt={1} fontSize="12px">Confirm password</Text>
<InputGroup
width={'100%'}
endElement={
<IconButton
aria-label={showNewPassword ? "Hide password" : "Show password"}
size="sm"
// variant="outline"
onClick={() => setShowNewPassword(!showNewPassword)}
_hover={{ bg: "transparent" }}
height={'fit-content'}
mr={2}
>
{showNewPassword ? <LuEye /> : <LuEyeOff />}
</IconButton>
}>
<Input
color="black"
pl={1}
fontSize="12px"
type={showNewPassword ? "password" : "text"}
border="1px solid grey"
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
/>
</InputGroup>
</Stack>
<Button
loading={isLoading}
mt={6}
w="100%"
bg="#02A0A0"
color="white"
onClick={handlePasswordSubmit}
>
Confirm Password
</Button>
</Box>
</Center>
<Toaster />
</VStack>
);
}; };
export default SetNewPassword; export default SetNewPassword;

View File

@@ -1,4 +1,3 @@
import { useState } from "react";
import { Button } from "../../components/ui/button"; import { Button } from "../../components/ui/button";
import { import {
DialogBody, DialogBody,
@@ -10,45 +9,32 @@ import {
DialogTitle, DialogTitle,
DialogTrigger, DialogTrigger,
} from "../../components/ui/dialog"; } from "../../components/ui/dialog";
import { import { Field, Grid, Heading, Input, Stack, Text } from "@chakra-ui/react";
Field,
Grid,
Heading,
Input,
Stack,
Text,
} from "@chakra-ui/react";
import { IoMdAdd } from "react-icons/io"; import { IoMdAdd } from "react-icons/io";
import { Checkbox } from "../../components/ui/checkbox"; import { Checkbox } from "../../components/ui/checkbox";
import { useCreateSubAdminPostMutation } from "../../Redux/Service/manage.subadmin.service"; import { useCreateSubAdminPostMutation } from "../../Redux/Service/manage.subadmin.service";
import { toaster } from "../../components/ui/toaster"; import { toaster } from "../../components/ui/toaster";
import { useState } from "react";
function AddModel({ refetch }: { refetch: VoidFunction }) { function AddModel({ refetch }: { refetch: VoidFunction }) {
const [createSubAdminPost, { isLoading }] = useCreateSubAdminPostMutation(); const [createSubAdminPost] = useCreateSubAdminPostMutation();
const [formData, setFormData] = useState({ // State fields
firstName: "", const [firstName, setFirstName] = useState("");
lastName: "", const [lastName, setLastName] = useState("");
dob: "", const [userName, setUserName] = useState("");
gender: "", const [dateOfBirth, setDateOfBirth] = useState("");
email: "", const [gender, setGender] = useState("");
phone: "" const [ setIsOpen] = useState(false);
});
const [isOpen, setIsOpen] = useState(false);
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setFormData(prev => ({
...prev,
[name]: value
}));
};
const handleSubmit = async () => { const handleSubmit = async () => {
const { firstName, lastName, dob, gender, email, phone } = formData; if (
!firstName.trim() ||
if (!firstName || !lastName || !dob || !gender || !email || !phone) { !lastName.trim() ||
!userName.trim() ||
!dateOfBirth.trim() ||
!gender.trim()
) {
toaster.create({ toaster.create({
title: "Error", title: "Error",
description: "Please fill in all required fields", description: "Please fill in all required fields",
@@ -58,45 +44,46 @@ function AddModel({ refetch }: { refetch: VoidFunction }) {
} }
const payload = { const payload = {
// principal_type_xid: 4, principal_type_xid: 4,
// principal_source_xid: 1, principal_source_xid: 1,
// user_name: `${firstName} ${lastName}`, user_name: userName,
first_name: firstName, first_name: firstName,
last_name: lastName, last_name: lastName,
date_of_birth: dob, date_of_birth: dateOfBirth,
gender, gender: gender,
email_address: email, email_address: "example@yopmail.com", // Hardcoded
phone_number: phone, phone_number: "9876543210", // Hardcoded
created_by: 1, created_by: 1,
}; };
try { try {
const response = await createSubAdminPost(payload).unwrap(); const response = await createSubAdminPost(payload).unwrap();
if (response) {
if (response.status === "success") {
toaster.create({ toaster.create({
title: "Success", title: "Success",
description: response.message || "Sub-admin added successfully", description: "Sub-admin created successfully",
type: "success", type: "success",
}); });
refetch(); refetch();
setIsOpen(false); setIsOpen(false);
setFirstName("");
setLastName("");
setUserName("");
setDateOfBirth("");
setGender("");
} }
} catch (error: any) { } catch (error) {
console.error("Error creating sub-admin:", error);
toaster.create({ toaster.create({
title: "Error", title: "Error",
description: error?.data?.message || "Failed to create sub-admin", description: "Failed to create sub-admin",
type: "error", type: "error",
}); });
} }
}; };
return ( return (
<DialogRoot <DialogRoot placement="center">
open={isOpen}
onOpenChange={(details) => setIsOpen(details.open)}
placement="center"
>
<DialogTrigger asChild> <DialogTrigger asChild>
<Button rounded={"md"} px={4} py={2} size={"xs"} bg={"#02A0A0"}> <Button rounded={"md"} px={4} py={2} size={"xs"} bg={"#02A0A0"}>
<IoMdAdd /> Add <IoMdAdd /> Add
@@ -110,6 +97,7 @@ function AddModel({ refetch }: { refetch: VoidFunction }) {
overflow={"scroll"} overflow={"scroll"}
overflowX="hidden" overflowX="hidden"
p={3} p={3}
bgSize={"md"}
> >
<DialogHeader bg="white"> <DialogHeader bg="white">
<DialogTitle alignSelf="center" color="black" fontSize="14px"> <DialogTitle alignSelf="center" color="black" fontSize="14px">
@@ -124,99 +112,76 @@ function AddModel({ refetch }: { refetch: VoidFunction }) {
First Name First Name
</Field.Label> </Field.Label>
<Input <Input
name="firstName"
placeholder="Enter the First Name" placeholder="Enter the First Name"
value={formData.firstName}
onChange={handleChange}
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
value={firstName}
onChange={(e) => setFirstName(e.target.value)}
/> />
<Field.Label color="black" pt={1} fontSize="12px"> <Field.Label color="black" pt={1} fontSize="12px">
Last Name Last Name
</Field.Label> </Field.Label>
<Input <Input
name="lastName"
placeholder="Enter the Last Name" placeholder="Enter the Last Name"
value={formData.lastName}
onChange={handleChange}
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
value={lastName}
onChange={(e) => setLastName(e.target.value)}
/>
<Field.Label color="black" pt={1} fontSize="12px">
Username
</Field.Label>
<Input
placeholder="Enter the Username"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
value={userName}
onChange={(e) => setUserName(e.target.value)}
/> />
<Field.Label color="black" pt={1} fontSize="12px"> <Field.Label color="black" pt={1} fontSize="12px">
DOB DOB
</Field.Label> </Field.Label>
<Input <Input
name="dob" placeholder="Enter the DOB"
placeholder="YYYY-MM-DD"
value={formData.dob}
onChange={handleChange}
type="date"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
type="date"
value={dateOfBirth}
onChange={(e) => setDateOfBirth(e.target.value)}
/> />
<Field.Label color="black" pt={1} fontSize="12px"> <Field.Label color="black" pt={1} fontSize="12px">
Gender Gender
</Field.Label> </Field.Label>
<Input <Input
name="gender"
placeholder="Enter the Gender" placeholder="Enter the Gender"
value={formData.gender}
onChange={handleChange}
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
<Field.Label color="black" pt={1} fontSize="12px">
Email
</Field.Label>
<Input
name="email"
placeholder="Enter the Email"
value={formData.email}
onChange={handleChange}
type="email"
bgColor="#EEEEEE"
color="black"
border="none"
pl={1}
fontSize="12px"
height="30px"
/>
<Field.Label color="black" pt={1} fontSize="12px">
Phone Number
</Field.Label>
<Input
name="phone"
placeholder="Enter the Phone Number"
value={formData.phone}
onChange={handleChange}
type="tel"
bgColor="#EEEEEE" bgColor="#EEEEEE"
color="black" color="black"
border="none" border="none"
pl={1} pl={1}
fontSize="12px" fontSize="12px"
height="30px" height="30px"
value={gender}
onChange={(e) => setGender(e.target.value)}
/> />
<Heading mt={5} color={"#000"} fontSize={"sm"}> <Heading mt={5} color={"#000"} fontSize={"sm"}>
@@ -225,42 +190,24 @@ function AddModel({ refetch }: { refetch: VoidFunction }) {
</Field.Root> </Field.Root>
<Grid templateColumns="repeat(2, 1fr)" gap={4}> <Grid templateColumns="repeat(2, 1fr)" gap={4}>
<Checkbox size={"sm"} color={"black"}> {[
<Text fontSize={12}>Dashboard</Text> "Dashboard",
</Checkbox> "Manage contact us",
<Checkbox size={"sm"} color={"black"}> "manage User",
<Text fontSize={12}>Manage contact us</Text> "Manage CMS",
</Checkbox> "Manage Post",
<Checkbox size={"sm"} color={"black"}> "Manage Reports",
<Text fontSize={12}>Manage User</Text> "manage Sub-Admin",
</Checkbox> "My profile",
<Checkbox size={"sm"} color={"black"}> "Manage Jobs",
<Text fontSize={12}>Manage CMS</Text> "manage feedbacks",
</Checkbox> "Manage community",
<Checkbox size={"sm"} color={"black"}> "Notification",
<Text fontSize={12}>Manage Post</Text> ].map((permission) => (
</Checkbox> <Checkbox size="sm" color="black" key={permission}>
<Checkbox size={"sm"} color={"black"}> <Text fontSize={12}>{permission}</Text>
<Text fontSize={12}>Manage Reports</Text> </Checkbox>
</Checkbox> ))}
<Checkbox size={"sm"} color={"black"}>
<Text fontSize={12}>Manage Sub-Admin</Text>
</Checkbox>
<Checkbox size={"sm"} color={"black"}>
<Text fontSize={12}>My Profile</Text>
</Checkbox>
<Checkbox size={"sm"} color={"black"}>
<Text fontSize={12}>Manage Jobs</Text>
</Checkbox>
<Checkbox size={"sm"} color={"black"}>
<Text fontSize={12}>Manage Feedbacks</Text>
</Checkbox>
<Checkbox size={"sm"} color={"black"}>
<Text fontSize={12}>Manage Community</Text>
</Checkbox>
<Checkbox size={"sm"} color={"black"}>
<Text fontSize={12}>Notification</Text>
</Checkbox>
</Grid> </Grid>
</Stack> </Stack>
</DialogBody> </DialogBody>
@@ -272,8 +219,6 @@ function AddModel({ refetch }: { refetch: VoidFunction }) {
bg="#02A0A0" bg="#02A0A0"
color={"#fff"} color={"#fff"}
onClick={handleSubmit} onClick={handleSubmit}
// isLoading={isLoading}
disabled={isLoading}
> >
Save Save
</Button> </Button>

View File

@@ -30,7 +30,7 @@ function ViewSubAdmin({ id }: { id: number }) {
const handleView = () => { const handleView = () => {
trigger(id) trigger(id)
} }
const viewSubAdmin = data?.data const viewSubAdmin = data?.data
const formatDateOfBirth = (dob: string): string => { const formatDateOfBirth = (dob: string): string => {

View File

@@ -99,3 +99,4 @@ export const {
useAgencyMasterToggleMutation, useAgencyMasterToggleMutation,
useUpdateAgencyMasterMutation, useUpdateAgencyMasterMutation,
} = agencyMasterModule; } = agencyMasterModule;

View File

@@ -1,26 +1,30 @@
import { createApi } from "@reduxjs/toolkit/query"; import { createApi } from "@reduxjs/toolkit/query/react"; // add /react for auto-generated hooks
import { baseQueryWithReauth } from "./apiSlice"; import { baseQueryWithReauth } from "./apiSlice";
interface DeactivatedData {
id: number;
email: string;
first_name: string;
created_at: string;
}
interface ApiResponse {
data: {
data: DeactivatedData[];
};
}
export const deactivatedAccounts = createApi({ export const deactivatedAccounts = createApi({
reducerPath: "deactivatedAccounts", reducerPath: "deactivatedAccounts",
baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling baseQuery: baseQueryWithReauth,
endpoints: (builder) => ({ tagTypes: ["Deactivated"],
endpoints: (builder) => ({
getContact: builder.query<ApiResponse, void>({
query: () => "/manage-user-deactivate-list",
getPosts: builder.query<Post[], void>({ query: () => "/posts" }), providesTags: ["Deactivated"],
}), }),
}); }),
});
export const { } = deactivatedAccounts;
// ✅ Export the auto-generated hook
export type Post = { export const { useGetContactQuery } = deactivatedAccounts;
id: number;
title: string;
body: string;
};

View File

@@ -69,7 +69,7 @@ export const faqs = createApi({
body: { id, is_active }, body: { id, is_active },
}), }),
}), }),
deleteFaqPost: builder.mutation<{ status: string; message: string }, { id: number }>({ deleteFaqPost: builder.mutation<{ status: string; message: string }, { id: number }>({
query: ({ id }) => ({ query: ({ id }) => ({

View File

@@ -1,26 +1,33 @@
import { createApi } from "@reduxjs/toolkit/query"; import { createApi } from "@reduxjs/toolkit/query/react";
import { baseQueryWithReauth } from "./apiSlice"; import { baseQueryWithReauth } from "./apiSlice";
interface ContactData {
id: number;
email: string;
first_name: string;
created_at: string;
}
interface ApiResponse {
data: {
data: ContactData[];
};
}
export const manageContactUs = createApi({ export const manageContactUs = createApi({
reducerPath: "manageContactUs", reducerPath: "manageContactUs",
baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling
endpoints: (builder) => ({ tagTypes: ["Contact"],
endpoints: (builder) => ({
getPosts: builder.query<Post[], void>({ query: () => "/posts" }), getContact: builder.query<ApiResponse, void>({
query: () => "/contact-us",
providesTags: ["Contact"],
}), }),
});
export const { } = manageContactUs; }),
});
export type Post = {
id: number; export const { useGetContactQuery } = manageContactUs;
title: string;
body: string;
};

View File

@@ -62,7 +62,7 @@ export interface CountryEdit {
} }
export type PostJobStatus = { export type PostJobStatus = {
title: string title: string
}; };
@@ -70,15 +70,27 @@ export const manageJobs = createApi({
reducerPath: "manageJobs", reducerPath: "manageJobs",
baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling
endpoints: (builder) => ({ endpoints: (builder) => ({
getManageJobs: builder.query<ApiResponse, number>({ getManageJobs: builder.query<ApiResponse, number>({
query: (page = 1) => `/manage-jobs-list?page=${page}`, query: (page = 1) => `/manage-jobs-list?page=${page}`,
}), }),
viewJobs: builder.query<ApiResponse, number>({
query: (id) => `/manage-jobs-list/${id}`,
}),
deleteJobsPost: builder.mutation<{ status: string; message: string }, { id: number }>({
query: ({ id }) => ({
url: `/manage-jobs-delete`,
method: "POST",
body: { id },
}),
}),
}), }),
}); });
export const { useGetManageJobsQuery } = manageJobs; export const { useGetManageJobsQuery,useLazyViewJobsQuery,useDeleteJobsPostMutation } = manageJobs;

View File

@@ -104,6 +104,7 @@ export const manageSubAdmin = createApi({
baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling
tagTypes: ["SubAdmin"], tagTypes: ["SubAdmin"],
endpoints: (builder) => ({ endpoints: (builder) => ({
createFaqPost: builder.mutation<Post, Partial<Post>>({ createFaqPost: builder.mutation<Post, Partial<Post>>({
query: (data) => ({ query: (data) => ({
url: "/faq-store", url: "/faq-store",
@@ -111,6 +112,7 @@ export const manageSubAdmin = createApi({
body: data, body: data,
}), }),
}), }),
getSubAdmin: builder.query<ApiResponse, void>({ getSubAdmin: builder.query<ApiResponse, void>({
query: () => `/sub-admin`, query: () => `/sub-admin`,
}), }),
@@ -127,14 +129,17 @@ export const manageSubAdmin = createApi({
}), }),
}), }),
createSubAdminPost: builder.mutation<CreateSubAdminResponse, CreateSubAdminPayload>({ createSubAdminPost: builder.mutation<
query: (data) => ({ CreateSubAdminResponse,
url: "/sub-admin-create", CreateSubAdminPayload
method: "POST", >({
body: data, query: (data) => ({
url: "/sub-admin-create",
method: "POST",
body: data,
}),
invalidatesTags: ["SubAdmin"], // Add this to invalidate cache
}), }),
invalidatesTags: ["SubAdmin"], // Add this to invalidate cache
}),
faqToggle: builder.mutation({ faqToggle: builder.mutation({
query: ({ id, is_active }) => ({ query: ({ id, is_active }) => ({
@@ -158,7 +163,7 @@ export const {
useLazyViewSubAdminQuery, useLazyViewSubAdminQuery,
useUpdateSubAdminMutation, useUpdateSubAdminMutation,
useDeleteSubAdminPostMutation, useDeleteSubAdminPostMutation,
useCreateSubAdminPostMutation useCreateSubAdminPostMutation,
} = manageSubAdmin; } = manageSubAdmin;
export type Post = { export type Post = {

View File

@@ -40,8 +40,9 @@ const AlertDailog: React.FC<DeleteConfirmationDialogProps> = ({
size={"xs"} size={"xs"}
role="alertdialog" role="alertdialog"
open={isOpen} open={isOpen}
> >
<DialogTrigger asChild> <DialogTrigger asChild >
{button ? ( {button ? (
button button
) : ( ) : (
@@ -134,3 +135,16 @@ const AlertDailog: React.FC<DeleteConfirmationDialogProps> = ({
}; };
export default AlertDailog; export default AlertDailog;
// import React from 'react'
// const AlertDailog = () => {
// return (
// <div>
// </div>
// )
// }
// export default AlertDailog