import { useState } from 'react' import { Button, Group, Modal, Textarea } from '@pikku/mantine/core' import { useDisclosure } from '@mantine/hooks' import { notifications } from '@mantine/notifications' import { m } from '@/i18n/messages' import { useQueryClient } from '@tanstack/react-query' import { usePikkuMutation } from '@perauset/functions-sdk/pikku/api.gen' interface TaskActionsProps { taskId: string status: string } export function TaskActions({ taskId, status }: TaskActionsProps) { const queryClient = useQueryClient() const [blockOpened, { open: openBlock, close: closeBlock }] = useDisclosure() const [blockReason, setBlockReason] = useState('') const [completeOpened, { open: openComplete, close: closeComplete }] = useDisclosure() const [completeNotes, setCompleteNotes] = useState('') // Tasks appear under several listing queries (listTasks, listMyTasks, …); // invalidate any task-related query after a mutation. const invalidateTasks = () => { queryClient.invalidateQueries({ predicate: (q) => typeof q.queryKey[0] === 'string' && (q.queryKey[0] as string).toLowerCase().includes('task'), }) } const onError = (err: Error) => { notifications.show({ title: m.common_error(), message: err.message ?? 'Something went wrong', color: 'red', }) } const claimMutation = usePikkuMutation('claimTask', { onSuccess: () => { notifications.show({ title: m.common_success(), message: m.tasks_claimed(), color: 'teal', }) invalidateTasks() }, onError, }) const startMutation = usePikkuMutation('startTask', { onSuccess: () => { notifications.show({ title: m.common_success(), message: m.tasks_started(), color: 'teal', }) invalidateTasks() }, onError, }) const completeMutation = usePikkuMutation('completeTask', { onSuccess: () => { notifications.show({ title: m.common_success(), message: m.tasks_completed(), color: 'teal', }) closeComplete() setCompleteNotes('') invalidateTasks() }, onError, }) const blockMutation = usePikkuMutation('markTaskBlocked', { onSuccess: () => { notifications.show({ title: m.common_success(), message: m.tasks_blocked(), color: 'teal', }) closeBlock() setBlockReason('') invalidateTasks() }, onError, }) return ( <> {status === 'open' && ( )} {status === 'assigned' && ( )} {status === 'in_progress' && ( )} {(status === 'open' || status === 'assigned' || status === 'in_progress') && ( )}