1 | import { options } from 'preact';
|
2 | import { assign } from './util';
|
3 |
|
4 | let oldDiffHook = options._diff;
|
5 | options._diff = vnode => {
|
6 | if (vnode.type && vnode.type._forwarded && vnode.ref) {
|
7 | vnode.props.ref = vnode.ref;
|
8 | vnode.ref = null;
|
9 | }
|
10 | if (oldDiffHook) oldDiffHook(vnode);
|
11 | };
|
12 |
|
13 | export const REACT_FORWARD_SYMBOL =
|
14 | (typeof Symbol != 'undefined' &&
|
15 | Symbol.for &&
|
16 | Symbol.for('react.forward_ref')) ||
|
17 | 0xf47;
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | export function forwardRef(fn) {
|
27 |
|
28 |
|
29 |
|
30 | function Forwarded(props, ref) {
|
31 | let clone = assign({}, props);
|
32 | delete clone.ref;
|
33 | ref = props.ref || ref;
|
34 | return fn(
|
35 | clone,
|
36 | !ref || (typeof ref === 'object' && !('current' in ref)) ? null : ref
|
37 | );
|
38 | }
|
39 |
|
40 |
|
41 | Forwarded.$$typeof = REACT_FORWARD_SYMBOL;
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | Forwarded.render = Forwarded;
|
47 |
|
48 | Forwarded.prototype.isReactComponent = Forwarded._forwarded = true;
|
49 | Forwarded.displayName = 'ForwardRef(' + (fn.displayName || fn.name) + ')';
|
50 | return Forwarded;
|
51 | }
|