import { deleteNotification, snoozeNotification, unsubscribeFromNotification } from "./NotificationActions"; import { Notification, getNotificationHtmlUrl, isNotificationBuiltFromTask } from "../notification"; import { Action, ActionPanel, Icon, Toast, getPreferenceValues, showToast } from "@raycast/api"; import { Page, UniversalInboxPreferences } from "../types"; import { MutatePromise } from "@raycast/utils"; import { useMemo, ReactElement } from "react"; import { PlanTask } from "./PlanTask"; import { handleErrors } from "../api"; import { TaskStatus } from "../task"; import fetch from "node-fetch"; interface NotificationTaskActionsProps { notification: Notification; detailsTarget: ReactElement; mutate: MutatePromise | undefined>; } export function NotificationTaskActions({ notification, detailsTarget, mutate }: NotificationTaskActionsProps) { const notificationHtmlUrl = useMemo(() => { return getNotificationHtmlUrl(notification); }, [notification]); return ( deleteNotification(notification, mutate)} /> unsubscribeFromNotification(notification, mutate)} /> snoozeNotification(notification, mutate)} /> completeTask(notification, mutate)} /> } /> ); } async function completeTask(notification: Notification, mutate: MutatePromise | undefined>) { if (!isNotificationBuiltFromTask(notification) || !notification.task) { return; } const preferences = getPreferenceValues(); const toast = await showToast({ style: Toast.Style.Animated, title: "Marking task as Done" }); try { await mutate( handleErrors( fetch(`${preferences.universalInboxBaseUrl.replace(/\/$/, "")}/api/tasks/${notification.task.id}`, { method: "PATCH", body: JSON.stringify({ status: TaskStatus.Done }), headers: { "Content-Type": "application/json", Authorization: `Bearer ${preferences.apiKey}`, }, }), ), { optimisticUpdate(page) { if (page) { page.content = page.content.filter((n) => n.id !== notification.id); } return page; }, }, ); toast.style = Toast.Style.Success; toast.title = "Task successfully marked as Done"; } catch (error) { toast.style = Toast.Style.Failure; toast.title = "Failed to mark task as Done"; toast.message = (error as Error).message; throw error; } }