Add emitter so I can now send events to the RN core

This commit is contained in:
Artur Gurgul 2025-08-02 15:19:12 +02:00
parent 4e4a92c2a3
commit 7177b9e927
7 changed files with 111 additions and 14 deletions

35
App.tsx
View file

@ -1,19 +1,30 @@
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
*/
import { NewAppScreen } from '@react-native/new-app-screen'
import { useEffect, useState } from 'react'
import { StatusBar, Text, StyleSheet, useColorScheme, View } from 'react-native'
import { NativeEventEmitter, NativeModules } from 'react-native'
const { Emitter } = NativeModules;
import { NewAppScreen } from '@react-native/new-app-screen';
import { StatusBar, StyleSheet, useColorScheme, View } from 'react-native';
export default function App() {
const isDarkMode = useColorScheme() === 'dark'
const [message, setMessage] = useState(null)
useEffect(() => {
const emitter = new NativeEventEmitter(Emitter);
const subscription = emitter.addListener('onMessage', (event) => {
if (event?.message) {
setMessage(event.message)
}
})
function App() {
const isDarkMode = useColorScheme() === 'dark';
return () => {
subscription.remove()
};
}, [])
return (
<View style={styles.container}>
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
<Text>{message ?? 'Waiting for message...'}</Text>
<NewAppScreen templateFileName="App.tsx" />
</View>
);
@ -23,6 +34,4 @@ const styles = StyleSheet.create({
container: {
flex: 1,
},
});
export default App;
})

View file

@ -15,10 +15,11 @@ struct RootView: View {
var body: some View {
VStack {
Text("Hello to SwiftUI!")
ToolboxHeader()
if let reactNativeFactory = sharedState.reactNativeFactory {
UIReactNativeView(reactNativeFactory)
}
}
.environmentObject(sharedState)
}
}

View file

@ -0,0 +1,32 @@
//
// Emitter.swift
// RNPlayground
//
// Created by Artur Gurgul on 02/08/2025.
//
import Combine
import React
//import React_RCTAppDelegate
//import ReactAppDependencyProvider
@objc(Emitter)
class Emitter: RCTEventEmitter {
override static func requiresMainQueueSetup() -> Bool {
return true
}
override init() {
super.init()
EventEmitter.sharedInstance.register(eventEmitter: self)
}
override func supportedEvents() -> [String]! {
return ["onMessage"]
}
@objc func send(message: String) {
sendEvent(withName: "onMessage", body: ["message": message])
}
}

View file

@ -0,0 +1,28 @@
//
// EventEmitter.swift
// RNPlayground
//
// Created by Artur Gurgul on 02/08/2025.
//
import Foundation
class EventEmitter {
static let sharedInstance = EventEmitter()
private var eventEmitter: Emitter?
private init() {}
func register(eventEmitter: Emitter) {
self.eventEmitter = eventEmitter
}
func send(message: String) {
eventEmitter?.send(message: message)
}
var isReady: Bool {
return eventEmitter != nil
}
}

View file

@ -13,4 +13,9 @@ import ReactAppDependencyProvider
final class SharedState: ObservableObject {
var reactNativeFactory: RCTReactNativeFactory?
private let emitter = EventEmitter.sharedInstance
func send(message: String) {
emitter.send(message: message)
}
}

View file

@ -0,0 +1,22 @@
//
// ToolboxHeader.swift
// RNPlayground
//
// Created by Artur Gurgul on 02/08/2025.
//
import SwiftUI
struct ToolboxHeader: View {
@EnvironmentObject var sharedState: SharedState
var body: some View {
HStack {
Text("Actions")
Button("Make it blue") {
print("Making it blue")
sharedState.send(message: "hello from Swift!")
}
}
}
}