import React, { FunctionComponent, 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, getBrowserActiveGenomeId, getBrowserActiveEnsObject } from '../browserSelectors'; import { getDrawerOpened } from '../drawer/drawerSelectors'; import { getSelectedBrowserTab, getTrackPanelModalOpened, getTrackPanelOpened } from '../track-panel/trackPanelSelectors'; import { selectBrowserTabAndSave } from '../track-panel/trackPanelActions'; import { toggleDrawer } from '../drawer/drawerActions'; import { RootState } from 'src/store'; import { EnsObject } from 'src/ens-object/ensObjectTypes'; 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 = { activeGenomeId: string | null; browserActivated: boolean; browserNavOpened: boolean; chrLocation: ChrLocation | null; defaultChrLocation: ChrLocation | null; drawerOpened: boolean; genomeSelectorActive: boolean; ensObject: EnsObject | null; selectedBrowserTab: { [genomeId: string]: TrackType }; trackPanelModalOpened: boolean; trackPanelOpened: boolean; }; type DispatchProps = { selectBrowserTabAndSave: (selectedBrowserTab: TrackType) => void; toggleBrowserNav: () => void; toggleDrawer: (drawerOpened: boolean) => void; toggleGenomeSelector: (genomeSelectorActive: boolean) => void; }; type OwnProps = { dispatchBrowserLocation: (genomeId: string, chrLocation: ChrLocation) => void; }; type BrowserBarProps = StateProps & DispatchProps & OwnProps; type BrowserInfoProps = { ensObject: EnsObject; }; type BrowserNavigatorButtonProps = { toggleNavigator: () => void; navigator: BrowserInfoItem; icon: string; // TODO: use inline SVG }; export const BrowserBar: FunctionComponent = ( props: BrowserBarProps ) => { const shouldShowBrowserInfo = () => { const { defaultChrLocation } = props; const isLocationOfWholeChromosome = !defaultChrLocation; return !(props.genomeSelectorActive || isLocationOfWholeChromosome); }; const { navigator } = 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) { return navigator.icon.grey as string; } else if (props.browserNavOpened) { return navigator.icon.selected as string; } else { return navigator.icon.default; } }; const toggleNavigator = () => { if (props.drawerOpened) { return; } props.toggleBrowserNav(); }; const className = classNames(styles.browserInfo, { [styles.browserInfoExpanded]: !props.trackPanelOpened, [styles.browserInfoGreyed]: props.drawerOpened }); if (!(props.chrLocation && props.ensObject)) { return
; } return (
{showBrowserInfo && }
{!props.genomeSelectorActive && props.ensObject.genome_id && ( )}
{props.trackPanelOpened && props.activeGenomeId && ( )}
); }; export const BrowserInfo = ({ ensObject }: BrowserInfoProps) => { return ( <> {ensObject.object_type === 'gene' && ( <>
{ensObject.label}
{ensObject.stable_id}
{ensObject.spliced_length}
{ensObject.bio_type}
{ensObject.strand} strand
)} {ensObject.object_type === 'region' && ( <>
{`${ensObject.location.chromosome}:${ensObject.location.start}:${ensObject.location.end}`}
)} ); }; export const BrowserNavigatorButton = (props: BrowserNavigatorButtonProps) => (
); const mapStateToProps = (state: RootState): StateProps => ({ activeGenomeId: getBrowserActiveGenomeId(state), browserActivated: getBrowserActivated(state), browserNavOpened: getBrowserNavOpened(state), chrLocation: getChrLocation(state), defaultChrLocation: getDefaultChrLocation(state), drawerOpened: getDrawerOpened(state), ensObject: getBrowserActiveEnsObject(state), genomeSelectorActive: getGenomeSelectorActive(state), selectedBrowserTab: getSelectedBrowserTab(state), trackPanelModalOpened: getTrackPanelModalOpened(state), trackPanelOpened: getTrackPanelOpened(state) }); const mapDispatchToProps: DispatchProps = { selectBrowserTabAndSave, toggleBrowserNav, toggleDrawer, toggleGenomeSelector }; export default connect( mapStateToProps, mapDispatchToProps )(BrowserBar);