import React from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import upperFirst from 'lodash/upperFirst';
import { RootState } from 'src/store';
import { EnsObject } from 'src/shared/state/ens-object/ensObjectTypes';
import { getBrowserActiveGenomeId } from '../../../browserSelectors';
import { updateTrackStatesAndSave } from 'src/content/app/browser/browserActions';
import { BrowserTrackStates } from 'src/content/app/browser/track-panel/trackPanelConfig';
import { getActiveGenomePreviouslyViewedObjects } from 'src/content/app/browser/track-panel/trackPanelSelectors';
import { fetchExampleEnsObjects } from 'src/shared/state/ens-object/ensObjectActions';
import { getExampleEnsObjects } from 'src/shared/state/ens-object/ensObjectSelectors';
import * as urlFor from 'src/shared/helpers/urlHelper';
import { closeTrackPanelModal } from '../../trackPanelActions';
import ImageButton from 'src/shared/components/image-button/ImageButton';
import { ReactComponent as EllipsisIcon } from 'static/img/track-panel/ellipsis.svg';
import { changeDrawerViewAndOpen } from 'src/content/app/browser/drawer/drawerActions';
import { PreviouslyViewedObject } from 'src/content/app/browser/track-panel/trackPanelState';
import analyticsTracking from 'src/services/analytics-service';
import { Status } from 'src/shared/types/status';
import styles from './TrackPanelBookmarks.scss';
export type TrackPanelBookmarksProps = {
activeGenomeId: string | null;
exampleEnsObjects: EnsObject[];
previouslyViewedObjects: PreviouslyViewedObject[];
fetchExampleEnsObjects: (objectId: string) => void;
updateTrackStatesAndSave: (trackStates: BrowserTrackStates) => void;
closeTrackPanelModal: () => void;
changeDrawerViewAndOpen: (drawerView: string) => void;
};
type ExampleLinksProps = Pick<
TrackPanelBookmarksProps,
'exampleEnsObjects' | 'activeGenomeId' | 'closeTrackPanelModal'
>;
export const ExampleLinks = (props: ExampleLinksProps) => {
return (
{props.exampleEnsObjects.map((exampleObject) => {
const path = urlFor.browser({
genomeId: props.activeGenomeId,
focus: exampleObject.object_id
});
return (
{exampleObject.label}
{upperFirst(exampleObject.object_type)}
);
})}
);
};
type PreviouslyViewedLinksProps = Pick<
TrackPanelBookmarksProps,
| 'previouslyViewedObjects'
| 'updateTrackStatesAndSave'
| 'closeTrackPanelModal'
>;
export const PreviouslyViewedLinks = (props: PreviouslyViewedLinksProps) => {
const onLinkClick = (objectType: string, index: number) => {
analyticsTracking.trackEvent({
category: 'recent_bookmark_link',
label: objectType,
action: 'clicked',
value: index + 1
});
props.closeTrackPanelModal();
};
return (
{[...props.previouslyViewedObjects]
.reverse()
.map((previouslyViewedObject, index) => {
const path = urlFor.browser({
genomeId: previouslyViewedObject.genome_id,
focus: previouslyViewedObject.object_id
});
return (
onLinkClick(previouslyViewedObject.object_type, index)
}
>
{previouslyViewedObject.label}
{upperFirst(previouslyViewedObject.object_type)}
);
})}
);
};
export const TrackPanelBookmarks = (props: TrackPanelBookmarksProps) => {
const {
previouslyViewedObjects,
exampleEnsObjects,
activeGenomeId,
updateTrackStatesAndSave,
closeTrackPanelModal
} = props;
const limitedPreviouslyViewedObjects = previouslyViewedObjects.slice(-20);
const onEllipsisClick = () => {
analyticsTracking.trackEvent({
category: 'drawer_open',
label: 'recent_bookmarks',
action: 'clicked',
value: previouslyViewedObjects.length
});
props.changeDrawerViewAndOpen('bookmarks');
};
return (
Bookmarks
{exampleEnsObjects.length ? (
<>
Example links
>
) : null}
{limitedPreviouslyViewedObjects.length ? (
<>
Previously viewed
{props.previouslyViewedObjects.length > 20 && (
)}
>
) : null}
);
};
const mapStateToProps = (state: RootState) => ({
activeGenomeId: getBrowserActiveGenomeId(state),
exampleEnsObjects: getExampleEnsObjects(state),
previouslyViewedObjects: getActiveGenomePreviouslyViewedObjects(state)
});
const mapDispatchToProps = {
fetchExampleEnsObjects,
updateTrackStatesAndSave,
closeTrackPanelModal,
changeDrawerViewAndOpen
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(TrackPanelBookmarks);