From 3cd4fd26023010a93b120380272c7b6a638f635d Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Wed, 12 Jul 2017 22:56:17 -0400 Subject: [PATCH] Implement stackable modals --- src/features/modals/ModalManager.jsx | 18 ++++++++--------- src/features/modals/TestModal.jsx | 29 ++++++++++++++++++++++------ src/features/modals/modalReducer.js | 13 +++++++++---- src/features/tools/Tools/Tools.jsx | 2 +- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/features/modals/ModalManager.jsx b/src/features/modals/ModalManager.jsx index 2dfb6d0..4d92c20 100644 --- a/src/features/modals/ModalManager.jsx +++ b/src/features/modals/ModalManager.jsx @@ -7,24 +7,24 @@ const modalComponentLookupTable = { TestModal }; -const mapState = (state) => ({currentModal : state.modals}); +const mapState = (state) => ({currentModals : state.modals}); export class ModalManager extends Component { render() { - const {currentModal} = this.props; + const {currentModals} = this.props; - let renderedModal; - - if(currentModal) { - const {modalType, modalProps = {}} = currentModal; + const renderedModals = currentModals.map( (modalDescription, index) => { + const {modalType, modalProps = {}} = modalDescription; const ModalComponent = modalComponentLookupTable[modalType]; - renderedModal = ; - } + return ; + + }); + - return {renderedModal} + return {renderedModals} } } diff --git a/src/features/modals/TestModal.jsx b/src/features/modals/TestModal.jsx index c5de7dd..be5df7d 100644 --- a/src/features/modals/TestModal.jsx +++ b/src/features/modals/TestModal.jsx @@ -2,25 +2,42 @@ import React, {Component} from "react"; import {connect} from "react-redux"; import { Modal, + Button, } from "semantic-ui-react"; -import {closeModal} from "features/modals/modalActions"; +import {openModal, closeModal} from "features/modals/modalActions"; -const actions = {closeModal}; +const actions = {openModal, closeModal}; export class TestModal extends Component { + + onNextModalClick = () => { + const {counter} = this.props; + + this.props.openModal("TestModal", {counter : counter + 1}); + } + render() { + const {counter, closeModal} = this.props; return ( - Modal #1 + Modal #{counter} -

This is a modal dialog. Pretty neat, huh?

+

+ Value from props: +

+
+ counter = {counter} +
+
+ +
@@ -31,4 +48,4 @@ export class TestModal extends Component { } -export default connect(null, actions)(TestModal); \ No newline at end of file +export default connect(null, actions)(TestModal); diff --git a/src/features/modals/modalReducer.js b/src/features/modals/modalReducer.js index f568482..824ef6d 100644 --- a/src/features/modals/modalReducer.js +++ b/src/features/modals/modalReducer.js @@ -6,19 +6,24 @@ import { import {createReducer} from "common/utils/reducerUtils"; -const initialState = null; +const initialState = []; + export function openModal(state, payload) { const {modalType, modalProps} = payload; - return {modalType, modalProps}; + // Always pushing a new modal onto the stack + return state.concat({modalType, modalProps}); } export function closeModal(state, payload) { - return null; + // Always popping the last modal off the stack + const newState = state.slice(); + newState.pop(); + return newState; } export default createReducer(initialState, { [MODAL_OPEN] : openModal, [MODAL_CLOSE] : closeModal -}); \ No newline at end of file +}); diff --git a/src/features/tools/Tools/Tools.jsx b/src/features/tools/Tools/Tools.jsx index d83680e..fbf0dcb 100644 --- a/src/features/tools/Tools/Tools.jsx +++ b/src/features/tools/Tools/Tools.jsx @@ -13,7 +13,7 @@ const actions = {loadUnitData, openModal}; class Tools extends Component { onOpenModalClicked = () => { - this.props.openModal("TestModal", {a : 42}); + this.props.openModal("TestModal", {counter : 1}); } render() {