mirror of
https://github.com/HSLdevcom/digitransit-ui
synced 2025-07-27 23:35:15 +02:00
101 lines
2.6 KiB
JavaScript
101 lines
2.6 KiB
JavaScript
import Button from '@hsl-fi/button';
|
|
import PropTypes from 'prop-types';
|
|
import React, { useEffect, useRef, useState } from 'react';
|
|
import { FormattedMessage, intlShape } from 'react-intl';
|
|
import { addAnalyticsEvent } from '../../../util/analyticsUtils';
|
|
import { configShape } from '../../../util/shapes';
|
|
import Icon from '../../Icon';
|
|
import { useLogo } from './hooks/useLogo';
|
|
|
|
const NaviStarter = (
|
|
{ time, startItinerary, containerTopPosition, isPastStart },
|
|
{ config, intl },
|
|
) => {
|
|
const { logo } = useLogo(config.trafficLightGraphic);
|
|
const [isVisible, setIsVisible] = useState(!isPastStart);
|
|
const [isDismissed, setIsDismissed] = useState(false);
|
|
|
|
const initializerCardRef = useRef(null);
|
|
|
|
useEffect(() => {
|
|
if (initializerCardRef.current) {
|
|
initializerCardRef.current.focus();
|
|
}
|
|
setIsDismissed(isPastStart);
|
|
}, [isPastStart]);
|
|
|
|
const handleClick = () => {
|
|
addAnalyticsEvent({
|
|
category: 'Itinerary',
|
|
event: 'navigator',
|
|
action: 'start_navigation_manual',
|
|
});
|
|
setIsDismissed(true);
|
|
};
|
|
|
|
const handleAnimationEnd = () => {
|
|
setIsVisible(false);
|
|
startItinerary(Date.now());
|
|
};
|
|
|
|
if (!isVisible) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className={`navi-initializer-container ${isDismissed && 'slide-out'}`}
|
|
onAnimationEnd={handleAnimationEnd}
|
|
style={{ top: containerTopPosition }}
|
|
>
|
|
<div
|
|
className="navi-initializer-card"
|
|
aria-live="polite"
|
|
role="status"
|
|
ref={initializerCardRef}
|
|
tabIndex="-1"
|
|
>
|
|
{logo ? (
|
|
<img src={logo} aria-hidden="true" alt="navigator logo" />
|
|
) : (
|
|
<Icon
|
|
aria-hidden="true"
|
|
img="icon-icon_navigation_wait"
|
|
className="mode"
|
|
height={2}
|
|
width={2}
|
|
/>
|
|
)}
|
|
<FormattedMessage id="navigation-journey-start" />
|
|
<h3>{time}</h3>
|
|
</div>
|
|
<div className="navi-initializer-card success">
|
|
<FormattedMessage id="navigation-journey-start-early-prompt" />
|
|
<Button
|
|
size="small"
|
|
value={intl.formatMessage({ id: 'navigation-intro-begin' })}
|
|
onClick={handleClick}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
NaviStarter.propTypes = {
|
|
time: PropTypes.string.isRequired,
|
|
startItinerary: PropTypes.func.isRequired,
|
|
containerTopPosition: PropTypes.number,
|
|
isPastStart: PropTypes.bool,
|
|
};
|
|
|
|
NaviStarter.defaultProps = {
|
|
containerTopPosition: 0,
|
|
isPastStart: true,
|
|
};
|
|
|
|
NaviStarter.contextTypes = {
|
|
intl: intlShape.isRequired,
|
|
config: configShape.isRequired,
|
|
};
|
|
|
|
export default NaviStarter;
|