Files
medusa-store/packages/admin-ui/ui/src/providers/import-refresh.tsx

58 lines
1.6 KiB
TypeScript

import React, { PropsWithChildren, useEffect } from "react"
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
*/
export const ImportRefresh = ({ children }: PropsWithChildren) => {
const { batchJobs } = usePolling()
const notification = useNotification()
useEffect(() => {
if (!batchJobs) {
return
}
const productListQuery = Object.entries(
queryClient.getQueryCache().queriesMap
).find(([k, v]) => k.includes("admin_products"))?.[1]
if (productListQuery) {
const refreshedTimestamp = productListQuery.state.dataUpdatedAt
const completedJobs = batchJobs.filter(
(job) => job.status === "completed"
)
for (const job of completedJobs) {
const jobCompletedTimestamp = new Date(job.completed_at).getTime()
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)
}
}
}
}, [batchJobs])
return <>{children}</>
}