-
Notifications
You must be signed in to change notification settings - Fork 24.2k
/
ImageInjection.js
87 lines (72 loc) · 2.52 KB
/
ImageInjection.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow strict-local
*/
import type {
AbstractImageAndroid,
AbstractImageIOS,
Image as ImageComponent,
} from './ImageTypes.flow';
import useMergeRefs from '../Utilities/useMergeRefs';
import * as React from 'react';
import {useRef} from 'react';
type ImageComponentDecorator = (AbstractImageAndroid => AbstractImageAndroid) &
(AbstractImageIOS => AbstractImageIOS);
let injectedImageComponentDecorator: ?ImageComponentDecorator;
export function unstable_setImageComponentDecorator(
imageComponentDecorator: ?ImageComponentDecorator,
): void {
injectedImageComponentDecorator = imageComponentDecorator;
}
export function unstable_getImageComponentDecorator(): ?ImageComponentDecorator {
return injectedImageComponentDecorator;
}
type ImageInstance = React.ElementRef<ImageComponent>;
type ImageAttachedCallback = (
imageInstance: ImageInstance,
) => void | (() => void);
const imageAttachedCallbacks = new Set<ImageAttachedCallback>();
export function unstable_registerImageAttachedCallback(
callback: ImageAttachedCallback,
): void {
imageAttachedCallbacks.add(callback);
}
export function unstable_unregisterImageAttachedCallback(
callback: ImageAttachedCallback,
): void {
imageAttachedCallbacks.delete(callback);
}
export function useWrapRefWithImageAttachedCallbacks(
forwardedRef: React.RefSetter<ImageInstance>,
): React.RefSetter<ImageInstance> {
const pendingCleanupCallbacks = useRef<Array<() => void>>([]);
const imageAttachedCallbacksRef =
useRef<?(node: ImageInstance | null) => void>(null);
if (imageAttachedCallbacksRef.current == null) {
imageAttachedCallbacksRef.current = (node: ImageInstance | null): void => {
if (node == null) {
if (pendingCleanupCallbacks.current.length > 0) {
pendingCleanupCallbacks.current.forEach(cb => cb());
pendingCleanupCallbacks.current = [];
}
} else {
imageAttachedCallbacks.forEach(imageAttachedCallback => {
const maybeCleanupCallback = imageAttachedCallback(node);
if (maybeCleanupCallback != null) {
pendingCleanupCallbacks.current.push(maybeCleanupCallback);
}
});
}
};
}
// `useMergeRefs` returns a stable ref if its arguments don't change.
return useMergeRefs<ImageInstance>(
forwardedRef,
imageAttachedCallbacksRef.current,
);
}