diff --git a/src/components/Tables/cms/index.tsx b/src/components/Tables/cms/index.tsx
index 0bce796..176d819 100644
--- a/src/components/Tables/cms/index.tsx
+++ b/src/components/Tables/cms/index.tsx
@@ -4,12 +4,18 @@ import EmptyListWrapper from "@/components/HOC/EmptyListWrapper";
import ConfirmationModal from "@/components/ui/ConfirmationModal";
import ListHeader from "@/components/ui/ListHeader";
import Modal from "@/components/ui/modal";
-import { Table, TableBody, TableCell, TableHead } from "@/components/ui/table";
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/components/ui/table";
import TableSkeleton from "@/components/ui/TableSkeleton";
import { _TooltipDefaultParams } from "@/constants/tooltip";
import { getPaginatedRowNumber, unixToDate } from "@/utils/shared";
import { Tooltip } from "react-tooltip";
-import { TableHeader, TableRow } from "../../ui/table";
import CmsListFilters from "./CmsListFilters";
import useCmsTablePresenter from "./useCmsTablePresenter";
diff --git a/src/components/Tables/companies/company-categories/index.tsx b/src/components/Tables/companies/company-categories/index.tsx
index e0f9da4..0100f8e 100644
--- a/src/components/Tables/companies/company-categories/index.tsx
+++ b/src/components/Tables/companies/company-categories/index.tsx
@@ -3,7 +3,8 @@ import { PencilSquareIcon, TrashIcon } from "@/assets/icons";
import { Switch } from "@/components/FormElements/switch";
import EmptyListWrapper from "@/components/HOC/EmptyListWrapper";
import ConfirmationModal from "@/components/ui/ConfirmationModal";
-import IsVisible from "@/components/ui/IsVisible";
+import ListHeader from "@/components/ui/ListHeader";
+import Modal from "@/components/ui/modal";
import {
Table,
TableBody,
@@ -15,21 +16,19 @@ import {
import TableSkeleton from "@/components/ui/TableSkeleton";
import { _TooltipDefaultParams } from "@/constants/tooltip";
import { getPaginatedRowNumber, unixToDate } from "@/utils/shared";
+import { startTransition } from "react";
import { Tooltip } from "react-tooltip";
-import { Skeleton } from "../../../ui/skeleton";
-import useCompanyCategoriesPresenter from "./useCompanyCategoriesPresenter";
-import ListHeader from "@/components/ui/ListHeader";
import CompanyCategoryListFilters from "./CompanyCategoryListFilters";
-import Modal from "@/components/ui/modal";
+import useCompanyCategoriesPresenter from "./useCompanyCategoriesPresenter";
const CompanyCategoriesTable = () => {
const {
- categories,
+ optimisticCategories,
+ addOptimisticPublished,
isLoading,
pathName,
router,
currentCategory,
- isToggling,
togglePublished,
onConfirmDelete,
setCurrentCategory,
@@ -42,18 +41,10 @@ const CompanyCategoriesTable = () => {
search,
watch,
setFilterValue,
+ columns,
isMutating,
} = useCompanyCategoriesPresenter();
- const columns = [
- "Row",
- "Title",
- "Description",
- "Created at",
- "Published",
- "Actions",
- ];
-
return (
{
{isLoading && }
- {(categories ?? []).map((category, index) => (
+ {optimisticCategories.map((category, index) => (
{
{unixToDate({ unix: category.created_at, hasTime: true })}
-
-
-
-
- {
- togglePublished(category.id);
- }}
- checked={category.published}
- onToggle={(e) => {
- console.log(e);
- }}
- />
-
+ {}}
+ onChange={() => {
+ const nextPublished = !category.published;
+ startTransition(async () => {
+ addOptimisticPublished({
+ id: category.id,
+ published: nextPublished,
+ });
+ await togglePublished(category.id);
+ });
+ }}
+ checked={category.published}
+ />
diff --git a/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts b/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts
index 9097ce3..20046c3 100644
--- a/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts
+++ b/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts
@@ -9,9 +9,11 @@ import { TCompanyCategory } from "@/lib/api";
import { deleteEmptyKeys } from "@/utils/shared";
import { useIsMutating } from "@tanstack/react-query";
import { usePathname, useRouter, useSearchParams } from "next/navigation";
-import { useEffect, useState } from "react";
+import { useEffect, useOptimistic, useState } from "react";
import { useForm } from "react-hook-form";
+type TogglePublishedOptimistic = Pick
;
+
const useCompanyCategoriesPresenter = () => {
const [isModalOpen, setIsModalOpen] = useState(false);
const [isFilterModalOpen, setIsFilterModalOpen] = useState(false);
@@ -42,10 +44,17 @@ const useCompanyCategoriesPresenter = () => {
}, [searchParams, filterFormReset]);
const { data, isLoading, isError } = useCompanyCategoriesQuery(params);
+ const categories = data?.data.categories;
+ const [optimisticCategories, addOptimisticPublished] = useOptimistic<
+ TCompanyCategory[],
+ TogglePublishedOptimistic
+ >(categories ?? [], (state, { id, published }) =>
+ state.map((c) => (c.id === id ? { ...c, published } : c)),
+ );
const { mutate: deleteCategory } = useDeleteCompanyCategoryQuery(() =>
setIsModalOpen(false),
);
- const { mutate: togglePublished, isPending: isToggling } =
+ const { mutateAsync: togglePublished } =
useToggleCompanyCategoryPublished();
const search = (data: any) => {
@@ -60,19 +69,29 @@ const useCompanyCategoriesPresenter = () => {
if (!currentCategory) return;
deleteCategory(currentCategory?.id);
};
+ const columns = [
+ "Row",
+ "Title",
+ "Description",
+ "Created at",
+ "Published",
+ "Actions",
+ ];
return {
- categories: data?.data.categories,
+ categories,
+ optimisticCategories,
+ addOptimisticPublished,
isModalOpen,
setIsModalOpen,
isLoading,
isError,
pathName,
router,
+ columns,
params,
setParams,
currentCategory,
togglePublished,
- isToggling,
setCurrentCategory,
onConfirmDelete,
isFilterModalOpen,
diff --git a/src/components/forms/admins/CreateAdmin.tsx b/src/components/forms/admins/CreateAdmin.tsx
index c17326e..09518b5 100644
--- a/src/components/forms/admins/CreateAdmin.tsx
+++ b/src/components/forms/admins/CreateAdmin.tsx
@@ -13,12 +13,11 @@ interface IProps {
id?: string;
}
const CreateAdminForm: FC = ({ defaultValues, editMode, id }) => {
- const { errors, handleSubmit, register, onSubmit } =
- useCreateAdminPresenter({
- editMode,
- defaultValues,
- id,
- });
+ const { errors, handleSubmit, register, onSubmit } = useCreateAdminPresenter({
+ editMode,
+ defaultValues,
+ id,
+ });
return (