11"use client" ;
22
3- import React from "react" ;
3+ import React , { useEffect , useRef , useState } from "react" ;
44import Image from "next/image" ;
55import Script from "next/script" ;
66import classes from "../app/index.module.css" ;
7+ import { t } from "@/app/translate" ;
78
89declare global {
910 interface Window {
@@ -31,40 +32,26 @@ interface LogoState {
3132 player : RufflePlayer | null ;
3233}
3334
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 ;
35+ export default function InteractiveLogo ( { className } : LogoProps ) {
36+ const container = useRef < HTMLDivElement > ( null ) ;
37+ const [ player , setPlayer ] = useState < RufflePlayer | null > ( null ) ;
4038
41- constructor ( props : LogoProps ) {
42- super ( props ) ;
43-
44- this . container = React . createRef ( ) ;
45- this . state = {
46- player : null ,
47- } ;
48- }
49-
50- private removeRufflePlayer ( ) {
51- this . player ?. remove ( ) ;
52- this . player = null ;
53- this . setState ( { player : null } ) ;
39+ const removeRufflePlayer = ( ) => {
40+ player ?. remove ( ) ;
41+ setPlayer ( null ) ;
5442 }
5543
56- private load ( ) {
57- if ( this . player ) {
58- // Already loaded.
44+ const loadPlayer = ( ) => {
45+ if ( player ) {
5946 return ;
6047 }
6148
62- this . player = ( window . RufflePlayer as PublicAPI ) ?. newest ( ) ?. createPlayer ( ) ;
49+ const rufflePlayer = ( window . RufflePlayer as PublicAPI ) ?. newest ( ) ?. createPlayer ( ) ;
6350
64- if ( this . player ) {
65- this . container . current ! . appendChild ( this . player ) ;
51+ if ( rufflePlayer ) {
52+ container . current ! . appendChild ( rufflePlayer ) ;
6653
67- this . player
54+ rufflePlayer
6855 . load ( {
6956 url : "/logo-anim.swf" ,
7057 autoplay : "on" ,
@@ -75,39 +62,34 @@ export default class InteractiveLogo extends React.Component<
7562 preferredRenderer : "canvas" ,
7663 } )
7764 . catch ( ( ) => {
78- this . removeRufflePlayer ( ) ;
65+ removeRufflePlayer ( ) ;
7966 } ) ;
80- this . player . style . width = "100%" ;
81- this . player . style . height = "100%" ;
82- this . setState ( { player : this . player } ) ;
67+ rufflePlayer . style . width = "100%" ;
68+ rufflePlayer . style . height = "100%" ;
69+ setPlayer ( rufflePlayer ) ;
8370 }
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 ( ) }
71+ } ;
72+
73+ useEffect ( ( ) => {
74+ loadPlayer ( ) ;
75+ return ( ) => removeRufflePlayer ( ) ;
76+ } , [ ] ) ;
77+
78+ return (
79+ < >
80+ < Script
81+ src = "https://unpkg.com/@ruffle-rs/ruffle"
82+ onReady = { ( ) => loadPlayer ( ) }
10083 />
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- }
84+ < div ref = { container } className = { className } >
85+ < Image
86+ src = "/logo.svg"
87+ alt = { t ( "logo.alt-tag" ) }
88+ className = { player ? classes . hidden : classes . staticLogo }
89+ width = "340"
90+ height = "110"
91+ />
92+ </ div >
93+ </ >
94+ ) ;
11395}
0 commit comments