diff --git a/src/app/marketing/create/page.tsx b/src/app/marketing/create/page.tsx index 632ed8a..6d641ce 100644 --- a/src/app/marketing/create/page.tsx +++ b/src/app/marketing/create/page.tsx @@ -24,6 +24,7 @@ interface IPageTypeFields { language?: string; company_name?: string; country?: string; + key: string; } const Marketing = () => { @@ -152,7 +153,8 @@ const Marketing = () => { const finalData = { ...allData, - page_type: pageTypeData.type, + type: pageTypeData.type, + key: pageTypeData.key, ...(pageTypeData.type === "company" && { language: pageTypeData.language, company_name: pageTypeData.company_name, @@ -229,7 +231,7 @@ const Marketing = () => { {...registerPageType("type", { required: { message: FormErrorMessages.required, value: true }, })} - name="page_type" + name="type" label="Page Type" required items={[ @@ -310,6 +312,23 @@ const Marketing = () => { {pageTypeErrors.country.message}

)} + + {pageTypeErrors.key && ( +

+ {pageTypeErrors.key.message} +

+ )} diff --git a/src/components/Tables/cms/index.tsx b/src/components/Tables/cms/index.tsx index 956a230..7c0c7d7 100644 --- a/src/components/Tables/cms/index.tsx +++ b/src/components/Tables/cms/index.tsx @@ -1,13 +1,29 @@ "use client"; +import { PencilSquareIcon, TrashIcon } from "@/assets/icons"; import EmptyListWrapper from "@/components/HOC/EmptyListWrapper"; +import ConfirmationModal from "@/components/ui/ConfirmationModal"; import ListHeader from "@/components/ui/ListHeader"; -import { Table, TableBody, TableHead } from "@/components/ui/table"; +import { Table, TableBody, TableCell, TableHead } from "@/components/ui/table"; import TableSkeleton from "@/components/ui/TableSkeleton"; +import { _TooltipDefaultParams } from "@/constants/tooltip"; +import { unixToDate } from "@/utils/shared"; +import { Tooltip } from "react-tooltip"; import { TableHeader, TableRow } from "../../ui/table"; import useCmsTablePresenter from "./useCmsTablePresenter"; const CmsTable = () => { - const { columns, data, isPending } = useCmsTablePresenter(); + const { + columns, + data, + isPending, + isModalOpen, + setIsModalOpen, + currentCms, + setCurrentCms, + onConfirmDelete, + router, + pathname, + } = useCmsTablePresenter(); return (
@@ -28,10 +44,80 @@ const CmsTable = () => { columns={columns} emptyMessage="No Cms were found" > - Cms list will be added + {data?.data.cms.map((item, index) => ( + + + {index + 1} + + + {item.key} + + + {unixToDate({ unix: item.created_at, hasTime: true })} + + +
+ + + {/* */} +
+
+
+ ))} + {isModalOpen && ( + { + onConfirmDelete(); + }} + onCancel={() => setIsModalOpen(false)} + /> + )}
); }; diff --git a/src/components/Tables/cms/useCmsTablePresenter.ts b/src/components/Tables/cms/useCmsTablePresenter.ts index faaa018..f432a1b 100644 --- a/src/components/Tables/cms/useCmsTablePresenter.ts +++ b/src/components/Tables/cms/useCmsTablePresenter.ts @@ -1,14 +1,35 @@ "use client"; -import { useGetCmsList } from "@/hooks/queries/useCmsQueries"; +import { useDeleteCms, useGetCmsList } from "@/hooks/queries/useCmsQueries"; +import { TCms } from "@/lib/api/types/TCms"; +import { usePathname, useRouter } from "next/navigation"; +import { useState } from "react"; const useCmsTablePresenter = () => { - const columns = ["row", "title", "created at"]; + const [isModalOpen, setIsModalOpen] = useState(false); + const [currentCms, setCurrentCms] = useState(null); + const columns = ["row", "key", "created at", "actions"]; const { isPending, data } = useGetCmsList(); - + const router = useRouter(); + const pathname = usePathname(); + const { mutate: deleteCms } = useDeleteCms(() => { + setIsModalOpen(false); + setCurrentCms(null); + }); + const onConfirmDelete = () => { + if (!currentCms?.id) return; + deleteCms(currentCms.id); + }; return { columns, isPending, data, + isModalOpen, + setIsModalOpen, + currentCms, + setCurrentCms, + onConfirmDelete, + router, + pathname, }; }; diff --git a/src/components/Tables/contact-us/index.tsx b/src/components/Tables/contact-us/index.tsx index 796a9da..521b02d 100644 --- a/src/components/Tables/contact-us/index.tsx +++ b/src/components/Tables/contact-us/index.tsx @@ -3,6 +3,7 @@ import EmptyListWrapper from "@/components/HOC/EmptyListWrapper"; import { Table, TableBody, + TableCell, TableHead, TableHeader, TableRow, @@ -36,7 +37,9 @@ const ContactUsTable = () => { columns={columns} emptyMessage="No contact us is submitted" > - Contact us table will be initialized here + +
hjgfjhg
+
diff --git a/src/hooks/queries/useCmsQueries.ts b/src/hooks/queries/useCmsQueries.ts index fc26074..9c91ee6 100644 --- a/src/hooks/queries/useCmsQueries.ts +++ b/src/hooks/queries/useCmsQueries.ts @@ -1,7 +1,9 @@ import { API_ENDPOINTS } from "@/lib/api"; import { cmsService } from "@/lib/api/services/cms-service"; -import { useMutation, useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { useRouter } from "next/navigation"; import { useMemo } from "react"; +import { toast } from "react-toastify"; export const useGetCmsList = () => { const queryKey = useMemo(() => [API_ENDPOINTS.CMS.BASE()], []); @@ -18,6 +20,8 @@ export const useGetCmsDetails = (id: string) => { }); }; export const useCreateCms = () => { + const router = useRouter(); + const queryClient = useQueryClient(); const mutationKey = useMemo( () => [API_ENDPOINTS.CMS.BASE(), "Create cms"], [], @@ -25,5 +29,30 @@ export const useCreateCms = () => { return useMutation({ mutationKey, mutationFn: cmsService.createCms, + onSuccess: ({ data }: { data: { message: string } }) => { + toast.success(data.message); + router.push("/marketing"); + queryClient.invalidateQueries({ + queryKey: [API_ENDPOINTS.CMS.BASE()], + }); + }, + }); +}; +export const useDeleteCms = (successCallback?: () => void) => { + const queryClient = useQueryClient(); + const mutationKey = useMemo( + () => [API_ENDPOINTS.CMS.BASE(), "Delete CMS"], + [], + ); + return useMutation({ + mutationKey, + mutationFn: cmsService.deleteCms, + onSuccess: ({ data }: { data: { message: string } }) => { + toast.success(data.message); + successCallback?.(); + queryClient.invalidateQueries({ + queryKey: [API_ENDPOINTS.CMS.BASE()], + }); + }, }); }; diff --git a/src/lib/api/services/cms-service.ts b/src/lib/api/services/cms-service.ts index 3dcfaa8..0548978 100644 --- a/src/lib/api/services/cms-service.ts +++ b/src/lib/api/services/cms-service.ts @@ -28,4 +28,12 @@ export const cmsService = { throw error; } }, + deleteCms: async (id: string) => { + try { + return (await api.delete(API_ENDPOINTS.CMS.BASE(id))).data; + } catch (error) { + console.error("Error caught in CMS Service => delete CMS: ", error); + throw error; + } + }, }; diff --git a/src/lib/api/types/TCms.ts b/src/lib/api/types/TCms.ts index 4b4c0da..b8d25d0 100644 --- a/src/lib/api/types/TCms.ts +++ b/src/lib/api/types/TCms.ts @@ -155,6 +155,7 @@ export const cmsListResponseSchema = z.object({ export const cmsDetailsResponse = z.object({ cms: CmsSchema, }); +export type TCms = z.infer; export type TCmsListResponse = z.infer; -export type TCmsDetailsResponse = z.infer +export type TCmsDetailsResponse = z.infer; export type TCmsCredentials = z.infer;