1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import { connect } from 'react-redux';
7 import { DialogState } from './dialog-reducer';
8 import { Dispatch } from 'redux';
9 import { dialogActions } from './dialog-actions';
11 export type WithDialog<T> = {
16 export type WithDialogActions = {
17 closeDialog: () => void;
20 export const withDialog = (id: string) =>
21 <T>(component: React.ComponentType<WithDialog<T> & WithDialogActions>) =>
22 connect(mapStateToProps(id), mapDispatchToProps(id))(component);
24 export const mapStateToProps = (id: string) => <T>(state: { dialog: DialogState }): WithDialog<T> => {
25 const dialog = state.dialog[id];
26 return dialog ? dialog : { open: false };
29 export const mapDispatchToProps = (id: string) => (dispatch: Dispatch): WithDialogActions => ({
31 dispatch(dialogActions.CLOSE_DIALOG({ id }));