1
1
"use client" ;
2
2
3
- import React from "react" ;
3
+ import React , { useEffect , useRef , useState } from "react" ;
4
4
import Image from "next/image" ;
5
5
import Script from "next/script" ;
6
6
import classes from "../app/index.module.css" ;
7
+ import { t } from "@/app/translate" ;
7
8
8
9
declare global {
9
10
interface Window {
@@ -27,44 +28,28 @@ interface LogoProps {
27
28
className ?: string ;
28
29
}
29
30
30
- interface LogoState {
31
- player : RufflePlayer | null ;
32
- }
33
-
34
- export default class InteractiveLogo extends React . Component <
35
- LogoProps ,
36
- LogoState
37
- > {
38
- private readonly container : React . RefObject < HTMLDivElement > ;
39
- private player : RufflePlayer | null = null ;
31
+ export default function InteractiveLogo ( { className } : LogoProps ) {
32
+ const container = useRef < HTMLDivElement > ( null ) ;
33
+ const [ player , setPlayer ] = useState < RufflePlayer | null > ( null ) ;
40
34
41
- constructor ( props : LogoProps ) {
42
- super ( props ) ;
43
-
44
- this . container = React . createRef ( ) ;
45
- this . state = {
46
- player : null ,
47
- } ;
48
- }
35
+ const removeRufflePlayer = ( ) => {
36
+ player ?. remove ( ) ;
37
+ setPlayer ( null ) ;
38
+ } ;
49
39
50
- private removeRufflePlayer ( ) {
51
- this . player ?. remove ( ) ;
52
- this . player = null ;
53
- this . setState ( { player : null } ) ;
54
- }
55
-
56
- private load ( ) {
57
- if ( this . player ) {
58
- // Already loaded.
40
+ const loadPlayer = ( ) => {
41
+ if ( player ) {
59
42
return ;
60
43
}
61
44
62
- this . player = ( window . RufflePlayer as PublicAPI ) ?. newest ( ) ?. createPlayer ( ) ;
45
+ const rufflePlayer = ( window . RufflePlayer as PublicAPI )
46
+ ?. newest ( )
47
+ ?. createPlayer ( ) ;
63
48
64
- if ( this . player ) {
65
- this . container . current ! . appendChild ( this . player ) ;
49
+ if ( rufflePlayer ) {
50
+ container . current ! . appendChild ( rufflePlayer ) ;
66
51
67
- this . player
52
+ rufflePlayer
68
53
. load ( {
69
54
url : "/logo-anim.swf" ,
70
55
autoplay : "on" ,
@@ -75,39 +60,34 @@ export default class InteractiveLogo extends React.Component<
75
60
preferredRenderer : "canvas" ,
76
61
} )
77
62
. catch ( ( ) => {
78
- this . removeRufflePlayer ( ) ;
63
+ removeRufflePlayer ( ) ;
79
64
} ) ;
80
- this . player . style . width = "100%" ;
81
- this . player . style . height = "100%" ;
82
- this . setState ( { player : this . player } ) ;
65
+ rufflePlayer . style . width = "100%" ;
66
+ rufflePlayer . style . height = "100%" ;
67
+ setPlayer ( rufflePlayer ) ;
83
68
}
84
- }
85
-
86
- componentDidMount ( ) {
87
- this . load ( ) ;
88
- }
89
-
90
- componentWillUnmount ( ) {
91
- this . removeRufflePlayer ( ) ;
92
- }
93
-
94
- render ( ) {
95
- return (
96
- < >
97
- < Script
98
- src = "https://unpkg.com/@ruffle-rs/ruffle"
99
- onReady = { ( ) => this . load ( ) }
69
+ } ;
70
+
71
+ useEffect ( ( ) => {
72
+ loadPlayer ( ) ;
73
+ return ( ) => removeRufflePlayer ( ) ;
74
+ } , [ ] ) ;
75
+
76
+ return (
77
+ < >
78
+ < Script
79
+ src = "https://unpkg.com/@ruffle-rs/ruffle"
80
+ onReady = { ( ) => loadPlayer ( ) }
81
+ />
82
+ < div ref = { container } className = { className } >
83
+ < Image
84
+ src = "/logo.svg"
85
+ alt = { t ( "logo.alt-tag" ) }
86
+ className = { player ? classes . hidden : classes . staticLogo }
87
+ width = "340"
88
+ height = "110"
100
89
/>
101
- < div ref = { this . container } className = { this . props . className } >
102
- < Image
103
- src = "/logo.svg"
104
- alt = "Ruffle Logo"
105
- className = { this . state . player ? classes . hidden : classes . staticLogo }
106
- width = "340"
107
- height = "110"
108
- />
109
- </ div >
110
- </ >
111
- ) ;
112
- }
90
+ </ div >
91
+ </ >
92
+ ) ;
113
93
}
0 commit comments