From e6e8f59afa5498448ac10da1a92daa1099c77f0b Mon Sep 17 00:00:00 2001 From: rockyeverlast Date: Mon, 5 May 2025 18:04:31 +0530 Subject: [PATCH] APi call from Manage post completed --- .env | 4 +- dev-dist/sw.js | 2 +- src/Pages/ManageJobs/ManageJobs.tsx | 12 +- src/Pages/ManagePost/ManagePost.tsx | 242 ++++++++++++++---- src/Pages/ManagePost/ViewDailog.tsx | 63 ++++- src/Pages/MasterModule/Country/Country.tsx | 3 +- .../DepartmentMaster/DepartmentMasterList.tsx | 3 +- .../IndustryMaster/IndustryMasterList.tsx | 3 +- .../MasterModule/JobStatus/JobStatus.tsx | 3 +- src/Pages/MasterModule/JobType/JobType.tsx | 3 +- .../WorkspaceMode/WorkspaceMode.tsx | 3 +- src/Redux/Service/manage.jobs.service.ts | 104 ++++++-- src/Redux/Service/manage.post.service.ts | 82 ++++++ src/Redux/Service/manage.posts.service.ts | 26 -- src/Redux/Store.tsx | 10 +- 15 files changed, 429 insertions(+), 134 deletions(-) create mode 100644 src/Redux/Service/manage.post.service.ts delete mode 100644 src/Redux/Service/manage.posts.service.ts diff --git a/.env b/.env index ec188ed..8f55d85 100644 --- a/.env +++ b/.env @@ -1,7 +1,9 @@ VITE_API_URL='https://ssa.betadelivery.com/apia/v1' +VITE_MAIN_URL='https://ssa.betadelivery.com' # 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_PASSWORD="71%@L%es^bUX94`J9XT*%4&^%tUU^%Q^ffgt" VITE_APP_NAME=MyViteApp -VITE_IMG_TEMPLATES='https://ssa.betadelivery.com/storage/app/public/uploads/post_templates/' \ No newline at end of file +VITE_IMG_TEMPLATES='https://ssa.betadelivery.com/storage/app/public/uploads/post_templates/' +VITE_POST_IMG=`${VITE_MAIN_URL}/storage/app/public/uploads/post/` \ No newline at end of file diff --git a/dev-dist/sw.js b/dev-dist/sw.js index 69b4925..266fb26 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.4sre1e6vpfo" + "revision": "0.bma87cujt8g" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/src/Pages/ManageJobs/ManageJobs.tsx b/src/Pages/ManageJobs/ManageJobs.tsx index 2daf901..744fd6e 100644 --- a/src/Pages/ManageJobs/ManageJobs.tsx +++ b/src/Pages/ManageJobs/ManageJobs.tsx @@ -1,6 +1,8 @@ -import { Box, HStack, +import { + Box, HStack, // Image, - Input, Text } from "@chakra-ui/react"; + Input, Text +} from "@chakra-ui/react"; import { LuSearch } from "react-icons/lu"; // import { RiDeleteBin5Line } from "react-icons/ri"; // import AlertDailog from "../../components/AlertDailog"; @@ -9,6 +11,8 @@ import MainFrame from "../../components/MainFrame"; import { InputGroup } from "../../components/ui/input-group"; import ManageJobsAdd from "./ManageJobsAdd"; import ViewManageJob from "./ViewManageJob"; +// import { useState } from "react"; +// import { useGetManageJobsQuery } from "../../Redux/Service/manage.jobs.service"; // import Delete from "../../components/ActionIcons/Delete"; // table data @@ -50,6 +54,10 @@ const managepost: any[] = [ ]; const ManageJobs = () => { + // const [currentPage, setCurrentPage] = useState(1); + // const { data, refetch } = useGetManageJobsQuery(currentPage) + // console.log(data?.data.data); + return ( diff --git a/src/Pages/ManagePost/ManagePost.tsx b/src/Pages/ManagePost/ManagePost.tsx index c9e5dd2..e55c559 100644 --- a/src/Pages/ManagePost/ManagePost.tsx +++ b/src/Pages/ManagePost/ManagePost.tsx @@ -1,67 +1,205 @@ -import { Box, HStack, Image, Input, +import { + Box, HStack, Icon, Image, // Span, - Text } from "@chakra-ui/react"; + Text +} from "@chakra-ui/react"; import MainFrame from "../../components/MainFrame"; -import { InputGroup } from "../../components/ui/input-group"; -import { LuSearch } from "react-icons/lu"; +// import { InputGroup } from "../../components/ui/input-group"; +// import { LuSearch } from "react-icons/lu"; import DataTable from "../../components/DataTable"; // import AlertDailog from "../../components/AlertDailog"; import { Switch } from "../../components/ui/switch"; -import img from "../../assets/waterfall.jpg"; +// import img from "../../assets/waterfall.jpg"; // import { RiDeleteBin5Line } from "react-icons/ri"; import ViewDailog from "./ViewDailog"; +import { useGetManagePostsQuery, usePostStatusToggleMutation } from "../../Redux/Service/manage.post.service"; +import { useEffect, useState } from "react"; +import { toaster } from "../../components/ui/toaster"; +import { FaVideo } from "react-icons/fa"; +import SearchComponent from "../../components/SearchComponent"; // import Delete from "../../components/ActionIcons/Delete"; // import ViewDailog from './ViewDailog' -// table data +const APIURL = import.meta.env.VITE_POST_IMG const tableHeadRow = [ "Sr. No", "Images", "Description", "Publish Data", - "Activate/Deactivate", + // "Activate/Deactivate", "Action", ]; -const managepost: any[] = [ - ...Array.from({ length: 12 }, (_, i) => ({ - "Sr. No": i + 1, +// const managepost: any[] = [ +// ...Array.from({ length: 12 }, (_, i) => ({ +// "Sr. No": i + 1, +// Images: ( +// // +// +// ), +// Description: ( +// +// {`Lorem ipsum dolor, sit amet consectetur adipisicing elit.}`.slice( +// 0, +// 30 +// ) + "..."} +// +// ), +// "Publish Data": "12/01/2025", +// "Activate/Deactivate": ( +// +// +// +// ), +// Action: ( +// +// +// {/* } +// alertText="Delete Users" +// alertIcon={} +// alertCaption="are you sure you want to delete ?" +// onConfirm={() => { +// console.log("User deleted:", i + 1); +// }} +// /> */} +// +// ), +// })), +// ]; + +const ManagePost = () => { + const [currentPage, setCurrentPage] = useState(1); + const { data, refetch } = useGetManagePostsQuery(currentPage) + const [localData, setLocalData] = useState([]); + const [searchTerm, setSearchTerm] = useState(""); + const [postStatusToggle] = usePostStatusToggleMutation() + console.log('POSTS', data?.data.data); + + useEffect(() => { + if (data?.data?.data) { + setLocalData(data?.data.data); + } + }, [data]); + + const handlePageChange = (page: number) => { + setCurrentPage(page); + }; + + const handleToggle = async (agencyId: string, currentStatus: number) => { + const newStatus = currentStatus ? 0 : 1; + setLocalData((prevData) => + prevData.map((agency) => + agency.id === agencyId ? { ...agency, is_active: newStatus } : agency + ) + ); + try { + await postStatusToggle({ id: agencyId, is_active: newStatus }).unwrap(); + refetch() + } catch (error) { + console.error("Error updating:", error); + toaster.create({ + title: "Error", + description: "Someting went wrong.", + type: "error", + }); + setLocalData((prevData) => + prevData.map((agency) => + agency.id === agencyId ? { ...agency, is_active: currentStatus } : agency + ) + ); + } + }; + + + function formatAPIDate(apiDateString: any) { + const date = new Date(apiDateString); + + // Get month, day, and year + const month = date.getMonth() + 1; // Months are 0-indexed + const day = date.getDate(); + const year = date.getFullYear(); + + // Pad with leading zeros if needed + const formattedMonth = month.toString().padStart(2, '0'); + const formattedDay = day.toString().padStart(2, '0'); + + return `${formattedMonth}/${formattedDay}/${year}`; + } + + const filteredData = localData?.filter((agency) => { + return (agency.post_content_translation.some((item: any) => { + const searchLower = searchTerm.toLowerCase(); + const title = item.content?.toLowerCase().includes(searchLower); + return title; + })) + }); + + const managepost = filteredData?.flatMap((agency: any, index: number) => (agency.post_content_translation.map((translation: any) => ({ + 'id': agency.id, + "Sr. No": (currentPage - 1) * (data?.data.per_page ?? 0) + index + 1, Images: ( - // - + agency.images.length > 0 ? + agency.images[0].type === "image" ? ( + + + + {`${Number(agency.images.length) > 1 ? '+' + (Number(agency.images.length) - 1) : ''}`} + + + ) : ( + + + + + + {`${Number(agency.images.length) > 1 ? '+' + (Number(agency.images.length) - 1) : ''}`} + + + ) : '' + // ), Description: ( - {`Lorem ipsum dolor, sit amet consectetur adipisicing elit.}`.slice( + {`${translation?.content}`.slice( 0, 30 ) + "..."} ), - "Publish Data": "12/01/2025", - "Activate/Deactivate": ( - - - - ), - Action: ( + "Publish Data": formatAPIDate(agency.created_at), + "is_active": agency.is_active, + "Action": ( - - {/* } - alertText="Delete Users" - alertIcon={} - alertCaption="are you sure you want to delete ?" - onConfirm={() => { - console.log("User deleted:", i + 1); - }} - /> */} + {/* */} + + + handleToggle(agency.id, Number(agency.is_active))} + checked={Boolean(Number(agency.is_active))} + /> + ), - })), -]; -const ManagePost = () => { + })))); + + return ( @@ -77,35 +215,27 @@ const ManagePost = () => { - - } - color={"#000"} - > - - + { + setSearchTerm(value); + // setCurrentPage(1); + refetch() + }} + /> diff --git a/src/Pages/ManagePost/ViewDailog.tsx b/src/Pages/ManagePost/ViewDailog.tsx index f2fc6d4..9688341 100644 --- a/src/Pages/ManagePost/ViewDailog.tsx +++ b/src/Pages/ManagePost/ViewDailog.tsx @@ -1,15 +1,18 @@ -import { Field, Image, Input, Span, Stack } from "@chakra-ui/react" +import { Field, HStack, Image, Input, Stack } from "@chakra-ui/react" // import { TbEdit } from "react-icons/tb" -import img from "../../assets/waterfall.jpg" +// import img from "../../assets/waterfall.jpg" import { DialogBody, DialogCloseTrigger, DialogContent, DialogHeader, DialogRoot, DialogTitle, DialogTrigger } from "../../components/ui/dialog" -import Edit from "../../components/ActionIcons/Edit" +// import Edit from "../../components/ActionIcons/Edit" +import { LuEye } from "react-icons/lu" -function ViewDailog() { +const APIURL = import.meta.env.VITE_POST_IMG + +function ViewDailog({ localData }: { localData: any, refetch: VoidFunction }) { return ( - - + {/* */} + - Title - - - Subtitle - - Description - + + {/* Subtitle + */} + + {/* Description + */} Image - + + {localData.images.map((img: any) => ( + img.type === 'image' ? ( + + ) : ( + + ) + ))} + + + {/* */} diff --git a/src/Pages/MasterModule/Country/Country.tsx b/src/Pages/MasterModule/Country/Country.tsx index 9b0c5a1..c2be07a 100644 --- a/src/Pages/MasterModule/Country/Country.tsx +++ b/src/Pages/MasterModule/Country/Country.tsx @@ -139,7 +139,8 @@ const Country = () => { value={searchTerm} onChange={(value) => { setSearchTerm(value); - setCurrentPage(1); + // setCurrentPage(1); + refetch() }} /> {/* */} diff --git a/src/Pages/MasterModule/DepartmentMaster/DepartmentMasterList.tsx b/src/Pages/MasterModule/DepartmentMaster/DepartmentMasterList.tsx index 351cea5..fc4e7ae 100644 --- a/src/Pages/MasterModule/DepartmentMaster/DepartmentMasterList.tsx +++ b/src/Pages/MasterModule/DepartmentMaster/DepartmentMasterList.tsx @@ -114,7 +114,8 @@ const DepartmentMasterList = () => { value={searchTerm} onChange={(value) => { setSearchTerm(value); - setCurrentPage(1); + // setCurrentPage(1); + refetch() }} /> {/* */} diff --git a/src/Pages/MasterModule/IndustryMaster/IndustryMasterList.tsx b/src/Pages/MasterModule/IndustryMaster/IndustryMasterList.tsx index 76f2231..55b8213 100644 --- a/src/Pages/MasterModule/IndustryMaster/IndustryMasterList.tsx +++ b/src/Pages/MasterModule/IndustryMaster/IndustryMasterList.tsx @@ -132,7 +132,8 @@ const IndustryMasterList = () => { value={searchTerm} onChange={(value) => { setSearchTerm(value); - setCurrentPage(1); + // setCurrentPage(1); + refetch() }} /> {/* */} diff --git a/src/Pages/MasterModule/JobStatus/JobStatus.tsx b/src/Pages/MasterModule/JobStatus/JobStatus.tsx index 6d465b5..17852a3 100644 --- a/src/Pages/MasterModule/JobStatus/JobStatus.tsx +++ b/src/Pages/MasterModule/JobStatus/JobStatus.tsx @@ -127,7 +127,8 @@ const JobStatus = () => { value={searchTerm} onChange={(value) => { setSearchTerm(value); - setCurrentPage(1); + // setCurrentPage(1); + refetch() }} /> {/* */} diff --git a/src/Pages/MasterModule/JobType/JobType.tsx b/src/Pages/MasterModule/JobType/JobType.tsx index d4757e8..df048c1 100644 --- a/src/Pages/MasterModule/JobType/JobType.tsx +++ b/src/Pages/MasterModule/JobType/JobType.tsx @@ -123,7 +123,8 @@ const JobType = () => { value={searchTerm} onChange={(value) => { setSearchTerm(value); - setCurrentPage(1); + // setCurrentPage(1); + refetch() }} /> {/* */} diff --git a/src/Pages/MasterModule/WorkspaceMode/WorkspaceMode.tsx b/src/Pages/MasterModule/WorkspaceMode/WorkspaceMode.tsx index 875fa2f..a094097 100644 --- a/src/Pages/MasterModule/WorkspaceMode/WorkspaceMode.tsx +++ b/src/Pages/MasterModule/WorkspaceMode/WorkspaceMode.tsx @@ -126,7 +126,8 @@ const WorkspaceMode = () => { value={searchTerm} onChange={(value) => { setSearchTerm(value); - setCurrentPage(1); + // setCurrentPage(1); + refetch() }} /> {/* */} diff --git a/src/Redux/Service/manage.jobs.service.ts b/src/Redux/Service/manage.jobs.service.ts index c5face7..0ce6b24 100644 --- a/src/Redux/Service/manage.jobs.service.ts +++ b/src/Redux/Service/manage.jobs.service.ts @@ -1,26 +1,84 @@ -import { createApi } from "@reduxjs/toolkit/query"; +import { createApi } from "@reduxjs/toolkit/query/react"; import { baseQueryWithReauth } from "./apiSlice"; -export const manageJobs = createApi({ - reducerPath: "manageJobs", - baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling - endpoints: (builder) => ({ - - - - getPosts: builder.query({ query: () => "/posts" }), - - - - - - }), - }); - - export const { } = manageJobs; - - export type Post = { +export interface JobStatusData { + id: number; + job_title: string; + workspace_mode_xid: number; + industry_xid: number; + department_xid: number; + company_name: string; + ctc_currency_symbol: string; + ctc_amount: string; + experience: string; + job_location: string; + country_xid: number; + job_type_xid: number; + skill_description: string; + job_description: string; + job_image: string | null; + industry: { id: number; - title: string; - body: string; - }; \ No newline at end of file + en_name: string; + }; + department: { + id: number; + en_name: string; + }; + workspace: { + id: number; + en_name: string; + }; + country: { + id: number; + en_name: string; + }; + job_type: { + id: number; + en_name: string; + }; +} + +interface ApiResponse { + status: string; + status_code: number; + message: string; + data: { + current_page: number, + last_page: number, + total: number, + from: number, + per_page: number, + to: number, + data: JobStatusData[]; + }; +} + +export interface CountryEdit { + status: string; + status_code: number; + message: string; + data: JobStatusData[]; +} + + +export type PostJobStatus = { + title: string +}; + +export const manageJobs = createApi({ + reducerPath: "manageJobs", + baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling + endpoints: (builder) => ({ + getManageJobs: builder.query({ + query: (page = 1) => `/manage-jobs-list?page=${page}`, + }), + + + + + + }), +}); + +export const { useGetManageJobsQuery } = manageJobs; diff --git a/src/Redux/Service/manage.post.service.ts b/src/Redux/Service/manage.post.service.ts new file mode 100644 index 0000000..8c32391 --- /dev/null +++ b/src/Redux/Service/manage.post.service.ts @@ -0,0 +1,82 @@ +import { createApi } from "@reduxjs/toolkit/query/react"; +import { baseQueryWithReauth } from "./apiSlice"; + +export interface JobStatusData { + id: number; + is_active: string; + created_at:string, + job_status_translation:{ + job_status_xid: number, + title:string, + language_xid:number + }[], +} + +interface ApiResponse { + status: string; + status_code: number; + message: string; + data: { + current_page: number, + last_page: number, + total: number, + from: number, + per_page: number, + to: number, + data: JobStatusData[]; + }; +} + +export interface CountryEdit { + status: string; + status_code: number; + message: string; + data: JobStatusData[]; +} + + +export type PostJobStatus = { + title: string +}; + + +export const managePosts = createApi({ + reducerPath: "managePosts", + baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling + endpoints: (builder) => ({ + // createJobStatusPost: builder.mutation>({ + // query: (data) => ({ + // url: "/job-status-store", + // method: "POST", + // body: data, + // }), + // }), + // 🔹 GET: Fetch all posts + getManagePosts: builder.query({ + query: (page = 1) => `/manage-post-list?page=${page}`, + }), + + postStatusToggle: builder.mutation({ + query: ({ id, is_active }) => ({ + url: `/manage-post-status`, + method: "POST", + body: { id, is_active }, + }), + }), + + // deleteFaqPost: builder.mutation<{ status: string; message: string }, { id: number }>({ + // query: ({ id }) => ({ + // url: `/faq-delete`, + // method: "POST", + // body: { id }, + // }), + // }), + + }), +}); + +export const { + useGetManagePostsQuery, + usePostStatusToggleMutation, + // useDeleteFaqPostMutation +} = managePosts; \ No newline at end of file diff --git a/src/Redux/Service/manage.posts.service.ts b/src/Redux/Service/manage.posts.service.ts deleted file mode 100644 index d51e7ab..0000000 --- a/src/Redux/Service/manage.posts.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { createApi } from "@reduxjs/toolkit/query"; -import { baseQueryWithReauth } from "./apiSlice"; - -export const managePosts = createApi({ - reducerPath: "managePosts", - baseQuery: baseQueryWithReauth, // Use enhanced baseQuery with error handling - endpoints: (builder) => ({ - - - - getPosts: builder.query({ query: () => "/posts" }), - - - - - - }), - }); - - export const { } = managePosts; - - export type Post = { - id: number; - title: string; - body: string; - }; \ No newline at end of file diff --git a/src/Redux/Store.tsx b/src/Redux/Store.tsx index 167c063..6619090 100644 --- a/src/Redux/Store.tsx +++ b/src/Redux/Store.tsx @@ -4,7 +4,6 @@ import authReducer from "./Service/authSlice"; import { registerUser } from "./Service/register.user.service"; import { deactivatedAccounts } from "./Service/deactivated.account.service"; import { faqs } from "./Service/faqs.service"; -import { managePosts } from "./Service/manage.posts.service"; import { manageSubAdmin } from "./Service/manage.subadmin.service"; import { manageJobs } from "./Service/manage.jobs.service"; import { manageGroups } from "./Service/manage.groups.service"; @@ -23,6 +22,7 @@ import { countryMaster } from "./Service/country.master"; import { departmentMaster } from "./Service/department.master"; import { workspaceMode } from "./Service/workspace.mode"; import { jobStatus } from "./Service/job.status"; +import { managePosts } from "./Service/manage.post.service"; export const store = configureStore({ reducer: { @@ -30,7 +30,6 @@ export const store = configureStore({ [registerUser.reducerPath]: registerUser.reducer, [deactivatedAccounts.reducerPath]: deactivatedAccounts.reducer, [faqs.reducerPath]: faqs.reducer, - [managePosts.reducerPath]: managePosts.reducer, [manageSubAdmin.reducerPath]: manageSubAdmin.reducer, [manageJobs.reducerPath]: manageJobs.reducer, [manageGroups.reducerPath]: manageGroups.reducer, @@ -49,13 +48,13 @@ export const store = configureStore({ [departmentMaster.reducerPath]: departmentMaster.reducer, [workspaceMode.reducerPath]: workspaceMode.reducer, [jobStatus.reducerPath]: jobStatus.reducer, + [managePosts.reducerPath]: managePosts.reducer, auth: authReducer, }, middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat( - dashboard.middleware, + dashboard.middleware, deactivatedAccounts.middleware, - managePosts.middleware, faqs.middleware, manageSubAdmin.middleware, manageJobs.middleware, @@ -75,7 +74,8 @@ export const store = configureStore({ departmentMaster.middleware, workspaceMode.middleware, jobStatus.middleware, - ), + managePosts.middleware, + ), }); export type RootState = ReturnType;