GuessPane.jsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { useState, useEffect } from 'react';
  2. import { dispatch } from '../../../../domain/gameStore';
  3. import { reverseGeocode } from '../../../../domain/geocoding';
  4. import ClickMarkerMap from './ClickMarkerMap';
  5. import styles from './GuessPane.module.css';
  6. import RoundTimer from './RoundTimer';
  7. const mapSizeOpts = {
  8. small: styles['pane--small'],
  9. medium: styles['pane--medium'],
  10. big: styles['pane--big'],
  11. }
  12. const toggleMapSize = larger => b => b === 'big' || b === 'medium' ? 'small' : larger;
  13. const GuessPane = () => {
  14. const [ selectedPoint, setSelectedPoint ] = useState(null);
  15. const [ submitted, setSubmitted ] = useState(false);
  16. const [ mapSize, setMapSize ] = useState('small');
  17. useEffect(() => {
  18. const listener = event => {
  19. if (event.code === 'Escape') {
  20. setMapSize(toggleMapSize('big'));
  21. }
  22. }
  23. document.addEventListener('keydown', listener, false);
  24. return () => document.removeEventListener('keydown', listener, false);
  25. }, [])
  26. const handleSubmitGuess = async () => {
  27. setSubmitted(true);
  28. if (!submitted) {
  29. await dispatch.submitGuess(selectedPoint && { country: await reverseGeocode(selectedPoint), ...selectedPoint });
  30. }
  31. };
  32. return (
  33. <div className={`${styles.pane} ${mapSizeOpts[mapSize]}`}>
  34. <button
  35. className={styles.submit}
  36. onClick={handleSubmitGuess}
  37. disabled={submitted || selectedPoint === null}
  38. >
  39. Submit Guess
  40. </button>
  41. <ClickMarkerMap onMarkerMoved={setSelectedPoint} />
  42. <RoundTimer onTimeout={handleSubmitGuess} />
  43. <div className={styles.resize} onClick={() => setMapSize(toggleMapSize('big'))}>
  44. { mapSize === 'small' ? '↗️' : '↙️' }
  45. </div>
  46. <div className={`${styles.resize} ${styles['resize--medium']}`} onClick={() => setMapSize(toggleMapSize('medium'))}>
  47. { mapSize === 'small' ? '➡️' : '⬅️' }
  48. </div>
  49. </div>
  50. );
  51. };
  52. export default GuessPane;