All files / atlas-mobile-ts/src/components/Map/MainMapComponent useMapState.ts

0% Statements 0/28
100% Branches 0/0
0% Functions 0/2
0% Lines 0/26

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125                                                                                                                                                                                                                                                         
/* Copyright (C) Click & Push Accessibility, Inc - All Rights Reserved
 * Unauthorized copying of this file, via any medium is strictly prohibited
 * Proprietary and confidential
 * Written and maintained by the Click & Push Development team 
 * <dev@clicknpush.ca>, January 2022
 */
 
import { useRef, useState } from "react";
import { UserLocation } from "./OutdoorMap";
import { Landmark } from "../../../hooks/useLandmarks";
import MapView from "react-native-maps";
 
export const useMapState = () => {
    /**
     * State that contains the new {@link Landmark} object which is passed down to the {@link AddLandmark} modal.
     */
    const [newLandmark, setNewLandmark] = useState<Landmark>(undefined);
    /**
     * State that contains the selected {@link Landmark} object which is passed down to the {@link LandmarkDetails} modal.
     */
    const [selectedLandmarkId, setSelectedLandmarkId] = useState<string>('');
    /**
     * Holds the visibility state of the {@link AddLandmark} modal.
     */
    const [lmAddVisible, toggleLmAdd] = useState<boolean>(false);
    /**
     * Holds the visibility state of the {@link LandmarkDetails} modal.
     */
    const [lmDetailsVisible, toggleLmDetails] = useState<boolean>(false);
    /**
     * Flag that toggles whether or not editing is enabled in the {@link LandmarkDetails} modal. 
     * The parent Map component has access to it so that it can disable closing the modal on backdrop press when it is enabled.
     */
    const [lmDetailsEditing, toggleLmDetailsEditing] = useState<boolean>(false);
    /**
     * Holds the listening state of the {@link VoicePanel} modal.
     */
     const [voiceActive, toggleVoiceActive] = useState<boolean>(false);
    
    /**
     * Flag that determines whether the filter options are shown
     */
    const [filterVisible, toggleFilter] = useState<boolean>(false)
    /**
     * State of minumum landmark rating filter
     */
    const [minLmRating, setMinLmRating] = useState<number>(0)
        /**
     * State of landmark types filter
     */
    const [lmFilteredTypes, setLmTypeFilter] = useState<number[]>([])
    /**
     * State of landmark "only show owned" filter
     */
    const [onlyOwned, toggleOnlyOwned] = useState<boolean>(false)
 
    return { 
        onlyOwned, toggleOnlyOwned,
        lmFilteredTypes, setLmTypeFilter,
        minLmRating, setMinLmRating,
        filterVisible, toggleFilter,
        lmDetailsVisible, toggleLmDetails,
        lmDetailsEditing, toggleLmDetailsEditing,
        selectedLandmarkId, setSelectedLandmarkId,
        newLandmark, setNewLandmark,
        lmAddVisible, toggleLmAdd,
     }
}
 
export const useOutdoorMapState = () => {
    /**
     * Holds the visibility state of the {@link AddLandmark} modal.
     */
    const alertedLmVisibleState = false;
    const [nearbyLmPanelVisible, toggleNearbyLmPanel] = useState<boolean>(alertedLmVisibleState);
    /**
     * State that holds a {@link UserLocation} object retrieved from location services.
     */
    const [userLocation, setUserLocation] = useState<UserLocation>(undefined);
    /**
     * Flag that determines whether the map should focus and follow the user's location.
     */
    const [followUser, toggleFollowUser] = useState<boolean>(false);
    /**
     * State that contains the selected {@link Landmark} object which is passed down to the {@link LandmarkDetails} modal.
     */
    const [landmarksNearUser, setLandmarksNearUser] = useState<Landmark[]>([])
    /**
     * Flag that toggles whether or not foreground location permission has been granted.
     */
    const [fgroundLocationPermission, toggleFgroundLocationPermission] = useState<boolean>(false);
    /**
     * Flag that toggles whether or not background location permission has been granted.
     */
    const [bgroundLocationPermission, toggleBgroundLocationPermission] = useState<boolean>(false);
    /**
     * Flag that toggles whether or not voice recording permission has been granted.
     */
    const [voicePermission, toggleVoicePermission] = useState<boolean>(false);
    /**
     * Holds the visibility state of the {@link VoicePanel} modal.
     */
    const [voiceVisible, toggleVoiceVisible] = useState<boolean>(false);
    /**
     * Flag that toggles whether or not location is currently permitted (true if fground is granted is true and AppState is active, or if bground is active).
     */
    const [locationPermitted, toggleLocationPermitted] = useState<boolean>(false);
     /**
     * Ref that holds the loaded [MapView]{@link https://github.com/react-native-maps/react-native-maps/blob/master/docs/mapview.md} instance.
     */
    const mapRef = useRef<MapView>();
 
    return {
        nearbyLmPanelVisible, toggleNearbyLmPanel,
        followUser, toggleFollowUser,
        userLocation, setUserLocation,
        landmarksNearUser, setLandmarksNearUser,
        mapRef,
        voicePermission, toggleVoicePermission,
        voiceVisible, toggleVoiceVisible,
        fgroundLocationPermission, toggleFgroundLocationPermission,
        bgroundLocationPermission, toggleBgroundLocationPermission,
        locationPermitted, toggleLocationPermitted,
    }
}