Adds support for configurable order views. https://github.com/user-attachments/assets/ed4a5f61-1667-4ed7-9478-423894f3eba6
103 lines
2.7 KiB
TypeScript
103 lines
2.7 KiB
TypeScript
import { useMemo } from "react"
|
|
import { toast } from "@medusajs/ui"
|
|
import { FetchError } from "@medusajs/js-sdk"
|
|
import { useFeatureFlag } from "../providers/feature-flag-provider"
|
|
import {
|
|
useViewConfigurations as useViewConfigurationsBase,
|
|
useActiveViewConfiguration as useActiveViewConfigurationBase,
|
|
useCreateViewConfiguration as useCreateViewConfigurationBase,
|
|
useUpdateViewConfiguration as useUpdateViewConfigurationBase,
|
|
useDeleteViewConfiguration as useDeleteViewConfigurationBase,
|
|
useSetActiveViewConfiguration as useSetActiveViewConfigurationBase,
|
|
} from "./api/views"
|
|
|
|
// Common error handler
|
|
const handleError = (error: Error, message?: string) => {
|
|
let errorMessage = message
|
|
if (!errorMessage) {
|
|
if (error instanceof FetchError) {
|
|
errorMessage = error.message
|
|
} else if (error.message) {
|
|
errorMessage = error.message
|
|
} else {
|
|
errorMessage = "An error occurred"
|
|
}
|
|
}
|
|
|
|
toast.error(errorMessage)
|
|
}
|
|
|
|
export const useViewConfigurations = (entity: string) => {
|
|
const isViewConfigEnabled = useFeatureFlag("view_configurations")
|
|
|
|
// List views
|
|
const listViews = useViewConfigurationsBase(entity, { limit: 100 }, {
|
|
enabled: isViewConfigEnabled && !!entity,
|
|
})
|
|
|
|
// Active view
|
|
const activeView = useActiveViewConfigurationBase(entity, {
|
|
enabled: isViewConfigEnabled && !!entity,
|
|
})
|
|
|
|
// Create view mutation
|
|
const createView = useCreateViewConfigurationBase(entity, {
|
|
onSuccess: () => {
|
|
toast.success(`View created`)
|
|
},
|
|
onError: (error) => {
|
|
handleError(error, "Failed to create view")
|
|
},
|
|
})
|
|
|
|
// Set active view mutation
|
|
const setActiveView = useSetActiveViewConfigurationBase(entity, {
|
|
onSuccess: () => {
|
|
},
|
|
onError: (error) => {
|
|
handleError(error, "Failed to update active view")
|
|
},
|
|
})
|
|
|
|
return useMemo(() => ({
|
|
isViewConfigEnabled,
|
|
listViews,
|
|
activeView,
|
|
createView,
|
|
setActiveView,
|
|
isDefaultViewActive: activeView?.is_default_active ?? true,
|
|
}), [
|
|
isViewConfigEnabled,
|
|
listViews,
|
|
activeView,
|
|
createView,
|
|
setActiveView,
|
|
])
|
|
}
|
|
|
|
// Hook for update/delete operations on a specific view
|
|
export const useViewConfiguration = (entity: string, viewId: string) => {
|
|
const updateView = useUpdateViewConfigurationBase(entity, viewId, {
|
|
onSuccess: () => {
|
|
toast.success(`View updated`)
|
|
},
|
|
onError: (error) => {
|
|
handleError(error, "Failed to update view")
|
|
},
|
|
})
|
|
|
|
const deleteView = useDeleteViewConfigurationBase(entity, viewId, {
|
|
onSuccess: () => {
|
|
toast.success("View deleted successfully")
|
|
},
|
|
onError: (error) => {
|
|
handleError(error, "Failed to delete view")
|
|
},
|
|
})
|
|
|
|
return {
|
|
updateView,
|
|
deleteView,
|
|
}
|
|
}
|