diff --git a/src/App.css b/src/App.css index 1c7e252..7efde8b 100644 --- a/src/App.css +++ b/src/App.css @@ -34,6 +34,40 @@ body { display: table-cell; } +.Map-cta { + display: flex; + align-items: center; + justify-content: center; + + flex-direction: column; + gap: 1rem; +} + +.Map-cta-button-container { + display: flex; + flex-wrap: wrap; + + box-sizing: border-box; + gap: 1rem; +} + +.Map-cta-toast { + position: sticky; + bottom: 0; + left: 0; + + display: flex; + align-items: center; + justify-content: center; + + box-sizing: border-box; + width: 100%; + padding: .5rem; + + background-color: #C1E1C1; + animation: slidein 250ms ease-in-out; +} + .Map-padding { background-color: #9dc3fb; padding-top: 20px; @@ -116,27 +150,30 @@ svg#svg574 .province-layer path:hover { background-color: lightgray; } -.save-image-button, .share-fb-button { +.save-image-button, .reset-button, .share-fb-button { position: relative; background-color: white; border-radius: 10px; + border: none; + cursor: pointer; min-height: 30px; align-items: center; text-align: center; display: flex; width: 100px; justify-content: center; - left: 50%; - margin-left: -50px; - margin-bottom: 10px; padding: 3px; } -.save-image-button:hover { +.save-image-button:hover, .reset-button:hover { cursor: pointer; background-color: lightgray; } +.reset-button:disabled { + cursor: not-allowed; +} + .share-fb-button { color: white; background: #4267b3; @@ -232,3 +269,12 @@ svg#svg574 .province-layer path:hover { transform: rotate(360deg); } } + +@keyframes slidein { + from { + transform: translateY(100%); + } + to { + transform: translateY(0%); + } +} \ No newline at end of file diff --git a/src/context/app.context.js b/src/context/app.context.js new file mode 100644 index 0000000..146ed95 --- /dev/null +++ b/src/context/app.context.js @@ -0,0 +1,23 @@ +import { createContext, useState } from "react"; +import { PROVINCES_LENGTH } from "../utils/constants"; + +const AppContext = createContext(); + +export const AppProvider = ({ children }) => { + const [provinceLevels, setProvinceLevels] = useState( + new Array(PROVINCES_LENGTH).fill(0) + ); + + return ( + + {children} + + ); +}; + +export default AppContext; diff --git a/src/index.js b/src/index.js index d563c0f..6a5d5ce 100644 --- a/src/index.js +++ b/src/index.js @@ -4,10 +4,14 @@ import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; +import { AppProvider } from './context/app.context'; + const root = ReactDOM.createRoot(document.getElementById('root')); root.render( - + + + ); diff --git a/src/pages/Map.js b/src/pages/Map.js index 05fc037..b4f86e5 100644 --- a/src/pages/Map.js +++ b/src/pages/Map.js @@ -1,21 +1,22 @@ -import React, { useMemo, useState, useEffect, useCallback } from 'react'; +import React, { useMemo, useState, useEffect, useCallback, useContext } from 'react'; import { useSearchParams, useNavigate } from 'react-router-dom'; import PhilippinesMapJSX from '../PhilippinesMapJSX'; -import { PROVINCES, MENU_OPTIONS, PROVINCES_LENGTH } from '../utils/constants'; +import { PROVINCES, MENU_OPTIONS } from '../utils/constants'; import '.././App.css'; import { levelArrayToString, levelStringToArray, } from '../utils/levelConverter'; +import AppContext from '../context/app.context'; + const PhilippinesMap = () => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); - const [provinceLevels, setProvinceLevels] = useState( - new Array(PROVINCES_LENGTH).fill(0) - ); + const { provinceLevels, setProvinceLevels } = useContext(AppContext) + const [selectedProvinceIndex, setSelectedProvinceIndex] = useState(0); const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 }); const [menuVisible, setMenuVisible] = useState(false); diff --git a/src/pages/MapPage.js b/src/pages/MapPage.js index 676f876..46e9ffd 100644 --- a/src/pages/MapPage.js +++ b/src/pages/MapPage.js @@ -1,4 +1,4 @@ -import React, { useCallback, useRef } from 'react'; +import React, { useState, useCallback, useRef, useContext } from 'react'; import { useLocation } from 'react-router-dom'; import { toJpeg } from 'html-to-image' @@ -7,10 +7,18 @@ import FacebookLogo from '../components/FacebookLogo' import { FB_SHARE_URL } from '../utils/constants' import '.././App.css' +import AppContext from '../context/app.context'; + function MapPage() { const divRef = useRef(null); const location = useLocation(); + + const [isResetMapToastVisible, setIsResetMapToastVisible] = useState(false); + + const { provinceLevels, setProvinceLevels } = useContext(AppContext); + const noProvinceSelected = provinceLevels.every(level => level === 0); + const fileName = 'phMap.jpg' const downloadJpg = useCallback(() => { @@ -33,6 +41,14 @@ function MapPage() { const navUrl = FB_SHARE_URL + window.location.href; window.open(navUrl, 'mywindow', 'width=350,height=250'); }, [location.search]); + + const handleReset = () => { + if(noProvinceSelected) return; + + setProvinceLevels(provinceLevels => provinceLevels.map(_ => 0)) + setIsResetMapToastVisible(true) + setTimeout(() => setIsResetMapToastVisible(false), 2500) + }; return (
@@ -41,10 +57,17 @@ function MapPage() {
-
Save Image
-
- - Share + +
+
+ + +
+ +
@@ -73,7 +96,9 @@ function MapPage() { Flag Counter -
+ + {isResetMapToastVisible &&
Map has been reset
} + ); };