metamaps--metamaps/frontend/src/components/MapView/index.js

133 lines
3.9 KiB
JavaScript
Raw Normal View History

2017-03-11 01:49:27 -05:00
import React, { Component, PropTypes } from 'react'
2017-03-11 09:56:09 -05:00
import DataVis from './DataVis'
import MapButtons from './MapButtons'
import InfoAndHelp from './InfoAndHelp'
import MapControls from './MapControls'
2017-03-11 01:49:27 -05:00
import MapChat from './MapChat'
import TopicCard from '../TopicCard'
class MapView extends Component {
static propTypes = {
2017-03-12 03:26:00 -04:00
mobile: PropTypes.bool,
2017-03-11 01:49:27 -05:00
mapId: PropTypes.string,
map: PropTypes.object,
mapIsStarred: PropTypes.bool,
2017-03-12 03:26:00 -04:00
onMapStar: PropTypes.func,
onMapUnstar: PropTypes.func,
2017-03-11 21:13:58 -05:00
toggleFilterBox: PropTypes.func,
2017-03-12 00:56:59 -05:00
filterBoxHtml: PropTypes.string,
2017-03-11 21:13:58 -05:00
toggleMapInfoBox: PropTypes.func,
infoBoxHtml: PropTypes.string,
2017-03-11 01:49:27 -05:00
currentUser: PropTypes.object,
endActiveMap: PropTypes.func,
2017-03-11 21:13:58 -05:00
launchNewMap: PropTypes.func,
2017-03-12 03:26:00 -04:00
openImportLightbox: PropTypes.func,
forkMap: PropTypes.func,
openHelpLightbox: PropTypes.func,
onZoomExtents: PropTypes.func,
onZoomIn: PropTypes.func,
onZoomOut: PropTypes.func
2017-03-11 01:49:27 -05:00
}
constructor(props) {
super(props)
2017-03-11 09:56:09 -05:00
this.state = {
chatOpen: false
}
2017-03-11 01:49:27 -05:00
}
2017-03-11 09:56:09 -05:00
endMap() {
this.setState({
chatOpen: false
})
this.props.endActiveMap()
}
2017-03-11 01:49:27 -05:00
componentDidUpdate(prevProps) {
const oldMapId = prevProps.mapId
2017-03-11 09:56:09 -05:00
const { mapId, launchNewMap } = this.props
2017-03-11 01:49:27 -05:00
if (!oldMapId && mapId) launchNewMap(mapId)
else if (oldMapId && mapId && oldMapId !== mapId) {
2017-03-11 09:56:09 -05:00
this.endMap()
2017-03-11 01:49:27 -05:00
launchNewMap(mapId)
}
2017-03-11 09:56:09 -05:00
else if (oldMapId && !mapId) this.endMap()
2017-03-11 01:49:27 -05:00
}
render = () => {
2017-03-12 00:56:59 -05:00
const { map, currentUser, onOpen, onClose,
toggleMapInfoBox, toggleFilterBox, infoBoxHtml, filterBoxHtml,
openImportLightbox, forkMap, openHelpLightbox,
mapIsStarred, onMapStar, onMapUnstar,
onZoomExtents, onZoomIn, onZoomOut } = this.props
2017-03-12 01:00:37 -05:00
const { chatOpen } = this.state
2017-03-11 09:56:09 -05:00
const onChatOpen = () => {
this.setState({chatOpen: true})
onOpen()
}
const onChatClose = () => {
this.setState({chatOpen: false})
onClose()
}
2017-03-12 00:56:59 -05:00
const canEditMap = map && map.authorizeToEdit(currentUser)
2017-03-11 09:56:09 -05:00
// TODO: stop using {...this.props} and make explicit
2017-03-11 01:49:27 -05:00
return <div className="mapWrapper">
2017-03-12 00:56:59 -05:00
<MapButtons currentUser={currentUser}
onImportClick={openImportLightbox}
onFilterClick={toggleFilterBox}
onForkClick={forkMap}
canEditMap={canEditMap}
filterBoxHtml={filterBoxHtml} />
2017-03-11 09:56:09 -05:00
<DataVis />
<TopicCard {...this.props} />
<MapChat {...this.props} onOpen={onChatOpen} onClose={onChatClose} chatOpen={chatOpen} />
2017-03-12 00:56:59 -05:00
<MapControls onClickZoomExtents={onZoomExtents}
onClickZoomIn={onZoomIn}
onClickZoomOut={onZoomOut} />
2017-03-11 21:13:58 -05:00
<InfoAndHelp mapIsStarred={mapIsStarred}
currentUser={currentUser}
map={map}
onInfoClick={toggleMapInfoBox}
2017-03-12 00:56:59 -05:00
onMapStar={onMapStar}
onMapUnstar={onMapUnstar}
onHelpClick={openHelpLightbox}
2017-03-11 21:13:58 -05:00
infoBoxHtml={infoBoxHtml} />
2017-03-11 01:49:27 -05:00
</div>
}
}
export default MapView
/*
<% if authenticated? %>
<% # for creating and pulling in topics and synapses %>
<% if controller_name == 'maps' && action_name == "conversation" %>
<%= render :partial => 'maps/newtopicsecret' %>
<% else %>
<%= render :partial => 'maps/newtopic' %>
<% end %>
<%= render :partial => 'maps/newsynapse' %>
<% # for populating the change metacode list on the topic card %>
<%= render :partial => 'shared/metacodeoptions' %>
<% end %>
<%= render :partial => 'layouts/lowermapelements' %>
<div id="loading"></div>
<div id="instructions">
<div className="addTopic">
Double-click to<br>add a topic
</div>
<div className="tabKey">
Use Tab & Shift+Tab to select a metacode
</div>
<div className="enterKey">
Press Enter to add the topic
</div>
</div>
*/