{"version":3,"sources":["assets/img/logo.png","components/Footer.tsx","assets/img/svg/sprite.svg","components/graphics.tsx","components/Header.tsx","models/index.ts","utils/helpers.ts","contexts/googleMaps.tsx","contexts/cbCityGraphql.tsx","contexts/streetDataset.tsx","assets/img/svg/warning-circle.svg","assets/img/cleaners/waste-cleansing-cleaners.jpg","assets/img/cleaners/waste-cleansing-footpath.jpg","assets/img/cleaners/waste-cleansing-hose.jpg","assets/img/cleaners/waste-garbage-trucks.jpg","assets/img/slider-photo-example.jpg","assets/img/gallery-photo-example.jpg","components/MoreInfoBlock.tsx","components/HeroImageSlider.tsx","components/CleaningActionImageSlider.tsx","hooks/useScrollToTop.tsx","assets/img/svg/map-marker.svg","components/SweeperMap.tsx","hooks/useInterval.tsx","components/StreetSearchBox.tsx","assets/img/stsweep-og.jpg","components/SeoHelmet.tsx","pages/LandingPage.tsx","graphql.ts","pages/ResultsPage.tsx","utils/getNextSweepDate.ts","App.tsx","reportWebVitals.ts","index.tsx"],"names":["Footer","className","href","src","logoPNG","alt","target","rel","SpriteIcon","iconName","xlinkHref","spriteSVG","Header","to","NextSweepScheduleEnum","formattedStreetAddress","streetObject","streetName","suburb","postcode","GoogleMapsContext","createContext","isGoogleMapLoaded","geocodeStreet","Promise","resolve","lat","lng","GoogleMapsContextProvider","googleMapsApiKey","children","useCallback","streetSchedule","a","Geocode","setApiKey","streetAddress","fromAddress","response","results","geometry","location","console","warn","isLoaded","useLoadScript","libraries","region","Provider","value","CbCityGraphQlContext","undefined","CbCityGraphQlContextProvider","apiClient","ApolloClient","uri","cache","InMemoryCache","useApiQuery","query","options","client","useContext","Error","useCbCityGraphqlClient","useQuery","notifyOnNetworkStatusChange","StreetDatasetContext","dataset","StreetDatasetContextProvider","useState","setDataset","useEffect","fetch","json","streetData","log","MoreInfoBlock","style","paddingLeft","textAlign","HeroImageSlider","images","settings","items","mode","animateDelay","slideBy","mouseDrag","autoplay","autoplayTimeout","autoplayHoverPause","autoplayButtonOutput","nav","navPosition","gutter","swipeAngle","controls","autoWidth","map","imageSrc","index","srcSet","type","data-src","CleaningActionImageSlider","onIndexChanged","sliderOptions","controlsText","useScrollToTop","pathname","useLocation","useLayoutEffect","window","scrollTo","MapActionType","STREET_MAP_INITIAL_STATE","center","zoom","pathCoordinates","SweeperMap","currentStreet","truckGpsData","mapRef","useRef","useReducer","prevState","action","pathLoaded","payload","streetFocus","reset","mapState","dispatchMapAction","getTruckMapActivityData","mapData","i","length","currentPoint","push","distanceInMeter","timeInSec","velocity","point1","latLng1","google","maps","LatLng","point2","latLng2","segmentDistance","spherical","computeDistanceBetween","segmentTime","epochTime","lastCoordinate","then","setAnimationCounter","animationCounter","markerProgress","setMarkerProgress","initialDate","useMemo","Date","moveTruckMarker","markerDistance","progress","filter","point","nextPoint","find","coordinate","previousPoint","previousPointLatLng","nextPointLatLng","deltaDistanceInMeter","percentage","position","interpolate","concat","callback","delay","savedCallback","current","id","setInterval","clearInterval","useInterval","mapContainerClassName","ref","minZoom","draggable","scrollwheel","clickable","zoomControl","mapTypeControl","scaleControl","streetViewControl","rotateControl","fullscreenControl","path","strokeColor","strokeWeight","icon","url","TruckMarkerIconSVG","scaledSize","height","width","anchor","x","y","StreetSearchBox","onSelectionChange","handleLookupError","clearLookup","inputFieldClassName","setItems","onChange","itemToString","item","onInputValueChange","inputValue","isOpen","cleanedInput","trim","toLowerCase","replace","matchingItems","startsWith","getInputProps","getItemProps","getMenuProps","clearSelection","highlightedIndex","selectedItem","onFocus","placeholder","required","listStyle","zIndex","key","color","padding","backgroundColor","fontWeight","APP_HOSTED_DOMAIN","SeoHelmet","title","description","rootUrl","websiteOgImageSrc","websiteOgImageJPEG","Helmet","name","content","property","LandingPage","heroImages","sliderPhotoExampleJPEG","galleryPhotoExampleJPEG","garbageTruckJPEG","cleaningImages","wasteCleanersJPEG","footPathCleanersJPEG","cleaningHoseJPEG","counterDisplay","count","history","useHistory","currentSlideIndex","setCurrentSlideIndex","lookupStreet","setLookupStreet","lookupError","setLookupError","onClick","search","state","searchStreet","hidden","marginTop","WarningCircleSVG","slide","displayIndex","LAST_STREET_SWEEP_BY_STREET_QUERY","gql","DATE_NOT_AVAILABLE","ResultPage","setCurrentStreet","setTruckGpsData","lastSweepDate","nextSweepDateRange","sweepScheduleDisplay","setSweepScheduleDisplay","queryParams","URLSearchParams","get","getStreetDataByAddress","variables","suburbName","skip","loading","data","graphqlLastStreetSweepByStreet","lastStreetSweepByStreet","gps_lat","gps_lon","gps_time","parseInt","lastStreetSweepData","objArray","lastSweepEpochTime","setDate","getDate","toLocaleDateString","year","month","day","getNextSweepDate","epochDateStr","setClearLookup","displayStreetAddress","readOnly","margin","background","borderRadius","e","preventDefault","App","component","exact","ResultsPage","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ensureEnv","process","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.06073c6e.chunk.js","sourcesContent":["export default \"data:image/png;base64,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\"","import React, { ReactElement } from \"react\";\nimport logoPNG from \"../assets/img/logo.png\";\n\nexport default function Footer(): ReactElement {\n return (\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/sprite.dcc897ad.svg\";","import React, { ReactElement } from \"react\";\nimport spriteSVG from \"../assets/img/svg/sprite.svg\";\n\nexport const SpriteIcon = ({\n iconName,\n className,\n}: {\n className?: string;\n iconName?: string;\n}): ReactElement => (\n \n \n \n);\n","import React, { ReactElement } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport logoPNG from \"../assets/img/logo.png\";\nimport { SpriteIcon } from \"../components/graphics\";\n\nexport default function Header(): ReactElement {\n return (\n
\n
\n
\n
\n
\n \n \n \n
\n
    \n
  • \n \n \n \n
  • \n
  • \n \n \n \n
  • \n
  • \n \n \n \n
  • \n
  • \n \n \n \n
  • \n
\n
\n
\n
\n
\n );\n}\n","// --- INFO: data source - streetData.json\nexport enum NextSweepScheduleEnum {\n empty = \"\",\n oneToTwoWeeks = \"1-2 weeks\",\n fiveToSixWeeks = \"5-6 weeks\",\n}\n\nexport interface StreetSweepingSchedule {\n readonly streetName: string;\n readonly suburb: string;\n readonly postcode: string;\n readonly nextSweepSchedule: string;\n}\n\n// --- INFO: data source - cb-city graphQL\nexport interface StreetSweeperGpsEvent {\n readonly unit_name?: string;\n readonly gps_time: string;\n readonly gps_lat: number;\n readonly gps_lon: number;\n}\n\nexport interface GoogleMapCoordinate {\n lat: number | null;\n lng: number | null;\n}\n\nexport interface SweeperTruckGpsData extends GoogleMapCoordinate {\n epochTime: number;\n}\n\nexport interface MapAnimationPathCoordinate extends GoogleMapCoordinate {\n epochTime: number;\n distanceInMeter: number;\n timeInSec: number;\n velocity: number;\n}\n","import { StreetSweepingSchedule } from \"../models\";\n\nexport const formattedStreetAddress = (\n streetObject: StreetSweepingSchedule\n) => {\n const { streetName, suburb, postcode } = streetObject;\n return `${streetName}, ${suburb} ${postcode}`;\n};\n\nexport const getLastItem = (objArray: ReadonlyArray) => {\n return objArray.length > 0 ? objArray[objArray.length - 1] : null;\n};\n\nexport const convertEpochToDisplayDate = (epochDateStr: string): string => {\n const dateObject = new Date(parseInt(epochDateStr));\n return dateObject.toLocaleDateString(\"en-AU\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n};\n","import React, {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n} from \"react\";\nimport { useLoadScript } from \"@react-google-maps/api\";\nimport { Libraries } from \"@react-google-maps/api/dist/utils/make-load-script-url\";\nimport Geocode from \"react-geocode\";\nimport { StreetSweepingSchedule, GoogleMapCoordinate } from \"../models\";\nimport { formattedStreetAddress } from \"../utils\";\n\ninterface GoogleMapsContextProps {\n readonly isGoogleMapLoaded: boolean;\n geocodeStreet: (\n street: StreetSweepingSchedule\n ) => Promise;\n}\n\nexport const GoogleMapsContext = createContext({\n isGoogleMapLoaded: false,\n geocodeStreet: () => Promise.resolve({ lat: null, lng: null }),\n});\n\ninterface GoogleMapsContextProviderProps {\n readonly googleMapsApiKey: string;\n readonly children: ReactNode;\n}\n\nexport function GoogleMapsContextProvider({\n googleMapsApiKey,\n children,\n}: GoogleMapsContextProviderProps): ReactElement {\n const geocodeStreet = useCallback(\n async (streetSchedule: StreetSweepingSchedule) => {\n if (streetSchedule) {\n try {\n Geocode.setApiKey(googleMapsApiKey);\n const streetAddress = formattedStreetAddress(streetSchedule);\n const response = await Geocode.fromAddress(streetAddress);\n const { lat, lng } = await response.results[0].geometry.location;\n return { lat, lng };\n } catch (error) {\n console.warn(\"Error geocoding address: \", streetSchedule, error);\n }\n }\n return { lat: null, lng: null };\n },\n [googleMapsApiKey]\n );\n\n const GOOGLE_MAPS_LIBRARIES: Libraries = [\"places\", \"geometry\"];\n const { isLoaded } = useLoadScript({\n googleMapsApiKey: googleMapsApiKey,\n libraries: GOOGLE_MAPS_LIBRARIES,\n region: \"AU\",\n });\n\n return (\n \n {children}\n \n );\n}\n","import React, {\n createContext,\n ReactElement,\n ReactNode,\n useContext,\n} from \"react\";\nimport {\n ApolloClient,\n DocumentNode,\n InMemoryCache,\n OperationVariables,\n QueryHookOptions,\n QueryResult,\n useQuery,\n} from \"@apollo/client\";\n\nexport const CbCityGraphQlContext = createContext<\n ApolloClient | undefined\n>(undefined);\n\ninterface CbCityGraphQlContextProviderProps {\n readonly children: ReactNode;\n}\n\nexport function CbCityGraphQlContextProvider({\n children,\n}: CbCityGraphQlContextProviderProps): ReactElement {\n const apiClient = new ApolloClient({\n uri: \"https://cbc-backend.azurewebsites.net/\",\n cache: new InMemoryCache(),\n });\n\n return (\n \n {children}\n \n );\n}\n\nexport const useCbCityGraphqlClient = (): ApolloClient => {\n const client = useContext(CbCityGraphQlContext);\n if (!client) {\n throw new Error(\"No graphql API context\");\n }\n return client;\n};\n\nexport function useApiQuery(\n query: DocumentNode,\n options?: Omit, \"client\">\n): QueryResult {\n const client = useCbCityGraphqlClient();\n return useQuery(query, {\n ...options,\n notifyOnNetworkStatusChange: true,\n client,\n });\n}\n","import React, {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { StreetSweepingSchedule } from \"../models\";\n\ninterface StreetDatasetContextProps {\n dataset: Array;\n}\n\nexport const StreetDatasetContext = createContext({\n dataset: [],\n});\n\nexport const StreetDatasetContextProvider = ({\n children,\n}: {\n children: ReactNode;\n}) => {\n const [dataset, setDataset] = useState([]);\n\n useEffect(() => {\n (async () => {\n try {\n const response = await fetch(\"./streetData.json\");\n const streetData = await response.json();\n setDataset(streetData);\n } catch (error) {\n console.log(\"Error Reading data: \", error);\n setDataset([]);\n }\n })();\n }, []);\n\n return (\n \n {children}\n \n );\n};\n\nexport const useStreetDataset = (): StreetDatasetContextProps => {\n const datasetContext = useContext(StreetDatasetContext);\n if (datasetContext === undefined) {\n throw new Error(\"No dataset context\");\n }\n return datasetContext;\n};\n","export default __webpack_public_path__ + \"static/media/warning-circle.727ed0aa.svg\";","export default __webpack_public_path__ + \"static/media/waste-cleansing-cleaners.aa5733bb.jpg\";","export default __webpack_public_path__ + \"static/media/waste-cleansing-footpath.595d6cc1.jpg\";","export default __webpack_public_path__ + \"static/media/waste-cleansing-hose.81e4d0a3.jpg\";","export default __webpack_public_path__ + \"static/media/waste-garbage-trucks.dbe32a6c.jpg\";","export default __webpack_public_path__ + \"static/media/slider-photo-example.6947b387.jpg\";","export default __webpack_public_path__ + \"static/media/gallery-photo-example.a55484ac.jpg\";","import React, { ReactElement } from \"react\";\n// import HandIconSVG from \"../assets/img/svg/hand.svg\";\n\nexport default function MoreInfoBlock(): ReactElement {\n return (\n
\n
\n
\n
\n {/* */}\n
\n \n

\n For more information about Canterbury‑Bankstown’s residential and\n CBD city cleaning initiatives\n

\n
\n \n Visit our page here\n \n
\n
\n
\n \n
\n );\n}\n","import React, { ReactElement } from \"react\";\nimport TinySlider from \"tiny-slider-react\";\n\ninterface HeroImageSliderProps {\n readonly images: Array;\n}\n\nexport default function HeroImageSlider({\n images,\n}: HeroImageSliderProps): ReactElement {\n const heroSliderOptions = {\n items: 1,\n mode: \"gallery\" as \"gallery\",\n animateDelay: 1000,\n slideBy: \"page\" as \"page\",\n mouseDrag: true,\n autoplay: true,\n autoplayTimeout: 4000,\n autoplayHoverPause: true,\n autoplayButtonOutput: false,\n nav: true,\n navPosition: \"bottom\",\n gutter: 0,\n swipeAngle: false,\n controls: false,\n autoWidth: false,\n };\n\n return (\n \n {images.map((imageSrc, index) => (\n
\n {/* Slider Item */}\n
\n \n \n \n \n
\n {/* /Slider Item */}\n
\n ))}\n
\n );\n}\n","import React, { ReactElement } from \"react\";\nimport TinySlider from \"tiny-slider-react\";\n\nimport spriteSVG from \"../assets/img/svg/sprite.svg\";\n\ninterface CleaningActionImageSliderProps {\n readonly images: Array;\n onIndexChanged: (slide: any) => void;\n}\n\nexport default function CleaningActionImageSlider({\n images,\n onIndexChanged,\n}: CleaningActionImageSliderProps): ReactElement {\n const customControls = [\n `\n \n \n \n `,\n `\n \n \n \n `,\n ];\n\n const sliderOptions = {\n items: 1,\n slideBy: \"page\" as \"page\",\n mouseDrag: true,\n autoplay: true,\n autoplayTimeout: 4000,\n autoplayHoverPause: true,\n autoplayButtonOutput: false,\n nav: false,\n navPosition: \"bottom\",\n gutter: 0,\n swipeAngle: false,\n controlsText: customControls,\n autoWidth: false,\n };\n\n return (\n \n {images.map((imageSrc, index) => (\n
\n
\n \n \n \n \n
\n
\n ))}\n
\n );\n}\n","import { useLayoutEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport default function useScrollToTop(): void {\n const { pathname } = useLocation();\n useLayoutEffect(() => window.scrollTo(0, 0), [pathname]);\n}\n","export default __webpack_public_path__ + \"static/media/map-marker.b072bab3.svg\";","import React, {\n ReactElement,\n Reducer,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport { GoogleMap, Marker, Polyline } from \"@react-google-maps/api\";\n\nimport {\n StreetSweepingSchedule,\n GoogleMapCoordinate,\n SweeperTruckGpsData,\n MapAnimationPathCoordinate,\n} from \"../models\";\nimport { useInterval } from \"../hooks\";\nimport { GoogleMapsContext } from \"../contexts\";\n\nimport TruckMarkerIconSVG from \"../assets/img/svg/map-marker.svg\";\n\ndeclare global {\n interface Window {\n google: {\n maps: any;\n };\n }\n}\n\ninterface StreetMapState {\n center: GoogleMapCoordinate;\n zoom: number;\n pathCoordinates: Array | null;\n}\n\nenum MapActionType {\n pathLoaded = \"pathLoaded\",\n streetFocus = \"streetFocus\",\n zoom = \"zoom\",\n reset = \"reset\",\n}\n\ntype StreetMapAction =\n | {\n type: MapActionType.pathLoaded;\n payload: { pathCoordinates: Array };\n }\n | {\n type: MapActionType.streetFocus;\n payload: { center: GoogleMapCoordinate };\n }\n | { type: MapActionType.zoom; payload: any }\n | { type: MapActionType.reset };\n\nconst GOOGLE_MAPS_DEFAULT_ZOOM = 19;\nconst GOOGLE_MAPS_DEFAULT_MAP_CENTER: GoogleMapCoordinate = {\n lat: -33.9150691,\n lng: 151.0361782,\n};\nconst TRUCK_MARKER_DEFAULT_VELOCITY = 10;\nconst STREET_MAP_INITIAL_STATE = {\n center: GOOGLE_MAPS_DEFAULT_MAP_CENTER,\n zoom: GOOGLE_MAPS_DEFAULT_ZOOM,\n pathCoordinates: null,\n};\n\nexport default function SweeperMap({\n currentStreet,\n truckGpsData,\n}: {\n readonly currentStreet: StreetSweepingSchedule | undefined;\n readonly truckGpsData: Array | undefined;\n}): ReactElement {\n const { isGoogleMapLoaded, geocodeStreet } = useContext(GoogleMapsContext);\n const mapRef = useRef(null);\n\n const [mapState, dispatchMapAction] = useReducer<\n Reducer\n >((prevState, action) => {\n switch (action.type) {\n case MapActionType.pathLoaded:\n const { pathCoordinates } = action.payload;\n return {\n ...prevState,\n zoom: 15,\n pathCoordinates,\n };\n case MapActionType.streetFocus:\n return {\n ...prevState,\n center: action.payload.center,\n };\n case MapActionType.zoom:\n return { ...prevState };\n case MapActionType.reset:\n return STREET_MAP_INITIAL_STATE;\n default:\n throw new Error();\n }\n }, STREET_MAP_INITIAL_STATE);\n\n const getTruckMapActivityData = (\n pathCoordinates: ReadonlyArray\n ): Array => {\n let mapData: MapAnimationPathCoordinate[] = [];\n\n for (let i = 0; i < pathCoordinates.length; i++) {\n const currentPoint = pathCoordinates[i];\n if (i === 0) {\n mapData.push({\n ...currentPoint,\n distanceInMeter: 0,\n timeInSec: 0,\n velocity: 0,\n });\n }\n\n const point1 = currentPoint;\n const latLng1 = new window.google.maps.LatLng(point1.lat, point1.lng);\n\n const point2 = pathCoordinates[i + 1];\n if (!point2) break;\n const latLng2 = new window.google.maps.LatLng(point2.lat, point2.lng);\n\n const segmentDistance = window.google.maps.geometry.spherical.computeDistanceBetween(\n latLng1,\n latLng2\n );\n const segmentTime = (point2.epochTime - point1.epochTime) / 1000;\n const velocity = segmentDistance / segmentTime;\n\n const lastCoordinate = mapData[mapData.length - 1];\n const distanceInMeter = lastCoordinate.distanceInMeter + segmentDistance;\n const timeInSec = lastCoordinate.timeInSec + segmentTime;\n\n mapData.push({ ...currentPoint, distanceInMeter, timeInSec, velocity });\n }\n\n return mapData;\n };\n\n useEffect(() => {\n if (currentStreet) {\n geocodeStreet(currentStreet).then(({ lat, lng }) => {\n dispatchMapAction({\n type: MapActionType.streetFocus,\n payload: {\n center: { lat, lng },\n },\n });\n });\n\n if (truckGpsData && truckGpsData.length > 0) {\n setAnimationCounter(1);\n dispatchMapAction({\n type: MapActionType.pathLoaded,\n payload: {\n pathCoordinates: getTruckMapActivityData(truckGpsData),\n },\n });\n }\n }\n\n // return () => {\n // dispatchMapAction({ type: MapActionType.reset });\n // };\n }, [currentStreet, truckGpsData, geocodeStreet]);\n\n // ---- Marker Animation\n const [animationCounter, setAnimationCounter] = useState(0);\n const [markerProgress, setMarkerProgress] = useState(\n []\n );\n\n const initialDate = useMemo(() => {\n if (animationCounter && truckGpsData) {\n setMarkerProgress([]);\n }\n return new Date();\n }, [animationCounter, truckGpsData]);\n\n const moveTruckMarker = useCallback(() => {\n if (mapState.pathCoordinates) {\n const timeDiffInSeconds = (+new Date() - +initialDate) / 1000;\n const markerDistance = timeDiffInSeconds * TRUCK_MARKER_DEFAULT_VELOCITY; // d = v*t\n\n let progress = mapState.pathCoordinates.filter(\n (point) => point.distanceInMeter < markerDistance\n );\n const nextPoint = mapState.pathCoordinates.find((coordinate) => {\n return coordinate.distanceInMeter > markerDistance;\n });\n\n if (!nextPoint) {\n setAnimationCounter((prevState) => prevState + 1);\n return;\n }\n const previousPoint = progress[progress.length - 1];\n\n const previousPointLatLng = new window.google.maps.LatLng(\n previousPoint.lat,\n previousPoint.lng\n );\n const nextPointLatLng = new window.google.maps.LatLng(\n nextPoint.lat,\n nextPoint.lng\n );\n\n const deltaDistanceInMeter =\n nextPoint.distanceInMeter - previousPoint.distanceInMeter;\n const percentage =\n (markerDistance - previousPoint.distanceInMeter) / deltaDistanceInMeter;\n const position = window.google.maps.geometry.spherical.interpolate(\n previousPointLatLng,\n nextPointLatLng,\n percentage\n );\n\n progress = progress.concat(position);\n setMarkerProgress(progress);\n }\n }, [initialDate, mapState.pathCoordinates]);\n\n useInterval(() => {\n moveTruckMarker();\n }, 200);\n\n const { center, zoom, pathCoordinates } = mapState;\n\n return (\n <>\n {isGoogleMapLoaded && (\n \n {pathCoordinates ? (\n <>\n \n {markerProgress.length > 0 && (\n \n )}\n \n \n ) : (\n \n )}\n \n )}\n \n );\n}\n","import { useEffect, useRef } from \"react\";\n\nexport default function useInterval(callback: any, delay: number) {\n const savedCallback = useRef();\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n const tick = () => {\n savedCallback.current();\n };\n\n if (delay !== null) {\n let id = setInterval(tick, delay);\n return () => clearInterval(id);\n }\n }, [delay]);\n}\n","import React, { ReactElement, useContext, useState } from \"react\";\nimport Downshift from \"downshift\";\n\nimport { StreetDatasetContext } from \"../contexts\";\nimport { StreetSweepingSchedule } from \"../models\";\n\ninterface StreetSelectDropdownProps {\n onSelectionChange: (selection: any) => void;\n handleLookupError: (errorMsg: string | null) => void;\n clearLookup?: boolean;\n inputFieldClassName: string;\n}\n\nexport default function StreetSearchBox({\n onSelectionChange,\n handleLookupError,\n clearLookup,\n inputFieldClassName,\n}: StreetSelectDropdownProps): ReactElement {\n const { dataset } = useContext(StreetDatasetContext);\n const [items, setItems] = useState>([]);\n\n return (\n \n item ? `${item.streetName}, ${item.suburb} ${item.postcode}` : \"\"\n }\n onInputValueChange={async (inputValue, { isOpen }) => {\n handleLookupError(null);\n if (isOpen && inputValue.length >= 2) {\n const cleanedInput = inputValue\n .trim()\n .toLowerCase()\n .replace(/[^\\w\\s]/gi, \"\");\n const matchingItems = dataset.filter((item: StreetSweepingSchedule) =>\n item.streetName.toLowerCase().startsWith(cleanedInput)\n );\n\n setItems(matchingItems);\n if (matchingItems.length === 0) {\n handleLookupError(\n \"No street by that name exists in the Canterbury-Bankstown region.\"\n );\n }\n } else {\n setItems([]);\n }\n }}\n >\n {({\n getInputProps,\n getItemProps,\n getMenuProps,\n clearSelection,\n highlightedIndex,\n selectedItem,\n }) => {\n if (clearLookup) clearSelection();\n\n return (\n
\n clearSelection(),\n })}\n type=\"search\"\n className={`input ${inputFieldClassName}`}\n placeholder=\"Enter your street name ...\"\n required\n />\n \n {items.map((item, index) => (\n \n {item.streetName}, {item.suburb} {item.postcode}\n \n ))}\n \n
\n );\n }}\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/stsweep-og.861bc5f0.jpg\";","import React, { ReactElement, ReactNode } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { useLocation } from \"react-router-dom\";\nimport websiteOgImageJPEG from \"../assets/img/stsweep-og.jpg\";\n\nconst APP_HOSTED_DOMAIN = \"stsweep.azurewebsites.net\";\n\ninterface SeoHelmetProps {\n title: string;\n description: string;\n children?: ReactNode;\n}\n\nexport default function SeoHelmet({\n title = \"Street Sweeping - City of Canterbury Bankstown\",\n description,\n children,\n}: SeoHelmetProps): ReactElement {\n const { pathname } = useLocation();\n const rootUrl = `https://${APP_HOSTED_DOMAIN}${pathname}`;\n const websiteOgImageSrc = `https://${APP_HOSTED_DOMAIN}${websiteOgImageJPEG}`;\n\n return (\n \n {title}\n \n \n \n \n \n \n \n \n \n \n \n \n {children}\n \n );\n}\n","import React, { ReactElement, useState } from \"react\";\n\nimport WarningCircleSVG from \"../assets/img/svg/warning-circle.svg\";\n\nimport wasteCleanersJPEG from \"../assets/img/cleaners/waste-cleansing-cleaners.jpg\";\nimport footPathCleanersJPEG from \"../assets/img/cleaners/waste-cleansing-footpath.jpg\";\nimport cleaningHoseJPEG from \"../assets/img/cleaners/waste-cleansing-hose.jpg\";\nimport garbageTruckJPEG from \"../assets/img/cleaners/waste-garbage-trucks.jpg\";\n\nimport sliderPhotoExampleJPEG from \"../assets/img/slider-photo-example.jpg\";\nimport galleryPhotoExampleJPEG from \"../assets/img/gallery-photo-example.jpg\";\n\nimport MoreInfoBlock from \"../components/MoreInfoBlock\";\nimport { Link, useHistory } from \"react-router-dom\";\nimport HeroImageSlider from \"../components/HeroImageSlider\";\nimport CleaningActionImageSlider from \"../components/CleaningActionImageSlider\";\nimport { StreetSearchBox, SeoHelmet } from \"../components\";\n\nimport { StreetSweepingSchedule } from \"../models\";\nimport { useScrollToTop } from \"../hooks\";\n\nexport default function LandingPage(): ReactElement {\n useScrollToTop();\n\n const heroImages = [\n sliderPhotoExampleJPEG,\n galleryPhotoExampleJPEG,\n garbageTruckJPEG,\n ];\n\n const cleaningImages = [\n wasteCleanersJPEG,\n footPathCleanersJPEG,\n cleaningHoseJPEG,\n garbageTruckJPEG,\n ];\n\n const counterDisplay = (count: number): string => {\n return count < 10 ? `0${count}` : `${count}`;\n };\n\n const history = useHistory();\n\n const [currentSlideIndex, setCurrentSlideIndex] = useState(1);\n const [lookupStreet, setLookupStreet] = useState();\n const [lookupError, setLookupError] = useState(null);\n\n return (\n
\n \n {/* Page Hero */}\n
\n
\n
\n
\n
\n

Street Sweeping Tracker

\n

\n Find out when your street will next be swept\n

\n
\n \n {\n if (lookupStreet) {\n const { streetName, suburb, postcode } = lookupStreet;\n history.push({\n pathname: \"/results\",\n search: `streetName=${streetName}&suburb=${suburb}&postcode=${postcode}`,\n state: {\n searchStreet: lookupStreet,\n },\n });\n }\n }}\n >\n Go\n \n \n \n {lookupError && (\n
{lookupError}
\n )}\n
\n
\n
\n \n
\n
\n {/* Logo */}\n {/* */}\n {/* /Logo */}\n
\n
\n
\n {/* Report */}\n
\n
\n
\n \n
\n
\n

Submit a report

\n
\n If you see illegally dumped rubbish or anything else you think\n we have missed, please call us on{\" \"}\n 9707 9000 or{\" \"}\n \n submit an online report.\n \n
\n
\n
\n
\n {/* /Report */}\n
\n {/* /Page Hero */}\n {/* Sections */}\n
\n
\n
\n

Street Sweeping

\n

\n There are almost 2,400 streets in our city and we aim to sweep\n each street at least once every six weeks. Some streets are swept\n more frequently than others depending on the location and amount\n of rubbish and leaf litter in the street. Streets located within\n our main town centres are swept every night.\n

\n

\n Our large street sweeper trucks are fitted with GPS data systems\n meaning you can now use the above search tool to see when your\n street was last swept as well as the expected time frame for the\n street to be swept again.\n

\n
\n
\n
\n {/* /Sections */}\n {/* Cleaners */}\n
\n
\n
\n
\n
\n {\n if (slide && slide.displayIndex) {\n setCurrentSlideIndex(slide.displayIndex);\n }\n }}\n />\n
\n
\n
\n

\n Our street sweepers and cleaners in action\n

\n
\n \n {counterDisplay(currentSlideIndex)}\n \n /\n \n {counterDisplay(cleaningImages.length)}\n \n
\n {/* Logo */}\n {/* */}\n {/* /Logo */}\n
\n
\n
\n
\n {/* /Cleaners */}\n \n
\n );\n}\n","import { gql } from \"@apollo/client\";\nimport { StreetSweeperGpsEvent } from \"./models\";\n\nexport interface LastStreetSweepByStreetQueryType {\n readonly lastStreetSweepByStreet: ReadonlyArray;\n}\n\nexport const LAST_STREET_SWEEP_BY_STREET_QUERY = gql`\n query lastStreetSweepByStreetQuery(\n $streetName: String!\n $suburbName: String!\n ) {\n lastStreetSweepByStreet(\n query: {\n streetName: $streetName\n suburbName: $suburbName\n mode: FromFirstSweepToLastSweep\n }\n ) {\n gps_time\n gps_lat\n gps_lon\n }\n }\n`;\n","import React, {\n ReactElement,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\nimport {\n MoreInfoBlock,\n SpriteIcon,\n StreetSearchBox,\n SweeperMap,\n} from \"../components\";\nimport { StreetSweepingSchedule, SweeperTruckGpsData } from \"../models\";\nimport {\n convertEpochToDisplayDate,\n formattedStreetAddress,\n getLastItem,\n getNextSweepDate,\n} from \"../utils\";\nimport { useScrollToTop } from \"../hooks\";\nimport { useApiQuery } from \"../contexts\";\n\nimport {\n LastStreetSweepByStreetQueryType,\n LAST_STREET_SWEEP_BY_STREET_QUERY,\n} from \"../graphql\";\nimport { SeoHelmet } from \"../components\";\nimport { StreetDatasetContext } from \"../contexts\";\n\ninterface ResultsPageLocationState {\n searchStreet: StreetSweepingSchedule;\n}\n\nconst DATE_NOT_AVAILABLE = \"NA\";\ninterface SweepScheduleDisplayState {\n lastSweepDate: string;\n nextSweepDateRange: string;\n}\n\nexport default function ResultPage(): ReactElement {\n useScrollToTop();\n const { state, search } = useLocation();\n\n const [currentStreet, setCurrentStreet] = useState();\n const [lookupStreet, setLookupStreet] = useState();\n const [lookupError, setLookupError] = useState(null);\n const [truckGpsData, setTruckGpsData] = useState();\n\n const [\n sweepScheduleDisplay,\n setSweepScheduleDisplay,\n ] = useState({\n lastSweepDate: \"\",\n nextSweepDateRange: \"\",\n });\n\n const queryParams = new URLSearchParams(search);\n const streetName = queryParams.get(\"streetName\");\n const suburb = queryParams.get(\"suburb\");\n const postcode = queryParams.get(\"postcode\");\n\n const { dataset } = useContext(StreetDatasetContext);\n\n const getStreetDataByAddress = useCallback(\n (streetName: string, suburb: string, postcode: string) => {\n return dataset.find((item) => {\n return (\n item.streetName === streetName &&\n item.suburb === suburb &&\n item.postcode === postcode\n );\n });\n },\n [dataset]\n );\n\n useEffect(() => {\n if (state && state.searchStreet) {\n setSweepScheduleDisplay({\n lastSweepDate: \"Loading ...\",\n nextSweepDateRange: \"Loading ...\",\n });\n setCurrentStreet(state.searchStreet);\n } else {\n if (streetName && suburb && postcode) {\n setSweepScheduleDisplay({\n lastSweepDate: \"Loading ...\",\n nextSweepDateRange: \"Loading ...\",\n });\n setCurrentStreet(getStreetDataByAddress(streetName, suburb, postcode));\n }\n }\n }, [state, streetName, suburb, postcode, getStreetDataByAddress]);\n\n const { loading, data } = useApiQuery(\n LAST_STREET_SWEEP_BY_STREET_QUERY,\n {\n variables: {\n streetName: currentStreet?.streetName,\n suburbName: currentStreet?.suburb,\n },\n skip: !currentStreet,\n }\n );\n\n const graphqlLastStreetSweepByStreet = data\n ? data.lastStreetSweepByStreet\n : null;\n\n useEffect(() => {\n if (graphqlLastStreetSweepByStreet && currentStreet) {\n const pathCoordinates = graphqlLastStreetSweepByStreet.map(\n ({ gps_lat, gps_lon, gps_time }) => ({\n lat: gps_lat,\n lng: gps_lon,\n epochTime: parseInt(gps_time),\n })\n );\n setTruckGpsData(pathCoordinates);\n\n const lastStreetSweepData = getLastItem(graphqlLastStreetSweepByStreet);\n if (lastStreetSweepData) {\n const nextSweepDateRange = getNextSweepDate(\n lastStreetSweepData.gps_time\n );\n setSweepScheduleDisplay({\n lastSweepDate: convertEpochToDisplayDate(\n lastStreetSweepData.gps_time\n ),\n nextSweepDateRange,\n });\n } else {\n setSweepScheduleDisplay({\n lastSweepDate: DATE_NOT_AVAILABLE,\n nextSweepDateRange: DATE_NOT_AVAILABLE,\n });\n }\n }\n }, [loading, currentStreet, graphqlLastStreetSweepByStreet]);\n\n const [clearLookup, setClearLookup] = useState(false);\n useEffect(() => {\n if (sweepScheduleDisplay) {\n setClearLookup(false);\n }\n }, [sweepScheduleDisplay]);\n\n const displayStreetAddress = currentStreet\n ? formattedStreetAddress(currentStreet)\n : \"\";\n\n const { lastSweepDate, nextSweepDateRange } = sweepScheduleDisplay;\n\n return (\n
\n \n
\n
\n
\n
\n
\n \n \n \n

\n Street Sweep Tracker\n

\n
\n
\n \n \n {displayStreetAddress}\n \n
\n \n {lastSweepDate === DATE_NOT_AVAILABLE && (\n \n Our street sweeper data for this street has not been updated\n yet. Please check back soon.\n
\n )}\n \n
\n \n {\n e.preventDefault();\n if (lookupStreet) {\n if (currentStreet !== lookupStreet) {\n setCurrentStreet(lookupStreet);\n setSweepScheduleDisplay({\n lastSweepDate: \"Loading...\",\n nextSweepDateRange: \"Loading...\",\n });\n setClearLookup(true);\n }\n }\n }}\n >\n Go\n \n \n {lookupError && (\n
{lookupError}
\n )}\n
\n \n
\n \n
\n\n \n
\n );\n}\n","/*\nUPDATE 20 Dec, 2022 [ref email: \"Street Sweeper Website Update\"]\n- The street sweeper will now sweep every 14 days for all streets in the CB City.\n*/\nexport default function getNextSweepDate(lastSweepEpochTime: string): string {\n const lastSweepDate = new Date(parseInt(lastSweepEpochTime));\n lastSweepDate.setDate(lastSweepDate.getDate() + 14);\n return lastSweepDate.toLocaleDateString(\"en-AU\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n","import React from \"react\";\nimport { BrowserRouter, Switch, Route } from \"react-router-dom\";\nimport Footer from \"./components/Footer\";\nimport Header from \"./components/Header\";\nimport { StreetDatasetContextProvider } from \"./contexts\";\nimport { LandingPage, ResultsPage } from \"./pages\";\n\nfunction App() {\n return (\n \n \n
\n \n \n \n \n