| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import { useState } from 'react'
- import { DotsHorizontalIcon } from '@radix-ui/react-icons'
- import { type Row } from '@tanstack/react-table'
- import { evaluationsService } from '@/services/evaluations.service'
- import { type Evaluation } from '@/types/evaluations.types'
- import {
- CircleCheck,
- Download,
- Eye,
- Pencil,
- RefreshCcw,
- Trash2,
- } from 'lucide-react'
- import { toast } from 'sonner'
- import { downloadFromUrl } from '@/lib/downloadFromUrl'
- import { PERMISSIONS } from '@/constants/permissions'
- import { useCan } from '@/hooks/use-can'
- import { Button } from '@/components/ui/button'
- import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuSeparator,
- DropdownMenuShortcut,
- DropdownMenuTrigger,
- } from '@/components/ui/dropdown-menu'
- import { useEvaluations } from './evaluations-provider'
- interface Props {
- row: Row<Evaluation>
- }
- export function DataTableRowActions({ row }: Props) {
- const { setOpen, setCurrentRow } = useEvaluations()
- const { can } = useCan()
- const canUpdate = can(PERMISSIONS.evaluations.update)
- const canDelete = can(PERMISSIONS.evaluations.delete)
- const [isDownloading, setIsDownloading] = useState(false)
- const evaluations = row.original
- const handleShowConfirmRetry = () => {
- setCurrentRow(evaluations)
- setOpen('retry')
- }
- const handleView = () => {
- setCurrentRow(evaluations)
- setOpen('view')
- }
- const handleShowConfirmApprove = () => {
- setCurrentRow(evaluations)
- setOpen('approve')
- }
- const handleEdit = () => {
- setCurrentRow(evaluations)
- setOpen('edit')
- }
- const handleDelete = () => {
- setCurrentRow(evaluations)
- setOpen('delete')
- }
- const handleDownloadVideo = async () => {
- setIsDownloading(true)
- const toastId = toast.loading('در حال دانلود ویدیو...')
- try {
- let media = evaluations.media?.[0]
- if (!media?.url) {
- const detail = await evaluationsService.detail(evaluations.id)
- media = detail?.media?.[0]
- }
- if (!media?.url) {
- toast.error('ویدیویی برای دانلود یافت نشد.', { id: toastId })
- return
- }
- const filename =
- media.name || `evaluation-${evaluations.id}.${media.extension || 'mp4'}`
- await downloadFromUrl(media.url, filename)
- toast.success('دانلود ویدیو شروع شد.', { id: toastId })
- } catch {
- toast.error('خطا در دانلود ویدیو!', { id: toastId })
- } finally {
- setIsDownloading(false)
- }
- }
- return (
- <DropdownMenu>
- <DropdownMenuTrigger asChild>
- <Button variant='ghost' className='flex h-8 w-8 p-0'>
- <DotsHorizontalIcon className='h-4 w-4' />
- </Button>
- </DropdownMenuTrigger>
- <DropdownMenuContent align='end'>
- <DropdownMenuItem onClick={handleView}>
- مشاهده
- <DropdownMenuShortcut>
- <Eye size={16} />
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- {canUpdate && (
- <DropdownMenuItem
- onClick={handleEdit}
- disabled={evaluations?.status === 'pending'}
- >
- ویرایش ارزیابی
- <DropdownMenuShortcut>
- <Pencil size={16} />
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- )}
- <DropdownMenuItem
- onClick={handleDownloadVideo}
- disabled={isDownloading}
- >
- دانلود ویدیو
- <DropdownMenuShortcut>
- <Download size={16} />
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- {canUpdate && (
- <DropdownMenuItem
- onClick={handleShowConfirmApprove}
- disabled={evaluations?.status !== 'approved_ai'}
- >
- تایید ارزیابی
- <DropdownMenuShortcut>
- <CircleCheck size={16} />
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- )}
- {canUpdate && (
- <DropdownMenuItem
- onClick={handleShowConfirmRetry}
- disabled={evaluations?.status === 'pending'}
- >
- ارزیابی مجدد
- <DropdownMenuShortcut>
- <RefreshCcw size={16} />
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- )}
- {canDelete && (
- <>
- <DropdownMenuSeparator />
- <DropdownMenuItem onClick={handleDelete} className='text-red-600'>
- حذف ارزیابی
- <DropdownMenuShortcut>
- <Trash2 size={16} color='red' />
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- </>
- )}
- </DropdownMenuContent>
- </DropdownMenu>
- )
- }
|