import React, { ErrorInfo, ReactElement, useEffect } from 'react' import clsx from 'clsx' import Drawer from '@material-ui/core/Drawer' import AppBar from '@material-ui/core/AppBar' import Toolbar from '@material-ui/core/Toolbar' import List from '@material-ui/core/List' import IconButton from '@material-ui/core/IconButton' import { useStyles } from './style' import { MapsList } from './maps-list' import { FormattedMessage, IntlProvider, useIntl } from 'react-intl' import { useQuery, useMutation, useQueryClient } from 'react-query' import { activeInstance } from '../../redux/clientSlice' import { useSelector } from 'react-redux' import Client, { Label } from '../../classes/client' import ActionDispatcher from './action-dispatcher' import { ActionType } from './action-chooser' import AccountMenu from './account-menu' import ClientHealthSentinel from '../../classes/client/client-health-sentinel' import HelpMenu from './help-menu' import LanguageMenu from './language-menu' import AppI18n, { Locales } from '../../classes/app-i18n' import ListItemIcon from '@material-ui/core/ListItemIcon' import ListItem from '@material-ui/core/ListItem' import AddCircleTwoTone from '@material-ui/icons/AddCircleTwoTone' import CloudUploadTwoTone from '@material-ui/icons/CloudUploadTwoTone' import DeleteOutlineTwoTone from '@material-ui/icons/DeleteOutlineTwoTone' import LabelTwoTone from '@material-ui/icons/LabelTwoTone' import PersonOutlineTwoTone from '@material-ui/icons/PersonOutlineTwoTone' import PublicTwoTone from '@material-ui/icons/PublicTwoTone' import ScatterPlotTwoTone from '@material-ui/icons/ScatterPlotTwoTone' import ShareTwoTone from '@material-ui/icons/ShareTwoTone' import StarTwoTone from '@material-ui/icons/StarTwoTone' import Tooltip from '@material-ui/core/Tooltip' import Button from '@material-ui/core/Button' import Link from '@material-ui/core/Link' import ListItemText from '@material-ui/core/ListItemText' import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction' import logoIcon from '../../images/logo-small.svg' import poweredByIcon from '../../images/pwrdby-white.svg' export type Filter = GenericFilter | LabelFilter export interface GenericFilter { type: 'public' | 'all' | 'starred' | 'shared' | 'label' | 'owned' } export interface LabelFilter { type: 'label' label: Label } interface ToolbarButtonInfo { filter: GenericFilter | LabelFilter label: string icon: React.ReactElement } const MapsPage = (): ReactElement => { const classes = useStyles() const [filter, setFilter] = React.useState({ type: 'all' }) const client: Client = useSelector(activeInstance) const queryClient = useQueryClient() const [activeDialog, setActiveDialog] = React.useState(undefined) const intl = useIntl() useEffect(() => { document.title = 'Maps | WiseMapping' }, []) const mutation = useMutation((id: number) => client.deleteLabel(id), { onSuccess: () => queryClient.invalidateQueries('labels'), onError: (error) => { console.error(`Unexpected error ${error}`) }, }) const handleMenuClick = (filter: Filter) => { queryClient.invalidateQueries('maps') setFilter(filter) } const handleLabelDelete = (id: number) => { mutation.mutate(id) } const { data } = useQuery('labels', () => { return client.fetchLabels() }) const labels: Label[] = data ? data : [] const filterButtons: ToolbarButtonInfo[] = [ { filter: { type: 'all' }, label: 'All', icon: , }, { filter: { type: 'owned' }, label: 'Owned', icon: , }, { filter: { type: 'starred' }, label: 'Starred', icon: , }, { filter: { type: 'shared' }, label: 'Shared with me', icon: , }, { filter: { type: 'public' }, label: 'Public', icon: , }, ] labels.forEach((l) => filterButtons.push({ filter: { type: 'label', label: l }, label: l.title, icon: , }) ) // Configure using user settings ... const appi18n = new AppI18n() const userLocale = appi18n.getUserLocale() return (
setActiveDialog(undefined)} mapsId={[]} />
logo
{filterButtons.map((buttonInfo) => { return ( ) })}
Powered By WiseMapping
) } interface ListItemProps { icon: React.ReactElement label: string filter: Filter active?: Filter onClick: (filter: Filter) => void onDelete?: (id: number) => void } const StyleListItem = (props: ListItemProps) => { const icon = props.icon const label = props.label const filter = props.filter const activeFilter = props.active const onClick = props.onClick const onDeleteLabel = props.onDelete const isSelected = activeFilter && activeFilter.type == filter.type && (activeFilter.type != 'label' || (activeFilter as LabelFilter).label == (filter as LabelFilter).label) const handleOnClick = (event: React.MouseEvent, filter: Filter) => { event.stopPropagation() onClick(filter) } const handleOnDelete = ( event: React.MouseEvent, filter: Filter ) => { event.stopPropagation() if (!onDeleteLabel) { throw 'Illegal state exeption' } onDeleteLabel((filter as LabelFilter).label.id) } return ( handleOnClick(e, filter)}> {icon} {filter.type == 'label' && ( handleOnDelete(e, filter)} > )} ) } export default MapsPage