{"version":3,"sources":["components/leaflet/icons/stopIcon.png","components/leaflet/icons/selectedStopIcon.png","components/leaflet/icons/externalTicketOfficeIcon.png","components/leaflet/icons/selectedExternalTicketOfficeIcon.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/nextdepartures/StopPassingInfo.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/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/Disclaimer.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/Carousel.js","components/LandingPage.js","components/info/TicketInfo.js","components/info/PrivacyPolicy.js","components/info/ServiceOnDemand.js","components/info/TicketOffice.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","aboutUs","about1","about2","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","sent","general","emailSuccess","emailError","pageNotFound","delayed","aheadSchedule","complaints","complaintsBook","phone","sendMessage","seeMore","passengerRights","ticketInfo","serviceOnDemand","moreInfoSoon","serviceOnDemandHowWorks","serviceOnDemandWorkingOne","serviceOnDemandWorkingTwo","serviceOnDemandWorkingThree","serviceOnDemandPlacesHeader","serviceOnDemandPlacesFafe","serviceOnDemandPlacesMondimBastos","serviceOnDemandPlacesPovoaLanhoso","serviceOnDemandPlacesVizela","serviceOnDemandPlacesCallSchedule","fares","landingPageRoutePlanning","landingPageNetwork","landingPageTickets","landingPageServiceOnDemand","landingPageContacts","simpleTicket","kmSteps","full","half","code","driverFare","prePurchased","automatedLines","lineSubscriptions","discount60","discount25","disclaimer","contactHeader","contactWorkingDays","contactSaturdays","contactSundays","notes","passes418s23","pass418","pass418Users","pass418Conditions","pass418ConditionA","pass418ConditionB","pass418Requirements","pass418RequirementA","pass418RequirementB","pass418RequirementC","pass418Renewal","passS23","passS23ShortName","passS23Users","passS23Conditions","passS23ConditionA","passS23ConditionB","passS23Requirements","passS23RequirementA","passS23RequirementB","passS23Renewal","passes418s23MoreInfo","passAntigoCombatente","passAntigoCombatenteDescription","passAntigoCombatenteUsersAndConditions","passAntigoCombatenteConditionA","passAntigoCombatenteConditionB","passAntigoCombatenteConditionC","passAntigoCombatenteMoreInfo","passAntigoCombatenteLink","town","address","postalCode","schedule","workingDays","saturdays","mondayToSaturday","sundays","saturdaysSundaysHolidays","daily","exceptSunday","saturdaysHolidays","sundaysMondaysIfHolidays","contactInfo","contactCompliments","contactComplaints","contactSuggestions","reason","contactInfoSchedule","contactInfoCustomer","contactInfoDispatches","contactInfoDisableTransport","contactInfoOther","contactInfoPathsStops","contactInfoTicket","contactInfoLostFound","contactInfoInvoiceRequest","contactComplaintsPassengerRelations","contactComplaintsDelays","contactComplaintsNoShows","contactComplaintsConfort","contactComplaintsOther","contactComplaintsRefunds","contactComplaintsTicket","contactComplaintsPathStops","contactComplaintsInvoiceRequest","contactComplaintsSchedulesFrequencies","contactComplaintsUserInformation","contactComplaintsBaggage","contactComplaintsIncapacityOfTransport","contactComplaintsTechnicalProblems","refundsPolicy","provideSubject","moreInfoSupportline","file","fileHelp","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","ProviderCommand","getProviders","getProviderLines","stopIcon","L","Icon","iconUrl","require","iconAnchor","Point","iconSize","selectedStopIcon","externalTicketOfficeIcon","selectedExternalTicketOfficeIcon","ticketOfficeIcon","selectedTicketOfficeIcon","lineInfoStopIcon","lineInfoSelectedStopIcon","routeOriginIcon","routeDestinationIcon","vehicleIcon","clusterIcon","cluster","html","getChildCount","divIcon","point","RecenterButton","StopPassingInfo","poi","nearStops","nearTO","lines","linesToDisplay","linePaths","linePathsToDisplay","mapRadius","selectedStop","selectedTO","selectedLine","displayLinesDropdown","isLoadingPassings","isToRecenter","displayLinesFilter","zoomIn","center","setMapCenter","lat","lng","mapCenter","getMapCenter","parseInt","getNearStopsSuccessCallback","find","s","getNearPOISuccessCallback","getStopTimesSuccessCallback","passings","place","handleStopSelection","handleTicketOfficeSelection","handleLineSelection","zoom","coordX","coordY","onSelectLine","l","paths","p","lineId","path","passing","onSelectPassing","checkbox","checked","push","newPaths","newLines","h","Math","floor","m","lineColor","lineColorFormatted","g","b","findIndex","xs","sm","handleSearchClear","renderPassingsList","Spinner","animation","role","handlePassingSelection","lineCode","isRT","formatDuration","description","shape","Array","isArray","segments","Fragment","segment","idx","Polyline","positions","breakpoints","breakpoint","color","determinePathColor","eventHandlers","click","handlePathSelection","places","handleSearchResultSelection","renderPassingInfos","renderTicketOfficeInfo","MapContainer","scrollWheelZoom","attributionControl","TileLayer","attribution","AttributionControl","position","prefix","MapEvents","setCenter","SetViewOnClick","coords","renderPath","maxClusterRadius","spiderfyOnMaxZoom","disableClusteringAtZoom","showCoverageOnHover","iconCreateFunction","Marker","determineStopIcon","Tooltip","determineTOIcon","useMap","setView","getZoom","args","useMapEvents","dragend","getCenter","distanceTo","getBounds","getNorthWest","zoomend","tripApiRoutes","TripAPI","tripId","vehicleNr","vehicleTrip","TripCommand","getTrip","getEstimatedTrip","getTripsByLineAndDayType","getVehiclePosition","LineInfoMap","trips","vehiclePosition","intervalId","realTimePassing","onUpdateBusPosition","setInterval","clearInterval","onUpdateBusPositionSuccessCallback","trip","maxLatitude","maxLongitude","minLatitude","minLongitude","tripPassing","selectedTripPassing","x","y","renderTooltip","makeTooltipsPermanent","order","isPermanent","permanent","stopCode","bounds","SetBounds","Pane","renderPathStops","fitBounds","LineInfo","isLoadingTrip","displayTripInfo","displayMap","minuteDelay","window","onresize","resize","innerWidth","document","getElementById","getTripSuccessCallback","selectedPassing","now","scheduleTime","getFullYear","getMonth","getDate","timeStamp","calculatedTime","diff","isDeterministic","onMoreSchedsClick","renderTripHeader","renderTrip","onReturn","Button","variant","abs","displayTime","formattedTimeStamp","displayPlannedTime","renderPassingRealTime","renderPassingPlannedTime","every","handleTripRefresh","handleSelectTripPassing","renderMoreSchedsButton","renderPassingTime","isSelectedStop","handleMoreSchedsClick","renderInfo","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","join","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","obj","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","NextDepartures","stopPassingInfoRef","createRef","render","component","available","stopPassingInfo","callbacks","onChangeView","lineInfo","moreSchedules","view","createElement","assign","planRouteApiRoutes","PlanRouteAPI","request","PlanRouteCommand","calculateRoute","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","providersSuccessCallback","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","renderTripInfo","determineTripIcon","determineLineCode","totalTripDuration","renderSingleSubtrip","renderFirstSubtrip","renderLastSubtrip","renderIntermediateSubtrip","renderDisplay","PlanRoute","allRoutesView","routeDetailedView","Disclaimer","Schedules","scheduleInfo","exceptions","selectedProvider","selectedDirection","dayTypes","selectedDaytype","displayLineDropdown","displayDirectionDropdown","displayDaytypeDropdown","isLoadingInfo","displayNoInfo","displayExceptionsPopover","typing","typedText","match","params","providerLinesSuccessCallback","sort","localeCompare","setLine","setDirection","dayTypesSuccessCallback","getTrips","getTripsSuccessCallback","getDaytypes","renderProviderDropdown","renderLinesDropdown","renderDirectionsDropdown","renderDaytypesDropdown","setProvider","FormControl","setLineSearch","determineDirectionString","directions","setDaytype","hasExceptions","renderStopsList","renderTripList","exceptionsList","overlayRef","setDisplayExceptionsPopover","renderExceptionList","renderTripExceptions","renderTripPassings","exception","stopOrder","Overlay","placement","Popover","Body","renderDropdowns","renderScheduleInfo","SchedulesByStop","lineSelected","displaySchedules","getLinesByOriginAndDestination","checkLinesSuccessCallback","checkLines","renderLinesInfo","renderSearchPanel","renderLines","renderSchedules","contactApiRoutes","ContactAPI","ContactCommand","sendEmail","Contact","sendMail","sending","FormData","append","subjectType","files","contacts","sendSuccessCallback","sendErrorCallback","handleSubjectChange","selectedSubject","subjectOptions","reasonOptions","lg","Form","Group","controlId","Control","Text","Select","option","as","rows","Label","size","accept","Alert","MessageAPI","MessageCommand","getMessages","Messages","isLoadingMessages","getMessagesSuccessCallback","creationDateToShow","dangerouslySetInnerHTML","__html","httpLink","NotFound","logoApiRoutes","LogoAPI","LogoCommand","getLogos","About","CarouselComponent","handleCarouselClose","event","currentTarget","showCarousel","onClose","handleImageClick","open","selectedImageIndex","carouselItems","hasValidCarouselItems","loadCarouselConfig","prevProps","process","json","filteredItems","Carousel","start","startDate","end","endDate","console","activeIndex","selectedIndex","imageName","stopPropagation","LandingPage","carouselTimeout","openModal","cursor","renderMessages","TicketInfo","md","class","PrivacyPolicy","ServiceOnDemand","TicketOffice","Table","striped","responsive","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","log","baseUrl","getElementsByTagName","getAttribute","rootElement","ReactDOM","basename","URL","get","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.3abbe5eb.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAL4SURBVEhL7ZZbSBRRGMf/Z3a8ZBqhbpppGgq+dDHypQeDgi4PiUSR9hQRFUH1YiJd6ULSWxcoiJ6iB4mKEovqMSuQgowkEyEUE1NXFC1FdHdO/29219Sddcd9DH/w3+9838zOf76dPecMFvnvUaHoGp/Pt5whm1pqF4ApaoDq93q92q64wLUxDUsZjlLbKCfjL9RD6glvIMA4LzGNaZjDcIU6bBcmJ6EH+oGhYXuM9HQorxdIS7MPk0/UKZo3B1Nn5jWm6RqG59R6TEzAetmIQGMjdE8PMPbHPgeJibaxUbYFRuUBqGz5MTBCHaR5gyRORDWmaS7DK2qtbm+H//JF6K4u+1hUUlJgVtfA2LkL8Hh+s1JJc7lGBPMZ1zNU6bY2+GtPQw8OBg/EIiEB5omTMPZXSfaTKqH5kCQzMUJxFjTdylCFsTH4L5x1bypMTcF/6yZ0S4tkedR5GczF0Zgcl4/A40fQvb12YUFYFgL37wX/fMBeNrLCrs8gwpgnZTFsxvg4rDevg8U4sFq/Qnd0yHA1tVEGM3HqWP6W2bqvL75uw/j90N9aQ4l7Y1P394V/qrixurtDI+SH4jROxpb9aUR7/O5R/64RsZI5XZ2tYlJl8VEnJQcrcaLypxuNWACcjH+J1MocqDyZDXEiK9q6DTKSjeOzDGYSYczJLpP2LZKSYJSXB4txYGwqhSoslOEPSjaQWUR7kHfkw1OxB6qoyC4sCHbrOcalwDQlq3e9cvHEjwx32bU2r9ZB5cqy7ZLkJTDPnIMqLpbsO3VdBnOJ1rFwiWpWBQUwb9yGURIxFSPJzIR5rS64SXDjpI6wiXFJ5hJrW8xkeEqVcUFQVlMTrIZn0J2d0KPc+QIBqNRUgDPA2L4DnvIKYNky+arMjH00/SCJE25eBORVp5qqpRKgNfQwmxkZtY1BY5WRYe9KIV5QNTRtD6bOxDQOwxsoYDhE7aZWUSmUIK8+Puo99YCG76QYC9fGYXgDiQyy28wypmHolWSRRQTgLwrK46USi+XhAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAL5SURBVEhL7ZZLaFNBFIbPzTtp0paa2GDa2koXFYIiFoqCC124EkQqWHGhIhW66UakLlwU3QhZK7oQFCkqKCoIgjtRIVRSSqH4Qo21PmqMMeTVPK//uTfGNLnJvYk7yQd/zsx0Mv+cmcxMqcV/j1CMmgmFQp0IbqhNaiDKQt+hFZfLJUotGtBsDMNhhJPQHkjJeB66Ad3BBPKIdVE1huEGhHPQCa6nCyJ9SYkUThdQJnKaBXJbdNRhLA31ApqEuV+uKlPXGKYDCPehLam8SLc/ZejWUoaCiQLFcvKqmnVIH8Z73UYa32QmjxUNRFHoKMwfcEWJmsYw7UF4BHkXonmanEvS23j9FbQbBDrvtdJoj4n0AsXQdAjmPEYV0vRq4IO887/ydGw2oWrKxLEKUwtJuhZMc9UBXUECXVypRNEYnXcjjPFAE4EEraxiMzWSQdfpxRT5wzmu9kJnuVBJrYwn+OPqhzQtJbWb/gG/P/K9XpV+fGAUiayXSmVUGaNTN8KOBLK9t8wnpTkCkRwtRqWs+6BtXChHKWM+o+7lVAHZqu9rLbLINhApfV+zseEzjItL1TTvceyKbCzGEkrGUm+doPlSq0nZ4FVLp2T8Dcp4LAJZcRj/hUF7afhgMZZQMv7K6rXpaKBN6c/a4BttuMvARb7i5rhQTtXIuGl+IDyxINuxPpPc2AQ7nUYacui5+A7iB2QNtVK6yB9HYLy5XfpyQ3C2Z4YsZJRHv4lkfkqlMhSN0XEW4RKyFi9vt1F/A0tuw0r5ttrI2yFN+CV0gQuV1BtxGvIP2vU0M2KnkXXSftWlG68UT/SAR9oiznIcSSS5Uonas+hEuAvtwoUgPF7J0szHNL2JFSiSFSkviuTAi8RP4X6YHcbWdMrvMp+MgzB9zhUlVM8LzPlfnVPQFGTkezicESmC1wBPNLXDyIVNNf1du4fQaZi+kqvKaD6omEA/wnFoH+SBbBDDF3oIegZdh+FTblSj4RsCE+AN5NdmjTEM43K1RQuG6DemeO9VSqRVSQAAAABJRU5ErkJggg==\"","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,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA12SURBVGhD3VprjFxlGf6+c5k5c+a6M9vd7S5tCT9KKd0iEC39AVQpggkKcmkL+MMQDBojQUKIwR8UAxiC0fjHKAJqIg0FkR8apVS5KJfIJVql2BugbXe7OzvXM2fOzJwz5xyf9ztnZnfbvcz2Iglv8uY7O/udM+9z3vv7DfukEA/X00KebXPmuhKx73ky8zwJHxMT+Yxzj0uSxyTJZYriStGoH/7vlOmUgXitFmeOo/qOE8WqYY2wdjviu21FAPH8AAgHEAIhyy6XFYepqs1VpcnUSIvjWorFXLHvJOmkgXiNhuTbtua3mgnWbOp+qxUDB0DAvusqzIVWfC/4Ds4FEA4gDEB4RLVZJNLkkWiTa5oFrvNIxJISCUfsXyItGYjXbEpC4EYj5Vv1pG81En6zofvNpgAiQARaUYR5+T50AQvinMGsAAJAFFUAgeBNFtUaPKY1oJE61/Uaj+kGgZLi8Xb4lT3RkoB4pqkSAKwZv26mvDoBsRL4TABhpBXbjvgwLQIC0yI/oe8ACqERAYQrMK1IRADhUWiEQMT0Oo/rphRPGDyRqAJUlTQlaVpPftQTEHJiCBuD8H2eUevza0YaYNL+cUCEpmw7ytozNOJBIwwcAhGmRRpR1RaLRlsAAo3ELCkAUgMIQ0okqzyVrGAtA5Ah6fqi/rMoEJgSgUj4hpHzjGrWMwwAqaU9MAHxBBCLgOjQCIDA6TmPci2qSbn+OF0HT/Idr1Cswwyb0FILYGweJY1ooUbA8bgJHzF4MlmVUqmylEqXeTpVhJbKi5nagkAECMtKAkC/V6n0+1UAqVb7BIgukDppJM7VSEodHV2hrllzFk8kc165HHPHjnLsEc/Cm2Xy8AiTcrmmb5ol58D+cWfPnsO414CPWPi/yfXjgKQBJJMpSulMAZ+XFgoE8wIR5lSvJ7xqZRmEIs4BRFaAIRAmtGLWk7DjnHbF5nXy8uVnt159OdrcvZvZ//onwwsInzSbYEpMPW8twz1Mu/LzjlcuHWnufnEvnl0QGiEfScKs0mniEoCUpEzflNQHJjDzaGZeIG61qvvVyoBbKg14pZLQCDjrG9CIYWRgSpnoJRvPU9eNrree2Rm1nnma4fPw7t6ItBS75osscdvtTvuDQ/uaL/15LwJAJdBIF0iRQMjZLMBk8/ChMiKcFz6iS3MCoegEcxrwisVBgCAw/dAITKtCppVFOO3Xb7xpY/vw4ZXGQw8yNz8Z3nlyBEFZ6p57mbp+fd7aufNN325NBaYFbfT1EZCClM3mpWwOnJ2U+/pOeGMnABF+Uatl3WJxuVcsDAJMqJEyaSSHNzakb922yXruNznzicehulNKyNOEPKPfuIUl7vi6Ye146jXPrI2TRmBWRQg/JTiXy8u5/gkpk5mUkslWeKegTh3UJcrQXh15InRo8gdwBmE3IzSx9eZNAJAzH/vZ6QNBhKRpPbuTGY8+ktJvufVSvLAB+k6vZuC7YcrEJAt8EwEiSYk5vFPQrD9E2YFNiCpIejVKfCkBKLg5rd9w00br+d/m4BPhHaefmrteYOZPf5KMb7tlI3NshHrIIAILyUTXWK16CuYXhvWAZgERtROFW0p0xHQjhVhwdMOG89zxsZXmz6GJM0wwW9Z65+1l2uYrzxdlUEeeUBa/biVZs5UgNwhvmQYiwm2rFaecADDECSS7OCU8FHZZ9VMXrq/CsU+rOc1HMLPaD3/AlFVnr4ajD3h1JF1KvB1uEDfiooIIaVojjq2IKrYBEASGyg5aURBqmzattXY+rbnHxsPNZ54olJtPPq5on79qLWSAPLPkQiWBa9uOhdungfhOO4qSnOqlmKibqOTAyiU5Ka9Yec6Z9Iv5qPH73zHklBEkwnQgE+o9etniWhSoMfRDAsMMjaApalF/gVKcfMVG3YRr5fy1K1qvv6Yhw4cb/3+E72fNP/5Bjnz6M6tIFsGhXLSylihQFdornAVOIyNXDLqTEyu8yclhN58f8abyQ26hMBTfevNm48c/WtX6619o69ykKCx+61dYZN1o+EFv5HxwiNWffIKCTPjJiaSuXcsyjzw6ZT722J+QRyblZcuOEUuDQ2Py4OCYtGzZETmdtgKNUJ8d9BAq9RJojNC64m/GojyTzjp7/iG2zUeR0VGWvPMu1v7oQ+a8v7c3PniQJb56G4teeln4lLnJ2b+foSDNcFmipo1aaup3VHJ0sbquSvsEEOobqMcW7Sk1RKJNxaooUd9E4bhIDcVTKYYShjmHDrH22Fhv/J+PmDtxjKEUCZ8yDyFKIsioqLl0IZNgVwGI7jVtE6ZFBaJXmFrhTkyMwLTOcsm8pqaWcz12TuTCi68p3XE7bZuXopdfznKP/yL8a2lUufcehiQb/jU3ZR58GC+q9Eb78JH3YVYT0sDAOMwKPHRUHho6IsoXsZP6aurkfF/ygx5boqEB3lYUDxBbFiNEEtY+dHBJjAQX3r0woc5jXIupkEnIFchHcoq/j4taDK0xdce0ISBsDK96oPbBAyz/hauWxK233wrv7oW6wgTy0UBDrMF1AIT6adFTi9UL//ZQZ9noAcSWj5N4Ks2QBJ2OXOE683oGEBqecWl6EojVrVQasMUl6OXMkDIywtxS2ezINWMV11xRgikgQhtNN9pckdsMazANlF2EOBvtZx1dmXjgx0KyzOSRs6gltsLhXjtYQ1kJFCjUCM2bFIc2MVUFIMWmKQdsr4XWthy54AKxbV5CBpaHh1nsqqtZ9LLLe2Lts59jyspVCyZDInX1apRPThVhliYvDmRrIy1gDa9lWQwkhOPgYdylAUN+coUIvfn8sJfPL6fMHhlddwH+f0n1ge20dU6i3ju9/XssANyJFYsTRa7Kfd9haJ/DT06k5De+yZTVq99rvvrK3+V+dIf9yybkgYFjIquD0TEepW6x+61uqZj2pqYoh4wIIMgjbmFqEGF1OPG1O75UuP7a6IKJkUaikW5V3RMJbXSizxxEE5f+5553rR07diMBHgGQSZQkE8gl4wAxLg8ATDZ7jAbg3fCLMoAmfzRQbgimCWBUayDTm8jCH+lbtoU75yEIREXeUnghEEQaTBXN3THPqFa4BnmIIRfTNBrs4TpCM+MZPkIEv6BZa5djsS63Xn5pn751WwtvINx85gnmwmAJ7eauXfu68mhdmer0GVMjjXD7NBCaFQFtMEzWZ7GJt1dC4bg3dd93sXEa+xkjmGnyrruZe/i/H8C8p4QcMZpE0hqri8l9TBxDdCcps6RCSxuOLvUasRSP1xB+BbfeeH2fsnLlWOK2heuu00H6tdexyIYNpcauF/4tZMH3QxazIwuNVqEds2NWRLOA0DgSiA0pnhBTcdxE14aYx2paFV3iW/qWLWV9y9bwjtNP5BeJb91pWk/9+m9cVcv03eFRg2AhW1w3YD2zZrJyuHZp+/33u3BCGXGban06Guicc8iIYL6z970S+ohBHlE1e8+eRR22Z6IB3fU3sOS37zbrv/rlm55lTaJorUjpTFnKZEpyMAMuSn2ZopRMFeXjBnRzBn3XqMbQXwx1RqbgYIhdqdDRQh9u649v23ZJ+8MPl1e//xDzCoXwzpMj6kmSd9/DIhdfXLR2PPUWOtbpkamY/WYLUi6bF5PGbG4CminBrGa9wRM0QrR9+wMusgLiKUoYOswMyubADAHdd2zXeefdSfhMGwmLqkqZkhs6OLGlV6I8oV/3ZZZ+8OE2s+0D1rPPvIuPC11NpNPlYPYrBtlFgCrAtGgi39sQm0hMHc1aFpoYoAG24O75iJERwzs6VkjE+7UrNq+Rlw+vbL7ykopwyWB+QZ6Yg2D3TFmzBiXKFSx29dWuVyyNNV7ctR89B6LTcecjwpyESRWkbF8eVXBeTqXmfPCC9YRn1RXPNLN+cKRAphWcWBlGRsxgafInBmYNHREvFbnoohXquecOQ5CMl5/S3PGx4KjBR2GdTIkqFt2d7detSvvA/onWu+8cxTOqIj/o4sSqJiWSHSDiWCGYyGem0E4X5HRm7kMX0IJAiLw6wNTrfX61Kg56yEeCYbKZhlbCM0QrLmZNNKah83YuRSU9FqOjNwhHR3Ece1vwtTpegDh6o7N1cTwtjt6CEyuJwipFJgCB4IFppdNFnkgW4Ozd5DcXLQqECG9dhsApmFQW2qCjN2FaYg4baoQmkgQEth71HZpu0DBDnLOHvhX0PNQuiOpVjcx5htgFQqdWyVQJn5XkdHpuO51BPQEhgs9wvPW4b9UzXs0MfKRudk0LIOh4Wpzq0sgmmHAIIPQdYAHEZeh5RPlNv3hAZkZ+otqONBIchiJ3QQNVKREvw+SqANXTsLlnIB2Caah+o0mHoGlogzQSzGRD0xIaCeZNNF6iHwx0kq4vus+ORoJzdipUw+NpaESnzE0/GIhV8b8mQPWcpJYMhEicatl2BBqgXz2EptXS6cxCHE+3HRr0qfAFhO/5TEt1mPj5BlW1pJVYDaZWA4AGHH7JWfakgMwk+IsCUOTkOnPsGIBM/6jGnR7XCCAcGlFm/KiGnF1RUMWqFgFD6D3pMuGUgcwkgJLFBNDzVDG1RKnDg/ESUDCaeEAjEvpstKfQDP02BT5w0sJ/Aomx/wFh0f53bXdcKQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAFiSURBVDhPYxgwwAil4eCpiiIHkAoEYi8gFgLil0C8EYi3St+5/wdIwwGKZqBGLUY2tiVsJqaGnL5+DEwiIgz/nj9j+LZ+PcOvy5cOMvz5Ew804CFUOQIANfI909a49nn2rP//fv36jwz+ff/+/2NX5/9nGqpHgOrYoFoQAChY/C4/9///P7+hWlDBvx8//r+JifoPVBcJ1cLABKVBIJArPIKBgZkFykUFjOzsDFwhoSAmKDzAAFmzKLOEJJSJHTBLguVFwRwgQNb84u/TJ1AmdvDnyWMQ9QLMAQJkzau/Ll3C8P/3bygXFfz//p3h26pVIOYasAAQIGue//PggfNfpk1h+P/jB1QIAv5/+cLwqauD4deF87uB3E0QUcx4VmZgYZnPpqNry+HpxcAsLs7w98kThu9bNv//ffvWVoa/f9OA8fwcqhxrCgMFtxsQewKxCBCDFINsOwTU+A9IDzhgYAAAJ5KdhvB+/EYAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAFFSURBVDhPYxgwwAilUcDr169NgJQfEIsD8Qcg3gXE+0RFRf8DaThA0QzUxAGkZj37/i92zZNfDA++/mOQ4GBi8JdmZVDnZd4LlIsAGvAGrBgI0DUv3fr8d1T++W8M3/8iLGEGqqrW4mRIV2I/AeTaAQ34DRJnAhEgANRo/fDbv6g8NI0gAOI2X/3OcPTNHwsgNwYiiqQZCPxWP/7F8ANNIwyARJc8/AligsICDJA1SwFthjKxg0ffwAZLgzlAgKz5iRI3MhcTKELkH4M5QICsen2YLBsDFwvW2GNgAgrHK7CDmOvBAkAA1wwMwVPSnExzZxpzMfCxohrABtTZpsvFYCrEfADIXQ4RxYwqViA14c3P/5mbnv1ivA+NZ18pVgY5LqaNQLl4oCUfwYqBAKsbgYZoAClQqIoBMUjxTpDLgPSgAAwMAE/6ZiUodY2nAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxAAAAsQAa0jvXUAAAJhSURBVFhH7Zc5iNVAHIefN+JVCYv3sYUHyILigY1gbW1po412Igiird2CFh4LiqXVtopgYSEKFoKIgqgsqGuzgoX37fdNsrAhM+8l2bzuffAxycDL+81/ksykM2BATebkbW0mhzfOpZmP89Dr/MPfuvrVhMe1qR2GECtotuAIbsAh9Do/cRJf42NbQv2grUzlMISwAgfwOO7ANbgA7Rer8Re/oYEe4EUCvaCtRM8w+XRYhTN4CBdiVT7iJbxKKKvWla5h8iC78ALuQc/rYqXG8TSB3oeeBL0uvh8v415sEkQW42EcZXBrQ0+CZGX44XKaW2igNvBmdspOpZ626Gjzm/Uo7gsd7bAIj+HOcBYhVfqteASbTk2KZXiSwS7NTouU/iy/aa3I5tDRPj4Q27LDIrGRe8MdxCXhrH3W4+580AViYZxbp6lfuIQMoy/MArEwvtR8xfcL/3MVGqpAqjLTr/h+4a1QaZq+46/ssG98QdexArEwrr7vssO+YIi36HajQCyMb8pn2GhPUgEH60peqn4sjAvbXfwcztrH7cUjloTe05SvGw/xeehon/v4MjssEquMTOAYluZ1lnzAUQZs9UtEw+QlvIm3sVTOhnxCg0SrIqnKGMhH/Czewz/2zQIrcQOvh7MEyTA5T/EEuq/xKWiCW88reI4BToWeBJU25Cxqm2gM5R7HTVdVvPfO4zhBDNWVyl8HQig/UQzlftgthvuSmV8H3vD+qU/iHbxWJcQ0tcIIgVxI1+F29HNlJbqefUU33G/wCU4RpNaLs3aYmeR7EivjdUJl6gYYMKA5nc5/kTKV+HIq7fAAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAANoSURBVFhH7ZdLSFRRGMe/6zg6k46UINFDUzDDTRkU0UKoQBNTLChbVEsXpWKW1SJ6LMJFRg8KQwmCKBCzTQ9NCoLaZFGGEKRpViiF1oyvcXRet/935owx49xxxplNND/43+8x453/Pefce48UI8a/jCJjWAxnZ61AKIDWQ6uhOGgW+gq9g56v6h+cQgyLsMzAxDaEU1AhxAa0sEEtUD1M9YtOCIRkBiZSERqh/aLB6HSkz8khXXoGKcjVmRlyDgyQ8/s3+QWBA6qHLsCUU3SCsKAZGFmL0AllcR2fsYaSKyrIUFxCcSkp3PLBNTxE062tZL17h9wTE7JLz6A9MGT1lIEJagZGeD10QStJUchUWUXJR6pI0evF58FwWyw0duY0zXQ+lR16Ae2EIR6tgOhknAeMxCPwmXKVeD2lXr9BSQcOiikJBcVoJGPxLlJtNrK/5zUtRnbZZfNYBxdhATNHIZVlbW1RI8Fysk6cB3JBm+VPzCPgNOEPjAi8EtMM23dQavMt0V8sqtVKI0WF5Pr5g8tOTFWR+MAPrdtzN5TGianuBIeIUJKSyFRVLSsqwMVmytwHLTNlfEjYkIfbd51oRIqxpJQUg4FT/s1iTvzRMrOJD4n5+aKIBjw6CXkbZUVbZPRBy4wYxvhM8WiJGrrMudlJl9EHLTOe+zchQYRoEZdsklngG0fLDL/0xCM+mrjHx2RGLhl90DLzhQ/O3k+iiBbO/s8y85zfHy0zr/kw++qlKKKB2/yb7D09shKvmHlomXnIB0dfH812CV8RM912H5MjZocP4vz+aJl5DImhnLzUgMtyc7poeFSmmptkRW14Ao/K3IeAZuTe4yzn9g/dNHntKqeLQnU4yHKsFot3nEu+Mc5xEjZ4bD+CxEtusummfO2FjttuV83Vld6XJOu4PHVAtKbJyyGom5OJhotkqa0RQx4Kzr5e+lW+l2wd7bJDt6ErnjQwoez0eMvJa2gr17y7W7KvnIylZaTPzUXj7/WodjvZ376h6QdtZGt/4l2wTDN0GNMfdPEtaIaBId7anYd4mBO5x/AGirehCgy6R0fINTRMqtNnI8fDWAMT9zxlcEIy4wWmshFqoIPQUu5pMAjxJqgRRuYeuwsRlhkvMMVbUt6x5UHLITZmhsT/TTDwETFGjP8Joj/ta3t7abQATAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAgCAYAAABHA7voAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAMASURBVFhH7Zk/iNRAFMaTSXbV5rS6QkH0UMRCmwUVbLQRPbAQbCws7rAQra3ERgsruUoQFC0srlCwOPDwKitRIY0WhwgiwokIFi4Iuvnn9yUvSzaTZHfZP16CPxgy72UymS/vZWaya4ZhaHzdPzfbsdVK0wuOGBUF4/+M8V9B1dn58dP32GsY5sa+vRT3Bif3iK/SQMtbaDmbiFQorbqII8xC11LLzErajOAZHJ/TIJ5l/vzTtF+LqdFw/d3o5KCYEXhq627D+iJmD8O2J9lrmH5o/0FMDbQ/kBOkeURxVRMIohNS18CT6WnPwaLzE+m8TyPv98uMyKHuAfq1n/WVec8KwnPiItE1TNGRYCSKxBGeK4vWOOA9IO6+mBG/m9Z5HkcWuFnxLbWLxzoJdDh/SN3Y0vGOMXVrI5Bpmp4cbT/cjkOrVinadP11qXaplcCGF6xJtcvIArlmMdfF1OA5thFzqnAm1dbBARbVqS/04CLKWtlyRLLr569tjRd5C/1mpa/IrEDOqlV6Bx+jnCp7HYDD7JB6NJNWKYIJjOSPuKoDgXfS6V1FgUNRq2Uij/8Cq07tBZZOMr5prlph+FTMCE+Zi3YQHhdzKniW+mb7wXUxE9qure5ie1a2bJQKXHAtdaPhB3NiR8D3Dr4lVB/FnsnC+6kg3MCD5ji7cBHHOndJxnhY3BpFKbqASC1lxRF2xk4ZXXFNDEYuTxyRz6EnGM8tRLJwd6MJ5F4U4k4iDXeIS4PCcdOHZR2PA6Zlnrg0iOQDpOlVMTU0gdgFXAuVeVrMQvAgboaG8UrMf4ZEcia2dPJSdKbfi0u4HUJZEXNTkmy2HV+Zz2JXRDv920YRsqltx9b4kTEM2n/umBHdC93/JmC3Yrfh4EPx9taOvyh2EfMoDkpy3bhJ+h5kn1w0FicSmIWCMYG8L0pVTkRIz6P9PkBHhePI+UE3S+l3Yu4ywcYQd0jSsAf4+OfGxMUR3gPiLmdeoS7iL/0Izo1gQiZ1E3r+npoGBeMgfcZiGH8Br/ucPfV+X7EAAAAASUVORK5CYII=\"","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 aboutUs: \"About Us\",\r\n about1: \"Ave Mobilidade is the public passenger transport network serving the populations of Cabeceiras de Basto, Fafe, Guimarães, Mondim de Basto, Póvoa de Lanhoso, Vieira do Minho, Vila Nova de Famalicão and Vizela.\",\r\n about2: \"With 161 vehicles, 42 two municipal lines, 31 intercity lines and 25 interregional lines, mobility in the region is thus strengthened with a public road transport policy that aims to respond to the true conveniences of the community. Among the services available are the adaptation of the fleet to respond to the transport needs of passengers with reduced mobility, Wi-Fi connection on board, a website and APP. In this way, it is easier for passengers to plan their trips, as they can use time-search tools by Origin/Destination or use a customer support line, available on weekdays between 9am and 7pm , among other amenities.\",\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 Offices\",\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 Ave Mobilidade\",\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 sent: \"Message sent\",\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 and Duties\",\r\n ticketInfo: \"Tickets and fares\",\r\n serviceOnDemand: \"Services on demand\",\r\n moreInfoSoon: \"Service will be available soon...\",\r\n serviceOnDemandHowWorks: \"How does Service on Demand work?\",\r\n serviceOnDemandWorkingOne: \"If you intend to travel from one of the locations with Service on Demand signs, call 253 415 015* on the business day prior to your trip, until 1pm.\",\r\n serviceOnDemandWorkingTwo: \"A reservation will be made, and you'll be informed of the location and time of the transport.\",\r\n serviceOnDemandWorkingThree: \"In the next day, the transport will show up at the appointed time and place.\",\r\n serviceOnDemandPlacesHeader: \"Places, per county, covered by SD:\",\r\n serviceOnDemandPlacesFafe: \"Fafe
Aguiar e S. Pedro, Argande, Assento, Atalaia, Bairro e Crasto, Barbeita de Baixo, Barbeita de Cima, Cabeceiros, Carvalhal, Casal e Quintãs, Caselhos, Castanheira, Certal, Cestelo, Compostela, Cortegaça, Crasto, Souto, Fornelo, Leiras, Macieiro, Moinhos, Mós, Ortezedo, Outeiro Mau, Pinheiro, Seara e Torre, Portas, Portela e Lages de S. João, Ribeira, Samorinha, Santa Cruz, São Sebastião, Soalheira, Soutelo, Tabaçó e Torpeza.\",\r\n serviceOnDemandPlacesMondimBastos: \"Mondim de Basto
Bormela (Fundão), Carvalhais, Covas, Côvelo, Paço, Pardelhas, Pedreira, Póvoa, Sobreira, Suidros, Travassos.\",\r\n serviceOnDemandPlacesPovoaLanhoso: \"Póvoa de Lanhoso
Barrio, Berraria, Bezerral, Bobeiro, Cabanelas, Cancelos, Carreira, Carvalho, Cimo de Vila, Cruzeiro, Devesa, Lagido, Laranjal, Monte, Outeiro, Paço Velho, Paredes, Penedos, Portas, Pousada, Pousadela, Pregal, Quintela, Reboreda, Tinocos, Ventosela, Vila e Vilar.\",\r\n serviceOnDemandPlacesVizela: \"Vizela
Barrado, Borreiros/Outeirinho, Bouça, Bouço.\",\r\n serviceOnDemandPlacesCallSchedule: \"*Working hours
9h00 – 13h00
14h00 – 18h00
(call to national fixed network).\",\r\n fares: \"Fares\",\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 between towns are merely indicative, therefore you should consider the time for the town that precedes the one you're in.\",\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 notes: \"View Notes\",\r\n passes418s23: \"4_18 and Sub23 Passes\",\r\n pass418: \"4_18 Pass\",\r\n pass418Users: \"The \\\"4_18\\\" pass is intended for non-higher education students, from 4 to 18 years of age, who do not benefit from school transport.\",\r\n pass418Conditions: \"The transport ticket «4_18@escola.tp» will have the following discounts on the price of the monthly passes in effect, namely intermodal, combined and network or line passes:\",\r\n pass418ConditionA: \"60% for students benefiting from Grade \\\"A\\\" of the School Social Action;\",\r\n pass418ConditionB: \"25% for the remaining non-higher education students, from 4 to 18 years old, not covered by the provisions of the previous paragraph.\",\r\n pass418Requirements: \"To get access to these discounts, you must:\",\r\n pass418RequirementA: \"obtain from the educational establishment a 4_18 Enrollment Declaration, which proves the student's enrollment, in which it is expressly mentioned that he is not covered by the school transport established by Decree-Law nº. 21/2019, from January 30th, and whether or not they are a beneficiary of the School Social Action and, if so, at which level;\",\r\n pass418RequirementB: \"fill the requisition requesting access to the benefit;\",\r\n pass418RequirementC: \"deliver these documents for issuing the 4_18 pass card. The card is valid for a maximum period of 4 years, until the end of the month in which the student turns 19.\",\r\n pass418Renewal: \"At the beginning of each academic year it is necessary to present a new declaration from the educational establishment, in order to be entitled to the reductions provided by the 4_18 pass.\",\r\n passS23: \"Sub23 passes (public or private higher education students, up to 23 years old)\",\r\n passS23ShortName: \"Sub23 Pass\",\r\n passS23Users: \"The sub23 pass is intended for higher education students up to and including 23 years of age and, in the case of higher education students enrolled in Medicine and Architecture courses, up to and including 24 years of age.\",\r\n passS23Conditions: \"The transport ticket «sub23@superior.tp» will have the following discounts on the price of the monthly passes in effect, namely intermodal, combined and network or line passes:\",\r\n passS23ConditionA: \"60% for students benefiting from Direct Social Action in Higher Education;\",\r\n passS23ConditionB: \"25% for the remaining Higher Education students.\",\r\n passS23Requirements: \"To access these discounts, you must:\",\r\n passS23RequirementA: \"obtain from the educational establishment a Sub23 Enrollment Declaration, which proves the student's enrollment, as well as whether or not he is a beneficiary of Direct Social Action in Higher Education;\",\r\n passS23RequirementB: \"deliver these sub23 pass card documents. The card is valid for a maximum period of 4 years, up to and including 23 years of age and, in the case of higher education students enrolled in Medicine and Architecture courses, up to and including 24 years of age.\",\r\n passS23Renewal: \"At the beginning of each academic year, it is necessary to present an updated statement from the educational establishment to the transport provider, in order to be entitled to the reductions provided by the sub23 pass again.\",\r\n passes418s23MoreInfo: \"For more information, access the respective links:\",\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 passAntigoCombatenteMoreInfo: \"For more information, access the following link:\",\r\n passAntigoCombatenteLink: \"Antigo Combatente Pass (imt-ip.pt)\",\r\n town: \"Location\",\r\n address: \"Address\",\r\n postalCode: \"Postal Code\",\r\n schedule: \"Schedule\",\r\n workingDays: \"Working Days\",\r\n saturdays: \"Saturdays\",\r\n mondayToSaturday: \"Monday to Saturday\",\r\n sundays: \"Sundays\",\r\n saturdaysSundaysHolidays: \"Saturdays, Sundays and Holidays\",\r\n daily: \"Daily\",\r\n exceptSunday: \"Monday to Saturday\",\r\n saturdaysHolidays: \"Saturdays and Holidays\",\r\n sundaysMondaysIfHolidays: \"Sundays and Mondays (if holiday)\",\r\n contactInfo: \"Information\",\r\n contactCompliments: \"Compliments\",\r\n contactComplaints: \"Complaints\",\r\n contactSuggestions: \"Suggestions\",\r\n reason: \"Reason\",\r\n contactInfoSchedule: \"Schedules and trips\",\r\n contactInfoCustomer: \"Information made available to passengers\",\r\n contactInfoDispatches: \"Dispatches\",\r\n contactInfoDisableTransport: \"Transport of passengers in a wheelchair\",\r\n contactInfoOther: \"Other subjects\",\r\n contactInfoPathsStops: \"Routes and stops\",\r\n contactInfoTicket: \"Tickets and Tariffs\",\r\n contactInfoLostFound: \"Lost and found\",\r\n contactInfoInvoiceRequest: \"Invoice Request\",\r\n contactComplaintsPassengerRelations: \"Customer service and relationship with passengers\",\r\n contactComplaintsDelays: \"Early/Delay trip\",\r\n contactComplaintsNoShows: \"Trips that were not done\",\r\n contactComplaintsConfort: \"Confort and cleaning of the vehicles\",\r\n contactComplaintsOther: \"Other subjects\",\r\n contactComplaintsRefunds: \"Ticket refunds\",\r\n contactComplaintsTicket: \"Tickets and Tariffs\",\r\n contactComplaintsPathStops: \"Routes and stops\",\r\n contactComplaintsInvoiceRequest: \"Invoice Request\",\r\n contactComplaintsSchedulesFrequencies: \"Schedules and frequencies\",\r\n contactComplaintsUserInformation: \"Information made available to users\",\r\n contactComplaintsBaggage: \"Lost or damaged luggage\",\r\n contactComplaintsIncapacityOfTransport: \"Inability to transport all users\",\r\n contactComplaintsTechnicalProblems: \"Technical Problems\",\r\n refundsPolicy: \"Return policies\",\r\n provideSubject: \"Please, indicate the subject for this contact\",\r\n moreInfoSupportline: \"For additional information contact our customer support line +351 253 009 900 (available from 9am to 7pm on working days). National landline network phone call.\",\r\n file: \"Attachment\",\r\n fileHelp: \"Files should be no bigger than 2 MB. Allowed file types include: jpg jpeg png pdf doc docx.\"\r\n },\r\n pt: {\r\n aboutUs: \"Sobre Nós\",\r\n about1: \"A Ave Mobilidade é a rede de transportes públicos de passageiros ao serviço das populações de Cabeceiras de Basto, Fafe, Guimarães, Mondim de Basto, Póvoa de Lanhoso, Vieira do Minho, Vila Nova de Famalicão e Vizela.\",\r\n about2: \"Com 161 viaturas, 42 duas linhas municipais, 31 intermunicipais e 25 linhas inter-regionais, a mobilidade na região está, assim, fortalecida com uma política de transporte público rodoviário que visa responder às verdadeiras conveniências da comunidade. De entre os serviços disponibilizados contam-se a adaptação da frota para responder às necessidades de transporte de passageiros com mobilidade condicionada, ligação Wi-fi a bordo, um site e APP. Deste modo, é mais fácil aos passageiros fazer o planeamento das suas viagens, já que podem utilizar ferramentas de pesquisa de horários por Origem/Destino ou servir-se de uma linha de apoio ao cliente, disponível aos dias úteis entre as 9 e as 19h, entre outras comodidades.\",\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: \"Postos 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: \"Seleccione 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 Ave Mobilidade\",\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 sent: \"Mensagem Enviada\",\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 e Deveres dos Passageiros\",\r\n ticketInfo: \"Títulos e tarifas\",\r\n serviceOnDemand: \"Transporte a pedido\",\r\n moreInfoSoon: \"Serviço brevemente disponível...\",\r\n serviceOnDemandHowWorks: \"Como funciona o Transporte a Pedido?\",\r\n serviceOnDemandWorkingOne: \"Se pretende viajar a partir de uma das localidades com sinalética de Transporte a Pedido, contacte o nº 253 415 015* no dia útil anterior ao da viagem, até às 13h.\",\r\n serviceOnDemandWorkingTwo: \"Será feita a reserva, informando-o do local e hora de passagem do transporte.\",\r\n serviceOnDemandWorkingThree: \"No dia seguinte, na hora e local marcado, o transporte aparece.\",\r\n serviceOnDemandPlacesHeader: \"Localidades, por município, abrangidos pelo TP:\",\r\n serviceOnDemandPlacesFafe: \"Fafe: Aguiar e S. Pedro, Argande, Assento, Atalaia, Bairro e Crasto, Barbeita de Baixo, Barbeita de Cima, Cabeceiros, Carvalhal, Carvalho, Casal e Quintãs, Caselhos, Castanheira, Certal, Cestelo, Compostela, Cortegaça, Crasto, Fornelo, Lameiro, Leiras, Macieiro, Moinhos, Ortezedo, Pinheiro, Seara e Torre, Portas, Portela e Lages de S. João, Ribeira, Samorinha, São Sebastião, Soalheira, Soutelo, Tabaçó, Torpeza.\",\r\n serviceOnDemandPlacesMondimBastos: \"Mondim de Basto: Barreiro, Bormela (Fundão), Carvalhais, Covas, Côvelo, Paço, Pardelhas, Pedreira, Póvoa, Sobreira, Suidros, Travassos.\",\r\n serviceOnDemandPlacesPovoaLanhoso: \"Póvoa de Lanhoso: Barrio, Bezerral, Bobeiro, Bolhoso, Cabanelas, Cancelos, Carreira, Carvalho, Cimo de Vila, Cruzeiro, Devesa, Lagido, Laranjal, Monte, Paço, Paço Velho, Paredes, Penedos, Portas, Pousada, Pousadela, Pregal, Quintela, Reboreda, Tinocos, Ventosela, Vila, Vilar.\",\r\n serviceOnDemandPlacesVizela: \"Vizela: Barrado, Borreiros/Outeirinho, Bouça.\",\r\n serviceOnDemandPlacesCallSchedule: \"*Horário de funcionamento 9h00 – 13h00 / 14h – 18h (chamada para rede fixa nacional).\",\r\n fares: \"Tarifário\",\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 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 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 notes: \"Ver Notas\",\r\n passes418s23: \"Passes 4_18 e Sub23\",\r\n pass418: \"Passe 4_18\",\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 pass418Conditions: \"O título de transporte passe «4_18@escola.tp» terá os seguintes descontos sobre o preço dos passes mensais em vigor, designadamente os intermodais, os combinados e os passes de rede ou de linha:\",\r\n pass418ConditionA: \"60% para os estudantes beneficiários do Escalão \\\"A\\\" da Ação Social Escolar;\",\r\n pass418ConditionB: \"25% para os restantes estudantes do ensino não superior, dos 4 aos 18 anos, inclusive, não abrangidos pelo disposto na alínea anterior.\",\r\n pass418Requirements: \"Para ter acesso àqueles descontos, é necessário:\",\r\n pass418RequirementA: \"obter junto do estabelecimento de ensino uma Declaração de Matrícula 4_18, que comprove a inscrição do aluno, na qual esteja referido expressamente não se encontrar abrangido pelo transporte escolar estabelecido pelo Decreto-Lei n.º 21/2019, de 30 de janeiro, bem como se é ou não beneficiário da Ação Social Escolar e, em caso afirmativo, qual o seu escalão;\",\r\n pass418RequirementB: \"preencher a requisição a solicitar o acesso ao benefício;\",\r\n pass418RequirementC: \"entregar estes documentos para emissão do cartão de passe 4_18. O cartão é válido por períodos máximos de 4 anos, até ao final do mês em que o aluno completa 19 anos.\",\r\n pass418Renewal: \"No início de cada ano letivo, é necessário apresentar, nova declaração do estabelecimento de ensino, para poder voltar a ter direito às reduções proporcionadas pelo passe 4_18.\",\r\n passS23: \"Passes sub23 (estudantes do ensino superior público ou privado, até aos 23 anos)\",\r\n passS23ShortName: \"Passe Sub23\",\r\n passS23Users: \"O passe sub23 destina-se aos estudantes do ensino superior até aos 23 anos, inclusive e, no caso dos estudantes de ensino superior inscritos nos cursos de Medicina e de Arquitetura, até aos 24 anos de idade inclusive.\",\r\n passS23Conditions: \"O título de transporte passe «sub23@superior.tp» terá os seguintes descontos sobre o preço dos passes mensais em vigor, designadamente os intermodais, os combinados e os passes de rede ou de linha:\",\r\n passS23ConditionA: \"60% para os estudantes beneficiários da Ação Social Direta no Ensino Superior;\",\r\n passS23ConditionB: \"25% para os restantes estudantes do Ensino Superior.\",\r\n passS23Requirements: \"Para ter acesso àqueles descontos, é necessário:\",\r\n passS23RequirementA: \"obter junto do estabelecimento de ensino uma Declaração de Matrícula sub23, que comprove a inscrição do aluno, bem como se é ou não beneficiário da Ação Social Direta no Ensino Superior;\",\r\n passS23RequirementB: \"entregar estes documentos do cartão de passe sub23. O cartão é válido por períodos máximos de 4 anos, até aos 23 anos, inclusive e, no caso dos estudantes de ensino superior inscritos nos cursos de Medicina e de Arquitetura, até aos 24 anos de idade, inclusive.\",\r\n passS23Renewal: \"No início de cada ano letivo, é necessário apresentar, ao operador de transportes, declaração atualizada do estabelecimento de ensino, para voltar a ter direito às reduções previstas pelo passe sub23.\",\r\n passes418s23MoreInfo: \"Para mais informações aceda aos respetivos links:\",\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 passAntigoCombatenteMoreInfo: \"Para mais informações aceda ao seguinte link:\",\r\n passAntigoCombatenteLink: \"Passe de Antigo Combatente (imt-ip.pt)\",\r\n town: \"Localidade\",\r\n address: \"Morada\",\r\n postalCode: \"Código Postal\",\r\n schedule: \"Horário\",\r\n workingDays: \"Dias Úteis\",\r\n saturdays: \"Sábados\",\r\n mondayToSaturday: \"Segunda a Sábado\",\r\n sundays: \"Domingos\",\r\n saturdaysSundaysHolidays: \"Sábados, Domingos e Feriados\",\r\n daily: \"Diariamente\",\r\n exceptSunday: \"Segunda a Sábado\",\r\n saturdaysHolidays: \"Sábados e Feriados\",\r\n sundaysMondaysIfHolidays: \"Domingos e Segunda (se feriado)\",\r\n contactInfo: \"Informações\",\r\n contactCompliments: \"Elogios\",\r\n contactComplaints: \"Reclamações\",\r\n contactSuggestions: \"Sugestões\",\r\n reason: \"Motivo\",\r\n contactInfoSchedule: \"Horários e frequências das linhas\",\r\n contactInfoDispatches: \"Despachos\",\r\n contactInfoDisableTransport: \"Transporte de passageiros com cadeira de rodas\",\r\n contactInfoCustomer: \"Informação disponibilizada aos passageiros\",\r\n contactInfoOther: \"Outros assuntos\",\r\n contactInfoPathsStops: \"Percursos e paragens de linhas\",\r\n contactInfoTicket: \"Títulos e Tarifas\",\r\n contactInfoLostFound: \"Perdidos e achados\",\r\n contactInfoInvoiceRequest: \"Pedido Fatura\",\r\n contactComplaintsPassengerRelations: \"Atendimento e relacionamento com os passageiros\",\r\n contactComplaintsDelays: \"Circulação adiantada/atrasada\",\r\n contactComplaintsNoShows: \"Circulações não realizadas\",\r\n contactComplaintsConfort: \"Conforto e limpeza dos veículos\",\r\n contactComplaintsOther: \"Outros assuntos\",\r\n contactComplaintsRefunds: \"Reembolso bilhete\",\r\n contactComplaintsSchedulesFrequencies: \"Horários e frequências\",\r\n contactComplaintsUserInformation: \"Informação disponibilizada aos utilizadores\",\r\n contactComplaintsBaggage: \"Bagagem ou despacho extraviado ou danificado\",\r\n contactComplaintsIncapacityOfTransport: \"Incapacidade de transportar todos os utilizadores\",\r\n contactComplaintsTechnicalProblems: \"Problemas técnicos\",\r\n refundsPolicy: \"Politicas de devolução\",\r\n contactComplaintsTicket: \"Títulos e Tarifas\",\r\n contactComplaintsPathStops: \"Percursos e paragens de linhas\",\r\n contactComplaintsInvoiceRequest: \"Pedido Fatura\",\r\n provideSubject: \"Por favor, indique o assunto relativo a este contacto\",\r\n moreInfoSupportline: \"Para mais informações contacte a nossa linha de apoio ao cliente 253 009 900 (disponível das 09h às 19h/dias úteis). Chamada para a rede fixa nacional.\",\r\n file: \"Anexo\",\r\n fileHelp: \"A dimensão dos ficheiros deve ser inferior a 2 MB. Tipos de ficheiro permitidos: jpg jpeg png pdf doc docx.\"\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 { strings } from '../resources/strings.js';\r\nimport { LinkContainer } from 'react-router-bootstrap';\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.complaintsBook} | {strings.passengerRights} | {strings.privacyPolicy} | {strings.contactComplaintsRefunds}\r\n {/* {strings.copyright}. {strings.developedFor}. {strings.allRightsReserved}. {strings.complaintsBook} | {strings.passengerRights} | {strings.privacyPolicy} | {strings.contactComplaintsRefunds} */}\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 && 4 !== 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 !== 4);\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};\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.defaultRoute}lines/${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}","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}","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 externalTicketOfficeIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/externalTicketOfficeIcon.png'),\r\n iconAnchor: new L.Point(25, 25),\r\n iconSize: new L.Point(50, 50)\r\n});\r\n\r\nconst selectedExternalTicketOfficeIcon = new L.Icon({\r\n iconUrl: require('../leaflet/icons/selectedExternalTicketOfficeIcon.png'),\r\n iconAnchor: new L.Point(25, 25),\r\n iconSize: new L.Point(50, 50)\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, externalTicketOfficeIcon, selectedExternalTicketOfficeIcon, 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\nimport { PropTypes } from 'prop-types';\r\nimport { MapContainer, Polyline, TileLayer, AttributionControl, useMap, useMapEvents, Marker, Tooltip } from 'react-leaflet';\r\nimport 'leaflet/dist/leaflet.css';\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, externalTicketOfficeIcon, selectedExternalTicketOfficeIcon, 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\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 zoomIn: 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.code.localeCompare(b.code));\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 zoomIn: 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, true);\r\n } else if (place.type === 3) {\r\n this.handleTicketOfficeSelection(place, recenter, true);\r\n } else if (place.type === 4) {\r\n this.handleLineSelection(place);\r\n }\r\n\r\n }\r\n\r\n handleStopSelection(stop, recenter, zoom) {\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 zoomIn: true\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, zoom) {\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 zoomIn: false\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 ticketOffice.type === 11 ? selectedExternalTicketOfficeIcon : selectedTicketOfficeIcon;\r\n }\r\n\r\n return ticketOffice.type === 11 ? externalTicketOfficeIcon : 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 \"#E52421\";\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} - {selectedTO.name}\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, zoomIn } = 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 \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, 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 {nearTO.map((ticketOffice) =>\r\n {\r\n this.handleTicketOfficeSelection(ticketOffice, false, 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\nfunction SetViewOnClick({ coords, isToRecenter, zoomIn}) {\r\n const map = useMap();\r\n\r\n if (isToRecenter) {\r\n if (zoomIn) {\r\n map.setView(coords, 16);\r\n } else {\r\n map.setView(coords, map.getZoom());\r\n }\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 { 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, AttributionControl } 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 return [{ lat: trip.maxLatitude, lng: trip.maxLongitude }, { lat: trip.minLatitude, lng: trip.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=\"#E52421\" />\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=\"#E52421\" />\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 \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 = selectedPassing.isDeterministic ? parseInt((calculatedTime.getTime() - scheduleTime.getTime()) / 60000) : 0;\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 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 //--------------\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 {\r\n 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\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 {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 renderPassingRealTime(tripPassing) {\r\n return -1 === tripPassing.duration ?\r\n null :\r\n
\"Tempo{this.formatDuration(tripPassing.duration)}
;\r\n }\r\n\r\n renderPassingPlannedTime(displayTime, tripPassing) {\r\n return displayTime ?\r\n {tripPassing.formattedTimeStamp} :\r\n null;\r\n }\r\n\r\n renderPassingTime(tripPassing, displayPlannedTime) {\r\n if (tripPassing.isRT) {\r\n return this.renderPassingRealTime(tripPassing);\r\n }\r\n\r\n return this.renderPassingPlannedTime(displayPlannedTime, tripPassing);\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 const displayPlannedTime = trip.passings\r\n .filter(passing => passing.isRT)\r\n .every(passing => passing.isDeterministic);\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 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 {this.renderPassingTime(tripPassing, displayPlannedTime)}\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=\"#E52421\"\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, createRef } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { StopPassingInfo } from './StopPassingInfo';\r\nimport { LineInfo } from './LineInfo';\r\nimport { MoreSchedules } from './MoreSchedules';\r\n\r\nexport class NextDepartures 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\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 }\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\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","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}","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","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, AttributionControl } 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, externalTicketOfficeIcon, 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 ticketOffice.type === 11 ? externalTicketOfficeIcon : 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 \"\"\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 ? \"#E52421\" : \"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 }} attributionControl={false}>\r\n \r\n \r\n \r\n {this.renderNearStops()} \r\n \r\n {this.renderNearTO()}\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, AttributionControl } 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=\"#E52421\"\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=\"#E52421\"\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 {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 })} attributionControl={false}>\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 }) {\r\n const map = useMap();\r\n map.fitBounds(bounds);\r\n return null;\r\n}\r\n","import React, { Component } 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 };\r\n\r\n constructor(props) {\r\n super(props);\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 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 //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 {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(subtrip, index);\r\n }\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\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 Ir a pé {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
    \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 Ir a pé {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.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 );\r\n }\r\n\r\n renderIntermediateSubtrip(subtrip, index) {\r\n const { getLogo } = this.context;\r\n\r\n return (\r\n
    \r\n {\r\n subtrip.isWalking ?\r\n
    \r\n \"\"\r\n Ir a pé {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 );\r\n }\r\n\r\n renderLastSubtrip(trip, subtrip) {\r\n const { getLogo } = this.context;\r\n\r\n return (\r\n
    \r\n {\r\n subtrip.isWalking ?\r\n
    \r\n \"\"\r\n Ir a pé {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\n\r\nexport class PlanRoute 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\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\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","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 } from 'react';\r\nimport { PropTypes } from 'prop-types';\r\nimport { Button, Spinner, Overlay, Popover, FormControl } 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 typing: false,\r\n typedText: ''\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.code.localeCompare(b.code)),\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 typing: false,\r\n typedText: '',\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 setLineSearch(e) {\r\n this.setState({\r\n typing: true,\r\n typedText: e.target.value,\r\n selectedLine: undefined,\r\n selectedDirection: undefined,\r\n selectedDaytype: undefined,\r\n scheduleInfo: { stops: [], trips: [], exceptions: [] },\r\n displayLineDropdown: true,\r\n displayDirectionDropdown: false,\r\n displayDaytypeDropdown: false,\r\n displayNoInfo: false\r\n });\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, typing, typedText } = this.state;\r\n\r\n if (!displayLineDropdown) {\r\n return null;\r\n }\r\n\r\n return (\r\n
    \r\n this.setLineSearch(e)} value={\r\n typing === false ? \r\n selectedLine !== undefined ? selectedLine.code + ' ' + selectedLine.name\r\n : ''\r\n : typedText\r\n } />\r\n {/**/}\r\n
      \r\n {\r\n lines.filter(l => (l.code.toLowerCase() + ' ' + l.name.toLowerCase()).indexOf(typedText.toLowerCase()) > -1).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\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.code.localeCompare(b.code)),\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 //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 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: request,\r\n contentType: ContentType.MULTIPART,\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 sent: false,\r\n selectedSubject: 0,\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 var data = new FormData(); \r\n data.append(\"name\", e.target.name.value);\r\n data.append(\"email\", e.target.email.value);\r\n data.append(\"phone\", e.target.phone.value);\r\n data.append(\"address\", e.target.address.value);\r\n data.append(\"postalCode\", e.target.postalCode.value);\r\n data.append(\"subject\", e.target.subjectType.value);\r\n data.append(\"reason\", e.target.reason.value);\r\n data.append(\"message\", e.target.message.value);\r\n if (e.target.file.files.length > 0) {\r\n data.append(\"file\", e.target.file.files[0]);\r\n }\r\n\r\n this.state.commands.contacts.sendEmail(data, (r) => this.sendSuccessCallback(r), (r) => this.sendErrorCallback(r));\r\n }\r\n\r\n handleSubjectChange = (e) => {\r\n e.preventDefault();\r\n\r\n this.setState({ selectedSubject: e.target.value });\r\n }\r\n\r\n sendSuccessCallback(result) {\r\n this.setState({\r\n sending: false,\r\n sent: true,\r\n result: true\r\n });\r\n }\r\n\r\n sendErrorCallback(result) {\r\n this.setState({\r\n sending: false,\r\n sent: false,\r\n result: false\r\n });\r\n }\r\n\r\n render() {\r\n \r\n const subjectOptions = [strings.contactInfo, strings.contactCompliments, strings.contactComplaints, strings.contactSuggestions];\r\n\r\n const reasonOptions = [\r\n [\r\n strings.contactInfoDispatches,\r\n strings.contactInfoSchedule,\r\n strings.contactInfoCustomer,\r\n strings.contactInfoInvoiceRequest,\r\n strings.contactInfoPathsStops,\r\n strings.contactInfoLostFound,\r\n strings.contactInfoTicket,\r\n strings.contactInfoDisableTransport,\r\n strings.contactInfoOther,\r\n ],\r\n [\r\n strings.contactCompliments\r\n ],\r\n [\r\n strings.contactComplaintsPassengerRelations,\r\n strings.contactComplaintsInvoiceRequest,\r\n strings.contactComplaintsDelays,\r\n strings.contactComplaintsNoShows,\r\n strings.contactComplaintsSchedulesFrequencies,\r\n strings.contactComplaintsUserInformation,\r\n strings.contactComplaintsPathStops,\r\n strings.contactComplaintsBaggage,\r\n strings.contactComplaintsRefunds,\r\n strings.contactComplaintsTicket,\r\n strings.contactComplaintsIncapacityOfTransport,\r\n strings.contactComplaintsConfort,\r\n strings.contactComplaintsTechnicalProblems,\r\n strings.contactComplaintsOther\r\n ],\r\n [\r\n strings.contactSuggestions\r\n ]\r\n ];\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
    \r\n {strings.provideSubject}\r\n
    \r\n\r\n \r\n this.handleSubjectChange(e)}>\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 reasonOptions[this.state.selectedSubject].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 {strings.file}\r\n \r\n \r\n {strings.fileHelp}\r\n \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

    {strings.moreInfoSupportline}

    \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 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) => {\r\n if (message.type.toLowerCase() === 'aviso' || message.type.toLowerCase() === 'warning') {\r\n return \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 } else if (message.type.toLowerCase() === 'imagem' || message.type.toLowerCase() === 'image') {\r\n return \r\n \r\n \r\n {message.creationDateToShow}\r\n \r\n \r\n \r\n \r\n \"warning\"\r\n \r\n \r\n \r\n }\r\n\r\n return null;\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 }\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 React, { Component } from 'react';\r\nimport { Container, Row } from 'react-bootstrap';\r\nimport { strings } from '../../resources/strings';\r\n\r\nexport class About extends Component {\r\n //RENDER\r\n\r\n render() {\r\n return (\r\n \r\n \r\n
    {strings.aboutUs}
    \r\n
    \r\n \r\n
    {strings.about1}
    \r\n
    {strings.about2}
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Carousel } from 'react-bootstrap';\r\nimport PropTypes from 'prop-types';\r\n\r\nclass CarouselComponent extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedImageIndex: 0,\r\n carouselItems: [],\r\n hasValidCarouselItems: false,\r\n showCarousel: props.showCarousel,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.loadCarouselConfig();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.showCarousel !== this.props.showCarousel) {\r\n this.setState({ showCarousel: this.props.showCarousel });\r\n }\r\n }\r\n\r\n\r\n loadCarouselConfig() {\r\n fetch(`${process.env.PUBLIC_URL}/docs/carousel/carousel-config.json`)\r\n .then(response => response.json())\r\n .then(data => {\r\n const today = new Date().toISOString().split('T')[0]; // Current date in YYYY-MM-DD format\r\n\r\n // Filter items based on the current date\r\n const filteredItems = data.Carousel.filter(item => {\r\n const currentDate = new Date(today);\r\n const start = new Date(item.startDate);\r\n const end = new Date(item.endDate);\r\n return currentDate >= start && currentDate <= end;\r\n });\r\n\r\n // Check if there are valid items\r\n if (filteredItems.length > 0) {\r\n this.setState({\r\n carouselItems: filteredItems,\r\n hasValidCarouselItems: true\r\n });\r\n } else {\r\n this.setState({\r\n hasValidCarouselItems: false\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n console.error('Error loading carousel config:', error);\r\n this.setState({\r\n hasValidCarouselItems: false\r\n });\r\n });\r\n }\r\n\r\n handleCarouselClose = (event) => {\r\n if (event.target === event.currentTarget) {\r\n this.setState({ showCarousel: false });\r\n this.props.onClose();\r\n }\r\n }\r\n\r\n handleImageClick = (url) => {\r\n //window.location.href = url; // opens the link in the same window\r\n window.open(url, '_blank'); // '_blank' opens the link in a new tab\r\n this.props.onClose();\r\n }\r\n\r\n render() {\r\n const { selectedImageIndex, carouselItems, hasValidCarouselItems, showCarousel } = this.state;\r\n\r\n if (!showCarousel) {\r\n return null;\r\n }\r\n\r\n return (\r\n showCarousel && hasValidCarouselItems && (\r\n
    \r\n
    \r\n {/* Close Button */}\r\n \r\n\r\n this.setState({ selectedImageIndex: selectedIndex })}\r\n >\r\n {carouselItems.map((item, index) => (\r\n \r\n {\r\n e.stopPropagation(); // Prevent click event from closing the carousel\r\n this.handleImageClick(item.url); // Redirect to the URL\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\nCarouselComponent.propTypes = {\r\n showCarousel: PropTypes.bool,\r\n onClose: PropTypes.func\r\n};\r\n\r\nCarouselComponent.defaultProps = {\r\n showCarousel: false,\r\n onClose: () => { }\r\n};\r\n\r\nexport default CarouselComponent;\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\nimport Carousel from './Carousel';\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 showCarousel: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.getMessages();\r\n this.carouselTimeout = setTimeout(() => {\r\n this.setState({ showCarousel: true });\r\n }, 500);\r\n }\r\n\r\n\r\n componentWillUnmount() {\r\n if (this.carouselTimeout) {\r\n clearTimeout(this.carouselTimeout);\r\n }\r\n }\r\n\r\n getMessages() {\r\n this.setState({ isLoadingMessages: true });\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 handleCarouselClose = () => {\r\n this.setState({ showCarousel: false });\r\n }\r\n\r\n renderMessages() {\r\n const { messages } = this.state;\r\n\r\n if (messages.length !== 0) {\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 : 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 this.openModal(index)}\r\n style={{ cursor: 'pointer' }}\r\n />\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 {strings.noMessagesToShow};\r\n }\r\n }\r\n\r\n render() {\r\n const { showCarousel } = this.state;\r\n\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 {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
      {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 }\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container, Row, Col } from 'react-bootstrap';\r\n//import { strings } from '../../resources/strings';\r\n\r\nexport class TicketInfo extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n Descarregar Informação Tarifária Completa\r\n \r\n \r\n

    Temos sempre uma solução a pensar em si.

    \r\n
    \r\n \r\n \r\n \r\n
    BILHETE SIMPLES
    \r\n
      \r\n
    • Título não personalizado;
    • \r\n
    • Vendido a bordo;
    • \r\n
    • Permite a realização de 1 viagem no autocarro onde foi adquirido;
    • \r\n
    \r\n
    \r\n \r\n
    MEIO BILHETE
    \r\n
      \r\n
    • Título não personalizado;
    • \r\n
    • Vendido a bordo;
    • \r\n
    • Permite a realização de 1 viagem no autocarro onde foi adquirido;
    • \r\n
    • Destina-se a crianças dos 4 aos 12 anos inclusive e adultos com idade igual ou superior a 65 anos;
    • \r\n
    • Nas viagens com origem e destino na zona do centro da cidade de Guimarães aplica-se excecionalmente um valor base de 0,85€.
    • \r\n
    \r\n
    \r\n \r\n
    PRÉ-COMPRADO
    10 VIAGENS
    \r\n
      \r\n
    • Título não personalizado;
    • \r\n
    • Vendido e recarregado na bilheteira;
    • \r\n
    • Permite a realização de 10 viagens na origem e destino escolhidos;
    • \r\n
    • Tem de ser sempre validado a bordo do autocarro;
    • \r\n
    • Desconto 10% vs bilhete simples.
    • \r\n
    \r\n
    \r\n \r\n
    PASSE SOCIAL
    \r\n
      \r\n
    • Título personalizado, pessoal e intransmissível;
    • \r\n
    • Vendido na Bilheteira;
    • \r\n
    • Recarregado mensalmente na bilheteira ou na rede Saltpay;
    • \r\n
    • Válido todos os dias do mês para o qual foi adquirido com um número ilimitado de viagens;
    • \r\n
    • Permite viajar entre a origem e destino escolhidos;
    • \r\n
    • Tem de ser sempre validado a bordo do autocarro.
    • \r\n
    • Documentos necessários:\r\n
        \r\n
      • Cartão de Cidadão;
      • \r\n
      • 1 fotografia (caso não apresente Cartão de Cidadão).
      • \r\n
      \r\n
    • \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    PASSE PESSOAS COM MOBILIDADE
    CONDICIONADA (PPMC)
    - PASSAGEIROS
    \r\n
      \r\n
    • Destina-se a pessoas com um grau de incapacidade igual ou superior a 60% e que possuam o Cartão Municipal de Pessoa com Deficiência. Funciona nos mesmos moldes do Passe Mensal (PM), mas com desconto de 50% sobre a tarifa aplicável.
    • \r\n
    • Documentos necessários:\r\n
        \r\n
      • Cartão de Cidadão;
      • \r\n
      • 1 fotografia (caso não apresente Cartão de Cidadão).
      • \r\n
      • Declaração cartão Municipal de Pessoa com Deficiência.
      • \r\n
      \r\n
    • \r\n
    \r\n
    \r\n \r\n
    PASSE PESSOAS COM MOBILIDADE
    CONDICIONADA (PPMC)
    - ACOMPANHANTE
    \r\n
      \r\n
    • Destina-se a acompanhantes de Pessoas com Mobilidade Condicionada, com um grau de incapacidade igual ou superior a 80%.
    • \r\n
    • Sem custos associados;
    • \r\n
    • Documentos necessários:\r\n
        \r\n
      • Cartão de Cidadão;
      • \r\n
      • 1 fotografia (caso não apresente Cartão de Cidadão).
      • \r\n
      • Atribuição precedida de habilitação pelos Serviços Ação Social do Município.
      • \r\n
      \r\n
    • \r\n
    \r\n
    \r\n \r\n
    PASSE SUB18+TP GRATUITO
    \r\n
      \r\n
    • Título personalizado, pessoal e intransmissível;
    • \r\n
    • Vendido na Bilheteira;
    • \r\n
    • Recarregado mensalmente a bordo;
    • \r\n
    • Válido todos os dias do mês para o qual foi adquirido com um número ilimitado de viagens;
    • \r\n
    • Tem de ser sempre validado a bordo do autocarro;
    • \r\n
    • Destina-se a jovens entre os 4 e os 18 anos (inclusive);
    • \r\n
    • Renovável anualmente.
    • \r\n
    • Documentos necessários:\r\n
        \r\n
      • Requisição IMT;
      • \r\n
      • Cartão de Cidadão;
      • \r\n
      • 1 fotografia (caso não apresente Cartão de Cidadão).
      • \r\n
      \r\n
    • \r\n
    \r\n
    \r\n \r\n
    PASSE SUB23+TP GRATUITO
    \r\n
      \r\n
    • Título personalizado, pessoal e intransmissível;
    • \r\n
    • Vendido na Bilheteira;
    • \r\n
    • Recarregado mensalmente a bordo;
    • \r\n
    • Válido todos os dias do mês para o qual foi adquirido com um número ilimitado de viagens;
    • \r\n
    • Tem de ser sempre validado a bordo do autocarro;
    • \r\n
    • Destina-se a jovens entre os 19 e os 23 anos (inclusive);
    • \r\n
    • Renovável anualmente até ao último dia do mês que completa 24 anos.
    • \r\n
    • Documentos necessários:\r\n
        \r\n
      • Requisição IMT;
      • \r\n
      • Cartão de Cidadão;
      • \r\n
      • 1 fotografia (caso não apresente Cartão de Cidadão).
      • \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\n\r\nexport class PrivacyPolicy extends Component {\r\n render() {\r\n return(\r\n \r\n \r\n \r\n

    Política de Privacidade

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

    As sociedades comerciais:

    \r\n

    Transdev Mobilidade, S.A., sociedade anónima, com sede na Rua de Oslo, C.C. Londres, Loja AC 122, 4460-388 Senhora da Hora, com o número único de matrícula e pessoa coletiva 506 651 583,

    \r\n

    Auto Viação Aveirense, S.A., sociedade anónima, com sede na Rua Clube dos Galitos, 12, 3810-085 Aveiro, com o número único de matrícula e pessoa coletiva 500 038 473,

    \r\n

    Caima Transportes, S.A., sociedade anónima, com sede no Edifício do Centro Coordenador de Transportes, Av. Dr. Renato Araújo, 433-H, 3700-243 S. João da Madeira, com o número único de matrícula e pessoa coletiva 500 292 531,

    \r\n

    ETAC – Empresa de Transportes António Cunha, S.A., sociedade anónima, com sede na Avenida Fernão de Magalhães, Edifício da Rodoviária, 3001-964 Coimbra, com o número único de matrícula e pessoa coletiva 500 158 029,

    \r\n

    Minho Bus – Transportes do Minho, Sociedade Unipessoal Lda., com sede na Praça da Estação Rodoviária, 4704-510 Braga, com o número único de matrícula e pessoa coletiva 500 087 164,

    \r\n

    Rodoviária da Beira Litoral, S.A., sociedade anónima, com sede na Avenida Fernão de Magalhães – Edifício da Rodoviária, 3001-964 Coimbra, com o número único de matrícula e pessoa coletiva 502 550 414,

    \r\n

    Rodoviária da Beira Interior, S.A., sociedade anónima, com sede na Rua Portas do Sol 18 A / 18 B, 6000-261 Castelo Branco, com o número único de matrícula e pessoa coletiva 502 526 483,

    \r\n

    Rodoviária d’Entre Douro e Minho, S.A., sociedade anónima, com sede na Praça da Estação Rodoviária, 4704-510 Braga, com o número único de matrícula e pessoa coletiva 502 594 381,

    \r\n

    Transdev Douro, S.A., sociedade anónima, com sede no Largo Sacadura Cabral, n.º 32, 4630-219 Marco Canaveses, com o número único de matrícula e pessoa coletiva 500 252 173,

    \r\n

    Transdev Interior, S.A., sociedade anónima, com sede na Estrada Nacional n.º 2, 3600-194 Castro Daire, com o número único de matrícula e pessoa coletiva 500 148 775,

    \r\n

    Transdev Norte, S.A., sociedade anónima, com sede na Alameda S. Dâmaso, 82 – 1.º, 4810-286 Guimarães, com o número único de matrícula e pessoa coletiva 500 036 365,

    \r\n

    Transdev Portugal – Atividades Aeroportuárias Unipessoal, Lda, com sede na Rua de Oslo, C.C. Londres, Loja AC 122, 4460-388 Senhora da Hora, com o número único de matrícula e pessoa coletiva 515 173 606,

    \r\n

    Transdev Expressos, Unipessoal, LDA., com sede na Rua de Oslo, C.C. Londres, Loja AC 122, 4460-388 Senhora da Hora, com o número de pessoa coletiva 516028251,

    \r\n

    Partícula Andante - Sociedade de Transportes, LDA., com sede na Alameda de São Dâmaso, 82, 1.º, 4810-286 Guimarães, com o número de pessoa coletiva 516270770,

    \r\n

    Empresa de Transportes CIM Cávado, LDA., com sede na Praça da Estação Rodoviária, 4700-377 Braga, com o número de pessoa coletiva 516253000,

    \r\n

    Transdev & Avic Cávado, LDA., com sede na Praça da Estação Rodoviária, 4700-377 Braga, com número de pessoa coletiva 516253697,

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

    Individualmente e no seu conjunto designadas por TRANSDEV, procedem à recolha e tratamento de dados pessoais dos seus Clientes, tais como:

    \r\n
      \r\n
    • a) nome;
    • \r\n
    • b) morada;
    • \r\n
    • c) número de identificação fiscal;
    • \r\n
    • d) número de identificação civil;
    • \r\n
    • e) números dos telefones fixo e móvel;;
    • \r\n
    • f) endereço de correio eletrónico (e-mail);
    • \r\n
    • g) origem e destino de viagens realizadas em transporte rodoviário de passageiros.
    • \r\n
    \r\n
    \r\n\r\n \r\n

    O Cliente aceita e consente, livre e expressamente, mediante ato positivo inequívoco, autorizar\r\n que os seus dados pessoais, solicitados ou opcionalmente fornecidos por si, sejam recolhidos e\r\n tratados pela TRANSDEV nos termos aqui previstos.\r\n A comunicação de dados pessoais não constitui, por princípio, qualquer obrigação legal, sendo, no\r\n entanto, necessária para que a TRANSDEV proceda à divulgação e promoção de atividades de\r\n promoção, informação e passatempos respeitantes à atividade de transporte público de\r\n passageiros. Exclui-se do anteriormente disposto a comunicação dos dados pessoais necessária à\r\n emissão dos títulos de transporte nominativos que sejam adquiridos, uma vez que os mesmos são\r\n necessários ao cumprimento do contrato de transporte.\r\n O tratamento dos dados pessoais dos Clientes da TRANSDEV é da responsabilidade desta e\r\n consiste na operação ou no conjunto de operações efetuados sobre aqueles dados pessoais, por\r\n meios automatizados ou não automatizados.

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

    De acordo com o Regulamento (UE) 2016/679 do Parlamento Europeu e do Conselho, de 27 de\r\n abril de 2016, todos os Clientes da TRANSDEV têm o direito de:

    \r\n
      \r\n
    • a) a qualquer momento, retirar o consentimento para o tratamento dos dados pessoais;
    • \r\n
    • b) proceder ou solicitar a correção de qualquer dado pessoal que o Titular dos dados pessoais tenha fornecido;
    • \r\n
    • c) aceder aos mesmos a qualquer momento;
    • \r\n
    • d) opor-se a que os mesmos sejam utilizados para efeitos de marketing e/ou publicitários;
    • \r\n
    • e) solicitar a portabilidade dos dados pessoais, para a entidade que, para esse efeito indicar;
    • \r\n
    • f) solicitar o apagamento de todos os dados pessoais que tenha fornecido pelo presente meio, e que não sejam necessários para o cumprimento de quaisquer obrigações legais pela entidade responsável pela respetiva recolha;
    • \r\n
    • g) ser informado pela TRANSDEV se esta, eventualmente, tiver intenção de proceder ao tratamento dos dados pessoais para outros fins que não os que pelo presente é dado consentimento.
    • \r\n
    \r\n
    \r\n\r\n \r\n

    Para quaisquer informações, assim como para o exercício dos direitos que lhe são legalmente\r\n conferidos, o Cliente da TRANSDEV deve contactar o Responsável pelo Tratamento através do email com o endereço privacidade@transdev.pt. Para o mesmo efeito, poderá aceder ao sítio na\r\n internet da TRANSDEV, através do link https://www.transdev.pt/apoio-ao-cliente.

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

    Os dados pessoais recolhidos e registados podem ser comunicados a outras sociedades de direito\r\n português que laboram em território nacional sob a marca Transdev, assim como à sociedade de\r\n direito francês TRANSDEV GROUP, S.A. A comunicação dos dados pessoais recolhidos, se se\r\n verificar, será efetuada com estrito respeito do dever de confidencialidade e do princípio da\r\n finalidade que presidiu à sua recolha.

    \r\n

    Os dados pessoais podem ser partilhados com entidades que não estejam localizadas no Espaço\r\n Económico Europeu, mas que estão obrigadas a respeitar a Regulamentação Europeia sobre\r\n Proteção de Dados Pessoais, nomeadamente o Regulamento (UE) 2016/679 do Parlamento\r\n Europeu e do Conselho, de 27 de abril de 2016.

    \r\n

    Os dados pessoais podem ser objeto de tratamento automatizado, ou seja, da criação de um perfil\r\n para definir as preferências pessoais e comportamentos do seu Titular, de forma a adequar\r\n quaisquer informações publicitárias e/ou campanhas de marketing a esses dados.

    \r\n

    Sem prejuízo dos direitos que antecedem, os dados pessoais serão armazenados por tempo\r\n indeterminado.

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

    A TRANSDEV garante a proteção dos seus dados pessoais contra qualquer perda, destruição,\r\n alteração, acesso ou utilização indevida ou não autorizada adotando para o efeito todas as\r\n medidas legalmente exigidas para o efeito. No entanto, e dado que a internet pode não constituir\r\n um lugar seguro de comunicação, desde já alertamos que a informação veiculada através da\r\n internet poderá ser intercetada por terceiros.

    \r\n

    O Titular dos dados pessoais é também plena e claramente informado que poderá apresentar\r\n qualquer reclamação, quanto à violação dos seus direitos, junto da Comissão Nacional de Proteção\r\n de Dados.

    \r\n

    A TRANSDEV designou Encarregado de Proteção de Dados, nos termos da legislação em vigor.\r\n Pode entrar em contacto com o Encarregado de Proteção de Dados a todo o momento para o\r\n seguinte endereço de correio eletrónico: dpo.privacidade@transdev.pt.

    \r\n

    A TRANSDEV poderá, unilateralmente e a qualquer momento, alterar, modificar, aditar ou retificar\r\n a presente política de proteção de dados e prestação de consentimento, sem necessidade de\r\n qualquer aviso prévio.

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

    As sociedades Transdev,

    \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 { strings } from '../../resources/strings';\r\n\r\nexport class ServiceOnDemand extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n
    \r\n

    {strings.serviceOnDemand}

    \r\n
    \r\n

    {strings.serviceOnDemandHowWorks}

    \r\n
      \r\n
    1. {strings.serviceOnDemandWorkingOne}
    2. \r\n
    3. {strings.serviceOnDemandWorkingTwo}
    4. \r\n
    5. {strings.serviceOnDemandWorkingThree}
    6. \r\n
    \r\n
    \r\n

    {strings.serviceOnDemandPlacesHeader}

    \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}","import React, { Component } from 'react';\r\nimport { Container, Row, Col, Table } from 'react-bootstrap';\r\nimport { MapContainer, Marker, TileLayer, Tooltip, AttributionControl } from 'react-leaflet';\r\nimport { POICommand } from '../commands/POICommand';\r\nimport { strings } from '../../resources/strings';\r\nimport { externalTicketOfficeIcon, ticketOfficeIcon } from '../leaflet/StopIcons';\r\n\r\nexport class TicketOffice extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n commands: {\r\n poi: new POICommand()\r\n },\r\n nearTO: []\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.getNearPOI();\r\n }\r\n\r\n getNearPOI() {\r\n this.state.commands.poi.getNearPOI(41.4403427596919, -8.30417769847734, 10000000, (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 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 {/* */}\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\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\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\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {strings.town}{strings.address}{strings.schedule}
    GuimarãesBilheteira TransdevAlameda Dr. Mariano Felgueiras - GuimarãesShopping\r\n {strings.workingDays}: 07h00 - 20h00
    \r\n {strings.saturdaysHolidays}: 08h00 - 11h30 / 12h30 - 17h00
    \r\n {strings.sundaysMondaysIfHolidays}: 10h30 - 13h30 / 14h30 - 19h30\r\n
    FamalicãoBilheteira TransdevEstação Rodoviária de Famalicão - Alameda Dr. Francisco Sá Carneiro\r\n {strings.workingDays}: 08h30 - 19h00
    \r\n {strings.saturdaysSundaysHolidays}: 09h00 - 13h00 / 14h00 - 18h00\r\n
    FafeBilheteira TransdevLuis Costa Lemos - Avenida do Brasil nº 5\r\n {strings.daily}: 06h30 - 19h00\r\n
    Póvoa de LanhosoAgente TransdevQuiosque José Alberto Conçalves dos Santos - Rua Comandante Luís Pinto da Silva nº 76\r\n {strings.workingDays}: 08h30 - 19h00
    \r\n {strings.saturdays}: 08h30 - 13h00\r\n
    Cabeceiras de BastoBilheteira TransdevAlameda Camilo Castelo Branco nº 39\r\n {strings.workingDays}: 08h15 - 18h15\r\n
    Mondim de BastoBilheteira TransdevAv. dos Bombeiros\r\n {strings.workingDays}: 08h00 - 12h00 / 13h00 - 17h30\r\n
    VizelaAgente TransdevCafé da Estação de Vizela - Largo 5 de Agosto\r\n {strings.mondayToSaturday}: 07h00 - 18h00\r\n
    Vieira do MinhoBalcão CidadãoCâmara Municipal de Vieira do Minho - Praça Dr. Guilherme de Abreu nº 85\r\n {strings.workingDays}: 09h00 - 17h30\r\n
    Santo TirsoBilheteira PacenseCentral de Camionagem - Rua Infante Dom Henrique\r\n {strings.workingDays}: 08h30 - 17h30\r\n
    BragaBilheteira TransdevAvenida General Norton de Matos nº 110\r\n {strings.daily}: 06h00 - 20h30\r\n
    FelgueirasAgente LandimAv. Dr. Leonardo Coimbra, Ed. Avenida, sala 1\r\n {strings.workingDays}: 09h00 - 12h00 / 14h00 - 18h30\r\n
    JoaneAgente TransdevQuiosque Central de Joane - Largo da República 41\r\n {strings.workingDays}: 07h00 - 20h00
    \r\n {strings.saturdays}: 07h00 - 19h00
    \r\n {strings.sundays}: 07h00 - 13h00
    \r\n
    Agentes PagaquiConsulte aqui o agente Pagaqui mais próximo de si
    \r\n
    \r\n\r\n \r\n \r\n \r\n {this.state.nearTO.map((ticketOffice) =>\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\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 './custom.css'\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 { PrivacyPolicy } from './components/info/PrivacyPolicy';\r\nimport { ServiceOnDemand } from './components/info/ServiceOnDemand';\r\nimport { TicketOffice } from './components/info/TicketOffice';\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.avemobilidade.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":""}