forked from github/plane
9275e6f373
* fix: onboarding invitations overflow (#1575)
* fix: onboarding invitations overflow
* fix: user avatar in the notification card
* style: update graph grid color
* fix: no 'Create by me' label coming up (#1573)
* feat: added new issue subscriber table
* dev: notification model
* feat: added CRUD operation for issue subscriber
* Revert "feat: added CRUD operation for issue subscriber"
This reverts commit b22e062576
.
* feat: added CRUD operation for issue subscriber
* dev: notification models and operations
* dev: remove delete endpoint response data
* dev: notification endpoints and fix bg worker for saving notifications
* feat: added list and unsubscribe function in issue subscriber
* dev: filter by snoozed and response update for list and permissions
* dev: update issue notifications
* dev: notification segregation
* dev: update notifications
* dev: notification filtering
* dev: add issue name in notifications
* dev: notification new endpoints
* fix: pushing local settings
* feat: notification workflow setup and made basic UI
* style: improved UX with toast alerts and other interactions
refactor: changed classnames according to new theme structure, changed all icons to material icons
* feat: showing un-read notification count
* feat: not showing 'subscribe' button on issue created by user & assigned to user
not showing 'Create by you' for view & guest of the workspace
* fix: 'read' -> 'unread' heading, my issue wrong filter
* feat: made snooze dropdown & modal
feat: switched to calendar
* fix: minor ui fixes
* feat: snooze modal date/time select
* fix: params for read/un-read notification
* style: snooze notification modal
* fix: no label for 'Create by me'
* fix: no label for 'Create by me'
* fix: removed console log
* fix: tooltip going behind popover
---------
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
* style: tooltip on notification header actions (#1577)
* style: tooltip on notification header
* chore: update tooltip content
---------
Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
* fix: user migrations for back population (#1578)
* fix: total notifications count (#1579)
* fix: notification card (#1583)
* feat: add new icons package (#1586)
* feat: add material icons package
* chore: replace issue view icons
* chore: notification ordering (#1584)
* fix: uuid error when cycle and module updates (#1585)
* refactor: height of popover & api fetch call (#1587)
* fix: snooze dropdown overflow (#1588)
---------
Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com>
Co-authored-by: NarayanBavisetti <narayan3119@gmail.com>
Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
Co-authored-by: Nikhil <118773738+pablohashescobar@users.noreply.github.com>
194 lines
5.6 KiB
TypeScript
194 lines
5.6 KiB
TypeScript
import { useState } from "react";
|
|
|
|
import { useRouter } from "next/router";
|
|
|
|
// swr
|
|
import useSWR from "swr";
|
|
|
|
// services
|
|
import userNotificationServices from "services/notifications.service";
|
|
|
|
// fetch-keys
|
|
import { UNREAD_NOTIFICATIONS_COUNT, USER_WORKSPACE_NOTIFICATIONS } from "constants/fetch-keys";
|
|
|
|
// type
|
|
import type { NotificationType } from "types";
|
|
|
|
const useUserNotification = () => {
|
|
const router = useRouter();
|
|
const { workspaceSlug } = router.query;
|
|
|
|
const [snoozed, setSnoozed] = useState<boolean>(false);
|
|
const [archived, setArchived] = useState<boolean>(false);
|
|
const [readNotification, setReadNotification] = useState<boolean>(false);
|
|
const [selectedNotificationForSnooze, setSelectedNotificationForSnooze] = useState<string | null>(
|
|
null
|
|
);
|
|
const [selectedTab, setSelectedTab] = useState<NotificationType>("assigned");
|
|
|
|
const params = {
|
|
type: snoozed || archived || readNotification ? undefined : selectedTab,
|
|
snoozed,
|
|
archived,
|
|
read: !readNotification ? undefined : false,
|
|
};
|
|
|
|
const { data: notifications, mutate: notificationsMutate } = useSWR(
|
|
workspaceSlug ? USER_WORKSPACE_NOTIFICATIONS(workspaceSlug.toString(), params) : null,
|
|
workspaceSlug
|
|
? () => userNotificationServices.getUserNotifications(workspaceSlug.toString(), params)
|
|
: null
|
|
);
|
|
|
|
const { data: notificationCount, mutate: mutateNotificationCount } = useSWR(
|
|
workspaceSlug ? UNREAD_NOTIFICATIONS_COUNT(workspaceSlug.toString()) : null,
|
|
() =>
|
|
workspaceSlug
|
|
? userNotificationServices.getUnreadNotificationsCount(workspaceSlug.toString())
|
|
: null
|
|
);
|
|
|
|
const markNotificationReadStatus = async (notificationId: string) => {
|
|
if (!workspaceSlug) return;
|
|
const isRead =
|
|
notifications?.find((notification) => notification.id === notificationId)?.read_at !== null;
|
|
|
|
if (isRead) {
|
|
notificationsMutate(
|
|
(prev) =>
|
|
prev?.map((prevNotification) => {
|
|
if (prevNotification.id === notificationId) {
|
|
return {
|
|
...prevNotification,
|
|
read_at: null,
|
|
};
|
|
}
|
|
return prevNotification;
|
|
}),
|
|
false
|
|
);
|
|
await userNotificationServices
|
|
.markUserNotificationAsUnread(workspaceSlug.toString(), notificationId)
|
|
.catch(() => {
|
|
throw new Error("Something went wrong");
|
|
})
|
|
.finally(() => {
|
|
notificationsMutate();
|
|
});
|
|
} else {
|
|
notificationsMutate(
|
|
(prev) =>
|
|
prev?.map((prevNotification) => {
|
|
if (prevNotification.id === notificationId) {
|
|
return {
|
|
...prevNotification,
|
|
read_at: new Date(),
|
|
};
|
|
}
|
|
return prevNotification;
|
|
}),
|
|
false
|
|
);
|
|
await userNotificationServices
|
|
.markUserNotificationAsRead(workspaceSlug.toString(), notificationId)
|
|
.catch(() => {
|
|
throw new Error("Something went wrong");
|
|
})
|
|
.finally(() => {
|
|
notificationsMutate();
|
|
});
|
|
}
|
|
};
|
|
|
|
const markNotificationArchivedStatus = async (notificationId: string) => {
|
|
if (!workspaceSlug) return;
|
|
const isArchived =
|
|
notifications?.find((notification) => notification.id === notificationId)?.archived_at !==
|
|
null;
|
|
|
|
if (isArchived) {
|
|
await userNotificationServices
|
|
.markUserNotificationAsUnarchived(workspaceSlug.toString(), notificationId)
|
|
.catch(() => {
|
|
throw new Error("Something went wrong");
|
|
})
|
|
.finally(() => {
|
|
notificationsMutate();
|
|
});
|
|
} else {
|
|
notificationsMutate(
|
|
(prev) => prev?.filter((prevNotification) => prevNotification.id !== notificationId),
|
|
false
|
|
);
|
|
await userNotificationServices
|
|
.markUserNotificationAsArchived(workspaceSlug.toString(), notificationId)
|
|
.catch(() => {
|
|
throw new Error("Something went wrong");
|
|
})
|
|
.finally(() => {
|
|
notificationsMutate();
|
|
});
|
|
}
|
|
};
|
|
|
|
const markSnoozeNotification = async (notificationId: string, dateTime?: Date) => {
|
|
if (!workspaceSlug) return;
|
|
|
|
const isSnoozed =
|
|
notifications?.find((notification) => notification.id === notificationId)?.snoozed_till !==
|
|
null;
|
|
|
|
if (isSnoozed) {
|
|
await userNotificationServices
|
|
.patchUserNotification(workspaceSlug.toString(), notificationId, {
|
|
snoozed_till: null,
|
|
})
|
|
.finally(() => {
|
|
notificationsMutate();
|
|
});
|
|
} else {
|
|
notificationsMutate(
|
|
(prevData) => prevData?.filter((prev) => prev.id !== notificationId) || [],
|
|
false
|
|
);
|
|
await userNotificationServices
|
|
.patchUserNotification(workspaceSlug.toString(), notificationId, {
|
|
snoozed_till: dateTime,
|
|
})
|
|
.catch(() => {
|
|
new Error("Something went wrong");
|
|
})
|
|
.finally(() => {
|
|
notificationsMutate();
|
|
});
|
|
}
|
|
};
|
|
|
|
return {
|
|
notifications,
|
|
notificationsMutate,
|
|
markNotificationReadStatus,
|
|
markNotificationArchivedStatus,
|
|
markSnoozeNotification,
|
|
snoozed,
|
|
setSnoozed,
|
|
archived,
|
|
setArchived,
|
|
readNotification,
|
|
setReadNotification,
|
|
selectedNotificationForSnooze,
|
|
setSelectedNotificationForSnooze,
|
|
selectedTab,
|
|
setSelectedTab,
|
|
totalNotificationCount: notificationCount
|
|
? notificationCount.created_issues +
|
|
notificationCount.watching_issues +
|
|
notificationCount.my_issues
|
|
: null,
|
|
notificationCount,
|
|
mutateNotificationCount,
|
|
};
|
|
};
|
|
|
|
export default useUserNotification;
|