58 lines
1.6 KiB
TypeScript
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}</>
|
|
}
|