UNPKG

@kiwicom/smart-faq

Version:

85 lines (69 loc) 2.01 kB
// @flow import * as React from 'react'; type Props = {| bid: ?number, children: React.Node, |}; type StateValues = { selectedBooking: ?number, bookingPage: 'SINGLE_BOOKING' | 'ALL_BOOKINGS', userSelectedBooking: boolean, }; type StateCallbacks = { closeAllBooking: () => void, onDisplayAll: () => void, onSelectBooking: (id: number) => void, }; export type State = StateValues & StateCallbacks; const initialState = { userSelectedBooking: false, bookingPage: 'SINGLE_BOOKING', }; export const SelectedBooking: React.Context<State> = React.createContext({ ...initialState, selectedBooking: null, closeAllBooking: () => {}, onDisplayAll: () => {}, // eslint-disable-next-line no-unused-vars onSelectBooking: (id: number) => {}, }); class SelectedBookingProvider extends React.Component<Props, State> { static getDerivedStateFromProps(props: Props, state: State) { // when user specifically selected one booking, don't change his settings by this return state.userSelectedBooking ? null : { selectedBooking: props.bid }; } constructor(props: Props) { super(props); this.state = { ...initialState, selectedBooking: props.bid, onSelectBooking: this.onClickSelect, closeAllBooking: this.closeAllBooking, onDisplayAll: this.onClickAllBooking, }; } onClickSelect = (id: number) => { this.setState({ bookingPage: 'SINGLE_BOOKING', selectedBooking: id, userSelectedBooking: true, }); const Body = document.querySelector('#SmartFAQ_Body'); if (!Body) return; Body.dispatchEvent(new Event('scroll')); }; closeAllBooking = () => { this.setState({ bookingPage: 'SINGLE_BOOKING' }); }; onClickAllBooking = () => { this.setState({ bookingPage: 'ALL_BOOKINGS' }); }; render() { return ( <SelectedBooking.Provider value={this.state}> {this.props.children} </SelectedBooking.Provider> ); } } export default SelectedBookingProvider;