1.7 KB69 lines
Blame
1/**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8import type {ComparisonMode} from './atoms';
9
10import {Icon} from 'isl-components/Icon';
11import {useAtomValue} from 'jotai';
12import {lazy, Suspense} from 'react';
13import {ComparisonType} from 'shared/Comparison';
14import {useCommand} from '../ISLShortcuts';
15import {Modal} from '../Modal';
16import {currentComparisonMode, dismissComparison, showComparison} from './atoms';
17
18import './ComparisonView.css';
19
20const ComparisonView = lazy(() => import('./ComparisonView'));
21
22function useComparisonView(): ComparisonMode {
23 const mode = useAtomValue(currentComparisonMode);
24
25 useCommand('Escape', () => {
26 dismissComparison();
27 });
28 useCommand('OpenUncommittedChangesComparisonView', () => {
29 showComparison({type: ComparisonType.UncommittedChanges});
30 });
31 useCommand('OpenHeadChangesComparisonView', () => {
32 showComparison({type: ComparisonType.HeadChanges});
33 });
34
35 return mode;
36}
37
38export function ComparisonViewModal() {
39 const mode = useComparisonView();
40
41 if (!mode.visible) {
42 return null;
43 }
44
45 return (
46 <Modal className="comparison-view-modal" height="" width="">
47 <Suspense fallback={<Icon icon="loading" />}>
48 <ComparisonView comparison={mode.comparison} dismiss={dismissComparison} />
49 </Suspense>
50 </Modal>
51 );
52}
53
54export function ComparisonViewApp() {
55 const mode = useComparisonView();
56
57 if (!mode.visible) {
58 return null;
59 }
60
61 return (
62 <div className="comparison-view-root">
63 <Suspense fallback={<Icon icon="loading" />}>
64 <ComparisonView comparison={mode.comparison} />
65 </Suspense>
66 </div>
67 );
68}
69