import React, { useEffect, useState } from "react" import { Button, Tooltip, DropdownMenu, usePrompt } from "@medusajs/ui" import { Eye, Plus, Trash, PencilSquare, Star, CheckCircleSolid, ArrowUturnLeft, } from "@medusajs/icons" import { useViewConfigurations, useViewConfiguration, } from "../../../hooks/use-view-configurations" import type { ViewConfiguration } from "../../../hooks/use-view-configurations" import { SaveViewDialog } from "../save-view-dialog" interface ViewSelectorProps { entity: string onViewChange?: (view: ViewConfiguration | null) => void currentColumns?: { visible: string[] order: string[] } } export const ViewSelector: React.FC = ({ entity, onViewChange, currentColumns, }) => { const { listViews, activeView, setActiveView } = useViewConfigurations(entity) const [saveDialogOpen, setSaveDialogOpen] = useState(false) const [editingView, setEditingView] = useState(null) const [deletingViewId, setDeletingViewId] = useState(null) const prompt = usePrompt() const views = (listViews as any).data?.view_configurations || [] const currentActiveView = (activeView as any).data?.view_configuration || null // Get delete mutation for the current deleting view const { deleteView } = useViewConfiguration(entity, deletingViewId || "") // Load views and active view useEffect(() => { if (activeView.isSuccess && onViewChange) { onViewChange(currentActiveView) } }, [activeView.isSuccess, currentActiveView, onViewChange]) const handleViewSelect = async (viewId: string) => { const view = views.find((v: ViewConfiguration) => v.id === viewId) if (view) { await setActiveView.mutateAsync(viewId) if (onViewChange) { onViewChange(view) } } } const handleDeleteView = async (view: ViewConfiguration) => { const result = await prompt({ title: "Delete view", description: `Are you sure you want to delete "${view.name}"? This action cannot be undone.`, confirmText: "Delete", cancelText: "Cancel", }) if (result) { setDeletingViewId(view.id) } } // Handle deletion when deletingViewId is set useEffect(() => { if (deletingViewId && deleteView.mutateAsync) { deleteView .mutateAsync() .then(() => { if (currentActiveView?.id === deletingViewId) { if (onViewChange) { onViewChange(null) } } setDeletingViewId(null) }) .catch(() => { setDeletingViewId(null) }) } }, [ deletingViewId, deleteView.mutateAsync, currentActiveView?.id, onViewChange, ]) const handleSaveView = () => { setSaveDialogOpen(true) setEditingView(null) } const handleEditView = (view: ViewConfiguration) => { setEditingView(view) setSaveDialogOpen(true) } const handleResetSystemDefault = async ( systemDefaultView: ViewConfiguration ) => { const result = await prompt({ title: "Reset system default", description: "This will delete the saved system default and revert to the original code-level defaults. All users will be affected. Are you sure?", confirmText: "Reset", cancelText: "Cancel", }) if (result) { setDeletingViewId(systemDefaultView.id) } } const systemDefaultView = views.find( (v: ViewConfiguration) => v.is_system_default ) const personalViews = views.filter( (v: ViewConfiguration) => !v.is_system_default ) return ( <>
{systemDefaultView && ( <> System Default handleViewSelect(systemDefaultView.id)} className="group justify-between" > {systemDefaultView.name || "System Default"}
{currentActiveView?.id === systemDefaultView.id && ( )}
{personalViews.length > 0 && } )} {personalViews.length > 0 && ( <> Personal Views {personalViews.map((view: ViewConfiguration) => ( handleViewSelect(view.id)} className="group justify-between" > {view.name}
{currentActiveView?.id === view.id && ( )}
))} )} Save current view
{saveDialogOpen && ( { setSaveDialogOpen(false) setEditingView(null) }} onSaved={(newView) => { setSaveDialogOpen(false) setEditingView(null) if (onViewChange) { onViewChange(newView) } }} /> )} ) }