Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ const UIView = {
focusable: true,
onMouseEnter: true,
onMouseLeave: true,
onDoubleClick: true,
onDragEnter: true,
onDragLeave: true,
onDrop: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ export interface ViewPropsMacOS {
enableFocusRing?: boolean | undefined;
onMouseEnter?: ((event: MouseEvent) => void) | undefined;
onMouseLeave?: ((event: MouseEvent) => void) | undefined;
onDoubleClick?: ((event: MouseEvent) => void) | undefined;
onDragEnter?: ((event: DragEvent) => void) | undefined;
onDragLeave?: ((event: DragEvent) => void) | undefined;
onDrop?: ((event: DragEvent) => void) | undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ export type KeyboardEventProps = $ReadOnly<{|
type MouseEventProps = $ReadOnly<{
onMouseEnter?: ?(event: MouseEvent) => void,
onMouseLeave?: ?(event: MouseEvent) => void,
onDoubleClick?: ?(event: MouseEvent) => void, // [macOS]
}>;

// Experimental/Work in Progress Pointer Event Callbacks (not yet ready for use)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ const bubblingEventTypes = {

const directEventTypes = {
...PlatformBaseViewConfigIos.directEventTypes,
topDoubleClick: {
registrationName: 'onDoubleClick',
},
topDragEnter: {
registrationName: 'onDragEnter',
},
Expand Down Expand Up @@ -68,6 +71,7 @@ const validAttributesForNonEventProps = {
// Props for bubbling and direct events
const validAttributesForEventProps = ConditionallyIgnoredEventHandlers({
onBlur: true,
onDoubleClick: true,
onDragEnter: true,
onDragLeave: true,
onDrop: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3866,6 +3866,7 @@ exports[`public API should not change unintentionally Libraries/Components/View/
focusable: true,
onMouseEnter: true,
onMouseLeave: true,
onDoubleClick: true,
onDragEnter: true,
onDragLeave: true,
onDrop: true,
Expand Down Expand Up @@ -4106,6 +4107,7 @@ export type KeyboardEventProps = $ReadOnly<{|
type MouseEventProps = $ReadOnly<{
onMouseEnter?: ?(event: MouseEvent) => void,
onMouseLeave?: ?(event: MouseEvent) => void,
onDoubleClick?: ?(event: MouseEvent) => void,
}>;
type PointerEventProps = $ReadOnly<{
onClick?: ?(event: PointerEvent) => void,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1905,7 +1905,14 @@ - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender

#pragma mark - Mouse Events

- (void)emitMouseEvent {
enum MouseEventType {
MouseEnter,
MouseLeave,
DoubleClick,
};

- (void)emitMouseEvent:(MouseEventType)eventType
{
if (!_eventEmitter) {
return;
}
Expand All @@ -1926,10 +1933,18 @@ - (void)emitMouseEvent {
.metaKey = static_cast<bool>(modifierFlags & NSEventModifierFlagCommand),
};

if (_hasMouseOver) {
_eventEmitter->onMouseEnter(mouseEvent);
} else {
_eventEmitter->onMouseLeave(mouseEvent);
switch (eventType) {
case MouseEnter:
_eventEmitter->onMouseEnter(mouseEvent);
break;

case MouseLeave:
_eventEmitter->onMouseLeave(mouseEvent);
break;

case DoubleClick:
_eventEmitter->onDoubleClick(mouseEvent);
break;
}
}

Expand Down Expand Up @@ -1958,7 +1973,7 @@ - (void)updateMouseOverIfNeeded

if (hasMouseOver != _hasMouseOver) {
_hasMouseOver = hasMouseOver;
[self emitMouseEvent];
[self emitMouseEvent:hasMouseOver ? MouseEnter : MouseLeave];
}
}

Expand Down Expand Up @@ -2031,7 +2046,7 @@ - (void)mouseEntered:(NSEvent *)event
}

_hasMouseOver = YES;
[self emitMouseEvent];
[self emitMouseEvent:MouseEnter];
}

- (void)mouseExited:(NSEvent *)event
Expand All @@ -2041,7 +2056,17 @@ - (void)mouseExited:(NSEvent *)event
}

_hasMouseOver = NO;
[self emitMouseEvent];
[self emitMouseEvent:MouseLeave];
}

- (void)mouseUp:(NSEvent *)event
{
BOOL hasDoubleClickEventHandler = _props->hostPlatformEvents[HostPlatformViewEvents::Offset::DoubleClick];
if (hasDoubleClickEventHandler && event.clickCount == 2) {
[self emitMouseEvent :DoubleClick];
} else {
[super mouseUp:event];
}
}
#endif // macOS]

Expand Down
1 change: 1 addition & 0 deletions packages/react-native/React/Views/RCTView.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ extern const UIAccessibilityTraits SwitchAccessibilityTrait;
@property (nonatomic, copy) RCTDirectEventBlock onDragEnter;
@property (nonatomic, copy) RCTDirectEventBlock onDragLeave;
@property (nonatomic, copy) RCTDirectEventBlock onDrop;
@property (nonatomic, copy) RCTDirectEventBlock onDoubleClick;

// Keyboarding events
// NOTE does not properly work with single line text inputs (most key downs). This is because those are
Expand Down
9 changes: 9 additions & 0 deletions packages/react-native/React/Views/RCTView.m
Original file line number Diff line number Diff line change
Expand Up @@ -1552,6 +1552,15 @@ - (void)mouseExited:(NSEvent *)event
additionalData:nil];
}

- (void)mouseUp:(NSEvent *)event
{
if (_onDoubleClick && event.clickCount == 2){
_onDoubleClick(nil);
} else {
[super mouseUp:event];
}
}

- (BOOL)mouseDownCanMoveWindow
{
return _mouseDownCanMoveWindow;
Expand Down
1 change: 1 addition & 0 deletions packages/react-native/React/Views/RCTViewManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,7 @@ - (void) updateAccessibilityRole:(RCTView *)view withDefaultView:(RCTView *)defa
RCT_EXPORT_VIEW_PROPERTY(onFocus, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onBlur, RCTBubblingEventBlock)

RCT_EXPORT_VIEW_PROPERTY(onDoubleClick, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onMouseEnter, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onMouseLeave, RCTDirectEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onDragEnter, RCTDirectEventBlock)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,17 +67,23 @@ static jsi::Object mouseEventPayload(jsi::Runtime& runtime, const MouseEvent& ev
};

void HostPlatformViewEventEmitter::onMouseEnter(const MouseEvent& mouseEvent) const {
dispatchEvent("mouseEnter", [mouseEvent](jsi::Runtime &runtime) {
dispatchEvent("mouseEnter", [mouseEvent](jsi::Runtime& runtime) {
return mouseEventPayload(runtime, mouseEvent);
});
}

void HostPlatformViewEventEmitter::onMouseLeave(const MouseEvent& mouseEvent) const {
dispatchEvent("mouseLeave", [mouseEvent](jsi::Runtime &runtime) {
dispatchEvent("mouseLeave", [mouseEvent](jsi::Runtime& runtime) {
return mouseEventPayload(runtime, mouseEvent);
});
}

void HostPlatformViewEventEmitter::onDoubleClick(const MouseEvent& mouseEvent) const {
dispatchEvent("doubleClick", [mouseEvent](jsi::Runtime& runtime) {
return mouseEventPayload(runtime, mouseEvent);
});
}

#pragma mark - Drag and Drop Events

jsi::Value HostPlatformViewEventEmitter::dataTransferPayload(
Expand Down Expand Up @@ -170,20 +176,20 @@ static jsi::Value dragEventPayload(
return payload;
}

void HostPlatformViewEventEmitter::onDragEnter(DragEvent const& dragEvent) const {
dispatchEvent("dragEnter", [dragEvent](jsi::Runtime &runtime) {
void HostPlatformViewEventEmitter::onDragEnter(const DragEvent& dragEvent) const {
dispatchEvent("dragEnter", [dragEvent](jsi::Runtime& runtime) {
return dragEventPayload(runtime, dragEvent);
});
}

void HostPlatformViewEventEmitter::onDragLeave(DragEvent const& dragEvent) const {
dispatchEvent("dragLeave", [dragEvent](jsi::Runtime &runtime) {
void HostPlatformViewEventEmitter::onDragLeave(const DragEvent& dragEvent) const {
dispatchEvent("dragLeave", [dragEvent](jsi::Runtime& runtime) {
return dragEventPayload(runtime, dragEvent);
});
}

void HostPlatformViewEventEmitter::onDrop(DragEvent const& dragEvent) const {
dispatchEvent("drop", [dragEvent](jsi::Runtime &runtime) {
void HostPlatformViewEventEmitter::onDrop(const DragEvent& dragEvent) const {
dispatchEvent("drop", [dragEvent](jsi::Runtime& runtime) {
return dragEventPayload(runtime, dragEvent);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class HostPlatformViewEventEmitter : public BaseViewEventEmitter {

void onMouseEnter(MouseEvent const& mouseEvent) const;
void onMouseLeave(MouseEvent const& mouseEvent) const;
void onDoubleClick(MouseEvent const& mouseEvent) const;

#pragma mark - Drag and Drop Events

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ struct HostPlatformViewEvents {
// Mouse Events
MouseEnter = 4,
MouseLeave = 5,
DoubleClick = 6,
};

constexpr bool operator[](const Offset offset) const {
Expand Down Expand Up @@ -71,6 +72,8 @@ static inline HostPlatformViewEvents convertRawProp(
convertRawProp(context, rawProps, "onMouseEnter", sourceValue[Offset::MouseEnter], defaultValue[Offset::MouseEnter]);
result[Offset::MouseLeave] =
convertRawProp(context, rawProps, "onMouseLeave", sourceValue[Offset::MouseLeave], defaultValue[Offset::MouseLeave]);
result[Offset::DoubleClick] =
convertRawProp(context, rawProps, "onDoubleClick", sourceValue[Offset::DoubleClick], defaultValue[Offset::DoubleClick]);

return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ void HostPlatformViewProps::setProp(
VIEW_EVENT_CASE_MACOS(KeyUp);
VIEW_EVENT_CASE_MACOS(MouseEnter);
VIEW_EVENT_CASE_MACOS(MouseLeave);
VIEW_EVENT_CASE_MACOS(DoubleClick);
RAW_SET_PROP_SWITCH_CASE_BASIC(focusable);
RAW_SET_PROP_SWITCH_CASE_BASIC(enableFocusRing);
RAW_SET_PROP_SWITCH_CASE_BASIC(keyDownEvents);
Expand Down
130 changes: 65 additions & 65 deletions packages/rn-tester/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2053,82 +2053,82 @@ SPEC CHECKSUMS:
boost: cea1d4f90a3a59537f3deb03ff5656489d7133dd
DoubleConversion: d31b1eb37f6d6f456530c4fd9124b857d6889cab
fast_float: 5596a99716f77fe44b617183d4db34777538174d
FBLazyVector: 0a3f4ff238f4a5a12df1ce799726fbae48b3219a
FBLazyVector: c3d0c3eb45c5a3c5985c4cdbe037b1530a7eef2d
fmt: 24e7591456deb60b4a77518f83d9a916ac84223f
glog: 0b31c25149b9d350b2666c7d459229861a00ec07
hermes-engine: cc8feeacabc5b95002c368a555a173cddafb29c5
hermes-engine: 9b033746b84dd3782beba1ee78de2d8ce709e5e1
MyNativeView: 012965daf7594f221bfe8f48c3a6be88dc926ec7
NativeCxxModuleExample: d89bddc6be7c578088d4c441e1de365cca37d369
OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74
OSSLibraryExample: d57a46a4520f0964e36b3ac349cb37404a469ae3
RCT-Folly: 957ce397c08be7a9a91bb9245e57e69fa5255ec5
RCTDeprecation: 3808e36294137f9ee5668f4df2e73dc079cd1dcf
RCTRequired: 5c10a42787b18fabbacda1669d333270f78dfed1
RCTTypeSafety: 04629d6e8ee80c4ddb1bc2acb80b1ca88de284c9
React: ee7f072e1e2db3fd4da25483b3cb6868964aa7ed
React-callinvoker: 94acfd04af532e289b9e992fad6f71b0a1fb752f
React-Core: 7b58428f7a2c1a685713e3e14387a8f98da88e03
React-CoreModules: 5f97a14ece13839935df5ae9456db172f966c1f4
React-cxxreact: d152f08b17a34ae1ec345029cdc24919828bda88
React-debug: bd53bf62a49fe5858a569204c3df64dc0a3c0e6a
React-defaultsnativemodule: a59c04097aff0751a08745ef6aaa217ab1178be7
React-domnativemodule: 403a11dd566425a55d3bf58a13127a2c12c2afc7
React-Fabric: 0c8a6ce4745ccdc43aec6a664e496218d8bdfc33
React-FabricComponents: 4af2a2865dc407f5c2e75faa2734ba389461e4b4
React-FabricImage: 7ca716a0ed4dcf506fcdcd60986501c527cfcc6e
React-featureflags: 8a8f76aa906abe8a561c2e81569d159509a7b244
React-featureflagsnativemodule: f9330ce11a0cb7e1b51e30cc261add31294d93c2
React-graphics: aa9108bb694c9ddb04eb0cd8b9bd7c0c09de83a2
React-hermes: a10ae5b0156d75c05f4c737336cb593b2b27a2df
React-idlecallbacksnativemodule: c9fe93ba4f421319ad4bcd0d7131e0d3c510cbfb
React-ImageManager: cfbe01dd1d75ed9aa33c09c66e3e3f20970f4981
React-jserrorhandler: 099f5a111a9117e5cb7be4a31a151e2977ec20ef
React-jsi: f06232f271ddafb13d90bfecda92a84d29bb0d36
React-jsiexecutor: 445b0458ddf8920c995d96af05bc8d66b7fc138a
React-jsinspector: af8da9536a4e2402d65c47e01a64118628f067b4
React-jsinspectortracing: eef865f1f8db567faac91bb857a880f7eab7e2d0
React-jsitooling: 397f96aed700fd416ff6fe16ed88f4fa45c64ba2
React-jsitracing: b149f1f31dda23f0ba72151b0024964a76741fa7
React-logger: 51cdb2d4cb36b78f9f154dda2fdb1e7dba204765
React-Mapbuffer: bb17a086220da31233ca695abe63ca01dec40d82
React-microtasksnativemodule: ac413e56d6d81b77b9a1aae7ff1aad8afb6050c5
React-NativeModulesApple: db1a001d34e7f0e8b25dfefa2a2ce83b6a6442d9
React-oscompat: 825c3b67ca607307fc7493101bee3ec6c18b2ca7
React-perflogger: ad75d71af0ddce6ea06d6d47eae3151563a01b55
React-performancetimeline: 53df2b097c87eab5bb14ed00cab95be9f82e2f64
React-RCTActionSheet: a9fc70ec6783733305602ffb0cb9ab956221230e
React-RCTAnimation: cc7bff4261b79f6fbb2df431bf6c312690f6c40c
React-RCTAppDelegate: bd84d753358c4103b81d6fe33c1e64c844615516
React-RCTBlob: 80c0a82e1b20f05416636841f0f13cbe28c6df6d
React-RCTFabric: dd0221952b4cfafbe1d548e59272a48f5d7b233a
React-RCTFBReactNativeSpec: c3b76c04af6b9842ce62db58c670a756a45bdee1
React-RCTImage: f810320175a60490085043f6aa65f4e91c4fd42d
React-RCTLinking: 1a4ed8deb97f91b641bbe31c223a80d3bfa040b2
React-RCTNetwork: bd30579e9d1b20708525428d6f1a44c1adfdcf5f
React-RCTPushNotification: 85664072a6ed949dbc244440a60be24f201eee2b
React-RCTRuntime: e7a1a5d3c48065d96e351f20b521c3e1e01cd55f
React-RCTSettings: 65a4df3015d7fd9c6efc455f0df9de8a48001b88
React-RCTTest: 0ee2333eb05005b100ce25749e3b3dfca40908f7
React-RCTText: d633a9c03fca2a1a228a0ede5e340169bb851618
React-RCTVibration: 0deb664da65c4302963a8c2d6f23995059341fea
React-rendererconsistency: 00316a8639306ac717d62d2874b885088cde31d4
React-renderercss: f11c56e70856232f2d34ab96df245a674a2ba769
React-rendererdebug: 12d895f5fae069c25aa0c33a138ddd3f308fd8f2
React-rncore: a0871316bff44288ba62c1374b6e9093717dbc89
React-RuntimeApple: 29d74569f8f83a2e98b73a532d063250a5170347
React-RuntimeCore: 54235f3ab77822160c01fa7ab543f3ea512e56e6
React-runtimeexecutor: a3ea35a56f73642ff5c888869e3e5eecd842f8c9
React-RuntimeHermes: 9f0c0fd0b045d2ee552ad96044be15e76a1b7485
React-runtimescheduler: 5d60a6ef3abdba3b0f688eacd3a106a45f09c334
React-timing: ba0ea02d49e288be015576fc217184a521f3508d
React-utils: 3101cddb3c50406b3949fe36e8fad34609dd561c
ReactAppDependencyProvider: 4d000089a4f20b7df5b5849581808301af186297
RCTRequired: dcedfb7f34fb38066e52e1cab957c57ccd7db9ad
RCTTypeSafety: 2c91e5de653d7c3b23201e16d633bbe86e1a68b6
React: af07878ea8559b32d8b065186c2928675788bd6e
React-callinvoker: 10b8534fbdbbf1c0c109aebfa03bdde4bdd98398
React-Core: 73c734a1cb66fc59f69e4966c52586bddf85531f
React-CoreModules: 1e50e62facd501e3f81a69c3f279f6c2a0785e41
React-cxxreact: dbe209231951c184f8fc785699aca4e4792beef8
React-debug: 02e3133cf01637dffc89c62deae2c881c27486dc
React-defaultsnativemodule: bd35f550f11cbf5c6dc72e5abe8b4f7afa41d14c
React-domnativemodule: 349bffb2ccd4cdd058b623e4f6d69729d430a482
React-Fabric: 5428224da0383007e2ad070289ad0f5e2e19fb36
React-FabricComponents: 542e573dac1ce367ecf916167c2cb7bf84c64835
React-FabricImage: 23799abf2c5f0bdce9ffb3bcc26dafe97bc6cdee
React-featureflags: 60c98ff6dea8def99600224c3f6f70dfc694a242
React-featureflagsnativemodule: f2c6690d9b26b802613f7c42fdb1967f6506f47a
React-graphics: da87e874689b2b4154b68f7a4dfa4814f8b13290
React-hermes: 434a2f81b1f0b827a60deb7ac187721523d39123
React-idlecallbacksnativemodule: 4ae844826cc8a8805fa50bcd8ffb15d89bce53e3
React-ImageManager: 8f9670e145e307b031c36db00fe18503afbef8ae
React-jserrorhandler: 734bc5d129478ab1f4aa601f05d63b60f636174a
React-jsi: d0915ece43c59ecdb8b64e4fb372a9c1ad45d23d
React-jsiexecutor: 2107bcf79b1345263f88c808b1c18e22741d02d1
React-jsinspector: 326fb8dd123a835532a702e85b9b3e92a8a91ce7
React-jsinspectortracing: 0da6865c91ffcb6074a7a918075f1e16af40b379
React-jsitooling: c1391fe5eee3b55df9bbe238e8b1ad0da4802be9
React-jsitracing: 2859fb1906371bb6a3ca037d05f25ffa9edb75d5
React-logger: f22a76c45f743c1bb5d9d8fa8cfd7b0114dc4b35
React-Mapbuffer: 49d322ddf11ffa8973463d484836d0c2b059b1ce
React-microtasksnativemodule: 1f39febc6ecea57b1d75ba88d77d081e2689b8a8
React-NativeModulesApple: ff4068eae18729a5689b0ee67638245db9a20751
React-oscompat: d5a3795b18b684c669546d619fe37daad9682b8f
React-perflogger: 65216186ecadcd7c1ae7d664163d51c0d87391db
React-performancetimeline: 31f83c222133d3eff1fb34fe5593bbfa44e20dd3
React-RCTActionSheet: b8fa8dc5462eeb5d6bf07de5c6205748625df025
React-RCTAnimation: 06aabab19321735d02619d56d370d66cd7dfa724
React-RCTAppDelegate: 5e27b038a0de10535cc17ee5eb0f9fb5ea8f05ff
React-RCTBlob: e5a049f652a015b59a44313879539325274d1fc0
React-RCTFabric: e012c85f94a07dd63f2bb98831bfc514ffb80814
React-RCTFBReactNativeSpec: f3b0131b2f651ba4272f5f41ee508db7cca9a715
React-RCTImage: 07f34ba290ef73e1c7905197365eb0424ae24979
React-RCTLinking: 65a5cf6bb17d8b056719206e62adf00d1b587d19
React-RCTNetwork: 754630d124eace3ecb7e8c5d79f4f98fa8be1f6c
React-RCTPushNotification: f688a11d989f643b9581b48b762fa2aaed36e8b0
React-RCTRuntime: d05f4ca1afba2d3b0ab92cb538f9acc58737ac6e
React-RCTSettings: e47018e632656bfbd7298c2d1becc2dfa914309b
React-RCTTest: f16c68419017c74b94bb3a61b8541c0352603e4b
React-RCTText: 41bc42eb95f304f797a3cc6f2ec3618d25df0c75
React-RCTVibration: 49c58ededff60875d03d519a9e1f36f9616eed1e
React-rendererconsistency: ce698aa83e253467df7f3de853eb9cf975ab833a
React-renderercss: 5956a051ae04e2bbb1550e30f01361fed05d7649
React-rendererdebug: ea93c790b40731bd6fedab213a0bca8d48e82752
React-rncore: dddfbb3e510df07ea24a3d31432a114856ffebb4
React-RuntimeApple: 9f9013c5ac7675ada7c4ea74250e77c87c131c82
React-RuntimeCore: 2644fe75ab6889bfa23f3e097ddf5b2ede9372bb
React-runtimeexecutor: 693ad2e64732b5bce44b6fcc90eabe494dfc595a
React-RuntimeHermes: 2a30129486526ac5d53334f48fbe38875964ef01
React-runtimescheduler: 1338928f41e96f431a85c7bbc78a4994b11f21b5
React-timing: eb7eb17a751191160f60b886f4d57afe06a99c06
React-utils: 63603fc28423587c8e36241b854fafc8996bbb71
ReactAppDependencyProvider: 83ef076ee1b1457ea3ab8beaecc79f953db5be41
ReactCodegen: 0082198e27eef7ce13bf03680eb9d15bbde56601
ReactCommon: ccca86fc30847bda1f64f6d8f84a596a4ce02f26
ReactCommon-Samples: feac96a466176d8aa790a5ae4e6076d66f437ffc
ReactCommon: 4b3b727acbd08deb6d3c318a2925f25c1cfa3cf5
ReactCommon-Samples: 4281d6886e7c27ec967a2a9392a3836edfc110ca
ScreenshotManager: c96f07e207c96f5d91080e408aff95df63875dae
SocketRocket: a1845ec01e17d55e3da5df40600892972afb45e1
Yoga: 1cff0cfbf14d209e21b2f3b023de56f24b43b6fd
Yoga: deb1f9afd79094c9e76d19fa2e312428a74ba934

PODFILE CHECKSUM: 07eddbe098f0e50aff590a91207f692788a9fe4c

Expand Down
Loading
Loading