voice-changer/client/demo/src/000_index.tsx

124 lines
4.3 KiB
TypeScript
Raw Normal View History

2023-01-07 14:07:39 +03:00
import * as React from "react";
import { createRoot } from "react-dom/client";
import "./css/App.css"
2023-02-22 01:35:26 +03:00
import { ErrorInfo, useMemo, useState, } from "react";
2023-04-04 21:35:16 +03:00
import { AppStateProvider } from "./001_provider/001_AppStateProvider";
2023-02-16 18:09:56 +03:00
import { library } from "@fortawesome/fontawesome-svg-core";
import { fas } from "@fortawesome/free-solid-svg-icons";
import { far } from "@fortawesome/free-regular-svg-icons";
import { fab } from "@fortawesome/free-brands-svg-icons";
2023-04-04 21:35:16 +03:00
import { AppRootProvider, useAppRoot } from "./001_provider/001_AppRootProvider";
2023-02-22 01:35:26 +03:00
import ErrorBoundary from "./001_provider/900_ErrorBoundary";
2023-04-10 18:21:17 +03:00
import { ClientType, INDEXEDDB_KEY_CLIENT, INDEXEDDB_KEY_MODEL_DATA, INDEXEDDB_KEY_SERVER, INDEXEDDB_KEY_WORKLET, INDEXEDDB_KEY_WORKLETNODE, useIndexedDB } from "@dannadori/voice-changer-client-js";
2023-04-04 10:38:30 +03:00
import { CLIENT_TYPE, INDEXEDDB_KEY_AUDIO_OUTPUT } from "./const";
import { Demo } from "./components/demo/010_Demo";
2023-04-10 18:21:17 +03:00
import { ClientSelector } from "./001_ClientSelector";
2023-02-16 18:09:56 +03:00
library.add(fas, far, fab);
2023-01-07 14:07:39 +03:00
const container = document.getElementById("app")!;
const root = createRoot(container);
const App = () => {
2023-04-10 18:21:17 +03:00
const { appGuiSettingState, clientType } = useAppRoot()
2023-04-04 10:38:30 +03:00
const front = useMemo(() => {
2023-04-04 21:35:16 +03:00
if (appGuiSettingState.appGuiSetting.type == "demo") {
2023-04-04 10:38:30 +03:00
return <Demo></Demo>
} else {
2023-04-04 21:35:16 +03:00
return <>unknown gui type. {appGuiSettingState.appGuiSetting.type}</>
2023-02-16 18:09:56 +03:00
}
2023-04-04 21:35:16 +03:00
}, [appGuiSettingState.appGuiSetting.type])
2023-01-07 14:07:39 +03:00
return (
2023-02-16 18:09:56 +03:00
<>
2023-04-04 10:38:30 +03:00
{front}
2023-02-16 18:09:56 +03:00
</>
)
}
const AppStateWrapper = () => {
2023-04-10 18:21:17 +03:00
const { appGuiSettingState, clientType } = useAppRoot()
2023-02-22 01:35:26 +03:00
// エラーバウンダリー設定
const [error, setError] = useState<{ error: Error, errorInfo: ErrorInfo }>()
2023-03-09 00:47:11 +03:00
const { removeItem } = useIndexedDB({ clientType: CLIENT_TYPE })
2023-02-22 01:35:26 +03:00
const errorComponent = useMemo(() => {
const errorName = error?.error.name || "no error name"
const errorMessage = error?.error.message || "no error message"
const errorInfos = (error?.errorInfo.componentStack || "no error stack").split("\n")
2023-02-28 05:54:40 +03:00
const onClearCacheClicked = async () => {
2023-03-07 20:26:17 +03:00
2023-03-02 04:21:28 +03:00
const indexedDBKeys = [
2023-02-22 01:35:26 +03:00
INDEXEDDB_KEY_CLIENT,
INDEXEDDB_KEY_SERVER,
INDEXEDDB_KEY_WORKLETNODE,
INDEXEDDB_KEY_MODEL_DATA,
2023-03-02 04:21:28 +03:00
INDEXEDDB_KEY_WORKLET,
INDEXEDDB_KEY_AUDIO_OUTPUT
]
for (const k of indexedDBKeys) {
await removeItem(k)
}
2023-02-22 01:35:26 +03:00
location.reload();
}
return (
<div className="error-container">
<div className="top-error-message">
</div>
<div className="top-error-description">
<p></p>
<p></p>
<p><button onClick={onClearCacheClicked}></button></p>
</div>
<div className="error-detail">
<div className="error-name">
{errorName}
</div>
<div className="error-message">
{errorMessage}
</div>
<div className="error-info-container">
{errorInfos.map(x => {
return <div className="error-info-line" key={x}>{x}</div>
})}
</div>
</div>
</div>
)
}, [error])
const updateError = (error: Error, errorInfo: React.ErrorInfo) => {
console.log("error compo", error, errorInfo)
setError({ error, errorInfo })
}
2023-04-10 18:21:17 +03:00
if (!clientType) {
return <ClientSelector></ClientSelector>
} else if (!appGuiSettingState.guiSettingLoaded) {
2023-04-04 21:35:16 +03:00
return <></>
} else {
return (
<ErrorBoundary fallback={errorComponent} onError={updateError}>
<AppStateProvider>
<App></App>
</AppStateProvider>
</ErrorBoundary>
)
}
2023-01-07 14:07:39 +03:00
}
root.render(
2023-02-16 18:09:56 +03:00
<AppRootProvider>
<AppStateWrapper></AppStateWrapper>
</AppRootProvider>
2023-01-07 14:07:39 +03:00
);
2023-02-22 01:35:26 +03:00