UNPKG

@kiwicom/smart-faq

Version:

125 lines (102 loc) 2.88 kB
// @flow import * as React from 'react'; import type { onLogout } from '../../types'; export type FAQSectionType = | 'BEFORE_BOOKING' | 'UPCOMING_BOOKING' | 'URGENT_BOOKING' | 'PAST_BOOKING'; type Props = { children: React.Node, showBooking: boolean, isPastBooking?: boolean, isUrgent?: boolean, onLogout: onLogout, }; type StateValues = { FAQSection: ?FAQSectionType, showBooking: boolean, }; type StateCallbacks = { onSetFAQSection: (isUrgent: boolean, isPastBooking: boolean) => void, onLogout: onLogout, }; type BookingStateDescription = { hasBooking: boolean, isPastBooking?: boolean, isUrgent?: boolean, }; export type State = StateValues & StateCallbacks; export const getFAQSection = ({ hasBooking, isPastBooking, isUrgent, }: BookingStateDescription) => { if (!hasBooking) return 'BEFORE_BOOKING'; if (isPastBooking) return 'PAST_BOOKING'; if (isUrgent) return 'URGENT_BOOKING'; return 'UPCOMING_BOOKING'; }; const initialState = { FAQSection: 'BEFORE_BOOKING', selectedBooking: null, showBooking: true, }; export const BookingState: React.Context<State> = React.createContext({ ...initialState, // eslint-disable-next-line no-unused-vars onSetFAQSection: (isUrgent: boolean, isPastBooking: boolean) => {}, onLogout: () => Promise.resolve(null), }); class BookingStateProvider extends React.Component<Props, State> { static getDerivedStateFromProps(nextProps: Props, state: State) { if (nextProps.showBooking !== state.showBooking) { return { showBooking: nextProps.showBooking }; } return null; } constructor(props: Props) { super(props); this.state = { ...initialState, showBooking: props.showBooking, onSetFAQSection: this.onSetFAQSection, FAQSection: getFAQSection({ hasBooking: false }), onLogout: this.onLogout, }; } onLogout = async () => { await this.props.onLogout(); this.setState({ FAQSection: 'BEFORE_BOOKING' }); }; onSetFAQSection = (isUrgent: boolean, isPastBooking: boolean) => { const section = getFAQSection({ isUrgent, isPastBooking, hasBooking: true, }); // eslint-disable-next-line consistent-return this.setState(({ FAQSection }) => { if (FAQSection !== section) { return { FAQSection: section }; } }); }; render() { return ( <BookingState.Provider value={this.state}> {this.props.children} </BookingState.Provider> ); } } /* @deprecated - use Context directly */ export const withLogout = <Props>(Component: React.ComponentType<{} & Props>) => function withLogoutHOC(props: Props) { return ( <BookingState.Consumer> {({ onLogout }: State) => <Component {...props} onLogout={onLogout} />} </BookingState.Consumer> ); }; export default BookingStateProvider;