import React, { FunctionComponent, Fragment, useState, useEffect } from 'react'; import { connect } from 'react-redux'; import classNames from 'classnames'; import { browserInfoConfig, BrowserInfoItem } from '../browserConfig'; import { TrackType } from '../track-panel/trackPanelConfig'; import { toggleBrowserNav, toggleGenomeSelector } from '../browserActions'; import { ChrLocation } from '../browserState'; import { getBrowserNavOpened, getChrLocation, getBrowserActivated, getDefaultChrLocation, getGenomeSelectorActive } from '../browserSelectors'; import { getDrawerOpened } from '../drawer/drawerSelectors'; import { getEnsObjectInfo } from 'src/ens-object/ensObjectSelectors'; import { getSelectedBrowserTab, getTrackPanelModalOpened, getTrackPanelOpened } from '../track-panel/trackPanelSelectors'; import { selectBrowserTab } from '../track-panel/trackPanelActions'; import { toggleDrawer } from '../drawer/drawerActions'; import { RootState } from 'src/store'; import BrowserReset from '../browser-reset/BrowserReset'; import BrowserGenomeSelector from '../browser-genome-selector/BrowserGenomeSelector'; import BrowserTabs from '../browser-tabs/BrowserTabs'; import styles from './BrowserBar.scss'; type StateProps = { browserActivated: boolean; browserNavOpened: boolean; chrLocation: ChrLocation; defaultChrLocation: ChrLocation; drawerOpened: boolean; genomeSelectorActive: boolean; ensObjectInfo: any; selectedBrowserTab: TrackType; trackPanelModalOpened: boolean; trackPanelOpened: boolean; }; type DispatchProps = { selectBrowserTab: (selectedBrowserTab: TrackType) => void; toggleBrowserNav: () => void; toggleDrawer: (drawerOpened: boolean) => void; toggleGenomeSelector: (genomeSelectorActive: boolean) => void; }; type OwnProps = { dispatchBrowserLocation: (chrLocation: ChrLocation) => void; }; type BrowserBarProps = StateProps & DispatchProps & OwnProps; type BrowserInfoProps = { ensObjectInfo: any; }; type BrowserNavigatorButtonProps = { toggleNavigator: () => void; navigator: BrowserInfoItem; icon: string; // TODO: use inline SVG }; export const BrowserBar: FunctionComponent = ( props: BrowserBarProps ) => { const shouldShowBrowserInfo = () => { const [, chrStart, chrEnd] = props.defaultChrLocation; const isLocationOfWholeChromosome = chrStart === 0 && chrEnd === 0; return !(props.genomeSelectorActive || isLocationOfWholeChromosome); }; const { navigator, reset } = browserInfoConfig; const [showBrowserInfo, toggleShowBrowserInfo] = useState( shouldShowBrowserInfo() ); const setBrowserInfoVisibility = () => { const shouldToggleVisibility = showBrowserInfo !== shouldShowBrowserInfo(); if (shouldToggleVisibility) { toggleShowBrowserInfo(!showBrowserInfo); } }; useEffect(() => { setBrowserInfoVisibility(); }, [props.defaultChrLocation, props.genomeSelectorActive]); const getBrowserNavIcon = () => { if (props.drawerOpened === true) { return navigator.icon.grey as string; } else if (props.browserNavOpened === true) { return navigator.icon.selected as string; } else { return navigator.icon.default; } }; const toggleNavigator = () => { if (props.drawerOpened === true) { return; } props.toggleBrowserNav(); }; const className = classNames(styles.browserInfo, { [styles.browserInfoExpanded]: !props.trackPanelOpened, [styles.browserInfoGreyed]: props.drawerOpened }); return (
{showBrowserInfo && ( )}
{!props.genomeSelectorActive && ( )}
{props.trackPanelOpened && ( )}
); }; export const BrowserInfo = ({ ensObjectInfo }: BrowserInfoProps) => (
{ensObjectInfo.obj_symbol}
{ensObjectInfo.stable_id}
{ensObjectInfo.spliced_length}
{ensObjectInfo.bio_type}
{ensObjectInfo.strand} strand
); export const BrowserNavigatorButton = (props: BrowserNavigatorButtonProps) => (
); const mapStateToProps = (state: RootState): StateProps => ({ browserActivated: getBrowserActivated(state), browserNavOpened: getBrowserNavOpened(state), chrLocation: getChrLocation(state), defaultChrLocation: getDefaultChrLocation(state), drawerOpened: getDrawerOpened(state), ensObjectInfo: getEnsObjectInfo(state), genomeSelectorActive: getGenomeSelectorActive(state), selectedBrowserTab: getSelectedBrowserTab(state), trackPanelModalOpened: getTrackPanelModalOpened(state), trackPanelOpened: getTrackPanelOpened(state) }); const mapDispatchToProps: DispatchProps = { selectBrowserTab, toggleBrowserNav, toggleDrawer, toggleGenomeSelector }; export default connect( mapStateToProps, mapDispatchToProps )(BrowserBar);