This commit is contained in:
SrGooglo 2025-02-19 16:32:52 +00:00
parent 6eef3480b1
commit f0c9bbef3e

View File

@ -1,80 +1,84 @@
import React from "react" import React from "react"
function deepUnproxy(obj) { function deepUnproxy(obj) {
if (Array.isArray(obj)) { if (Array.isArray(obj)) {
obj = [...obj] obj = [...obj]
} else { } else {
obj = Object.assign({}, obj) obj = Object.assign({}, obj)
} }
for (let key in obj) { for (let key in obj) {
if (obj[key] && typeof obj[key] === "object") { if (obj[key] && typeof obj[key] === "object") {
obj[key] = deepUnproxy(obj[key]) obj[key] = deepUnproxy(obj[key])
} }
} }
return obj return obj
} }
export const usePlayerStateContext = (updater) => { export const usePlayerStateContext = (updater) => {
const [state, setState] = React.useState({ ...app.cores.player.state }) const [state, setState] = React.useState({ ...app.cores.player.state })
function handleStateChange(newState) { function handleStateChange(newState) {
newState = deepUnproxy(newState) newState = deepUnproxy(newState)
// check if any changes happened // check if any changes happened
if (newState === state) { if (newState === state) {
return return
} }
setState(newState) setState(newState)
if (typeof updater === "function") { if (typeof updater === "function") {
updater(newState) updater(newState)
} }
} }
React.useEffect(() => { React.useEffect(() => {
handleStateChange(app.cores.player.state) handleStateChange(app.cores.player.state)
app.cores.player.eventBus().on("player.state.update", handleStateChange) app.cores.player.eventBus().on("player.state.update", handleStateChange)
return () => { return () => {
app.cores.player.eventBus().off("player.state.update", handleStateChange) app.cores.player
} .eventBus()
}, []) .off("player.state.update", handleStateChange)
}
}, [])
return [state, setState] return [state, setState]
} }
export const Context = React.createContext({}) export const Context = React.createContext({})
export class WithPlayerContext extends React.Component { export class WithPlayerContext extends React.Component {
state = app.cores.player.state state = app.cores.player.state
events = { events = {
"player.state.update": (state) => { "player.state.update": (state) => {
this.setState(state) this.setState(state)
}, },
} }
componentDidMount() { componentDidMount() {
for (const [event, handler] of Object.entries(this.events)) { for (const [event, handler] of Object.entries(this.events)) {
app.cores.player.eventBus().on(event, handler) app.cores.player.eventBus().on(event, handler)
} }
} }
componentWillUnmount() { componentWillUnmount() {
for (const [event, handler] of Object.entries(this.events)) { for (const [event, handler] of Object.entries(this.events)) {
app.cores.player.eventBus().off(event, handler) app.cores.player.eventBus().off(event, handler)
} }
} }
render() { render() {
return <Context.Provider value={this.state}> return (
{this.props.children} <Context.Provider value={this.state}>
</Context.Provider> {this.props.children}
} </Context.Provider>
)
}
} }
export default WithPlayerContext export default WithPlayerContext