diff --git a/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap b/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap index 4cf2c86dd..11a00e14f 100644 --- a/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap +++ b/__tests__/components/viewers/__snapshots__/stop-viewer.js.snap @@ -1496,7 +1496,7 @@ exports[`components > viewers > stop viewer should render countdown times after className="next-trip-preview" >
  • - viewers > stop viewer should render countdown times after } } > -
    - +
    - viewers > stop viewer should render countdown times after } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times after iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - + + + + + + + + - - common.time.tripDurationFormat - - - -
    - + + common.time.tripDurationFormat + + + +
    +
    +
  • - viewers > stop viewer should render countdown times after } } > -
    - +
    - viewers > stop viewer should render countdown times after } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times after iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 1:52 AM - - - -
    - + + 1:52 AM + + + +
    +
    +
  • - viewers > stop viewer should render countdown times after } } > -
    - +
    - viewers > stop viewer should render countdown times after } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times after iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 2:53 AM - - - -
    - + + 2:53 AM + + + +
    +
    +
  • @@ -3981,7 +4056,7 @@ exports[`components > viewers > stop viewer should render countdown times for st className="next-trip-preview" >
  • - viewers > stop viewer should render countdown times for st } } > -
    - +
    - viewers > stop viewer should render countdown times for st } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render countdown times for st iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - + + + + + + + + - - common.time.tripDurationFormat - - - -
    - + + common.time.tripDurationFormat + + + +
    +
    +
  • @@ -6117,7 +6217,7 @@ exports[`components > viewers > stop viewer should render times after midnight w className="next-trip-preview" >
  • - viewers > stop viewer should render times after midnight w } } > -
    - +
    - viewers > stop viewer should render times after midnight w } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render times after midnight w iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 12:51 AM - - - -
    - + + 12:51 AM + + + +
    +
    +
  • - viewers > stop viewer should render times after midnight w } } > -
    - +
    - viewers > stop viewer should render times after midnight w } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render times after midnight w iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 1:52 AM - - - -
    - + + 1:52 AM + + + +
    +
    +
  • - viewers > stop viewer should render times after midnight w } } > -
    - +
    - viewers > stop viewer should render times after midnight w } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render times after midnight w iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 2:53 AM - - - -
    - + + 2:53 AM + + + +
    +
    +
  • @@ -9736,7 +9911,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:00 PM - - - -
    - + + 6:00 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:15 PM - - - -
    - + + 6:15 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:31 PM - - - -
    - + + 6:31 PM + + + +
    +
    +
  • @@ -10334,7 +10584,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 2:28 PM - - - -
    - + + 2:28 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 3:02 PM - - - -
    - + + 3:02 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 3:12 PM - - - -
    - + + 3:12 PM + + + +
    +
    +
  • @@ -10882,7 +11207,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 3:22 PM - - - -
    - + + 3:22 PM + + + +
    +
    +
  • @@ -11162,7 +11512,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 4:11 PM - - - -
    - + + 4:11 PM + + + +
    +
    +
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.tuesday - - - - - - + common.daysOfWeek.tuesday + + + + + + - - 5:09 PM - - - -
    - + + 5:09 PM + + + +
    +
    +
  • @@ -11581,7 +11981,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 3:22 PM - - - -
    - + + 3:22 PM + + + +
    +
    +
  • @@ -11843,7 +12268,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index "timepoint": true, "tripId": "TriMet:9231858", } - } - > -
    + - - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.wednesday - - - - - - + common.daysOfWeek.wednesday + + + + + + - - 4:11 PM - - - -
    -
    + + 4:11 PM + + + + + +
  • @@ -12119,7 +12569,7 @@ exports[`components > viewers > stop viewer should render with OTP transit index className="next-trip-preview" >
  • - viewers > stop viewer should render with OTP transit index } } > -
    - +
    - viewers > stop viewer should render with OTP transit index } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with OTP transit index iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.thursday - - - - - - + common.daysOfWeek.thursday + + + + + + - - 3:22 PM - - - -
    - + + 3:22 PM + + + +
    +
    +
  • @@ -16471,7 +16946,7 @@ exports[`components > viewers > stop viewer should render with TriMet transit in className="next-trip-preview" >
  • - viewers > stop viewer should render with TriMet transit in } } > -
    - +
    - viewers > stop viewer should render with TriMet transit in } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with TriMet transit in iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 5:45 PM - - - -
    - + + 5:45 PM + + + +
    +
    +
  • - viewers > stop viewer should render with TriMet transit in } } > -
    - +
    - viewers > stop viewer should render with TriMet transit in } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with TriMet transit in iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:00 PM - - - -
    - + + 6:00 PM + + + +
    +
    +
  • - viewers > stop viewer should render with TriMet transit in } } > -
    - +
    - viewers > stop viewer should render with TriMet transit in } title="components.StopTimeCell.scheduled" > - - - + + viewers > stop viewer should render with TriMet transit in iconVerticalAlign="middle" iconViewBox="0 0 512 512" > - - - - - - - - - - + + + + + + + + + + - - common.daysOfWeek.monday - - - - - - + common.daysOfWeek.monday + + + + + + - - 6:15 PM - - - -
    - + + 6:15 PM + + + +
    +
    +
  • diff --git a/example-config.yml b/example-config.yml index c9e44cc86..58a221add 100644 --- a/example-config.yml +++ b/example-config.yml @@ -352,6 +352,8 @@ itinerary: # This flag disables the dot between legs in the metro itnerary summary, replacing it with # a gray background disableMetroSeperatorDot: false + # If enabled, always shows departures as times ("10pm" instead of "3 min") unless realtime data is present + onlyShowCountdownForRealtime: true # Show the number of minutes of delay or early beneath a time in the itinerary body showScheduleDeviation: true # Shows the duration of a leg below the leg in the metro itinerary summary diff --git a/lib/components/viewers/stop-time-cell.tsx b/lib/components/viewers/stop-time-cell.tsx index 27b63a649..d1867c3c2 100644 --- a/lib/components/viewers/stop-time-cell.tsx +++ b/lib/components/viewers/stop-time-cell.tsx @@ -1,13 +1,14 @@ import { Clock } from '@styled-icons/fa-regular/Clock' +import { connect } from 'react-redux' import { format, getTimezoneOffset, utcToZonedTime } from 'date-fns-tz' import { FormattedMessage, useIntl } from 'react-intl' import { Rss } from '@styled-icons/fa-solid/Rss' -import addDays from 'date-fns/addDays' import coreUtils from '@opentripplanner/core-utils' import isSameDay from 'date-fns/isSameDay' import React from 'react' import styled from 'styled-components' +import { AppReduxState } from '../../util/state-types' import { getSecondsUntilDeparture, getTripStatus } from '../../util/viewer' import { StyledIconWrapperTextAlign } from '../util/styledIcon' import FormattedDayOfWeek from '../util/formatted-day-of-week' @@ -15,10 +16,10 @@ import FormattedDuration from '../util/formatted-duration' import getRealtimeStatusLabel, { status } from '../util/get-realtime-status-label' +import InvisibleA11yLabel from '../util/invisible-a11y-label' import type { Time } from '../util/types' import DepartureTime from './departure-time' -import InvisibleA11yLabel from '../util/invisible-a11y-label' const { getUserTimezone } = coreUtils.time const ONE_HOUR_IN_SECONDS = 3600 @@ -31,6 +32,8 @@ const PulsingRss = styled(Rss)` type Props = { /** If configured, the timezone of the area */ homeTimezone?: string + /** Optionally hide countdown unless realtime data is present */ + onlyShowCountdownForRealtime?: boolean /** A stopTime object as received from a transit index API */ stopTime: Time } @@ -39,8 +42,10 @@ type Props = { * Renders a stop time as either schedule or countdown, with an optional status icon. * Stop time that apply to a different day have an additional text showing the day of departure. */ +// eslint-disable-next-line complexity const StopTimeCell = ({ homeTimezone = getUserTimezone(), + onlyShowCountdownForRealtime, stopTime }: Props): JSX.Element => { const intl = useIntl() @@ -109,7 +114,10 @@ const StopTimeCell = ({ status: getTripStatus(realtime, stopTime.departureDelay, 30) as status })} > - {showCountdown ? ( + {/* Not the cleanest boolean, but makes it very clear what we're doing + in all cases. */} + {(onlyShowCountdownForRealtime === true && realtime) || + (onlyShowCountdownForRealtime === false && showCountdown) ? ( // Show countdown string (e.g., 3 min or Due) isDue ? ( @@ -140,4 +148,13 @@ const StopTimeCell = ({ ) } -export default StopTimeCell +const mapStateToProps = (state: AppReduxState) => { + return { + onlyShowCountdownForRealtime: + state.otp.config?.itinerary?.onlyShowCountdownForRealtime || false + } +} + +const mapDispatchToProps = {} + +export default connect(mapStateToProps, mapDispatchToProps)(StopTimeCell) diff --git a/lib/util/config-types.ts b/lib/util/config-types.ts index ce848e9d9..33cb86756 100644 --- a/lib/util/config-types.ts +++ b/lib/util/config-types.ts @@ -239,6 +239,7 @@ export interface ItineraryConfig { groupTransitModes?: boolean hideSkeletons?: boolean mergeItineraries?: boolean + onlyShowCountdownForRealtime?: boolean renderRouteNamesInBlocks?: boolean showFirstResultByDefault?: boolean showHeaderText?: boolean