import React, { createContext, useCallback, useContext, useEffect, useState } from 'react'; import { LayerEnablementState, MapTheme } from './config/map-config'; interface DisplayPreferencesContextState { resetLayers: (e: React.FormEvent) => void; anyLayerModifiedState: () => boolean; vista: LayerEnablementState; vistaSwitch: (e: React.FormEvent) => void; vistaSwitchOnClick: React.MouseEventHandler; flood: LayerEnablementState; floodSwitch: (e: React.FormEvent) => void; floodSwitchOnClick: React.MouseEventHandler; creative: LayerEnablementState; creativeSwitch: (e: React.FormEvent) => void; creativeSwitchOnClick: React.MouseEventHandler; housing: LayerEnablementState; housingSwitch: (e: React.FormEvent) => void; housingSwitchOnClick: React.MouseEventHandler; conservation: LayerEnablementState; conservationSwitch: (e: React.FormEvent) => void; conservationSwitchOnClick: React.MouseEventHandler; parcel: LayerEnablementState; parcelSwitch: (e: React.FormEvent) => void; parcelSwitchOnClick: React.MouseEventHandler; borough: LayerEnablementState; boroughSwitch: (e: React.FormEvent) => void; boroughSwitchOnClick: React.MouseEventHandler; historicData: LayerEnablementState; historicDataSwitch: (e: React.FormEvent) => void; historicDataSwitchOnClick: React.MouseEventHandler; darkLightTheme: MapTheme; darkLightThemeSwitch: (e: React.FormEvent) => void; darkLightThemeSwitchOnClick: React.MouseEventHandler; } const stub = (): never => { throw new Error('DisplayPreferencesProvider not set up'); }; export const DisplayPreferencesContext = createContext({ resetLayers: stub, anyLayerModifiedState: stub, vista: undefined, vistaSwitch: stub, vistaSwitchOnClick: undefined, flood: undefined, floodSwitch: stub, floodSwitchOnClick: undefined, creative: undefined, creativeSwitch: stub, creativeSwitchOnClick: undefined, housing: undefined, housingSwitch: stub, housingSwitchOnClick: undefined, conservation: undefined, conservationSwitch: stub, conservationSwitchOnClick: undefined, parcel: undefined, parcelSwitch: stub, parcelSwitchOnClick: undefined, borough: undefined, boroughSwitch: stub, boroughSwitchOnClick: undefined, historicData: undefined, historicDataSwitch: stub, historicDataSwitchOnClick: undefined, darkLightTheme: undefined, darkLightThemeSwitch: stub, darkLightThemeSwitchOnClick: undefined, }); const noop = () => {}; export const DisplayPreferencesProvider: React.FC<{}> = ({children}) => { const defaultVista = 'disabled' const defaultFlood = 'disabled' const defaultCreative = 'disabled' const defaultHousing = 'disabled' const defaultBorough = 'enabled' const defaultParcel = 'disabled' const defaultConservation = 'disabled' const defaultHistoricData = 'disabled' const [vista, setVista] = useState(defaultVista); const [flood, setFlood] = useState(defaultFlood); const [creative, setCreative] = useState(defaultCreative); const [housing, setHousing] = useState(defaultHousing); const [borough, setBorough] = useState(defaultBorough); const [parcel, setParcel] = useState(defaultParcel); const [conservation, setConservation] = useState(defaultConservation); const [historicData, setHistoricData] = useState(defaultHistoricData); const [darkLightTheme, setDarkLightTheme] = useState('night'); const resetLayers = useCallback( (e) => { e.preventDefault(); setVista(defaultVista); setFlood(defaultFlood); setCreative(defaultCreative); setHousing(defaultHousing); setBorough(defaultBorough) setParcel(defaultParcel); setConservation(defaultConservation); setHistoricData(defaultHistoricData); //setDarkLightTheme('night'); // reset only layers }, [] ) function anyLayerModifiedState() { if(vista != defaultVista) { return true; } if(flood != defaultFlood) { return true; } if(creative != defaultCreative) { return true; } if(housing != defaultHousing) { return true; } if(borough != defaultBorough) { return true; } if(parcel != defaultParcel) { return true; } if(conservation != defaultConservation) { return true; } if(historicData != defaultHistoricData) { return true; } //darkLightTheme not handled here return false; } const vistaSwitch = useCallback( (e) => { e.preventDefault(); const newVista = (vista === 'enabled')? 'disabled' : 'enabled'; setVista(newVista); }, [vista], ) const vistaSwitchOnClick = (e) => { e.preventDefault(); const newVista = (vista === 'enabled')? 'disabled' : 'enabled'; setVista(newVista); } const floodSwitch = useCallback( (e) => { e.preventDefault(); const newFlood = (flood === 'enabled')? 'disabled' : 'enabled'; setFlood(newFlood); }, [flood], ) const floodSwitchOnClick = (e) => { e.preventDefault(); const newFlood = (flood === 'enabled')? 'disabled' : 'enabled'; setFlood(newFlood); } const housingSwitch = useCallback( (e) => { e.preventDefault(); const newHousing = (housing === 'enabled')? 'disabled' : 'enabled'; setHousing(newHousing); }, [housing], ) const housingSwitchOnClick = (e) => { e.preventDefault(); const newHousing = (housing === 'enabled')? 'disabled' : 'enabled'; setHousing(newHousing); } const creativeSwitch = useCallback( (e) => { e.preventDefault(); const newCreative = (creative === 'enabled')? 'disabled' : 'enabled'; setCreative(newCreative); }, [creative], ) const creativeSwitchOnClick = (e) => { e.preventDefault(); const newCreative = (creative === 'enabled')? 'disabled' : 'enabled'; setCreative(newCreative); } const boroughSwitch = useCallback( (e) => { flipBorough(e) }, [borough], ) const boroughSwitchOnClick = (e) => { flipBorough(e) } function flipBorough(e) { e.preventDefault(); const newBorough = (borough === 'enabled')? 'disabled' : 'enabled'; setBorough(newBorough); } const parcelSwitch = useCallback( (e) => { flipParcel(e) }, [parcel], ) const parcelSwitchOnClick = (e) => { flipParcel(e) } function flipParcel(e) { e.preventDefault(); const newParcel = (parcel === 'enabled')? 'disabled' : 'enabled'; setParcel(newParcel); } const conservationSwitch = useCallback( (e) => { flipConservation(e) }, [conservation], ) const conservationSwitchOnClick = (e) => { flipConservation(e) } function flipConservation(e) { e.preventDefault(); const newConservation = (conservation === 'enabled')? 'disabled' : 'enabled'; setConservation(newConservation); } const historicDataSwitch = useCallback( (e) => { flipHistoricData(e) }, [historicData], ) const historicDataSwitchOnClick = (e) => { flipHistoricData(e) } function flipHistoricData(e) { e.preventDefault(); const newHistoric = (historicData === 'enabled')? 'disabled' : 'enabled'; setHistoricData(newHistoric); } const darkLightThemeSwitch = useCallback( (e) => { flipDarkLightTheme(e) }, [darkLightTheme], ) const darkLightThemeSwitchOnClick = (e) => { flipDarkLightTheme(e) } function flipDarkLightTheme(e) { e.preventDefault(); const newDarkLightTheme = (darkLightTheme === 'light')? 'night' : 'light'; setDarkLightTheme(newDarkLightTheme); } return ( {children} ); }; export const useDisplayPreferences = (): DisplayPreferencesContextState => { return useContext(DisplayPreferencesContext); };