about summary refs log tree commit diff
path: root/patches
diff options
context:
space:
mode:
authorHailey <me@haileyok.com>2024-04-11 15:20:38 -0700
committerGitHub <noreply@github.com>2024-04-11 15:20:38 -0700
commit4e517720030184ef8c003ffad9b3ca5100619d2e (patch)
tree81f5467bcb7c0a5eae02fe9c23158bb2e1ad59c6 /patches
parent740cd029d7162a936d16b427201eb8972e365b94 (diff)
downloadvoidsky-4e517720030184ef8c003ffad9b3ca5100619d2e.tar.zst
Make bio area scrollable on iOS (#2931)
* fix dampen logic

prevent ghost presses

handle refreshes, animations, and clamps

handle most cases for cancelling the scroll animation

handle animations

save point

simplify

remove unnecessary context

readme

apply offset on pan

find the RCTScrollView

send props, add native gesture recognizer

get the react tag

wrap the profile in context

create module

* fix swiping to go back

* remove debug

* use `findNodeHandle`

* create an expo module view

* port most of it to expo modules

* finish most of expomodules impl

* experiments

* remove refresh ability for now

* remove rn module

* changes

* cleanup a few issues

allow swipe back gesture

clean up types

always run animation if the final offset is < 0

separate logic

update patch readme

get the `RCTRefreshControl` working nicely

* gate new header

* organize
Diffstat (limited to 'patches')
-rw-r--r--patches/react-native+0.73.2.patch58
-rw-r--r--patches/react-native+0.73.2.patch.md12
2 files changed, 64 insertions, 6 deletions
diff --git a/patches/react-native+0.73.2.patch b/patches/react-native+0.73.2.patch
index 8db23da0c..db8b7da2d 100644
--- a/patches/react-native+0.73.2.patch
+++ b/patches/react-native+0.73.2.patch
@@ -1,11 +1,22 @@
+diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h
+index e9b330f..1ecdf0a 100644
+--- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h
++++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h
+@@ -16,4 +16,6 @@
+ @property (nonatomic, copy) RCTDirectEventBlock onRefresh;
+ @property (nonatomic, weak) UIScrollView *scrollView;
+ 
++- (void)forwarderBeginRefreshing;
++
+ @end
 diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m
-index b09e653..d290dab 100644
+index b09e653..4c32b31 100644
 --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m
 +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m
-@@ -198,6 +198,14 @@ - (void)refreshControlValueChanged
+@@ -198,9 +198,53 @@ - (void)refreshControlValueChanged
    [self setCurrentRefreshingState:super.refreshing];
    _refreshingProgrammatically = NO;
-
+ 
 +  if (@available(iOS 17.4, *)) {
 +    if (_currentRefreshingState) {
 +      UIImpactFeedbackGenerator *feedbackGenerator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight];
@@ -16,4 +27,43 @@ index b09e653..d290dab 100644
 +
    if (_onRefresh) {
      _onRefresh(nil);
-   }
\ No newline at end of file
+   }
+ }
+ 
++/*
++ This method is used by Bluesky's ExpoScrollForwarder. This allows other React Native
++ libraries to perform a refresh of a scrollview and access the refresh control's onRefresh
++ function.
++ */
++- (void)forwarderBeginRefreshing
++{
++  _refreshingProgrammatically = NO;
++  
++  [self sizeToFit];
++  
++  if (!self.scrollView) {
++    return;
++  }
++  
++  UIScrollView *scrollView = (UIScrollView *)self.scrollView;
++  
++  [UIView animateWithDuration:0.3
++    delay:0
++    options:UIViewAnimationOptionBeginFromCurrentState
++    animations:^(void) {
++      // Whenever we call this method, the scrollview will always be at a position of
++      // -130 or less. Scrolling back to -65 simulates the default behavior of RCTRefreshControl
++      [scrollView setContentOffset:CGPointMake(0, -65)];
++    }
++    completion:^(__unused BOOL finished) {
++      [super beginRefreshing];
++      [self setCurrentRefreshingState:super.refreshing];
++    
++      if (self->_onRefresh) {
++        self->_onRefresh(nil);
++      }
++    }
++  ];
++}
++
+ @end
diff --git a/patches/react-native+0.73.2.patch.md b/patches/react-native+0.73.2.patch.md
index 7f70baf2f..9c93aee5c 100644
--- a/patches/react-native+0.73.2.patch.md
+++ b/patches/react-native+0.73.2.patch.md
@@ -1,5 +1,13 @@
-# RefreshControl Patch
+# ***This second part of this patch is load bearing, do not remove.***
+
+## RefreshControl Patch - iOS 17.4 Haptic Regression
 
 Patching `RCTRefreshControl.mm` temporarily to play an impact haptic on refresh when using iOS 17.4 or higher. Since
 17.4, there has been a regression somewhere causing haptics to not play on iOS on refresh. Should monitor for an update
-in the RN repo: https://github.com/facebook/react-native/issues/43388
\ No newline at end of file
+in the RN repo: https://github.com/facebook/react-native/issues/43388
+
+## RefreshControl Path - ScrollForwarder
+
+Patching `RCTRefreshControl.m` and `RCTRefreshControl.h` to add a new `forwarderBeginRefreshing` method to the class.
+This method is used by `ExpoScrollForwarder` to initiate a refresh of the underlying `UIScrollView` from inside that
+module.