How present view over any view in swiftui

Viewed 42

I'm implementing a chat application and I have an incoming call so I have presented an incoming call screen when user Accept I have implemented by the notification center

public extension Notification.Name {
static let incomingCallView = Notification.Name("incomingCallView")
}

struct ModalData {
let onDismiss: (() -> Void)?
let content: (Binding<Bool>) -> AnyView

init<Content: View>(onDismiss: (() -> Void)? = nil,
                    @ViewBuilder content: @escaping (Binding<Bool>) -> Content) {
    self.onDismiss = onDismiss
    self.content = { AnyView(content($0)) }
}

static let empty = ModalData { _ in EmptyView() }
}

and this in provider delegate

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
  guard let call = callManager.callWithUUID(uuid: action.callUUID) else {
    action.fail()
    return
  }
    
    callOption.ringingPeriod?.invalidate()
    callOption.ringingPeriod = nil
    socket.inizalizeWebrtc(webRTCClient: WebRTCClient(iceServers: Config.default.webRTCIceServers))
    socket.webRTCClient?.offer {(sdp) in
       // self.hasLocalSdp = true
    self.socket.sendSdp(sdp: sdp, type: "offer", callType: self.callOption.callType == .videoCall
                            ? "video"
                            : "audio"
        )
     
    }
 
    
    call.answer()

   NotificationCenter.default.post(name: .incomingCallView,
                                   object: ModalData(onDismiss: {

    }) { isPresented in

            IncomingCallScreen(callScreenIsPresented: isPresented)
        
       })


  action.fulfill()
}

the problem that I have to add .onReceive in all views to open the incoming call screen if I didn't add .onrecieve it will not present

.onReceive(NotificationCenter.default.publisher(for: .incomingCallView)) { notif in
              if let data = notif.object as? ModalData {
                modalData = data
                incomingCallView = true
              }
            }
            .fullScreenCover(isPresented: $incomingCallView,
                             onDismiss: modalData.onDismiss) {
              modalData.content($incomingCallView)
            }

How open it without adding .onReceive in all views is there another solution

0 Answers
Related