/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ import { FlowModelRenderer, useFlowEngine, useFlowModelById } from '@nocobase/flow-engine'; import { useRequest } from 'ahooks'; import { Card, Skeleton, Spin } from 'antd'; import React, { useEffect, useMemo, useRef } from 'react'; import { useParams } from 'react-router-dom'; import { useKeepAlive } from '../route-switch'; import { SkeletonFallback } from './components/SkeletonFallback'; function InternalFlowPage({ uid, ...props }) { const model = useFlowModelById(uid); return ( } hideRemoveInSettings showFlowSettings={{ showBackground: false, showBorder: false }} {...props} /> ); } export const FlowRoute = () => { const layoutContentRef = useRef(null); const flowEngine = useFlowEngine(); const params = useParams(); // console.log('FlowRoute params:', params); // const { active } = useKeepAlive(); const model = useMemo(() => { return flowEngine.createModel({ uid: params.name, use: 'RouteModel', }); }, [params.name, flowEngine]); useEffect(() => { // if (!active) { // return; // } if (!layoutContentRef.current) { return; } model.setSharedContext({ layoutContentElement: layoutContentRef.current, }); model.dispatchEvent('click', { target: layoutContentRef.current, activeTab: params.tabUid }); }, [model, params.name, params.tabUid]); return
; }; export const FlowPage = (props) => { const { parentId, ...rest } = props; const flowEngine = useFlowEngine(); const { loading, data } = useRequest( async () => { const options = { async: true, parentId, subKey: 'page', subType: 'object', use: 'PageModel', subModels: { tabs: [ { use: 'PageTabModel', subModels: { grid: { async: true, use: 'BlockGridModel', }, }, }, ], }, }; const data = await flowEngine.loadOrCreateModel(options); return data; }, { refreshDeps: [parentId], }, ); if (loading || !data?.uid) { return ; } return ; }; export const RemoteFlowModelRenderer = (props) => { const { uid, parentId, ...rest } = props; const flowEngine = useFlowEngine(); const { loading, data } = useRequest( async () => { const data = await flowEngine.loadModel({ uid, parentId }); return data; }, { refreshDeps: [uid, parentId], }, ); if (loading || !data?.uid) { return ; } return ; };