UNPKG

@kiwicom/smart-faq

Version:

Smart FAQ

82 lines (69 loc) 2.39 kB
// @flow import idx from 'idx'; import * as React from 'react'; import { withRouter } from 'react-router-dom'; import type { RouterHistory } from 'react-router-dom'; import type { onLogout } from '../../types'; import QueryRenderer from './QueryRenderer'; import type { Props as QueryRendererProps } from '../../shared/relay/QueryRenderer'; import GuaranteeNeededResolver from '../../shared/relay/GuaranteeNeededResolver'; import BookingAnalyticsTracker from './BookingAnalyticsTracker'; import { withLogout } from '../context/BookingState'; import { withKwAuthToken } from '../context/User'; import { ERROR_FORBIDDEN } from '../../shared/relay/environment'; type RenderState<RenderProps> = { props: ?RenderProps, error: ?Error, }; type ContextProps = { onLogout: onLogout, history: RouterHistory, }; const RendererWithKWToken = withKwAuthToken(QueryRenderer); class BookingRenderer<RenderProps> extends React.Component< ContextProps & QueryRendererProps<RenderProps>, > { // FIXME // $FlowExpectedError: Not sure how to type this now. renderBooking = (renderState: RenderState<RenderProps>) => { if (renderState.error) { if (renderState.error.message === ERROR_FORBIDDEN) { (async () => { await this.props.onLogout(); this.props.history.push({ pathname: '/', state: { sessionExpired: true }, }); })().catch(console.error); //eslint-disable-line no-console return this.props.render({ error: null, props: null }); } } const booking = // $FlowExpectedError: Expected idx(renderState.props, _ => _.singleBooking) || // $FlowExpectedError: Expected idx(renderState.props, _ => _.nearestBooking); return ( <React.Fragment> {renderState.props && ( <GuaranteeNeededResolver booking={booking} eventSource="smartFAQ" /> )} {renderState.props && booking && <BookingAnalyticsTracker booking={booking} />} {this.props.render(renderState)} </React.Fragment> ); }; render() { const { query, cacheConfig, variables } = this.props; return ( <RendererWithKWToken query={query} cacheConfig={cacheConfig} variables={variables} render={this.renderBooking} /> ); } } export default withRouter(withLogout(BookingRenderer));