Skip to content

Commit

Permalink
Pressability: Create usePressability Hook
Browse files Browse the repository at this point in the history
Summary:
Creates `usePressability`, a hook to simplify using `Pressability` from functional components.

Changelog:
[Internal]

Reviewed By: yungsters

Differential Revision: D18742613

fbshipit-source-id: 55cf48ad60a16a6a5c2c3fa2785f61f784a46b45
  • Loading branch information
elicwhite authored and facebook-github-bot committed Jan 28, 2020
1 parent 4e31fbd commit 4bbbe6a
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Libraries/Pressability/Pressability.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export type PressabilityConfig = $ReadOnly<{|
onStartShouldSetResponder_DEPRECATED?: ?() => boolean,
|}>;

type EventHandlers = $ReadOnly<{|
export type EventHandlers = $ReadOnly<{|
onBlur: (event: BlurEvent) => void,
onClick: (event: PressEvent) => void,
onFocus: (event: FocusEvent) => void,
Expand Down
43 changes: 43 additions & 0 deletions Libraries/Pressability/usePressability.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/

'use strict';

import Pressability, {
type EventHandlers,
type PressabilityConfig,
} from './Pressability.js';
import {useEffect, useRef} from 'react';

export default function usePressability(
config: PressabilityConfig,
): EventHandlers {
const pressabilityRef = useRef<?Pressability>(null);
if (pressabilityRef.current == null) {
pressabilityRef.current = new Pressability(config);
}
const pressability = pressabilityRef.current;

// On the initial mount, this is a no-op. On updates, `pressability` will be
// re-configured to use the new configuration.
useEffect(() => {
pressability.configure(config);
}, [config, pressability]);

// On unmount, reset pending state and timers inside `pressability`. This is
// a separate effect because we do not want to reset when `config` changes.
useEffect(() => {
return () => {
pressability.reset();
};
}, [pressability]);

return pressability.getEventHandlers();
}

0 comments on commit 4bbbe6a

Please sign in to comment.