import React, { useState, useEffect } from "react"; import PropTypes from 'prop-types'; import Cookies from "js-cookie"; const menuData = [ { id: "irish-rail", name: "Irish Rail", children: [ { id: "irish-rail-trains", name: "Irish Rail Trains", children: [ { id: "mainline", name: "Mainline" }, { id: "suburban", name: "Suburban" }, { id: "dart", name: "DART" }, { id: "running", name: "Running" }, { id: "not-yet-running", name: "Not yet running" }, { id: "terminated", name: "Terminated" }, { id: "early", name: "Early" }, { id: "on-time", name: "On-time" }, { id: "late", name: "Late" }, ], }, { id: "irish-rail-stations", name: "Irish Rail Stations" }, ], }, { id: "bus", name: "Bus", children: [ { id: "buses", name: "Buses" }, { id: "bus-stops", name: "Bus Stops" }, ], }, { id: "luas-stops", name: "Luas Stops", children: [ { id: "red-line", name: "Red Line" }, { id: "green-line", name: "Green Line" }, { id: "enabled", name: "Enabled" }, { id: "disabled", name: "Disabled" }, { id: "park-and-ride", name: "Must be Park & Ride" }, { id: "cycle-and-ride", name: "Must be Cycle & Ride" }, ], }, ]; const getAllDefaultCheckedIds = (data) => { const ids = []; const traverse = (items, isTopLevel = true) => { items.forEach((item) => { if (!isTopLevel && item.id !== "cycle-and-ride" && item.id !== "park-and-ride") { ids.push(item.id); // Check non-top-level items by default } if (item.children) { traverse(item.children, false); // Child items are not top-level } }); }; traverse(data); return ids; }; const CheckboxItem = ({ item, selectedSources, setSelectedSources, enabledSources, setEnabledSources, level = 0, parentChecked = true }) => { const isChecked = selectedSources.includes(item.id); const isDisabled = !parentChecked; // Disable if any parent is not checked const isEnabled = isChecked && parentChecked; // Only enabled if checked and parent is checked const handleCheckboxChange = () => { setSelectedSources((prev) => isChecked ? prev.filter((id) => id !== item.id) : [...prev, item.id] ); }; // Track enabled sources based on parent and own state useEffect(() => { setEnabledSources((prev) => { const newEnabledSources = new Set(prev); if (isEnabled) newEnabledSources.add(item.id); else newEnabledSources.delete(item.id); return Array.from(newEnabledSources); }); }, [isEnabled, item.id, setEnabledSources]); const hasChildren = item.children && item.children.length > 0; const isTopLevel = level === 0; return (