-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
[docs] State management #3905
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
[docs] State management #3905
Changes from 114 commits
Commits
Show all changes
121 commits
Select commit
Hold shift + click to select a range
4e3e30f
Pan gesture
m-bert 7ac164d
Merge branch 'next' into @mbert/docs-v3
m-bert 203131e
Finish (?) Pan
m-bert db99336
Tap
m-bert f01bd66
Long press
m-bert 5490439
Rotation
m-bert ded8083
Pinch
m-bert e38591c
Fling
m-bert f338fa7
Hover
m-bert 11c91a7
Native
m-bert 37d7438
Manual
m-bert a93970a
Fix path
m-bert d23e66b
Remove cache from workflow
m-bert 5c0b717
composition
m-bert f293949
Remove PanHandlerData
m-bert 34a93a5
Use correct HandlerData
m-bert f4847dc
Merge branch 'next' into @mbert/docs-v3
m-bert 87a1130
Merge branch 'next' into @mbert/docs-v3
m-bert b96d788
Bye bye API 2
m-bert cf3f810
Fix hover
m-bert 944d689
Fix old links
m-bert d2958e0
Another links
m-bert d8eaaeb
remove useless prop
m-bert b2a373e
Add warning to requireToFail
m-bert d3c7893
One composition
m-bert e96349e
Remove outdated info
m-bert cd7c0d6
Remove SharedValue notes
m-bert ca2d46a
rephrase exclusive
m-bert 1811c9c
Other composition updates
m-bert 4fa234f
Change reference to example
m-bert fb8e2ef
Change reference to example yet again (manual)
m-bert 47da2df
Tapp
m-bert c8a4a76
Native on web
m-bert 5c3d918
Add missing pan properties
m-bert a8c6ccc
Simplify pinch example
m-bert 421d247
scaleChange
m-bert b14eadf
Add pan headers
m-bert b769862
Rotation gesture changes
m-bert 49b1d3e
Test id correct prop name
m-bert 41f7a4f
Add SharedValue info
m-bert 1fb9b51
Add missing shared value info to long press
m-bert 6d2da5a
Remove secondary headers
m-bert f90b378
Change order
m-bert b4cd005
Merge branch 'next' into @mbert/docs-detector
m-bert 5255e4a
Detecor page
m-bert 205c0a8
Gesture detector
m-bert 4c53b94
Change ordering
m-bert 42b04b1
Update links
m-bert 03501dc
Other links
m-bert e1fae87
Merge branch 'next' into @mbert/docs-detector
m-bert c7de4c6
Initial events page
m-bert 285fc72
Switch to vis.js
m-bert c867d7c
Adjust resize
m-bert ea4b04f
Add theme-common to package.json
m-bert 0f7586f
Rename section
m-bert 1b25b59
Bring back prism
m-bert eb83d43
Add states table
m-bert 33a85a3
Add CodeWithDetails
m-bert 35d2da7
Do not mention states outside dedicated page
m-bert e06ad48
Add note about complementary callbacks
m-bert 5f998f4
Add StateManager page
m-bert 59fd8df
Merge branch 'next' into @mbert/docs-detector
m-bert 1c20ea0
Merge branch '@mbert/docs-detector' into @mbert/docs-state-manager
m-bert 764b1d8
Update manual quick guide
m-bert f6145db
Change number of array elements in example
m-bert b920df7
Split states
m-bert 1c5ae3d
Update margin in flow chart
m-bert aa13ec4
Improve CollapsibleCode component
m-bert e250c68
Use CollapsibleCode
m-bert 1c4e142
Update variable
m-bert 2afec03
Remove old state manager guide
m-bert b54932a
Fix details component
m-bert 66ddc2b
Remove manual guide
m-bert 404e465
Fix broken link
m-bert fc3fcd2
Remove CodeWithTypes
m-bert cc3f815
Move autoworkletization
m-bert fbfb9fc
Update autoworkletization
m-bert cc46156
Remove bold
m-bert 68103e4
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert e58292d
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert ef9235b
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert a58babb
Review suggestions #1
m-bert 9939cfd
Review suggestions 2
m-bert d7e38d4
Improve CollapsibleCode component
m-bert af2b3bf
Interaction with Reanimated
m-bert 65c4bf5
Add Animated
m-bert 79a2ff3
Merge branch 'next' into @mbert/docs-detector
m-bert bc735eb
Add use cases
m-bert d157b24
Move reusing gestures to redbox
m-bert f70bf74
Update packages/docs-gesture-handler/docs/fundamentals/animated-inter…
m-bert 37e99bf
Update packages/docs-gesture-handler/docs/fundamentals/animated-inter…
m-bert bf6061a
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert 72f7eb4
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert 51be282
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert f69643e
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert dc19675
Update packages/docs-gesture-handler/docs/fundamentals/reanimated-int…
m-bert 4ec4ebb
Update packages/docs-gesture-handler/docs/fundamentals/gesture-detect…
m-bert dbaae0e
Turning off reanimated
m-bert 7157558
Merge branch '@mbert/docs-detector' of github.com:software-mansion/re…
m-bert 4f8e6dc
Mention all detectors
m-bert 16eb6cb
Merge branch 'next' into @mbert/docs-detector
m-bert d8cd247
Merge branch '@mbert/docs-detector' into @mbert/docs-state-manager
m-bert 268a9b1
Update examples
m-bert d671e4f
Update packages/docs-gesture-handler/docs/gestures/use-rotation-gestu…
m-bert 481e165
Update packages/docs-gesture-handler/docs/gestures/use-pinch-gesture.mdx
m-bert bb13f99
Merge branch '@mbert/docs-state-manager' of github.com:software-mansi…
m-bert f64e319
Review 1
m-bert d39af79
Update packages/docs-gesture-handler/docs/fundamentals/reanimated-int…
m-bert 2df4f82
Update packages/docs-gesture-handler/docs/fundamentals/reanimated-int…
m-bert 67faf23
Merge branch '@mbert/docs-detector' into @mbert/docs-state-manager
m-bert 63d78f4
Merge branch 'next' into @mbert/docs-state-manager
m-bert 9ad871b
Update table
m-bert c0afea2
Add tip
m-bert d02cd15
Merge branch 'next' into @mbert/docs-state-manager
m-bert bd65c24
Rephrase tip
m-bert efea146
Mention didSucceed
m-bert 2cd0bb5
Rephrase onUpdate
m-bert 8cfc145
Merge branch 'next' into @mbert/docs-state-manager
m-bert aa9186a
Update packages/docs-gesture-handler/docs/under-the-hood/state.md
m-bert 8e580e4
Copilot review
m-bert 072804b
Merge branch 'next' into @mbert/docs-state-manager
m-bert File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
181 changes: 181 additions & 0 deletions
181
packages/docs-gesture-handler/docs/fundamentals/callbacks-events.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,181 @@ | ||
| --- | ||
| id: callbacks-events | ||
| title: Gesture callbacks & events | ||
| sidebar_label: Gesture callbacks & events | ||
| sidebar_position: 7 | ||
| --- | ||
|
|
||
| import {GestureEventFlowChart, TouchEventFlowChart} from '@site/src/examples/CallbacksFlowCharts' | ||
| import CollapsibleCode from '@site/src/components/CollapsibleCode'; | ||
|
|
||
| At any given time, each handler instance has an assigned [state](/docs/under-the-hood/state) that can change when new touch events occur or can be forced to change by the touch system in certain circumstances. You can hook into state transitions using specific [gesture callbacks](#callbacks). | ||
|
|
||
| When `Reanimated` is installed, all callbacks are automatically workletized. For more details, refer to the [Integration with Reanimated](/docs/fundamentals/reanimated-interactions#automatic-workletization-of-gesture-callbacks) section. | ||
|
|
||
| ## Callbacks flow | ||
|
|
||
| ### GestureEvent callbacks | ||
|
|
||
| <GestureEventFlowChart /> | ||
|
|
||
| Note that some of these callbacks are complementary: | ||
|
akwasniewski marked this conversation as resolved.
|
||
|
|
||
| - if `onBegin` was called, it is guaranteed that `onFinalize` will be called later. | ||
| - if `onActivate` was called, it is guaranteed that `onDeactivate` will be called later. | ||
|
|
||
| ### TouchEvent callbacks | ||
|
|
||
| <TouchEventFlowChart /> | ||
|
|
||
| ## Callbacks | ||
|
|
||
| ### onBegin | ||
|
|
||
| ```ts | ||
| onBegin: (event: GestureEvent<HandlerData>) => void | ||
| ``` | ||
|
|
||
| Called when a handler begins to recognize gestures. If `onBegin` was called, it is guaranteed that `onFinalize` will be called later. | ||
|
akwasniewski marked this conversation as resolved.
|
||
|
|
||
| ### onActivate | ||
|
|
||
| ```ts | ||
| onActivate: (event: GestureEvent<HandlerData>) => void | ||
| ``` | ||
|
|
||
| Called when activation criteria for handler are met. If `onActivate` was called, it is guaranteed that `onDeactivate` will be called later. | ||
|
akwasniewski marked this conversation as resolved.
|
||
|
|
||
| ### onUpdate | ||
|
|
||
| ```ts | ||
| onUpdate: (event: GestureEvent<HandlerData>) => void | ||
| ``` | ||
|
|
||
| Called every time a gesture is updated after it has started. | ||
|
j-piasecki marked this conversation as resolved.
Outdated
akwasniewski marked this conversation as resolved.
Outdated
|
||
|
|
||
| ### onDeactivate | ||
|
|
||
| ```ts | ||
| onDeactivate: (event: GestureEvent<HandlerData>, didSucceed: boolean) => void | ||
| ``` | ||
|
|
||
| Called after when handler stops recognizing gestures, but only if handler activated. It is called before `onFinalize`. If the handler was interrupted, the `didSucceed` argument is set to `false`. Otherwise it is set to `true`. | ||
|
|
||
| ### onFinalize | ||
|
|
||
| ```ts | ||
| onFinalize: (event: GestureEvent<HandlerData>, didSucceed: boolean) => void | ||
| ``` | ||
|
|
||
| Called when handler stops recognizing gestures. If handler managed to activate, the `didSucceed` argument is set to `true` and `onFinalize` will be called right after `onDeactivate`. Otherwise it is set to `false`. | ||
|
|
||
| ### onTouchesDown | ||
|
|
||
| ```ts | ||
| onTouchesDown: (event: GestureTouchEvent) => void | ||
| ``` | ||
|
|
||
| Called when new pointers are placed on the screen. It may carry information about more than one pointer because the events are batched. | ||
|
|
||
| ### onTouchesMove | ||
|
|
||
| ```ts | ||
| onTouchesMove: (event: GestureTouchEvent) => void | ||
| ``` | ||
|
|
||
| Called when pointers are moved on the screen. It may carry information about more than one pointer because the events are batched. | ||
|
|
||
| ### onTouchesUp | ||
|
|
||
| ```ts | ||
| onTouchesUp: (event: GestureTouchEvent) => void | ||
| ``` | ||
|
|
||
| Called when pointers are lifted from the screen. It may carry information about more than one pointer because the events are batched. | ||
|
|
||
| ### onTouchesCancelled | ||
|
|
||
| ```ts | ||
| onTouchesCancelled: (event: GestureTouchEvent) => void | ||
| ``` | ||
|
|
||
| Called when there will be no more information about this pointer. It may be called because the gesture has ended or was interrupted. It may carry information about more than one pointer because the events are batched. | ||
|
|
||
| ## Events | ||
|
|
||
| ### GestureEvent | ||
|
|
||
| <CollapsibleCode | ||
| label="Show composed types definitions" | ||
| expandedLabel="Hide composed types definitions" | ||
| lineBounds={[0, 4]} | ||
| src={` | ||
| export type GestureEvent<HandlerData> = { | ||
| handlerTag: number; | ||
| numberOfPointers: number; | ||
| pointerType: PointerType; | ||
| } & HandlerData; | ||
|
|
||
| export enum PointerType { | ||
| TOUCH, | ||
| STYLUS, | ||
| MOUSE, | ||
| KEY, | ||
| OTHER, | ||
| } | ||
| `}/> | ||
|
|
||
| `GestureEvent` contains properties common to all gestures (`handlerTag`, `numberOfPointers`, `pointerType`) along with gesture-specific data defined in each gesture's documentation. | ||
|
|
||
| ### TouchEvent | ||
|
|
||
| <CollapsibleCode | ||
| label="Show composed types definitions" | ||
| expandedLabel="Hide composed types definitions" | ||
| lineBounds={[0, 8]} | ||
| src={` | ||
| export type GestureTouchEvent = { | ||
| handlerTag: number; | ||
| numberOfTouches: number; | ||
| state: State; | ||
| eventType: TouchEventType; | ||
| allTouches: TouchData[]; | ||
| changedTouches: TouchData[]; | ||
| pointerType: PointerType; | ||
| }; | ||
|
|
||
| export const State = { | ||
| UNDETERMINED: 0, | ||
| FAILED: 1, | ||
| BEGAN: 2, | ||
| CANCELLED: 3, | ||
| ACTIVE: 4, | ||
| END: 5, | ||
| } as const; | ||
|
|
||
| export const TouchEventType = { | ||
| UNDETERMINED: 0, | ||
| TOUCHES_DOWN: 1, | ||
| TOUCHES_MOVE: 2, | ||
| TOUCHES_UP: 3, | ||
| TOUCHES_CANCEL: 4, | ||
| } as const; | ||
|
|
||
| export const TouchEventType = { | ||
| UNDETERMINED: 0, | ||
| TOUCHES_DOWN: 1, | ||
| TOUCHES_MOVE: 2, | ||
| TOUCHES_UP: 3, | ||
| TOUCHES_CANCEL: 4, | ||
| } as const; | ||
|
|
||
|
m-bert marked this conversation as resolved.
Outdated
|
||
| export enum PointerType { | ||
| TOUCH, | ||
| STYLUS, | ||
| MOUSE, | ||
| KEY, | ||
| OTHER, | ||
| } | ||
| `}/> | ||
|
|
||
| `TouchEvent` carries information about raw touch events, like touching the screen or moving the finger. | ||
160 changes: 160 additions & 0 deletions
160
packages/docs-gesture-handler/docs/fundamentals/state-manager.mdx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,160 @@ | ||
| --- | ||
| id: state-manager | ||
| title: State manager | ||
| sidebar_label: State manager | ||
| sidebar_position: 6 | ||
| --- | ||
|
|
||
| import CollapsibleCode from '@site/src/components/CollapsibleCode'; | ||
|
|
||
| RNGH3 allows to manually control gestures lifecycle by using `GestureStateManager`. | ||
|
|
||
| ## State management | ||
|
|
||
| Manual state management is based on `handlerTag`. There are two ways of manual state control. | ||
|
|
||
| ### Inside gesture definition | ||
|
|
||
| If you want to manipulate gesture's state in its callbacks, you can get `handlerTag` from event parameter. | ||
|
|
||
| <CollapsibleCode | ||
| label="Show full example" | ||
| expandedLabel="Hide full example" | ||
| lineBounds={[9, 17]} | ||
| src={` | ||
|
m-bert marked this conversation as resolved.
Outdated
|
||
| import { StyleSheet, View } from 'react-native'; | ||
| import { | ||
| GestureDetector, | ||
| GestureHandlerRootView, | ||
| GestureStateManager, | ||
| useLongPressGesture, | ||
| } from 'react-native-gesture-handler'; | ||
|
|
||
| export default function App() { | ||
| const longPress = useLongPressGesture({ | ||
| onTouchesDown: (e) => { | ||
| // highlight-next-line | ||
| GestureStateManager.activate(e.handlerTag); | ||
| }, | ||
| onActivate: () => { | ||
| console.log('LongPress activated!'); | ||
| }, | ||
| }); | ||
|
|
||
| return ( | ||
| <GestureHandlerRootView style={styles.container}> | ||
| <GestureDetector gesture={longPress}> | ||
| <View style={styles.box} /> | ||
| </GestureDetector> | ||
| </GestureHandlerRootView> | ||
| ); | ||
| } | ||
|
|
||
| const styles = StyleSheet.create({ | ||
| container: { | ||
| flex: 1, | ||
| alignItems: 'center', | ||
| justifyContent: 'space-around', | ||
| }, | ||
|
|
||
| box: { | ||
| width: 150, | ||
| height: 150, | ||
| backgroundColor: 'blue', | ||
| }, | ||
| }); | ||
| `}/> | ||
|
|
||
|
|
||
| ### Outside gesture definition | ||
|
|
||
| If you want to control gesture lifecycle outside of it, you can use `handlerTag` from created gesture object. | ||
|
|
||
| <CollapsibleCode | ||
| label="Show full example" | ||
| expandedLabel="Hide full example" | ||
| lineBounds={[10, 21]} | ||
| src={` | ||
|
m-bert marked this conversation as resolved.
Outdated
|
||
| import { StyleSheet, View } from 'react-native'; | ||
| import { | ||
| GestureDetector, | ||
| GestureHandlerRootView, | ||
| GestureStateManager, | ||
| useLongPressGesture, | ||
| usePanGesture, | ||
| } from 'react-native-gesture-handler'; | ||
|
|
||
| export default function App() { | ||
| const pan = usePanGesture({ | ||
| onActivate: () => { | ||
| console.log('Pan activated!'); | ||
| }, | ||
| }); | ||
|
|
||
| const longPress = useLongPressGesture({ | ||
| onActivate: () => { | ||
| // highlight-next-line | ||
| GestureStateManager.activate(pan.handlerTag); | ||
| }, | ||
| }); | ||
|
|
||
| return ( | ||
| <GestureHandlerRootView style={styles.container}> | ||
| <GestureDetector gesture={longPress}> | ||
| <View style={styles.box} /> | ||
| </GestureDetector> | ||
| <GestureDetector gesture={pan}> | ||
| <View style={styles.box} /> | ||
| </GestureDetector> | ||
| </GestureHandlerRootView> | ||
| ); | ||
| } | ||
|
|
||
| const styles = StyleSheet.create({ | ||
| container: { | ||
| flex: 1, | ||
| alignItems: 'center', | ||
| justifyContent: 'space-around', | ||
| }, | ||
|
|
||
| box: { | ||
| width: 150, | ||
| height: 150, | ||
| backgroundColor: 'blue', | ||
| }, | ||
| }); | ||
| `}/> | ||
|
|
||
| ## Methods | ||
|
|
||
| ### begin | ||
|
|
||
| ```tsx | ||
| begin: (handlerTag: number) => void; | ||
| ``` | ||
|
|
||
| Triggers [`onBegin`](/docs/fundamentals/callbacks-events#onbegin) callback on gesture with specified `handlerTag`. | ||
|
|
||
| ### activate | ||
|
|
||
| ```tsx | ||
| activate: (handlerTag: number) => void; | ||
| ``` | ||
|
|
||
| Triggers [`onActivate`](/docs/fundamentals/callbacks-events#onactivate) callback on gesture with specified `handlerTag`. | ||
|
|
||
| ### deactivate | ||
|
|
||
| ```tsx | ||
| deactivate: (handlerTag: number) => void; | ||
| ``` | ||
|
|
||
| If the gesture had activated, it triggers the [`onDeactivate`](/docs/fundamentals/callbacks-events#ondeactivate) callback. It also triggers the [`onFinalize`](/docs/fundamentals/callbacks-events#onfinalize) callback on gesture with the specified `handlerTag`. | ||
|
|
||
| ### fail | ||
|
|
||
| ```tsx | ||
| fail: (handlerTag: number) => void; | ||
| ``` | ||
|
|
||
| Triggers [`onFinalize`](/docs/fundamentals/callbacks-events#onfinalize) callback on gesture with specified `handlerTag`. If gesture had activated, it will also trigger [`onDeactivate`](/docs/fundamentals/callbacks-events#ondeactivate) callback. | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.