// Copyright 2021 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import SwiftUI import FirebaseInAppMessaging import FirebaseInAppMessagingSwift struct ModalInAppMessageView: View { var modalMessage: InAppMessagingModalDisplay var delegate: InAppMessagingDisplayDelegate var body: some View { VStack { if let imageData = modalMessage.imageData?.imageRawData, let image = UIImage(data: imageData) { Image(uiImage: image) } Text(modalMessage.title).padding(4) if let bodyText = modalMessage.bodyText { Text(bodyText).padding(4) } actionButton(modalMessage: modalMessage, delegate: delegate).padding(4) dismissButton(modalMessage: modalMessage, delegate: delegate).padding(4) } .background(Color.white) .border(Color.black) .cornerRadius(4) } @ViewBuilder func actionButton(modalMessage: InAppMessagingModalDisplay, delegate: InAppMessagingDisplayDelegate) -> some View { if let button = modalMessage.actionButton { Button(action: { if let actionURL = modalMessage.actionURL { let action = InAppMessagingAction(actionText: button.buttonText, actionURL: actionURL) delegate.messageClicked?(modalMessage, with: action) } else { delegate.messageDismissed?(modalMessage, dismissType: .typeUserTapClose) } }) { Text(button.buttonText).bold() } } EmptyView() } // Need a dismiss button for the case where there's an action button with an action URL. Otherwise // user would be forced into a clickthrough. @ViewBuilder func dismissButton(modalMessage: InAppMessagingModalDisplay, delegate: InAppMessagingDisplayDelegate) -> some View { if let _ = modalMessage.actionButton, modalMessage.actionURL != nil { Button(action: { delegate.messageDismissed?(modalMessage, dismissType: .typeUserTapClose) }) { Text("Dismiss").bold() } } EmptyView() } struct ModalInAppMessageView_Previews: PreviewProvider { static var previews: some View { let modalMessage = InAppMessagingPreviewHelpers.modalMessage() return ModalInAppMessageView(modalMessage: modalMessage, delegate: InAppMessagingPreviewHelpers.Delegate()) } } }