@kiwicom/smart-faq
Version:
Smart FAQ
82 lines (69 loc) • 2.39 kB
JavaScript
// @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));