Skip to content

Commit 50c654f

Browse files
author
Wojtach
committed
feat: added replicator documentChangeListener
1 parent 755cebf commit 50c654f

File tree

13 files changed

+412
-131
lines changed

13 files changed

+412
-131
lines changed

expo-example/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ buildscript {
66
minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24')
77
compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35')
88
targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34')
9-
kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.24'
9+
kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25'
1010

1111
ndkVersion = "26.1.10909125"
1212
}

expo-example/android/settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pluginManagement {
2-
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile().toString())
2+
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString())
33
}
44
plugins { id("com.facebook.react.settings") }
55

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import React, { useContext, useState } from 'react';
2+
import { Replicator } from 'cbl-reactnative';
3+
import ReplicatorDocumentChangeContext from '@/providers/ReplicationDocumentChangeContext';
4+
import ReplicatorStatusTokenContext from '@/providers/ReplicatorStatusTokenContext';
5+
import start from '@/service/replicator/start';
6+
import stop from '@/service/replicator/stop';
7+
import ReplicatorIdActionForm from '@/components/ReplicatorIdActionForm/ReplicatorIdActionForm';
8+
import { useStyleScheme } from '@/components/Themed/Themed';
9+
import { SafeAreaView } from 'react-native';
10+
import ResultListView from '@/components/ResultsListView/ResultsListView';
11+
12+
export default function DocumentReplicationScreen() {
13+
const styles = useStyleScheme();
14+
const { documentChangeMessages, setDocumentChangeMessages } = useContext(
15+
ReplicatorDocumentChangeContext
16+
)!;
17+
const { statusToken, setStatusToken } = useContext(
18+
ReplicatorStatusTokenContext
19+
)!;
20+
const [informationMessages, setInformationMessages] = useState<string[]>([]);
21+
const [selectedReplicatorId, setSelectedReplicatorId] = useState<string>('');
22+
const [documentTokens, setDocumentTokens] = useState<Record<string, string>>({});
23+
24+
function reset() {}
25+
26+
async function update(replicator: Replicator): Promise<void> {
27+
const replId = replicator.getId();
28+
if (replId !== undefined) {
29+
const replicatorId = replId.toString();
30+
setSelectedReplicatorId(replicatorId);
31+
try {
32+
const token = documentTokens[replicatorId];
33+
if (token === undefined) {
34+
setInformationMessages((prev) => [
35+
...prev,
36+
`::Information: Replicator <${replicatorId}> Starting Document Change listener...`,
37+
]);
38+
const date = new Date().toISOString();
39+
const changeToken = await replicator.addDocumentChangeListener((documentReplication) => {
40+
const docs = documentReplication.documents;
41+
const direction = documentReplication.isPush ? 'PUSH' : 'PULL';
42+
43+
const newMessages = docs.map(doc => {
44+
const flags = doc.flags ? doc.flags.join(', ') : 'none';
45+
const error = doc.error ? `, Error: ${doc.error}` : '';
46+
return `${date}::Doc:: ${direction} - Scope: ${doc.scopeName}, Collection: ${doc.collectionName}, ID: ${doc.id}, Flags: ${flags}${error}`;
47+
});
48+
49+
setInformationMessages((prev) => [...prev, ...newMessages]);
50+
});
51+
52+
setDocumentTokens((prev) => {
53+
return {
54+
...prev,
55+
[replicatorId]: changeToken,
56+
};
57+
});
58+
59+
setInformationMessages((prev) => [
60+
...prev,
61+
`::Information: Replicator <${replicatorId}> Document listener registered, starting replicator...`,
62+
]);
63+
64+
await start(replicator, false);
65+
} else {
66+
setInformationMessages((prev) => [
67+
...prev,
68+
`::Information: Replicator <${replicatorId}> Document Change already running with token: <${token}>.`,
69+
]);
70+
}
71+
} catch (error) {
72+
setInformationMessages((prev) => [
73+
...prev,
74+
// @ts-ignore
75+
`::ERROR: ${error.message}`,
76+
]);
77+
}
78+
} else {
79+
setInformationMessages((prev) => [
80+
...prev,
81+
`::ERROR: ReplicatorId is undefined`,
82+
]);
83+
}
84+
}
85+
86+
async function stopReplicator(replicator: Replicator): Promise<void> {
87+
try {
88+
const replId = replicator.getId();
89+
if (replId !== undefined) {
90+
const replicatorId = replId.toString();
91+
setInformationMessages((prev) => [
92+
...prev,
93+
`::Information: Stopping Replicator with replicatorId: <${replicatorId}>.`,
94+
]);
95+
await stop(replicator);
96+
97+
const token = documentTokens[replicatorId];
98+
if (token) {
99+
setInformationMessages((prev) => [
100+
...prev,
101+
`::Information: Removing document change listener with token <${token}> from Replicator with replicatorId: <${replicatorId}>.`,
102+
]);
103+
// await replicator.removeDocumentChangeListener(token);
104+
105+
setDocumentTokens((prev) => {
106+
const newTokens = { ...prev };
107+
delete newTokens[replicatorId];
108+
return newTokens;
109+
});
110+
111+
setInformationMessages((prev) => [
112+
...prev,
113+
`::Information: Removed document change listener with token <${token}> from Replicator with replicatorId: <${replicatorId}>.`,
114+
]);
115+
}
116+
} else {
117+
setInformationMessages((prev) => [
118+
...prev,
119+
`::Error: Couldn't get replicatorId from replicator.`,
120+
]);
121+
}
122+
} catch (error) {
123+
setInformationMessages((prev) => [
124+
...prev,
125+
// @ts-ignore
126+
`::ERROR: ${error.message}`,
127+
]);
128+
}
129+
}
130+
131+
const filteredDocumentChangeMessages =
132+
documentChangeMessages[selectedReplicatorId] || [];
133+
const combinedMessages = [
134+
...informationMessages,
135+
...filteredDocumentChangeMessages,
136+
];
137+
138+
return (
139+
<SafeAreaView style={styles.container}>
140+
<ReplicatorIdActionForm
141+
handleUpdatePressed={update}
142+
handleResetPressed={reset}
143+
handleStopPressed={stopReplicator}
144+
screenTitle="Document Replication"
145+
/>
146+
<ResultListView useScrollView={true} messages={combinedMessages} />
147+
</SafeAreaView>
148+
);
149+
}

expo-example/app/replication/status.tsx

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,11 @@ import start from '@/service/replicator/start';
66
import stop from '@/service/replicator/stop';
77
import ReplicatorIdActionForm from '@/components/ReplicatorIdActionForm/ReplicatorIdActionForm';
88
import { useStyleScheme } from '@/components/Themed/Themed';
9-
import { NativeEventEmitter, NativeModules, SafeAreaView } from 'react-native';
9+
import { SafeAreaView } from 'react-native';
1010
import ResultListView from '@/components/ResultsListView/ResultsListView';
11-
import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue';
1211

13-
export default function ReplicatorStatusScreen() {
14-
//debug the message queue
15-
const spyMessageQueue = (message: any) => {
16-
if (
17-
message.type === 0 &&
18-
message.method === 'emit' &&
19-
message.module === 'RCTDeviceEventEmitter'
20-
) {
21-
console.log(`::MESSAGE-QUEUE:: ${message.args}`);
22-
}
23-
};
2412

13+
export default function ReplicatorStatusScreen() {
2514
const styles = useStyleScheme();
2615
const { statusChangeMessages, setStatusChangeMessages } = useContext(
2716
ReplicatorStatusChangeContext
@@ -40,8 +29,6 @@ export default function ReplicatorStatusScreen() {
4029
const replicatorId = replId.toString();
4130
setSelectedReplicatorId(replicatorId);
4231
try {
43-
//debug the message queue
44-
MessageQueue.spy(spyMessageQueue);
4532
const token = statusToken[replicatorId];
4633
if (token === undefined) {
4734
setInformationMessages((prev) => [

expo-example/hooks/useReplicationNavigationSections.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ export function useReplicationNavigationSections() {
1919
title: 'Replicator Stop',
2020
path: '/replication/stop',
2121
},
22+
{
23+
id: 3,
24+
title: 'Replicator Documents Status',
25+
path: '/replication/documentStatus',
26+
},
2227
{
2328
id: 7,
2429
title: 'Status Changes',

expo-example/ios/Podfile.lock

Lines changed: 67 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
PODS:
22
- boost (1.84.0)
3-
- cbl-reactnative (0.2.1):
3+
- cbl-reactnative (0.2.3):
44
- CouchbaseLite-Swift-Enterprise (= 3.2.1)
55
- DoubleConversion
66
- glog
@@ -2185,93 +2185,93 @@ EXTERNAL SOURCES:
21852185

21862186
SPEC CHECKSUMS:
21872187
boost: 1dca942403ed9342f98334bf4c3621f011aa7946
2188-
cbl-reactnative: dc6c2f40c22c456b3c26952f7cc7815a3ce34318
2188+
cbl-reactnative: aec81403856ac5f91d3792b18da6a67551402f76
21892189
CouchbaseLite-Swift-Enterprise: 6a1eddeed0b450d00d2336bcf60c9a71e228f0e4
21902190
DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
2191-
EXConstants: dd2fe64c6cdb1383b694c309a63028a8e9f2be6d
2191+
EXConstants: 277129d9a42ba2cf1fad375e7eaa9939005c60be
21922192
EXJSONUtils: 01fc7492b66c234e395dcffdd5f53439c5c29c93
2193-
EXManifests: f30a0c5d3d6cad8db9c01bab579e0aa0df5d3cb2
2194-
Expo: 148aac4ce0da148c63447d09ae41ddb153f35506
2195-
expo-dev-client: 8c99b4979086a27f19e773e96ef10219102a5c4f
2196-
expo-dev-launcher: 6a9b0c2e95bcf9cff57a59f7b39bcd7d4b9fb0d1
2197-
expo-dev-menu: cba09bf0b6a97b8297434eb2cdc44106aaf51c11
2193+
EXManifests: 8de88191fe548cd5aeafa4228ed92283b483b923
2194+
Expo: 8948e8e417f699ed125a80389e150aabbae404bf
2195+
expo-dev-client: efd9785534d9facffebd23bb9d105e5eb71fd04f
2196+
expo-dev-launcher: 4f0e42fcb65ad340370ff2fe23df9791b22ec502
2197+
expo-dev-menu: 0755441fcaa71f7094cefd2cebab1c0de0dfad33
21982198
expo-dev-menu-interface: 4baf2f8b3b79ce37cf4b900e4b3ba6df3384f0a1
2199-
ExpoAsset: 8138f2a9ec55ae1ad7c3871448379f7d97692d15
2200-
ExpoFileSystem: dc2679a2b5d4c465ca881129074da95faee943d5
2201-
ExpoFont: 7522d869d84ee2ee8093ee997fef5b86f85d856b
2202-
ExpoHead: a623db43433938dcfbd6a38c27381055d01a0f3a
2203-
ExpoKeepAwake: 783e68647b969b210a786047c3daa7b753dcac1f
2204-
ExpoLinking: a8332a219379ba80f8e612d5a5de4a3da446886e
2205-
ExpoModulesCore: f71914f0725f2f4ca7a8d25dc551263e730d5d7f
2206-
ExpoRandom: 099ddce39b39ffb984b45118d031e8713e962a50
2207-
ExpoSplashScreen: 47a5c337586329223b70b5ef777d34c1f9edf412
2208-
ExpoSystemUI: 97ec8f20af5e8ca18d3191c5c72e8a04e6e2f02d
2209-
ExpoWebBrowser: f08aaf1c8a02af8a768d83793186cb6d2c69f529
2210-
EXUpdatesInterface: 1dcebac98ac5dad4289e6ff2bd5616822e894397
2199+
ExpoAsset: 6f7a8887cbb9fb39fdb0808e7f6f74ba0e1ae9b6
2200+
ExpoFileSystem: 83da9dbce2371cc72c3a3ef49e0df54a117310f1
2201+
ExpoFont: 12b0217e42ac97029d0f317f0486039a8508cf52
2202+
ExpoHead: 8f54ac800b3ef60095313aa49f091c9c94c7304e
2203+
ExpoKeepAwake: 22173f45d767c7d37403fdf48292726901d69ce7
2204+
ExpoLinking: 40e30b571ffb77b280a38bed137d89b21f46f2a0
2205+
ExpoModulesCore: aae34f5458cf6ce1632f17f00de0f10d8552d954
2206+
ExpoRandom: d1444df65007bdd4070009efd5dab18e20bf0f00
2207+
ExpoSplashScreen: a86597b744a79c9d26da9317a1f8d894b0bc846c
2208+
ExpoSystemUI: 018496c0221ae4993cfc56b14e723af8c9a5aa22
2209+
ExpoWebBrowser: b658ba8a9161f1b54afb279591cfce2cb73330fa
2210+
EXUpdatesInterface: 7c977640bdd8b85833c19e3959ba46145c5719db
22112211
FBLazyVector: be7314029d6ec6b90f0f75ce1195b8130ed9ac4f
22122212
fmt: 10c6e61f4be25dc963c36bd73fc7b1705fe975be
22132213
glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a
22142214
hermes-engine: 0555a84ea495e8e3b4bde71b597cd87fbb382888
2215-
RCT-Folly: bf5c0376ffe4dd2cf438dcf86db385df9fdce648
2215+
RCT-Folly: 84578c8756030547307e4572ab1947de1685c599
22162216
RCTDeprecation: 2c5e1000b04ab70b53956aa498bf7442c3c6e497
22172217
RCTRequired: 5f785a001cf68a551c5f5040fb4c415672dbb481
22182218
RCTTypeSafety: 6b98db8965005d32449605c0d005ecb4fee8a0f7
22192219
React: 8077bf7c185afb515be82518507e16f71a247a5e
22202220
React-callinvoker: 519eee9520727805e2867a6d8dad4ebbeed543db
2221-
React-Core: e364ceda7d086c7d14adeec0eb880a90073e3dde
2222-
React-CoreModules: 291be650024d9db086c95fd1d7e7d9607c6de62b
2223-
React-cxxreact: 5cf17d13ca0fc0734e1bb0ed9615d1d1fc45ef78
2221+
React-Core: 14708d0ebf0f961647347a7ae9cebcfaa75c99aa
2222+
React-CoreModules: 42b62e50cb4ac9a8ca92b48b263355cebcc1a523
2223+
React-cxxreact: 846f1d9eb37a3dec19738d195d313deb7e9ee36b
22242224
React-debug: 931ca94abd6b1bcab539e356e20df788afecae8f
2225-
React-defaultsnativemodule: fa1917ffdbb17e2a03f9a2b26e6f7342f59662c0
2226-
React-domnativemodule: c9dcbf0a872f3d02210f005c084d0fc1fdb83f2d
2227-
React-Fabric: e1774fe4b579e34c2c5721e9351c8ce869e7b5f0
2228-
React-FabricComponents: 528ff9f96d150379ed404221d70cc7019ca76865
2229-
React-FabricImage: 31680b7ddc740e040277176fbd6541fcf0fd44af
2225+
React-defaultsnativemodule: 6f56c95a8cd7b7fcfa6f983b19270753000c1a4e
2226+
React-domnativemodule: 42711869923d77713e8d090f489580c330ff2033
2227+
React-Fabric: 2709bcae28c5b567337b3bad4ec1aa8b81aa1241
2228+
React-FabricComponents: f35e150acf873109d244bd8c4535425d51f26672
2229+
React-FabricImage: 6dd7af0496dae7924553f8b3cd2b134d86256a48
22302230
React-featureflags: 7c7a74b65ee5a228f520b387ebfe0e8d9cecc622
2231-
React-featureflagsnativemodule: bc298d49634a5b2e0576b9bda6a0dc337ef158f8
2232-
React-graphics: 7f0d3e06d356e8476bd8ba95d90762fc01138ebc
2233-
React-hermes: f83fafe6a1c845dace7abad4a5d7366cbb42ab96
2234-
React-idlecallbacksnativemodule: 733deb5f645226868cf49a0eb798c62082a3fb34
2235-
React-ImageManager: 2b9274ea973f43597a554a182d7ef525836172c6
2236-
React-jserrorhandler: 3b521485275d295cfc6ec6bfa921a1d608693ecf
2237-
React-jsi: fd23c1d759feb709784fd4c835b510b90a94dd12
2238-
React-jsiexecutor: 74628d57accc03d4b5df53db813ef6dcd704c9ae
2239-
React-jsinspector: 89a1e27e97c762de81bd4b9cb1314750304bba38
2240-
React-jsitracing: 11b6646d7b2ecdc7a475f65b2cb12d3805964195
2241-
React-logger: 26155dc23db5c9038794db915f80bd2044512c2e
2242-
React-Mapbuffer: ad1ba0205205a16dbff11b8ade6d1b3959451658
2243-
React-microtasksnativemodule: 36e3a415c6a3a5c4784b5c6bad38013b8ca35be4
2244-
react-native-safe-area-context: 4532f1a0c5d34a46b9324ccaaedcb5582a302b7d
2231+
React-featureflagsnativemodule: 2e98d69110ccee1cf10acafad34041940457545c
2232+
React-graphics: ba13cb82b71ec2e0ad9dac2ae31867b5656d5a28
2233+
React-hermes: 4bfb5c90304c4d2aa36b3404ddd00df591dcae8a
2234+
React-idlecallbacksnativemodule: 4a77976e6b6d74ebe2008ade2e46c69484a69f45
2235+
React-ImageManager: 0464b2fac74d9d06d44abc3e85035424fc0d1a70
2236+
React-jserrorhandler: 4c8ee0547d89d1bfe9cd740ca83d229934cc94e4
2237+
React-jsi: 927e83b5aef299ca42842cd1ad696c4cf301d5eb
2238+
React-jsiexecutor: ba6b1fbaa388a99fcfb750529fed3ce65efbda4f
2239+
React-jsinspector: 1f9f161bf0961df50d2843802a431eb4fd4059cf
2240+
React-jsitracing: f6f65398e2d58bd24523ba210b277681e9cf2ee0
2241+
React-logger: 2736a90a3fdaed3dab1e2e9c5a5e9b3be00c287d
2242+
React-Mapbuffer: bd6a2ffbf401f11cfc8b5e8f38acab9fe117620c
2243+
React-microtasksnativemodule: e3e161b03573a22cf4e05434fe5309c7847ef197
2244+
react-native-safe-area-context: b13be9714d9771fbde0120bc519c963484de3a71
22452245
React-nativeconfig: aeed6e2a8ac02b2df54476afcc7c663416c12bf7
2246-
React-NativeModulesApple: c5b7813da94136f50ef084fa1ac077332dcfc658
2247-
React-perflogger: 6afb7eebf7d9521cc70481688ccddf212970e9d3
2248-
React-performancetimeline: 81884d35896b22d51832e7c8748c8330ec73c491
2246+
React-NativeModulesApple: c0783e5e21c71aa2764ac33120abc96208466fa6
2247+
React-perflogger: 2991d4258277af250eb7a2705980ebb3ef9ba85e
2248+
React-performancetimeline: 76a55d0be7293adfce8603eafb8dbae92234352d
22492249
React-RCTActionSheet: c940a35d71686941ac2b96dd07bde11ea0f0c34f
2250-
React-RCTAnimation: e1dbb4e530d6f58437ab2fae372de3788ecdffab
2251-
React-RCTAppDelegate: 3aa8a7b8bff5afcc00f947471c2fc93bd2093de5
2252-
React-RCTBlob: 9cdac4721a76e2d132fb1760eafd0a8f150d1c96
2253-
React-RCTFabric: b833ecb9bb715858731f658accae0804bd2f4a7b
2254-
React-RCTImage: f09f5165807e1a69a2bbac6c7168a8ed57ed4e26
2255-
React-RCTLinking: 4ea06b79cba7e15d8af4d86b1dcede6bd29a47fd
2256-
React-RCTNetwork: 43a38148c7a4a2380e76b08f07f02ee8eaac8965
2257-
React-RCTSettings: cc60bb6b38eed0683696b5ddf45b0a4a1441147b
2258-
React-RCTText: fbe5e6e886beefd5d432790bc50b7aa2b6504264
2259-
React-RCTVibration: 061dbf7a0a1e77bfc1c4672e7be6884dc12f18bf
2250+
React-RCTAnimation: db10ffa5b463794089b5319818f1df1e0b996422
2251+
React-RCTAppDelegate: c398e067ecde4909eab8b48adf06bf03783cd335
2252+
React-RCTBlob: 2ede907cfc8039c5f5da32b3ba9e144b663c3c98
2253+
React-RCTFabric: 9612452b193ce3daa3a05fdbeba4ffea756b17f8
2254+
React-RCTImage: 3d6b5cc404c62d2b2cd767061a56bd48b4300f5e
2255+
React-RCTLinking: 548cf5c3fe935f3d0c8df5dc3c234283df48cea6
2256+
React-RCTNetwork: 59f683fee79f9187b8ee4c270343b474ad37b42c
2257+
React-RCTSettings: b14bd94b2ac87c803375a0873746ef31c7b0eead
2258+
React-RCTText: 24e7a9b64341d6a1c98e1eabc5471b88c8bc61f1
2259+
React-RCTVibration: 2830b19dca45d23dc61b3c93c25fbc7b85979202
22602260
React-rendererconsistency: 52b471890a1946991f2db81aa6867b14d93f4ea5
2261-
React-rendererdebug: 3f63479f704e266a3bf104c897315a885c72859b
2261+
React-rendererdebug: c2496eb27c25d367b7e80a8a4a1babc21b6cc64b
22622262
React-rncore: 33ea67bfd2eeaa4f4a0c9e0e8bd55e9b7ccb9faa
2263-
React-RuntimeApple: bcd91a191637ab5895593135de74ac54bf88df5d
2264-
React-RuntimeCore: 3a42a7f12f5f6cc4cb0e22446540165d204d7a15
2263+
React-RuntimeApple: 28bcdbce4517b9428ab127d42d7b6bfeb27eb69c
2264+
React-RuntimeCore: d629b37225984a26c57803d857c8357c839f3fef
22652265
React-runtimeexecutor: db3f17084ee7b71ab84912c527d428cc3a137841
2266-
React-RuntimeHermes: 91bcd6aeec4bab20cebd33cb8984e3825ccdc77e
2267-
React-runtimescheduler: 92a5a092ded9a9aaac765ac940d26b52bac48901
2266+
React-RuntimeHermes: 5d857268954776a1c6f0e0ecff1f7860806bb43b
2267+
React-runtimescheduler: 00be5844aa2c7d72fd47293e0798bb41462ecfee
22682268
React-timing: 54693ad0872f64127f7cb41675b1be4fd28ea4dc
2269-
React-utils: 2bcaf4f4dfe361344bce2fae428603d518488630
2270-
ReactCodegen: ae99a130606068ed40d1d9c0d5f25fda142a0647
2271-
ReactCommon: 89c87b343deacc8610b099ac764848f0ce937e3e
2272-
RNReanimated: 365e7d6c1ed443cf8e1b7ba4f0b15dd9f82f052a
2273-
RNScreens: b03d696c70cc5235ce4587fcc27ae1a93a48f98c
2274-
RNSVG: 3d2bdcaef51c8071880a9c0072fe324f4423a3ba
2269+
React-utils: ee370a52b08a000963af1a60c31e6c87a70620a5
2270+
ReactCodegen: 5148a0102fc8f0a1f9b05d955da886b44447679d
2271+
ReactCommon: b8485556b596ef2f44f59bc586113bda138fb804
2272+
RNReanimated: 929c26a706dfe1af8feee9f2cf78004394e4dd04
2273+
RNScreens: e21c8d32fe97737ecc30f1f21e7b6f69f341a1f5
2274+
RNSVG: bb4bfcb8ec723a6f34b074a1b7cd40ee35246fe5
22752275
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
22762276
Yoga: 3deb2471faa9916c8a82dda2a22d3fba2620ad37
22772277

0 commit comments

Comments
 (0)