diff --git a/app/pages/dashboard-tags/dialog-delete.tsx b/app/components/dialog/delete.tsx similarity index 72% rename from app/pages/dashboard-tags/dialog-delete.tsx rename to app/components/dialog/delete.tsx index 67aa496..04b3cfe 100644 --- a/app/pages/dashboard-tags/dialog-delete.tsx +++ b/app/components/dialog/delete.tsx @@ -5,20 +5,31 @@ import { DialogPanel, DialogTitle, } from '@headlessui/react' -import { useEffect, type Dispatch, type SetStateAction } from 'react' +import { + useEffect, + type Dispatch, + type PropsWithChildren, + type SetStateAction, +} from 'react' import toast from 'react-hot-toast' import { useFetcher } from 'react-router' -import type { TTagResponse } from '~/apis/common/get-tags' import { Button } from '~/components/ui/button' -type TProperties = { - selectedItem?: TTagResponse - setSelectedItem: Dispatch> +type T = { + id: string +} & any // eslint-disable-line @typescript-eslint/no-explicit-any + +type TProperties = PropsWithChildren & { + selectedItem?: T + setSelectedItem: Dispatch> + title: string + fetcherAction: string } export const DialogDelete = (properties: TProperties) => { - const { selectedItem, setSelectedItem } = properties || {} + const { selectedItem, setSelectedItem, children, title, fetcherAction } = + properties || {} const fetcher = useFetcher() useEffect(() => { @@ -29,7 +40,7 @@ export const DialogDelete = (properties: TProperties) => { if (fetcher.data?.success === true) { setSelectedItem(undefined) - toast.success('Tag berhasil dihapus!') + toast.success(`${title} berhasil dihapus!`) return } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -55,16 +66,17 @@ export const DialogDelete = (properties: TProperties) => { transition className="max-w-lg space-y-6 rounded-lg bg-white p-8 duration-300 ease-out data-[closed]:scale-95 data-[closed]:opacity-0 sm:shadow-lg" > - - Anda akan menghapus tag berikut? + + Anda akan menghapus{' '} + {title} berikut? -

{selectedItem?.name}

+ {children}
- -
- - - -
- -
- - ) -} diff --git a/app/pages/dashboard-advertisements/index.tsx b/app/pages/dashboard-advertisements/index.tsx index fcd6b67..956a9e3 100644 --- a/app/pages/dashboard-advertisements/index.tsx +++ b/app/pages/dashboard-advertisements/index.tsx @@ -9,13 +9,12 @@ import { useState } from 'react' import { Link, useRouteLoaderData } from 'react-router' import type { TAdResponse } from '~/apis/common/get-ads' +import { DialogDelete } from '~/components/dialog/delete' import { Button } from '~/components/ui/button' import { UiTable } from '~/components/ui/table' import { TitleDashboard } from '~/components/ui/title-dashboard' import type { loader } from '~/routes/_admin.lg-admin._dashboard.advertisements._index' -import { DialogDelete } from './dialog-delete' - export const AdvertisementsPage = () => { const loaderData = useRouteLoaderData( 'routes/_admin.lg-admin._dashboard.advertisements._index', @@ -101,7 +100,23 @@ export const AdvertisementsPage = () => { + title="Banner iklan" + fetcherAction={`/actions/admin/advertisements/delete/${selectedAds?.id}`} + > + {selectedAds?.image_url} + + ) } diff --git a/app/pages/dashboard-subscribe-plan/dialog-delete.tsx b/app/pages/dashboard-subscribe-plan/dialog-delete.tsx deleted file mode 100644 index c62ae78..0000000 --- a/app/pages/dashboard-subscribe-plan/dialog-delete.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { - Description, - Dialog, - DialogBackdrop, - DialogPanel, - DialogTitle, -} from '@headlessui/react' -import { useEffect, type Dispatch, type SetStateAction } from 'react' -import toast from 'react-hot-toast' -import { useFetcher } from 'react-router' - -import type { TSubscribePlanResponse } from '~/apis/common/get-subscribe-plan' -import { Button } from '~/components/ui/button' -import { formatNumberWithPeriods } from '~/utils/formatter' - -type TProperties = { - selectedItem?: TSubscribePlanResponse - setSelectedItem: Dispatch> -} - -export const DialogDelete = (properties: TProperties) => { - const { selectedItem, setSelectedItem } = properties || {} - const fetcher = useFetcher() - - useEffect(() => { - if (fetcher.data?.success === false) { - toast.error(fetcher.data?.message) - return - } - - if (fetcher.data?.success === true) { - setSelectedItem(undefined) - toast.success('Subscribe plan berhasil dihapus!') - return - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [fetcher.data]) - - return ( - { - if (fetcher.state === 'idle') { - setSelectedItem(undefined) - } - }} - className="relative z-50" - transition - > - -
- - - Anda akan menghapus subscribe plan berikut? - - -

{selectedItem?.name}

-

Length: {selectedItem?.length}

-

- Harga: Rp. {formatNumberWithPeriods(selectedItem?.price || 0)} -

-
-
- - - -
-
-
-
- ) -} diff --git a/app/pages/dashboard-subscribe-plan/index.tsx b/app/pages/dashboard-subscribe-plan/index.tsx index c475155..78c5615 100644 --- a/app/pages/dashboard-subscribe-plan/index.tsx +++ b/app/pages/dashboard-subscribe-plan/index.tsx @@ -9,6 +9,7 @@ import { useState } from 'react' import { Link, useRouteLoaderData } from 'react-router' import type { TSubscribePlanResponse } from '~/apis/common/get-subscribe-plan' +import { DialogDelete } from '~/components/dialog/delete' import { Button } from '~/components/ui/button' import { getStatusBadge, type TColorBadge } from '~/components/ui/color-badge' import { UiTable } from '~/components/ui/table' @@ -16,8 +17,6 @@ import { TitleDashboard } from '~/components/ui/title-dashboard' import type { loader } from '~/routes/_admin.lg-admin._dashboard.subscribe-plan._index' import { formatNumberWithPeriods } from '~/utils/formatter' -import { DialogDelete } from './dialog-delete' - export const SubscribePlanPage = () => { const loaderData = useRouteLoaderData( 'routes/_admin.lg-admin._dashboard.subscribe-plan._index', @@ -132,7 +131,16 @@ export const SubscribePlanPage = () => { + title="Subscribe plan" + fetcherAction={`/actions/admin/subscribe-plan/delete/${selectedSubscribePlan?.id}`} + > +

{selectedSubscribePlan?.name}

+

Length: {selectedSubscribePlan?.length}

+

+ Harga: Rp.{' '} + {formatNumberWithPeriods(selectedSubscribePlan?.price || 0)} +

+
) } diff --git a/app/pages/dashboard-tags/index.tsx b/app/pages/dashboard-tags/index.tsx index 9ea3b9a..2ae2e8b 100644 --- a/app/pages/dashboard-tags/index.tsx +++ b/app/pages/dashboard-tags/index.tsx @@ -9,13 +9,12 @@ import { useState } from 'react' import { Link, useRouteLoaderData } from 'react-router' import type { TTagResponse } from '~/apis/common/get-tags' +import { DialogDelete } from '~/components/dialog/delete' import { Button } from '~/components/ui/button' import { UiTable } from '~/components/ui/table' import { TitleDashboard } from '~/components/ui/title-dashboard' import type { loader } from '~/routes/_admin.lg-admin._dashboard' -import { DialogDelete } from './dialog-delete' - export const TagsPage = () => { const loaderData = useRouteLoaderData( 'routes/_admin.lg-admin._dashboard', @@ -105,7 +104,11 @@ export const TagsPage = () => { + title="Tag" + fetcherAction={`/actions/admin/tags/delete/${selectedTag?.id}`} + > +

{selectedTag?.name}

+
) }