/** * Copyright (c) 2020-present, Goldman Sachs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { useEffect } from 'react'; import { observer } from 'mobx-react-lite'; import { EntityDiffViewState } from '../../../stores/editor/editor-state/entity-diff-editor-state/EntityDiffViewState.js'; import { EntityDiffSideBarItem } from '../editor-group/diff-editor/EntityDiffView.js'; import { clsx, PanelLoadingIndicator, ResizablePanel, ResizablePanelGroup, ResizablePanelSplitter, ResizablePanelSplitterLine, CloudDownloadIcon, RefreshIcon, InfoCircleIcon, PanelContent, } from '@finos/legend-art'; import { EntityChangeConflictSideBarItem } from '../editor-group/diff-editor/EntityChangeConflictEditor.js'; import { EntityChangeConflictEditorState } from '../../../stores/editor/editor-state/entity-diff-editor-state/EntityChangeConflictEditorState.js'; import { generateReviewRoute } from '../../../__lib__/LegendStudioNavigation.js'; import { LEGEND_STUDIO_TEST_ID } from '../../../__lib__/LegendStudioTesting.js'; import { flowResult } from 'mobx'; import type { EntityChangeConflict, EntityDiff, } from '@finos/legend-server-sdlc'; import { entityDiffSorter } from '../../../stores/editor/EditorSDLCState.js'; import { useEditorStore } from '../EditorStoreProvider.js'; import { useLegendStudioApplicationStore } from '../../LegendStudioFrameworkProvider.js'; export const WorkspaceUpdater = observer(() => { const editorStore = useEditorStore(); const applicationStore = useLegendStudioApplicationStore(); const sdlcState = editorStore.sdlcState; const currentTabState = editorStore.tabManagerState.currentTab; const workspaceUpdaterState = editorStore.workspaceUpdaterState; // Actions const updateWorkspace = (): void => { editorStore.localChangesState.alertUnsavedChanges((): void => { flowResult(workspaceUpdaterState.updateWorkspace()).catch( applicationStore.alertUnhandledError, ); }); }; const refreshWorkspaceUpdater = applicationStore.guardUnhandledError(() => flowResult(workspaceUpdaterState.refreshWorkspaceUpdater()), ); const isDispatchingAction = workspaceUpdaterState.isUpdatingWorkspace || sdlcState.isCheckingIfWorkspaceIsOutdated || workspaceUpdaterState.isRefreshingWorkspaceUpdater; // Conflicts const conflicts = editorStore.changeDetectionState.potentialWorkspaceUpdateConflicts; const isSelectedConflict = (conflict: EntityChangeConflict): boolean => currentTabState instanceof EntityChangeConflictEditorState && conflict.entityPath === currentTabState.entityPath; const openPotentialConflict = (conflict: EntityChangeConflict): (() => void) => (): void => workspaceUpdaterState.openPotentialWorkspaceUpdateConflict(conflict); // Changes const changes = editorStore.changeDetectionState.aggregatedProjectLatestChanges; const changesWithoutConflicts = changes.filter( (change) => !conflicts .map((conflict) => conflict.entityPath) .includes(change.entityPath), ); const isSelectedDiff = (diff: EntityDiff): boolean => currentTabState instanceof EntityDiffViewState && diff.oldPath === currentTabState.fromEntityPath && diff.newPath === currentTabState.toEntityPath; const openChange = (diff: EntityDiff): (() => void) => (): void => workspaceUpdaterState.openProjectLatestChange(diff); // Committed Reviews const commitedReviews = workspaceUpdaterState.committedReviewsBetweenWorkspaceBaseAndProjectLatest; // since the project latest changes can be affected by other users, we refresh it more proactively useEffect(() => { flowResult(workspaceUpdaterState.refreshWorkspaceUpdater()).catch( applicationStore.alertUnhandledError, ); }, [applicationStore, workspaceUpdaterState]); return (