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" ;
@@ -27,44 +27,29 @@ interface LogoProps {
2727 className ?: string ;
2828}
2929
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 ;
30+ export default function InteractiveLogo ( { className } : LogoProps ) {
31+ const container = useRef < HTMLDivElement > ( null ) ;
32+ const [ player , setPlayer ] = useState < RufflePlayer | null > ( null ) ;
4033
41- constructor ( props : LogoProps ) {
42- super ( props ) ;
43-
44- this . container = React . createRef ( ) ;
45- this . state = {
46- player : null ,
47- } ;
48- }
34+ const removeRufflePlayer = ( ) => {
35+ player ?. remove ( ) ;
36+ setPlayer ( null ) ;
37+ } ;
4938
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 ) {
39+ const loadPlayer = ( ) => {
40+ if ( player ) {
5841 // Already loaded.
5942 return ;
6043 }
6144
62- this . player = ( window . RufflePlayer as PublicAPI ) ?. newest ( ) ?. createPlayer ( ) ;
45+ const rufflePlayer = ( window . RufflePlayer as PublicAPI )
46+ ?. newest ( )
47+ ?. createPlayer ( ) ;
6348
64- if ( this . player ) {
65- this . container . current ! . appendChild ( this . player ) ;
49+ if ( rufflePlayer ) {
50+ container . current ! . appendChild ( rufflePlayer ) ;
6651
67- this . player
52+ rufflePlayer
6853 . load ( {
6954 url : "/logo-anim.swf" ,
7055 autoplay : "on" ,
@@ -75,39 +60,33 @@ export default class InteractiveLogo extends React.Component<
7560 preferredRenderer : "canvas" ,
7661 } )
7762 . catch ( ( ) => {
78- this . removeRufflePlayer ( ) ;
63+ removeRufflePlayer ( ) ;
7964 } ) ;
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 ) ;
8368 }
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+ return ( ) => removeRufflePlayer ( ) ;
73+ } , [ ] ) ;
74+
75+ return (
76+ < >
77+ < Script
78+ src = "https://unpkg.com/@ruffle-rs/ruffle"
79+ onReady = { ( ) => loadPlayer ( ) }
80+ />
81+ < div ref = { container } className = { className } >
82+ < Image
83+ src = "/logo.svg"
84+ alt = "Ruffle Logo"
85+ className = { player ? classes . hidden : classes . staticLogo }
86+ width = "340"
87+ height = "110"
10088 />
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- }
89+ </ div >
90+ </ >
91+ ) ;
11392}
0 commit comments