summaryrefslogtreecommitdiff
path: root/src/containers/app/map/layers/RoomHoverLayer.js
blob: 020102bfa98acad0b4fdf9c2a4b00b23bd2ee214 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { connect } from "react-redux";
import { toggleTileAtLocation } from "../../../../actions/topology/building";
import RoomHoverLayerComponent from "../../../../components/app/map/layers/RoomHoverLayerComponent";
import {
  deriveValidNextTilePositions,
  findPositionInPositions,
  findPositionInRooms
} from "../../../../util/tile-calculations";

const mapStateToProps = state => {
  return {
    mapPosition: state.map.position,
    mapScale: state.map.scale,
    isEnabled: () => state.construction.currentRoomInConstruction !== -1,
    isValid: (x, y) => {
      const newRoom = Object.assign(
        {},
        state.objects.room[state.construction.currentRoomInConstruction]
      );
      const oldRooms = Object.keys(state.objects.room)
        .map(id => Object.assign({}, state.objects.room[id]))
        .filter(
          room =>
            state.objects.datacenter[state.currentDatacenterId].roomIds.indexOf(
              room.id
            ) !== -1 && room.id !== state.construction.currentRoomInConstruction
        );

      [...oldRooms, newRoom].forEach(room => {
        room.tiles = room.tileIds.map(tileId => state.objects.tile[tileId]);
      });
      if (newRoom.tileIds.length === 0) {
        return findPositionInRooms(oldRooms, x, y) === -1;
      }

      const validNextPositions = deriveValidNextTilePositions(
        oldRooms,
        newRoom.tiles
      );
      return findPositionInPositions(validNextPositions, x, y) !== -1;
    }
  };
};

const mapDispatchToProps = dispatch => {
  return {
    onClick: (x, y) => dispatch(toggleTileAtLocation(x, y))
  };
};

const RoomHoverLayer = connect(mapStateToProps, mapDispatchToProps)(
  RoomHoverLayerComponent
);

export default RoomHoverLayer;