diff --git a/.changeset/hot-tools-breathe.md b/.changeset/hot-tools-breathe.md new file mode 100644 index 0000000000..8ee18d3484 --- /dev/null +++ b/.changeset/hot-tools-breathe.md @@ -0,0 +1,5 @@ +--- +"@medusajs/admin-ui": patch +--- + +feat(admin-ui): batch job completed notification diff --git a/packages/admin-ui/ui/src/providers/import-refresh.tsx b/packages/admin-ui/ui/src/providers/import-refresh.tsx index 8d57705aa4..2263194535 100644 --- a/packages/admin-ui/ui/src/providers/import-refresh.tsx +++ b/packages/admin-ui/ui/src/providers/import-refresh.tsx @@ -4,6 +4,9 @@ import { adminProductKeys } from "medusa-react" import { usePolling } from "./polling-provider" import { queryClient } from "../constants/query-client" import useNotification from "../hooks/use-notification" +import { capitalize } from "lodash" + +let lastDisplayedNotificationAt = Date.now() /** * Provider for refreshing product/pricing lists after batch jobs are complete @@ -25,14 +28,26 @@ export const ImportRefresh = ({ children }: PropsWithChildren) => { const refreshedTimestamp = productListQuery.state.dataUpdatedAt const completedJobs = batchJobs.filter( - (job) => job.status === "completed" && job.type === "product-import" + (job) => job.status === "completed" ) for (const job of completedJobs) { const jobCompletedTimestamp = new Date(job.completed_at).getTime() - if (jobCompletedTimestamp > refreshedTimestamp) { + + if (jobCompletedTimestamp > lastDisplayedNotificationAt) { + notification( + "Success", + capitalize(`${job.type.split("-").join(" ")} batch job completed`), + "success" + ) + lastDisplayedNotificationAt = Date.now() + } + + if ( + job.type === "product-import" && + jobCompletedTimestamp > refreshedTimestamp + ) { queryClient.invalidateQueries(adminProductKeys.all) - notification("Success", "Product import completed", "success") } } }