2024-02-09 10:47:39 +00:00
|
|
|
import React, { useEffect, useRef } from "react";
|
2023-07-18 06:37:55 +00:00
|
|
|
import Image from "next/image";
|
2024-01-08 13:50:42 +00:00
|
|
|
import Link from "next/link";
|
2024-03-06 13:09:14 +00:00
|
|
|
import { useRouter } from "next/router";
|
2024-02-09 11:00:05 +00:00
|
|
|
import { Menu } from "@headlessui/react";
|
2023-07-18 06:37:55 +00:00
|
|
|
// icons
|
2024-03-06 13:09:14 +00:00
|
|
|
import { ArchiveRestore, Clock, MessageSquare, MoreVertical, User2 } from "lucide-react";
|
|
|
|
// ui
|
2024-03-06 08:48:41 +00:00
|
|
|
import { ArchiveIcon, CustomMenu, Tooltip, TOAST_TYPE, setToast } from "@plane/ui";
|
2023-11-03 13:51:35 +00:00
|
|
|
// constants
|
2024-03-06 13:09:14 +00:00
|
|
|
import { ISSUE_OPENED, NOTIFICATIONS_READ, NOTIFICATION_ARCHIVED, NOTIFICATION_SNOOZED } from "constants/event-tracker";
|
2023-11-03 13:51:35 +00:00
|
|
|
import { snoozeOptions } from "constants/notification";
|
2023-07-18 06:37:55 +00:00
|
|
|
// helper
|
2024-01-08 13:50:42 +00:00
|
|
|
import { calculateTimeAgo, renderFormattedTime, renderFormattedDate } from "helpers/date-time.helper";
|
2024-03-06 13:09:14 +00:00
|
|
|
import { replaceUnderscoreIfSnakeCase, truncateText, stripAndTruncateHTML } from "helpers/string.helper";
|
|
|
|
// hooks
|
|
|
|
import { useEventTracker } from "hooks/store";
|
2023-07-18 06:37:55 +00:00
|
|
|
// type
|
2024-02-09 10:52:08 +00:00
|
|
|
import type { IUserNotification, NotificationType } from "@plane/types";
|
2023-07-18 06:37:55 +00:00
|
|
|
|
|
|
|
type NotificationCardProps = {
|
2024-02-09 10:52:08 +00:00
|
|
|
selectedTab: NotificationType;
|
2023-07-18 06:37:55 +00:00
|
|
|
notification: IUserNotification;
|
2023-11-03 13:51:35 +00:00
|
|
|
isSnoozedTabOpen: boolean;
|
2024-01-08 13:50:42 +00:00
|
|
|
closePopover: () => void;
|
2023-07-18 06:37:55 +00:00
|
|
|
markNotificationReadStatus: (notificationId: string) => Promise<void>;
|
2023-08-02 11:53:55 +00:00
|
|
|
markNotificationReadStatusToggle: (notificationId: string) => Promise<void>;
|
2023-07-18 06:37:55 +00:00
|
|
|
markNotificationArchivedStatus: (notificationId: string) => Promise<void>;
|
|
|
|
setSelectedNotificationForSnooze: (notificationId: string) => void;
|
|
|
|
markSnoozeNotification: (notificationId: string, dateTime?: Date | undefined) => Promise<void>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const NotificationCard: React.FC<NotificationCardProps> = (props) => {
|
|
|
|
const {
|
2024-02-09 10:52:08 +00:00
|
|
|
selectedTab,
|
2023-07-18 06:37:55 +00:00
|
|
|
notification,
|
2023-11-03 13:51:35 +00:00
|
|
|
isSnoozedTabOpen,
|
2024-01-08 13:50:42 +00:00
|
|
|
closePopover,
|
2023-07-18 06:37:55 +00:00
|
|
|
markNotificationReadStatus,
|
2023-08-02 11:53:55 +00:00
|
|
|
markNotificationReadStatusToggle,
|
2023-07-18 06:37:55 +00:00
|
|
|
markNotificationArchivedStatus,
|
|
|
|
setSelectedNotificationForSnooze,
|
|
|
|
markSnoozeNotification,
|
|
|
|
} = props;
|
2024-02-09 10:52:08 +00:00
|
|
|
// store hooks
|
|
|
|
const { captureEvent } = useEventTracker();
|
2023-07-18 06:37:55 +00:00
|
|
|
|
|
|
|
const router = useRouter();
|
|
|
|
const { workspaceSlug } = router.query;
|
2024-02-09 10:47:39 +00:00
|
|
|
// states
|
2024-02-28 11:23:26 +00:00
|
|
|
const [showSnoozeOptions, setShowSnoozeOptions] = React.useState(false);
|
2024-02-09 10:47:39 +00:00
|
|
|
// refs
|
|
|
|
const snoozeRef = useRef<HTMLDivElement | null>(null);
|
|
|
|
|
|
|
|
const moreOptions = [
|
|
|
|
{
|
|
|
|
id: 1,
|
|
|
|
name: notification.read_at ? "Mark as unread" : "Mark as read",
|
|
|
|
icon: <MessageSquare className="h-3.5 w-3.5 text-custom-text-300" />,
|
|
|
|
onClick: () => {
|
|
|
|
markNotificationReadStatusToggle(notification.id).then(() => {
|
2024-03-06 08:48:41 +00:00
|
|
|
setToast({
|
2024-02-09 10:47:39 +00:00
|
|
|
title: notification.read_at ? "Notification marked as read" : "Notification marked as unread",
|
2024-03-06 08:48:41 +00:00
|
|
|
type: TOAST_TYPE.SUCCESS,
|
2024-02-09 10:47:39 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
id: 2,
|
|
|
|
name: notification.archived_at ? "Unarchive" : "Archive",
|
|
|
|
icon: notification.archived_at ? (
|
|
|
|
<ArchiveRestore className="h-3.5 w-3.5 text-custom-text-300" />
|
|
|
|
) : (
|
|
|
|
<ArchiveIcon className="h-3.5 w-3.5 text-custom-text-300" />
|
|
|
|
),
|
|
|
|
onClick: () => {
|
|
|
|
markNotificationArchivedStatus(notification.id).then(() => {
|
2024-03-06 08:48:41 +00:00
|
|
|
setToast({
|
2024-02-09 10:47:39 +00:00
|
|
|
title: notification.archived_at ? "Notification un-archived" : "Notification archived",
|
2024-03-06 08:48:41 +00:00
|
|
|
type: TOAST_TYPE.SUCCESS,
|
2024-02-09 10:47:39 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
},
|
|
|
|
];
|
|
|
|
|
|
|
|
const snoozeOptionOnClick = (date: Date | null) => {
|
|
|
|
if (!date) {
|
|
|
|
setSelectedNotificationForSnooze(notification.id);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
markSnoozeNotification(notification.id, date).then(() => {
|
2024-03-06 08:48:41 +00:00
|
|
|
setToast({
|
2024-02-09 10:47:39 +00:00
|
|
|
title: `Notification snoozed till ${renderFormattedDate(date)}`,
|
2024-03-06 08:48:41 +00:00
|
|
|
type: TOAST_TYPE.SUCCESS,
|
2024-02-09 10:47:39 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
// close snooze options on outside click
|
|
|
|
useEffect(() => {
|
|
|
|
const handleClickOutside = (event: any) => {
|
|
|
|
if (snoozeRef.current && !snoozeRef.current?.contains(event.target)) {
|
2024-02-28 11:23:26 +00:00
|
|
|
setShowSnoozeOptions(false);
|
2024-02-09 10:47:39 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
document.addEventListener("mousedown", handleClickOutside, true);
|
|
|
|
document.addEventListener("touchend", handleClickOutside, true);
|
|
|
|
return () => {
|
|
|
|
document.removeEventListener("mousedown", handleClickOutside, true);
|
|
|
|
document.removeEventListener("touchend", handleClickOutside, true);
|
|
|
|
};
|
|
|
|
}, []);
|
2023-07-18 06:37:55 +00:00
|
|
|
|
2024-02-28 11:23:26 +00:00
|
|
|
const notificationField = notification.data.issue_activity.field;
|
|
|
|
const notificationTriggeredBy = notification.triggered_by_details;
|
|
|
|
|
2023-11-03 13:51:35 +00:00
|
|
|
if (isSnoozedTabOpen && new Date(notification.snoozed_till!) < new Date()) return null;
|
|
|
|
|
2023-07-18 06:37:55 +00:00
|
|
|
return (
|
2024-01-08 13:50:42 +00:00
|
|
|
<Link
|
2023-07-18 06:37:55 +00:00
|
|
|
onClick={() => {
|
|
|
|
markNotificationReadStatus(notification.id);
|
2024-02-09 10:52:08 +00:00
|
|
|
captureEvent(ISSUE_OPENED, {
|
|
|
|
issue_id: notification.data.issue.id,
|
|
|
|
element: "notification",
|
|
|
|
});
|
2024-01-08 13:50:42 +00:00
|
|
|
closePopover();
|
2023-07-18 06:37:55 +00:00
|
|
|
}}
|
2024-01-08 13:50:42 +00:00
|
|
|
href={`/${workspaceSlug}/projects/${notification.project}/${
|
2024-02-28 11:23:26 +00:00
|
|
|
notificationField === "archived_at" ? "archived-issues" : "issues"
|
2024-01-08 13:50:42 +00:00
|
|
|
}/${notification.data.issue.id}`}
|
2023-12-10 10:18:10 +00:00
|
|
|
className={`group relative flex w-full cursor-pointer items-center gap-4 p-3 pl-6 ${
|
2023-07-19 09:14:04 +00:00
|
|
|
notification.read_at === null ? "bg-custom-primary-70/5" : "hover:bg-custom-background-200"
|
2023-07-18 06:37:55 +00:00
|
|
|
}`}
|
|
|
|
>
|
2023-07-19 09:14:04 +00:00
|
|
|
{notification.read_at === null && (
|
2023-12-10 10:18:10 +00:00
|
|
|
<span className="absolute left-2 top-1/2 h-1.5 w-1.5 -translate-y-1/2 rounded-full bg-custom-primary-100" />
|
2023-07-19 09:14:04 +00:00
|
|
|
)}
|
2023-12-10 10:18:10 +00:00
|
|
|
<div className="relative h-12 w-12 rounded-full">
|
2024-02-28 11:23:26 +00:00
|
|
|
{notificationTriggeredBy.avatar && notificationTriggeredBy.avatar !== "" ? (
|
2023-07-20 09:44:57 +00:00
|
|
|
<div className="h-12 w-12 rounded-full">
|
2023-07-19 09:14:04 +00:00
|
|
|
<Image
|
2024-02-28 11:23:26 +00:00
|
|
|
src={notificationTriggeredBy.avatar}
|
2023-07-20 09:44:57 +00:00
|
|
|
alt="Profile Image"
|
2023-07-19 09:14:04 +00:00
|
|
|
layout="fill"
|
|
|
|
objectFit="cover"
|
|
|
|
className="rounded-full"
|
|
|
|
/>
|
2023-07-20 09:44:57 +00:00
|
|
|
</div>
|
|
|
|
) : (
|
2023-12-10 10:18:10 +00:00
|
|
|
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-custom-background-80">
|
|
|
|
<span className="text-lg font-medium text-custom-text-100">
|
2024-02-28 11:23:26 +00:00
|
|
|
{notificationTriggeredBy.is_bot ? (
|
|
|
|
notificationTriggeredBy.first_name?.[0]?.toUpperCase()
|
|
|
|
) : notificationTriggeredBy.display_name?.[0] ? (
|
|
|
|
notificationTriggeredBy.display_name?.[0]?.toUpperCase()
|
2023-07-26 06:32:14 +00:00
|
|
|
) : (
|
2023-10-16 14:57:22 +00:00
|
|
|
<User2 className="h-4 w-4" />
|
2023-07-26 06:32:14 +00:00
|
|
|
)}
|
2023-07-19 09:14:04 +00:00
|
|
|
</span>
|
2023-07-20 09:44:57 +00:00
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
2023-12-10 10:18:10 +00:00
|
|
|
<div className="w-full space-y-2.5 overflow-hidden">
|
2024-02-09 10:47:39 +00:00
|
|
|
<div className="flex items-start">
|
|
|
|
{!notification.message ? (
|
|
|
|
<div className="w-full break-words text-sm">
|
|
|
|
<span className="font-semibold">
|
2024-02-28 11:23:26 +00:00
|
|
|
{notificationTriggeredBy.is_bot
|
|
|
|
? notificationTriggeredBy.first_name
|
|
|
|
: notificationTriggeredBy.display_name}{" "}
|
2024-02-09 10:47:39 +00:00
|
|
|
</span>
|
2024-02-28 11:23:26 +00:00
|
|
|
{!["comment", "archived_at"].includes(notificationField) && notification.data.issue_activity.verb}{" "}
|
|
|
|
{notificationField === "comment"
|
2024-02-09 10:47:39 +00:00
|
|
|
? "commented"
|
2024-02-28 11:23:26 +00:00
|
|
|
: notificationField === "archived_at"
|
2024-03-06 15:20:38 +00:00
|
|
|
? notification.data.issue_activity.new_value === "restore"
|
|
|
|
? "restored the issue"
|
|
|
|
: "archived the issue"
|
|
|
|
: notificationField === "None"
|
|
|
|
? null
|
|
|
|
: replaceUnderscoreIfSnakeCase(notificationField)}{" "}
|
2024-02-28 11:23:26 +00:00
|
|
|
{!["comment", "archived_at", "None"].includes(notificationField) ? "to" : ""}
|
2024-02-09 10:47:39 +00:00
|
|
|
<span className="font-semibold">
|
|
|
|
{" "}
|
2024-02-28 11:23:26 +00:00
|
|
|
{notificationField !== "None" ? (
|
|
|
|
notificationField !== "comment" ? (
|
|
|
|
notificationField === "target_date" ? (
|
2024-02-09 10:47:39 +00:00
|
|
|
renderFormattedDate(notification.data.issue_activity.new_value)
|
2024-02-28 11:23:26 +00:00
|
|
|
) : notificationField === "attachment" ? (
|
2024-02-09 10:47:39 +00:00
|
|
|
"the issue"
|
2024-02-28 11:23:26 +00:00
|
|
|
) : notificationField === "description" ? (
|
2024-02-09 10:47:39 +00:00
|
|
|
stripAndTruncateHTML(notification.data.issue_activity.new_value, 55)
|
2024-02-28 11:23:26 +00:00
|
|
|
) : notificationField === "archived_at" ? null : (
|
2024-02-09 10:47:39 +00:00
|
|
|
notification.data.issue_activity.new_value
|
|
|
|
)
|
2023-11-03 13:51:35 +00:00
|
|
|
) : (
|
2024-02-09 10:47:39 +00:00
|
|
|
<span>
|
|
|
|
{`"`}
|
|
|
|
{notification.data.issue_activity.new_value.length > 55
|
|
|
|
? notification?.data?.issue_activity?.issue_comment?.slice(0, 50) + "..."
|
|
|
|
: notification.data.issue_activity.issue_comment}
|
|
|
|
{`"`}
|
|
|
|
</span>
|
2023-11-03 13:51:35 +00:00
|
|
|
)
|
2023-07-19 09:14:04 +00:00
|
|
|
) : (
|
2024-02-09 10:47:39 +00:00
|
|
|
"the issue and assigned it to you."
|
|
|
|
)}
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
) : (
|
|
|
|
<div className="w-full break-words text-sm">
|
|
|
|
<span className="semi-bold">{notification.message}</span>
|
|
|
|
</div>
|
|
|
|
)}
|
2024-03-06 13:09:14 +00:00
|
|
|
<div className="flex items-start md:hidden">
|
2024-02-09 10:47:39 +00:00
|
|
|
<Menu as="div" className={" w-min text-left"}>
|
|
|
|
{({ open }) => (
|
|
|
|
<>
|
|
|
|
<Menu.Button as={React.Fragment}>
|
|
|
|
<button
|
|
|
|
onClick={(e) => e.stopPropagation()}
|
|
|
|
className="flex w-full items-center gap-x-2 rounded p-0.5 text-sm"
|
|
|
|
>
|
|
|
|
<MoreVertical className="h-3.5 w-3.5 text-custom-text-300" />
|
|
|
|
</button>
|
|
|
|
</Menu.Button>
|
|
|
|
{open && (
|
|
|
|
<Menu.Items className={"absolute right-0 z-10"} static>
|
|
|
|
<div
|
|
|
|
className={
|
2024-03-06 13:09:14 +00:00
|
|
|
"my-1 min-w-[12rem] overflow-y-scroll whitespace-nowrap rounded-md border-[0.5px] border-custom-border-300 bg-custom-background-100 px-2 py-2.5 text-xs shadow-custom-shadow-rg focus:outline-none"
|
2024-02-09 10:47:39 +00:00
|
|
|
}
|
|
|
|
>
|
|
|
|
{moreOptions.map((item) => (
|
2024-03-06 13:09:14 +00:00
|
|
|
<Menu.Item as="div" key={item.id}>
|
2024-02-09 10:47:39 +00:00
|
|
|
{({ close }) => (
|
|
|
|
<button
|
|
|
|
onClick={(e) => {
|
|
|
|
e.stopPropagation();
|
|
|
|
e.preventDefault();
|
|
|
|
item.onClick();
|
|
|
|
close();
|
|
|
|
}}
|
2024-03-06 13:09:14 +00:00
|
|
|
className="flex items-center gap-x-2 p-1.5"
|
2024-02-09 10:47:39 +00:00
|
|
|
>
|
|
|
|
{item.icon}
|
|
|
|
{item.name}
|
|
|
|
</button>
|
|
|
|
)}
|
|
|
|
</Menu.Item>
|
|
|
|
))}
|
|
|
|
<Menu.Item as="div">
|
|
|
|
<div
|
|
|
|
onClick={(e) => {
|
|
|
|
e.stopPropagation();
|
|
|
|
e.preventDefault();
|
2024-02-28 11:23:26 +00:00
|
|
|
setShowSnoozeOptions(true);
|
2024-02-09 10:47:39 +00:00
|
|
|
}}
|
2024-03-06 13:09:14 +00:00
|
|
|
className="flex items-center gap-x-2 p-1.5"
|
2024-02-09 10:47:39 +00:00
|
|
|
>
|
|
|
|
<Clock className="h-3.5 w-3.5 text-custom-text-300" />
|
|
|
|
Snooze
|
|
|
|
</div>
|
|
|
|
</Menu.Item>
|
|
|
|
</div>
|
|
|
|
</Menu.Items>
|
|
|
|
)}
|
|
|
|
</>
|
2023-11-03 13:51:35 +00:00
|
|
|
)}
|
2024-02-09 10:47:39 +00:00
|
|
|
</Menu>
|
|
|
|
{showSnoozeOptions && (
|
|
|
|
<div
|
|
|
|
ref={snoozeRef}
|
2024-03-06 13:09:14 +00:00
|
|
|
className="absolute right-36 top-24 z-20 my-1 min-w-[12rem] overflow-y-scroll whitespace-nowrap rounded-md border-[0.5px] border-custom-border-300 bg-custom-background-100 px-2 py-2.5 text-xs shadow-custom-shadow-rg focus:outline-none"
|
2024-02-09 10:47:39 +00:00
|
|
|
>
|
|
|
|
{snoozeOptions.map((item) => (
|
|
|
|
<p
|
2024-03-06 13:09:14 +00:00
|
|
|
key={item.label}
|
2024-02-09 10:47:39 +00:00
|
|
|
className="p-1.5"
|
|
|
|
onClick={(e) => {
|
|
|
|
e.stopPropagation();
|
|
|
|
e.preventDefault();
|
2024-02-28 11:23:26 +00:00
|
|
|
setShowSnoozeOptions(false);
|
2024-02-09 10:47:39 +00:00
|
|
|
snoozeOptionOnClick(item.value);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{item.label}
|
|
|
|
</p>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
)}
|
2023-11-03 13:51:35 +00:00
|
|
|
</div>
|
2024-02-09 10:47:39 +00:00
|
|
|
</div>
|
2023-07-18 06:37:55 +00:00
|
|
|
|
2023-07-20 09:44:57 +00:00
|
|
|
<div className="flex justify-between gap-2 text-xs">
|
2024-03-06 13:09:14 +00:00
|
|
|
<p className="line-clamp-1 text-custom-text-300">
|
2023-07-20 09:44:57 +00:00
|
|
|
{truncateText(
|
|
|
|
`${notification.data.issue.identifier}-${notification.data.issue.sequence_id} ${notification.data.issue.name}`,
|
|
|
|
50
|
|
|
|
)}
|
|
|
|
</p>
|
|
|
|
{notification.snoozed_till ? (
|
2023-12-10 10:18:10 +00:00
|
|
|
<p className="flex flex-shrink-0 items-center justify-end gap-x-1 text-custom-text-300">
|
2023-10-16 14:57:22 +00:00
|
|
|
<Clock className="h-4 w-4" />
|
2023-07-20 09:44:57 +00:00
|
|
|
<span>
|
2024-01-08 13:50:42 +00:00
|
|
|
Till {renderFormattedDate(notification.snoozed_till)},{" "}
|
|
|
|
{renderFormattedTime(notification.snoozed_till, "12-hour")}
|
2023-07-20 09:44:57 +00:00
|
|
|
</span>
|
|
|
|
</p>
|
|
|
|
) : (
|
2024-03-06 13:09:14 +00:00
|
|
|
<p className="mt-auto flex-shrink-0 text-custom-text-300">{calculateTimeAgo(notification.created_at)}</p>
|
2023-07-20 09:44:57 +00:00
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
</div>
|
2023-12-10 10:18:10 +00:00
|
|
|
<div className="absolute right-3 top-3 hidden gap-x-3 py-1 group-hover:flex">
|
2023-07-19 09:14:04 +00:00
|
|
|
{[
|
|
|
|
{
|
|
|
|
id: 1,
|
2023-07-20 09:44:57 +00:00
|
|
|
name: notification.read_at ? "Mark as unread" : "Mark as read",
|
2023-10-17 09:57:38 +00:00
|
|
|
icon: <MessageSquare className="h-3.5 w-3.5 text-custom-text-300" />,
|
2023-07-19 09:14:04 +00:00
|
|
|
onClick: () => {
|
2023-08-02 11:53:55 +00:00
|
|
|
markNotificationReadStatusToggle(notification.id).then(() => {
|
2024-02-09 10:52:08 +00:00
|
|
|
captureEvent(NOTIFICATIONS_READ, {
|
|
|
|
issue_id: notification.data.issue.id,
|
|
|
|
tab: selectedTab,
|
|
|
|
state: "SUCCESS",
|
|
|
|
});
|
2024-03-06 08:48:41 +00:00
|
|
|
setToast({
|
2023-11-22 07:28:55 +00:00
|
|
|
title: notification.read_at ? "Notification marked as read" : "Notification marked as unread",
|
2024-03-06 08:48:41 +00:00
|
|
|
type: TOAST_TYPE.SUCCESS,
|
2023-07-18 06:37:55 +00:00
|
|
|
});
|
2023-07-19 09:14:04 +00:00
|
|
|
});
|
2023-07-18 06:37:55 +00:00
|
|
|
},
|
2023-07-19 09:14:04 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
id: 2,
|
2023-07-20 09:44:57 +00:00
|
|
|
name: notification.archived_at ? "Unarchive" : "Archive",
|
2023-10-16 14:57:22 +00:00
|
|
|
icon: notification.archived_at ? (
|
2023-10-17 09:57:38 +00:00
|
|
|
<ArchiveRestore className="h-3.5 w-3.5 text-custom-text-300" />
|
2023-10-16 14:57:22 +00:00
|
|
|
) : (
|
2023-10-17 09:57:38 +00:00
|
|
|
<ArchiveIcon className="h-3.5 w-3.5 text-custom-text-300" />
|
2023-10-16 14:57:22 +00:00
|
|
|
),
|
2023-07-19 09:14:04 +00:00
|
|
|
onClick: () => {
|
|
|
|
markNotificationArchivedStatus(notification.id).then(() => {
|
2024-02-09 10:52:08 +00:00
|
|
|
captureEvent(NOTIFICATION_ARCHIVED, {
|
|
|
|
issue_id: notification.data.issue.id,
|
|
|
|
tab: selectedTab,
|
|
|
|
state: "SUCCESS",
|
|
|
|
});
|
2024-03-06 08:48:41 +00:00
|
|
|
setToast({
|
fix: Implementing mobx, refactoring service layer and rewriting components (#2441)
* chore: kanban refactoring
* chore: Implemented new kanaban board UX and implemented draggable using react beautiful dnd
* chore: updated yarn lock
* chore: updated the store for issues and issue filters
* chore: resolved build error
* chore: created filters and updated the issue filters, display_filter and display_properties in mobx and components
* chore: implemented filters for issues
* chore: UI theming updates
* chore: handled single and multi select in filter cards
* chore: implemented filters and views in kanaban
* chore: updating filters, display_filter and display properties
* chore: filter, layout, display filters, extra filters and display properties render validation
* chore: clean up and resolved import warnings
* chore: type check
* chore: renamed gantt key to gantt_chart
* chore: filter render UI and Functionality implementation
* chore: filter empty state handling in issue filter selection
* Implementing list view
* chore: kanban drag drop logic
* filtering
* chore: store setup
* chore: handled build issues
* chore: store setup
* user filter
* chore: store setup
* chore: store fixes and static data setup
* chore: store setup for build fixes
* fix: merge conflicts (#2231)
* chore: dynamic position dropdown (#2138)
* chore: dynamic position state dropdown for issue view
* style: state select dropdown styling
* fix: state icon attribute names
* chore: state select dynamic dropdown
* chore: member select dynamic dropdown
* chore: label select dynamic dropdown
* chore: priority select dynamic dropdown
* chore: label select dropdown improvement
* refactor: state dropdown location
* chore: dropdown improvement and code refactor
* chore: dynamic dropdown hook type added
---------
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
* fix: fields not getting selected in the create issue form (#2212)
* fix: hydration error and draft issue workflow
* fix: build error
* fix: properties getting de-selected after create, module & cycle not getting auto-select on the form
* fix: display layout, props being updated directly
* chore: sub issues count in individual issue (#2221)
* fix: service imports
* chore: rename csv service file
---------
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
* chore: store fixes
* chore: update issue detail store to handle peek overview (#2237)
* chore: dynamic position dropdown (#2138)
* chore: dynamic position state dropdown for issue view
* style: state select dropdown styling
* fix: state icon attribute names
* chore: state select dynamic dropdown
* chore: member select dynamic dropdown
* chore: label select dynamic dropdown
* chore: priority select dynamic dropdown
* chore: label select dropdown improvement
* refactor: state dropdown location
* chore: dropdown improvement and code refactor
* chore: dynamic dropdown hook type added
---------
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
* fix: fields not getting selected in the create issue form (#2212)
* fix: hydration error and draft issue workflow
* fix: build error
* fix: properties getting de-selected after create, module & cycle not getting auto-select on the form
* fix: display layout, props being updated directly
* chore: sub issues count in individual issue (#2221)
* Implemented nested issues in the sub issues section in issue detail page (#2233)
* feat: subissues infinte level
* feat: updated UI for sub issues
* feat: subissues new ui and nested sub issues in issue detail
* chore: removed repeated code
* refactor: product updates modal layout (#2225)
* fix: handle no issues in custom analytics (#2226)
* fix: activity label color (#2227)
* fix: profile issues layout switch (#2228)
* chore: update service imports
* chore: update issue detail store to handle peek overview
---------
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
Co-authored-by: guru_sainath <gurusainath007@gmail.com>
* chore: minor fixes
* workspace project fixes
* feat: project issues topbar (#2256)
* chore: project issues topbar
* style: theming and minor UI fixes
* refactor: file structure
* chore: layout wise authorization added
* style: filter dropdowns
* chore: add fetch keys
* chore: minor fixes
* chore: filters dropdown (#2260)
* chore: project issues topbar
* style: theming and minor UI fixes
* refactor: file structure
* chore: layout wise authorization added
* style: filter dropdowns
* chore: add fetch keys
* feat: search option for filters
* fix: sticky headers
* chore: sub_group_by section added
* fix: leave project fixes
* refactor: project card component refactor
* Implemented swimlanes and kanban view (#2262)
* chore: issue store for kanban and calendar
* chore: updated ui for kanba and swimlanes
* chore: yarn.lock updated
* fix: computed filters logic
* chore: added sub_group_by in params and handled sub-group-by render error in display filter's
* fix: ui package setup and project update form refactor
* fix: ui package setup
* fix: minor ui fixes
* dev: calendar view layout revamp (#2293)
* dev: calendar view init
* chore: new render logic
* chore: implement calendar view
* chore: calendar view
* refactor: calendar payload
* chore: remove active month logic from backend
* chore: setup new store for calendar
* refactor: issues fetching structure
* chore: months dropdown
* chore: modify request query params for calendar layout
* refactor: remove console logs and add comments
* chore: removed demo m-store routes
* cycles changes
* chore: issues grouped kanban and swimlanes UI and functionality (#2294)
* chore: updated the all the group_by and sub_group_by UI and functionality render in kanban
* chore: kanban sorting in mobx and ui updates
* chore: ui changes and drag and drop functionality changes in kanban
* chore: issues count render in kanban default and swimlanes
* chore: Added icons to the group_by and sub_group_by in kanban and swimlanes
* refactor: filter components, constants and helper functions (#2297)
* refactor: filters and display filters to accept handlers as props
* refactor: filters and display filters folder structure
* refactor: change issue layout options constant structure
* chore: display filters validations
* chore: view less filters functionality
* fix: display filters validation
* refactor: wrap functions around useCallback
* chore: start and target date filter options added
* refactor: query params generator function
* fix: query params generator function
* dev: gantt chart implementation using MobX (#2302)
* dev: fetch project gantt issues using mobx
* chore: handle group by options in the kanban layout
* dev: spreadsheet layout implementation using MobX (#2306)
* dev: implement spreadsheet view using mobx
* refactor: remove console logs and props
* chore: refactoring cycles list
* feat: adding additional ui components
* dev: applied filters list implementation using MobX (#2325)
* dev: applied filters list UI
* fix: filter item height
* chore: remove unnecessary classes
* fix: params generator
* fix: cycles views list and board
* fix: cycles list rendering fixes
* fix: layout fixes
* refactor: filter components (#2359)
* fix: calendar layout dividers
* refactor: filter selection components
* fix: dropdown closing after selection
* refactor: filters components
* chore: issue properties for list and kanban layouts and implemented estimates in project store (#2363)
* chore: issue properties for state, priorit, labels and members
* feat: implemented assignee, labels properties
* fix: implemented estimates in project store and issue properties
* chore: staer_date and due_date and validation properties in kanban
* chore: filters import conflict
* dev: setup module and module filter store (#2364)
* dev: implement module issues using mobx store
* dev: module filter store setup
* chore: module store crud operations
* chore: issue list layout (#2367)
* chore: merge develop (#2388)
* fix: build erros
* chore: cycles, modules store integration, list and kanban layouts and updated kanban logic (#2399)
* chore: cycle, cycle-issue, cycle-filters, cycle-kanban, cycle layout setup
* chore: cycles kanban and list view store
* chore: cycles, modules kanban and list, kanban view store
* refactor: change naming convention (#2383)
* fix:auth layer revamp
* chore: Implemented list and kanban views in project modules (#2402)
* chore: updated kanban logic in project cycles and modules
* chore: updated list and kanban in module
* dev: implement global views using MobX (#2404)
* fix: selfhosted fixes (#2154)
* fix: selfhosted fixes
* fix: updated env example
* chore: dynamic position dropdown (#2138)
* chore: dynamic position state dropdown for issue view
* style: state select dropdown styling
* fix: state icon attribute names
* chore: state select dynamic dropdown
* chore: member select dynamic dropdown
* chore: label select dynamic dropdown
* chore: priority select dynamic dropdown
* chore: label select dropdown improvement
* refactor: state dropdown location
* chore: dropdown improvement and code refactor
* chore: dynamic dropdown hook type added
---------
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
* fix: fields not getting selected in the create issue form (#2212)
* fix: hydration error and draft issue workflow
* fix: build error
* fix: properties getting de-selected after create, module & cycle not getting auto-select on the form
* fix: display layout, props being updated directly
* chore: sub issues count in individual issue (#2221)
* Implemented nested issues in the sub issues section in issue detail page (#2233)
* feat: subissues infinte level
* feat: updated UI for sub issues
* feat: subissues new ui and nested sub issues in issue detail
* chore: removed repeated code
* refactor: product updates modal layout (#2225)
* fix: handle no issues in custom analytics (#2226)
* fix: activity label color (#2227)
* fix: profile issues layout switch (#2228)
* fix: issues resolved in sub issues (#2238)
* fix: aws region name (#2234)
* chore: updated docker naming conventions (#2239)
* naming convention changes
* dev: update docker-compose-hub in consistent with docker-compose
* dev: updated docker container name
---------
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
* chore: added state and priority order in workspace user profile (#2241)
* fix: changed priority from None to none (#2229)
* fix: cycle and module stats when issues are archived (#2185)
* fix: cycle and module stats when issues are archived
* fix: added draft filter
---------
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
* feat: quick add (#2240)
* feat: quick add
* style: made text color muted
* chore: added epoch in draft (#2244)
* chore: added epoch in draft
* chore: removed extra spaces
* fix: resolved pending issue graph in analytics, user wishes in dashboard, and typo in projects list (#2247)
* style: settings page improvement (#2211)
* style: settings page improvement
* style: toggle switch styling
---------
Co-authored-by: Anmol Singh Bhatia <asb@Anmols-MacBook-Pro.local>
* chore: changed priority props in workspace and project (#2253)
* fix: bug fix related to fetching dropdown options for the profile issue (#2246)
* fix: sub issue state and member select build error (#2254)
* rename view to layout (#2255)
Co-authored-by: Your Name <you@example.com>
* fix: bug fixes and ui improvement (#2250)
* dev: remove auto filter endpoint
* feat: quick-add placement in spreadsheet and gantt (#2259)
* feat: sticking quick-add at the bottom of the screen
fix: opening create issue modal instead of quick-add in draft-issues, my-issue and profile page
* fix: build error due to dynamic import
* fix: draft issue delete not working (#2249)
* fix: draft issue not deleting, project can't be changed in draft issue modal
* fix: removed mutation for view where draft issues are not shown
* fix: inline create issue for draft issue
* fix: clearing data from localstorage on discard click
* feat: Add peek overview in sub issues and updated UI for empty states. (#2263)
* chore: add tooltip to show full time on activity logs (#2235)
* fix: issue automation iterable error (#2208)
* fix: n+1 queries for cycle list and project member endpoints (#2257)
* [fix] nginx continuously rewriting and reloading on index page of spaces app (#2236)
* chore: shifted index page to /home route
* chore: added rewrite logic, to rewrite index to /home
* chore: routed home to login route as login page
* chore: updated nginx config to route to login
* chore: updated path for home
* dev: migration for 0.13 (#2266)
* dev: updated migrations
* dev: migration for 0.13
* dev: re-split migrations into two different files (#2268)
* dev: split issue activity migration separate files
* dev: resplit migrations into two different files
* dev: changed the batch size
* chore: udpate date filters to support dynamic options
* fix: bugs in quick-add and draft issues (#2269)
* fix: 'Last Drafted Issue' making sidebar look weird on collapsed
* feat: scroll to the bottom when issue is created
* fix: 'Add Issue' button overlapping issue card in spreadsheet view
* fix: wrong placement of quick-add in calender layout
* fix: spacing for issue card in spreadsheet view
* chore: add instructions to contributing guide (#2270)
* chore: add instructions to contributing guide
* dev: update contributing.md to use the new configuration
---------
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
* fix: user dashboard greeting timezone (#2267)
* chore: user greeting timezone
* fix: group by labels not working on workspace level
* feat: workspace global view, style: spreadsheet view revamp (#2273)
* chore: workspace view types, services and hooks added
* style: spreadsheet view revamp and code refactor
* feat: workspace view
* fix: build fix
* chore: sidebar workspace issues redirection updated
* style: gantt layout quick-add padding (#2272)
* fix: 'Last Drafted Issue' making sidebar look weird on collapsed
* feat: scroll to the bottom when issue is created
* fix: 'Add Issue' button overlapping issue card in spreadsheet view
* fix: wrong placement of quick-add in calender layout
* fix: spacing for issue card in spreadsheet view
* style: gantt layout quick-add padding
style: removed 'State group' from draft issue
* style: decrese shadow, quick-add position on calender layout, and 'add issue' sticky
* style: button color
* fix: block click happening while moving (#2275)
* dev: refactor date filters to a single function
* chore: handle calendar date range in frontend (#2277)
* chore: gantt chart empty state (#2279)
* chore: gantt empty state
* chore: Add heading to the gantt sidebar
* style: calender quick-add same width as single date (#2280)
* style: calender quick-add same width as single date
* style: margin bottom in quick-add in spreadsheet view
* fix: quick add opening in list-layout
* style: reduced margin left
* chore: updated created at in draft issue (#2278)
* chore: make target dates inclusive when filtering (#2276)
* chore: sort order and issue props for global views (#2283)
* chore: removed project filter (#2284)
* fix: inbox issue deletes (#2290)
* chore: views (#2288)
* chore: global views order by
* chore: update permissions for global views
---------
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
* chore: fetch issues from previous and next month in the calendar view (#2282)
* fix: issue activity estimate value bug fix (#2281)
* fix: issue activity estimate value bug fix
* fix: activity typo fix
* fix: ui and bugs (#2289)
* fix: 24 character limit on first & last name in onboarding page
* fix: no option: 'Add Issue' in archive issue page
* fix: in archive issue directly sending to issue detail page
* fix: issue type showing in archive issue
* fix: custom menu overflowing
* fix: changing subscriber in filters has no effect
* style: border in quick-add
* fix: on onboarding member role overflowing
* fix: inconsistent icons in issue detail
* style: spacing, borders and shadows in quick-add
* fix: custom menu truncate
* fix: notifications for created by me and assigned to me (#2292)
* chore: workspace view display filters and properties , code refactor (#2295)
* chore: spreadsheet view context
* chore: spreadsheet context provider
* chore: spreadsheet view context
* chore: display filters and properties added in workspace view and code refactor
* fix: build error fix
* chore: set sub-issue display option to false for global views
---------
Co-authored-by: gurusainath <gurusainath007@gmail.com>
* chore: label create error (#2299)
* chore: global issues ui improvement and bug fixes (#2300)
* chore: workspace view mutation fix ,bug fixes and code refactor (#2301)
* chore: workspace view mutation fix ,bug fixes and code refactor
* chore: update workspace view toast alert added
* chore: workspace view order by removed (#2303)
* dev: updated migrations for 0.13-dev (#2305)
* chore: epoch migration batch size changed
* chore: reoredered the migration files
* dev: updated migrations for 0.13-dev
* chore: added epoch field
* dev: merged the migration files
* fix: workspace view filters count fix (#2307)
* fix: unsplash api fix (#2310)
* fix: workspace view redirection fix, style: spreadsheet view shadow scroll fix (#2314)
* fix: workspace view redirection fix
* style: spreadsheet view scroll shadow fix
* fix: update build workflow for the deploy app (#2315)
* fix: workspace view add issue mutation fix (#2317)
* dev: create action to sync PR changes to the repo (#2333)
* fix: ui package readme added (#2334)
* fix: variable name for token (#2336)
* dev: update add permissions to the action (#2337)
* dev: rename token variables (#2338)
* fix: updated readme fixes (#2339)
* dev: update sync workflow to run only when the source repo is configured (#2346)
* dev: update sync workflow to run only when the source repo is configured
* fix: naming convention changes
---------
Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com>
* fix: issue relation mutation and draft issue (#2340)
* fix: issue relation mutation and draft issue
* fix: 'New Issue' in gantt view
fix: emoji select going under
* fix: profile page typo
* fix: sync workflow fixes (#2365)
* fix: sync job pr description escaped values fix (#2366)
* Update index.tsx (#2343)
Fixes #2342
* dev: update apiserver configuration files (#2348)
* dev: update apiserver configuration files
* dev: add email and minio redirection urls
* fix: themening validation in store init. (#2350)
* chore: member can change role (#2371)
* chore: removed the issue draft log from my profile (#2368)
* adding sync info in pr title (#2373)
* chore: layout access validation and switch in plane deploy issues route (#2351)
* chore: handled route validation and layout access validation in plane deploy issues
* chore: impoved validation condition
* show current version in the help section dropdown (#2353)
* fix: table menu positioning (#2354)
* fix: handle cross project issues in the sub-issues. (#2357)
* fix: login process validation based on api config (#2361)
* dev: configuration endpoint for frontend client (#2355)
* dev: configuration endpoint for frontend clients
* dev: configuration enable magic and email/password signup
* dev: update unsplash keys
* dev: add unsplash API and add env for magic login
* fix: 404 when redirecting user clicks on Sign In button (#2349)
* fix: 404 when redirecting user to login page
* fix: next_path redirection not working
* fix: authentication workflow update in plane deploy
---------
Co-authored-by: gurusainath <gurusainath007@gmail.com>
* fix: project setting member role validation (#2369)
* fix: project setting member role validation
* chore: opacity removed from member setting page
* chore: member setting page validation
* chore: project covers endpoint (#2370)
* chore: project covers endpoint
* dev: remove print logs
* dev: formatting
---------
Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com>
* feat: default project cover images tab on the change cover popover (#2375)
* feat: default project cover images tab
* chore: remove unnecessary env vars from turbo.json
* chore: remove unnecessary OAuth envs (#2378)
* chore: remove unnecessary oauth envs
* merge conflicts resolved
* fix: adding new service
---------
Co-authored-by: sriramveeraghanta <veeraghanta.sriram@gmail.com>
* fix: added user store variables in mobx store observable (#2380)
* fix: state group icons (#2381)
* fix: removed default theme setting in the index page (#2382)
* fix: removed default theme setting in the index page
* fix: empty space
* dev: global views and workspace filters store implemented
* sync CE Master to EE Develop
* refactor: create update view modal
* chore: static issue global views
* refactor: remove old code
* refactor: filters select dropdown
* chore: fix calendar layout
* chore: mobx store for new applied filters
* chore: dded search functionality
---------
Co-authored-by: Vamsi Kurama <vamsi.kurama@gmail.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
Co-authored-by: guru_sainath <gurusainath007@gmail.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Anmol Singh Bhatia <asb@Anmols-MacBook-Pro.local>
Co-authored-by: Rhea Jain <65884341+rhea0110@users.noreply.github.com>
Co-authored-by: Your Name <you@example.com>
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Thomas <git@thomasync.dev>
Co-authored-by: Luis Cruz <55716036+luis-cruzt@users.noreply.github.com>
Co-authored-by: Manish Gupta <manish@mgupta.me>
* fix: Auth fixes and Layout fixes (#2408)
* fix: auth fixes and layout improvements
* fix: layout fixes
* fix: analytics page fixes
* dev: implemented project views using MobX (#2410)
* dev: implemented project views list using mobx
* style: views list UI
* dev: implemented view issues page using mobx
* refactor: project view issues fetching
* chore: plane ui library component and code refactor (#2406)
* chore: swap input component with plane/ui package
* chore: swap textarea component with plane/ui package
* chore: swap button component with plane/ui package
* chore: button component revamp
* fix: button type fix
* chore: secondary button revamp
* chore: button props updated
* chore: swap loader component with plane/ui package
* fix: build error fix
* chore: button component refactor
* chore: code refactor
* chore: swap toggle switch component with plane/ui package
* chore: swap spinner component with plane/ui package
* chore: swap progress bar componenet with plan/ui package
* chore: code refactor
* fix: gitignore fixes
* fix: project card fixes
* chore: ui component revamp (#2415)
* chore: swap tooltip component with plane ui package
* chore: swap linear progress component with plane ui package
* fix: login button fix
* chore: implement new worksapace wrapper for global views (#2412)
* chore: implement new worksapace wrapper for global views pages
* fix: merge conflicts
* fix: merge conflicts
* dev: add remaining layouts to cycle (#2413)
* fix: workspace auth wrapper changes
* chore: project card revamp and refactor (#2416)
* removing dist from ui
* refactor: analytics (#2419)
* refactor: helper functions
* chore: updated all the page headers
* refactor: custom analytics
* refactor: project analytics modal
* refactor: folder structure, remove junk code (#2423)
* refactor: folder structure
* chore: ad order by target date option
* refactor: remove old layout components
* refactor: inbox folder structure
* fix: services fixes
* fix: store imports changes
* fix: services export fixes
* fix: services implementation fixes
* fix: build issue fixes
* fix: react library fixes
* refactor: MobX store folder structure (#2435)
* refactor: store folder structure
* chore: update import statements
* fix: service import errors (#2436)
* fix: service imports
* chore: update service imports in store
* chore: fix remianing service imports
* build fixes
* editor ts config fixes
* fix: turbo and build fixes
* fix: Auth screen loading implementation
* fix: build issues
* fix: turbo settings for ui package
---------
Co-authored-by: gurusainath <gurusainath007@gmail.com>
Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com>
Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com>
Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
Co-authored-by: Vamsi Kurama <vamsi.kurama@gmail.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: Anmol Singh Bhatia <asb@Anmols-MacBook-Pro.local>
Co-authored-by: Rhea Jain <65884341+rhea0110@users.noreply.github.com>
Co-authored-by: Your Name <you@example.com>
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
Co-authored-by: Henit Chobisa <chobisa.henit@gmail.com>
Co-authored-by: Thomas <git@thomasync.dev>
Co-authored-by: Luis Cruz <55716036+luis-cruzt@users.noreply.github.com>
Co-authored-by: Manish Gupta <manish@mgupta.me>
2023-10-15 18:20:12 +00:00
|
|
|
title: notification.archived_at ? "Notification un-archived" : "Notification archived",
|
2024-03-06 08:48:41 +00:00
|
|
|
type: TOAST_TYPE.SUCCESS,
|
2023-07-18 06:37:55 +00:00
|
|
|
});
|
2023-07-19 09:14:04 +00:00
|
|
|
});
|
2023-07-18 06:37:55 +00:00
|
|
|
},
|
2023-07-19 09:14:04 +00:00
|
|
|
},
|
|
|
|
].map((item) => (
|
2024-03-06 13:09:14 +00:00
|
|
|
<Tooltip tooltipContent={item.name} key={item.id}>
|
2023-07-18 06:37:55 +00:00
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
onClick={(e) => {
|
|
|
|
e.stopPropagation();
|
2024-01-08 13:50:42 +00:00
|
|
|
e.preventDefault();
|
2023-07-18 06:37:55 +00:00
|
|
|
item.onClick();
|
|
|
|
}}
|
|
|
|
key={item.id}
|
2023-12-10 10:18:10 +00:00
|
|
|
className="flex w-full items-center gap-x-2 rounded bg-custom-background-80 p-0.5 text-sm outline-none hover:bg-custom-background-100"
|
2023-07-18 06:37:55 +00:00
|
|
|
>
|
2023-10-16 14:57:22 +00:00
|
|
|
{item.icon}
|
2023-07-18 06:37:55 +00:00
|
|
|
</button>
|
2023-07-19 09:14:04 +00:00
|
|
|
</Tooltip>
|
|
|
|
))}
|
2023-07-20 09:44:57 +00:00
|
|
|
<Tooltip tooltipContent="Snooze">
|
2023-10-17 09:57:38 +00:00
|
|
|
<CustomMenu
|
|
|
|
className="flex items-center"
|
|
|
|
customButton={
|
2023-12-10 10:18:10 +00:00
|
|
|
<div className="flex w-full items-center gap-x-2 rounded bg-custom-background-80 p-0.5 text-sm hover:bg-custom-background-100">
|
2023-10-17 09:57:38 +00:00
|
|
|
<Clock className="h-3.5 w-3.5 text-custom-text-300" />
|
|
|
|
</div>
|
|
|
|
}
|
|
|
|
optionsClassName="!z-20"
|
|
|
|
>
|
|
|
|
{snoozeOptions.map((item) => (
|
|
|
|
<CustomMenu.MenuItem
|
|
|
|
key={item.label}
|
|
|
|
onClick={(e) => {
|
|
|
|
e.stopPropagation();
|
2024-01-08 13:50:42 +00:00
|
|
|
e.preventDefault();
|
2023-07-19 09:14:04 +00:00
|
|
|
|
2023-10-17 09:57:38 +00:00
|
|
|
if (!item.value) {
|
|
|
|
setSelectedNotificationForSnooze(notification.id);
|
|
|
|
return;
|
|
|
|
}
|
2023-07-19 09:14:04 +00:00
|
|
|
|
2023-10-17 09:57:38 +00:00
|
|
|
markSnoozeNotification(notification.id, item.value).then(() => {
|
2024-02-09 10:52:08 +00:00
|
|
|
captureEvent(NOTIFICATION_SNOOZED, {
|
|
|
|
issue_id: notification.data.issue.id,
|
|
|
|
tab: selectedTab,
|
|
|
|
state: "SUCCESS",
|
|
|
|
});
|
2024-03-06 08:48:41 +00:00
|
|
|
setToast({
|
2024-01-02 09:15:51 +00:00
|
|
|
title: `Notification snoozed till ${renderFormattedDate(item.value)}`,
|
2024-03-06 08:48:41 +00:00
|
|
|
type: TOAST_TYPE.SUCCESS,
|
2023-07-19 09:14:04 +00:00
|
|
|
});
|
2023-10-17 09:57:38 +00:00
|
|
|
});
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{item.label}
|
|
|
|
</CustomMenu.MenuItem>
|
|
|
|
))}
|
|
|
|
</CustomMenu>
|
2023-07-19 09:14:04 +00:00
|
|
|
</Tooltip>
|
2023-07-18 06:37:55 +00:00
|
|
|
</div>
|
2024-01-08 13:50:42 +00:00
|
|
|
</Link>
|
2023-07-18 06:37:55 +00:00
|
|
|
);
|
|
|
|
};
|