Skip to content

Commit c422e40

Browse files
jakmroa-szymanska
authored andcommitted
feat: use react-native-audio-api in llm voice chat (#592)
## Description Changes: - use react-native-audio-api in llm voice chat example app - add audio recording permission ### Introduces a breaking change? - [ ] Yes - [x] No ### Type of change - [x] Bug fix (change which fixes an issue) - [ ] New feature (change which adds functionality) - [ ] Documentation update (improves or adds clarity to existing documentation) - [ ] Other (chores, tests, code style improvements etc.) ### Tested on - [x] iOS - [x] Android ### Checklist - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have updated the documentation accordingly - [x] My changes generate no new warnings
1 parent 9e9969c commit c422e40

File tree

11 files changed

+157
-168
lines changed

11 files changed

+157
-168
lines changed

apps/llm/android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<uses-permission android:name="android.permission.WRITE_CALENDAR"/>
88
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
99
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
10+
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
1011
<queries>
1112
<intent>
1213
<action android:name="android.intent.action.VIEW"/>

apps/llm/app.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,22 @@
2323
"calendarPermission": "The app needs to access your calendar."
2424
}
2525
],
26-
"expo-router"
26+
"expo-router",
27+
[
28+
"react-native-audio-api",
29+
{
30+
"iosBackgroundMode": true,
31+
"iosMicrophonePermission": "This app requires access to the microphone to record audio.",
32+
"androidPermissions": [
33+
"android.permission.MODIFY_AUDIO_SETTINGS",
34+
"android.permission.FOREGROUND_SERVICE",
35+
"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK",
36+
"android.permission.RECORD_AUDIO"
37+
],
38+
"androidForegroundService": true,
39+
"androidFSTypes": ["mediaPlayback"]
40+
}
41+
]
2742
],
2843
"newArchEnabled": true,
2944
"splash": {

apps/llm/app/voice_chat/index.tsx

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,10 @@ import MicIcon from '../../assets/icons/mic_icon.svg';
2222
import StopIcon from '../../assets/icons/stop_icon.svg';
2323
import ColorPalette from '../../colors';
2424
import Messages from '../../components/Messages';
25-
import LiveAudioStream from 'react-native-live-audio-stream';
25+
import { AudioManager, AudioRecorder } from 'react-native-audio-api';
2626
import DeviceInfo from 'react-native-device-info';
27-
import { Buffer } from 'buffer';
2827
import { useIsFocused } from '@react-navigation/native';
2928
import { GeneratingContext } from '../../context';
30-
const audioStreamOptions = {
31-
sampleRate: 16000,
32-
channels: 1,
33-
bitsPerSample: 16,
34-
audioSource: 1,
35-
bufferSize: 16000,
36-
};
37-
38-
const startStreamingAudio = (options: any, onChunk: (data: string) => void) => {
39-
LiveAudioStream.init(options);
40-
LiveAudioStream.on('data', onChunk);
41-
LiveAudioStream.start();
42-
};
43-
44-
const float32ArrayFromPCMBinaryBuffer = (b64EncodedBuffer: string) => {
45-
const b64DecodedChunk = Buffer.from(b64EncodedBuffer, 'base64');
46-
const int16Array = new Int16Array(b64DecodedChunk.buffer);
47-
48-
const float32Array = new Float32Array(int16Array.length);
49-
for (let i = 0; i < int16Array.length; i++) {
50-
float32Array[i] = Math.max(
51-
-1,
52-
Math.min(1, (int16Array[i] / audioStreamOptions.bufferSize) * 8)
53-
);
54-
}
55-
return float32Array;
56-
};
5729

5830
export default function VoiceChatScreenWrapper() {
5931
const isFocused = useIsFocused();
@@ -63,6 +35,13 @@ export default function VoiceChatScreenWrapper() {
6335

6436
function VoiceChatScreen() {
6537
const [isRecording, setIsRecording] = useState(false);
38+
const [recorder] = useState(
39+
() =>
40+
new AudioRecorder({
41+
sampleRate: 16000,
42+
bufferLengthInSamples: 1600,
43+
})
44+
);
6645
const messageRecorded = useRef<boolean>(false);
6746
const { setGlobalGenerating } = useContext(GeneratingContext);
6847

@@ -75,20 +54,27 @@ function VoiceChatScreen() {
7554
setGlobalGenerating(llm.isGenerating || speechToText.isGenerating);
7655
}, [llm.isGenerating, speechToText.isGenerating, setGlobalGenerating]);
7756

78-
const onChunk = (data: string) => {
79-
const float32Chunk = float32ArrayFromPCMBinaryBuffer(data);
80-
speechToText.streamInsert(float32Chunk);
81-
};
57+
useEffect(() => {
58+
AudioManager.setAudioSessionOptions({
59+
iosCategory: 'playAndRecord',
60+
iosMode: 'spokenAudio',
61+
iosOptions: ['allowBluetooth', 'defaultToSpeaker'],
62+
});
63+
AudioManager.requestRecordingPermissions();
64+
}, []);
8265

8366
const handleRecordPress = async () => {
8467
if (isRecording) {
8568
setIsRecording(false);
86-
LiveAudioStream.stop();
69+
recorder.stop();
8770
messageRecorded.current = true;
88-
speechToText.streamStop();
71+
await speechToText.streamStop();
8972
} else {
9073
setIsRecording(true);
91-
startStreamingAudio(audioStreamOptions, onChunk);
74+
recorder.onAudioReady(async ({ buffer }) => {
75+
await speechToText.streamInsert(buffer.getChannelData(0));
76+
});
77+
recorder.start();
9278
const transcription = await speechToText.stream();
9379
await llm.sendMessage(transcription);
9480
}

apps/llm/ios/Podfile.lock

Lines changed: 75 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,7 +1403,7 @@ PODS:
14031403
- React-jsiexecutor
14041404
- React-RCTFBReactNativeSpec
14051405
- ReactCommon/turbomodule/core
1406-
- react-native-executorch (0.4.2):
1406+
- react-native-executorch (0.5.0):
14071407
- DoubleConversion
14081408
- glog
14091409
- hermes-engine
@@ -1826,7 +1826,7 @@ PODS:
18261826
- React-logger (= 0.79.2)
18271827
- React-perflogger (= 0.79.2)
18281828
- React-utils (= 0.79.2)
1829-
- RNAudioAPI (0.5.7):
1829+
- RNAudioAPI (0.8.2):
18301830
- DoubleConversion
18311831
- glog
18321832
- hermes-engine
@@ -1849,9 +1849,9 @@ PODS:
18491849
- ReactCodegen
18501850
- ReactCommon/turbomodule/bridging
18511851
- ReactCommon/turbomodule/core
1852-
- RNAudioAPI/audioapi (= 0.5.7)
1852+
- RNAudioAPI/audioapi (= 0.8.2)
18531853
- Yoga
1854-
- RNAudioAPI/audioapi (0.5.7):
1854+
- RNAudioAPI/audioapi (0.8.2):
18551855
- DoubleConversion
18561856
- glog
18571857
- hermes-engine
@@ -1874,9 +1874,9 @@ PODS:
18741874
- ReactCodegen
18751875
- ReactCommon/turbomodule/bridging
18761876
- ReactCommon/turbomodule/core
1877-
- RNAudioAPI/audioapi/ios (= 0.5.7)
1877+
- RNAudioAPI/audioapi/ios (= 0.8.2)
18781878
- Yoga
1879-
- RNAudioAPI/audioapi/ios (0.5.7):
1879+
- RNAudioAPI/audioapi/ios (0.8.2):
18801880
- DoubleConversion
18811881
- glog
18821882
- hermes-engine
@@ -1926,8 +1926,6 @@ PODS:
19261926
- ReactCommon/turbomodule/bridging
19271927
- ReactCommon/turbomodule/core
19281928
- Yoga
1929-
- RNLiveAudioStream (1.1.1):
1930-
- React
19311929
- RNReanimated (3.17.5):
19321930
- DoubleConversion
19331931
- glog
@@ -2246,7 +2244,6 @@ DEPENDENCIES:
22462244
- RNAudioAPI (from `../../../node_modules/react-native-audio-api`)
22472245
- RNDeviceInfo (from `../../../node_modules/react-native-device-info`)
22482246
- RNGestureHandler (from `../../../node_modules/react-native-gesture-handler`)
2249-
- RNLiveAudioStream (from `../../../node_modules/react-native-live-audio-stream`)
22502247
- RNReanimated (from `../../../node_modules/react-native-reanimated`)
22512248
- RNScreens (from `../../../node_modules/react-native-screens`)
22522249
- RNSVG (from `../../../node_modules/react-native-svg`)
@@ -2430,8 +2427,6 @@ EXTERNAL SOURCES:
24302427
:path: "../../../node_modules/react-native-device-info"
24312428
RNGestureHandler:
24322429
:path: "../../../node_modules/react-native-gesture-handler"
2433-
RNLiveAudioStream:
2434-
:path: "../../../node_modules/react-native-live-audio-stream"
24352430
RNReanimated:
24362431
:path: "../../../node_modules/react-native-reanimated"
24372432
RNScreens:
@@ -2444,97 +2439,96 @@ EXTERNAL SOURCES:
24442439
SPEC CHECKSUMS:
24452440
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
24462441
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
2447-
EXConstants: be238322d57d084dc055dbd5d6fe6479510504ce
2448-
Expo: 77b39f42396989cbe6fbef9f6fafc9b35186a95b
2449-
ExpoAsset: 3ea3275cca6a7793b3d36fbf1075c590f803fbcb
2450-
ExpoBrightness: 05e750736f8886dcf235212b0caf85b0f605fc88
2451-
ExpoCalendar: 660542dc1c5ef98f46bedcc8745aa707df5d501a
2452-
ExpoFileSystem: 3a98ca2a6f13674ecfd97327d1b44a8ace444cbd
2453-
ExpoFont: 312c73403bbd4f98e1d6a5330641a56292583cd2
2454-
ExpoHead: 5df88545652c2d3a3ea50bcd7f6be6ca935ac997
2455-
ExpoKeepAwake: e8dedc115d9f6f24b153ccd2d1d8efcdfd68a527
2456-
ExpoLinking: 5d151d4a497d7e375308602f0a89b4e8acf7b5f8
2457-
ExpoModulesCore: e2e363bcdee87b46f858586d1887ebb215582001
2442+
EXConstants: 9f310f44bfedba09087042756802040e464323c0
2443+
Expo: 4e8bda07d30b024b1732f87843a5349a3ecc1316
2444+
ExpoAsset: 3bc9adb7dbbf27ae82c18ca97eb988a3ae7e73b1
2445+
ExpoBrightness: c335c6ccc082d5249a4b38dba5cd9a08aa0bf62b
2446+
ExpoCalendar: f5f94ea8dcd957b1434beb4e1c0da1af063322e6
2447+
ExpoFileSystem: c36eb8155eb2381c83dda7dc210e3eec332368b6
2448+
ExpoFont: abbb91a911eb961652c2b0a22eef801860425ed6
2449+
ExpoHead: af044f3e9c99e7d8d21bf653b4c2f2ef53a7f082
2450+
ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7
2451+
ExpoLinking: b85ff4eafeae6fc638c6cace60007ae521af0ef4
2452+
ExpoModulesCore: d431ffe83c8673d02cb38425594a5f5480fd3061
24582453
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
24592454
FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975
24602455
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
24612456
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
24622457
hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe
24632458
opencv-rne: 2305807573b6e29c8c87e3416ab096d09047a7a0
2464-
RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809
2459+
RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82
24652460
RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c
24662461
RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e
24672462
RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93
24682463
React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c
24692464
React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d
2470-
React-Core: 7150cf9b6a5af063b37003062689f1691e79c020
2471-
React-CoreModules: 15a85e6665d61678942da6ae485b351f4c699049
2472-
React-cxxreact: 74f9de59259ac951923f5726aa14f0398f167af9
2465+
React-Core: 10597593fdbae06f0089881e025a172e51d4a769
2466+
React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2
2467+
React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6
24732468
React-debug: e74e76912b91e08d580c481c34881899ccf63da9
2474-
React-defaultsnativemodule: 628285212bbd65417d40ad6a9f8781830fda6c98
2475-
React-domnativemodule: 185d9808198405c176784aaf33403d713bd24fb7
2476-
React-Fabric: c814804affbe1952e16149ddd20256e1bccae67e
2477-
React-FabricComponents: 81ef47d596966121784afec9924f9562a29b1691
2478-
React-FabricImage: f14f371d678aa557101def954ac3ba27e48948ff
2469+
React-defaultsnativemodule: 11f6ee2cf69bf3af9d0f28a6253def33d21b5266
2470+
React-domnativemodule: f940bbc4fa9e134190acbf3a4a9f95621b5a8f51
2471+
React-Fabric: 6f5c357bf3a42ff11f8844ad3fc7a1eb04f4b9de
2472+
React-FabricComponents: 10e0c0209822ac9e69412913a8af1ca33573379b
2473+
React-FabricImage: f582e764072dfa4715ae8c42979a5bace9cbcc12
24792474
React-featureflags: d5facceff8f8f6de430e0acecf4979a9a0839ba9
2480-
React-featureflagsnativemodule: 96f0ab285382d95c90f663e02526a5ceefa95a11
2481-
React-graphics: 1a66ee0a3f093b125b853f6370296fadcaf6f233
2482-
React-hermes: 8b86e5f54a65ecb69cdf22b3a00a11562eda82d2
2483-
React-idlecallbacksnativemodule: 5c25ab145c602264d00cb26a397ab52e0efa031c
2484-
React-ImageManager: 15e34bd5ef1ac4a18e96660817ef70a7f99ee8c2
2485-
React-jserrorhandler: 02cdf2cd45350108be1ffd2b164578936dbbdff7
2486-
React-jsi: 6af1987cfbb1b6621664fdbf6c7b62bd4d38c923
2487-
React-jsiexecutor: 51f372998e0303585cb0317232b938d694663cbd
2488-
React-jsinspector: 3539ad976d073bfaa8a7d2fa9bef35e70e55033e
2489-
React-jsinspectortracing: e8dbacaf67c201f23052ca1c2bae2f7b84dec443
2490-
React-jsitooling: 95a34f41e3c249d42181de13b4f8d854f178ca9f
2491-
React-jsitracing: 25b029cf5cad488252d46da19dd8c4c134fd5fe4
2492-
React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3
2493-
React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec
2494-
React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34
2495-
react-native-executorch: 66ffc33df70ec85bc591f9ee34c862835966ead3
2496-
react-native-safe-area-context: 00d03dc688ba86664be66f9e3f203fc7d747d899
2497-
React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf
2475+
React-featureflagsnativemodule: a7dd141f1ef4b7c1331af0035689fbc742a49ff4
2476+
React-graphics: 36ae3407172c1c77cea29265d2b12b90aaef6aa0
2477+
React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12
2478+
React-idlecallbacksnativemodule: ae7f5ffc6cf2d2058b007b78248e5b08172ad5c3
2479+
React-ImageManager: 9daee0dc99ad6a001d4b9e691fbf37107e2b7b54
2480+
React-jserrorhandler: 1e6211581071edaf4ecd5303147328120c73f4dc
2481+
React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6
2482+
React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9
2483+
React-jsinspector: cfd27107f6d6f1076a57d88c932401251560fe5f
2484+
React-jsinspectortracing: 76a7d791f3c0c09a0d2bf6f46dfb0e79a4fcc0ac
2485+
React-jsitooling: 995e826570dd58f802251490486ebd3244a037ab
2486+
React-jsitracing: 094ae3d8c123cea67b50211c945b7c0443d3e97b
2487+
React-logger: 8edfcedc100544791cd82692ca5a574240a16219
2488+
React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468
2489+
React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6
2490+
react-native-executorch: 3c871f7ed2e2b0ff92519ce38f06f0904784dbdb
2491+
react-native-safe-area-context: 562163222d999b79a51577eda2ea8ad2c32b4d06
2492+
React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e
24982493
React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c
2499-
React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0
2500-
React-performancetimeline: abf31259d794c9274b3ea19c5016186925eec6c4
2494+
React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d
2495+
React-performancetimeline: 5b0dfc0acba29ea0269ddb34cd6dd59d3b8a1c66
25012496
React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3
2502-
React-RCTAnimation: 2595dcb10a82216a511b54742f8c28d793852ac6
2503-
React-RCTAppDelegate: f03604b70f57c9469a84a159d8abecf793a5bcff
2504-
React-RCTBlob: e00f9b4e2f151938f4d9864cf33ebf24ac03328a
2505-
React-RCTFabric: 3945d116fd271598db262d4e6ed5691d431ed9e8
2506-
React-RCTFBReactNativeSpec: 0f4d4f0da938101f2ca9d5333a8f46e527ad2819
2507-
React-RCTImage: dac5e9f8ec476aefe6e60ee640ebc1dfaf1a4dbe
2508-
React-RCTLinking: 494b785a40d952a1dfbe712f43214376e5f0e408
2509-
React-RCTNetwork: b3d7c30cd21793e268db107dd0980cb61b3c1c44
2510-
React-RCTRuntime: a8ff419d437228e7b8a793b14f9d711e1cbb82af
2511-
React-RCTSettings: a060c7e381a3896104761b8eed7e284d95e37df3
2512-
React-RCTText: 4f272b72dbb61f390d8c8274528f9fdbff983806
2513-
React-RCTVibration: 0e5326220719aca12473d703aa46693e3b4ce67a
2497+
React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576
2498+
React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b
2499+
React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1
2500+
React-RCTFabric: 58590aa4fdb4ad546c06a7449b486cf6844e991f
2501+
React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338
2502+
React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29
2503+
React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360
2504+
React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170
2505+
React-RCTRuntime: 5ab904fd749aa52f267ef771d265612582a17880
2506+
React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7
2507+
React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e
2508+
React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343
25142509
React-rendererconsistency: 351fdbc5c1fe4da24243d939094a80f0e149c7a1
2515-
React-renderercss: d333f2ada83969591100d91ec6b23ca2e17e1507
2516-
React-rendererdebug: 039e5949b72ba63c703de020701e3fd152434c61
2510+
React-renderercss: 3438814bee838ae7840a633ab085ac81699fd5cf
2511+
React-rendererdebug: 0ac2b9419ad6f88444f066d4b476180af311fb1e
25172512
React-rncore: 57ed480649bb678d8bdc386d20fee8bf2b0c307c
2518-
React-RuntimeApple: 344a5e1105256000afabaa8df12c3e4cab880340
2519-
React-RuntimeCore: 0e48fb5e5160acc0334c7a723a42d42cef4b58b6
2513+
React-RuntimeApple: 8b7a9788f31548298ba1990620fe06b40de65ad7
2514+
React-RuntimeCore: e03d96fbd57ce69fd9bca8c925942194a5126dbc
25202515
React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2
2521-
React-RuntimeHermes: 064286a03871d932c99738e0f8ef854962ab4b99
2522-
React-runtimescheduler: e917ab17ae08c204af1ebf8f669b7e411b0220c8
2516+
React-RuntimeHermes: aab794755d9f6efd249b61f3af4417296904e3ba
2517+
React-runtimescheduler: c3cd124fa5db7c37f601ee49ca0d97019acd8788
25232518
React-timing: a90f4654cbda9c628614f9bee68967f1768bd6a5
2524-
React-utils: 51c4e71608b8133fecc9a15801d244ae7bdf3758
2525-
ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b
2526-
ReactCodegen: c9a256facbe4996140f3fb95c7f03ba61c12acc9
2527-
ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461
2528-
RNAudioAPI: f93e51adeee0911c8c6629a56f6df35edc60c084
2529-
RNDeviceInfo: feea80a690d2bde1fe51461cf548039258bd03f2
2530-
RNGestureHandler: ccf4105b125002bd88e39d2a1f2b7e6001bcdf34
2531-
RNLiveAudioStream: 02584d52711b6b9f268cb371a4b1bdd76ab3e079
2532-
RNReanimated: c567de23384730756bb19ff55490819980536b09
2533-
RNScreens: c2e3cc506212228c607b4785b315205e28acbf0f
2534-
RNSVG: ee32efbed652c5151fd3f98bed13c68af285bc38
2519+
React-utils: a612d50555b6f0f90c74b7d79954019ad47f5de6
2520+
ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
2521+
ReactCodegen: 7ea266ccd94436294f516247db7402b57b1214af
2522+
ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
2523+
RNAudioAPI: 3e398c4e9d44bb6b0c0b00e902057613224fc024
2524+
RNDeviceInfo: d863506092aef7e7af3a1c350c913d867d795047
2525+
RNGestureHandler: 7d0931a61d7ba0259f32db0ba7d0963c3ed15d2b
2526+
RNReanimated: afd6a269a47d6f13ba295c46c6c0e14e3cbd0d8a
2527+
RNScreens: 482e9707f9826230810c92e765751af53826d509
2528+
RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3
25352529
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
25362530
sqlite3: 1d85290c3321153511f6e900ede7a1608718bbd5
2537-
Yoga: 9f110fc4b7aa538663cba3c14cbb1c335f43c13f
2531+
Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf
25382532

25392533
PODFILE CHECKSUM: bba19a069e673f2259009e9d2caab44374fdebcf
25402534

0 commit comments

Comments
 (0)