Set title and convert all class component to functional #4

Merged
torjus merged 6 commits from feature/set-title into master 2023-12-05 02:22:23 +00:00
2 changed files with 43 additions and 73 deletions
Showing only changes of commit 03a5fb5497 - Show all commits

View File

@ -1,92 +1,61 @@
import { createRoot } from "react-dom/client"; import { createRoot } from "react-dom/client";
import React from "react";
import { Menu } from "./menu"; import { Menu } from "./menu";
import { createContext, useState } from "react"; import { createContext, useEffect, useState } from "react";
import { MediaContainer } from "./media"; import { MediaContainer } from "./media";
import { MinistreamApiClient } from "./api"; import { MinistreamApiClient } from "./api";
import React from "react";
type ThemeContextType = "light" | "dark"; interface AppProps {
api: MinistreamApiClient
const ThemeContext = createContext<ThemeContextType>("light");
type AppState = {
streamList: string[]
selectedStream: string | undefined
} }
type AppProps = {}
export class App extends React.Component<AppProps, AppState> { export function App({ api }: AppProps) {
apiClient: MinistreamApiClient const [streamList, setStreamList] = useState<string[]>([])
constructor(props: AppProps) { const [selectedStream, setSelectedStream] = useState<string | null>(null)
super(props)
this.state = { const updateSelect = (item: string) => {
streamList: [], setSelectedStream(item)
selectedStream: undefined
}
this.apiClient = new MinistreamApiClient()
this.updateSelect = this.updateSelect.bind(this)
} }
async componentDidMount(): Promise<void> { const updateStreamList = () => {
await this.updateStreamList() api.listStreams().then((list) => {
setInterval(() => { setStreamList(list)
this.updateStreamList() if (list.length != streamList.length) {
}, 10000) setStreamList(list)
}
async updateStreamList() {
const streams = await this.apiClient.listStreams()
const sortedStreams = streams.sort((a, b) => {
if (a > b) {
return -1
} else if (a < b) {
return 1
} }
return 0
})
if (sortedStreams.length != this.state.streamList.length) { if (!list.every((_, idx) => {
this.setStreamList(streams) return list[idx] === streamList[idx]
} })) {
setStreamList(list)
if (!sortedStreams.every((_, idx) => { }
return sortedStreams[idx] === this.state.streamList[idx]
})) {
this.setStreamList(streams)
}
}
setStreamList(streamList: string[]) {
console.log("stream list updated")
this.setState((state) => {
return { selectedStream: state.selectedStream, streamList: streamList }
}) })
} }
updateSelect(selected: string): void { setInterval(() => {
if (selected !== this.state.selectedStream) { updateStreamList()
this.setState((state) => { }, 10000)
return { streamList: state.streamList, selectedStream: selected }
})
}
}
render() { useEffect(() => {
return ( updateStreamList()
<> },[])
<Menu
items={this.state.streamList}
selectedItem={this.state.selectedStream} return (
selectCallback={this.updateSelect} <>
/> <Menu
<MediaContainer selectedStream={this.state.selectedStream} api={this.apiClient} /> items={streamList}
</> selectedItem={selectedStream}
) selectCallback={updateSelect}
} />
<MediaContainer selectedStream={selectedStream} api={api} />
</>
)
} }
const rootElement = document.getElementById("app"); const rootElement = document.getElementById("app");
if (rootElement) { if (rootElement) {
const root = createRoot(rootElement); const root = createRoot(rootElement);
root.render(<App />) const api = new MinistreamApiClient()
root.render(<App api={api}/>)
} }

View File

@ -1,9 +1,10 @@
import React, { ComponentProps, useRef, useEffect, useState } from "react" import { ComponentProps, useRef, useEffect, useState } from "react"
import { MinistreamApiClient } from "./api" import { MinistreamApiClient } from "./api"
import { resolve } from "path" import { resolve } from "path"
import React from "react"
type MediaContainerProps = { type MediaContainerProps = {
selectedStream: string | undefined selectedStream: string | null
api: MinistreamApiClient api: MinistreamApiClient
} }