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