@kiwicom/smart-faq
Version:
125 lines (102 loc) • 2.88 kB
JavaScript
// @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;