Bladeren bron

feat: implement delete evaluation

Mohammad Mahdi Salimi 2 weken geleden
bovenliggende
commit
96cf3e6787

+ 11 - 5
src/features/evaluations/components/data-table-row-actions.tsx

@@ -1,13 +1,14 @@
 import { useState } from 'react'
 import { DotsHorizontalIcon } from '@radix-ui/react-icons'
 import { type Row } from '@tanstack/react-table'
-import { CircleCheck, Download, Eye, Pencil, RefreshCcw } from 'lucide-react'
+import { CircleCheck, Download, Eye, Pencil, RefreshCcw, Trash2 } from 'lucide-react'
 import { toast } from 'sonner'
 import { Button } from '@/components/ui/button'
 import {
   DropdownMenu,
   DropdownMenuContent,
   DropdownMenuItem,
+  DropdownMenuSeparator,
   DropdownMenuShortcut,
   DropdownMenuTrigger,
 } from '@/components/ui/dropdown-menu'
@@ -47,6 +48,11 @@ export function DataTableRowActions({ row }: Props) {
     setOpen('edit')
   }
 
+  const handleDelete = () => {
+    setCurrentRow(evaluations)
+    setOpen('delete')
+  }
+
   const handleDownloadVideo = async () => {
     setIsDownloading(true)
     const toastId = toast.loading('در حال دانلود ویدیو...')
@@ -132,14 +138,14 @@ export function DataTableRowActions({ row }: Props) {
           </DropdownMenuShortcut>
         </DropdownMenuItem>
 
-        {/* <DropdownMenuSeparator /> */}
+        <DropdownMenuSeparator />
 
-        {/* <DropdownMenuItem onClick={handleDelete} className='text-red-600'>
-          حذف
+        <DropdownMenuItem onClick={handleDelete} className='text-red-600'>
+          حذف ارزیابی
           <DropdownMenuShortcut>
             <Trash2 size={16} color='red' />
           </DropdownMenuShortcut>
-        </DropdownMenuItem> */}
+        </DropdownMenuItem>
       </DropdownMenuContent>
     </DropdownMenu>
   )

+ 20 - 11
src/features/evaluations/components/evaluations-delete-dialog.tsx

@@ -2,6 +2,8 @@ import { AlertTriangle } from 'lucide-react'
 import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
 import { ConfirmDialog } from '@/components/confirm-dialog'
 import { type Evaluation } from '@/types/evaluations.types'
+import { useDeleteEvaluation } from '@/hooks/evaluations/useDeleteEvaluation'
+import { toast } from 'sonner'
 
 interface Props {
   open: boolean
@@ -14,30 +16,36 @@ export function EvaluationsDeleteDialog({
   onOpenChange,
   currentRow,
 }: Props) {
-  // const { mutate, isPending } = useDeleteUser()
+  const { mutate, isPending } = useDeleteEvaluation()
 
   if (!currentRow) return null
 
-  // const handleDelete = () => {
-  //   mutate(currentRow.id, {
-  //     onSuccess: () => {
-  //       onOpenChange(false)
-  //     },
-  //   })
-  // }
+  const handleDelete = () => {
+    mutate(
+      { id: currentRow.id },
+      {
+        onSuccess: () => {
+          toast.success('ارزیابی مورد نظر با موفقیت حذف شد.')
+          onOpenChange(false)
+        },
+        onError: () => {
+          toast.error('خطا در حذف ارزیابی!')
+        },
+      }
+    )
+  }
 
   return (
     <ConfirmDialog
       open={open}
       onOpenChange={onOpenChange}
-      form='evaluations-delete-form'
       title={
         <span className='text-destructive'>
           <AlertTriangle
             className='me-1 inline-block stroke-destructive'
             size={18}
           />{' '}
-          حذف پست
+          حذف ارزیابی
         </span>
       }
       desc={
@@ -50,8 +58,9 @@ export function EvaluationsDeleteDialog({
       }
       confirmText='حذف'
       cancelBtnText='انصراف'
-      // isLoading={isPending}
+      isLoading={isPending}
       destructive
+      handleConfirm={handleDelete}
     />
   )
 }

+ 7 - 0
src/features/evaluations/components/evaluations-dialogs.tsx

@@ -1,5 +1,6 @@
 import { EvaluationsActionDialog } from './evaluations-action-dialog'
 import { EvaluationsApproveDialog } from './evaluations-approve-dialog'
+import { EvaluationsDeleteDialog } from './evaluations-delete-dialog'
 import { EvaluationsEditDialog } from './evaluations-edit-dialog'
 import { useEvaluations } from './evaluations-provider'
 import { EvaluationsRetryDialog } from './evaluations-retry-dialog'
@@ -22,6 +23,12 @@ export function EvaluationsDialogs() {
         onOpenChange={() => setOpen(null)}
         currentRow={currentRow}
       />
+
+      <EvaluationsDeleteDialog
+        open={open === 'delete'}
+        onOpenChange={() => setOpen(null)}
+        currentRow={currentRow}
+      />
     </>
   )
 }

+ 1 - 1
src/features/evaluations/components/evaluations-provider.tsx

@@ -1,7 +1,7 @@
 import { type Evaluation } from '@/types/evaluations.types'
 import React, { createContext, useContext, useState } from 'react'
 
-type EvaluationsDialogType = 'retry' | 'view' | 'approve' | 'edit'
+type EvaluationsDialogType = 'retry' | 'view' | 'approve' | 'edit' | 'delete'
 
 interface EvaluationsContextType {
   open: EvaluationsDialogType | null

+ 22 - 0
src/hooks/evaluations/useDeleteEvaluation.tsx

@@ -0,0 +1,22 @@
+import { queryKeys } from '@/core/react-query/keys'
+import { evaluationsService } from '@/services/evaluations.service'
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+
+type DeleteEvaluationVariables = {
+  id: number | string
+}
+
+export function useDeleteEvaluation() {
+  const queryClient = useQueryClient()
+
+  return useMutation({
+    mutationFn: ({ id }: DeleteEvaluationVariables) =>
+      evaluationsService.delete(id),
+
+    onSuccess: () => {
+      queryClient.invalidateQueries({
+        queryKey: queryKeys.evaluations.lists(),
+      })
+    },
+  })
+}

+ 7 - 0
src/services/evaluations.service.ts

@@ -74,4 +74,11 @@ export const evaluationsService = {
     )
     return res?.data
   },
+
+  delete: async (evaluationId: number | string) => {
+    const res = await http.delete<ApiResponse<void>>(
+      `${BASE_URL}/${evaluationId}`
+    )
+    return res?.data
+  },
 }