/
index.tsx
72 lines (65 loc) 路 1.81 KB
/
index.tsx
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
import { Fireworks as FireworksJs } from 'fireworks-js'
import type { FireworksHandlers, FireworksOptions } from 'fireworks-js'
import type { ComponentChildren } from 'preact'
import React from 'preact/compat'
import { useEffect, useImperativeHandle, useRef } from 'preact/hooks'
interface FireworksProps extends React.HTMLAttributes<HTMLDivElement> {
children?: ComponentChildren
options?: FireworksOptions
autostart?: boolean
}
const Fireworks = React.forwardRef<FireworksHandlers, FireworksProps>(
({ children, options, autostart = true, ...rest }, ref) => {
const container = useRef<HTMLDivElement>(null)
const fireworks = useRef<FireworksJs | null>(null)
useImperativeHandle(ref, () => ({
get isRunning() {
return fireworks.current!.isRunning
},
start() {
fireworks.current!.start()
},
stop() {
fireworks.current!.stop()
},
async waitStop() {
await fireworks.current!.waitStop()
},
pause() {
fireworks.current!.pause()
},
clear() {
fireworks.current!.clear()
},
updateOptions(options) {
fireworks.current!.updateOptions(options)
},
updateSize(size) {
fireworks.current!.updateSize(size)
},
updateBoundaries(boundaries) {
fireworks.current!.updateBoundaries(boundaries)
}
}))
useEffect(() => {
fireworks.current = new FireworksJs(container.current!, options)
if (autostart) {
fireworks.current.start()
}
return () => {
fireworks.current!.stop()
}
}, [])
return (
<div
ref={container}
{...rest}
>
{children}
</div>
)
}
)
export { Fireworks }
export default Fireworks
export type { FireworksProps, FireworksHandlers, FireworksOptions }