diff --git a/app/components/TemplateListItem.tsx b/app/components/TemplateListItem.tsx
new file mode 100644
index 00000000..84251e11
--- /dev/null
+++ b/app/components/TemplateListItem.tsx
@@ -0,0 +1,39 @@
+interface TemplateListItemProperty {
+ templateImage: string;
+ templateName: string;
+ isPreviewActive: boolean;
+ onPreview: () => void;
+}
+
+export default function TemplateListItem({
+ templateImage,
+ templateName,
+ isPreviewActive,
+ onPreview,
+}: TemplateListItemProperty) {
+ return (
+
+
+
![template preview]({templateImage})
+
+
+ {templateName}
+
+
+
+ );
+}
diff --git a/app/components/TemplateListPagination.tsx b/app/components/TemplateListPagination.tsx
new file mode 100644
index 00000000..0c86b927
--- /dev/null
+++ b/app/components/TemplateListPagination.tsx
@@ -0,0 +1,58 @@
+interface TemplateListPaginationProperty {
+ currentPage: number;
+ totalPages: number;
+ handleEachPageClick: (pageNumber: number) => void;
+ handleNext: () => void;
+ handlePrev: () => void;
+}
+
+export default function TemplateListPagination({
+ currentPage,
+ totalPages,
+ handleEachPageClick,
+ handleNext,
+ handlePrev,
+}: TemplateListPaginationProperty) {
+ const startPage = Math.max(1, currentPage - 2);
+ const endPage = Math.min(totalPages, startPage + 4);
+
+ const pageNumbers = [];
+ for (let index = startPage; index <= endPage; index++) {
+ pageNumbers.push(index);
+ }
+
+ return (
+
+
{`Page ${currentPage} of ${totalPages}`}
+
+ {pageNumbers.map((pageNumber) => (
+
+ ))}
+
+
+
+
+
+
+ );
+}
diff --git a/app/components/TemplateListTable.tsx b/app/components/TemplateListTable.tsx
new file mode 100644
index 00000000..aad3746e
--- /dev/null
+++ b/app/components/TemplateListTable.tsx
@@ -0,0 +1,214 @@
+import { useState } from "react";
+
+import TemplateListItem from "./TemplateListItem";
+import TemplateListPagination from "./TemplateListPagination";
+
+const templates = [
+ {
+ id: 1,
+ templateImage: "/email-template-1.png",
+ templateName: "Welcome - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 2,
+ templateImage: "/email-template-2.png",
+ templateName: "Welcome - Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 3,
+ templateImage: "/email-template-3.png",
+ templateName: "Reset Password - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 4,
+ templateImage: "/email-template-4.png",
+ templateName: "Reset Password - Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 5,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 6,
+ templateImage: "/email-template-1.png",
+ templateName: "Welcome - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 7,
+ templateImage: "/email-template-2.png",
+ templateName: "Welcome - Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 8,
+ templateImage: "/email-template-3.png",
+ templateName: "Reset Password - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 9,
+ templateImage: "/email-template-4.png",
+ templateName: "Reset Password - Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 10,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 11,
+ templateImage: "/email-template-1.png",
+ templateName: "Welcome - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 12,
+ templateImage: "/email-template-2.png",
+ templateName: "Welcome - Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 13,
+ templateImage: "/email-template-3.png",
+ templateName: "Reset Password - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 14,
+ templateImage: "/email-template-4.png",
+ templateName: "Reset Password - Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 15,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 16,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 17,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 18,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 19,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 20,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+
+ {
+ id: 21,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 22,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 23,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+ {
+ id: 24,
+ templateImage: "/email-template-5.png",
+ templateName: "Password reset Complete - No Image",
+ isPreviewActive: false,
+ },
+];
+
+const TEMPLATES_PER_PAGE = 5;
+
+export default function TemplateListTable() {
+ const [currentPage, setCurrentPage] = useState(1);
+ const [templatesData, setTemplatesData] = useState(templates);
+
+ const totalPages = Math.ceil(templates.length / TEMPLATES_PER_PAGE);
+
+ const handleNext = () => {
+ if (currentPage < totalPages) {
+ setCurrentPage(currentPage + 1);
+ }
+ };
+
+ const handlePrevious = () => {
+ if (currentPage > 1) {
+ setCurrentPage(currentPage - 1);
+ }
+ };
+
+ const handleEachPageClick = (pageNumber: number) => {
+ setCurrentPage(pageNumber);
+ };
+
+ const handlePreview = (id: number) => {
+ setTemplatesData((previousTemplates) =>
+ previousTemplates.map((template) =>
+ template.id === id
+ ? { ...template, isPreviewActive: !template.isPreviewActive }
+ : { ...template, isPreviewActive: false },
+ ),
+ );
+ };
+
+ const startIndex = (currentPage - 1) * TEMPLATES_PER_PAGE;
+ const endIndex = startIndex + TEMPLATES_PER_PAGE;
+ const currentTemplates = templatesData.slice(startIndex, endIndex);
+
+ return (
+
+
+ {currentTemplates.map((template) => (
+ handlePreview(template.id)}
+ />
+ ))}
+
+
+
+ );
+}
diff --git a/public/email-template-1.png b/public/email-template-1.png
new file mode 100644
index 00000000..69455afc
Binary files /dev/null and b/public/email-template-1.png differ
diff --git a/public/email-template-2.png b/public/email-template-2.png
new file mode 100644
index 00000000..55b6f78b
Binary files /dev/null and b/public/email-template-2.png differ
diff --git a/public/email-template-3.png b/public/email-template-3.png
new file mode 100644
index 00000000..650789bf
Binary files /dev/null and b/public/email-template-3.png differ
diff --git a/public/email-template-4.png b/public/email-template-4.png
new file mode 100644
index 00000000..2eaab38c
Binary files /dev/null and b/public/email-template-4.png differ
diff --git a/public/email-template-5.png b/public/email-template-5.png
new file mode 100644
index 00000000..7e2cc4cb
Binary files /dev/null and b/public/email-template-5.png differ
diff --git a/public/nextArrow.svg b/public/nextArrow.svg
new file mode 100644
index 00000000..7f912d6d
--- /dev/null
+++ b/public/nextArrow.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/prevArrow.svg b/public/prevArrow.svg
new file mode 100644
index 00000000..e14f37cc
--- /dev/null
+++ b/public/prevArrow.svg
@@ -0,0 +1,5 @@
+