diff --git a/src/components/HistoryList/AlertItem.tsx b/src/components/HistoryList/AlertItem.tsx index 13053d6..48c12ce 100644 --- a/src/components/HistoryList/AlertItem.tsx +++ b/src/components/HistoryList/AlertItem.tsx @@ -8,6 +8,7 @@ import { useAlertHitContext } from "../../context/AlertHitContext"; import NPED_CAT_A from "/NPED_Cat_A.svg"; import NPED_CAT_B from "/NPED_Cat_B.svg"; import NPED_CAT_C from "/NPED_Cat_C.svg"; +import { checkIsHotListHit } from "../../utils/utils"; type AlertItemProps = { item: SightingType; @@ -19,9 +20,8 @@ const AlertItem = ({ item }: AlertItemProps) => { // const {d} = useCameraBlackboard(); const motionAway = (item?.motion ?? "").toUpperCase() === "AWAY"; - // [34].metadata.hotlistMatches["MAV_Hotlist.csv"] - //check if true is in any hotlist property - const isHotListHit = item?.metadata?.hotlistMatches?.Hotlist0 === true; + + const isHotListHit = checkIsHotListHit(item); const isNPEDHitA = item?.metadata?.npedJSON?.["NPED CATEGORY"] === "A"; const isNPEDHitB = item?.metadata?.npedJSON?.["NPED CATEGORY"] === "B"; const isNPEDHitC = item?.metadata?.npedJSON?.["NPED CATEGORY"] === "C"; diff --git a/src/components/SightingModal/SightingModal.tsx b/src/components/SightingModal/SightingModal.tsx index ad2b65e..aef4981 100644 --- a/src/components/SightingModal/SightingModal.tsx +++ b/src/components/SightingModal/SightingModal.tsx @@ -10,6 +10,7 @@ import HotListImg from "/Hotlist_Hit.svg"; import NPED_CAT_A from "/NPED_Cat_A.svg"; import NPED_CAT_B from "/NPED_Cat_B.svg"; import NPED_CAT_C from "/NPED_Cat_C.svg"; +import { checkIsHotListHit } from "../../utils/utils"; type SightingModalProps = { isSightingModalOpen: boolean; @@ -65,7 +66,7 @@ const SightingModal = ({ }; const motionAway = (sighting?.motion ?? "").toUpperCase() === "AWAY"; - const isHotListHit = sighting?.metadata?.hotlistMatches?.Hotlist0 === true; + const isHotListHit = checkIsHotListHit(sighting); const isNPEDHitA = sighting?.metadata?.npedJSON?.["NPED CATEGORY"] === "A"; const isNPEDHitB = sighting?.metadata?.npedJSON?.["NPED CATEGORY"] === "B"; const isNPEDHitC = sighting?.metadata?.npedJSON?.["NPED CATEGORY"] === "C"; diff --git a/src/components/SightingsWidget/InfoBar.tsx b/src/components/SightingsWidget/InfoBar.tsx index c9ff970..b19f192 100644 --- a/src/components/SightingsWidget/InfoBar.tsx +++ b/src/components/SightingsWidget/InfoBar.tsx @@ -5,7 +5,6 @@ type InfoBarprops = { obj: SightingType; }; const InfoBar = ({ obj }: InfoBarprops) => { - // const isNPEDHit = obj?.metadata?.npedJSON?.status_code === 404; const isNPEDHitD = obj?.metadata?.npedJSON?.["NPED CATEGORY"] === "D"; return ( diff --git a/src/components/SightingsWidget/SightingWidget.tsx b/src/components/SightingsWidget/SightingWidget.tsx index 754e03e..1e730f7 100644 --- a/src/components/SightingsWidget/SightingWidget.tsx +++ b/src/components/SightingsWidget/SightingWidget.tsx @@ -13,10 +13,12 @@ import NPED_CAT_A from "/NPED_Cat_A.svg"; import NPED_CAT_B from "/NPED_Cat_B.svg"; import NPED_CAT_C from "/NPED_Cat_C.svg"; import popup from "../../assets/sounds/ui/popup_open.mp3"; +import notification from "../../assets/sounds/ui/notification.mp3"; import { useSound } from "react-sounds"; import { useNPEDContext } from "../../context/NPEDUserContext"; import { useSoundContext } from "../../context/SoundContext"; import Loading from "../UI/Loading"; +import { checkIsHotListHit } from "../../utils/utils"; function useNow(tickMs = 1000) { const [, setNow] = useState(() => Date.now()); @@ -43,11 +45,16 @@ export default function SightingHistoryWidget({ useNow(1000); const { state } = useSoundContext(); - const soundSrc = useMemo(() => { + const soundSrcNped = useMemo(() => { return getSoundFileURL(state.NPEDsound) ?? popup; }, [state.NPEDsound]); - const { play } = useSound(soundSrc); + const soundSrcHotlist = useMemo(() => { + return getSoundFileURL(state?.hotlists?.[0]?.sound) ?? notification; + }, [state.hotlists]); + + const { play: npedSound } = useSound(soundSrcNped); + const { play: hotlistsound } = useSound(soundSrcHotlist); const { sightings, setSelectedSighting, @@ -78,6 +85,7 @@ export default function SightingHistoryWidget({ }, [mostRecent, sessionStarted, setSessionList]); const hasAutoOpenedRef = useRef(false); + const npedRef = useRef(false); const onRowClick = useCallback( (sighting: SightingType) => { @@ -106,24 +114,43 @@ export default function SightingHistoryWidget({ }); } }); - }, [dispatch, rows]); + }, [dispatch]); useEffect(() => { - if (hasAutoOpenedRef.current) return; - const firstHot = rows?.find((r) => { - const isHotListHit = r?.metadata?.hotlistMatches?.Hotlist0 === true; + if (hasAutoOpenedRef.current || npedRef.current) return; + const firstNPED = rows.find((r) => { const isNPEDHitA = r?.metadata?.npedJSON?.["NPED CATEGORY"] === "A"; const isNPEDHitB = r?.metadata?.npedJSON?.["NPED CATEGORY"] === "B"; const isNPEDHitC = r?.metadata?.npedJSON?.["NPED CATEGORY"] === "C"; - return isNPEDHitA || isNPEDHitB || isNPEDHitC || isHotListHit; + return isNPEDHitA || isNPEDHitB || isNPEDHitC; }); + const firstHot = rows?.find((r) => { + const isHotListHit = checkIsHotListHit(r); + + return isHotListHit; + }); + + if (firstNPED) { + setSelectedSighting(firstNPED); + console.log("first"); + npedSound(); + setSightingModalOpen(true); + npedRef.current = true; + } + if (firstHot) { setSelectedSighting(firstHot); - play(); + hotlistsound(); setSightingModalOpen(true); hasAutoOpenedRef.current = true; } - }, [play, rows, setSelectedSighting, setSightingModalOpen]); + }, [ + hotlistsound, + npedSound, + rows, + setSelectedSighting, + setSightingModalOpen, + ]); const handleClose = () => { setSightingModalOpen(false); @@ -152,11 +179,8 @@ export default function SightingHistoryWidget({ obj?.metadata?.npedJSON?.["NPED CATEGORY"] === "B"; const isNPEDHitC = obj?.metadata?.npedJSON?.["NPED CATEGORY"] === "C"; - const isNPEDHitD = - obj?.metadata?.npedJSON?.["NPED CATEGORY"] === "D"; const motionAway = (obj?.motion ?? "").toUpperCase() === "AWAY"; - const isHotListHit = - obj?.metadata?.hotlistMatches?.Hotlist0 === true; + const isHotListHit = checkIsHotListHit(obj); return (
onRowClick(obj)} >
void; }; export const SightingFeedContext = createContext< diff --git a/src/context/providers/SightingFeedProvider.tsx b/src/context/providers/SightingFeedProvider.tsx index 6b6b8aa..5e0fb78 100644 --- a/src/context/providers/SightingFeedProvider.tsx +++ b/src/context/providers/SightingFeedProvider.tsx @@ -23,9 +23,7 @@ export const SightingFeedProvider = ({ setSelectedSighting, selectedSighting, mostRecent, - sessionList, sessionStarted, - setSessionStarted, } = useSightingFeed(url); const [isSightingModalOpen, setSightingModalOpen] = useState(false); @@ -45,9 +43,7 @@ export const SightingFeedProvider = ({ isLoading, side, data, - sessionList, sessionStarted, - setSessionStarted, }} > {children} diff --git a/src/context/reducers/SoundContextReducer.ts b/src/context/reducers/SoundContextReducer.ts index 42f8d2d..6250239 100644 --- a/src/context/reducers/SoundContextReducer.ts +++ b/src/context/reducers/SoundContextReducer.ts @@ -3,7 +3,7 @@ import type { SoundAction, SoundState } from "../../types/types"; export const initialState: SoundState = { sightingSound: "switch", NPEDsound: "popup", - hotlists: [], + hotlists: [{ name: "hotlistName", sound: "notification" }], soundOptions: [ { name: "switch (Default)", soundFile: null }, { name: "popup", soundFile: null }, diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 1c1b257..0f4488f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,6 +1,7 @@ import switchSound from "../assets/sounds/ui/switch.mp3"; import popup from "../assets/sounds/ui/popup_open.mp3"; import notification from "../assets/sounds/ui/notification.mp3"; +import type { SightingType } from "../types/types"; export function getSoundFileURL(name: string) { const sounds: Record = { @@ -129,59 +130,12 @@ export function drawRects( }); } -// setSelectedRef(data?.ref); - -//setItems(data); - -// const selected = useMemo( -// () => -// selectedRef == null -// ? null -// : items.find((x) => x?.ref === selectedRef) ?? null, -// [items, selectedRef] -// ); -// const effectiveSelected = selected ?? mostRecent ?? null; - -// useEffect(() => { -// let delay = pollMs; -// let dead = false; -// const controller = new AbortController(); - -// async function tick() { -// try { -// // Pause when tab hidden to save CPU/network -// if (document.hidden) { -// setTimeout(tick, Math.max(delay, 2000)); -// return; -// } - -// if (obj && typeof obj.ref === "number" && obj.ref > -1) { -// setItems((prev) => { -// const next = [obj, ...prev].slice(0, limit); -// // maintain selection if still present; otherwise select newest if allowed -// const stillExists = -// selectedRef != null && next.some((x) => x?.ref === selectedRef); -// if (autoSelectLatest && !stillExists) { -// setSelectedRef(obj.ref); -// } -// return next; -// }); -// setMostRecent(obj); -// mostRecentRef.current = obj.ref; -// delay = pollMs; // reset backoff on success -// } -// } catch { -// // exponential backoff (max 10s) -// delay = Math.min(delay * 2, 10000); -// } finally { -// if (!dead) setTimeout(tick, delay); -// } -// } - -// const t = setTimeout(tick, pollMs); -// return () => { -// dead = true; -// controller.abort(); -// clearTimeout(t); -// }; -// }, [baseUrl, limit, pollMs, autoSelectLatest, selectedRef]); +export const checkIsHotListHit = (sigthing: SightingType | null) => { + if (!sigthing) return; + if (sigthing?.metadata?.hotlistMatches) { + const isHotListHit = Object.values( + sigthing?.metadata?.hotlistMatches + ).includes(true); + return isHotListHit; + } +};