|
3 | 3 | import classNames from 'classnames'; |
4 | 4 | import { type Button as ButtonModule } from 'nhsuk-frontend'; |
5 | 5 | import { |
6 | | - createRef, |
7 | 6 | forwardRef, |
8 | 7 | useEffect, |
| 8 | + useImperativeHandle, |
| 9 | + useRef, |
9 | 10 | useState, |
10 | 11 | type ForwardedRef, |
11 | 12 | type MouseEvent, |
@@ -45,19 +46,22 @@ const ButtonComponent = forwardRef<HTMLButtonElement, ButtonProps>((props, forwa |
45 | 46 | ...rest |
46 | 47 | } = props; |
47 | 48 |
|
48 | | - const [moduleRef] = useState(() => forwardedRef || createRef<HTMLButtonElement>()); |
| 49 | + const moduleRef = useRef<HTMLButtonElement>(null); |
| 50 | + const importRef = useRef<Promise<ButtonModule | void>>(null); |
49 | 51 | const [instanceError, setInstanceError] = useState<Error>(); |
50 | 52 | const [instance, setInstance] = useState<ButtonModule>(); |
51 | 53 |
|
| 54 | + useImperativeHandle(forwardedRef, () => moduleRef.current!, [moduleRef]); |
| 55 | + |
52 | 56 | useEffect(() => { |
53 | | - if (!('current' in moduleRef) || !moduleRef.current || instance) { |
| 57 | + if (!moduleRef.current || importRef.current || instance) { |
54 | 58 | return; |
55 | 59 | } |
56 | 60 |
|
57 | | - import('nhsuk-frontend') |
| 61 | + importRef.current = import('nhsuk-frontend') |
58 | 62 | .then(({ Button }) => setInstance(new Button(moduleRef.current))) |
59 | 63 | .catch(setInstanceError); |
60 | | - }, [moduleRef, instance]); |
| 64 | + }, [moduleRef, importRef, instance]); |
61 | 65 |
|
62 | 66 | if (instanceError) { |
63 | 67 | throw instanceError; |
@@ -104,19 +108,22 @@ const ButtonLinkComponent = forwardRef<HTMLAnchorElement, ButtonLinkProps>( |
104 | 108 | ...rest |
105 | 109 | } = props; |
106 | 110 |
|
107 | | - const [moduleRef] = useState(() => forwardedRef || createRef<HTMLAnchorElement>()); |
| 111 | + const moduleRef = useRef<HTMLAnchorElement>(null); |
| 112 | + const importRef = useRef<Promise<ButtonModule | void>>(null); |
108 | 113 | const [instanceError, setInstanceError] = useState<Error>(); |
109 | 114 | const [instance, setInstance] = useState<ButtonModule>(); |
110 | 115 |
|
| 116 | + useImperativeHandle(forwardedRef, () => moduleRef.current!, [moduleRef]); |
| 117 | + |
111 | 118 | useEffect(() => { |
112 | | - if (!('current' in moduleRef) || !moduleRef.current || instance) { |
| 119 | + if (!moduleRef.current || importRef.current || instance) { |
113 | 120 | return; |
114 | 121 | } |
115 | 122 |
|
116 | | - import('nhsuk-frontend') |
| 123 | + importRef.current = import('nhsuk-frontend') |
117 | 124 | .then(({ Button }) => setInstance(new Button(moduleRef.current))) |
118 | 125 | .catch(setInstanceError); |
119 | | - }, [moduleRef, instance]); |
| 126 | + }, [moduleRef, importRef, instance]); |
120 | 127 |
|
121 | 128 | if (instanceError) { |
122 | 129 | throw instanceError; |
|
0 commit comments