Skip to content

Commit

Permalink
chore: extract useQueryWidgetSidePanel
Browse files Browse the repository at this point in the history
  • Loading branch information
ma-efremoff committed Dec 14, 2023
1 parent 648370a commit fc77a27
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -1,51 +1,36 @@
import React, {ReactElement, useCallback, useState} from 'react';
import React from 'react';
import {useDispatch, useSelector} from 'react-redux';
import cn from 'bem-cn-lite';
import {Button, Loader} from '@gravity-ui/uikit';
import {Button} from '@gravity-ui/uikit';
import {QueryEngine} from '../../../../query-tracker/module/engines';
import {getPath} from '../../../../../store/selectors/navigation';
import {getCluster} from '../../../../../store/selectors/global';
import type {QueryWidgetProps} from '../../../../query-tracker/QueryWidget';
import withLazyLoading from '../../../../../hocs/withLazyLoading';
import {createQueryFromTablePath} from '../../../../query-tracker/module/query/actions';
import Icon from '../../../../../components/Icon/Icon';
import {createNewQueryUrl} from '../../../../query-tracker/utils/navigation';
import withSplit from '../../../../../hocs/withSplit';
import {mergeScreen, splitScreen} from '../../../../../store/actions/global';
import {SPLIT_TYPE} from '../../../../../constants/components/nodes/nodes';
import {useQueryWidgetSidePanel} from '../../../../query-tracker/QueryWidget/side-panel';
import './CreateQueryFromTable.scss';

const b = cn('create-query-btn');

const QueryWidgetLazy = React.lazy(() => import('../../../../query-tracker/QueryWidget'));

export const QueryWidgetPortal = withSplit(
withLazyLoading<QueryWidgetProps>(QueryWidgetLazy, <Loader className={b('loader')} />),
) as unknown as ReactElement<QueryWidgetProps>;

export function CreateQueryFromTable({className}: {className: string}) {
const [widgetOpened, setWidgetOpened] = useState(false);
const {openWidget, widgetOpened, widgetContent} = useQueryWidgetSidePanel();

const dispatch = useDispatch();

const cluster = useSelector(getCluster);
const path = useSelector(getPath);

const openWidget = useCallback(() => {
const handleOpen = React.useCallback(() => {
dispatch(createQueryFromTablePath(QueryEngine.YQL, cluster, path));
dispatch(splitScreen(SPLIT_TYPE));
setWidgetOpened(true);
}, [setWidgetOpened, dispatch, path, cluster]);

const onClose = useCallback(() => {
setWidgetOpened(false);
dispatch(mergeScreen());
}, [setWidgetOpened, dispatch]);
openWidget();
}, [path, cluster, openWidget, dispatch]);

return (
<>
<div className={b(null, className)}>
<Button
onClick={openWidget}
onClick={handleOpen}
pin="round-clear"
view="action"
className={b('btn')}
Expand All @@ -65,10 +50,7 @@ export function CreateQueryFromTable({className}: {className: string}) {
<Icon awesome="table" />
</Button>
</div>
{widgetOpened && (
// @ts-ignore
<QueryWidgetPortal onClose={onClose} />
)}
{widgetContent}
</>
);
}
37 changes: 37 additions & 0 deletions packages/ui/src/ui/pages/query-tracker/QueryWidget/side-panel.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import React from 'react';
import {useDispatch} from 'react-redux';

import withSplit from '../../../hocs/withSplit';
import withLazyLoading from '../../../hocs/withLazyLoading';
import type {QueryWidgetProps} from './index';
import {mergeScreen, splitScreen} from '../../../store/actions/global';
import {SPLIT_TYPE} from '../../../constants/components/nodes/nodes';
import Loader from '../../../components/Loader/Loader';

export const QueryWidgetLazy = React.lazy(() => import('./index'));

export const QueryWidgetPortal = withSplit(
withLazyLoading<QueryWidgetProps>(QueryWidgetLazy, <Loader />),
);

export function useQueryWidgetSidePanel() {
const [widgetOpened, setWidgetOpened] = React.useState(false);
const dispatch = useDispatch();

const openWidget = React.useCallback(() => {
dispatch(splitScreen(SPLIT_TYPE));
setWidgetOpened(true);
}, [setWidgetOpened, dispatch]);

const onClose = React.useCallback(() => {
setWidgetOpened(false);
dispatch(mergeScreen());
}, [setWidgetOpened, dispatch]);

return {
closeWidget: onClose,
openWidget,
widgetOpened,
widgetContent: widgetOpened ? <QueryWidgetPortal onClose={onClose} /> : null,
};
}

0 comments on commit fc77a27

Please sign in to comment.