{"version":3,"sources":["components/leaflet/icons/stopIcon.png","components/leaflet/icons/selectedStopIcon.png","components/leaflet/icons/ticketOfficeIcon.png","components/leaflet/icons/selectedTicketOfficeIcon.png","components/leaflet/icons/lineInfoStopIcon.png","components/leaflet/icons/lineInfoSelectedStopIcon.png","components/leaflet/icons/routeOriginIcon.png","components/leaflet/icons/routeDestinationIcon.png","components/leaflet/icons/vehicle.png","components/nav/MenuItem.js","resources/strings.js","components/nav/NavMenu.js","components/Footer.js","components/Layout.js","api/APICentral.js","api/APIEncoder.js","api/SearchAPI.js","components/commands/SearchCommand.js","components/SearchBarResults.js","components/SearchBar.js","api/StopAPI.js","components/commands/StopCommand.js","api/POIAPI.js","components/commands/POICommand.js","api/ProviderAPI.js","components/commands/ProviderCommand.js","components/leaflet/StopIcons.js","components/RecenterButton.js","components/FilterLinesButton.js","components/nextdepartures/StopPassingInfo.js","components/nextdepartures/LinePathInfoMap.js","components/nextdepartures/LinePathInfo.js","api/TripAPI.js","components/commands/TripCommand.js","components/nextdepartures/LineInfoMap.js","components/nextdepartures/LineInfo.js","api/ScheduleAPI.js","components/commands/ScheduleCommand.js","components/libs/react-modern-calendar-datepicker/src/shared/constants.js","components/libs/react-modern-calendar-datepicker/src/shared/generalUtils.js","components/libs/react-modern-calendar-datepicker/src/shared/localeLanguages.js","components/libs/react-modern-calendar-datepicker/src/shared/localeUtils.js","components/libs/react-modern-calendar-datepicker/src/shared/hooks.js","components/libs/react-modern-calendar-datepicker/src/shared/sliderHelpers.js","components/libs/react-modern-calendar-datepicker/src/components/Header.js","components/libs/react-modern-calendar-datepicker/src/shared/keyboardNavigation.js","components/libs/react-modern-calendar-datepicker/src/components/MonthSelector.js","components/libs/react-modern-calendar-datepicker/src/components/YearSelector.js","components/libs/react-modern-calendar-datepicker/src/components/DaysList.js","components/libs/react-modern-calendar-datepicker/src/Calendar.js","components/libs/react-modern-calendar-datepicker/src/DatePickerInput.js","components/libs/react-modern-calendar-datepicker/src/DatePicker.js","components/nextdepartures/MoreSchedules.js","components/Disclaimer.js","components/nextdepartures/NextDepartures.js","api/PlanRouteAPI.js","components/commands/PlanRouteCommand.js","components/SwitchDirectionButton.js","components/planroute/AllRoutesView.js","components/planroute/DetailedRouteMap.js","components/planroute/RouteDetailedView.js","components/planroute/PlanRoute.js","components/schedules/Schedules.js","components/schedules/SchedulesByStop.js","api/ContactAPI.js","components/commands/ContactCommand.js","components/Contact.js","api/MessageAPI.js","components/commands/MessageCommand.js","components/messages/Messages.js","components/NotFound.js","api/LogoAPI.js","components/commands/LogoCommand.js","components/about/About.js","components/LandingPage.js","components/info/TicketInfo.js","components/info/ServiceOnDemand.js","components/info/TicketOffice.js","components/info/PrivacyPolicy.js","App.js","registerServiceWorker.js","index.js"],"names":["module","exports","MenuItem","props","state","showLabel","this","setState","icon","label","to","hidden","className","key","toLowerCase","replace","onMouseLeave","collapseLabelHandler","onMouseEnter","expandLabelHandler","Component","strings","LocalizedStrings","en","home","nextDepartures","nextDeparturesFrom","network","planRoute","schedules","schedulesByLine","schedulesByStop","schedulesDisclaimer","messages","ticketOffice","about","searchPlaceholder","originStopPlaceHolder","destinationStopPlaceHolder","destination","planRouteButton","plannedRoutes","duration","includes","changes","planRouteTimeFilterSelectNow","planRouteTimeFilterSelectStartDate","planRouteTimeFilterSelectedStartDate","planRouteTimeFilterSelectEndDate","planRouteTimeFilterSelectedEndDate","planRouteTimeDisclaimer","checkSchedules","availableLines","walkAround","estimatedWaitingTime","arrivalEstimatedAt","and","or","lineInfoStopsTitle","lineInfoMoreScheds","showStops","showSchedule","showTrip","showMap","moreSchedsTitle","noMessagesToShow","noPassingsToShow","noTripsToShow","noInfoToShow","selectDate","provider","line","viewLine","selectPath","direction","directionGo","directionReturn","directionCircular","daytype","locale","hoursFilter","initialHourFilter","finalHourFilter","filter","close","done","copyright","allRightsReserved","privacyPolicy","notFoundTitle","notFoundDescription","developedFor","contact","name","email","emailWarning","subject","send","general","emailSuccess","emailError","pageNotFound","delayed","aheadSchedule","complaints","complaintsBook","phone","sendMessage","seeMore","passengerRights","ticketInfo","serviceOnDemand","moreInfoSoon","fares","tickets","ticketsDownload","landingPageRoutePlanning","landingPageNetwork","landingPageTickets","landingPageServiceOnDemand","landingPageContacts","simpleTicket","kmSteps","full","half","code","driverFare","prePurchased","automatedLines","lineSubscriptions","discount60","discount25","disclaimer","contactComplaints","contactHeader","contactWorkingDays","contactSaturdays","contactSundays","contactsPrivacyDisclaimer","contactsPrivacyCheckbox","notes","simpleOnBoard","fullAndHalf","fullAndHalfConditions","fullAndHalfConditionA","fullAndHalfConditionB","fullAndHalfConditionC","prebought","preboughtConditions","preboughtConditionA","preboughtConditionB","preboughtConditionC","monthly","monthlyConditions","monthlyConditionA","monthlyConditionB","monthlyConditionC","monthlyConditionD","monthlyConditionE","monthlyRequirements","monthlyRequirementA","monthlyRequirementB","passCIM","passCIMConditions","passCIMConditionA","passCIMConditionB","passCIMConditionC","passCIMConditionD","passCIMConditionE","passCIMConditionF","passCIMConditionG","passCIMRequirements","passCIMRequirementA","passCIMRequirementB","passes418s23","pass418","passS23","passes418s23ConditionA","passes418s23ConditionB","passes418s23ConditionC","passes418s23ConditionD","passes418s23ConditionE","pass418ConditionF","passS23ConditionF","passes418s23MoreInfo","passes418s23Faqs","pass418Users","pass418Requirements","pass418RequirementA","pass418RequirementB","pass418RequirementC","pass418Renewal","passS23Conditions","passS23Requirements","passS23RequirementA","passS23RequirementB","passS23RequirementC","passS23Renewal","passAntigoCombatente","passAntigoCombatenteDescription","passAntigoCombatenteUsersAndConditions","passAntigoCombatenteConditionA","passAntigoCombatenteConditionB","passAntigoCombatenteConditionC","passAntigoCombatenteConditionD","passAntigoCombatenteMoreInfo","passAntigoCombatenteLink","pt","NavMenu","toggleNavbar","bind","collapsed","languageKey","updateLanguage","context","isMenuOpen","onClick","toggleMenuHandler","width","src","alt","changeLanguage","displayName","contextTypes","PropTypes","func","Footer","marginClass","Container","fluid","href","target","rel","Layout","getMenuState","setMenuState","Row","Col","children","HTTPMethod","ContentType","API","modelState","response","forEach","value","concat","parameters","justContent","headers","Headers","contentType","set","undefined","token","fetch","url","method","body","then","a","ok","text","responseText","responseJSON","JSON","parse","message","responsePrint","concatResponse","error","status","statusText","trim","catch","APIEncoder","timestampEncoder","currentDate","Date","timestamp","getTime","i","length","charAt","getUTCMonth","getUTCDay","searchApiRoutes","SearchAPI","query","authenticatedRequest","getApiKey","SearchCommand","successCallback","errorCallback","performSearch","result","err","SearchBarResults","type","imgUrl","getLogo","height","data","onSelect","ListGroup","map","index","ListGroupItem","renderProviderLogo","renderResultName","renderResultType","SearchBar","timeoutId","stateKey","commands","stops","searchText","showResults","results","getState","caller","e","clearTimeout","setTimeout","onSearchClear","stop","recenter","r","searchSuccessCallback","resultsClassName","resultsToDisplay","determineResultsToDisplay","handleResultClick","placeholder","isRequired","id","onChange","updateSearchText","onFocus","handleFocus","autoComplete","required","clearSearchText","renderResults","stopApiRoutes","StopAPI","latitude","longitude","radius","stopId","StopCommand","getNearStops","getStopTimes","poiApiRoutes","POIAPI","POICommand","getNearPOI","providerApiRoutes","ProviderAPI","providerName","lineIds","ProviderCommand","getProviders","getProviderLines","getProviderLinePaths","stopIcon","L","Icon","iconUrl","require","iconAnchor","Point","iconSize","selectedStopIcon","ticketOfficeIcon","selectedTicketOfficeIcon","lineInfoStopIcon","lineInfoSelectedStopIcon","routeOriginIcon","routeDestinationIcon","vehicleIcon","clusterIcon","cluster","html","getChildCount","divIcon","point","RecenterButton","FilterLinesButton","StopPassingInfo","poi","nearStops","nearTO","lines","linesToDisplay","linePaths","linePathsToDisplay","mapRadius","selectedStop","selectedTO","selectedLine","displayLinesDropdown","isLoadingPassings","isToRecenter","displayLinesFilter","center","setMapCenter","lat","lng","mapCenter","getMapCenter","parseInt","getNearStopsSuccessCallback","find","s","getNearPOISuccessCallback","providersSuccessCallback","providerLinesSuccessCallback","sort","b","localeCompare","obj","join","providerLinePathsSuccessCallback","getStopTimesSuccessCallback","passings","place","handleStopSelection","handleTicketOfficeSelection","handleLineSelection","coordX","coordY","onSelectLine","l","paths","p","lineId","path","passing","onSelectPassing","checkbox","checked","push","newPaths","newLines","h","Math","floor","m","lineColor","lineColorFormatted","g","findIndex","xs","sm","handleSearchClear","renderPassingsList","Spinner","animation","role","handlePassingSelection","lineCode","isRT","formatDuration","description","isCheckboxChecked","handleLineCheckboxClick","shape","Array","isArray","segments","Fragment","segment","idx","Polyline","positions","breakpoints","breakpoint","color","determinePathColor","eventHandlers","click","handlePathSelection","places","handleSearchResultSelection","renderLinesFilter","filterLines","renderPassingInfos","renderTicketOfficeInfo","MapContainer","zoom","scrollWheelZoom","TileLayer","attribution","MapEvents","setCenter","SetViewOnClick","coords","renderPath","spiderfyOnMaxZoom","disableClusteringAtZoom","showCoverageOnHover","iconCreateFunction","Marker","position","determineStopIcon","Tooltip","determineTOIcon","useMap","setView","getZoom","args","useMapEvents","dragend","getCenter","distanceTo","getBounds","getNorthWest","zoomend","LinePathInfoMap","maxLatitude","maxLongitude","minLatitude","minLongitude","selectedPathStop","renderTooltip","makeTooltipsPermanent","isPermanent","permanent","bounds","SetBounds","Pane","renderPathStops","fitBounds","LinePathInfo","selectedPath","displayPathInfo","displayMap","displayPathsDropdown","window","onresize","resize","innerWidth","button","document","getElementById","Promise","renderPathHeader","onReturn","Button","variant","togglePathsDropdown","renderPathsDropdown","handleSelectedPathStop","renderInfo","tripApiRoutes","TripAPI","tripId","vehicleNr","vehicleTrip","TripCommand","getTrip","getEstimatedTrip","getTripsByLineAndDayType","getVehiclePosition","LineInfoMap","trips","vehiclePosition","intervalId","realTimePassing","onUpdateBusPosition","setInterval","clearInterval","onUpdateBusPositionSuccessCallback","trip","tripPassing","selectedTripPassing","x","y","order","stopCode","LineInfo","isLoadingTrip","displayTripInfo","minuteDelay","getTripSuccessCallback","selectedPassing","now","scheduleTime","getFullYear","getMonth","getDate","timeStamp","calculatedTime","diff","onMoreSchedsClick","renderTripHeader","renderTrip","abs","handleTripRefresh","handleSelectTripPassing","renderMoreSchedsButton","formattedTimeStamp","isSelectedStop","handleMoreSchedsClick","scheduleApiRoutes","ScheduleAPI","date","ScheduleCommand","getScheduleByLineAndDate","getScheduleByLineGroupByDayType","PERSIAN_NUMBERS","createUniqueRange","number","startingId","from","keys","isSameDay","day1","day2","day","month","year","putZero","toString","shallowClone","getDateAccordingToMonth","toSum","newMonthIndex","newYear","hasProperty","object","propertyName","Object","prototype","hasOwnProperty","call","getValueType","TypeError","localeLanguages","months","weekDays","short","isWeekend","weekStartingIndex","getToday","toNativeDate","getMonthLength","transformDigit","nextMonth","previousMonth","openMonthSelector","openYearSelector","closeMonthSelector","closeYearSelector","defaultPlaceholder","digitSeparator","yearLetterSkip","isRtl","gregorainTodayObject","digit","fa","jalaali","toJalaali","jy","jm","jd","gregorian","toGregorian","toExtendedDay","gy","gm","gd","jalaaliMonthLength","split","letter","Number","getLocaleDetails","utils","monthsList","localeGetToday","getLanguageDigits","todayDate","getMonthName","getMonthNumber","monthName","indexOf","getMonthFirstWeekday","getDay","isBeforeDate","checkDayInDayRange","nativeDay","nativeFrom","nativeTo","useLocaleUtils","useMemo","useLocaleLanguage","getLanguageText","getSlideDate","parent","isInitialActiveChild","activeDate","monthChangeDirection","child","classList","contains","animateContent","wrapperChildren","shownItem","hiddenItem","baseClass","isNextMonth","getAnimationClass","style","transition","add","handleSlideAnimationEnd","remove","Header","maximumDate","minimumDate","onMonthChange","onMonthSelect","onYearSelect","isMonthSelectorOpen","isYearSelectorOpen","headerElement","useRef","monthYearWrapperElement","useEffect","current","isOpen","monthText","querySelector","yearText","nextSibling","hasActiveBackground","element","arrows","querySelectorAll","hasMonthSelectorToggled","primaryElement","secondaryElement","translateXDirection","scale","translateX","offsetWidth","setAttribute","removeAttribute","transform","toggle","arrow","isHidden","isNextMonthArrowDisabled","isPreviousMonthArrowDisabled","onMonthChangeTrigger","some","monthYearButtons","getMonthYearText","isActiveMonth","hiddenStatus","onAnimationEnd","String","aria-label","tabIndex","ref","disabled","data-testid","handleArrowKeys","allowVerticalArrows","activeElement","getNthChildSafe","getStandardItem","item","hasAttribute","parentElement","nextRow","previousRow","previousSibling","previousRowLength","getVerticalSibling","row","downSibling","upSibling","dataset","isDefaultSelectable","focusIfAvailable","preventDefault","focus","MonthSelector","monthSelector","classToggleMethod","onKeyDown","handleKeyboardNavigation","persianMonth","monthNumber","monthDate","isAfterMaximumDate","isBeforeMinimumDate","isSelected","aria-pressed","data-is-default-selectable","YearSelector","selectorStartingYear","selectorEndingYear","wrapperElement","yearListElement","startingYearValue","endingYearValue","allYears","activeSelectorYear","RangeError","scrollTop","offsetTop","offsetHeight","defaultProps","DaysList","onSlideChange","disabledDays","onDisabledDayError","calendarTodayClassName","calendarSelectedDayClassName","calendarRangeStartClassName","calendarRangeEndClassName","calendarRangeBetweenClassName","shouldHighlightWeekends","isQuickSelectorOpen","customDaysClassName","calendarSectionWrapper","weekDaysList","today","getDayRangeValue","clonedDayRange","stringify","dayRangeValue","dayRangeProp","includingDisabledDay","disabledDay","handleDayClick","newValue","isAlreadyExisting","valueDay","addedToValue","removedFromValue","getMultiDateValue","getNewValue","getDayStatus","dayItem","isToday","valueType","isSingleDateSelected","startingDay","endingDay","isStartingDayRange","isEndingDayRange","isWithinRange","handleDayPress","isDisabled","renderEachWeekDays","isStandard","isInDisabledDaysRange","weekDayItem","weekDayItemIndex","additionalClass","customDayItemClassName","getDayClassNames","dayLabel","isOnActiveSlide","dayStatus","shouldEnableKeyboardNavigation","isDayReachableByKeyboard","aria-disabled","aria-selected","renderMonthDays","allDays","prependingBlankDays","standardDays","getViewMonthDays","weekRowIndex","eachWeekDays","slice","Calendar","calendarClassName","colorPrimary","colorPrimaryLight","slideAnimationDuration","renderFooter","calendarElement","useState","mainState","setMainState","handleKeyUp","addEventListener","removeEventListener","createStateToggler","property","toggleMonthSelector","toggleYearSelector","getComputedActiveDate","weekdays","weekDay","title","newMonthNumber","DatePickerInput","React","forwardRef","inputPlaceholder","inputClassName","inputName","formatInputText","renderInput","fromWord","toWord","getSingleDayValue","getValue","fromText","toText","placeholderValue","readOnly","DatePicker","wrapperClassName","calendarPopperPosition","calendarContainerElement","inputElement","shouldPreventToggle","isCalendarOpen","setCalendarVisiblity","handleBlur","blur","useLayoutEffect","getBoundingClientRect","left","top","documentElement","clientWidth","clientHeight","isOverflowingFromRight","isOverflowingFromLeft","isOverflowingFromBottom","overflowFromRightDistance","overflowFromLeftDistance","rightPosition","getLeftStyle","onBlur","persist","isInnerElementFocused","relatedTarget","onKeyUp","onMouseDown","MoreSchedules","hoursArray","initalHourIndex","finalHourIndex","selectedDate","showTimeFilterPanel","displayScheduleInfo","getSchedule","toISOString","getScheduleSuccessCallback","populateHoursArray","hours","initialTimeStamp","finalTimeStamp","initialHour","finalHour","initialHourIndex","newDateObject","show","filterPassings","hour","handleShowTimeFilter","handleSelectedDate","renderTimePickers","DropdownButton","formatHour","handleInitialHourSelection","Dropdown","Item","eventKey","handleFinalHourSelection","filteredPassings","renderHeader","renderFilters","renderPassings","renderScreens","Disclaimer","NextDepartures","stopPassingInfoRef","createRef","render","component","available","stopPassingInfo","callbacks","onChangeView","linePathInfo","lineInfo","moreSchedules","view","createElement","assign","planRouteApiRoutes","PlanRouteAPI","request","originId","destinationId","PlanRouteCommand","calculateRoute","getLinesByOriginAndDestination","SwitchDirectionButton","switchDirections","AllRoutesView","originSearchBarRef","destinationSearchBarRef","mapRef","startTime","endTime","route","in","out","preferences","maxResultTrips","isArrivalTime","providers","walkSpeed","maximumRadius","username","ip","ticket","polylines","timeFilterSelection","displayResults","displayingResultsForTheFirstTime","planningRoutes","selectedDepartureDate","selectedDepartureTime","selectedArrivalDate","selectedArrivalTime","displayDepartureDateDatePicker","displayDepartureDateTimePicker","displayArrivalDateDatePicker","displayArrivalDateTimePicker","planRouteSuccessCallback","renderResultsPaths","reduce","previousValue","currentValue","defaultCoordinates","updateSearchTextWithoutSearching","renderRoutePath","getElementsByName","fire","forcedEvent","latlng","onSelectRoute","handleStartSearchBarClear","handleEndSearchBarClear","subTrips","isWalking","subtrip","st","origin","time","minute","toLocaleString","getHours","getMinutes","onSubmit","renderStopSelectionPanel","renderFiltersPanel","marginRight","handleStartStopSelection","handleEndStopSelection","data-bs-toggle","aria-expanded","determineSelectedTime","aria-labelledby","setStartDate","handleSelectStartDateOptionClick","handleSelectEndDateOptionClick","renderDepartureDateTimePicker","renderArrivalDateTimePicker","handleSelectedDepartureDate","determineTimePickerLabel","hour24Mode","switchToMinuteOnHourSelect","closeOnMinuteSelect","forceCoarseMinutes","onDoneClick","handleSelectedDepartureTime","doneButton","handleSelectedArrivalDate","handleSelectedArrivalTime","handleTripPanelClose","renderTripsInfo","handleTripSelected","renderTripChanges","departureTimeToShow","arrivalTimeToShow","nonWalkingSubtrips","renderSubtripChangesInfo","components","polyline","subTrip","tripIdx","subTripIdx","dashArray","output","renderPolyLine","reverse","determineTicketOfficeIcon","renderPlanRouteInfo","renderTrips","whenCreated","mapInstance","renderNearStops","renderNearTO","setRadius","mapSize","getSize","screen","availWidth","paddingTopLeft","DetailedRouteMap","mapComponent","flyToBounds","startPlace","renderSubtripMarkers","endPlace","subtrips","walkingTime","distance","RouteDetailedView","detailedRouteMapRef","panToSpecificSubtrip","renderTripInfo","renderSingleSubtrip","renderFirstSubtrip","renderLastSubtrip","renderIntermediateSubtrip","totalTripDuration","handleSubtripClick","renderDisplay","PlanRoute","allRoutesView","routeDetailedView","Schedules","schedule","scheduleInfo","exceptions","selectedProvider","selectedDirection","dayTypes","selectedDaytype","displayLineDropdown","displayDirectionDropdown","displayDaytypeDropdown","isLoadingInfo","displayNoInfo","displayExceptionsPopover","match","params","setLine","setDirection","dayTypesSuccessCallback","getTrips","getTripsSuccessCallback","getDaytypes","renderProviderDropdown","renderLinesDropdown","renderDirectionsDropdown","renderDaytypesDropdown","setProvider","determineDirectionString","directions","setDaytype","hasExceptions","renderStopsList","renderTripList","exceptionsList","overlayRef","setDisplayExceptionsPopover","renderExceptionList","renderTripExceptions","renderTripPassings","exception","stopOrder","Overlay","placement","Popover","Body","renderDropdowns","renderScheduleInfo","SchedulesByStop","lineSelected","displaySchedules","checkLinesSuccessCallback","checkLines","renderLinesInfo","renderSearchPanel","renderLines","renderSchedules","contactApiRoutes","ContactAPI","ContactCommand","sendEmail","Contact","sendMail","sending","contacts","subjectType","sendSuccessCallback","sendErrorCallback","subjectOptions","lg","class","Form","Group","controlId","Control","Text","Select","option","as","rows","Check","onCheckboxChange","Alert","MessageAPI","MessageCommand","getMessages","Messages","isLoadingMessages","getMessagesSuccessCallback","creationDateToShow","dangerouslySetInnerHTML","__html","httpLink","renderMessage","NotFound","logoApiRoutes","LogoAPI","LogoCommand","getLogos","About","LandingPage","renderMessages","TicketInfo","ServiceOnDemand","TicketOffice","PrivacyPolicy","start","App","states","searchBar","logos","userLocation","useUserLocation","getNearStopsCallback","getLogosSuccessCallback","setLanguage","getComponentState","setComponentState","callback","which","newState","exact","LayoutRoute","rest","childContextTypes","isLocalhost","Boolean","location","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","console","log","baseUrl","getElementsByTagName","getAttribute","rootElement","ReactDOM","basename","URL","process","get","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.0089b03a.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAIASURBVEhL7ZXdK2RxGMefM4yXQYizKC5G3lbIBdnavbD/AVJKa8OScrE3uFxv5dKl3BguSJHUXqtNe0lk1SpKWoWpkZfNy9DEfp/n/GjOzpm3mnLjU7/f9/k+vzPne+Z0zu/QK9GgKQ2Lx+MZgAxipEqDyIXxVdf1G8MGJ2QITqxDtjFypWHNPcZnhC0YNpCgIQj4Bhnl2ntxSCdrk3R1tE4PPi+3yJFTSXplC2U468WDNQTVqdqEZQgChiDDjw8+2lvuIO/5gbFggWaLp7KWRUpIfcP2F4KqZcGPgBAE5EGOOWDb9XyVYSltnqWkTCeXMwjqlKbCptSf3zztzDeJiZTdpTZVUbvSZ6xCMq+ON8l3e6Zs5Pz5McKi4W5MSENhCsHiFKt7Y1p8tFzsr6iKepUK//+TLzxdu7fExAqr2xVzXiRknKe0gndiYoUpBM93P2tuTbf4aMl626gqksfsCavb5XZkl+LFKlQ2QjQb5X/o4+oRFzssPYVVSBFPJU0zYiKlvHVZVcR7nomAEFzFNaRHs8VRVddPSnd+NBaCEJeYThXtK2R3ZLNdxe/HZMGPULvwJ8gs1z7vX7ygLtmF7y4PyZ6iyy6cU91GyVnFfAjzHQENqjYR7ntih/D3pEwa1pxivEfAnmEDCRniDwJrIfxlTJMG0RROPKfqV2IF0T8U/35zwBbQ5wAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAKBSURBVEhL7ZbNaxNRFMXPpDFaG7UNRsFIRcQPUOymZGOlVVFculAQCy5ERKGKggv/BDcFcSX4sdGNVKg7F7rRWvEDQuumLqJSN4oxCpoqbck8z715iZlkJkkT3OUH9517b5M5817ezCvatPlfOFbrkslktlLuMrYwYowQQ8gxPjOuxuPxO9ppgLrG1nCKsVIbRRbmgEiXLUq4jOOMMd6ENoKoaUzT85TrWrh5OFPjwMwTON9ntRbMqnXAxj6YvWeAzjXaI5M0HrC5L4HGHtMv7xC6f0HTWrjbhoDDV3hV/RXeMJJBM/c1pukOyowWEzcRSo1p2ggmtglm+AZ3QIeUozS+rH+oIMh4nhLBpxRC45zBEpHlN6fu2QpRmnNDeCnuzBI0PUCJIL/YlKng/PoKpJ/bCk+teqgyJtdkcCYbfjJ8cZ5xuQv0WfXgZ7xZx/SESrPorH//kDTMVezXZhkeY35gOaVLllm/2Cq5rE3sZMqonHGPjvkFlZb5d53VVktUGmd0DK9QaZmwLKCia16Ox5jbXl5HP+UZNN2JQrMVomttgrTVEn6b672O2/epNIuJ9RZfofOc0FttluFnfFoGkxzWolnM/os2wyurHqqMeXcpyh9ZbvfkrUJziZgNO4HELs15vUFNKvCbsSBHYR49vXCHRgqdBjGJ3TBHR22FS1arqHU6HaHwHCS5bwjdPqFpLdzBc3xP8WuOXvYx4xBnLHkVgcYCzQ9SHjH0qMGHl3CmHwLZWThzWZjObj6h6/l6SML08/zvWKYfIw9oeMzmvtQ0Fmguz8QLhix/PRYZAzR9XSiDqWtchDcQpcibfw+j/H8uOfI+Ms7ScFo7bdoA+AszZKUppWixUQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAADGSURBVDhPYxgwwAilMcCeNvViIAXCBS5VN1eBBdEAhmagpm9AipNbRJVBRMWe4dmldQy/v70DSwENcQUxYABFM1DjfxDtXHkDzEcGe9s1QNRHoAECYAEgYILScIBNIwhAxfnBHHQAspUQeHltx3+Y60AAw2Z8QEzTHcqCAJI0owOSNN89PAlEPQVz0AEhfyP7FwQwbIZGCQaAil8Cc6AAWyI5AqSsQWxxLR+Gl9e2gJgg0AyM4zooGz8AGsIHxOuhXGoDBgYAX3929vxgJ9UAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAADcSURBVDhPYxgwwAilMcDr16/lgJQEEH8WFRW9DhZEAxiagZosgdQxMOf5NQYGSS0wEwjWAQ0JhrLBAEUzUGMIkFrNNNENIoAE/uXvAlH7gAY4gwWAAF3zf2waYQBkAFAzXA8TlAZptIUycQLGdeUgdX+gXIRmIDiEz1YQYHx8HkQxgzlAgKyZZICsWR8aKDjBP213EPUOzAECuGZgQFyCMnEDl2KQOmEoD8PZVrhsh4ovBnOgAFsi4QNSHyE8FFAKtLUHygYDDM0wADREEEhJAvEnoKYnYEHqAQYGAKoqPD7fDMbYAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAGGSURBVFhH7Za/LgRRFMYHjWfQsUGi9QayiRCrkCi8wJYoZXs6IVHyABoVhSAUxBtssRKJSjRajYLv7vkkM5l7z8zdvZdI7i+ZfOdMMnd/c+bfZonEf2aE6c3N3uw4YhXbfH+H8NDs9M5Ze+MtA4ldREc6lU2IHbGuRW0ZSKwhzqTzYgFSd6xVRpkqELlGDCJiuMXx+6xVKieDhXqIGemG4gITarG2ok4GIgeIECKGFazXZG3FKYMDzdS2pQuGudxOtMl8MoOCk3xiWUKTGWOGZppZwioD+y2WUcD6ViHXZA6ZsbhkFtAuU0ymmAX+SsZKknHhkonyjslxzyzgkllnxmKZWcD5ocS74ItlcPDBtP6uds+8M0Nzwiyh/oWIMR3XVAxVT9MiMxSTTCuqDM7iCnEs3dBsYL0X1laqJmOE2ogd6QamhXVOWTtR75k8uH/mEF3pavOBrQGRN2l1asv8AKklhHkiJvo77BjpNiQepa2Ht0weiJmvb4PbM7YuBF6RicQvkGXf65hRno/jK9MAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAMPSURBVFhH7ZddSBRRGIa/UddWI38hRWo1FEyhFBQXzSwjxLCboLo0hES8iQqKioikKG/som6KCIogCpJuujANSYsMisi8MO1XKww1EGzzf6f3nPka3GZmd0aX6mIf+PZ9z8fs8J7D/JyhCBEcorA65uG5XBdkFcotGxo+1OT2EwN+begMx2EQ4gzkCGqFbBhRUVOoaoR6LDs2sR0GIZohR1FOJjCN2oxQL7RhcEKeGCFiIEOoDNkAMe4kyqk8TMkeL8WnZMqef2GOfGNvaXSgnT49vSx7i3iAQNXsLQkaBkHENfEdJa4PcsUlU0ldK7kT9VyWjL5pp757B3gk6UWgQvamRLFa8RUlg2Rs3E0VB3tsBRGsXl9F2471Y+WyuEMFmFwne1Msw+CPzyBiZSiztIHyas4K6whFUai0oY1WpmZzhypx3nr2BoKtjFf8pKwrp5yth2RjqXjr75MSLRdYcIXVgGkYpJ9gS4V7Lf9rG7FCxbV3eEQKzt/EPgBDGBwoHmKJwmeVNZISFS3ssklIz5d3IXOcNQCzldnASh5vHbvwkFt1kh25MOl49jpmYU6xksudwC48pGZXsJMYTm4WZidr2PljcuWsOqYX8L/ivw9znTXszPwYYyfpZtUxC3OelaYnv7ELD2ODHewk+rPsN2ZhPqLEnoQ+dF8SEjYGO/R5zuClOctexxAGB81BRoQfed1KC/Mzwi4b8RZX/eLUkj2sAVhuIfBQkqsTl+ShssZ22VsqqqpSZ3Mej2gaE45jH0Cwu+mu+JmaGKaXt/bJxlLpulDMTlLEaiDU5krs8DzCJ2QU4GV3W7707KKqfupqKaKFObElllzDquxnb8DOtvMzZI02wotr10W5cQrFu0ctNNRzlUeSmwhSy94UW9NEoCeQTdpIIy2/htLydpA7aS3FxqfQrG+cfOPvafj5DZoc6eOjdJoQ5DR7S2yvOQJtgbShFn8nheILKhdBfmrD4Ni/ABiESof0olJRZpsdcf++QoASbWgfx2EWg2DiQy4WJVQ8kKYQYh4aIcJfgOgXe0fCL4V+XzgAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAYAAABHA7voAAAACXBIWXMAAAsSAAALEgHS3X78AAACoUlEQVRYhd2Z0W3bMBCGr0bf7Q3sDeJOEPVdQNwJ4gUIOBPE2UAAB6g6QR2AA0gbyBvIG1gTuLjkp8FaFElFdlrqfzETU9R95PGOPH85nU7EkiJdEtGK4lUlpNpdWv8GKEXKYL8jhtM68CIJqSr9jwk+N//UrOtpTkSFFOlCj/jVMvQTL7fnlTwhD2i/8KCe/gkRPaP9SkRZAFIOgxsiWhPR0dF3RkRbIrojoina/EwbUEjlfbkUaWIAFkIqJ6AUKRmAla8/nqkBOLXtLUt/HrMG4DmWTNyPxSMh1dHwvKl209EAQubWGiVgbbQ57UUB2PToG+UKTnv0NQGjWcFgIdDoFR8fIPRXJG3lQRzbXEmV9OxACfKcS4n5LPKoT/o00mcPEgDv0W4DfuBM+mwk8RA9GIeEEPFK5EKqdWB/c3GWsbjoI0MG9jVPSbOY9mAfyLNsLvo/iyFnnsuAeaddxgZIPfdwVC76IY0eMMRFXw2fT4wc89nicsQOaWABW+ZDABlsjePPWbhn5Z8I2sCO1qVXinSN6kDneVUXnYoLg39xYsWJY4PZOiLHZFzUQch+vBnWuxq8u4YdK5QlSl5Nrj6gGlh0QJY2wFJIlWB2fna8dAW3rULcZIB+wPgCYJfaC6mWDltLW5DJkGu6ajM8Uzlcd3tDuD3cctMBx7qTIt0IqXLs0ZZagBh05bmHzeG+3uLRAOk95zuD6sRutWXS8eXC0vdSiZCqDug3VL4toLeWzZadjqIZaosazHddImNS9g4XGiJtw8EDWVpsLlHOzM6/TZhCKqgcbtoIqWY3gLLZsvVcx16EVJ2xwHqSgeu5yvmhd7NrKIOX2LR3wXUCApIj03ckfC1ufwupNF9LiNYJfiLQkfKAv72VAauLjkZE9AdJ6ee7Gl5pmAAAAABJRU5ErkJggg==\"","import React, { Component } from 'react';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport './NavMenu.css';\r\n\r\nexport class MenuItem extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n showLabel: false\r\n };\r\n }\r\n\r\n expandLabelHandler() {\r\n this.setState({\r\n showLabel: true\r\n });\r\n }\r\n\r\n collapseLabelHandler() {\r\n this.setState({\r\n showLabel: false\r\n });\r\n }\r\n\r\n render() {\r\n const { showLabel } = this.state;\r\n const { icon, label, to, hidden } = this.props;\r\n\r\n if (!hidden) {\r\n return (\r\n
\r\n \r\n
\r\n
this.collapseLabelHandler()}\r\n onMouseEnter={() => this.expandLabelHandler()} >\r\n
\r\n
\r\n\r\n
\r\n {label}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n}\r\n","import LocalizedStrings from 'react-localization';\r\n\r\nexport const strings = new LocalizedStrings({\r\n en: {\r\n home: \"Home\",\r\n nextDepartures: \"Next Departures\",\r\n nextDeparturesFrom: \"Next departures from\",\r\n network: \"Network\",\r\n planRoute: \"Plan Route\",\r\n schedules: \"Schedules\",\r\n schedulesByLine: \"Schedules by Line\",\r\n schedulesByStop: \"Schedules by Stop\",\r\n schedulesDisclaimer: \"The displayed schedules are valid for the present day, other periods may have different schedules\",\r\n messages: \"News / Informations\",\r\n ticketOffice: \"Ticket Office\",\r\n about: \"About\",\r\n searchPlaceholder: \"Select (Stop / Line / Ticket Office)\",\r\n originStopPlaceHolder: \"Departure\",\r\n destinationStopPlaceHolder: \"Arrival\",\r\n destination: \"Destination\",\r\n planRouteButton: \"Plan Trip\",\r\n plannedRoutes: \"Trip options\",\r\n duration: \"Duration\",\r\n includes: \"Includes\",\r\n changes: \"change(s)\",\r\n planRouteTimeFilterSelectNow: \"Now\",\r\n planRouteTimeFilterSelectStartDate: \"Select departure date\",\r\n planRouteTimeFilterSelectedStartDate: \"Departure at\",\r\n planRouteTimeFilterSelectEndDate: \"Select arrival date\",\r\n planRouteTimeFilterSelectedEndDate: \"Arrival at\",\r\n planRouteTimeDisclaimer: \"Travel options more suitable for a maximum interval of up to 4 hours from the selected departure time (4 hours earlier for Arrival at option)\",\r\n checkSchedules: \"Check Schedules\",\r\n availableLines: \"Lines\",\r\n walkAround: \"Walk around\",\r\n estimatedWaitingTime: \"Estimated waiting time between\",\r\n arrivalEstimatedAt: \"Arrival estimated at\",\r\n and: \"and\",\r\n or: \"or\",\r\n lineInfoStopsTitle: \"Stops\",\r\n lineInfoMoreScheds: \"more schedules\",\r\n showStops: \"Show stops\",\r\n showSchedule: \"Show schedule\",\r\n showTrip: \"Show route\",\r\n showMap: \"Show map\",\r\n moreSchedsTitle: \"Schedules\",\r\n noMessagesToShow: \"No messages to show\",\r\n noPassingsToShow: \"No passings to show\",\r\n noTripsToShow: \"No trips to show\",\r\n noInfoToShow: \"No information to show\",\r\n selectDate: \"Select date\",\r\n provider: \"Provider\",\r\n line: \"Line\",\r\n viewLine: \"View line\",\r\n selectPath: \"Select path\",\r\n direction: \"Direction\",\r\n directionGo: \"Go\",\r\n directionReturn: \"Return\",\r\n directionCircular: \"Circular\",\r\n daytype: \"Day Type\",\r\n locale: \"en\",\r\n hoursFilter: \"Filter by hours\",\r\n initialHourFilter: \"Start time\",\r\n finalHourFilter: \"End time\",\r\n filter: \"Filter\",\r\n close: \"Close\",\r\n done: \"Done\",\r\n copyright: \"Powered by OPT\",\r\n allRightsReserved: \"All rights reserved\",\r\n privacyPolicy: \"Privacy Policy\",\r\n notFoundTitle: \"404 - Page not found\",\r\n notFoundDescription: \"The page you are trying to access does not exist.\",\r\n developedFor: \"Developed for ABA – Autocarros do Baixo Alentejo, S.A\",\r\n contact: \"Contact Us\",\r\n name: \"Name\",\r\n email: \"Email\",\r\n emailWarning: \"We'll never share your email with anyone else.\",\r\n subject: \"Subject\",\r\n send: \"Send\",\r\n general: \"General\",\r\n emailSuccess: \"Message sent successfully.\",\r\n emailError: \"An error occurred, please try again later.\", \r\n pageNotFound: \"Page not found\",\r\n delayed: \"Delayed\",\r\n aheadSchedule: \"Ahead of schedule\",\r\n complaints: \"TRIMBAL Complaints\",\r\n complaintsBook: \"Complaints Book\",\r\n phone: \"Telephone\",\r\n sendMessage: \"Send us a message:\",\r\n seeMore: \"See more\",\r\n passengerRights: \"Passenger's Rights\",\r\n ticketInfo: \"Tickets and fares\",\r\n serviceOnDemand: \"Services on demand\",\r\n moreInfoSoon: \"More informations soon...\",\r\n fares: \"Fares\",\r\n tickets: \"Tickets\",\r\n ticketsDownload: \"Download Full Ticket Information\",\r\n landingPageRoutePlanning: \"Plan Route\",\r\n landingPageNetwork: \"Network\",\r\n landingPageTickets: \"Tickets, fares and cards\",\r\n landingPageServiceOnDemand: \"Services on demand\",\r\n landingPageContacts: \"Contacts\",\r\n simpleTicket: \"SIMPLE TICKET\",\r\n kmSteps: \"BRACKETS KMS\",\r\n full: \"FULL\",\r\n half: \"HALF\",\r\n code: \"CODE\",\r\n driverFare: \"DRIVER FARE\",\r\n prePurchased: \"PRE-PURCHASED\",\r\n automatedLines: \"AUTOMATED LINES\",\r\n lineSubscriptions: \"LINE SUBSCRIPTION\",\r\n discount60: \"60% discount\",\r\n discount25: \"25% discount\",\r\n disclaimer: \"The stop times available on the website are those in effect on the current date, subject to future changes. The stop times between towns are merely indicative, therefore you should consider the time for the town that precedes the one you're in. \",\r\n contactComplaints: \"Complaints\",\r\n contactHeader: \"Office / Sales\",\r\n contactWorkingDays: \"Working days 06h30 to 20h30\",\r\n contactSaturdays: \"Saturdays 06h30 to 10h30 / 13h30 to 20h30\",\r\n contactSundays: \"Sundays 07h45 to 10h45 / 13h45 to 20h30\",\r\n contactsPrivacyDisclaimer: \"The data collected is intended to respond to your request and facilitate contacts between you and Rodoviária do Alentejo, S.A.. Find out more about our \",\r\n contactsPrivacyCheckbox: \"I authorize my data to be used to carry out promotional and direct marketing actions, carried out through automatic calling devices, fax devices, by email, SMS, MMS, or other means that allow the reception of messages regardless of the intervention of the recipients.\",\r\n notes: \"View Notes\",\r\n simpleOnBoard: \"Simple on Board Ticket\",\r\n fullAndHalf: \"Full and Half\",\r\n fullAndHalfConditions: \"Details:\",\r\n fullAndHalfConditionA: \"Non-personalized;\",\r\n fullAndHalfConditionB: \"Sold on board the bus;\",\r\n fullAndHalfConditionC: \"Allows you to make 1 trip on the bus where it was purchased;\",\r\n prebought: \"Pre-Bought\",\r\n preboughtConditions: \"Details:\",\r\n preboughtConditionA: \"Non-personalized;\",\r\n preboughtConditionB: \"Sold and renewed at the ticket office;\",\r\n preboughtConditionC: \"Must be validated every trip.\",\r\n monthly: \"Monthly Pass\",\r\n monthlyConditions: \"Must be validated on board the bus.\",\r\n monthlyConditionA: \"Personalized, personal and non-transferable title;\",\r\n monthlyConditionB: \"Sold at the Ticket Office;\",\r\n monthlyConditionC: \"It can be recharged monthly at the ticket office or on board buses; \",\r\n monthlyConditionD: \"Valid for the month and Origin / Destination for which it was purchased with unlimited number of trips; \",\r\n monthlyConditionE: \"It has to be validated on board the bus.\",\r\n monthlyRequirements: \"Necessary documents:\",\r\n monthlyRequirementA: \"Citizen Card;\",\r\n monthlyRequirementB: \"1 photograph.\",\r\n passCIM: \"CIM Social Pass\",\r\n passCIMConditions: \"Details:\",\r\n passCIMConditionA: \"Personalized, personal and non-transferable title;\",\r\n passCIMConditionB: \"Sold at the ticket office;\",\r\n passCIMConditionC: \"Renewed monthly at the ticket office or on board;\",\r\n passCIMConditionD: \"Valid for the month and Origin/Destination for which it was purchased for, with an unlimited number of trips;\",\r\n passCIMConditionE: \"Must be validated on board the bus;\",\r\n passCIMConditionF: \"Title previously authorized by CIMBAL (cimbal.pt/part);\",\r\n passCIMConditionG: \"Passes with values of 20€, 30€, 40€ and 50€ according to the origin and destination.\",\r\n passCIMRequirements: \"Necessary documents:\",\r\n passCIMRequirementA: \"Citizen Card;\",\r\n passCIMRequirementB: \"1 photograph.\",\r\n passes418s23: \"Young Student Passes (Sub18+TP and Sub23+TP)\",\r\n pass418: \"Pass Sub18+TP\",\r\n passS23: \"Pass Sub23+TP\",\r\n passes418s23ConditionA: \"Personalized, personal and non-transferable title;\",\r\n passes418s23ConditionB: \"Sold at the ticket office;\",\r\n passes418s23ConditionC: \"Renewed monthly at the ticket office or on board;\",\r\n passes418s23ConditionD: \"Valid for the month and Origin/Destination for which it was purchased for, with an unlimited number of trips;\",\r\n passes418s23ConditionE: \"Must be validated on board the bus;\",\r\n pass418ConditionF: \"It is intended for all children and young people, from 4 to 18 years old (inclusive) who do not attend higher education and who meet the requirements in force.\",\r\n passS23ConditionF: \"Intended for higher education students, public or private, aged up to 23 years (inclusive) who meet the requirements in force.\",\r\n passes418s23MoreInfo: \"For more information, access the following link:\",\r\n passes418s23Faqs: \"FAQs\",\r\n pass418Users: \"O passe \\\"4_18\\\" destina-se aos estudantes do ensino não superior, dos 4 aos 18 anos, inclusive, que não beneficiem de transporte escolar.\",\r\n pass418Requirements: \"Necessary documents:\",\r\n pass418RequirementA: \"Citizen Card;\",\r\n pass418RequirementB: \"1 Photofraph;\",\r\n pass418RequirementC: \"Obtain a Declaration of Enrollment 4 18 from the educational establishment.\",\r\n pass418Renewal: \"Must be renewed annually.\",\r\n passS23Conditions: \"Details:\",\r\n passS23Requirements: \"Necessary documents:\",\r\n passS23RequirementA: \"Citizen Card;\",\r\n passS23RequirementB: \"1 Photofraph;\",\r\n passS23RequirementC: \"Obtain a Declaration of Enrollment SUB 23 from the educational establishment.\",\r\n passS23Renewal: \"Must be renewed annually.\",\r\n passAntigoCombatente: \"Antigo Combatente (Former Combatant) Pass\",\r\n passAntigoCombatenteDescription: \"Antigo Combatente pass is a tariff modality that grants an exemption from the payment of the monthly ticket.\",\r\n passAntigoCombatenteUsersAndConditions: \"It is intended for all former combatants, holders of the former combatant card, as well as for the widow and widower of the former combatant. To gain access to the Antigo Combatente Pass, the potential beneficiary must fill and submit the respective application for membership, accompanied by the following documents:\",\r\n passAntigoCombatenteConditionA: \"Presentation of a former combatant's card or a former combatant's widow and widower's card;\",\r\n passAntigoCombatenteConditionB: \"Presentation of ID card or other equivalent valid title;\",\r\n passAntigoCombatenteConditionC: \"Residence certificate issued by AT;\",\r\n passAntigoCombatenteConditionD: \"1 Photograph.\",\r\n passAntigoCombatenteMoreInfo: \"For more information, access the following link:\",\r\n passAntigoCombatenteLink: \"Antigo Combatente Pass (imt-ip.pt)\"\r\n },\r\n pt: {\r\n home: \"Início\",\r\n nextDepartures: \"Próximas Partidas\",\r\n nextDeparturesFrom: \"Próximas partidas de\",\r\n network: \"Rede\",\r\n planRoute: \"Planear Rota\",\r\n schedules: \"Horários\",\r\n schedulesByLine: \"Horários por Linha\",\r\n schedulesByStop: \"Horários por Paragem\",\r\n schedulesDisclaimer: \"Os horários apresentados são válidos para o dia atual, podendo não ter correspondência para outros períodos\",\r\n messages: \"Notícias / Informações\",\r\n ticketOffice: \"Posto de Venda\",\r\n about: \"Acerca de\",\r\n searchPlaceholder: \"Pesquisar (Paragem / Linha / Posto de Venda)\",\r\n originStopPlaceHolder: \"Partida\",\r\n destinationStopPlaceHolder: \"Chegada\",\r\n destination: \"Destino\",\r\n planRouteButton: \"Planear Viagem\",\r\n plannedRoutes: \"Opções de viagem\",\r\n duration: \"Duração\",\r\n includes: \"Inclui\",\r\n changes: \"transbordo(s)\",\r\n planRouteTimeFilterSelectNow: \"Agora\",\r\n planRouteTimeFilterSelectStartDate: \"Escolher data de partida\",\r\n planRouteTimeFilterSelectedStartDate: \"Partida às\",\r\n planRouteTimeFilterSelectEndDate: \"Escolher data de chegada\",\r\n planRouteTimeFilterSelectedEndDate: \"Chegada às\",\r\n planRouteTimeDisclaimer: \"Opções de viagem mais adequadas para um intervalo máximo de até 4 horas a partir da hora indicada(4 horas antes para opção de Chegada às)\",\r\n checkSchedules: \"Consultar Horários\",\r\n availableLines: \"Linhas\",\r\n walkAround: \"Ir a pé cerca de\",\r\n estimatedWaitingTime: \"Tempo de espera estimado entre as\",\r\n arrivalEstimatedAt: \"Chegada estimada às\",\r\n and: \"e\",\r\n or: \"ou\",\r\n lineInfoStopsTitle: \"Paragens\",\r\n lineInfoMoreScheds: \"mais horários\",\r\n showStops: \"Ver paragens\",\r\n showSchedule: \"Ver horário\",\r\n showTrip: \"Ver viagem\",\r\n showMap: \"Ver mapa\",\r\n moreSchedsTitle: \"Horários\",\r\n noMessagesToShow: \"Sem mensagens\",\r\n noPassingsToShow: \"Sem tempos de passagem\",\r\n noTripsToShow: \"Sem viagens para mostrar\",\r\n noInfoToShow: \"Sem informação para mostrar\",\r\n selectDate: \"Selecione uma data\",\r\n provider: \"Operador\",\r\n line: \"Linha\",\r\n viewLine: \"Ver linha\",\r\n selectPath: \"Escolha um percurso\",\r\n direction: \"Sentido\",\r\n directionGo: \"Ida\",\r\n directionReturn: \"Volta\",\r\n directionCircular: \"Circular\",\r\n daytype: \"Tipo de Dia\",\r\n locale: \"pt\",\r\n hoursFilter: \"Filtrar por horas\",\r\n initialHourFilter: \"Hora inicial\",\r\n finalHourFilter: \"Hora final\",\r\n filter: \"Filtrar\",\r\n close: \"Fechar\",\r\n done: \"Concluído\",\r\n copyright: \"Powered by OPT\",\r\n allRightsReserved: \"Todos os direitos reservados\", \r\n privacyPolicy: \"Política de Privacidade\",\r\n notFoundTitle: \"404 - Página não encontrada\",\r\n notFoundDescription: \"A página à qual está a tentar aceder não existe.\",\r\n developedFor: \"Desenvolvido para ABA – Autocarros do Baixo Alentejo, S.A\",\r\n contact: \"Contacto\",\r\n name: \"Nome\",\r\n email: \"Email\",\r\n emailWarning: \"O seu endereço nunca será partilhado com mais nenhuma organização.\",\r\n subject: \"Assunto\",\r\n send: \"Enviar\",\r\n general: \"Geral\",\r\n emailSuccess: \"Mensagem enviada com sucesso.\",\r\n emailError: \"Ocorreu um erro, por favor tente mais tarde.\", \r\n pageNotFound: \"Página não encontrada\",\r\n delayed: \"Atrasado\",\r\n aheadSchedule: \"Adiantado\",\r\n complaints: \"Reclamações TRIMBAL\",\r\n complaintsBook: \"Livro de Reclamações\",\r\n phone: \"Telefone\",\r\n sendMessage: \"Envie-nos uma mensagem:\",\r\n seeMore: \"Ver mais\",\r\n passengerRights: \"Direitos dos Passageiros\",\r\n ticketInfo: \"Títulos e tarifas\",\r\n serviceOnDemand: \"Serviços a pedido\",\r\n moreInfoSoon: \"Mais informações brevemente...\",\r\n fares: \"Tarifário\",\r\n tickets: \"Títulos\",\r\n ticketsDownload: \"Descarregar Informação Tarifária Completa\",\r\n landingPageRoutePlanning: \"Planear rota\",\r\n landingPageNetwork: \"Rede\",\r\n landingPageTickets: \"Títulos, tarifas e cartões\",\r\n landingPageServiceOnDemand: \"Serviços a pedido\",\r\n landingPageContacts: \"Contactos\",\r\n simpleTicket: \"BILHETE SIMPLES\",\r\n kmSteps: \"ESCALÕES KMS\",\r\n full: \"INTEIRO\",\r\n half: \"MEIO\",\r\n code: \"CÓD.\",\r\n driverFare: \"TARIFA MOTORISTA\",\r\n prePurchased: \"PRÉ-COMPRADOS\",\r\n automatedLines: \"CARREIRAS AUTOMATIZADAS\",\r\n lineSubscriptions: \"ASSINATURA LINHA\",\r\n discount60: \"60% desconto\",\r\n discount25: \"25% desconto\",\r\n disclaimer: \"Os horários disponibilizados no site são os que estão em vigor na data atual, estando sujeitos a alterações futuras. Os horários das paragens entre localidades são meramente indicativos pelo que deverá considerar o horário da localidade que antecede o local onde se encontra. \",\r\n contactComplaints: \"Reclamações\",\r\n contactHeader: \"Instalações / Posto de Venda\",\r\n contactWorkingDays: \"Dias úteis 06h30 às 20h30\",\r\n contactSaturdays: \"Sábados 06h30 às 10h30 / 13h30 às 20h30\",\r\n contactSundays: \"Domingo 07h45 às 10h45 / 13h45 às 20h30\",\r\n contactsPrivacyDisclaimer: \"Os dados recolhidos destinam-se a dar resposta ao seu pedido e a facilitar os contactos entre si e a Rodoviária do Alentejo, S.A.. Saiba mais sobre a nossa \",\r\n contactsPrivacyCheckbox: \"Autorizo que os meus dados sejam usados para a realização de ações de promoção e de marketing direto, levadas a cabo através de aparelhos de chamada automática, aparelhos de telecópia, por correio eletrónico, SMS, MMS, ou outros meios que permitam a receção de mensagens independentemente da intervenção dos destinatários.\",\r\n notes: \"Ver Notas\",\r\n simpleOnBoard: \"Bilhete Simples a Bordo\",\r\n fullAndHalf: \"Inteiro e Meio\",\r\n fullAndHalfConditions: \"Detalhes:\",\r\n fullAndHalfConditionA: \"Título não personalizado;\",\r\n fullAndHalfConditionB: \"Vendido a bordo;\",\r\n fullAndHalfConditionC: \"Permite a realização de 1 viagem no autocarro onde foi adquirido;\",\r\n prebought: \"Pré-Comprado\",\r\n preboughtConditions: \"Detalhes:\",\r\n preboughtConditionA: \"Título não personalizado;\",\r\n preboughtConditionB: \"Vendido e recarregado na bilheteira;\",\r\n preboughtConditionC: \"Tem de ser validado em cada viagem efetuada.\",\r\n monthly: \"Passe Mensal (Assinatura de Linha)\",\r\n monthlyConditions: \"Validado a bordo do autocarro.\",\r\n monthlyConditionA: \"Título personalizado, pessoal e intransmissível;\",\r\n monthlyConditionB: \"Vendido na Bilheteira;\",\r\n monthlyConditionC: \"Pode ser recarregado mensalmente na bilheteira ou a bordo dos autocarros;\",\r\n monthlyConditionD: \"Válido para o mês e Origem / Destino para o qual foi adquirido com nº de viagens ilimitadas;\",\r\n monthlyConditionE: \"Tem de ser validado a bordo do autocarro.\",\r\n monthlyRequirements: \"Documentos necessários:\",\r\n monthlyRequirementA: \"Cartão de Cidadão;\",\r\n monthlyRequirementB: \"1 fotografia.\",\r\n passCIM: \"Passe Social CIM\",\r\n passCIMConditions: \"Detalhes:\",\r\n passCIMConditionA: \"Título personalizado, pessoal e intransmissível;\",\r\n passCIMConditionB: \"Vendido na bilheteira;\",\r\n passCIMConditionC: \"Recarregado mensalmente na bilheteira ou a bordo dos autocarros;\",\r\n passCIMConditionD: \"Válido para o mês e Origem/Destino para o qual foi adquirido com número de viagens ilimitadas;\",\r\n passCIMConditionE: \"Tem de ser validado a bordo do autocarro;\",\r\n passCIMConditionF: \"Título previamente autorizado pela CIMBAL (cimbal.pt/part);\",\r\n passCIMConditionG: \"Passes com valores de 20€, 30€, 40€ e 50€ conforme a origem e o destino.\",\r\n passCIMRequirements: \"Documentos necessários:\",\r\n passCIMRequirementA: \"Cartão de Cidadão;\",\r\n passCIMRequirementB: \"1 fotografia.\",\r\n passes418s23: \"Passes Jovens Estudantes (Sub18+TP e Sub23+TP)\",\r\n pass418: \"Passe Sub18+TP\",\r\n passS23: \"Passe Sub23+TP\",\r\n passes418s23ConditionA: \"Título personalizado, pessoal e intransmissível;\",\r\n passes418s23ConditionB: \"Vendido na Bilheteira;\",\r\n passes418s23ConditionC: \"Recarregado mensalmente na bilheteira ou a bordo dos autocarros;\",\r\n passes418s23ConditionD: \"Válido para o mês e Origem / Destino para o qual foi adquirido com número de viagens ilimitadas;\",\r\n passes418s23ConditionE: \"Tem de ser validado a bordo do autocarro;\",\r\n pass418ConditionF: \"Destina-se a todas as crianças e jovens, dos 4 aos 18 anos (inclusive) que não frequentem o ensino superior que cumpram os requisitos em vigor.\",\r\n passS23ConditionF: \"Destina-se a estudantes do ensino superior, público ou privado, com idade até aos 23 anos (inclusive) que cumpram os requisitos em vigor.\",\r\n passes418s23MoreInfo: \"Para mais informações aceda aos seguintes links:\",\r\n passes418s23Faqs: \"FAQs\",\r\n pass418Users: \"O passe \\\"Sub18+TP\\\" destina-se aos estudantes do ensino não superior, dos 4 aos 18 anos, inclusive, que não beneficiem de transporte escolar.\",\r\n pass418Requirements: \"Documentos necessários:\",\r\n pass418RequirementA: \"Cartão de Cidadão;\",\r\n pass418RequirementB: \"1 Fotografia;\",\r\n pass418RequirementC: \"Obter junto do estabelecimento de ensino uma Declaração de Matrícula Sub18+TP.\",\r\n pass418Renewal: \"Tem de ser renovado todos os anos.\",\r\n passS23Requirements: \"Documentos necessários:\",\r\n passS23RequirementA: \"Cartão de Cidadão;\",\r\n passS23RequirementB: \"1 Fotografia;\",\r\n passS23RequirementC: \"Obter junto do estabelecimento de ensino uma Declaração de Matrícula Sub23+TP.\",\r\n passS23Renewal: \"Tem de ser renovado todos os anos.\",\r\n passAntigoCombatente: \"Passe Antigo Combatente\",\r\n passAntigoCombatenteDescription: \"O Passe de Antigo Combatente é uma modalidade tarifária que confere uma isenção do pagamento do título mensal.\",\r\n passAntigoCombatenteUsersAndConditions: \"Destina-se a todos os antigos combatentes, detentores do cartão de antigo combatente, bem como para a viúva e viúvo do antigo combatente. Para ter acesso ao Passe de Antigo Combatente, o potencial beneficiário deverá preencher e apresentar o respetivo requerimento de adesão, acompanhado dos seguintes documentos:\",\r\n passAntigoCombatenteConditionA: \"Apresentação de cartão de antigo combatente ou de cartão de viúva e viúvo de antigo combatente;\",\r\n passAntigoCombatenteConditionB: \"Apresentação do cartão de cidadão ou outro título válido equivalente;\",\r\n passAntigoCombatenteConditionC: \"Certidão de domicílio fiscal emitida pela AT;\",\r\n passAntigoCombatenteConditionD: \"1 Fotografia.\",\r\n passAntigoCombatenteMoreInfo: \"Para mais informações aceda ao seguinte link:\",\r\n passAntigoCombatenteLink: \"Passe de Antigo Combatente (imt-ip.pt)\"\r\n }\r\n});\r\n\r\nexport const changeLanguage = (languageKey) => {\r\n strings.setLanguage(languageKey);\r\n}\r\n","import React, { Component } from 'react';\r\nimport { MenuItem } from './MenuItem';\r\nimport './NavMenu.css';\r\nimport { strings } from \"../../resources/strings.js\";\r\nimport { PropTypes } from 'prop-types';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\n\r\nexport class NavMenu extends Component {\r\n static displayName = NavMenu.name;\r\n\r\n static contextTypes = {\r\n updateLanguage: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.toggleNavbar = this.toggleNavbar.bind(this);\r\n this.state = {\r\n collapsed: true\r\n };\r\n }\r\n\r\n toggleNavbar() {\r\n this.setState({\r\n collapsed: !this.state.collapsed\r\n });\r\n }\r\n\r\n changeLanguage(languageKey) {\r\n const { updateLanguage } = this.context;\r\n updateLanguage(languageKey);\r\n }\r\n\r\n render() {\r\n const { isMenuOpen } = this.props;\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container } from 'react-bootstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { strings } from '../resources/strings.js';\r\n\r\nexport class Footer extends Component {\r\n\r\n render() {\r\n const { marginClass } = this.props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n

\r\n {strings.copyright}. {strings.developedFor}. {strings.allRightsReserved}. {strings.privacyPolicy} | {strings.complaints} | {strings.complaintsBook} | {strings.passengerRights}\r\n

\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { NavMenu } from './nav/NavMenu';\r\nimport { Row, Col, Container } from 'react-bootstrap';\r\nimport { Footer } from './Footer';\r\n\r\nexport class Layout extends Component {\r\n displayName = Layout.name;\r\n\r\n static contextTypes = {\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n getMenuState() {\r\n const { getMenuState } = this.context;\r\n return getMenuState();\r\n }\r\n\r\n toggleMenuHandler() {\r\n const { setMenuState } = this.context;\r\n setMenuState();\r\n }\r\n\r\n render() {\r\n const isMenuOpen = this.getMenuState();\r\n\r\n return (\r\n \r\n \r\n \r\n this.toggleMenuHandler()} />\r\n
\r\n {this.props.children}\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","export const HTTPMethod = {\r\n GET: \"GET\",\r\n POST: \"POST\",\r\n DELETE: \"DELETE\",\r\n PUT: \"PUT\",\r\n PATCH: \"PATCH\"\r\n};\r\n\r\nexport const ContentType = {\r\n JSON: \"application/json; charset=utf-8\",\r\n FORM: \"application/x-www-form-urlencoded\",\r\n MULTIPART: `multipart/form-data`\r\n};\r\n\r\nexport class API {\r\n static concatResponse(modelState, response) {\r\n modelState.forEach(function (value) {\r\n response = response.concat('\\n' + value)\r\n });\r\n return response;\r\n }\r\n\r\n static authenticatedRequest(parameters, justContent = true) {\r\n var headers = new Headers();\r\n\r\n if (ContentType.MULTIPART !== parameters.contentType) {\r\n headers.set(\"Content-Type\", parameters.contentType || ContentType.FORM);\r\n }\r\n\r\n if (parameters.token !== undefined) {\r\n headers.set(\"Authorization\", \"Bearer \" + parameters.token);\r\n }\r\n\r\n if (parameters.key !== undefined) {\r\n headers.set(\"ApiKey\", parameters.key);\r\n }\r\n\r\n return fetch(parameters.url, {\r\n method: parameters.method,\r\n headers: headers,\r\n body: parameters.body || undefined\r\n }).then(async response => {\r\n if (!response.ok) {\r\n const responseText = await response.text();\r\n\r\n if (responseText !== \"\") {\r\n let responseJSON = JSON.parse(responseText);\r\n\r\n if (responseJSON.message) {\r\n var responsePrint = responseJSON.message;\r\n\r\n if (responseJSON.modelState) {\r\n for (let state in responseJSON.modelState) {\r\n responsePrint = this.concatResponse(responseJSON.modelState[state], responsePrint);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const error = {\r\n status: response.status,\r\n statusText: response.statusText,\r\n message: \"Ocorreu um erro.\"\r\n };\r\n\r\n if (400 === response.status) {\r\n error.message = `${responsePrint !== undefined ? responsePrint : \"\"}`.trim();\r\n } else if (401 === response.status) {\r\n error.message = \"Acesso negado.\";\r\n }\r\n\r\n throw error;\r\n }\r\n if (justContent) {\r\n return response.text();\r\n }\r\n return response;\r\n }).catch((error) => {\r\n throw error;\r\n });\r\n }\r\n}\r\n","export class APIEncoder {\r\n\r\n static getApiKey() {\r\n const timestampEncoder = {\r\n \"0\": \"F\",\r\n \"1\": \"C\",\r\n \"2\": \"5\",\r\n \"3\": \"Z\",\r\n \"4\": \"H\",\r\n \"5\": \"S\",\r\n \"6\": \"W\",\r\n \"7\": \"0\",\r\n \"8\": \"8\",\r\n \"9\": \"K\",\r\n };\r\n const monthEncoder = {\r\n \"0\": \"I\",\r\n \"1\": \"2\",\r\n \"2\": \"M\",\r\n \"3\": \"O\",\r\n \"4\": \"A\",\r\n \"5\": \"C\",\r\n \"6\": \"B\",\r\n \"7\": \"F\",\r\n \"8\": \"9\",\r\n \"9\": \"K\",\r\n \"10\": \"V\",\r\n \"11\": \"Y\",\r\n };\r\n const dayOfWeekEncoder = {\r\n \"0\": \"T\",\r\n \"1\": \"B\",\r\n \"2\": \"D\",\r\n \"3\": \"N\",\r\n \"4\": \"0\",\r\n \"5\": \"W\",\r\n \"6\": \"R\",\r\n };\r\n const currentDate = new Date();\r\n const timestamp = `${currentDate.getTime()}`;\r\n\r\n let key = \"\";\r\n for (let i = 0; i < timestamp.length; i++) {\r\n key += timestampEncoder[timestamp.charAt(i)];\r\n }\r\n key = `${key}-${monthEncoder[currentDate.getUTCMonth()]}${dayOfWeekEncoder[currentDate.getUTCDay()]}`;\r\n return key;\r\n }\r\n}","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst searchApiRoutes = {\r\n performSearch: \"search/\"\r\n};\r\n\r\nexport class SearchAPI {\r\n static performSearch(query) {\r\n const url = `${searchApiRoutes.performSearch}${query}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}\r\n","import { SearchAPI } from '../../api/SearchAPI';\r\n\r\nexport class SearchCommand {\r\n performSearch(query, successCallback, errorCallback) {\r\n const apiResult = SearchAPI.performSearch(query);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { ListGroup, ListGroupItem } from 'react-bootstrap';\r\n\r\nexport class SearchBarResults extends Component {\r\n static contextTypes = {\r\n getLogo: PropTypes.func\r\n };\r\n\r\n renderResultName(result) {\r\n if (1 !== result.type && 3 !== result.type) {\r\n return `${result.name}`;\r\n }\r\n return `${result.name} (${result.code})`;\r\n }\r\n\r\n renderProviderLogo(result) {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(result.provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${null\r\n );\r\n }\r\n\r\n renderResultType(result) {\r\n return (\r\n \"\"\r\n );\r\n }\r\n\r\n render() {\r\n const { className, data, onSelect } = this.props;\r\n return (\r\n
\r\n \r\n {\r\n data.map((result, index) =>\r\n onSelect(result, true)}>\r\n
\r\n {this.renderProviderLogo(result)}\r\n {this.renderResultName(result)}\r\n {this.renderResultType(result)}\r\n
\r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { SearchCommand } from './commands/SearchCommand';\r\nimport { SearchBarResults } from './SearchBarResults';\r\n\r\nexport class SearchBar extends Component {\r\n static contextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n this.timeoutId = undefined;\r\n this.stateKey = \"searchBar\";\r\n this.state = {\r\n commands: {\r\n stops: new SearchCommand()\r\n },\r\n searchText: \"\",\r\n showResults: false,\r\n results: []\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const { caller } = this.props;\r\n const state = getState(`${caller || \"default\"}-${this.stateKey}`);\r\n\r\n if (undefined !== state) {\r\n this.setState(state);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { setState } = this.context;\r\n const { caller } = this.props;\r\n setState(`${caller || \"default\"}-${this.stateKey}`, this.state);\r\n }\r\n\r\n updateSearchText(e) {\r\n this.setState({\r\n searchText: e.target.value\r\n }, () => {\r\n if (this.timeoutId !== undefined) {\r\n clearTimeout(this.timeoutId);\r\n }\r\n\r\n this.timeoutId = setTimeout(() => {\r\n this.performSearch();\r\n this.timeoutId = undefined;\r\n }, 500);\r\n });\r\n }\r\n\r\n updateSearchTextWithoutSearching(text) {\r\n this.setState({\r\n searchText: text\r\n }, () => {\r\n this.performSearch(false);\r\n });\r\n }\r\n\r\n clearSearchText() {\r\n const { onSearchClear } = this.props;\r\n\r\n onSearchClear();\r\n\r\n this.setState({\r\n searchText: \"\"\r\n }, () => {\r\n this.performSearch();\r\n });\r\n }\r\n\r\n handleResultClick(stop, recenter) {\r\n const { onSelect } = this.props;\r\n onSelect(stop, recenter);\r\n this.setState({\r\n searchText: stop.name,\r\n showResults: false\r\n });\r\n }\r\n\r\n handleFocus() {\r\n this.setState({\r\n showResults: true\r\n });\r\n }\r\n\r\n searchSuccessCallback(result, showResults = true) {\r\n this.setState({\r\n showResults: showResults,\r\n results: result\r\n });\r\n }\r\n\r\n performSearch(showResults = true) {\r\n const { searchText, commands } = this.state;\r\n if (3 > searchText.length) {\r\n this.setState({ results: [] });\r\n } else {\r\n commands.stops.performSearch(searchText, (r) => this.searchSuccessCallback(r, showResults));\r\n }\r\n }\r\n\r\n determineResultsToDisplay(results, caller) {\r\n if (caller.includes(\"planroute\")) {\r\n return results.filter(r => r.type !== 3);\r\n } else if (caller.includes(\"schedulebystop\")) {\r\n return results.filter(r => r.type !== 4 && r.type !== 3);\r\n } else {\r\n return results;\r\n }\r\n\r\n }\r\n\r\n renderResults() {\r\n const { results, showResults } = this.state;\r\n const { resultsClassName, caller } = this.props;\r\n\r\n if (0 === results.length || !showResults) {\r\n return null;\r\n }\r\n\r\n let resultsToDisplay = this.determineResultsToDisplay(results, caller);\r\n\r\n return this.handleResultClick(stop, recenter)} />;\r\n }\r\n\r\n render() {\r\n const { searchText } = this.state;\r\n const { className, placeholder, isRequired, caller } = this.props;\r\n return (\r\n
\r\n this.updateSearchText(e)} onFocus={() => this.handleFocus()} autoComplete=\"off\" required={isRequired} />\r\n \r\n {this.renderResults()}\r\n
\r\n );\r\n }\r\n}","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst stopApiRoutes = {\r\n defaultRoute: \"stop/\"\r\n};\r\n\r\nexport class StopAPI {\r\n static getNearStops(latitude, longitude, radius) {\r\n const url = `${stopApiRoutes.defaultRoute}${latitude}/${longitude}/${radius}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getStopTimes(provider, stopId) {\r\n const url = `${stopApiRoutes.defaultRoute}${provider}/${stopId}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { StopAPI } from '../../api/StopAPI';\r\n\r\nexport class StopCommand {\r\n getNearStops(latitude, longitude, radius, successCallback, errorCallback) {\r\n const apiResult = StopAPI.getNearStops(latitude, longitude, radius);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getStopTimes(provider, stopId, successCallback, errorCallback) {\r\n const apiResult = StopAPI.getStopTimes(provider, stopId);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst poiApiRoutes = {\r\n defaultRoute: \"poi/\"\r\n};\r\n\r\nexport class POIAPI {\r\n static getNearPOI(latitude, longitude, radius) {\r\n const url = `${poiApiRoutes.defaultRoute}${latitude}/${longitude}/${radius}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { POIAPI } from '../../api/POIAPI';\r\n\r\nexport class POICommand {\r\n getNearPOI(latitude, longitude, radius, successCallback, errorCallback) {\r\n const apiResult = POIAPI.getNearPOI(latitude, longitude, radius);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst providerApiRoutes = {\r\n defaultRoute: \"provider/\",\r\n providerLines: \"provider/lines/\",\r\n linePaths: \"provider/paths/\"\r\n};\r\n\r\nexport class ProviderAPI {\r\n static getProviders() {\r\n const url = `${providerApiRoutes.defaultRoute}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getProviderLines(providerName) {\r\n const url = `${providerApiRoutes.providerLines}${providerName}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getProviderLinePaths(lineIds) {\r\n const url = `${providerApiRoutes.linePaths}${lineIds}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { ProviderAPI } from '../../api/ProviderAPI';\r\n\r\nexport class ProviderCommand {\r\n getProviders(successCallback, errorCallback) {\r\n const apiResult = ProviderAPI.getProviders();\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getProviderLines(providerName, successCallback, errorCallback) {\r\n const apiResult = ProviderAPI.getProviderLines(providerName);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getProviderLinePaths(lineIds, successCallback, errorCallback) {\r\n const apiResult = ProviderAPI.getProviderLinePaths(lineIds);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}","import L from 'leaflet';\r\n\r\nconst stopIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/stopIcon.png'),\r\n iconAnchor: new L.Point(12.5, 12.5),\r\n iconSize: new L.Point(25, 25)\r\n});\r\n\r\nconst selectedStopIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/selectedStopIcon.png'),\r\n iconAnchor: new L.Point(12.5, 12.5),\r\n iconSize: new L.Point(25, 25)\r\n});\r\n\r\nconst ticketOfficeIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/ticketOfficeIcon.png'),\r\n iconAnchor: new L.Point(25, 25),\r\n iconSize: new L.Point(50, 50)\r\n});\r\n\r\nconst selectedTicketOfficeIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/selectedTicketOfficeIcon.png'),\r\n iconAnchor: new L.Point(25, 25),\r\n iconSize: new L.Point(50, 50)\r\n});\r\n\r\nconst lineInfoStopIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/lineInfoStopIcon.png'),\r\n iconAnchor: new L.Point(7.5, 7.5),\r\n iconSize: new L.Point(15, 15)\r\n});\r\n\r\nconst lineInfoSelectedStopIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/lineInfoSelectedStopIcon.png'),\r\n iconAnchor: new L.Point(7.5, 7.5),\r\n iconSize: new L.Point(15, 15)\r\n});\r\n\r\nconst routeOriginIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/routeOriginIcon.png'),\r\n iconAnchor: new L.Point(15, 15),\r\n iconSize: new L.Point(30, 30)\r\n});\r\n\r\nconst routeDestinationIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/routeDestinationIcon.png'),\r\n iconAnchor: new L.Point(15, 15),\r\n iconSize: new L.Point(30, 30)\r\n});\r\n\r\nconst vehicleIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/vehicle.png'),\r\n iconAnchor: new L.Point(20, 10),\r\n iconSize: new L.Point(40, 20)\r\n});\r\n\r\nconst clusterIcon = (cluster) => {\r\n let markerCount = cluster.getChildCount();\r\n let html = '
' + markerCount + '
';\r\n return L.divIcon({ html: html, className: 'marker-cluster', iconSize: L.point(50, 50), iconAnchor: L.point(25, 25) });\r\n}\r\n\r\nexport { stopIcon, selectedStopIcon, ticketOfficeIcon, selectedTicketOfficeIcon, lineInfoStopIcon, lineInfoSelectedStopIcon, routeOriginIcon, routeDestinationIcon, vehicleIcon, clusterIcon };\r\n","import React, { Component } from 'react';\r\n\r\nexport class RecenterButton extends Component {\r\n render() {\r\n const { className, recenter } = this.props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\n\r\nexport class FilterLinesButton extends Component {\r\n render() {\r\n const { className, filter } = this.props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { MapContainer, Polyline, TileLayer } from 'react-leaflet';\r\nimport 'leaflet/dist/leaflet.css';\r\nimport { useMap, useMapEvents, Marker, Tooltip } from 'react-leaflet';\r\nimport MarkerClusterGroup from 'react-leaflet-markercluster';\r\nimport { SearchBar } from '../SearchBar';\r\nimport { StopCommand } from '../commands/StopCommand';\r\nimport { POICommand } from '../commands/POICommand';\r\nimport { ProviderCommand } from '../commands/ProviderCommand';\r\nimport { stopIcon, selectedStopIcon, ticketOfficeIcon, selectedTicketOfficeIcon, clusterIcon } from '../leaflet/StopIcons';\r\nimport { Row, Col, ListGroup, ListGroupItem, Spinner } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\nimport { RecenterButton } from '../RecenterButton';\r\nimport { FilterLinesButton } from '../FilterLinesButton';\r\n\r\nexport class StopPassingInfo extends Component {\r\n static contextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func,\r\n getLogo: PropTypes.func,\r\n getMapCenter: PropTypes.func,\r\n setMapCenter: PropTypes.func,\r\n recenter: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.stateKey = \"stopPassingInfo\";\r\n this.state = {\r\n commands: {\r\n stops: new StopCommand(),\r\n poi: new POICommand(),\r\n provider: new ProviderCommand()\r\n },\r\n nearStops: [],\r\n nearTO: [],\r\n lines: [],\r\n linesToDisplay: [],\r\n linePaths: [],\r\n linePathsToDisplay: [],\r\n mapRadius: 227753,\r\n selectedStop: undefined,\r\n selectedTO: undefined,\r\n selectedLine: undefined,\r\n displayLinesDropdown: false,\r\n isLoadingPassings: false,\r\n isToRecenter: true,\r\n displayLinesFilter: false\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const state = getState(this.stateKey);\r\n\r\n if (undefined === state) {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n this.getProviders();\r\n } else {\r\n state.isToRecenter = true;\r\n this.setState(state, () => this.getStopTimes());\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { setState } = this.context;\r\n setState(this.stateKey, this.state);\r\n }\r\n\r\n setMapCenter(center, radius) {\r\n const { setMapCenter } = this.context;\r\n\r\n setMapCenter([center.lat, center.lng], () => {\r\n //Set the new map radius and get data\r\n this.setState({\r\n mapRadius: radius\r\n }, () => {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n });\r\n });\r\n }\r\n\r\n //NEAR STOPS\r\n getNearStops() {\r\n const { commands, mapRadius } = this.state;\r\n const { getMapCenter } = this.context;\r\n const mapCenter = getMapCenter();\r\n\r\n commands.stops.getNearStops(mapCenter[0], mapCenter[1], parseInt(mapRadius, 10), (r) => this.getNearStopsSuccessCallback(r));\r\n }\r\n\r\n getNearStopsSuccessCallback(result) {\r\n const { nearStops } = this.state;\r\n\r\n this.setState({\r\n nearStops: nearStops.concat(result.filter(r => nearStops.find(s => s.id === r.id) === undefined))\r\n });\r\n }\r\n //----------\r\n\r\n //NEAR Ticket Offices\r\n getNearPOI() {\r\n const { commands, mapRadius } = this.state;\r\n const { getMapCenter } = this.context;\r\n const mapCenter = getMapCenter();\r\n\r\n commands.poi.getNearPOI(mapCenter[0], mapCenter[1], parseInt(mapRadius, 10), (r) => this.getNearPOISuccessCallback(r))\r\n }\r\n\r\n getNearPOISuccessCallback(result) {\r\n const { nearTO } = this.state;\r\n\r\n this.setState({\r\n nearTO: nearTO.concat(result.filter(r => nearTO.find(s => s.id === r.id) === undefined))\r\n });\r\n }\r\n //----------\r\n\r\n //Get provider, provider lines & line paths\r\n getProviders() {\r\n const { commands } = this.state;\r\n commands.provider.getProviders((r) => this.providersSuccessCallback(r));\r\n }\r\n\r\n providersSuccessCallback(result) {\r\n if (1 === result.length) {\r\n this.getProviderLines(result[0]);\r\n }\r\n }\r\n\r\n getProviderLines(provider) {\r\n const { commands } = this.state;\r\n const providerName = undefined !== provider.name ? provider.name : \"\";\r\n commands.provider.getProviderLines(providerName, (r) => this.providerLinesSuccessCallback(r))\r\n }\r\n\r\n providerLinesSuccessCallback(result) {\r\n result.sort((a, b) => a.name.localeCompare(b.name));\r\n this.setState({\r\n lines: result,\r\n linesToDisplay: [...result]\r\n }, () => {\r\n this.getProviderLinePaths();\r\n });\r\n }\r\n\r\n getProviderLinePaths() {\r\n const { commands, lines } = this.state;\r\n commands.provider.getProviderLinePaths(lines.map(function (obj) { return obj.id }).join(\",\"), (r) => this.providerLinePathsSuccessCallback(r));\r\n }\r\n\r\n providerLinePathsSuccessCallback(result) {\r\n this.setState({\r\n linePaths: result,\r\n linePathsToDisplay: [...result]\r\n });\r\n }\r\n //----------\r\n\r\n //STOP TIMES\r\n getStopTimes() {\r\n this.setState({\r\n isToRecenter: false,\r\n isLoadingPassings: true\r\n });\r\n\r\n const { selectedStop, commands } = this.state;\r\n if (undefined !== selectedStop) {\r\n commands.stops.getStopTimes(selectedStop.provider, selectedStop.id, (r) => this.getStopTimesSuccessCallback(r));\r\n }\r\n }\r\n\r\n getStopTimesSuccessCallback(result) {\r\n const { selectedStop } = this.state;\r\n selectedStop.passings = result;\r\n\r\n this.setState({\r\n selectedStop: selectedStop,\r\n isLoadingPassings: false\r\n });\r\n }\r\n\r\n //Helper Functions\r\n handleSearchResultSelection(place, recenter) {\r\n if (place.type === 1) {\r\n this.handleStopSelection(place, recenter);\r\n } else if (place.type === 4) {\r\n this.handleTicketOfficeSelection(place, recenter);\r\n } else if (place.type === 3) {\r\n this.handleLineSelection(place);\r\n }\r\n\r\n }\r\n\r\n handleStopSelection(stop, recenter) {\r\n const { setMapCenter } = this.context;\r\n if (recenter) {\r\n setMapCenter([stop.coordX, stop.coordY], () => {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n });\r\n }\r\n\r\n this.setState({\r\n selectedStop: stop,\r\n selectedTO: undefined,\r\n isToRecenter: recenter\r\n }, () => {\r\n //if stop, get stop times\r\n if (1 === stop.type) {\r\n this.getStopTimes();\r\n }\r\n });\r\n }\r\n\r\n handleTicketOfficeSelection(ticketOffice, recenter) {\r\n const { setMapCenter } = this.context;\r\n if (recenter) {\r\n setMapCenter([ticketOffice.coordX, ticketOffice.coordY], () => {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n });\r\n }\r\n\r\n this.setState({\r\n selectedStop: undefined,\r\n selectedTO: ticketOffice,\r\n isToRecenter: recenter\r\n });\r\n }\r\n\r\n handleLineSelection(line) {\r\n const { lines, linePaths } = this.state;\r\n const { onSelectLine } = this.props;\r\n let selectedLine = lines.find(l => parseInt(l.id) === line.id);\r\n if (undefined !== line) {\r\n onSelectLine({ line: selectedLine, provider: selectedLine.provider, paths: linePaths.filter(p => p.lineId === parseInt(selectedLine.id)) });\r\n }\r\n }\r\n\r\n handlePathSelection(path) {\r\n const { lines, linePaths } = this.state;\r\n const { onSelectLine } = this.props;\r\n let line = lines.find(l => parseInt(l.id) === path.lineId);\r\n if (undefined !== line) {\r\n onSelectLine({ line: line, provider: line.provider, paths: linePaths.filter(p => p.lineId === parseInt(line.id)) });\r\n }\r\n }\r\n\r\n handleSearchClear() {\r\n this.setState({\r\n selectedStop: undefined,\r\n selectedTO: undefined\r\n });\r\n }\r\n\r\n handlePassingSelection(passing) {\r\n const { onSelectPassing } = this.props;\r\n const { selectedStop } = this.state;\r\n onSelectPassing({ passing: passing, provider: selectedStop.provider });\r\n }\r\n\r\n recenter() {\r\n const { recenter } = this.context;\r\n this.setState({\r\n isToRecenter: true\r\n }, () => {\r\n recenter(() => {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n })\r\n });\r\n }\r\n\r\n filterLines() {\r\n const { displayLinesFilter } = this.state;\r\n\r\n this.setState({\r\n displayLinesFilter: !displayLinesFilter\r\n })\r\n }\r\n\r\n handleLineCheckboxClick(checkbox, line) {\r\n const { linesToDisplay, linePaths, linePathsToDisplay } = this.state;\r\n\r\n if (checkbox.target.checked) {\r\n linesToDisplay.push(line);\r\n let newPaths = linePathsToDisplay.concat(linePaths.filter(p => p.lineId === parseInt(line.id)));\r\n\r\n this.setState({\r\n linesToDisplay: linesToDisplay,\r\n linePathsToDisplay: newPaths\r\n });\r\n } else {\r\n let newLines = linesToDisplay.filter(l => l.id !== line.id);\r\n let newPaths = linePathsToDisplay.filter(p => p.lineId !== parseInt(line.id));\r\n\r\n this.setState({\r\n linesToDisplay: newLines,\r\n linePathsToDisplay: newPaths\r\n });\r\n }\r\n }\r\n\r\n determineStopIcon(stop) {\r\n const { selectedStop } = this.state;\r\n\r\n if (undefined !== selectedStop && selectedStop.id === stop.id) {\r\n return selectedStopIcon;\r\n }\r\n\r\n return stopIcon;\r\n }\r\n\r\n determineTOIcon(ticketOffice) {\r\n const { selectedTO } = this.state;\r\n\r\n if (undefined !== selectedTO && selectedTO.id === ticketOffice.id) {\r\n return selectedTicketOfficeIcon;\r\n }\r\n\r\n return ticketOfficeIcon;\r\n }\r\n\r\n formatDuration(duration) {\r\n if (duration <= 60) {\r\n return `${duration}min`;\r\n }\r\n\r\n let h = Math.floor(duration / 60);\r\n let m = duration % 60;\r\n m = m < 10 ? '0' + m : m;\r\n return `${h}h ${m}min`;\r\n }\r\n\r\n determinePathColor(path) {\r\n const { lines } = this.state;\r\n let line = lines.find(l => parseInt(l.id) === path.lineId);\r\n if (undefined !== line && 0 !== line.lineColor) {\r\n return `rgba(${line.lineColorFormatted.r},${line.lineColorFormatted.g},${line.lineColorFormatted.b},${line.lineColorFormatted.a})`;\r\n }\r\n return \"#bc8627\";\r\n }\r\n\r\n isCheckboxChecked(line) {\r\n const { linesToDisplay } = this.state;\r\n return linesToDisplay.findIndex(l => l.id === line.id) !== -1;\r\n }\r\n\r\n //--------------\r\n\r\n renderPassingInfos() {\r\n const { selectedStop, isLoadingPassings } = this.state;\r\n\r\n //If not loading, but selected stop or selected stop passings are undefined, return nothing\r\n if (!isLoadingPassings && (undefined === selectedStop || undefined === selectedStop.passings)) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {this.renderProviderLogo(selectedStop, \"25px\")}\r\n \r\n \r\n {strings.nextDeparturesFrom} {selectedStop.name} ({selectedStop.code})\r\n \r\n \r\n
\r\n
this.getStopTimes()} />\r\n
this.handleSearchClear()} />\r\n
\r\n\r\n
\r\n \r\n \r\n {strings.line}\r\n \r\n \r\n {strings.destination}\r\n \r\n \r\n
\r\n
\r\n\r\n \r\n {this.renderPassingsList()}\r\n \r\n
\r\n );\r\n }\r\n\r\n renderPassingsList() {\r\n const { selectedStop, isLoadingPassings } = this.state;\r\n\r\n if (isLoadingPassings) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n if (0 !== selectedStop.passings.length) {\r\n return (\r\n selectedStop.passings.map((passing, index) =>\r\n this.handlePassingSelection(passing)}>\r\n \r\n \r\n {passing.lineCode}\r\n \r\n \r\n {passing.destination}\r\n \r\n \r\n {passing.isRT ? \"Tempo : null}\r\n {this.formatDuration(passing.duration)}\r\n \r\n \r\n \r\n )\r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n {strings.noPassingsToShow}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n renderTicketOfficeInfo() {\r\n const { selectedTO } = this.state;\r\n\r\n if (undefined === selectedTO) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n {strings.ticketOffice}\r\n
\r\n
\r\n
this.handleSearchClear()} />\r\n
\r\n
\r\n {selectedTO.description}\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderProviderLogo(stop, height = \"auto\") {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(stop.provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${stop.provider}`}\r\n );\r\n }\r\n\r\n renderLinesFilter() {\r\n const { lines } = this.state;\r\n return (\r\n
\r\n
\r\n {\r\n lines.map((line, index) =>\r\n \r\n \r\n \r\n {line.name} ({line.code})\r\n \r\n \r\n this.handleLineCheckboxClick(checkbox, line)} />\r\n \r\n \r\n \r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderPath(path) {\r\n if (undefined === path) {\r\n return null;\r\n }\r\n\r\n if (undefined === path.shape || null === path.shape || !Array.isArray(path.shape.segments) || 0 === path.shape.segments.length) {\r\n return (\r\n [place.coordX, place.coordY])}\r\n color={this.determinePathColor(path)}\r\n eventHandlers={{\r\n click: () => {\r\n this.handlePathSelection(path);\r\n }\r\n }} />\r\n );\r\n }\r\n\r\n return (\r\n \r\n {\r\n path.shape.segments.map((segment, idx) => \r\n [breakpoint.latitude, breakpoint.longitude])}\r\n color={this.determinePathColor(path)}\r\n eventHandlers={{\r\n click: () => {\r\n this.handlePathSelection(path);\r\n }\r\n }} />\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { isToRecenter, nearStops, selectedStop, nearTO, selectedTO, linePathsToDisplay, displayLinesFilter } = this.state;\r\n const { getMapCenter } = this.context;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n this.handleSearchResultSelection(place, recenter)}\r\n onSearchClear={() => this.handleSearchClear()}\r\n isRequired={false} />\r\n\r\n\r\n {displayLinesFilter ? this.renderLinesFilter() : null}\r\n
\r\n
\r\n this.recenter()} />\r\n this.filterLines()} />\r\n
\r\n
\r\n\r\n {undefined !== selectedStop ? this.renderPassingInfos() : null}\r\n {undefined !== selectedTO ? this.renderTicketOfficeInfo() : null}\r\n
\r\n\r\n\r\n \r\n \r\n this.setMapCenter(center, radius)} />\r\n \r\n {linePathsToDisplay.map((path) =>\r\n this.renderPath(path)\r\n )}\r\n \r\n {nearStops.map((stop) =>\r\n {\r\n this.handleStopSelection(stop, false)\r\n }\r\n }}>\r\n\r\n \r\n {this.renderProviderLogo(stop, \"15px\")}\r\n {stop.name}\r\n ({stop.code})\r\n \r\n \r\n )}\r\n {nearTO.map((ticketOffice) =>\r\n {\r\n this.handleTicketOfficeSelection(ticketOffice, false)\r\n }\r\n }}>\r\n\r\n \r\n {ticketOffice.name}\r\n \r\n \r\n )}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nfunction SetViewOnClick({ coords, isToRecenter }) {\r\n const map = useMap();\r\n\r\n if (isToRecenter) {\r\n map.setView(coords, map.getZoom());\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction MapEvents(args) {\r\n useMapEvents({\r\n dragend: (e) => {\r\n const radius = e.target.getCenter().distanceTo(e.target.getBounds().getNorthWest());\r\n args.setCenter(e.target.getCenter(), radius);\r\n },\r\n zoomend: (e) => {\r\n const radius = e.target.getCenter().distanceTo(e.target.getBounds().getNorthWest());\r\n args.setCenter(e.target.getCenter(), radius);\r\n }\r\n });\r\n return null;\r\n}\r\n","import React, { Component } from 'react';\r\nimport { useMap, MapContainer, TileLayer, Pane, Polyline, Marker, Tooltip } from 'react-leaflet';\r\nimport { lineInfoStopIcon } from '../leaflet/StopIcons';\r\nimport 'leaflet/dist/leaflet.css';\r\n\r\nexport class LinePathInfoMap extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isToRecenter: true\r\n }\r\n }\r\n\r\n getBounds(path) {\r\n if (undefined === path) {\r\n return [{ lat: 41.1483096, lng: -8.6108148 }, { lat: 41.1442942, lng: -8.6105935 }];\r\n }\r\n\r\n if (undefined === path.shape || null === path.shape || !Array.isArray(path.shape.segments) || 0 === path.shape.segments.length) {\r\n return [{ lat: path.maxLatitude, lng: path.maxLongitude }, { lat: path.minLatitude, lng: path.minLongitude }];\r\n }\r\n\r\n return [{ lat: path.shape.maxLatitude, lng: path.shape.maxLongitude }, { lat: path.shape.minLatitude, lng: path.shape.minLongitude }];\r\n }\r\n\r\n /*This is used to change the Tooltip permanent prop, which is immutable and can't be changed after creating the Tooltip.\r\n * But since this is used in the key prop, it will trigger the re-render and subsquently change the permanent prop value.\r\n */\r\n isPermanent(place) {\r\n const { selectedPathStop } = this.props;\r\n return selectedPathStop !== undefined && selectedPathStop.id === place.id\r\n }\r\n\r\n //------------------------\r\n\r\n renderPath(path) {\r\n if (undefined === path) {\r\n return null;\r\n }\r\n\r\n if (undefined === path.shape || null === path.shape || !Array.isArray(path.shape.segments) || 0 === path.shape.segments.length) {\r\n return (\r\n [place.coordX, place.coordY]) : []}\r\n color=\"#bc8627\"\r\n eventHandlers={{\r\n click: () => {\r\n this.handlePathSelection(path);\r\n }\r\n }} />\r\n );\r\n }\r\n\r\n return (\r\n \r\n {\r\n path.shape.segments.map((segment, idx) =>\r\n [breakpoint.latitude, breakpoint.longitude])}\r\n color=\"#bc8627\"\r\n eventHandlers={{\r\n click: () => {\r\n this.handlePathSelection(path);\r\n }\r\n }} />\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n renderPathStops(path) {\r\n if (undefined === path || undefined === path.places) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {\r\n path.places.map((place, idx) =>\r\n \r\n {this.renderTooltip(place)}\r\n \r\n )\r\n }\r\n
\r\n );\r\n }\r\n\r\n renderTooltip(place) {\r\n const { makeTooltipsPermanent } = this.props;\r\n\r\n if (makeTooltipsPermanent) {\r\n return (\r\n \r\n {place.name} ({place.code})\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {place.name} ({place.code})\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { path } = this.props;\r\n const { isToRecenter } = this.state;\r\n return (\r\n \r\n \r\n \r\n \r\n {this.renderPath(path)}\r\n \r\n \r\n {this.renderPathStops(path)}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction SetBounds({ bounds, isToRecenter }) {\r\n const map = useMap();\r\n if (isToRecenter) {\r\n map.fitBounds(bounds);\r\n }\r\n return null;\r\n}\r\n","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport 'leaflet/dist/leaflet.css';\r\nimport { Container, Col, Row, Button, ListGroup, ListGroupItem } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\nimport { LinePathInfoMap } from './LinePathInfoMap';\r\n\r\n\r\nexport class LinePathInfo extends Component {\r\n static contextTypes = {\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedPath: undefined,\r\n selectedPathStop: undefined,\r\n displayPathInfo: true,\r\n displayMap: true,\r\n displayPathsDropdown: false\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { paths } = this.props;\r\n if (paths.length > 0) {\r\n this.setState({\r\n selectedPath: paths[0]\r\n });\r\n }\r\n\r\n //Set function to handle when window is resized\r\n window.onresize = () => this.resize();\r\n\r\n //Call resize function to check the current width, otherwise resizing the window is the only trigger; \r\n this.resize();\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onresize = () => { };\r\n }\r\n\r\n async resize() {\r\n if (window.innerWidth > 767) {\r\n this.setState({\r\n displayPathInfo: true,\r\n displayMap: true\r\n });\r\n } else {\r\n let button = document.getElementById(\"line-path-info-show-stops-button\");\r\n\r\n /*\r\n * If the button is null, it's because this is the initial check and the button hasn't been rendered yet. \r\n * Since we are not retrieving async info from anywhere, a possible workaround is to wait a few seconds (0.5s as of now) and try again.\r\n */\r\n if (null === button) {\r\n await new Promise(r => setTimeout(r, 500));\r\n this.resize();\r\n } else {\r\n button.click();\r\n }\r\n\r\n if (this.context.getMenuState()) {\r\n this.context.setMenuState();\r\n }\r\n }\r\n }\r\n\r\n //HELPER FUNCTIONS\r\n togglePathsDropdown() {\r\n const { displayPathsDropdown } = this.state;\r\n this.setState({\r\n displayPathsDropdown: !displayPathsDropdown\r\n })\r\n }\r\n\r\n handlePathSelection(path) {\r\n this.setState({\r\n selectedPath: path\r\n });\r\n }\r\n\r\n handleSelectedPathStop(place) {\r\n this.setState({\r\n selectedPathStop: place\r\n });\r\n }\r\n\r\n displayPathInfo() {\r\n this.setState({\r\n displayPathInfo: true,\r\n displayMap: false\r\n });\r\n }\r\n\r\n displayMap() {\r\n this.setState({\r\n displayPathInfo: false,\r\n displayMap: true\r\n });\r\n }\r\n\r\n //--------------\r\n renderProviderLogo(provider) {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${provider}`}\r\n );\r\n }\r\n\r\n renderInfo() {\r\n const { selectedPath, selectedPathStop, displayPathInfo, displayMap } = this.state;\r\n\r\n if (displayPathInfo && displayMap) {\r\n return (\r\n \r\n \r\n {this.renderPathHeader(selectedPath)}\r\n {this.renderPath(selectedPath)}\r\n \r\n {\r\n \r\n }\r\n \r\n );\r\n } else {\r\n if (displayPathInfo) {\r\n return (\r\n \r\n \r\n {this.renderPathHeader(selectedPath)}\r\n {this.renderPath(selectedPath)}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n {this.renderPathHeader(selectedPath)}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n }\r\n\r\n renderPathHeader(path) {\r\n const { displayMap, displayPathInfo, selectedPath } = this.state;\r\n const { onReturn } = this.props;\r\n\r\n if (undefined === path || 0 === path.places.length) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {strings.noInfoToShow}\r\n
\r\n
\r\n );\r\n }\r\n\r\n const { line, provider } = this.props;\r\n\r\n return (\r\n
\r\n\r\n \r\n
\r\n \r\n |\r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n {this.renderProviderLogo(provider)}\r\n
\r\n
{line.code} {line.name}
\r\n
{`${path.places[0].name} > ${path.places[path.places.length - 1].name}`}
\r\n
\r\n
\r\n \r\n \r\n
this.togglePathsDropdown()}>\r\n \r\n {this.renderPathsDropdown()}\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderPathsDropdown() {\r\n const { displayPathsDropdown } = this.state;\r\n const { paths } = this.props;\r\n\r\n if (!displayPathsDropdown) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n \r\n {\r\n paths.map((path, index) =>\r\n this.handlePathSelection(path)}>\r\n
\r\n {\r\n path.places.length > 0 ?\r\n {path.places[0].name} > {path.places[path.places.length - 1].name}\r\n :\r\n null\r\n }\r\n
\r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderPath(selectedPath) {\r\n if (undefined === selectedPath || 0 === selectedPath.places.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {strings.lineInfoStopsTitle}\r\n\r\n \r\n {\r\n selectedPath.places.map((place, index) =>\r\n\r\n this.handleSelectedPathStop(place)}>\r\n \r\n \"\"\r\n \r\n \r\n
{place.name} ({place.code})
\r\n \r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.renderInfo()}\r\n \r\n );\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst tripApiRoutes = {\r\n defaultRoute: \"trip/\",\r\n vehiclePositionRoute: \"trip/vehicle/\"\r\n};\r\n\r\nexport class TripAPI {\r\n static getTrip(tripId) {\r\n const url = `${tripApiRoutes.defaultRoute}${tripId}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getEstimatedTrip(provider, lineId, direction, stopId) {\r\n const url = `${tripApiRoutes.defaultRoute}${provider}/${lineId}/${direction}/${stopId}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getTripsByLineAndDayType(lineId, direction, schedules) {\r\n const url = `${tripApiRoutes.defaultRoute}${lineId}/${direction}/${schedules}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getVehiclePosition(provider, vehicleNr, vehicleTrip) {\r\n const url = `${tripApiRoutes.vehiclePositionRoute}${provider}/${vehicleNr}/${vehicleTrip}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { TripAPI } from '../../api/TripAPI';\r\n\r\nexport class TripCommand {\r\n getTrip(tripId, successCallback, errorCallback) {\r\n const apiResult = TripAPI.getTrip(tripId);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getEstimatedTrip(provider, lineId, direction, stopId, successCallback, errorCallback) {\r\n const apiResult = TripAPI.getEstimatedTrip(provider, lineId, direction, stopId);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getTripsByLineAndDayType(lineId, direction, schedules, successCallback, errorCallback) {\r\n const apiResult = TripAPI.getTripsByLineAndDayType(lineId, direction, schedules);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getVehiclePosition(provider, vehicleNr, vehicleTrip, successCallback, errorCallback) {\r\n const apiResult = TripAPI.getVehiclePosition(provider, vehicleNr, vehicleTrip);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { useMap, MapContainer, TileLayer, Pane, Polyline, Marker, Tooltip } from 'react-leaflet';\r\nimport { lineInfoStopIcon, lineInfoSelectedStopIcon, vehicleIcon } from '../leaflet/StopIcons';\r\nimport 'leaflet/dist/leaflet.css';\r\nimport { TripCommand } from '../commands/TripCommand';\r\n\r\nexport class LineInfoMap extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n commands: {\r\n trips: new TripCommand()\r\n },\r\n vehiclePosition: {\r\n latitude: 0,\r\n longitude: 0\r\n },\r\n intervalId: null,\r\n isToRecenter: true\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { realTimePassing } = this.props;\r\n\r\n if (realTimePassing !== undefined) {\r\n //Get bus position immediately\r\n this.onUpdateBusPosition();\r\n\r\n const id = setInterval(() => this.onUpdateBusPosition(), 20000);\r\n this.setState({\r\n intervalId: id\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { intervalId } = this.state;\r\n clearInterval(intervalId);\r\n }\r\n\r\n //HELPER FUNCTIONS\r\n\r\n onUpdateBusPosition() {\r\n const { commands } = this.state;\r\n const { realTimePassing, provider } = this.props;\r\n commands.trips.getVehiclePosition(provider, realTimePassing.vehicleNr, realTimePassing.vehicleTrip, (a) => this.onUpdateBusPositionSuccessCallback(a));\r\n }\r\n\r\n onUpdateBusPositionSuccessCallback(result) {\r\n const { trip } = this.props;\r\n\r\n this.setState({\r\n vehiclePosition: result,\r\n isToRecenter: undefined !== trip ? false : true\r\n });\r\n }\r\n\r\n getBounds(trip) {\r\n if (undefined === trip) {\r\n return [{ lat: 41.1483096, lng: -8.6108148 }, { lat: 41.1442942, lng: -8.6105935 }];\r\n }\r\n\r\n if (undefined === trip.shape || null === trip.shape || !Array.isArray(trip.shape.segments) || 0 === trip.shape.segments.length) {\r\n return [{ lat: trip.maxLatitude, lng: trip.maxLongitude }, { lat: trip.minLatitude, lng: trip.minLongitude }];\r\n }\r\n\r\n return [{ lat: trip.shape.maxLatitude, lng: trip.shape.maxLongitude }, { lat: trip.shape.minLatitude, lng: trip.shape.minLongitude }];\r\n }\r\n\r\n /*This is used to change the Tooltip permanent prop, which is immutable and can't be changed after creating the Tooltip.\r\n * But since this is used in the key prop, it will trigger the re-render and subsquently change the permanent prop value.\r\n */\r\n isPermanent(tripPassing) {\r\n const { selectedTripPassing } = this.props;\r\n return selectedTripPassing !== undefined && selectedTripPassing.stopId === tripPassing.stopId\r\n }\r\n\r\n //------------------------\r\n\r\n renderPath(trip) {\r\n if (undefined === trip || undefined === trip.passings) {\r\n return null;\r\n }\r\n\r\n if (undefined === trip.shape || null === trip.shape || !Array.isArray(trip.shape.segments) || 0 === trip.shape.segments.length) {\r\n return (\r\n
\r\n [passing.x, passing.y])} color=\"#bc8627\" />\r\n
\r\n );\r\n }\r\n\r\n return (\r\n
\r\n {\r\n trip.shape.segments.map((segment, idx) =>\r\n [breakpoint.latitude, breakpoint.longitude])} color=\"#bc8627\" />\r\n )\r\n }\r\n
\r\n );\r\n }\r\n\r\n renderPathStops(trip) {\r\n if (undefined === trip || undefined === trip.passings) {\r\n return null;\r\n }\r\n\r\n const { vehiclePosition } = this.state;\r\n const { passing } = this.props;\r\n\r\n return (\r\n
\r\n {\r\n trip.passings.map((tripPassing, idx) =>\r\n \r\n {this.renderTooltip(tripPassing)}\r\n \r\n )\r\n }\r\n {\r\n vehiclePosition.latitude !== 0 && vehiclePosition.longitude !== 0\r\n ? \r\n \r\n : null\r\n }\r\n
\r\n );\r\n }\r\n\r\n renderTooltip(tripPassing) {\r\n const { makeTooltipsPermanent } = this.props;\r\n\r\n if (makeTooltipsPermanent) {\r\n return (\r\n \r\n {tripPassing.name} ({tripPassing.stopCode})\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {tripPassing.name} ({tripPassing.stopCode})\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { trip } = this.props;\r\n const { isToRecenter } = this.state;\r\n return (\r\n \r\n \r\n \r\n \r\n {this.renderPath(trip)}\r\n \r\n \r\n {this.renderPathStops(trip)}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction SetBounds({ bounds, isToRecenter }) {\r\n const map = useMap();\r\n if (isToRecenter) {\r\n map.fitBounds(bounds);\r\n }\r\n return null;\r\n}\r\n","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport 'leaflet/dist/leaflet.css';\r\nimport { TripCommand } from '../commands/TripCommand';\r\nimport { Container, Col, Row, Button, Spinner } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\nimport { LineInfoMap } from './LineInfoMap';\r\n\r\n\r\nexport class LineInfo extends Component {\r\n static contextTypes = {\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n commands: {\r\n trips: new TripCommand()\r\n },\r\n trip: undefined,\r\n selectedTripPassing: undefined,\r\n realTimePassing: undefined,\r\n isLoadingTrip: true,\r\n displayTripInfo: true,\r\n displayMap: false,\r\n minuteDelay: 0\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n //Set function to handle when window is resized\r\n window.onresize = () => this.resize();\r\n\r\n this.getTrip();\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onresize = () => { };\r\n }\r\n\r\n resize() {\r\n if (window.innerWidth > 767) {\r\n this.setState({\r\n displayTripInfo: true,\r\n displayMap: true\r\n });\r\n } else {\r\n if (this.context.getMenuState()) {\r\n this.context.setMenuState();\r\n }\r\n document.getElementById(\"line-info-show-stops-button\").click();\r\n }\r\n }\r\n\r\n //TRIP\r\n getTrip() {\r\n const { commands } = this.state;\r\n const { passing } = this.props;\r\n\r\n if (undefined !== passing) {\r\n commands.trips.getTrip(passing.tripId, (r) => this.getTripSuccessCallback(r));\r\n }\r\n }\r\n\r\n getTripSuccessCallback(result) {\r\n const { passing } = this.props;\r\n\r\n let selectedPassing = result.passings.find(p => p.stopCode === passing.stopCode && p.order === passing.order && p.isRT);\r\n if (selectedPassing !== undefined) {\r\n let now = new Date(Date.now());\r\n let scheduleTime = new Date(new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime() + selectedPassing.timeStamp * 60000);\r\n let calculatedTime = new Date(now.getTime() + selectedPassing.duration * 60000);\r\n var diff = parseInt((calculatedTime.getTime() - scheduleTime.getTime()) / 60000);\r\n } else {\r\n selectedPassing = result.passings.find(p => p.isRT && p.order > passing.order);\r\n }\r\n\r\n this.setState({\r\n trip: result,\r\n realTimePassing: selectedPassing !== undefined ? selectedPassing : undefined,\r\n isLoadingTrip: false,\r\n displayMap: true,\r\n minuteDelay: diff\r\n }, () => {\r\n //call resize function to check the current width, otherwise resizing the window is the only trigger; \r\n this.resize();\r\n });\r\n }\r\n\r\n //HELPER FUNCTIONS\r\n handleTripRefresh() {\r\n this.setState({\r\n isLoadingTrip: true,\r\n displayMap: false //Redraw LineInfoMap component in order to start updating the bus position in case the trip becomes realtime\r\n }, () => {\r\n this.getTrip()\r\n });\r\n }\r\n\r\n handleSelectTripPassing(tripPassing) {\r\n this.setState({\r\n selectedTripPassing: tripPassing\r\n });\r\n }\r\n\r\n handleMoreSchedsClick() {\r\n const { trip } = this.state;\r\n const { passing, provider, onMoreSchedsClick } = this.props;\r\n onMoreSchedsClick({ trip: trip, passing: passing, provider: provider });\r\n }\r\n\r\n displayTripInfo() {\r\n this.setState({\r\n displayTripInfo: true,\r\n displayMap: false\r\n });\r\n }\r\n\r\n displayMap() {\r\n this.setState({\r\n displayTripInfo: false,\r\n displayMap: true\r\n });\r\n }\r\n\r\n //--------------\r\n renderProviderLogo(provider) {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${provider}`}\r\n );\r\n }\r\n\r\n renderInfo() {\r\n const { trip, selectedTripPassing, realTimePassing, displayTripInfo, displayMap } = this.state;\r\n const { passing, provider } = this.props;\r\n\r\n if (displayTripInfo && displayMap) {\r\n return (\r\n \r\n \r\n {this.renderTripHeader(trip)}\r\n {this.renderTrip(trip)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n } else if (displayTripInfo) {\r\n return (\r\n \r\n \r\n {this.renderTripHeader(trip)}\r\n {this.renderTrip(trip)}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n {this.renderTripHeader(trip)}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n renderTripHeader(trip) {\r\n const { isLoadingTrip, displayMap, displayTripInfo, minuteDelay } = this.state;\r\n const { onReturn } = this.props;\r\n\r\n if (undefined === trip || 0 === trip.passings.length) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {isLoadingTrip ?\r\n \r\n :\r\n {strings.noInfoToShow}\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n const { passing, provider } = this.props;\r\n\r\n return (\r\n
\r\n\r\n \r\n
\r\n \r\n |\r\n \r\n
\r\n\r\n
\r\n
\r\n {this.renderProviderLogo(provider)}\r\n
\r\n
{passing.lineCode} {passing.name}
\r\n
{`${trip.passings[0].name} > ${trip.passings[trip.passings.length - 1].name}`}
\r\n {\r\n isLoadingTrip ?\r\n null\r\n :\r\n minuteDelay !== 0\r\n ? minuteDelay < -1 ?
{strings.aheadSchedule} {Math.abs(minuteDelay)}min
\r\n : minuteDelay >= 5 ?
{strings.delayed} {minuteDelay}min
\r\n : null\r\n : null\r\n }\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderTrip(trip) {\r\n if (undefined === trip || 0 === trip.passings.length) {\r\n return null;\r\n }\r\n\r\n const { passing } = this.props;\r\n const { isLoadingTrip } = this.state;\r\n\r\n if (isLoadingTrip) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n {strings.lineInfoStopsTitle}\r\n \r\n \r\n
this.handleTripRefresh()} />\r\n \r\n \r\n\r\n \r\n {\r\n trip.passings.map((tripPassing, index) =>\r\n\r\n this.handleSelectTripPassing(tripPassing)}>\r\n \r\n \"\"\r\n \r\n \r\n
{tripPassing.name}
\r\n {this.renderMoreSchedsButton(passing.stopId === tripPassing.stopId)}\r\n \r\n\r\n \r\n {tripPassing.isRT ? -1 === tripPassing.duration ? \"\" :
\"Tempo {tripPassing.duration}min
: tripPassing.formattedTimeStamp}\r\n \r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n renderMoreSchedsButton(isSelectedStop) {\r\n if (isSelectedStop) {\r\n return (\r\n
this.handleMoreSchedsClick()}>\r\n {strings.lineInfoMoreScheds}\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.renderInfo()}\r\n \r\n );\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst scheduleApiRoutes = {\r\n defaultRoute: \"schedule/\"\r\n};\r\n\r\nexport class ScheduleAPI {\r\n static getScheduleByLineAndDate(lineId, stopId, direction, date) {\r\n const url = `${scheduleApiRoutes.defaultRoute}${lineId}/${stopId}/${direction}/${date}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getScheduleByLineGroupByDayType(lineId) {\r\n const url = `${scheduleApiRoutes.defaultRoute}${lineId}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { ScheduleAPI } from '../../api/ScheduleAPI';\r\n\r\nexport class ScheduleCommand {\r\n getScheduleByLineAndDate(lineId, stopId, direction, date, successCallback, errorCallback) {\r\n const apiResult = ScheduleAPI.getScheduleByLineAndDate(lineId, stopId, direction, date);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getScheduleByLineGroupByDayType(lineId, successCallback, errorCallback) {\r\n const apiResult = ScheduleAPI.getScheduleByLineGroupByDayType(lineId);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}\r\n","export const PERSIAN_NUMBERS = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];\r\n\r\nexport const PERSIAN_MONTHS = [\r\n 'فروردین',\r\n 'اردیبهشت',\r\n 'خرداد',\r\n 'تیر',\r\n 'مرداد',\r\n 'شهریور',\r\n 'مهر',\r\n 'آبان',\r\n 'آذر',\r\n 'دی',\r\n 'بهمن',\r\n 'اسفند',\r\n];\r\n\r\nexport const GREGORIAN_MONTHS = [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n];\r\n\r\nexport const PERSIAN_WEEK_DAYS = [\r\n {\r\n name: 'شنبه',\r\n short: 'ش',\r\n },\r\n {\r\n name: 'یکشنبه',\r\n short: 'ی',\r\n },\r\n {\r\n name: 'دوشنبه',\r\n short: 'د',\r\n },\r\n {\r\n name: 'سه شنبه',\r\n short: 'س',\r\n },\r\n {\r\n name: 'چهارشنبه',\r\n short: 'چ',\r\n },\r\n {\r\n name: 'پنجشنبه',\r\n short: 'پ',\r\n },\r\n {\r\n name: 'جمعه',\r\n short: 'ج',\r\n isWeekend: true,\r\n },\r\n];\r\n\r\nexport const GREGORIAN_WEEK_DAYS = [\r\n {\r\n name: 'Sunday',\r\n short: 'S',\r\n isWeekend: true,\r\n },\r\n {\r\n name: 'Monday',\r\n short: 'M',\r\n },\r\n {\r\n name: 'Tuesday',\r\n short: 'T',\r\n },\r\n {\r\n name: 'Wednesday',\r\n short: 'W',\r\n },\r\n {\r\n name: 'Thursday',\r\n short: 'T',\r\n },\r\n {\r\n name: 'Friday',\r\n short: 'F',\r\n },\r\n {\r\n name: 'Saturday',\r\n short: 'S',\r\n isWeekend: true,\r\n },\r\n];\r\n\r\nexport const MINIMUM_SELECTABLE_YEAR_SUBTRACT = 100;\r\n\r\nexport const MAXIMUM_SELECTABLE_YEAR_SUM = 50;\r\n\r\nexport const TYPE_SINGLE_DATE = 'SINGLE_DATE';\r\nexport const TYPE_RANGE = 'RANGE';\r\nexport const TYPE_MUTLI_DATE = 'MUTLI_DATE';\r\n","import { TYPE_SINGLE_DATE, TYPE_RANGE, TYPE_MUTLI_DATE } from './constants';\r\n\r\n/*\r\n These utility functions don't depend on locale of the date picker(Persian or Gregorian)\r\n*/\r\n\r\nconst createUniqueRange = (number, startingId) =>\r\n Array.from(Array(number).keys()).map(key => ({\r\n value: key + 1,\r\n id: `${startingId}-${key}`,\r\n }));\r\n\r\nconst isSameDay = (day1, day2) => {\r\n if (!day1 || !day2) return false;\r\n return day1.day === day2.day && day1.month === day2.month && day1.year === day2.year;\r\n};\r\n\r\nconst putZero = number => (number.toString().length === 1 ? `0${number}` : number);\r\n\r\nconst toExtendedDay = date => [date.year, date.month, date.day];\r\n\r\nconst shallowClone = value => ({ ...value });\r\n\r\nconst deepCloneObject = obj =>\r\n JSON.parse(JSON.stringify(obj, (key, value) => (typeof value === 'undefined' ? null : value)));\r\n\r\nconst getDateAccordingToMonth = (date, direction) => {\r\n const toSum = direction === 'NEXT' ? 1 : -1;\r\n let newMonthIndex = date.month + toSum;\r\n let newYear = date.year;\r\n if (newMonthIndex < 1) {\r\n newMonthIndex = 12;\r\n newYear -= 1;\r\n }\r\n if (newMonthIndex > 12) {\r\n newMonthIndex = 1;\r\n newYear += 1;\r\n }\r\n const newDate = { year: newYear, month: newMonthIndex, day: 1 };\r\n return newDate;\r\n};\r\n\r\nconst hasProperty = (object, propertyName) =>\r\n Object.prototype.hasOwnProperty.call(object || {}, propertyName);\r\n\r\nconst getValueType = value => {\r\n if (Array.isArray(value)) return TYPE_MUTLI_DATE;\r\n if (hasProperty(value, 'from') && hasProperty(value, 'to')) return TYPE_RANGE;\r\n if (\r\n !value ||\r\n (hasProperty(value, 'year') && hasProperty(value, 'month') && hasProperty(value, 'day'))\r\n ) {\r\n return TYPE_SINGLE_DATE;\r\n }\r\n throw new TypeError(\r\n `The passed value is malformed! Please make sure you're using one of the valid value types for date picker.`,\r\n );\r\n};\r\n\r\nexport {\r\n createUniqueRange,\r\n isSameDay,\r\n putZero,\r\n toExtendedDay,\r\n shallowClone,\r\n deepCloneObject,\r\n getDateAccordingToMonth,\r\n getValueType,\r\n};\r\n","import jalaali from 'jalaali-js';\r\n\r\nimport {\r\n GREGORIAN_MONTHS,\r\n PERSIAN_MONTHS,\r\n GREGORIAN_WEEK_DAYS,\r\n PERSIAN_WEEK_DAYS,\r\n PERSIAN_NUMBERS,\r\n} from './constants';\r\nimport { toExtendedDay } from './generalUtils';\r\n\r\nconst localeLanguages = {\r\n pt: {\r\n months: [\"Janeiro\", \"Fevereiro\", \"Março\", \"Abril\", \"Maio\", \"Junho\", \"Julho\", \"Agosto\", \"Setembro\", \"Outubro\", \"Novembro\", \"Dezembro\"],\r\n weekDays: [{\r\n name: \"Domingo\",\r\n short: \"D\",\r\n isWeekend: !0\r\n }, {\r\n name: \"Segunda\",\r\n short: \"S\"\r\n }, {\r\n name: \"Terça\",\r\n short: \"T\"\r\n }, {\r\n name: \"Quarta\",\r\n short: \"Q\"\r\n }, {\r\n name: \"Quinta\",\r\n short: \"Q\"\r\n }, {\r\n name: \"Sexta\",\r\n short: \"S\"\r\n }, {\r\n name: \"Sábado\",\r\n short: \"S\",\r\n isWeekend: !0\r\n }],\r\n weekStartingIndex: 0,\r\n getToday: function (e) {\r\n return e\r\n },\r\n toNativeDate: function (e) {\r\n return new Date(e.year, e.month - 1, e.day)\r\n },\r\n getMonthLength: function (e) {\r\n return new Date(e.year, e.month, 0).getDate()\r\n },\r\n transformDigit: function (e) {\r\n return e\r\n },\r\n nextMonth: \"Próximo Mês\",\r\n previousMonth: \"Mês anterior\",\r\n openMonthSelector: \"Mês inicial\",\r\n openYearSelector: \"Ano inicial\",\r\n closeMonthSelector: \"Mês final\",\r\n closeYearSelector: \"Ano final\",\r\n from: \"desde\",\r\n to: \"até\",\r\n defaultPlaceholder: \"Seleccione...\",\r\n digitSeparator: \",\",\r\n yearLetterSkip: 0,\r\n isRtl: !1\r\n },\r\n en: {\r\n months: GREGORIAN_MONTHS,\r\n weekDays: GREGORIAN_WEEK_DAYS,\r\n weekStartingIndex: 0,\r\n getToday(gregorainTodayObject) {\r\n return gregorainTodayObject;\r\n },\r\n toNativeDate(date) {\r\n return new Date(date.year, date.month - 1, date.day);\r\n },\r\n getMonthLength(date) {\r\n return new Date(date.year, date.month, 0).getDate();\r\n },\r\n transformDigit(digit) {\r\n return digit;\r\n },\r\n nextMonth: 'Next Month',\r\n previousMonth: 'Previous Month',\r\n openMonthSelector: 'Open Month Selector',\r\n openYearSelector: 'Open Year Selector',\r\n closeMonthSelector: 'Close Month Selector',\r\n closeYearSelector: 'Close Year Selector',\r\n from: 'from',\r\n to: 'to',\r\n defaultPlaceholder: 'Select...',\r\n digitSeparator: ',',\r\n yearLetterSkip: 0,\r\n isRtl: false,\r\n },\r\n fa: {\r\n months: PERSIAN_MONTHS,\r\n weekDays: PERSIAN_WEEK_DAYS,\r\n weekStartingIndex: 1,\r\n getToday({ year, month, day }) {\r\n const { jy, jm, jd } = jalaali.toJalaali(year, month, day);\r\n return { year: jy, month: jm, day: jd };\r\n },\r\n toNativeDate(date) {\r\n const gregorian = jalaali.toGregorian(...toExtendedDay(date));\r\n return new Date(gregorian.gy, gregorian.gm - 1, gregorian.gd);\r\n },\r\n getMonthLength(date) {\r\n return jalaali.jalaaliMonthLength(date.year, date.month);\r\n },\r\n transformDigit(digit) {\r\n return digit\r\n .toString()\r\n .split('')\r\n .map(letter => PERSIAN_NUMBERS[Number(letter)])\r\n .join('');\r\n },\r\n nextMonth: 'ماه بعد',\r\n previousMonth: 'ماه قبل',\r\n openMonthSelector: 'نمایش انتخابگر ماه',\r\n openYearSelector: 'نمایش انتخابگر سال',\r\n closeMonthSelector: 'بستن انتخابگر ماه',\r\n closeYearSelector: 'بستن انتخابگر ماه',\r\n from: 'از',\r\n to: 'تا',\r\n defaultPlaceholder: 'انتخاب...',\r\n digitSeparator: '،',\r\n yearLetterSkip: -2,\r\n isRtl: true,\r\n },\r\n};\r\n\r\nconst getLocaleDetails = locale => {\r\n if (typeof locale === 'string') return localeLanguages[locale];\r\n return locale;\r\n};\r\n\r\nexport { localeLanguages };\r\nexport default getLocaleDetails;\r\n","/*\r\n These utility functions highly depend on locale of the date picker(Persian or Gregorian)\r\n*/\r\n\r\nimport getLocaleDetails from './localeLanguages';\r\n\r\nconst utils = (locale = 'en') => {\r\n const {\r\n months: monthsList,\r\n getToday: localeGetToday,\r\n toNativeDate,\r\n getMonthLength,\r\n weekStartingIndex,\r\n transformDigit: getLanguageDigits,\r\n } = typeof locale === 'string' ? getLocaleDetails(locale) : locale;\r\n\r\n const getToday = () => {\r\n const todayDate = new Date();\r\n const year = todayDate.getFullYear();\r\n const month = todayDate.getMonth() + 1;\r\n const day = todayDate.getDate();\r\n return localeGetToday({ year, month, day });\r\n };\r\n\r\n const getMonthName = month => monthsList[month - 1];\r\n\r\n const getMonthNumber = monthName => monthsList.indexOf(monthName) + 1;\r\n\r\n const getMonthFirstWeekday = date => {\r\n const gregorianDate = toNativeDate({ ...date, day: 1 });\r\n const weekday = gregorianDate.getDay();\r\n const dayIndex = weekday + weekStartingIndex;\r\n return dayIndex % 7;\r\n };\r\n\r\n const isBeforeDate = (day1, day2) => {\r\n if (!day1 || !day2) return false;\r\n return toNativeDate(day1) < toNativeDate(day2);\r\n };\r\n\r\n const checkDayInDayRange = ({ day, from, to }) => {\r\n if (!day || !from || !to) return false;\r\n const nativeDay = toNativeDate(day);\r\n const nativeFrom = toNativeDate(from);\r\n const nativeTo = toNativeDate(to);\r\n return nativeDay > nativeFrom && nativeDay < nativeTo;\r\n };\r\n\r\n return {\r\n getToday,\r\n getMonthName,\r\n getMonthNumber,\r\n getMonthLength,\r\n getMonthFirstWeekday,\r\n isBeforeDate,\r\n checkDayInDayRange,\r\n getLanguageDigits,\r\n };\r\n};\r\n\r\nexport default utils;\r\n","import { useMemo } from 'react';\r\n\r\nimport utils from './localeUtils';\r\nimport getLanguageText from './localeLanguages';\r\n\r\nconst useLocaleUtils = locale => useMemo(() => utils(locale), [locale]);\r\n\r\nconst useLocaleLanguage = locale => useMemo(() => getLanguageText(locale), [locale]);\r\n\r\nexport { useLocaleUtils, useLocaleLanguage };\r\n","import { getDateAccordingToMonth } from './generalUtils';\r\n\r\nconst getSlideDate = ({ parent, isInitialActiveChild, activeDate, monthChangeDirection }) => {\r\n if (!parent) {\r\n return isInitialActiveChild ? activeDate : getDateAccordingToMonth(activeDate, 'NEXT');\r\n }\r\n const child = parent.children[isInitialActiveChild ? 0 : 1];\r\n const isActiveSlide =\r\n child.classList.contains('-shown') || child.classList.contains('-shownAnimated'); // check -shownAnimated for Safari bug\r\n return isActiveSlide ? activeDate : getDateAccordingToMonth(activeDate, monthChangeDirection);\r\n};\r\n\r\nconst animateContent = ({ parent, direction }) => {\r\n const wrapperChildren = Array.from(parent.children);\r\n const shownItem = wrapperChildren.find(child => child.classList.contains('-shown'));\r\n const hiddenItem = wrapperChildren.find(child => child !== shownItem);\r\n const baseClass = shownItem.classList[0];\r\n const isNextMonth = direction === 'NEXT';\r\n const getAnimationClass = value => (value ? '-hiddenNext' : '-hiddenPrevious');\r\n hiddenItem.style.transition = 'none';\r\n shownItem.style.transition = '';\r\n shownItem.className = `${baseClass} ${getAnimationClass(!isNextMonth)}`;\r\n hiddenItem.className = `${baseClass} ${getAnimationClass(isNextMonth)}`;\r\n hiddenItem.classList.add('-shownAnimated');\r\n};\r\n\r\nconst handleSlideAnimationEnd = ({ target }) => {\r\n target.classList.remove('-hiddenNext');\r\n target.classList.remove('-hiddenPrevious');\r\n target.classList.replace('-shownAnimated', '-shown');\r\n};\r\n\r\nexport { animateContent, getSlideDate, handleSlideAnimationEnd };\r\n","import React, { useEffect, useRef } from 'react';\r\n\r\nimport { isSameDay } from '../shared/generalUtils';\r\nimport { getSlideDate, animateContent, handleSlideAnimationEnd } from '../shared/sliderHelpers';\r\nimport { useLocaleUtils, useLocaleLanguage } from '../shared/hooks';\r\n\r\nconst Header = ({\r\n maximumDate,\r\n minimumDate,\r\n onMonthChange,\r\n activeDate,\r\n monthChangeDirection,\r\n onMonthSelect,\r\n onYearSelect,\r\n isMonthSelectorOpen,\r\n isYearSelectorOpen,\r\n locale,\r\n}) => {\r\n const headerElement = useRef(null);\r\n const monthYearWrapperElement = useRef(null);\r\n\r\n const { getMonthName, isBeforeDate, getLanguageDigits } = useLocaleUtils(locale);\r\n const {\r\n isRtl,\r\n nextMonth,\r\n previousMonth,\r\n openMonthSelector,\r\n closeMonthSelector,\r\n openYearSelector,\r\n closeYearSelector,\r\n } = useLocaleLanguage(locale);\r\n\r\n useEffect(() => {\r\n if (!monthChangeDirection) return;\r\n animateContent({\r\n direction: monthChangeDirection,\r\n parent: monthYearWrapperElement.current,\r\n });\r\n }, [monthChangeDirection]);\r\n\r\n useEffect(() => {\r\n const isOpen = isMonthSelectorOpen || isYearSelectorOpen;\r\n const monthText = headerElement.current.querySelector(\r\n '.Calendar__monthYear.-shown .Calendar__monthText',\r\n );\r\n const yearText = monthText.nextSibling;\r\n const hasActiveBackground = element => element.classList.contains('-activeBackground');\r\n const isInitialRender =\r\n !isOpen && !hasActiveBackground(monthText) && !hasActiveBackground(yearText);\r\n if (isInitialRender) return;\r\n\r\n const arrows = [...headerElement.current.querySelectorAll('.Calendar__monthArrowWrapper')];\r\n const hasMonthSelectorToggled = isMonthSelectorOpen || hasActiveBackground(monthText);\r\n const primaryElement = hasMonthSelectorToggled ? monthText : yearText;\r\n const secondaryElement = hasMonthSelectorToggled ? yearText : monthText;\r\n\r\n let translateXDirection = hasMonthSelectorToggled ? 1 : -1;\r\n if (isRtl) translateXDirection *= -1;\r\n const scale = !isOpen ? 0.95 : 1;\r\n const translateX = !isOpen ? 0 : `${(translateXDirection * secondaryElement.offsetWidth) / 2}`;\r\n if (!isOpen) {\r\n secondaryElement.removeAttribute('aria-hidden');\r\n } else {\r\n secondaryElement.setAttribute('aria-hidden', true);\r\n }\r\n secondaryElement.setAttribute('tabindex', isOpen ? '-1' : '0');\r\n secondaryElement.style.transform = '';\r\n primaryElement.style.transform = `scale(${scale}) ${translateX ? `translateX(${translateX}px)` : ''\r\n }`;\r\n primaryElement.classList.toggle('-activeBackground');\r\n secondaryElement.classList.toggle('-hidden');\r\n arrows.forEach(arrow => {\r\n const isHidden = arrow.classList.contains('-hidden');\r\n arrow.classList.toggle('-hidden');\r\n if (isHidden) {\r\n arrow.removeAttribute('aria-hidden');\r\n arrow.setAttribute('tabindex', '0');\r\n } else {\r\n arrow.setAttribute('aria-hidden', true);\r\n arrow.setAttribute('tabindex', '-1');\r\n }\r\n });\r\n }, [isMonthSelectorOpen, isYearSelectorOpen]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const getMonthYearText = isInitialActiveChild => {\r\n const date = getSlideDate({\r\n isInitialActiveChild,\r\n monthChangeDirection,\r\n activeDate,\r\n parent: monthYearWrapperElement.current,\r\n });\r\n const year = getLanguageDigits(date.year);\r\n const month = getMonthName(date.month);\r\n return { month, year };\r\n };\r\n\r\n const isNextMonthArrowDisabled =\r\n maximumDate &&\r\n isBeforeDate(maximumDate, { ...activeDate, month: activeDate.month + 1, day: 1 });\r\n const isPreviousMonthArrowDisabled =\r\n minimumDate &&\r\n (isBeforeDate({ ...activeDate, day: 1 }, minimumDate) ||\r\n isSameDay(minimumDate, { ...activeDate, day: 1 }));\r\n\r\n const onMonthChangeTrigger = direction => {\r\n const isMonthChanging = Array.from(monthYearWrapperElement.current.children).some(child =>\r\n child.classList.contains('-shownAnimated'),\r\n );\r\n if (isMonthChanging) return;\r\n onMonthChange(direction);\r\n };\r\n\r\n // first button text is the one who shows the current month and year(initial active child)\r\n const monthYearButtons = [true, false].map(isInitialActiveChild => {\r\n const { month, year } = getMonthYearText(isInitialActiveChild);\r\n const isActiveMonth = month === getMonthName(activeDate.month);\r\n const hiddenStatus = {\r\n ...(isActiveMonth ? {} : { 'aria-hidden': true }),\r\n };\r\n return (\r\n \r\n \r\n {month}\r\n \r\n \r\n {year}\r\n \r\n
\r\n );\r\n });\r\n\r\n return (\r\n
\r\n {\r\n onMonthChangeTrigger('PREVIOUS');\r\n }}\r\n aria-label={previousMonth}\r\n type=\"button\"\r\n disabled={isPreviousMonthArrowDisabled}\r\n >\r\n \r\n \r\n \r\n  \r\n {monthYearButtons}\r\n
\r\n {\r\n onMonthChangeTrigger('NEXT');\r\n }}\r\n aria-label={nextMonth}\r\n type=\"button\"\r\n disabled={isNextMonthArrowDisabled}\r\n >\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Header;\r\n","const handleArrowKeys = (e, { allowVerticalArrows }) => {\r\n const { activeElement } = document;\r\n const getNthChildSafe = (element, index) => (element ? element.children[index] : null);\r\n const getStandardItem = item => item && (item.hasAttribute('aria-hidden') ? null : item);\r\n const { nextSibling: nextRow, previousSibling: previousRow } = activeElement.parentElement;\r\n const nextSibling = getStandardItem(activeElement.nextSibling || getNthChildSafe(nextRow, 0));\r\n const previousRowLength = previousRow ? previousRow.children.length - 1 : 0;\r\n const previousSibling = getStandardItem(\r\n activeElement.previousSibling || getNthChildSafe(previousRow, previousRowLength),\r\n );\r\n const getVerticalSibling = row =>\r\n getNthChildSafe(row, Array.from(activeElement.parentElement.children).indexOf(activeElement));\r\n const downSibling = getStandardItem(getVerticalSibling(nextRow));\r\n const upSibling = getStandardItem(getVerticalSibling(previousRow));\r\n const isDefaultSelectable = activeElement.dataset.isDefaultSelectable === 'true';\r\n\r\n if (!isDefaultSelectable) activeElement.tabIndex = '-1';\r\n const focusIfAvailable = element => {\r\n e.preventDefault();\r\n /* istanbul ignore else */\r\n if (element) {\r\n element.setAttribute('tabindex', '0');\r\n element.focus();\r\n }\r\n };\r\n switch (e.key) {\r\n case 'ArrowRight':\r\n focusIfAvailable(nextSibling);\r\n break;\r\n case 'ArrowLeft':\r\n focusIfAvailable(previousSibling);\r\n break;\r\n case 'ArrowDown':\r\n /* istanbul ignore else */\r\n if (allowVerticalArrows) focusIfAvailable(downSibling);\r\n break;\r\n case 'ArrowUp':\r\n /* istanbul ignore else */\r\n if (allowVerticalArrows) focusIfAvailable(upSibling);\r\n break;\r\n default:\r\n //do nothing\r\n }\r\n};\r\n\r\nexport default handleArrowKeys;\r\n","import React, { useRef, useEffect } from 'react';\r\n\r\nimport { isSameDay } from '../shared/generalUtils';\r\nimport handleKeyboardNavigation from '../shared/keyboardNavigation';\r\nimport { useLocaleUtils, useLocaleLanguage } from '../shared/hooks';\r\n\r\nconst MonthSelector = ({ activeDate, maximumDate, minimumDate, onMonthSelect, isOpen, locale }) => {\r\n const monthSelector = useRef(null);\r\n\r\n useEffect(() => {\r\n const classToggleMethod = isOpen ? 'add' : 'remove';\r\n monthSelector.current.classList[classToggleMethod]('-open');\r\n }, [isOpen]);\r\n\r\n const { getMonthNumber, isBeforeDate } = useLocaleUtils(locale);\r\n const { months: monthsList } = useLocaleLanguage(locale);\r\n\r\n const handleKeyDown = e => {\r\n handleKeyboardNavigation(e, { allowVerticalArrows: false });\r\n };\r\n\r\n const renderMonthSelectorItems = () =>\r\n monthsList.map(persianMonth => {\r\n const monthNumber = getMonthNumber(persianMonth);\r\n const monthDate = { day: 1, month: monthNumber, year: activeDate.year };\r\n const isAfterMaximumDate =\r\n maximumDate && isBeforeDate(maximumDate, { ...monthDate, month: monthNumber });\r\n const isBeforeMinimumDate =\r\n minimumDate &&\r\n (isBeforeDate({ ...monthDate, month: monthNumber + 1 }, minimumDate) ||\r\n isSameDay({ ...monthDate, month: monthNumber + 1 }, minimumDate));\r\n const isSelected = monthNumber === activeDate.month;\r\n return (\r\n \r\n {\r\n onMonthSelect(monthNumber);\r\n }}\r\n className=\"Calendar__monthSelectorItemText\"\r\n type=\"button\"\r\n disabled={isAfterMaximumDate || isBeforeMinimumDate}\r\n aria-pressed={isSelected}\r\n data-is-default-selectable={isSelected}\r\n >\r\n {persianMonth}\r\n \r\n \r\n );\r\n });\r\n return (\r\n \r\n \r\n
    \r\n {renderMonthSelectorItems()}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default MonthSelector;\r\n","import React, { useRef, useEffect } from 'react';\r\n\r\nimport { MINIMUM_SELECTABLE_YEAR_SUBTRACT, MAXIMUM_SELECTABLE_YEAR_SUM } from '../shared/constants';\r\nimport handleKeyboardNavigation from '../shared/keyboardNavigation';\r\nimport { useLocaleUtils } from '../shared/hooks';\r\n\r\nconst YearSelector = ({\r\n isOpen,\r\n activeDate,\r\n onYearSelect,\r\n selectorStartingYear,\r\n selectorEndingYear,\r\n maximumDate,\r\n minimumDate,\r\n locale,\r\n}) => {\r\n const wrapperElement = useRef(null);\r\n const yearListElement = useRef(null);\r\n\r\n const { getLanguageDigits, getToday } = useLocaleUtils(locale);\r\n const startingYearValue =\r\n selectorStartingYear || getToday().year - MINIMUM_SELECTABLE_YEAR_SUBTRACT;\r\n const endingYearValue = selectorEndingYear || getToday().year + MAXIMUM_SELECTABLE_YEAR_SUM;\r\n const allYears = [];\r\n for (let i = startingYearValue; i <= endingYearValue; i += 1) {\r\n allYears.push(i);\r\n }\r\n useEffect(() => {\r\n const classToggleMethod = isOpen ? 'add' : 'remove';\r\n const activeSelectorYear = wrapperElement.current.querySelector(\r\n '.Calendar__yearSelectorItem.-active',\r\n );\r\n if (!activeSelectorYear) {\r\n throw new RangeError(\r\n `Provided value for year is out of selectable year range. You're probably using a wrong locale prop value or your provided value's locale is different from the date picker locale. Try changing the 'locale' prop or the value you've provided.`,\r\n );\r\n }\r\n wrapperElement.current.classList[classToggleMethod]('-faded');\r\n yearListElement.current.scrollTop =\r\n activeSelectorYear.offsetTop - activeSelectorYear.offsetHeight * 5;\r\n yearListElement.current.classList[classToggleMethod]('-open');\r\n }, [isOpen]);\r\n\r\n const renderSelectorYears = () => {\r\n return allYears.map(item => {\r\n const isAfterMaximumDate = maximumDate && item > maximumDate.year;\r\n const isBeforeMinimumDate = minimumDate && item < minimumDate.year;\r\n const isSelected = activeDate.year === item;\r\n return (\r\n
  • \r\n {\r\n onYearSelect(item);\r\n }}\r\n disabled={isAfterMaximumDate || isBeforeMinimumDate}\r\n aria-pressed={isSelected}\r\n data-is-default-selectable={isSelected}\r\n >\r\n {getLanguageDigits(item)}\r\n \r\n
  • \r\n );\r\n });\r\n };\r\n\r\n const handleKeyDown = e => {\r\n handleKeyboardNavigation(e, { allowVerticalArrows: false });\r\n };\r\n\r\n return (\r\n \r\n \r\n
      \r\n {renderSelectorYears()}\r\n
    \r\n \r\n \r\n );\r\n};\r\n\r\nYearSelector.defaultProps = {\r\n selectorStartingYear: 0,\r\n selectorEndingYear: 0,\r\n};\r\n\r\nexport default YearSelector;\r\n","import React, { useRef, useEffect } from 'react';\r\n\r\nimport { getSlideDate, handleSlideAnimationEnd, animateContent } from '../shared/sliderHelpers';\r\nimport {\r\n deepCloneObject,\r\n isSameDay,\r\n createUniqueRange,\r\n getValueType,\r\n} from '../shared/generalUtils';\r\nimport { TYPE_SINGLE_DATE, TYPE_RANGE, TYPE_MUTLI_DATE } from '../shared/constants';\r\nimport handleKeyboardNavigation from '../shared/keyboardNavigation';\r\nimport { useLocaleUtils, useLocaleLanguage } from '../shared/hooks';\r\n\r\nconst DaysList = ({\r\n activeDate,\r\n value,\r\n monthChangeDirection,\r\n onSlideChange,\r\n disabledDays,\r\n onDisabledDayError,\r\n minimumDate,\r\n maximumDate,\r\n onChange,\r\n locale,\r\n calendarTodayClassName,\r\n calendarSelectedDayClassName,\r\n calendarRangeStartClassName,\r\n calendarRangeEndClassName,\r\n calendarRangeBetweenClassName,\r\n shouldHighlightWeekends,\r\n isQuickSelectorOpen,\r\n customDaysClassName,\r\n}) => {\r\n const calendarSectionWrapper = useRef(null);\r\n const { isRtl, weekDays: weekDaysList } = useLocaleLanguage(locale);\r\n const {\r\n getToday,\r\n isBeforeDate,\r\n checkDayInDayRange,\r\n getMonthFirstWeekday,\r\n getMonthLength,\r\n getLanguageDigits,\r\n getMonthName,\r\n } = useLocaleUtils(locale);\r\n const today = getToday();\r\n\r\n useEffect(() => {\r\n if (!monthChangeDirection) return;\r\n animateContent({\r\n direction: monthChangeDirection,\r\n parent: calendarSectionWrapper.current,\r\n });\r\n }, [monthChangeDirection]);\r\n\r\n const getDayRangeValue = day => {\r\n const clonedDayRange = deepCloneObject(value);\r\n const dayRangeValue =\r\n clonedDayRange.from && clonedDayRange.to ? { from: null, to: null } : clonedDayRange;\r\n const dayRangeProp = !dayRangeValue.from ? 'from' : 'to';\r\n dayRangeValue[dayRangeProp] = day;\r\n const { from, to } = dayRangeValue;\r\n\r\n // swap from and to values if from is later than to\r\n if (isBeforeDate(dayRangeValue.to, dayRangeValue.from)) {\r\n dayRangeValue.from = to;\r\n dayRangeValue.to = from;\r\n }\r\n\r\n const checkIncludingDisabledDay = disabledDay => {\r\n return checkDayInDayRange({\r\n day: disabledDay,\r\n from: dayRangeValue.from,\r\n to: dayRangeValue.to,\r\n });\r\n };\r\n const includingDisabledDay = disabledDays.find(checkIncludingDisabledDay);\r\n if (includingDisabledDay) {\r\n onDisabledDayError(includingDisabledDay);\r\n return value;\r\n }\r\n\r\n return dayRangeValue;\r\n };\r\n\r\n const getMultiDateValue = day => {\r\n const isAlreadyExisting = value.some(valueDay => isSameDay(valueDay, day));\r\n const addedToValue = [...value, day];\r\n const removedFromValue = value.filter(valueDay => !isSameDay(valueDay, day));\r\n return isAlreadyExisting ? removedFromValue : addedToValue;\r\n };\r\n\r\n const handleDayClick = day => {\r\n const getNewValue = () => {\r\n const valueType = getValueType(value);\r\n switch (valueType) {\r\n case TYPE_SINGLE_DATE:\r\n return day;\r\n case TYPE_RANGE:\r\n return getDayRangeValue(day);\r\n case TYPE_MUTLI_DATE:\r\n return getMultiDateValue(day);\r\n default:\r\n return day;\r\n }\r\n };\r\n const newValue = getNewValue();\r\n onChange(newValue);\r\n };\r\n\r\n const isSingleDateSelected = day => {\r\n const valueType = getValueType(value);\r\n if (valueType === TYPE_SINGLE_DATE) return isSameDay(day, value);\r\n if (valueType === TYPE_MUTLI_DATE) return value.some(valueDay => isSameDay(valueDay, day));\r\n };\r\n\r\n const getDayStatus = dayItem => {\r\n const isToday = isSameDay(dayItem, today);\r\n const isSelected = isSingleDateSelected(dayItem);\r\n const { from: startingDay, to: endingDay } = value || {};\r\n const isStartingDayRange = isSameDay(dayItem, startingDay);\r\n const isEndingDayRange = isSameDay(dayItem, endingDay);\r\n const isWithinRange = checkDayInDayRange({ day: dayItem, from: startingDay, to: endingDay });\r\n return { isToday, isSelected, isStartingDayRange, isEndingDayRange, isWithinRange };\r\n };\r\n\r\n const getDayClassNames = dayItem => {\r\n const {\r\n isToday,\r\n isSelected,\r\n isStartingDayRange,\r\n isEndingDayRange,\r\n isWithinRange,\r\n } = getDayStatus(dayItem);\r\n const customDayItemClassName = customDaysClassName.find(day => isSameDay(dayItem, day));\r\n const classNames = ''\r\n .concat(isToday && !isSelected ? ` -today ${calendarTodayClassName}` : '')\r\n .concat(!dayItem.isStandard ? ' -blank' : '')\r\n .concat(dayItem.isWeekend && shouldHighlightWeekends ? ' -weekend' : '')\r\n .concat(customDayItemClassName ? ` ${customDayItemClassName.className}` : '')\r\n .concat(isSelected ? ` -selected ${calendarSelectedDayClassName}` : '')\r\n .concat(isStartingDayRange ? ` -selectedStart ${calendarRangeStartClassName}` : '')\r\n .concat(isEndingDayRange ? ` -selectedEnd ${calendarRangeEndClassName}` : '')\r\n .concat(isWithinRange ? ` -selectedBetween ${calendarRangeBetweenClassName}` : '')\r\n .concat(dayItem.isDisabled ? ' -disabled' : '');\r\n return classNames;\r\n };\r\n\r\n const getViewMonthDays = date => {\r\n // to match month starting date with the correct weekday label\r\n const prependingBlankDays = createUniqueRange(getMonthFirstWeekday(date), 'starting-blank');\r\n const standardDays = createUniqueRange(getMonthLength(date)).map(day => ({\r\n ...day,\r\n isStandard: true,\r\n month: date.month,\r\n year: date.year,\r\n }));\r\n const allDays = [...prependingBlankDays, ...standardDays];\r\n return allDays;\r\n };\r\n\r\n const handleDayPress = ({ isDisabled, ...dayItem }) => {\r\n if (isDisabled) {\r\n onDisabledDayError(dayItem); // good for showing error messages\r\n } else handleDayClick(dayItem);\r\n };\r\n\r\n const isDayReachableByKeyboard = ({\r\n isOnActiveSlide,\r\n isStandard,\r\n isSelected,\r\n isStartingDayRange,\r\n isToday,\r\n day,\r\n }) => {\r\n if (isQuickSelectorOpen || !isOnActiveSlide || !isStandard) return false;\r\n if (isSelected || isStartingDayRange || isToday || day === 1) return true;\r\n };\r\n\r\n const renderEachWeekDays = ({ id, value: day, month, year, isStandard }, index) => {\r\n const dayItem = { day, month, year };\r\n const isInDisabledDaysRange = disabledDays.some(disabledDay => isSameDay(dayItem, disabledDay));\r\n const isBeforeMinimumDate = isBeforeDate(dayItem, minimumDate);\r\n const isAfterMaximumDate = isBeforeDate(maximumDate, dayItem);\r\n const isNotInValidRange = isStandard && (isBeforeMinimumDate || isAfterMaximumDate);\r\n const isDisabled = isInDisabledDaysRange || isNotInValidRange;\r\n const isWeekend = weekDaysList.some(\r\n (weekDayItem, weekDayItemIndex) => weekDayItem.isWeekend && weekDayItemIndex === index,\r\n );\r\n const additionalClass = getDayClassNames({ ...dayItem, isWeekend, isStandard, isDisabled });\r\n const dayLabel = `${weekDaysList[index].name}, ${day} ${getMonthName(month)} ${year}`;\r\n const isOnActiveSlide = month === activeDate.month;\r\n const dayStatus = getDayStatus(dayItem);\r\n const { isSelected, isStartingDayRange, isEndingDayRange, isWithinRange } = dayStatus;\r\n const shouldEnableKeyboardNavigation = isDayReachableByKeyboard({\r\n ...dayItem,\r\n ...dayStatus,\r\n isOnActiveSlide,\r\n isStandard,\r\n });\r\n return (\r\n {\r\n handleDayPress({ ...dayItem, isDisabled });\r\n }}\r\n onKeyDown={({ key }) => {\r\n /* istanbul ignore else */\r\n if (key === 'Enter') handleDayPress({ ...dayItem, isDisabled });\r\n }}\r\n aria-disabled={isDisabled}\r\n aria-label={dayLabel}\r\n aria-selected={isSelected || isStartingDayRange || isEndingDayRange || isWithinRange}\r\n {...(!isStandard || !isOnActiveSlide || isQuickSelectorOpen ? { 'aria-hidden': true } : {})}\r\n role=\"gridcell\"\r\n data-is-default-selectable={shouldEnableKeyboardNavigation}\r\n >\r\n {!isStandard ? '' : getLanguageDigits(day)}\r\n \r\n );\r\n };\r\n\r\n const renderMonthDays = isInitialActiveChild => {\r\n const date = getSlideDate({\r\n activeDate,\r\n isInitialActiveChild,\r\n monthChangeDirection,\r\n parent: calendarSectionWrapper.current,\r\n });\r\n const allDays = getViewMonthDays(date);\r\n const renderSingleWeekRow = weekRowIndex => {\r\n const eachWeekDays = allDays\r\n .slice(weekRowIndex * 7, weekRowIndex * 7 + 7)\r\n .map(renderEachWeekDays);\r\n return (\r\n
    \r\n {eachWeekDays}\r\n
    \r\n );\r\n };\r\n return Array.from(Array(6).keys()).map(renderSingleWeekRow);\r\n };\r\n\r\n const handleKeyDown = e => {\r\n handleKeyboardNavigation(e, { allowVerticalArrows: true });\r\n };\r\n\r\n return (\r\n \r\n {\r\n handleSlideAnimationEnd(e);\r\n onSlideChange();\r\n }}\r\n className=\"Calendar__section -shown\"\r\n role=\"rowgroup\"\r\n >\r\n {renderMonthDays(true)}\r\n \r\n {\r\n handleSlideAnimationEnd(e);\r\n onSlideChange();\r\n }}\r\n className=\"Calendar__section -hiddenNext\"\r\n role=\"rowgroup\"\r\n >\r\n {renderMonthDays(false)}\r\n \r\n \r\n );\r\n};\r\n\r\nDaysList.defaultProps = {\r\n onChange: () => { },\r\n onDisabledDayError: () => { },\r\n disabledDays: [],\r\n calendarTodayClassName: '',\r\n calendarSelectedDayClassName: '',\r\n calendarRangeStartClassName: '',\r\n calendarRangeBetweenClassName: '',\r\n calendarRangeEndClassName: '',\r\n shouldHighlightWeekends: false,\r\n};\r\n\r\nexport default DaysList;\r\n","import React, { useState, useRef, useEffect } from 'react';\r\n\r\nimport { getDateAccordingToMonth, shallowClone, getValueType } from './shared/generalUtils';\r\nimport { TYPE_SINGLE_DATE, TYPE_RANGE, TYPE_MUTLI_DATE } from './shared/constants';\r\nimport { useLocaleUtils, useLocaleLanguage } from './shared/hooks';\r\n\r\nimport { Header, MonthSelector, YearSelector, DaysList } from './components';\r\n\r\nconst Calendar = ({\r\n value,\r\n onChange,\r\n onDisabledDayError,\r\n calendarClassName,\r\n calendarTodayClassName,\r\n calendarSelectedDayClassName,\r\n calendarRangeStartClassName,\r\n calendarRangeBetweenClassName,\r\n calendarRangeEndClassName,\r\n disabledDays,\r\n colorPrimary,\r\n colorPrimaryLight,\r\n slideAnimationDuration,\r\n minimumDate,\r\n maximumDate,\r\n selectorStartingYear,\r\n selectorEndingYear,\r\n locale,\r\n shouldHighlightWeekends,\r\n renderFooter,\r\n customDaysClassName,\r\n}) => {\r\n const calendarElement = useRef(null);\r\n const [mainState, setMainState] = useState({\r\n activeDate: null,\r\n monthChangeDirection: '',\r\n isMonthSelectorOpen: false,\r\n isYearSelectorOpen: false,\r\n });\r\n\r\n useEffect(() => {\r\n const handleKeyUp = ({ key }) => {\r\n /* istanbul ignore else */\r\n if (key === 'Tab') calendarElement.current.classList.remove('-noFocusOutline');\r\n };\r\n calendarElement.current.addEventListener('keyup', handleKeyUp, false);\r\n return () => {\r\n calendarElement.current.removeEventListener('keyup', handleKeyUp, false); // eslint-disable-line react-hooks/exhaustive-deps\r\n }; \r\n });\r\n\r\n const { getToday } = useLocaleUtils(locale);\r\n const { weekDays: weekDaysList, isRtl } = useLocaleLanguage(locale);\r\n const today = getToday();\r\n\r\n const createStateToggler = property => () => {\r\n setMainState({ ...mainState, [property]: !mainState[property] });\r\n };\r\n\r\n const toggleMonthSelector = createStateToggler('isMonthSelectorOpen');\r\n const toggleYearSelector = createStateToggler('isYearSelectorOpen');\r\n\r\n const getComputedActiveDate = () => {\r\n const valueType = getValueType(value);\r\n if (valueType === TYPE_MUTLI_DATE && value.length) return shallowClone(value[0]);\r\n if (valueType === TYPE_SINGLE_DATE && value) return shallowClone(value);\r\n if (valueType === TYPE_RANGE && value.from) return shallowClone(value.from);\r\n return shallowClone(today);\r\n };\r\n\r\n const activeDate = mainState.activeDate\r\n ? shallowClone(mainState.activeDate)\r\n : getComputedActiveDate();\r\n\r\n const weekdays = weekDaysList.map(weekDay => (\r\n \r\n {weekDay.short}\r\n \r\n ));\r\n\r\n const handleMonthChange = direction => {\r\n setMainState({\r\n ...mainState,\r\n monthChangeDirection: direction,\r\n });\r\n };\r\n\r\n const updateDate = () => {\r\n setMainState({\r\n ...mainState,\r\n activeDate: getDateAccordingToMonth(activeDate, mainState.monthChangeDirection),\r\n monthChangeDirection: '',\r\n });\r\n };\r\n\r\n const selectMonth = newMonthNumber => {\r\n setMainState({\r\n ...mainState,\r\n activeDate: { ...activeDate, month: newMonthNumber },\r\n isMonthSelectorOpen: false,\r\n });\r\n };\r\n\r\n const selectYear = year => {\r\n setMainState({\r\n ...mainState,\r\n activeDate: { ...activeDate, year },\r\n isYearSelectorOpen: false,\r\n });\r\n };\r\n\r\n return (\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n
    {weekdays}
    \r\n\r\n \r\n
    {renderFooter()}
    \r\n \r\n );\r\n};\r\n\r\nCalendar.defaultProps = {\r\n minimumDate: null,\r\n maximumDate: null,\r\n colorPrimary: '#0eca2d',\r\n colorPrimaryLight: '#cff4d5',\r\n slideAnimationDuration: '0.4s',\r\n calendarClassName: '',\r\n locale: 'en',\r\n value: null,\r\n renderFooter: () => null,\r\n customDaysClassName: [],\r\n};\r\n\r\nexport { Calendar };\r\n","import React from 'react';\r\n\r\nimport { useLocaleUtils, useLocaleLanguage } from './shared/hooks';\r\nimport { putZero, getValueType } from './shared/generalUtils';\r\nimport { TYPE_SINGLE_DATE, TYPE_RANGE, TYPE_MUTLI_DATE } from './shared/constants';\r\n\r\nconst DatePickerInput = React.forwardRef(\r\n (\r\n { value, inputPlaceholder, inputClassName, inputName, formatInputText, renderInput, locale },\r\n ref,\r\n ) => {\r\n const { getLanguageDigits } = useLocaleUtils(locale);\r\n const {\r\n from: fromWord,\r\n to: toWord,\r\n yearLetterSkip,\r\n digitSeparator,\r\n defaultPlaceholder,\r\n isRtl,\r\n } = useLocaleLanguage(locale);\r\n\r\n const getSingleDayValue = () => {\r\n if (!value) return '';\r\n const year = getLanguageDigits(value.year);\r\n const month = getLanguageDigits(putZero(value.month));\r\n const day = getLanguageDigits(putZero(value.day));\r\n return `${year}/${month}/${day}`;\r\n };\r\n\r\n const getDayRangeValue = () => {\r\n if (!value.from || !value.to) return '';\r\n const { from, to } = value;\r\n const fromText = `${getLanguageDigits(putZero(from.year))\r\n .toString()\r\n .slice(yearLetterSkip)}/${getLanguageDigits(putZero(from.month))}/${getLanguageDigits(\r\n putZero(from.day),\r\n )}`;\r\n const toText = `${getLanguageDigits(putZero(to.year))\r\n .toString()\r\n .slice(yearLetterSkip)}/${getLanguageDigits(putZero(to.month))}/${getLanguageDigits(\r\n putZero(to.day),\r\n )}`;\r\n return `${fromWord} ${fromText} ${toWord} ${toText}`;\r\n };\r\n\r\n const getMultiDateValue = () => {\r\n return value.map(date => getLanguageDigits(date.day)).join(`${digitSeparator} `);\r\n };\r\n\r\n const getValue = () => {\r\n if (formatInputText()) return formatInputText();\r\n const valueType = getValueType(value);\r\n switch (valueType) {\r\n case TYPE_SINGLE_DATE:\r\n return getSingleDayValue();\r\n case TYPE_RANGE:\r\n return getDayRangeValue();\r\n case TYPE_MUTLI_DATE:\r\n return getMultiDateValue();\r\n default:\r\n return getSingleDayValue();\r\n }\r\n };\r\n\r\n const placeholderValue = inputPlaceholder || defaultPlaceholder;\r\n const render = () => {\r\n return (\r\n renderInput({ ref }) || (\r\n \r\n )\r\n );\r\n };\r\n\r\n return render();\r\n },\r\n);\r\n\r\nDatePickerInput.defaultProps = {\r\n formatInputText: () => '',\r\n renderInput: () => null,\r\n inputPlaceholder: '',\r\n inputClassName: '',\r\n inputName: '',\r\n};\r\n\r\nexport default DatePickerInput;\r\n","import React, { useState, useEffect, useRef, useLayoutEffect } from 'react';\r\n\r\nimport { Calendar } from './Calendar';\r\nimport DatePickerInput from './DatePickerInput';\r\nimport { getValueType } from './shared/generalUtils';\r\nimport { TYPE_SINGLE_DATE, TYPE_MUTLI_DATE, TYPE_RANGE } from './shared/constants';\r\n\r\nconst DatePicker = ({\r\n value,\r\n onChange,\r\n formatInputText,\r\n inputPlaceholder,\r\n inputClassName,\r\n inputName,\r\n renderInput,\r\n wrapperClassName,\r\n calendarClassName,\r\n calendarTodayClassName,\r\n calendarSelectedDayClassName,\r\n calendarRangeStartClassName,\r\n calendarRangeBetweenClassName,\r\n calendarRangeEndClassName,\r\n calendarPopperPosition,\r\n disabledDays,\r\n onDisabledDayError,\r\n colorPrimary,\r\n colorPrimaryLight,\r\n slideAnimationDuration,\r\n minimumDate,\r\n maximumDate,\r\n selectorStartingYear,\r\n selectorEndingYear,\r\n locale,\r\n shouldHighlightWeekends,\r\n renderFooter,\r\n customDaysClassName,\r\n}) => {\r\n const calendarContainerElement = useRef(null);\r\n const inputElement = useRef(null);\r\n const shouldPreventToggle = useRef(false);\r\n const [isCalendarOpen, setCalendarVisiblity] = useState(false);\r\n\r\n useEffect(() => {\r\n const handleBlur = () => {\r\n setCalendarVisiblity(false);\r\n };\r\n window.addEventListener('blur', handleBlur, false);\r\n return () => {\r\n window.removeEventListener('blur', handleBlur, false);\r\n };\r\n }, []);\r\n\r\n // handle input focus/blur\r\n useEffect(() => {\r\n const valueType = getValueType(value);\r\n if (valueType === TYPE_MUTLI_DATE) return; // no need to close the calendar\r\n const shouldCloseCalendar =\r\n valueType === TYPE_SINGLE_DATE ? !isCalendarOpen : !isCalendarOpen && value.from && value.to;\r\n if (shouldCloseCalendar) inputElement.current.blur();\r\n }, [value, isCalendarOpen]);\r\n\r\n const handleBlur = e => {\r\n e.persist();\r\n if (!isCalendarOpen) return;\r\n const isInnerElementFocused = calendarContainerElement.current.contains(e.relatedTarget);\r\n if (shouldPreventToggle.current) {\r\n shouldPreventToggle.current = false;\r\n inputElement.current.focus();\r\n } else if (isInnerElementFocused && e.relatedTarget) {\r\n e.relatedTarget.focus();\r\n } else {\r\n setCalendarVisiblity(false);\r\n }\r\n };\r\n\r\n const openCalendar = () => {\r\n if (!shouldPreventToggle.current) setCalendarVisiblity(true);\r\n };\r\n\r\n // Keep the calendar in the screen bounds if input is near the window edges\r\n useLayoutEffect(() => {\r\n if (!isCalendarOpen) return;\r\n const { left, width, height, top } = calendarContainerElement.current.getBoundingClientRect();\r\n const { clientWidth, clientHeight } = document.documentElement;\r\n const isOverflowingFromRight = left + width > clientWidth;\r\n const isOverflowingFromLeft = left < 0;\r\n const isOverflowingFromBottom = top + height > clientHeight;\r\n\r\n const getLeftStyle = () => {\r\n const overflowFromRightDistance = left + width - clientWidth;\r\n\r\n if (!isOverflowingFromRight && !isOverflowingFromLeft) return;\r\n const overflowFromLeftDistance = Math.abs(left);\r\n const rightPosition = isOverflowingFromLeft ? overflowFromLeftDistance : 0;\r\n\r\n const leftStyle = isOverflowingFromRight\r\n ? `calc(50% - ${overflowFromRightDistance}px)`\r\n : `calc(50% + ${rightPosition}px)`;\r\n return leftStyle;\r\n };\r\n\r\n calendarContainerElement.current.style.left = getLeftStyle();\r\n if (\r\n (calendarPopperPosition === 'auto' && isOverflowingFromBottom) ||\r\n calendarPopperPosition === 'top'\r\n ) {\r\n calendarContainerElement.current.classList.add('-top');\r\n }\r\n }, [isCalendarOpen]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const handleCalendarChange = newValue => {\r\n const valueType = getValueType(value);\r\n onChange(newValue);\r\n if (valueType === TYPE_SINGLE_DATE) setCalendarVisiblity(false);\r\n else if (valueType === TYPE_RANGE && newValue.from && newValue.to) setCalendarVisiblity(false);\r\n };\r\n\r\n const handleKeyUp = ({ key }) => {\r\n switch (key) {\r\n case 'Enter':\r\n setCalendarVisiblity(true);\r\n break;\r\n case 'Escape':\r\n setCalendarVisiblity(false);\r\n shouldPreventToggle.current = true;\r\n break;\r\n default:\r\n //do nothing\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!isCalendarOpen && shouldPreventToggle.current) {\r\n inputElement.current.focus();\r\n shouldPreventToggle.current = false;\r\n }\r\n }, [shouldPreventToggle, isCalendarOpen]);\r\n\r\n return (\r\n \r\n \r\n {isCalendarOpen && (\r\n <>\r\n {\r\n shouldPreventToggle.current = true;\r\n }}\r\n >\r\n \r\n \r\n
    \r\n \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nDatePicker.defaultProps = {\r\n wrapperClassName: '',\r\n locale: 'en',\r\n calendarPopperPosition: 'auto',\r\n};\r\n\r\nexport default DatePicker;\r\n","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { Container, Row, Col, Button, Spinner, DropdownButton, Dropdown } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings.js';\r\nimport { ScheduleCommand } from '../commands/ScheduleCommand.js';\r\nimport { LineInfoMap } from './LineInfoMap';\r\nimport DatePicker from \"../libs/react-modern-calendar-datepicker/src/DatePicker\";\r\nimport \"../libs/react-modern-calendar-datepicker/src/DatePicker.css\";\r\n\r\n\r\nexport class MoreSchedules extends Component {\r\n static contextTypes = {\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n commands: {\r\n schedules: new ScheduleCommand()\r\n },\r\n passings: [],\r\n hoursArray: [],\r\n initalHourIndex: undefined,\r\n finalHourIndex: undefined,\r\n selectedDate: null,\r\n showTimeFilterPanel: false,\r\n isLoadingPassings: true,\r\n displayScheduleInfo: true,\r\n displayMap: true\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n //Set function to handle when window is resized\r\n window.onresize = () => this.resize();\r\n\r\n this.getSchedule(new Date());\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onresize = () => { };\r\n }\r\n\r\n resize() {\r\n if (window.innerWidth > 767) {\r\n this.setState({\r\n displayScheduleInfo: true,\r\n displayMap: true\r\n });\r\n } else {\r\n if(this.context.getMenuState()) {\r\n this.context.setMenuState();\r\n}\r\n document.getElementById(\"more-schedules-show-stops-button\").click();\r\n }\r\n }\r\n\r\n //----------------\r\n\r\n getSchedule(date) {\r\n const { passing } = this.props;\r\n const { commands } = this.state;\r\n this.setState({\r\n isLoadingPassings: true\r\n });\r\n commands.schedules.getScheduleByLineAndDate(passing.lineId, passing.stopId, passing.direction, date.toISOString(), (r) => this.getScheduleSuccessCallback(r));\r\n }\r\n\r\n getScheduleSuccessCallback(result) {\r\n this.setState({\r\n passings: result,\r\n isLoadingPassings: false\r\n }, () => this.populateHoursArray());\r\n }\r\n\r\n //Array to use in the time filter\r\n populateHoursArray() {\r\n const { passings } = this.state;\r\n let hours = [];\r\n\r\n if (passings.length > 0) {\r\n let initialTimeStamp = passings[0].timeStamp;\r\n let finalTimeStamp = passings[passings.length - 1].timeStamp;\r\n\r\n let initialHour = Math.floor(initialTimeStamp / 60);\r\n\r\n //Add an extra hour to the final hour. Example: If the last trip is at 01:01 AM we add the option to see trips until 2AM\r\n //Adding 60 to the timestamp is the safest way to do it, given that the division always returns an Integer.\r\n let finalHour = Math.floor((finalTimeStamp + 60) / 60);\r\n\r\n for (let i = initialHour; i <= finalHour; i++) {\r\n hours.push(i);\r\n }\r\n\r\n this.setState({\r\n hoursArray: hours,\r\n initialHourIndex: 0,\r\n finalHourIndex: hours.length - 1\r\n });\r\n }\r\n }\r\n\r\n //--------------------\r\n\r\n //HELPER FUNCTIONS\r\n\r\n handleSelectedDate(date) {\r\n const newDateObject = new Date(date.year, date.month - 1, date.day);\r\n this.setState({\r\n selectedDate: date\r\n });\r\n this.getSchedule(newDateObject);\r\n }\r\n\r\n handleShowTimeFilter(show) {\r\n this.setState({\r\n showTimeFilterPanel: show\r\n });\r\n }\r\n\r\n handleInitialHourSelection(index) {\r\n this.setState({\r\n initialHourIndex: index\r\n }, () => this.filterPassings());\r\n }\r\n\r\n handleFinalHourSelection(index) {\r\n this.setState({\r\n finalHourIndex: index\r\n }, () => this.filterPassings());\r\n }\r\n\r\n formatHour(hour) {\r\n if (hour < 10) {\r\n return `0${hour}h`;\r\n }\r\n else if (hour >= 24) {\r\n if (hour - 24 < 10) {\r\n return `0${hour - 24}h`;\r\n } else {\r\n return `${hour - 24}h`;\r\n }\r\n } else {\r\n return `${hour}h`;\r\n }\r\n }\r\n\r\n filterPassings() {\r\n const { initialHourIndex, finalHourIndex, passings } = this.state;\r\n\r\n if (undefined === initialHourIndex || undefined === finalHourIndex) {\r\n return passings;\r\n }\r\n\r\n const { hoursArray } = this.state;\r\n\r\n let initialTimeStamp = hoursArray[initialHourIndex] * 60;\r\n let finalTimeStamp = hoursArray[finalHourIndex] * 60;\r\n\r\n return passings.filter(p => p.timeStamp >= initialTimeStamp && p.timeStamp <= finalTimeStamp);\r\n }\r\n\r\n displayScheduleInfo() {\r\n this.setState({\r\n displayScheduleInfo: true,\r\n displayMap: false\r\n });\r\n }\r\n\r\n displayMap() {\r\n this.setState({\r\n displayScheduleInfo: false,\r\n displayMap: true\r\n });\r\n }\r\n\r\n //--------------\r\n\r\n renderHeader(passing, trip) {\r\n const { onReturn } = this.props;\r\n const { passings, displayScheduleInfo, displayMap } = this.state;\r\n\r\n if (undefined === passing || 0 === passings.length) {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {strings.noInfoToShow}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n const { provider } = this.props;\r\n\r\n return (\r\n
    \r\n \r\n\r\n
    \r\n \r\n |\r\n \r\n
    \r\n\r\n
    \r\n
    \r\n {this.renderProviderLogo(provider)}\r\n
    \r\n
    {passing.lineCode} {passing.name}
    \r\n
    {`${trip.passings[0].name} > ${trip.passings[trip.passings.length - 1].name}`}
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderProviderLogo(provider) {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${provider}`}\r\n );\r\n }\r\n\r\n renderFilters() {\r\n const { selectedDate } = this.state;\r\n\r\n return (\r\n
    \r\n
    this.handleShowTimeFilter(false)}>\r\n this.handleSelectedDate(e)}\r\n inputPlaceholder={strings.selectDate}\r\n colorPrimary=\"#bc8627\"\r\n inputClassName=\"more-schedules-date-picker-input\"\r\n shouldHighlightWeekends\r\n />\r\n
    \r\n\r\n
    \r\n \r\n {this.renderTimePickers()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderTimePickers() {\r\n const { showTimeFilterPanel, hoursArray, initialHourIndex, finalHourIndex } = this.state;\r\n return (\r\n showTimeFilterPanel ?\r\n
    \r\n
    \r\n this.handleInitialHourSelection(e)}>\r\n {\r\n hoursArray.map((h, index) =>\r\n {this.formatHour(h)}\r\n )\r\n }\r\n \r\n this.handleFinalHourSelection(e)}>\r\n {\r\n hoursArray.map((h, index) =>\r\n {this.formatHour(h)}\r\n )\r\n }\r\n \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n :\r\n null\r\n );\r\n }\r\n\r\n renderPassings(passings) {\r\n if (undefined === passings || 0 === passings.length) {\r\n return null;\r\n }\r\n\r\n let filteredPassings = this.filterPassings();\r\n\r\n return (\r\n
    \r\n {strings.moreSchedsTitle}\r\n \r\n {\r\n filteredPassings.map((passing, index) =>\r\n\r\n \r\n \r\n {passing.formattedTimeStamp}\r\n \r\n \r\n )\r\n }\r\n \r\n
    \r\n );\r\n }\r\n\r\n renderInfo(passing, passings, trip) {\r\n if (undefined === passing || 0 === passings.length) {\r\n return this.renderHeader(passing, trip);\r\n }\r\n\r\n return (\r\n
    \r\n {this.renderFilters()}\r\n {this.renderPassings(passings)}\r\n
    \r\n );\r\n }\r\n\r\n renderScreens(trip, passing, provider) {\r\n const { passings, isLoadingPassings, displayScheduleInfo, displayMap } = this.state;\r\n\r\n if (displayScheduleInfo && displayMap) {\r\n return (\r\n \r\n \r\n {this.renderHeader(passing, trip)}\r\n {\r\n isLoadingPassings ?\r\n
    \r\n \r\n
    \r\n :\r\n this.renderInfo(passing, passings, trip)\r\n }\r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n } else {\r\n if (displayScheduleInfo) {\r\n return (\r\n \r\n \r\n {this.renderHeader(passing, trip)}\r\n {\r\n isLoadingPassings ?\r\n
    \r\n \r\n
    \r\n :\r\n this.renderInfo(passing, passings, trip)\r\n }\r\n \r\n
    \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n {this.renderHeader(passing, trip)}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { trip, passing, provider } = this.props;\r\n\r\n return (\r\n \r\n {this.renderScreens(trip, passing, provider)}\r\n \r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Container } from 'react-bootstrap';\r\nimport { strings } from '../resources/strings.js';\r\n\r\nexport class Disclaimer extends Component {\r\n\r\n render() {\r\n const { marginClass } = this.props;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n

    \r\n {strings.disclaimer}\r\n

    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}","import React, { Component, createRef } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { StopPassingInfo } from './StopPassingInfo';\r\nimport { LinePathInfo } from './LinePathInfo';\r\nimport { LineInfo } from './LineInfo';\r\nimport { MoreSchedules } from './MoreSchedules';\r\nimport { Disclaimer } from '../Disclaimer';\r\n\r\nexport class NextDepartures extends Component {\r\n static contextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func,\r\n getMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.stateKey = \"nextDepartures\";\r\n this.stopPassingInfoRef = createRef();\r\n\r\n this.state = {\r\n render: {\r\n component: null,\r\n key: \"stopPassingInfo\",\r\n args: {}\r\n },\r\n available: {\r\n stopPassingInfo: {\r\n type: StopPassingInfo,\r\n callbacks: {\r\n ref: this.stopPassingInfoRef,\r\n onSelectPassing: (args) => this.onChangeView(\"lineInfo\", args),\r\n onSelectLine: (args) => this.onChangeView(\"linePathInfo\", args)\r\n }\r\n },\r\n linePathInfo: {\r\n type: LinePathInfo,\r\n callbacks: {\r\n onReturn: (args) => this.onChangeView(\"stopPassingInfo\", args)\r\n }\r\n },\r\n lineInfo: {\r\n type: LineInfo,\r\n callbacks: {\r\n onReturn: (args) => this.onChangeView(\"stopPassingInfo\", args),\r\n onMoreSchedsClick: (args) => this.onChangeView(\"moreSchedules\", args)\r\n }\r\n },\r\n moreSchedules: {\r\n type: MoreSchedules,\r\n callbacks: {\r\n onReturn: (args) => this.onChangeView(\"lineInfo\", args),\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const state = getState(this.stateKey);\r\n\r\n if (undefined === state) {\r\n const { render, available } = this.state;\r\n render.component = available.stopPassingInfo;\r\n this.setState({\r\n render: render\r\n });\r\n } else {\r\n const { render, available } = this.state;\r\n\r\n render.component = available[state.key];\r\n render.key = state.key;\r\n render.args = state.args;\r\n\r\n this.setState({\r\n render: render\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { setState } = this.context;\r\n const { render } = this.state;\r\n\r\n setState(this.stateKey, render);\r\n }\r\n\r\n onChangeView(view, args) {\r\n const { render, available } = this.state;\r\n render.component = available[view];\r\n render.key = view;\r\n render.args = args;\r\n\r\n this.setState({\r\n render: render\r\n });\r\n }\r\n\r\n getNearStops() {\r\n /*\r\n * This is only called in App.js.\r\n * Used to make sure when user accepts prompt for location we get the nearstops with the new coords.\r\n */\r\n\r\n if (null !== this.stopPassingInfoRef.current) {\r\n this.stopPassingInfoRef.current.getNearStops();\r\n }\r\n }\r\n\r\n render() {\r\n const { render } = this.state;\r\n const isMenuOpen = this.context.getMenuState();\r\n\r\n if (null === render.component || undefined === render.component) {\r\n return null;\r\n }\r\n\r\n const view = React.createElement(\r\n render.component.type,\r\n Object.assign(render.component.callbacks, render.args)\r\n );\r\n\r\n return (\r\n
    \r\n {view}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst planRouteApiRoutes = {\r\n defaultRoute: \"planroute/\"\r\n};\r\n\r\nexport class PlanRouteAPI {\r\n static calculateRoute(request) {\r\n const url = `${planRouteApiRoutes.defaultRoute}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.POST,\r\n body: JSON.stringify(request),\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n\r\n static getLinesByOriginAndDestination(originId, destinationId) {\r\n const url = `${planRouteApiRoutes.defaultRoute}${originId}/${destinationId}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { PlanRouteAPI } from '../../api/PlanRouteAPI';\r\n\r\nexport class PlanRouteCommand {\r\n calculateRoute(request, successCallback, errorCallback) {\r\n const apiResult = PlanRouteAPI.calculateRoute(request);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n\r\n getLinesByOriginAndDestination(originId, destinationId, successCallback, errorCallback) {\r\n const apiResult = PlanRouteAPI.getLinesByOriginAndDestination(originId, destinationId);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\n\r\nexport class SwitchDirectionButton extends Component {\r\n render() {\r\n const { className, switchDirections } = this.props;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}","import React, { Component, createRef } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { MapContainer, TileLayer, Marker, Tooltip, Pane, Polyline, useMap, useMapEvents } from 'react-leaflet';\r\nimport 'leaflet/dist/leaflet.css';\r\nimport MarkerClusterGroup from 'react-leaflet-markercluster';\r\nimport { SearchBar } from '../SearchBar';\r\nimport { PlanRouteCommand } from '../commands/PlanRouteCommand';\r\nimport { Button, Row, Col, ListGroup, ListGroupItem, Spinner } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\nimport { SwitchDirectionButton } from '../SwitchDirectionButton';\r\nimport { ProviderCommand } from '../commands/ProviderCommand';\r\nimport { StopCommand } from '../commands/StopCommand';\r\nimport { POICommand } from '../commands/POICommand';\r\nimport { routeDestinationIcon, routeOriginIcon, stopIcon, ticketOfficeIcon, clusterIcon } from '../leaflet/StopIcons';\r\nimport DatePicker from \"../libs/react-modern-calendar-datepicker/src/DatePicker\";\r\nimport \"../libs/react-modern-calendar-datepicker/src/DatePicker.css\";\r\nimport TimeKeeper from 'react-timekeeper';\r\n\r\nexport class AllRoutesView extends Component {\r\n static contextTypes = {\r\n setState: PropTypes.func,\r\n getState: PropTypes.func,\r\n getMapCenter: PropTypes.func,\r\n setMapCenter: PropTypes.func,\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.stateKey = \"allRoutesView\";\r\n this.originSearchBarRef = createRef();\r\n this.destinationSearchBarRef = createRef();\r\n this.mapRef = React.createRef();\r\n\r\n this.state = {\r\n commands: {\r\n stops: new StopCommand(),\r\n planRoute: new PlanRouteCommand(),\r\n poi: new POICommand(),\r\n provider: new ProviderCommand()\r\n },\r\n request: {\r\n startTime: undefined,\r\n endTime: undefined,\r\n type: 0, //RequestType 0 == RouteFinder\r\n route: [{ in: undefined, out: undefined }],\r\n preferences: undefined, //Preferences 0 == OptimiseArrivalTime, 1 == OptimiseChanges, 4 == OptimiseWalkTime\r\n maxResultTrips: undefined,\r\n isArrivalTime: true,\r\n providers: [],\r\n walkSpeed: 1,\r\n maximumRadius: 1000,\r\n username: \"Website\",\r\n ip: \"\",\r\n ticket: -1\r\n },\r\n nearStops: [],\r\n nearTO: [],\r\n trips: [],\r\n mapRadius: 227753,\r\n polylines: [],\r\n timeFilterSelection: undefined,\r\n displayResults: false,\r\n displayingResultsForTheFirstTime: false,\r\n planningRoutes: false,\r\n selectedDepartureDate: null,\r\n selectedDepartureTime: null,\r\n selectedArrivalDate: null,\r\n selectedArrivalTime: null,\r\n displayDepartureDateDatePicker: false,\r\n displayDepartureDateTimePicker: false,\r\n displayArrivalDateDatePicker: false,\r\n displayArrivalDateTimePicker: false\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const state = getState(this.stateKey);\r\n\r\n //Set function to handle when window is resized\r\n window.onresize = () => this.resize();\r\n\r\n if (undefined === state) {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n this.getProviders();\r\n } else {\r\n this.setState(state);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onresize = () => { };\r\n const { setState } = this.context;\r\n setState(this.stateKey, this.state);\r\n }\r\n\r\n resize() {\r\n if (window.innerWidth < 1142) {\r\n if (this.context.getMenuState()) {\r\n this.context.setMenuState();\r\n }\r\n }\r\n }\r\n\r\n //DATA\r\n\r\n getNearStops() {\r\n const { commands, mapRadius } = this.state;\r\n const { getMapCenter } = this.context;\r\n\r\n const mapCenter = null !== this.mapRef.current ? this.mapRef.current.getCenter() : getMapCenter();\r\n\r\n if (Array.isArray(mapCenter)) {\r\n commands.stops.getNearStops(mapCenter[0], mapCenter[1], parseInt(mapRadius, 10), (r) => this.getNearStopsSuccessCallback(r));\r\n } else {\r\n commands.stops.getNearStops(mapCenter.lat, mapCenter.lng, parseInt(mapRadius, 10), (r) => this.getNearStopsSuccessCallback(r))\r\n }\r\n }\r\n\r\n getNearStopsSuccessCallback(result) {\r\n const { nearStops } = this.state;\r\n\r\n this.setState({\r\n nearStops: nearStops.concat(result.filter(r => nearStops.find(s => s.id === r.id) === undefined))\r\n });\r\n }\r\n\r\n getNearPOI() {\r\n const { commands, mapRadius } = this.state;\r\n const { getMapCenter } = this.context;\r\n\r\n const mapCenter = null !== this.mapRef.current ? this.mapRef.current.getCenter() : getMapCenter();\r\n if (Array.isArray(mapCenter)) {\r\n commands.poi.getNearPOI(mapCenter[0], mapCenter[1], parseInt(mapRadius, 10), (r) => this.getNearPOISuccessCallback(r))\r\n } else {\r\n commands.poi.getNearPOI(mapCenter.lat, mapCenter.lng, parseInt(mapRadius, 10), (r) => this.getNearPOISuccessCallback(r))\r\n }\r\n }\r\n\r\n getNearPOISuccessCallback(result) {\r\n const { nearTO } = this.state;\r\n\r\n this.setState({\r\n nearTO: nearTO.concat(result.filter(r => nearTO.find(s => s.id === r.id) === undefined))\r\n });\r\n }\r\n\r\n getProviders() {\r\n const { commands } = this.state;\r\n commands.provider.getProviders((r) => this.providersSuccessCallback(r));\r\n }\r\n\r\n providersSuccessCallback(result) {\r\n const { request } = this.state;\r\n\r\n request.providers = result.map((provider) => provider.name);\r\n request.preferences = 0;\r\n request.maxResultTrips = 3;\r\n\r\n this.setState({\r\n request: request\r\n });\r\n }\r\n\r\n planRoute(e) {\r\n e.preventDefault();\r\n const { commands, request } = this.state;\r\n\r\n if (undefined !== request.route[0].in && undefined !== request.route[0].out) {\r\n\r\n this.setState({\r\n planningRoutes: true,\r\n polylines: []\r\n });\r\n\r\n commands.planRoute.calculateRoute(request, (r) => this.planRouteSuccessCallback(r));\r\n }\r\n }\r\n\r\n planRouteSuccessCallback(result) {\r\n this.setState({\r\n trips: result.trips,\r\n planningRoutes: false,\r\n displayResults: true,\r\n displayingResultsForTheFirstTime: true\r\n }, () => this.renderResultsPaths(result.trips));\r\n }\r\n\r\n //FUNCTIONS\r\n\r\n setRadius(radius) {\r\n this.setState({\r\n mapRadius: radius\r\n }, () => {\r\n this.getNearStops();\r\n this.getNearPOI();\r\n });\r\n }\r\n\r\n getBounds() {\r\n const { trips, polylines, displayResults } = this.state;\r\n if (displayResults && 0 !== trips.length && 0 !== polylines) {\r\n const bounds = trips.reduce((previousValue, currentValue) => {\r\n\r\n if (previousValue.minLatitude > currentValue.minLatitude) {\r\n previousValue.minLatitude = currentValue.minLatitude;\r\n }\r\n\r\n if (previousValue.maxLatitude < currentValue.maxLatitude) {\r\n previousValue.maxLatitude = currentValue.maxLatitude;\r\n }\r\n\r\n if (previousValue.minLongitude > currentValue.minLongitude) {\r\n previousValue.minLongitude = currentValue.minLongitude;\r\n }\r\n\r\n if (previousValue.maxLongitude < currentValue.maxLongitude) {\r\n previousValue.maxLongitude = currentValue.maxLongitude;\r\n }\r\n\r\n return previousValue;\r\n }, {\r\n minLatitude: 90.0, //Max possilbe latitude value\r\n maxLatitude: -90.0, //Min possible latitude value\r\n minLongitude: 180.0, //Max possible longitude value\r\n maxLongitude: -180.0 //Min possilbe longitude value\r\n });\r\n\r\n return [{ lat: bounds.minLatitude, lng: bounds.minLongitude - 0.01 }, { lat: bounds.maxLatitude + 0.005, lng: bounds.maxLongitude }];\r\n }\r\n return [{ lat: window.defaultCoordinates.lat - 0.5, lng: window.defaultCoordinates.lng - 0.5 }, { lat: window.defaultCoordinates.lat + 0.5, lng: window.defaultCoordinates.lng + 0.5 }];\r\n }\r\n\r\n handleStopSelection(stop, recenter) {\r\n const { request } = this.state;\r\n\r\n this.getNearStops();\r\n this.getNearPOI();\r\n\r\n //If both are set or unset, we make the selected stop the origin\r\n if ((undefined === request.route[0].in && undefined === request.route[0].out) || (undefined !== request.route[0].in && undefined !== request.route[0].out)) {\r\n request.route[0].in = stop;\r\n this.originSearchBarRef.current.updateSearchTextWithoutSearching(stop.name);\r\n } else if (request.route[0].in === undefined) {\r\n request.route[0].in = stop;\r\n this.originSearchBarRef.current.updateSearchTextWithoutSearching(stop.name);\r\n } else {\r\n request.route[0].out = stop;\r\n this.destinationSearchBarRef.current.updateSearchTextWithoutSearching(stop.name);\r\n }\r\n\r\n this.setState({\r\n request: request\r\n }, () => {\r\n this.renderRoutePath();\r\n });\r\n }\r\n\r\n handleSelectStartDateOptionClick() {\r\n this.setState({\r\n displayArrivalDateDatePicker: false,\r\n displayDepartureDateDatePicker: true\r\n }, () => {\r\n //Simulate click to open calendar right away\r\n document.getElementsByName(\"plan-route-departure-date-picker-input\")[0].click();\r\n });\r\n }\r\n\r\n handleSelectEndDateOptionClick() {\r\n this.setState({\r\n displayDepartureDateDatePicker: false,\r\n displayArrivalDateDatePicker: true\r\n }, () => {\r\n //Simulate click to open calendar right away\r\n document.getElementsByName(\"plan-route-arrival-date-picker-input\")[0].click();\r\n });\r\n }\r\n\r\n handleStartStopSelection(stop) {\r\n const { request } = this.state;\r\n request.route[0].in = stop;\r\n\r\n this.mapRef.current.fire(\"click\", { forcedEvent: true, latlng: { lat: stop.coordX, lng: stop.coordY } });\r\n\r\n this.setState({\r\n request: request,\r\n trips: [],\r\n polylines: [],\r\n displayResults: false\r\n }, () => {\r\n this.renderRoutePath();\r\n });\r\n }\r\n\r\n handleStartSearchBarClear() {\r\n const { request } = this.state;\r\n request.route[0].in = undefined;\r\n this.originSearchBarRef.current.updateSearchTextWithoutSearching(\"\");\r\n\r\n this.setState({\r\n request: request,\r\n trips: [],\r\n polylines: [],\r\n displayResults: false\r\n });\r\n }\r\n\r\n handleEndStopSelection(stop) {\r\n const { request } = this.state;\r\n\r\n request.route[0].out = stop;\r\n this.mapRef.current.fire(\"click\", { forcedEvent: true, latlng: { lat: stop.coordX, lng: stop.coordY } });\r\n\r\n this.setState({\r\n request: request,\r\n trips: [],\r\n polylines: [],\r\n displayResults: false\r\n }, () => {\r\n this.renderRoutePath();\r\n });\r\n }\r\n\r\n handleEndSearchBarClear() {\r\n const { request } = this.state;\r\n request.route[0].out = undefined;\r\n this.destinationSearchBarRef.current.updateSearchTextWithoutSearching(\"\");\r\n\r\n this.setState({\r\n request: request,\r\n trips: [],\r\n polylines: [],\r\n displayResults: false\r\n });\r\n }\r\n\r\n handleTripSelected(trip) {\r\n const { onSelectRoute } = this.props;\r\n const { providers } = this.state;\r\n onSelectRoute({ trip: trip, providers: providers });\r\n }\r\n\r\n handleTripPanelClose() {\r\n this.handleStartSearchBarClear();\r\n this.handleEndSearchBarClear();\r\n this.getNearStops();\r\n this.getNearPOI()\r\n }\r\n\r\n\r\n determineStopIcon(stop) {\r\n const { request } = this.state;\r\n\r\n if (undefined !== request.route[0].in && stop.code === request.route[0].in.code) {\r\n return routeOriginIcon;\r\n }\r\n\r\n if (undefined !== request.route[0].out && stop.code === request.route[0].out.code) {\r\n return routeDestinationIcon;\r\n }\r\n\r\n return stopIcon;\r\n }\r\n\r\n determineTicketOfficeIcon(ticketOffice) {\r\n const { request } = this.state;\r\n\r\n if (undefined !== request.route[0].in && ticketOffice.code === request.route[0].in.code) {\r\n return routeOriginIcon;\r\n }\r\n\r\n if (undefined !== request.route[0].out && ticketOffice.code === request.route[0].out.code) {\r\n return routeDestinationIcon;\r\n }\r\n\r\n return ticketOfficeIcon;\r\n }\r\n\r\n determineTripIcon(trip) {\r\n if (trip.subTrips.length === 1 && trip.subTrips[0].isWalking) {\r\n return \"icons/walking.png\";\r\n } else {\r\n return \"icons/bus.png\";\r\n }\r\n }\r\n\r\n determineLineCode(trip) {\r\n const subtrip = trip.subTrips.find(st => undefined !== st && null !== st.lineCode && undefined !== st.lineCode);\r\n if (undefined !== subtrip) {\r\n return subtrip.lineCode;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n switchDirections() {\r\n const { request } = this.state;\r\n const origin = request.route[0].in;\r\n const destination = request.route[0].out;\r\n\r\n //Reset all\r\n request.route[0].in = undefined;\r\n request.route[0].out = undefined;\r\n this.originSearchBarRef.current.updateSearchTextWithoutSearching(\"\");\r\n this.destinationSearchBarRef.current.updateSearchTextWithoutSearching(\"\");\r\n //----\r\n\r\n if (undefined === origin && undefined === destination) {\r\n return null;\r\n }\r\n\r\n if (undefined !== origin) {\r\n request.route[0].out = origin;\r\n this.destinationSearchBarRef.current.updateSearchTextWithoutSearching(origin.name);\r\n }\r\n\r\n if (undefined !== destination) {\r\n request.route[0].in = destination;\r\n this.originSearchBarRef.current.updateSearchTextWithoutSearching(destination.name);\r\n }\r\n\r\n this.setState({\r\n request: request,\r\n trips: [],\r\n polylines: [],\r\n displayResults: false\r\n }, () =>\r\n this.renderRoutePath()\r\n );\r\n }\r\n\r\n setStartDate(date) {\r\n const { request } = this.state;\r\n\r\n request.startTime = date;\r\n request.endTime = undefined;\r\n\r\n this.setState({\r\n request: request,\r\n timeFilterSelection: \"Agora\",\r\n displayDepartureDateDatePicker: false,\r\n displayDepartureDateTimePicker: false,\r\n displayArrivalDateDatePicker: false,\r\n displayArrivalDateTimePicker: false\r\n });\r\n }\r\n\r\n handleSelectedDepartureDate(date) {\r\n this.setState({\r\n selectedDepartureDate: date,\r\n displayDepartureDateDatePicker: false,\r\n displayDepartureDateTimePicker: true\r\n });\r\n }\r\n\r\n handleSelectedDepartureTime(time) {\r\n const { request, selectedDepartureDate } = this.state;\r\n\r\n const newDateObject = new Date(selectedDepartureDate.year, selectedDepartureDate.month - 1, selectedDepartureDate.day, time.hour, time.minute);\r\n request.startTime = newDateObject;\r\n request.endTime = undefined;\r\n\r\n this.setState({\r\n selectedDepartureTime: { hour: time.hour, minute: time.minute },\r\n request: request,\r\n displayDepartureDateDatePicker: false,\r\n displayDepartureDateTimePicker: false,\r\n timeFilterSelection: \"Partida\"\r\n });\r\n }\r\n\r\n handleSelectedArrivalDate(date) {\r\n this.setState({\r\n selectedArrivalDate: date,\r\n displayArrivalDateDatePicker: false,\r\n displayArrivalDateTimePicker: true\r\n });\r\n }\r\n\r\n handleSelectedArrivalTime(time) {\r\n const { request, selectedArrivalDate } = this.state;\r\n\r\n const newDateObject = new Date(selectedArrivalDate.year, selectedArrivalDate.month - 1, selectedArrivalDate.day, time.hour, time.minute);\r\n request.endTime = newDateObject;\r\n request.startTime = undefined;\r\n\r\n this.setState({\r\n selectedArrivalTime: { hour: time.hour, minute: time.minute },\r\n request: request,\r\n displayArrivalDateDatePicker: false,\r\n displayArrivalDateTimePicker: false,\r\n timeFilterSelection: \"Chegada\"\r\n });\r\n }\r\n\r\n determineSelectedTime() {\r\n const { request, timeFilterSelection } = this.state;\r\n\r\n switch (timeFilterSelection) {\r\n case \"Agora\":\r\n return strings.planRouteTimeFilterSelectNow;\r\n case \"Partida\":\r\n return `${strings.planRouteTimeFilterSelectedStartDate} ${request.startTime.toLocaleString(strings.locale)}`;\r\n case \"Chegada\":\r\n return `${strings.planRouteTimeFilterSelectedEndDate} ${request.endTime.toLocaleString(strings.locale)}`;\r\n default:\r\n return strings.planRouteTimeFilterSelectNow;\r\n }\r\n }\r\n\r\n determineTimePickerLabel(time) {\r\n if (null === time) {\r\n const now = new Date();\r\n return {\r\n hour: now.getHours(),\r\n minute: now.getMinutes()\r\n }\r\n }\r\n\r\n return time;\r\n }\r\n\r\n //RENDER FUNCTIONS\r\n renderPlanRouteInfo() {\r\n return (\r\n
    this.planRoute(e)}>\r\n
    \r\n \"\"\r\n
    \r\n\r\n {this.renderStopSelectionPanel()}\r\n {this.renderFiltersPanel()}\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderStopSelectionPanel() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n this.handleStartStopSelection(stop)}\r\n onSearchClear={() => this.handleStartSearchBarClear()}\r\n isRequired={true} />\r\n
    \r\n {/* this.recenter() />*/}\r\n
    \r\n\r\n
    \r\n
    \r\n this.handleEndStopSelection(stop)}\r\n onSearchClear={() => this.handleEndSearchBarClear()}\r\n isRequired={true} />\r\n
    \r\n this.switchDirections()} />\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderFiltersPanel() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
      \r\n
    • this.setStartDate(new Date())}>\r\n {strings.planRouteTimeFilterSelectNow}\r\n
    • \r\n
    • this.handleSelectStartDateOptionClick()}>\r\n {strings.planRouteTimeFilterSelectStartDate}\r\n
    • \r\n
    • this.handleSelectEndDateOptionClick()}>\r\n {strings.planRouteTimeFilterSelectEndDate}\r\n
    • \r\n
    \r\n
    \r\n\r\n
    \r\n {strings.planRouteTimeDisclaimer}\r\n
    \r\n
    \r\n {/* \r\n
    \r\n \r\n \r\n
    \r\n */}\r\n
    \r\n\r\n {this.renderDepartureDateTimePicker()}\r\n {this.renderArrivalDateTimePicker()}\r\n
    \r\n );\r\n }\r\n\r\n renderDepartureDateTimePicker() {\r\n const { selectedDepartureDate, selectedDepartureTime, displayDepartureDateDatePicker, displayDepartureDateTimePicker } = this.state;\r\n\r\n if (displayDepartureDateDatePicker) {\r\n return (\r\n
    \r\n this.handleSelectedDepartureDate(e)}\r\n colorPrimary=\"#3167a4\"\r\n inputPlaceholder={strings.planRouteTimeFilterSelectStartDate}\r\n inputName=\"plan-route-departure-date-picker-input\"\r\n inputClassName=\"plan-route-date-picker-input\"\r\n shouldHighlightWeekends\r\n />\r\n
    \r\n );\r\n }\r\n\r\n if (displayDepartureDateTimePicker) {\r\n return (\r\n
    \r\n this.handleSelectedDepartureTime(time)}\r\n doneButton={(time) => (\r\n
    this.handleSelectedDepartureTime(time)}>\r\n {strings.done}\r\n
    \r\n )}\r\n />\r\n
    \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderArrivalDateTimePicker() {\r\n const { selectedArrivalDate, selectedArrivalTime, displayArrivalDateDatePicker, displayArrivalDateTimePicker } = this.state;\r\n\r\n if (displayArrivalDateDatePicker) {\r\n return (\r\n
    \r\n this.handleSelectedArrivalDate(e)}\r\n colorPrimary=\"#3167a4\"\r\n inputPlaceholder={strings.planRouteTimeFilterSelectEndDate}\r\n inputName=\"plan-route-arrival-date-picker-input\"\r\n inputClassName=\"plan-route-date-picker-input\"\r\n shouldHighlightWeekends\r\n />\r\n
    \r\n );\r\n }\r\n\r\n if (displayArrivalDateTimePicker) {\r\n return (\r\n
    \r\n this.handleSelectedArrivalTime(time)}\r\n doneButton={(time) => (\r\n
    this.handleSelectedArrivalTime(time)}>\r\n {strings.done}\r\n
    \r\n )}\r\n />\r\n
    \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n renderTrips() {\r\n const { trips, planningRoutes, displayResults } = this.state;\r\n\r\n //If not loading, but selected stop or selected stop passings are undefined, return nothing\r\n if (!displayResults) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {strings.plannedRoutes}\r\n
    \r\n
    this.planRoute(e)} />\r\n
    this.handleTripPanelClose()} />\r\n
    \r\n\r\n \r\n {\r\n planningRoutes ?\r\n \r\n \r\n \r\n :\r\n this.renderTripsInfo(trips)}\r\n \r\n\r\n
    \r\n );\r\n }\r\n\r\n renderTripsInfo(trips) {\r\n if (0 !== trips.length) {\r\n return (\r\n trips.map((trip, index) =>\r\n this.handleTripSelected(trip)}>\r\n \r\n \r\n {this.renderTripChanges(trip)}\r\n \r\n \r\n
    \r\n {strings.originStopPlaceHolder}: {trip.departureTimeToShow}\r\n
    \r\n
    \r\n {strings.destinationStopPlaceHolder}: {trip.arrivalTimeToShow}\r\n
    \r\n \r\n
    \r\n
    \r\n )\r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n {strings.noInfoToShow}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n renderTripChanges(trip) {\r\n let nonWalkingSubtrips = trip.subTrips.filter(st => st.isWalking === false);\r\n\r\n return (\r\n
    \r\n
    \r\n {trip.subTrips.map((subtrip, index) => this.renderSubtripChangesInfo(trip, subtrip, index))}\r\n
    \r\n {\r\n nonWalkingSubtrips.length - 1 > 0 ?\r\n
    \r\n {strings.includes} {nonWalkingSubtrips.length - 1} {strings.changes}\r\n
    \r\n :\r\n null\r\n }\r\n
    \r\n );\r\n }\r\n\r\n renderSubtripChangesInfo(trip, subtrip, index) {\r\n const { getLogo } = this.context;\r\n const components = [];\r\n\r\n if (subtrip.isWalking) {\r\n components.push(\"\");\r\n } else {\r\n //TO DO: Use transport type here instead of bus as default\r\n components.push(\r\n
    \r\n
    {subtrip.lineCode}
    \r\n
    \r\n );\r\n }\r\n\r\n if (trip.subTrips.length - 1 !== index) {\r\n components.push(
    );\r\n }\r\n\r\n return components;\r\n }\r\n\r\n renderRoutePath() {\r\n const { request } = this.state;\r\n\r\n if (undefined !== request.route[0].in && undefined !== request.route[0].out) {\r\n const positions = [\r\n [request.route[0].in.coordX, request.route[0].in.coordY],\r\n [request.route[0].out.coordX, request.route[0].out.coordY]\r\n ];\r\n\r\n\r\n const polyline = [];\r\n this.setState({\r\n polylines: polyline\r\n });\r\n }\r\n }\r\n\r\n renderPolyLine(subTrip, color, tripIdx, subTripIdx) {\r\n if (Array.isArray(subTrip.breakpoints) && 0 < subTrip.breakpoints.length) {\r\n return (\r\n [breakpoint.latitude, breakpoint.longitude])}\r\n color={color}\r\n dashArray={subTrip.isWalking ? \"2 8\" : null} />\r\n );\r\n }\r\n\r\n return (\r\n [passing.x, passing.y])}\r\n color={color}\r\n dashArray={subTrip.isWalking ? \"2 8\" : null} />\r\n );\r\n }\r\n\r\n renderResultsPaths(trips) {\r\n if (!Array.isArray(trips) || 0 === trips.length) {\r\n return;\r\n }\r\n\r\n const polylines = trips.slice()\r\n .reduce(\r\n (output, trip, tripIdx) =>\r\n output.concat(trip.subTrips.map((subTrip, subTripIdx) => this.renderPolyLine(subTrip, 0 === tripIdx ? \"#bc8627\" : \"gray\", tripIdx, subTripIdx))),\r\n []\r\n )\r\n .reverse();\r\n\r\n this.setState({\r\n polylines: polylines\r\n });\r\n }\r\n\r\n renderNearStops() {\r\n const { displayResults, nearStops } = this.state;\r\n\r\n if (displayResults) {\r\n return null;\r\n }\r\n\r\n return (\r\n nearStops.map((stop) =>\r\n {\r\n this.handleStopSelection(stop, false)\r\n }\r\n }}>\r\n\r\n \r\n {this.renderProviderLogo(stop, \"15px\")}\r\n {stop.name}\r\n ({stop.code})\r\n \r\n \r\n )\r\n );\r\n }\r\n\r\n renderNearTO() {\r\n const { displayResults, nearTO } = this.state;\r\n\r\n if (displayResults) {\r\n return null;\r\n }\r\n\r\n return (\r\n nearTO.map((ticketOffice) =>\r\n {\r\n this.handleStopSelection(ticketOffice, false)\r\n }\r\n }}>\r\n\r\n \r\n {ticketOffice.name}\r\n \r\n \r\n )\r\n );\r\n }\r\n\r\n renderProviderLogo(stop, height = \"auto\") {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(stop.provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${stop.provider}`}\r\n );\r\n }\r\n\r\n render() {\r\n const { request, polylines, displayResults, displayingResultsForTheFirstTime } = this.state;\r\n\r\n return (\r\n
    \r\n\r\n
    \r\n {this.renderPlanRouteInfo()}\r\n\r\n {this.renderTrips()}\r\n
    \r\n\r\n { this.mapRef.current = mapInstance }}>\r\n \r\n\r\n \r\n {this.renderNearStops()}\r\n {this.renderNearTO()}\r\n \r\n\r\n {\r\n undefined !== request.route[0].in ?\r\n \r\n\r\n \r\n {this.renderProviderLogo(request.route[0].in, \"15px\")}\r\n {request.route[0].in.name}\r\n ({request.route[0].in.code})\r\n \r\n \r\n :\r\n null\r\n }\r\n\r\n {\r\n undefined !== request.route[0].out ?\r\n \r\n\r\n \r\n {this.renderProviderLogo(request.route[0].out, \"15px\")}\r\n {request.route[0].out.name}\r\n ({request.route[0].out.code})\r\n \r\n \r\n :\r\n null\r\n }\r\n \r\n {polylines}\r\n \r\n\r\n {\r\n displayResults && displayingResultsForTheFirstTime ?\r\n \r\n :\r\n null\r\n }\r\n this.setRadius(value)} displayResults={displayResults} />\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nfunction SetBounds({ bounds }) {\r\n const map = useMap();\r\n const mapSize = map.getSize();\r\n\r\n if (window.screen.availWidth < 1024) {\r\n map.fitBounds(bounds, { paddingTopLeft: [0, 600] });\r\n } else {\r\n map.fitBounds(bounds, { paddingTopLeft: [mapSize.x * 0.3, 0] });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n\r\nfunction MapEvents(args) {\r\n const map = useMap();\r\n useMapEvents({\r\n dragend: (e) => {\r\n map.setView(e.target.getCenter(), map.getZoom());\r\n if (!args.displayResults) {\r\n const radius = e.target.getCenter().distanceTo(e.target.getBounds().getNorthWest());\r\n args.setRadius(radius);\r\n }\r\n },\r\n zoomend: (e) => {\r\n map.setView(e.target.getCenter(), map.getZoom());\r\n if (!args.displayResults) {\r\n const radius = e.target.getCenter().distanceTo(e.target.getBounds().getNorthWest());\r\n args.setRadius(radius);\r\n }\r\n },\r\n click: (e) => {\r\n //If it was fired programatically\r\n if (e.forcedEvent) {\r\n const radius = e.target.getCenter().distanceTo(e.target.getBounds().getNorthWest());\r\n map.setView({ lat: e.latlng.lat, lng: e.latlng.lng }, map.getZoom());\r\n args.setRadius(radius);\r\n }\r\n }\r\n });\r\n return null;\r\n}\r\n","import React, { Component } from 'react';\r\nimport { useMap, MapContainer, TileLayer, Pane, Polyline, Marker, Tooltip } from 'react-leaflet';\r\nimport { routeOriginIcon, routeDestinationIcon, lineInfoStopIcon } from '../leaflet/StopIcons';\r\nimport { strings } from '../../resources/strings';\r\nimport 'leaflet/dist/leaflet.css';\r\n\r\nexport class DetailedRouteMap extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n mapComponent: null\r\n }\r\n }\r\n\r\n //HELPER FUNCTIONS\r\n getBounds(trip) {\r\n if (undefined === trip) {\r\n return [{ lat: 41.1483096, lng: -8.6108148 }, { lat: 41.1442942, lng: -8.6105935 }];\r\n }\r\n\r\n return [{ lat: trip.maxLatitude, lng: trip.maxLongitude }, { lat: trip.minLatitude, lng: trip.minLongitude }];\r\n }\r\n\r\n panToSpecificSubtrip(subtrip) {\r\n this.state.mapComponent.flyToBounds([{ lat: subtrip.maxLatitude, lng: subtrip.maxLongitude }, { lat: subtrip.minLatitude, lng: subtrip.minLongitude }]);\r\n }\r\n\r\n //------------------------\r\n\r\n renderPolyLine(subTrip, index) {\r\n if (Array.isArray(subTrip.breakpoints) && 0 < subTrip.breakpoints.length) {\r\n return (\r\n [breakpoint.latitude, breakpoint.longitude])}\r\n color=\"#bc8627\"\r\n dashArray={subTrip.isWalking ? \"2 8\" : null} />\r\n );\r\n }\r\n\r\n return (\r\n [passing.x, passing.y])}\r\n color=\"#bc8627\"\r\n dashArray={subTrip.isWalking ? \"2 8\" : null} />\r\n );\r\n }\r\n\r\n renderPath(trip) {\r\n if (undefined === trip) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n trip.subTrips.map((subTrip, index) => this.renderPolyLine(subTrip, index))\r\n }\r\n
    \r\n );\r\n }\r\n\r\n renderPathStops(trip) {\r\n if (undefined === trip) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {this.renderTooltip(trip, \"origin\")}\r\n \r\n\r\n {this.renderSubtripMarkers(trip.subTrips)}\r\n\r\n\r\n \r\n {this.renderTooltip(trip.endPlace, \"destination\")}\r\n \r\n
    \r\n );\r\n }\r\n\r\n renderSubtripMarkers(subtrips) {\r\n return subtrips.map((subtrip, index) => {\r\n if (0 !== subtrip.passings.length && 0 !== index) {\r\n return (\r\n \r\n {this.renderTooltip(subtrip, \"subtrip\")}\r\n \r\n );\r\n }\r\n\r\n return null;\r\n });\r\n }\r\n\r\n renderTooltip(data, type) {\r\n if (\"origin\" === type) {\r\n return (\r\n \r\n
    \r\n {data.startPlace.name}\r\n
    \r\n {\r\n 0 !== data.subTrips.length ?\r\n data.subTrips[0].isWalking ?\r\n {strings.walkAround} {data.subTrips[0].walkingTime}, {data.subTrips[0].distance}m\r\n :\r\n {data.subTrips[0].lineCode} {data.subTrips[0].passings[0].destination}\r\n :\r\n null\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n if (\"destination\" === type) {\r\n return (\r\n \r\n {data.name}\r\n \r\n );\r\n }\r\n\r\n if (0 !== data.passings.length) {\r\n return (\r\n \r\n
    \r\n {data.passings[0].name}\r\n
    \r\n {\r\n data.isWalking ?\r\n {strings.walkAround} {data.walkingTime}, {data.distance}m\r\n :\r\n {data.lineCode} {data.passings[0].destination}\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n const { trip } = this.props;\r\n return (\r\n this.setState({ mapComponent: e })}>\r\n \r\n \r\n \r\n {this.renderPath(trip)}\r\n \r\n \r\n {this.renderPathStops(trip)}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction SetBounds({ bounds }) {\r\n const map = useMap();\r\n map.fitBounds(bounds);\r\n return null;\r\n}\r\n","import React, { Component, createRef } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { DetailedRouteMap } from './DetailedRouteMap';\r\nimport { Container, Row, Col, Button } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\n\r\nexport class RouteDetailedView extends Component {\r\n static contextTypes = {\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.detailedRouteMapRef = createRef();\r\n\r\n this.state = {\r\n displayTripInfo: true,\r\n displayMap: true\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n /*\r\n * Set function to handle when window is resized and immediately call it so we check the current screen size, otherwise it is only\r\n * triggered on resize.\r\n */\r\n window.onresize = () => this.resize();\r\n this.resize();\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onresize = () => { };\r\n }\r\n\r\n //-------\r\n\r\n resize() {\r\n if (window.innerWidth > 767) {\r\n this.setState({\r\n displayTripInfo: true,\r\n displayMap: true\r\n });\r\n } else {\r\n if (this.context.getMenuState()) {\r\n this.context.setMenuState();\r\n }\r\n document.getElementById(\"route-detailed-view-show-trip-button\").click();\r\n }\r\n }\r\n\r\n determineTripIcon(trip) {\r\n if (trip.subTrips.length === 1 && trip.subTrips[0].isWalking) {\r\n return \"icons/walking.png\";\r\n } else {\r\n return \"icons/bus.png\";\r\n }\r\n }\r\n\r\n determineLineCode(trip) {\r\n const subtrip = trip.subTrips.find(st => undefined !== st && null !== st.lineCode && undefined !== st.lineCode);\r\n if (undefined !== subtrip) {\r\n return subtrip.lineCode;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n displayTripInfo() {\r\n this.setState({\r\n displayTripInfo: true,\r\n displayMap: false\r\n });\r\n }\r\n\r\n displayMap() {\r\n this.setState({\r\n displayTripInfo: false,\r\n displayMap: true\r\n });\r\n }\r\n\r\n handleSubtripClick(subtrip) {\r\n this.detailedRouteMapRef.current.panToSpecificSubtrip(subtrip);\r\n }\r\n\r\n //RENDER\r\n renderDisplay() {\r\n const { displayTripInfo, displayMap } = this.state;\r\n const { trip } = this.props;\r\n\r\n if (displayTripInfo && displayMap) {\r\n return (\r\n \r\n \r\n {this.renderInfo(trip)}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n } else {\r\n if (displayTripInfo) {\r\n return (\r\n \r\n \r\n {this.renderInfo(trip)}\r\n \r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n {this.renderHeader(trip)}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n }\r\n\r\n renderInfo(trip) {\r\n if (undefined === trip) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n {this.renderHeader(trip)}\r\n {this.renderTripInfo(trip)}\r\n
    \r\n );\r\n }\r\n\r\n renderHeader(trip) {\r\n const { onReturn } = this.props;\r\n const { displayMap, displayTripInfo } = this.state;\r\n\r\n return (\r\n
    \r\n \r\n\r\n
    \r\n \r\n |\r\n \r\n
    \r\n\r\n {/*\r\n \r\n \"\"\r\n \r\n \r\n
    \r\n {this.determineLineCode(trip)} {trip.endPlace.name}\r\n
    \r\n \r\n \r\n {strings.duration}: {trip.totalTripDuration}\r\n \r\n
    */}\r\n
    \r\n );\r\n }\r\n\r\n renderTripInfo(trip) {\r\n return (\r\n
    \r\n {\r\n trip.subTrips.map((subtrip, index) => {\r\n if (index === 0) {\r\n if (trip.subTrips.length - 1 === index) {\r\n return this.renderSingleSubtrip(trip, subtrip);\r\n } else {\r\n return this.renderFirstSubtrip(trip, subtrip);\r\n }\r\n } else if (trip.subTrips.length - 1 === index) {\r\n return this.renderLastSubtrip(trip, subtrip);\r\n } else {\r\n return this.renderIntermediateSubtrip(trip, subtrip, index);\r\n }\r\n })\r\n }\r\n\r\n
    \r\n {strings.duration}: {trip.totalTripDuration}\r\n
    \r\n\r\n
    \r\n );\r\n }\r\n\r\n renderSingleSubtrip(trip, subtrip) {\r\n const { getLogo } = this.context;\r\n return (\r\n
    this.handleSubtripClick(subtrip)}>\r\n {subtrip.departureTimeToShow}\r\n \"\"\r\n  \r\n {trip.startPlace.name}\r\n\r\n {\r\n subtrip.isWalking ?\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n  \r\n
    \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n
    \r\n }\r\n\r\n {subtrip.arrivalTimeToShow}\r\n \"\"\r\n  \r\n {trip.endPlace.name}\r\n
    \r\n );\r\n\r\n\r\n /*return (\r\n
    \r\n \"\"\r\n  \r\n {subtrip.departureTimeToShow} - {trip.startPlace.name}\r\n\r\n {\r\n subtrip.isWalking ?\r\n
    \r\n \"\"\r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n //TO DO: Use transport types here\r\n
    \r\n \"\"\r\n  \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n }\r\n\r\n \"\"\r\n  \r\n {subtrip.arrivalTimeToShow} - {trip.endPlace.name}\r\n
    \r\n );*/\r\n }\r\n\r\n renderFirstSubtrip(trip, subtrip) {\r\n const { getLogo } = this.context;\r\n\r\n return (\r\n
    this.handleSubtripClick(subtrip)}>\r\n {subtrip.departureTimeToShow}\r\n \"\"\r\n  \r\n {trip.startPlace.name}\r\n\r\n {\r\n subtrip.isWalking ?\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n  \r\n
    \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n
    \r\n }\r\n\r\n {subtrip.arrivalTimeToShow}\r\n \"\"\r\n  \r\n {subtrip.passings[subtrip.passings.length - 1].name}\r\n
    \r\n );\r\n\r\n\r\n /*return (\r\n
    \r\n \"\"\r\n  \r\n {subtrip.departureTimeToShow} - {trip.startPlace.name}\r\n\r\n {\r\n subtrip.isWalking ?\r\n
    \r\n \"\"\r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n //TO DO: Use transport types here\r\n
    \r\n \"\"\r\n  \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n }\r\n\r\n \"\"\r\n  \r\n {subtrip.passings[subtrip.passings.length - 1].name}\r\n
    \r\n {\r\n trip.subTrips[1].isWalking ?\r\n {strings.arrivalEstimatedAt} {subtrip.arrivalTimeToShow}\r\n :\r\n {strings.estimatedWaitingTime} {subtrip.arrivalTimeToShow} {strings.and} {trip.subTrips[1].departureTimeToShow}\r\n }\r\n\r\n
    \r\n );*/\r\n }\r\n\r\n renderIntermediateSubtrip(trip, subtrip, index) {\r\n const { getLogo } = this.context;\r\n\r\n return (\r\n
    this.handleSubtripClick(subtrip)}>\r\n\r\n {\r\n subtrip.isWalking ?\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n  \r\n
    \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n
    \r\n }\r\n\r\n {subtrip.arrivalTimeToShow}\r\n \"\"\r\n  \r\n {subtrip.passings[subtrip.passings.length - 1].name}\r\n
    \r\n );\r\n\r\n /*return (\r\n
    \r\n {\r\n subtrip.isWalking ?\r\n
    \r\n \"\"\r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n //TO DO: Use transport types here\r\n
    \r\n \"\"\r\n  \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n }\r\n\r\n \"\"\r\n  \r\n {subtrip.passings[subtrip.passings.length - 1].name}\r\n
    \r\n {\r\n trip.subTrips[index + 1].isWalking ?\r\n {strings.arrivalEstimatedAt} {subtrip.arrivalTimeToShow}\r\n :\r\n {strings.estimatedWaitingTime} {subtrip.arrivalTimeToShow} {strings.and} {trip.subTrips[index + 1].departureTimeToShow}\r\n }\r\n
    \r\n );*/\r\n }\r\n\r\n renderLastSubtrip(trip, subtrip) {\r\n const { getLogo } = this.context;\r\n\r\n return (\r\n
    this.handleSubtripClick(subtrip)}>\r\n {\r\n subtrip.isWalking ?\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n
    \r\n
    \r\n \"\"\r\n
    \r\n
    \r\n  \r\n
    \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n
    \r\n }\r\n\r\n {subtrip.arrivalTimeToShow}\r\n \"\"\r\n  \r\n {trip.endPlace.name}\r\n\r\n
    \r\n );\r\n\r\n\r\n /*return (\r\n
    \r\n {\r\n subtrip.isWalking ?\r\n
    \r\n \"\"\r\n {strings.walkAround} {subtrip.walkingTime}, {subtrip.distance}m\r\n
    \r\n :\r\n //TO DO: Use transport types here\r\n
    \r\n \"\"\r\n  \r\n {subtrip.provider}\r\n  \r\n {subtrip.lineCode} {subtrip.passings[0].destination}\r\n
    \r\n }\r\n\r\n \"\"\r\n  \r\n {subtrip.arrivalTimeToShow} - {trip.endPlace.name}\r\n\r\n
    \r\n );*/\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.renderDisplay()}\r\n \r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { AllRoutesView } from './AllRoutesView';\r\nimport { RouteDetailedView } from './RouteDetailedView';\r\nimport { Disclaimer } from '../Disclaimer';\r\n\r\nexport class PlanRoute extends Component {\r\n static contextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func,\r\n getMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.stateKey = \"planRoutes\";\r\n\r\n this.state = {\r\n render: {\r\n component: null,\r\n key: \"allRoutesView\",\r\n args: {}\r\n },\r\n available: {\r\n allRoutesView: {\r\n type: AllRoutesView,\r\n callbacks: {\r\n onSelectRoute: (args) => this.onChangeView(\"routeDetailedView\", args)\r\n }\r\n },\r\n routeDetailedView: {\r\n type: RouteDetailedView,\r\n callbacks: {\r\n onReturn: (args) => this.onChangeView(\"allRoutesView\", args),\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const state = getState(this.stateKey);\r\n\r\n if (undefined === state) {\r\n const { render, available } = this.state;\r\n render.component = available.allRoutesView;\r\n this.setState({\r\n render: render\r\n });\r\n } else {\r\n const { render, available } = this.state;\r\n\r\n render.component = available[state.key];\r\n render.key = state.key;\r\n render.args = state.args;\r\n\r\n this.setState({\r\n render: render\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { setState } = this.context;\r\n const { render } = this.state;\r\n\r\n setState(this.stateKey, render);\r\n }\r\n\r\n onChangeView(view, args) {\r\n const { render, available } = this.state;\r\n render.component = available[view];\r\n render.key = view;\r\n render.args = args;\r\n\r\n this.setState({\r\n render: render\r\n });\r\n }\r\n\r\n render() {\r\n const { render } = this.state;\r\n const isMenuOpen = this.context.getMenuState();\r\n\r\n if (null === render.component || undefined === render.component) {\r\n return null;\r\n }\r\n\r\n const view = React.createElement(\r\n render.component.type,\r\n Object.assign(render.component.callbacks, render.args)\r\n );\r\n\r\n return (\r\n
    \r\n {view}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\n","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { Button, Spinner, Overlay, Popover } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\nimport { ProviderCommand } from '../commands/ProviderCommand';\r\nimport { ScheduleCommand } from '../commands/ScheduleCommand';\r\nimport { TripCommand } from '../commands/TripCommand';\r\nimport { Disclaimer } from '../Disclaimer';\r\n\r\nexport class Schedules extends Component {\r\n static contextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func,\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.stateKey = \"schedules\";\r\n\r\n this.state = {\r\n commands: {\r\n provider: new ProviderCommand(),\r\n schedule: new ScheduleCommand(),\r\n trip: new TripCommand()\r\n },\r\n scheduleInfo: { stops: [], trips: [], exceptions: [] },\r\n providers: [],\r\n selectedProvider: undefined,\r\n lines: [],\r\n selectedLine: undefined,\r\n selectedDirection: undefined,\r\n dayTypes: [],\r\n selectedDaytype: undefined,\r\n displayLineDropdown: false,\r\n displayDirectionDropdown: false,\r\n displayDaytypeDropdown: false,\r\n isLoadingInfo: false,\r\n displayNoInfo: false,\r\n displayExceptionsPopover: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const { match, lineId } = this.props;\r\n const state = getState(this.stateKey);\r\n\r\n let params = undefined;\r\n if (undefined !== match) {\r\n params = match.params;\r\n }\r\n\r\n if (undefined === state || (undefined !== params && params.lineId !== undefined) || lineId !== undefined) {\r\n this.getProviders();\r\n } else {\r\n this.setState(state);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { setState } = this.context;\r\n const { lineId } = this.props;\r\n\r\n if (undefined === lineId) {\r\n setState(this.stateKey, this.state);\r\n }\r\n }\r\n\r\n //DATA\r\n getProviders() {\r\n const { commands } = this.state;\r\n commands.provider.getProviders((r) => this.providersSuccessCallback(r));\r\n }\r\n\r\n providersSuccessCallback(result) {\r\n const { displayLineDropdown } = this.props;\r\n\r\n if (1 === result.length) {\r\n this.getProviderLines(result[0]);\r\n }\r\n\r\n this.setState({\r\n providers: result,\r\n displayLineDropdown: undefined !== displayLineDropdown ? displayLineDropdown : true\r\n });\r\n }\r\n\r\n getProviderLines(provider) {\r\n const { commands } = this.state;\r\n const providerName = undefined !== provider.name ? provider.name : \"\";\r\n commands.provider.getProviderLines(providerName, (r) => this.providerLinesSuccessCallback(r))\r\n }\r\n\r\n providerLinesSuccessCallback(result) {\r\n const { match, lineId, direction, displayLineDropdown } = this.props;\r\n let params = undefined;\r\n\r\n if (undefined !== match) {\r\n params = match.params;\r\n }\r\n\r\n this.setState({\r\n lines: result.sort((a, b) => a.name.localeCompare(b.name)),\r\n displayLineDropdown: undefined !== displayLineDropdown ? displayLineDropdown : true,\r\n displayDirectionDropdown: false,\r\n displayDaytypeDropdown: false,\r\n }, () => {\r\n this.setLine(result.find(l => (undefined !== params && l.id === params.lineId) || l.id === lineId));\r\n this.setDirection(undefined !== params ? params.direction : direction);\r\n });\r\n }\r\n\r\n getDaytypes() {\r\n const { selectedLine, commands } = this.state;\r\n commands.schedule.getScheduleByLineGroupByDayType(selectedLine.id, (r) => this.dayTypesSuccessCallback(r));\r\n }\r\n\r\n dayTypesSuccessCallback(result) {\r\n if (0 === result.length) {\r\n this.setState({\r\n displayNoInfo: true\r\n });\r\n } else if (1 === result.length) {\r\n this.setState({\r\n dayTypes: result,\r\n selectedDaytype: result[0],\r\n displayDaytypeDropdown: true,\r\n isLoadingInfo: true\r\n }, () => {\r\n this.getTrips();\r\n });\r\n } else {\r\n this.setState({\r\n dayTypes: result,\r\n displayDaytypeDropdown: true\r\n });\r\n }\r\n }\r\n\r\n getTrips() {\r\n const { commands, selectedLine, selectedDirection, selectedDaytype } = this.state;\r\n commands.trip.getTripsByLineAndDayType(\r\n selectedLine.id, selectedDirection, selectedDaytype.schedules.join(), (r) => this.getTripsSuccessCallback(r));\r\n }\r\n\r\n getTripsSuccessCallback(result) {\r\n if (result.trips.length > 0) {\r\n this.setState({\r\n scheduleInfo: result,\r\n isLoadingInfo: false\r\n });\r\n } else {\r\n this.setState({\r\n displayNoInfo: true,\r\n isLoadingInfo: false\r\n });\r\n }\r\n }\r\n\r\n //---------\r\n\r\n //FUNCTIONS\r\n\r\n setProvider(provider) {\r\n this.setState({\r\n selectedProvider: provider,\r\n selectedLine: undefined,\r\n selectedDirection: undefined,\r\n selectedDaytype: undefined,\r\n scheduleInfo: { stops: [], trips: [], exceptions: [] },\r\n displayLineDropdown: false,\r\n displayDirectionDropdown: false,\r\n displayDaytypeDropdown: false,\r\n displayNoInfo: false\r\n }, () => {\r\n this.getProviderLines(provider);\r\n });\r\n }\r\n\r\n setLine(line) {\r\n if (line === undefined) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n selectedLine: line,\r\n selectedDirection: undefined,\r\n selectedDaytype: undefined,\r\n scheduleInfo: { stops: [], trips: [], exceptions: [] },\r\n displayDirectionDropdown: true,\r\n displayDaytypeDropdown: false,\r\n displayNoInfo: false\r\n });\r\n }\r\n\r\n setDirection(direction) {\r\n if (direction === undefined) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n selectedDirection: direction,\r\n selectedDaytype: undefined,\r\n scheduleInfo: { stops: [], trips: [], exceptions: [] },\r\n displayDaytypeDropdown: false,\r\n displayNoInfo: false\r\n }, () => {\r\n this.getDaytypes();\r\n });\r\n }\r\n\r\n determineDirectionString(direction) {\r\n switch (direction) {\r\n case \"G\":\r\n return strings.directionGo;\r\n case \"R\":\r\n return strings.directionReturn;\r\n case \"C\":\r\n return strings.directionCircular;\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n setDaytype(daytype) {\r\n this.setState({\r\n selectedDaytype: daytype,\r\n isLoadingInfo: true,\r\n scheduleInfo: { stops: [], trips: [], exceptions: [] },\r\n displayNoInfo: false\r\n }, () => {\r\n this.getTrips();\r\n });\r\n }\r\n\r\n setDisplayExceptionsPopover(displayExceptionsPopover) {\r\n this.setState({\r\n displayExceptionsPopover: displayExceptionsPopover\r\n });\r\n }\r\n //---------------\r\n\r\n //RENDER\r\n\r\n renderDropdowns() {\r\n return (\r\n
    \r\n {this.renderProviderDropdown()}\r\n {this.renderLinesDropdown()}\r\n {this.renderDirectionsDropdown()}\r\n {this.renderDaytypesDropdown()}\r\n
    \r\n );\r\n }\r\n\r\n renderProviderDropdown() {\r\n const { providers, selectedProvider } = this.state;\r\n\r\n if (1 >= providers.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n\r\n
      \r\n {\r\n providers.map(provider =>\r\n
    • this.setProvider(provider)}>\r\n
      \r\n {this.renderProviderLogo(provider.name)}\r\n  \r\n {provider.name}\r\n
      \r\n
    • \r\n )\r\n }\r\n
    \r\n\r\n
    \r\n );\r\n }\r\n\r\n renderProviderLogo(provider) {\r\n const { getLogo } = this.context;\r\n const imgUrl = getLogo(provider);\r\n\r\n if (null === imgUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n {`${provider}`}\r\n );\r\n }\r\n\r\n renderLinesDropdown() {\r\n const { lines, selectedLine, displayLineDropdown } = this.state;\r\n\r\n if (!displayLineDropdown) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
      \r\n {\r\n lines.map((line, index) =>\r\n
    • this.setLine(line)}>\r\n \r\n {line.code}\r\n  \r\n {line.name}\r\n \r\n
    • \r\n )\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderDirectionsDropdown() {\r\n const { selectedLine, selectedDirection, displayDirectionDropdown } = this.state;\r\n\r\n if (!displayDirectionDropdown) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
      \r\n {\r\n undefined !== selectedLine.directions ?\r\n selectedLine.directions.map((direction, index) =>\r\n
    • this.setDirection(direction)}>\r\n \r\n {this.determineDirectionString(direction)}\r\n \r\n
    • \r\n )\r\n :\r\n null\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderDaytypesDropdown() {\r\n const { displayDaytypeDropdown, dayTypes, selectedDaytype } = this.state;\r\n\r\n if (!displayDaytypeDropdown) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
      \r\n {\r\n dayTypes.map((daytype, index) =>\r\n
    • this.setDaytype(daytype)}>\r\n \r\n {daytype.name}\r\n \r\n
    • \r\n )\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderScheduleInfo() {\r\n const { isLoadingInfo, scheduleInfo, displayNoInfo } = this.state;\r\n\r\n if (isLoadingInfo) {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n if (displayNoInfo) {\r\n return (\r\n
    \r\n
    {strings.noInfoToShow}
    \r\n
    \r\n );\r\n }\r\n\r\n const hasExceptions = Array.isArray(scheduleInfo.exceptions) && 0 < scheduleInfo.exceptions.length;\r\n\r\n return (\r\n
    \r\n
    \r\n {this.renderStopsList(scheduleInfo, hasExceptions)}\r\n {this.renderTripList(scheduleInfo, hasExceptions)}\r\n
    \r\n\r\n {\r\n //0 !== scheduleInfo.exceptions.length ?\r\n //
    \r\n // {this.renderExceptionList(scheduleInfo)}\r\n //
    \r\n // :\r\n // null\r\n }\r\n
    \r\n );\r\n }\r\n\r\n renderStopsList(scheduleInfo, hasExceptions) {\r\n let exceptionsList = null\r\n if (hasExceptions) {\r\n const { displayExceptionsPopover } = this.state;\r\n const overlayRef = React.createRef();\r\n\r\n exceptionsList = (\r\n
    this.setDisplayExceptionsPopover(!displayExceptionsPopover)}\r\n onMouseEnter={() => this.setDisplayExceptionsPopover(true)}\r\n onMouseLeave={() => this.setDisplayExceptionsPopover(false)}>\r\n {strings.notes}\r\n {this.renderExceptionList(scheduleInfo, displayExceptionsPopover, overlayRef)}\r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n {exceptionsList}\r\n {\r\n scheduleInfo.stops.map((stop, index) =>\r\n
    \r\n {stop.name}\r\n
    \r\n )\r\n }\r\n
    \r\n );\r\n }\r\n\r\n renderTripList(scheduleInfo, hasExceptions) {\r\n return (\r\n
    \r\n {\r\n scheduleInfo.trips.map((trip, index) =>\r\n
    \r\n {hasExceptions ? this.renderTripExceptions(trip) : null}\r\n {this.renderTripPassings(trip, scheduleInfo.stops)}\r\n
    \r\n )\r\n }\r\n
    \r\n );\r\n }\r\n\r\n renderTripExceptions(trip) {\r\n const exceptions = trip\r\n .filter(passing => Array.isArray(passing.exceptions) && 0 < passing.exceptions.length)\r\n .reduce((output, passing) => {\r\n passing.exceptions.forEach(exception => {\r\n if (!output.includes(exception)) {\r\n output.push(exception);\r\n }\r\n });\r\n\r\n return output;\r\n }, []).sort((a, b) => a.localeCompare(b)).join(\", \");\r\n\r\n return (\r\n
    \r\n {\"\" === exceptions ?   : exceptions}\r\n
    \r\n );\r\n }\r\n\r\n renderTripPassings(trip, stops) {\r\n return stops.map(stop => {\r\n const passing = trip.find(passing => passing.stopId === stop.id && passing.stopOrder === stop.order);\r\n if (undefined === passing) {\r\n return (\r\n
    \r\n --:--\r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n {passing.time}\r\n
    \r\n );\r\n });\r\n }\r\n\r\n renderExceptionList(scheduleInfo, displayExceptionsPopover, overlayRef) {\r\n return (\r\n \r\n \r\n \r\n
    \r\n {\r\n scheduleInfo.exceptions.map(exception =>\r\n
    \r\n {exception}\r\n
    \r\n )\r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n render() {\r\n const isMenuOpen = this.context.getMenuState();\r\n return (\r\n
    \r\n {this.renderDropdowns()}\r\n {this.renderScheduleInfo()}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { Button, Row, Col, ListGroup, ListGroupItem } from 'react-bootstrap';\r\nimport { SearchBar } from '../SearchBar';\r\nimport { Schedules } from './Schedules';\r\nimport { strings } from '../../resources/strings';\r\nimport { PlanRouteCommand } from '../commands/PlanRouteCommand';\r\nimport { Disclaimer } from '../Disclaimer';\r\n\r\nexport class SchedulesByStop extends Component {\r\n static contextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func,\r\n getLogo: PropTypes.func,\r\n getMenuState: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.stateKey = \"schedulesByStop\";\r\n\r\n this.state = {\r\n commands: {\r\n planRoute: new PlanRouteCommand()\r\n },\r\n lines: [],\r\n lineSelected: undefined,\r\n origin: undefined,\r\n destination: undefined,\r\n displayResults: false,\r\n displaySchedules: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { getState } = this.context;\r\n const state = getState(this.stateKey);\r\n\r\n if (undefined !== state) {\r\n this.setState(state);\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { setState } = this.context;\r\n\r\n setState(this.stateKey, this.state);\r\n }\r\n\r\n //DATA\r\n checkLines(e) {\r\n e.preventDefault();\r\n this.setState({\r\n selectedLine: undefined,\r\n displaySchedules: false\r\n });\r\n\r\n const { commands, origin, destination } = this.state;\r\n if (undefined !== origin && destination !== undefined) {\r\n commands.planRoute.getLinesByOriginAndDestination(origin.id, destination.id, (r) => this.checkLinesSuccessCallback(r));\r\n }\r\n }\r\n\r\n checkLinesSuccessCallback(result) {\r\n this.setState({\r\n lines: result.sort((a, b) => a.name.localeCompare(b.name)),\r\n displayResults: true\r\n });\r\n }\r\n\r\n //---------\r\n\r\n //FUNCTIONS\r\n handleStartStopSelection(stop) {\r\n this.setState({\r\n origin: stop\r\n });\r\n }\r\n\r\n handleStartSearchBarClear() {\r\n this.setState({\r\n origin: undefined\r\n });\r\n }\r\n\r\n handleEndStopSelection(stop) {\r\n this.setState({\r\n destination: stop\r\n });\r\n }\r\n\r\n handleEndSearchBarClear() {\r\n this.setState({\r\n destination: undefined\r\n });\r\n }\r\n\r\n handleLineSelection(line) {\r\n /*\r\n * This is done to force react to re-render the Schedules component when another line is selected.\r\n * Using some prop as a component key in Schedules isn't working but did work on LineInfoMap.isPermanent().\r\n * So there may be a better way of doing this\r\n \r\n this.setState({\r\n displaySchedules: false\r\n }, () => {\r\n this.setState({\r\n lineSelected: line,\r\n displaySchedules: true\r\n });\r\n });\r\n */\r\n }\r\n //---------------\r\n\r\n //RENDER\r\n renderSearchPanel() {\r\n return (\r\n
    this.checkLines(e)}>\r\n
    \r\n this.handleStartStopSelection(stop)}\r\n onSearchClear={() => this.handleStartSearchBarClear()}\r\n isRequired={true} />\r\n\r\n this.handleEndStopSelection(stop)}\r\n onSearchClear={() => this.handleEndSearchBarClear()}\r\n isRequired={true} />\r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n renderLines() {\r\n const { lines, displayResults } = this.state;\r\n\r\n if (!displayResults) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {strings.availableLines}\r\n
    \r\n
    \r\n\r\n \r\n {this.renderLinesInfo(lines)}\r\n \r\n\r\n
    \r\n );\r\n }\r\n\r\n renderLinesInfo(lines) {\r\n if (0 !== lines.length) {\r\n return (\r\n lines.map((line, index) =>\r\n \r\n \r\n \r\n
    \r\n {line.code}\r\n  \r\n {line.name}\r\n
    \r\n \r\n \r\n {strings.showSchedule}\r\n {/* this.handleLineSelection(line)}>{strings.showSchedule}*/}\r\n \r\n
    \r\n
    \r\n )\r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n {strings.noInfoToShow}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n renderSchedules() {\r\n const { lineSelected, displaySchedules } = this.state;\r\n\r\n if (displaySchedules) {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n const isMenuOpen = this.context.getMenuState();\r\n return (\r\n
    \r\n {this.renderSearchPanel()}\r\n {this.renderLines()}\r\n {this.renderSchedules()}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst contactApiRoutes = {\r\n defaultRoute: \"contact/\"\r\n};\r\n\r\nexport class ContactAPI {\r\n static sendEmail(request) {\r\n const url = `${contactApiRoutes.defaultRoute}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.POST,\r\n body: JSON.stringify(request),\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { ContactAPI } from '../../api/ContactAPI';\r\n\r\nexport class ContactCommand {\r\n sendEmail(message, successCallback, errorCallback) {\r\n const apiResult = ContactAPI.sendEmail(message);\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback();\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback();\r\n }\r\n });\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container, Row, Col, Form, Button, Alert } from 'react-bootstrap';\r\nimport { strings } from '../resources/strings';\r\nimport { ContactCommand } from './commands/ContactCommand';\r\n\r\nexport class Contact extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n commands: {\r\n contacts: new ContactCommand()\r\n },\r\n sending: false,\r\n result: undefined\r\n };\r\n }\r\n\r\n sendMail = (e) => {\r\n e.preventDefault();\r\n\r\n this.setState({ sending: true });\r\n this.state.commands.contacts.sendEmail({\r\n name: e.target.name.value,\r\n email: e.target.email.value,\r\n subject: `${e.target.subjectType.value} - ${e.target.subject.value}`,\r\n message: e.target.message.value\r\n }, (r) => this.sendSuccessCallback(r), (r) => this.sendErrorCallback(r));\r\n }\r\n\r\n sendSuccessCallback(result) {\r\n this.setState({\r\n sending: false,\r\n result: true\r\n });\r\n }\r\n\r\n sendErrorCallback(result) {\r\n this.setState({\r\n sending: false,\r\n result: false\r\n });\r\n }\r\n\r\n onCheckboxChange() {\r\n const { sending } = this.state;\r\n this.setState({\r\n sending: !sending,\r\n });\r\n }\r\n\r\n render() {\r\n const subjectOptions = [strings.general, strings.landingPageTickets, strings.landingPageServiceOnDemand, strings.contactComplaints];\r\n\r\n return (\r\n \r\n \r\n \r\n
    \r\n {strings.contactHeader}
    \r\n Praça António Raposo Tavares
    \r\n 7800 - 426 Beja

    \r\n {strings.email}: geral@trimbal.pt
    \r\n {strings.phone}: 284 401 227

    \r\n

    {strings.contactWorkingDays}
    \r\n {strings.contactSaturdays}
    \r\n {strings.contactSundays}

    \r\n
    \r\n
    \r\n
    \r\n {strings.sendMessage}\r\n
    \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {strings.emailWarning}\r\n \r\n \r\n\r\n \r\n \r\n {\r\n subjectOptions.map((option, index) =>\r\n \r\n )\r\n }\r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n
    \r\n {strings.contactsPrivacyDisclaimer}{strings.privacyPolicy}.\r\n
    \r\n
    \r\n this.onCheckboxChange()}\r\n />\r\n
    \r\n
    \r\n\r\n {this.state.result !== undefined\r\n ? \r\n {this.state.result\r\n ? strings.emailSuccess\r\n : strings.emailError}\r\n \r\n : null}\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst stopApiRoutes = {\r\n defaultRoute: \"message/\"\r\n};\r\n\r\nexport class MessageAPI {\r\n static getMessages() {\r\n const url = `${stopApiRoutes.defaultRoute}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { MessageAPI } from '../../api/MessageAPI';\r\n\r\nexport class MessageCommand {\r\n getMessages(successCallback, errorCallback) {\r\n const apiResult = MessageAPI.getMessages();\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Row, Col, ListGroup, ListGroupItem, Spinner } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\nimport { MessageCommand } from '../commands/MessageCommand';\r\n\r\nexport class Messages extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n messages: [],\r\n isLoadingMessages: true,\r\n commands: {\r\n messages: new MessageCommand()\r\n },\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.getMessages();\r\n }\r\n\r\n //MESSAGES\r\n getMessages() {\r\n this.setState({\r\n isLoadingMessages: true\r\n });\r\n\r\n const { commands } = this.state;\r\n commands.messages.getMessages((r) => this.getMessagesSuccessCallback(r));\r\n }\r\n\r\n getMessagesSuccessCallback(result) {\r\n this.setState({\r\n messages: result,\r\n isLoadingMessages: false\r\n });\r\n }\r\n //----------------\r\n\r\n renderMessage(message, index) {\r\n if (message.type.toLowerCase() === 'aviso' || message.type.toLowerCase() === 'warning') {\r\n return (\r\n \r\n \r\n \r\n {message.creationDateToShow}\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n if (message.type.toLowerCase() === 'imagem' || message.type.toLowerCase() === 'image') {\r\n return (\r\n \r\n \r\n \r\n {message.creationDateToShow}\r\n \r\n \r\n \r\n \r\n {message.httpLink}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n const { isLoadingMessages, messages } = this.state;\r\n\r\n if (isLoadingMessages) {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n if (null === messages) {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n {strings.noMessagesToShow}\r\n \r\n \r\n \r\n \r\n
    \r\n )\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n {\r\n 0 !== messages.length ?\r\n messages.map((message, index) => this.renderMessage(message, index))\r\n :\r\n \r\n \r\n \r\n {strings.noMessagesToShow}\r\n \r\n \r\n \r\n }\r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { strings } from '../resources/strings';\r\n\r\nexport class NotFound extends Component {\r\n render() {\r\n return (\r\n
    \r\n \"\"\r\n {strings.pageNotFound}\r\n
    \r\n );\r\n }\r\n}\r\n","import { API, HTTPMethod, ContentType } from './APICentral';\r\nimport { APIEncoder } from './APIEncoder';\r\n\r\nconst logoApiRoutes = {\r\n defaultRoute: \"logo/\"\r\n};\r\n\r\nexport class LogoAPI {\r\n static getLogos() {\r\n const url = `${logoApiRoutes.defaultRoute}`;\r\n\r\n return API.authenticatedRequest({\r\n url: url,\r\n method: HTTPMethod.GET,\r\n contentType: ContentType.JSON,\r\n key: APIEncoder.getApiKey()\r\n });\r\n }\r\n}","import { LogoAPI } from '../../api/LogoAPI';\r\n\r\nexport class LogoCommand {\r\n getLogos(successCallback, errorCallback) {\r\n const apiResult = LogoAPI.getLogos();\r\n apiResult.then((result) => {\r\n if (undefined !== successCallback) {\r\n successCallback(JSON.parse(result));\r\n }\r\n }).catch((err) => {\r\n if (undefined !== errorCallback) {\r\n errorCallback(err.message);\r\n }\r\n });\r\n }\r\n}","import { Component } from 'react';\r\n\r\nexport class About extends Component {\r\n //RENDER\r\n\r\n render() {\r\n return null;\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { strings } from '../resources/strings';\r\nimport { MessageCommand } from './commands/MessageCommand';\r\nimport { Row, Col, ListGroup, ListGroupItem } from 'react-bootstrap';\r\nimport { PropTypes } from 'prop-types';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\n\r\nexport class LandingPage extends Component {\r\n static displayName = LandingPage.name;\r\n\r\n static contextTypes = {\r\n updateLanguage: PropTypes.func\r\n };\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n messages: [],\r\n isLoadingMessages: true,\r\n commands: {\r\n messages: new MessageCommand()\r\n },\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.getMessages();\r\n }\r\n\r\n //MESSAGES\r\n getMessages() {\r\n this.setState({\r\n isLoadingMessages: true\r\n });\r\n\r\n const { commands } = this.state;\r\n commands.messages.getMessages((r) => this.getMessagesSuccessCallback(r));\r\n }\r\n\r\n getMessagesSuccessCallback(result) {\r\n this.setState({\r\n messages: result,\r\n isLoadingMessages: false\r\n });\r\n }\r\n //----------\r\n\r\n renderMessages() {\r\n const { messages } = this.state;\r\n\r\n if (0 !== messages.length) {\r\n return (\r\n \r\n {\r\n messages.map((message, index) =>\r\n index < 2 ?\r\n message.type.toLowerCase() === 'aviso' || message.type.toLowerCase() === 'warning' ?\r\n \r\n \r\n \r\n {message.creationDateToShow}\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n : message.type.toLowerCase() === 'imagem' || message.type.toLowerCase() === 'image' ?\r\n \r\n \r\n \r\n {message.creationDateToShow}\r\n \r\n \r\n \r\n \r\n {message.httpLink}\r\n \r\n \r\n \r\n : null\r\n : null\r\n )\r\n }\r\n
    \r\n );\r\n } else {\r\n return (\r\n {strings.noMessagesToShow}\r\n );\r\n }\r\n }\r\n\r\n changeLanguage(languageKey) {\r\n const { updateLanguage } = this.context;\r\n updateLanguage(languageKey);\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \"Icon\"/\r\n
    \r\n
    \r\n\r\n\r\n \r\n \r\n \r\n \"\"\r\n {strings.landingPageNetwork}\r\n \r\n \r\n \r\n \r\n \"\"\r\n {strings.landingPageRoutePlanning}\r\n \r\n \r\n \r\n \r\n \"\"\r\n {strings.schedules}\r\n \r\n \r\n \r\n \r\n \"\"\r\n {strings.landingPageTickets}\r\n \r\n \r\n \r\n \r\n \"\"\r\n {strings.landingPageServiceOnDemand}\r\n \r\n \r\n \r\n \r\n \"\"\r\n {strings.landingPageContacts}\r\n \r\n \r\n \r\n\r\n\r\n
    \r\n \r\n
      {strings.messages}\r\n \r\n
    \r\n {this.renderMessages()}\r\n \r\n
    \r\n {strings.seeMore}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container, Row} from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\n\r\nexport class TicketInfo extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n
    {strings.tickets}

    \r\n
    \r\n \r\n
    {strings.simpleOnBoard}
    {strings.fullAndHalf}
    \r\n

    \r\n

      \r\n
    • {strings.fullAndHalfConditionA}
    • \r\n
    • {strings.fullAndHalfConditionB}
    • \r\n
    • {strings.fullAndHalfConditionC}
    • \r\n
    \r\n

    \r\n
    \r\n \r\n
    {strings.prebought}
    \r\n

    \r\n

      \r\n
    • {strings.preboughtConditionA}
    • \r\n
    • {strings.preboughtConditionB}
    • \r\n
    • {strings.preboughtConditionC}
    • \r\n
    \r\n

    \r\n
    \r\n \r\n
    {strings.monthly}
    \r\n

    \r\n

      \r\n
    • {strings.monthlyConditionA}
    • \r\n
    • {strings.monthlyConditionB}
    • \r\n
    • {strings.monthlyConditionC}
    • \r\n
    • {strings.monthlyConditionD}
    • \r\n
    • {strings.monthlyConditionE}
    • \r\n
    \r\n

    \r\n
    \r\n \r\n
    {strings.passes418s23}
    \r\n

    \r\n

      \r\n
    • {strings.passes418s23ConditionA}
    • \r\n
    • {strings.passes418s23ConditionB}
    • \r\n
    • {strings.passes418s23ConditionC}
    • \r\n
    • {strings.passes418s23ConditionD}
    • \r\n
    • {strings.passes418s23ConditionE}
    • \r\n
      \r\n
        \r\n {strings.pass418}\r\n

        \r\n

          \r\n
        • {strings.pass418ConditionF}
        • \r\n
        \r\n

        \r\n
      \r\n
        \r\n {strings.passS23}\r\n

        \r\n

          \r\n
        • {strings.passS23ConditionF}
        • \r\n
        \r\n\r\n

        \r\n
      \r\n
    \r\n

    \r\n

    {strings.passes418s23MoreInfo}
    \r\n {strings.passes418s23}\r\n
    \r\n {strings.passes418s23Faqs}\r\n

    \r\n

    \r\n \r\n \r\n

    {strings.passCIM}
    \r\n

    \r\n

      \r\n
    • {strings.passCIMConditionA}
    • \r\n
    • {strings.passCIMConditionB}
    • \r\n
    • {strings.passCIMConditionC}
    • \r\n
    • {strings.passCIMConditionD}
    • \r\n
    • {strings.passCIMConditionE}
    • \r\n
    • {strings.passCIMConditionF}
    • \r\n
    • {strings.passCIMConditionG}
    • \r\n
    \r\n

    \r\n
    \r\n {strings.ticketsDownload}

    \r\n
    \r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Container, Row } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\n\r\nexport class ServiceOnDemand extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n
    {strings.moreInfoSoon}
    \r\n
    \r\n
    \r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { Container, Row, Col } from 'react-bootstrap';\r\nimport { MapContainer, Marker, TileLayer, Tooltip } from 'react-leaflet';\r\nimport { strings } from '../../resources/strings';\r\nimport { ticketOfficeIcon } from '../leaflet/StopIcons';\r\n\r\nexport class TicketOffice extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n
    \r\n {strings.contactHeader}
    \r\n Praça António Raposo Tavares
    \r\n 7800 - 426 Beja

    \r\n {strings.email}: geral@trimbal.pt
    \r\n {strings.phone}: 284 401 227

    \r\n

    {strings.contactWorkingDays}
    \r\n {strings.contactSaturdays}
    \r\n {strings.contactSundays}

    \r\n
    \r\n\r\n \r\n \r\n \r\n\r\n \r\n Rodoviária do Alentejo\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container, Row} from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\n\r\nexport class PrivacyPolicy extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n
    {strings.privacyPolicy}
    \r\n
    \r\n \r\n

    Leia por favor esta Política de Privacidade com atenção, pois no acesso a este site,\r\n a disponibilização dos seus dados pessoais implica o conhecimento e aceitação das\r\n condições aqui constantes.

    \r\n
    \r\n \r\n

    Quem é o responsável pela recolha e tratamento dos dados?

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. é a entidade responsável pela recolha e tratamento dos dados pessoais, \r\n podendo, no âmbito da sua atividade, recorrer a entidades por si subcontratadas para a prossecução das \r\n finalidades aqui indicadas.

    \r\n
    \r\n \r\n

    Quem é o Encarregado de Proteção de dados?

    \r\n

    O Encarregado de Proteção de Dados é a Protect Data (Best Privacy Consulting Unipessoal Limitada), \r\n representada por Ana Fazendeiro, que pode ser contactada pelo \r\n seguinte endereço de e-mail: privacidade@rodalentejo.pt

    \r\n
    \r\n \r\n

    O que são dados pessoais?

    \r\n

    Dados pessoais são qualquer informação, de qualquer natureza e\r\n independentemente do respetivo suporte, incluindo som e imagem, relativa a uma\r\n pessoa singular identificada ou identificável. É considerada identificável a pessoa\r\n que possa ser identificada direta ou indiretamente, designadamente por referência a\r\n um número de identificação ou a um ou mais elementos específicos da sua\r\n identidade física, fisiológica, psíquica, económica, cultural ou social.

    \r\n
    \r\n \r\n

    Que dados pessoais são recolhidos e tratados?

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. procede à recolha e ao tratamento, entre outros, \r\n dos seguintes dados pessoais: nome, número de telefone e endereço de correio eletrónico.

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. assume que os dados foram fornecidos pelo titular \r\n dos mesmos ou que este deu autorização para o efeito e presume que os mesmos são verdadeiros \r\n e se encontram atualizados.

    \r\n
    \r\n \r\n

    De que forma são recolhidos os seus dados?

    \r\n

    Os dados pessoais podem ser recolhidos através dos seguintes meios:

    \r\n

    \r\n

      \r\n
    1. Correio electrónico;
    2. \r\n
    3. Website;
    4. \r\n
    5. Chamadas telefónicas;
    6. \r\n
    7. Presencialmente;
    8. \r\n
    9. Através de aplicações (“apps”) instaladas em dispositivos móveis.
    10. \r\n
    \r\n

    \r\n

    Os dados recolhidos são processados e armazenados informaticamente e no \r\n estrito cumprimento da legislação de proteção de dados pessoais sendo \r\n armazenados em base de dados específicas, criadas para o efeito, pela \r\n ABA – Autocarros do Baixo Alentejo, S.A. ou pelas entidades por esta subcontratadas.

    \r\n

    Alguns dados pessoais recolhidos no website são de preenchimento obrigatório e, \r\n em caso de falta ou insuficiência desses dados, a ABA – Autocarros do Baixo Alentejo, S.A. \r\n poderá não conseguir prestar-lhe os serviços ou as informações por si solicitadas. \r\n Em cada caso concreto, a ABA – Autocarros do Baixo Alentejo, S.A. informá-lo-á da natureza \r\n obrigatória do fornecimento dos dados pessoais em causa.

    \r\n
    \r\n \r\n

    Quais as finalidades e fundamentos para o tratamento dos seus dados?

    \r\n

    De acordo com os Princípios da proteção de dados a ABA – Autocarros do Baixo Alentejo, S.A. \r\n só poderá proceder ao tratamento dos seus dados pessoais para finalidades determinadas e \r\n se tiver base legal para o fazer. A ABA – Autocarros do Baixo Alentejo, S.A. utiliza \r\n os seus dados para os seguintes fins e com base nos seguintes fundamentos:

    \r\n

      \r\n
    1. \r\n Tendo como fundamento o contrato de serviços de transporte que celebrou connosco, \r\n tratamos os seus dados para efeitos de:\r\n
        \r\n
      1. Gestão de relação contratual dos serviços prestados pela ABA – Autocarros do Baixo Alentejo, S.A.; e
      2. \r\n
      3. Apoio ao cliente.
      4. \r\n
      \r\n
    2. \r\n
    3. \r\n Porque estamos no âmbito de diligências pré-contratuais tratamos os seus dados para efeitos de: \r\n
        \r\n
      1. Pedidos de orçamento e informações; e
      2. \r\n
      3. Recrutamento.
      4. \r\n
      \r\n
    4. \r\n
    5. \r\n Para cumprimento de obrigações legais, tratamos os seus dados para efeitos de:\r\n
        \r\n
      1. Gestão de reclamações; e
      2. \r\n
      3. Cumprimento de outras obrigações legais ou regulamentares.
      4. \r\n
      \r\n
    6. \r\n
    7. \r\n Porque é nosso cliente e temos interesse legítimo em querer prestar-lhe, cada vez mais, \r\n um serviço melhor, tratamos os seus dados para efeitos de:\r\n
        \r\n
      1. Agenda de contactos; e
      2. \r\n
      3. Ações de marketing.
      4. \r\n
      \r\n
    8. \r\n
    9. \r\n Tendo como fundamento o seu consentimento, tratamos os seus dados para efeitos de: \r\n
        \r\n
      1. Envio de informações relativas a iniciativas de formação ou estágios; e
      2. \r\n
      3. Envio de ações de marketing (caso não seja nosso cliente).
      4. \r\n
      \r\n
    10. \r\n
    \r\n

    \r\n

    Para a prossecução das finalidades acima identificadas a ABA – Autocarros do Baixo Alentejo, \r\n S.A. poderá proceder à interconexão dos dados recolhidos, com o propósito de atualizar e completar tais dados.”

    \r\n
    \r\n \r\n

    Com quem são partilhados os seus dados?

    \r\n

    Os dados recolhidos e detidos pela ABA – Autocarros do Baixo Alentejo, S.A. poderão ser transmitidos, com respeito \r\n pelo dever da confidencialidade e pelo princípio da finalidade que presidiu à sua recolha, para as seguintes entidades:

    \r\n

    \r\n

      \r\n
    1. Entidades do grupo em que a ABA – Autocarros do Baixo Alentejo, S.A. está inserida;
    2. \r\n
    3. Autoridades judiciais ou administrativas, nos casos em que tal cedência seja obrigatória;
    4. \r\n
    5. Empresas de recrutamento e seleção;
    6. \r\n
    7. Subcontratantes que procederão ao tratamento dos dados por conta da ABA – Autocarros do Baixo Alentejo, S.A. \r\n e de acordo com as finalidades por esta determinadas.
    8. \r\n
    \r\n

    \r\n
    \r\n \r\n

    Quais são os seus direitos?

    \r\n

    Nos termos da legislação sobre Proteção de Dados Pessoais, garantimos-lhe o direito de acesso, \r\n atualização, retificação, eliminação, portabilidade e apagamento dos seus dados pessoais. \r\n Poderá ainda apresentar reclamações perante a Comissão Nacional da Proteção de Dados.

    \r\n

    Conferimos-lhe, também, o direito de retirar o consentimento (não clientes) ou opor-se à \r\n utilização (clientes) dos dados facultados para fins de marketing, para o envio de comunicações \r\n informativas ou de inclusão em listas ou serviços informativos. Caso não o tenha efetuado aquando \r\n da recolha dos dados, poderá enviar um pedido posteriormente.

    \r\n

    O exercício destes direitos deverá ser realizado através do seguinte endereço de correio eletrónico \r\n privacidade@rodalentejo.pt ou morada Estação Central de Camionagem de Évora, 2.º Piso, Avenida Túlio espanca, s/n, 7005-840 Évora.

    \r\n
    \r\n \r\n

    Por quanto tempo são armazenados os seus dados?

    \r\n

    O período de tempo durante o qual os dados são armazenados e conservados varia de acordo com a finalidade para a qual a informação é tratada. \r\n Sempre que não exista uma exigência legal específica, os dados serão armazenados e conservados apenas pelo período \r\n mínimo necessário para as finalidades que motivaram a sua recolha ou o seu posterior tratamento, findo \r\n o qual os mesmos serão eliminados.

    \r\n
    \r\n \r\n

    Os seus dados são tratados de forma segura?

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. assume o compromisso de garantir a proteção da segurança\r\n dos seus dados. Para o efeito, adotou diversas medidas de segurança, de caráter técnico e organizativo, \r\n de forma a proteger os dados pessoais que nos disponibiliza contra a sua difusão, perda, uso indevido, \r\n alteração, tratamento ou acesso não autorizado, bem como contra qualquer outra forma de tratamento ilícito. \r\n A ABA – Autocarros do Baixo Alentejo, S.A. exige dos seus subcontratantes e dos seus parceiros a adoção \r\n de medidas de segurança equivalentes àquelas que pratica.

    \r\n

    Não obstante as medidas de segurança praticadas pela ABA – Autocarros do Baixo Alentejo, S.A. \r\n o utilizador deve adotar medidas adicionais de segurança designadamente, assegurar que utiliza \r\n equipamentos e um Browser atualizados em termos de segurança adequadamente configurados, \r\n com firewall ativa, antivírus e anti- spyware e, certificar-se da autenticidade dos sites \r\n que visita na internet, devendo evitar websites em cuja reputação não confie.

    \r\n
    \r\n \r\n

    Comunicações

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. reconhece que poderá comunicar dados dos \r\n Utilizadores no âmbito de processos de fusão, aquisição e/ou incorporação em que se encontre, \r\n não se considerando essa comunicação como uma transferência de dados para terceiros, \r\n nem existindo qualquer tratamento subcontratado.

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. poderá ainda transmitir dados a terceiros \r\n no âmbito de investigações, inquéritos e processos judiciais e/ou administrativos ou \r\n de natureza semelhante, desde que para tal seja devidamente ordenada por ordem judicial nesse sentido.

    \r\n
    \r\n \r\n

    Transferência dos Dados

    \r\n

    Caso possam ocorrer transferências de dados para países terceiros que não pertençam à União \r\n Europeia ou ao Espaço Económico Europeu, a ABA – Autocarros do Baixo Alentejo, S.A. cumprirá com a \r\n lei, nomeadamente no que respeita à adequabilidade do país de destino no que respeita a proteção \r\n de dados pessoais e aos requisitos que são aplicáveis a estas transferências, não sendo \r\n transferidos dados pessoais para jurisdições que não ofereçam garantias de segurança e proteção.

    \r\n
    \r\n \r\n

    Alterações à Política de Privacidade

    \r\n

    A ABA – Autocarros do Baixo Alentejo, S.A. reserva-se o direito de, a qualquer altura, proceder a reajustamentos \r\n ou alterações à presente Política de Privacidade, sendo essas alterações devidamente publicitadas neste site.

    \r\n
    \r\n
    \r\n );\r\n }\r\n}","import React, { Component } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { Route, Redirect, Switch } from 'react-router';\r\n// import { isSafari } from 'react-device-detect';\r\nimport { Layout } from './components/Layout';\r\nimport { NextDepartures } from './components/nextdepartures/NextDepartures';\r\nimport { PlanRoute } from './components/planroute/PlanRoute';\r\nimport { Schedules } from './components/schedules/Schedules';\r\nimport { SchedulesByStop } from './components/schedules/SchedulesByStop';\r\nimport { Contact } from './components/Contact';\r\nimport { Messages } from './components/messages/Messages';\r\nimport { NotFound } from './components/NotFound';\r\nimport { LogoCommand } from '../src/components/commands/LogoCommand';\r\nimport { About } from './components/about/About';\r\nimport { changeLanguage } from \"./resources/strings.js\";\r\nimport { LandingPage } from './components/LandingPage';\r\nimport { TicketInfo } from './components/info/TicketInfo';\r\nimport { ServiceOnDemand } from './components/info/ServiceOnDemand';\r\nimport { TicketOffice } from './components/info/TicketOffice';\r\nimport { PrivacyPolicy } from './components/info/PrivacyPolicy';\r\n\r\nexport default class App extends Component {\r\n static childContextTypes = {\r\n getState: PropTypes.func,\r\n setState: PropTypes.func,\r\n getLogo: PropTypes.func,\r\n getMapCenter: PropTypes.func,\r\n setMapCenter: PropTypes.func,\r\n recenter: PropTypes.func,\r\n updateLanguage: PropTypes.func,\r\n getMenuState: PropTypes.func,\r\n setMenuState: PropTypes.func\r\n };\r\n\r\n static displayName = App.name;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n states: {\r\n nextDepartures: undefined,\r\n lineInfo: undefined,\r\n stopPassingInfo: undefined,\r\n searchBar: undefined\r\n },\r\n commands: {\r\n logos: new LogoCommand()\r\n },\r\n mapCenter: [window.defaultCoordinates.lat, window.defaultCoordinates.lng],\r\n userLocation: [],\r\n useUserLocation: false,\r\n // waitForGeolocationCheck: true,\r\n isMenuOpen: window.innerWidth < 768 ? false : true,\r\n logos: {}\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n //Set function to handle when window is resized\r\n window.onresize = () => this.resize();\r\n\r\n //Check is geolocation is available\r\n /*if (\"geolocation\" in navigator) {\r\n if (!isSafari) {\r\n navigator.permissions.query({ name: 'geolocation' }).then((result) => {\r\n //Used to make app run while user has not yet accepted/denied location access\r\n if (result.state === 'prompt') {\r\n this.setState({\r\n waitForGeolocationCheck: false\r\n }, () => this.getUserLocation())\r\n } else {\r\n this.getUserLocation();\r\n }\r\n });\r\n } else {\r\n this.getUserLocation();\r\n }\r\n }*/\r\n\r\n this.getLogos();\r\n }\r\n\r\n componentWillUnmount() {\r\n window.onresize = () => { };\r\n }\r\n\r\n resize() {\r\n if (window.innerWidth < 768) {\r\n this.setState({\r\n isMenuOpen: false\r\n });\r\n }\r\n }\r\n\r\n //USER LOCATION / MAP CENTER / RECENTER\r\n /*getUserLocation() {\r\n navigator.geolocation.getCurrentPosition(\r\n (position) => {\r\n this.setState({\r\n mapCenter: [position.coords.latitude, position.coords.longitude],\r\n userLocation: [position.coords.latitude, position.coords.longitude],\r\n useUserLocation: true,\r\n waitForGeolocationCheck: false\r\n });\r\n },\r\n (error) => {\r\n this.setState({\r\n waitForGeolocationCheck: false\r\n });\r\n }\r\n );\r\n }*/\r\n\r\n getMapCenter() {\r\n const { mapCenter } = this.state;\r\n return mapCenter;\r\n }\r\n\r\n setMapCenter(center, getNearStopsCallback) {\r\n const { mapCenter } = this.state;\r\n\r\n if (mapCenter[0] === center[0] && mapCenter[1] === center[1]) {\r\n if (\"function\" === typeof getNearStopsCallback) {\r\n getNearStopsCallback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.setState({\r\n mapCenter: center\r\n }, () => {\r\n if (\"function\" === typeof getNearStopsCallback) {\r\n getNearStopsCallback();\r\n }\r\n });\r\n }\r\n\r\n recenter(getNearStopsCallback) {\r\n /*const { useUserLocation } = this.state;\r\n\r\n if (useUserLocation) {\r\n this.setMapCenter(this.state.userLocation, getNearStopsCallback);\r\n } else {*/\r\n this.setMapCenter([window.defaultCoordinates.lat, window.defaultCoordinates.lng], getNearStopsCallback);\r\n // }\r\n }\r\n //--------------------\r\n\r\n //LOGOS\r\n getLogos() {\r\n const { commands } = this.state;\r\n commands.logos.getLogos((r) => this.getLogosSuccessCallback(r));\r\n }\r\n\r\n getLogosSuccessCallback(result) {\r\n this.setState({\r\n logos: result\r\n });\r\n }\r\n //----------------\r\n\r\n //Update Language\r\n updateLanguage(languageKey) {\r\n changeLanguage(languageKey);\r\n this.setState({});\r\n }\r\n //--------------\r\n\r\n //MENU\r\n getMenuState() {\r\n const { isMenuOpen } = this.state;\r\n return isMenuOpen;\r\n }\r\n\r\n setMenuState() {\r\n const { isMenuOpen } = this.state;\r\n\r\n this.setState({\r\n isMenuOpen: !isMenuOpen\r\n });\r\n }\r\n //--------------\r\n\r\n getChildContext() {\r\n return {\r\n getState: (a) => this.getComponentState(a),\r\n setState: (a, b) => this.setComponentState(a, b),\r\n getLogo: (provider) => this.getLogo(provider),\r\n getMapCenter: () => this.getMapCenter(),\r\n setMapCenter: (center, callback) => this.setMapCenter(center, callback),\r\n recenter: (callback) => this.recenter(callback),\r\n updateLanguage: (languageKey) => this.updateLanguage(languageKey),\r\n getMenuState: () => this.getMenuState(),\r\n setMenuState: () => this.setMenuState()\r\n };\r\n }\r\n\r\n getComponentState(which) {\r\n const { states } = this.state;\r\n return states[which];\r\n }\r\n\r\n setComponentState(which, newState) {\r\n const { states } = this.state;\r\n\r\n states[which] = newState;\r\n\r\n this.setState({\r\n states: states\r\n });\r\n }\r\n\r\n getLogo(provider) {\r\n const { logos } = this.state;\r\n if (undefined !== logos[provider]) {\r\n return `https://www.trimbal.pt/content/logos/${logos[provider]}`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n render() {\r\n /* const { waitForGeolocationCheck } = this.state;\r\n \r\n if (waitForGeolocationCheck) {\r\n return null;\r\n }*/\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction LayoutRoute({ component: Component, ...rest }) {\r\n return (\r\n } />\r\n )\r\n};\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport 'bootstrap/dist/js/bootstrap.bundle';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker();\r\n\r\n"],"sourceRoot":""}