Files
medusa-store/packages/admin/dashboard/src/hooks/use-view-configurations.tsx
2025-09-01 17:04:18 +00:00

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,
}
}