kontenhumas-fe/components/modals/WorkflowModalProvider.tsx

125 lines
3.9 KiB
TypeScript
Raw Normal View History

2025-10-02 05:04:42 +00:00
"use client";
2025-10-02 06:41:49 +00:00
import React, { createContext, useContext, useState, ReactNode, useEffect, useCallback } from "react";
2025-10-02 05:04:42 +00:00
import WorkflowSetupModal from "./WorkflowSetupModal";
2025-10-02 06:41:49 +00:00
import { getInfoProfile } from "@/service/auth";
import { usePathname } from "next/navigation";
2025-10-02 05:04:42 +00:00
interface WorkflowInfo {
hasWorkflowSetup: boolean;
defaultWorkflowId?: number;
defaultWorkflowName?: string;
requiresApproval?: boolean;
autoPublishArticles?: boolean;
isApprovalActive?: boolean;
}
interface WorkflowModalContextType {
showWorkflowModal: (workflowInfo: WorkflowInfo) => void;
hideWorkflowModal: () => void;
2025-10-02 06:41:49 +00:00
refreshWorkflowStatus: () => Promise<void>;
2025-10-02 05:04:42 +00:00
}
const WorkflowModalContext = createContext<WorkflowModalContextType | undefined>(undefined);
export function useWorkflowModal() {
const context = useContext(WorkflowModalContext);
if (context === undefined) {
throw new Error('useWorkflowModal must be used within a WorkflowModalProvider');
}
return context;
}
interface WorkflowModalProviderProps {
children: ReactNode;
}
export function WorkflowModalProvider({ children }: WorkflowModalProviderProps) {
const [isModalOpen, setIsModalOpen] = useState(false);
const [workflowInfo, setWorkflowInfo] = useState<WorkflowInfo | undefined>(undefined);
2025-10-02 06:41:49 +00:00
const pathname = usePathname();
// Force hide modal when on tenant settings page
const forceHideModal = useCallback(() => {
console.log("Force hiding modal");
setIsModalOpen(false);
setWorkflowInfo(undefined);
}, []);
const refreshWorkflowStatus = async () => {
try {
const response = await getInfoProfile();
if (response?.data?.data && response?.data?.data?.approvalWorkflowInfo) {
const workflowInfo = response.data.data.approvalWorkflowInfo;
// Update workflow info
setWorkflowInfo(workflowInfo);
// If workflow is now setup, allow closing modal
if (workflowInfo.hasWorkflowSetup) {
console.log("Workflow is now setup, modal can be closed");
}
}
} catch (error) {
console.error("Error refreshing workflow status:", error);
}
};
// Auto-hide modal when user is on tenant settings page
useEffect(() => {
console.log("Current pathname:", pathname);
// Add small delay to ensure pathname is fully updated
const timeoutId = setTimeout(() => {
if (pathname?.includes('/admin/settings/tenant') || pathname?.includes('/tenant')) {
console.log("User is on tenant settings page, hiding modal");
forceHideModal();
}
}, 100); // Small delay to ensure pathname is updated
return () => clearTimeout(timeoutId);
}, [pathname, forceHideModal]);
// Auto-refresh workflow status when modal is open and user is not on tenant settings page
useEffect(() => {
let interval: NodeJS.Timeout;
if (isModalOpen && !pathname?.includes('/admin/settings/tenant') && !pathname?.includes('/tenant')) {
console.log("Starting auto-refresh for workflow status");
interval = setInterval(async () => {
await refreshWorkflowStatus();
}, 5000); // Refresh every 5 seconds
}
return () => {
if (interval) {
clearInterval(interval);
}
};
}, [isModalOpen, pathname, refreshWorkflowStatus]);
2025-10-02 05:04:42 +00:00
const showWorkflowModal = (info: WorkflowInfo) => {
2025-10-02 06:41:49 +00:00
console.log("Show workflow modal: ", info);
2025-10-02 05:04:42 +00:00
setWorkflowInfo(info);
setIsModalOpen(true);
};
const hideWorkflowModal = () => {
2025-10-02 06:41:49 +00:00
console.log("Hide workflow modal");
2025-10-02 05:04:42 +00:00
setIsModalOpen(false);
setWorkflowInfo(undefined);
};
return (
2025-10-02 06:41:49 +00:00
<WorkflowModalContext.Provider value={{ showWorkflowModal, hideWorkflowModal, refreshWorkflowStatus }}>
2025-10-02 05:04:42 +00:00
{children}
2026-03-03 09:26:11 +00:00
<WorkflowSetupModal
2025-10-02 05:04:42 +00:00
isOpen={isModalOpen}
onClose={hideWorkflowModal}
workflowInfo={workflowInfo}
2025-10-02 06:41:49 +00:00
onRefresh={refreshWorkflowStatus}
2026-03-03 09:26:11 +00:00
/>
2025-10-02 05:04:42 +00:00
</WorkflowModalContext.Provider>
);
}