voice-changer/client/lib/src/hooks/useWorkletSetting.ts

92 lines
3.0 KiB
TypeScript
Raw Normal View History

2023-01-12 12:06:15 +03:00
import { useState, useMemo, useEffect } from "react"
2023-01-29 03:42:45 +03:00
import { WorkletSetting, DefaultWorkletSetting, INDEXEDDB_KEY_WORKLET } from "../const";
2023-01-12 17:01:45 +03:00
import { VoiceChangerClient } from "../VoiceChangerClient";
2023-01-29 03:42:45 +03:00
import { useIndexedDB } from "./useIndexedDB";
2023-01-11 22:52:01 +03:00
export type UseWorkletSettingProps = {
voiceChangerClient: VoiceChangerClient | null
}
export type WorkletSettingState = {
setting: WorkletSetting;
2023-01-29 03:42:45 +03:00
clearSetting: () => Promise<void>
2023-01-11 22:52:01 +03:00
setSetting: (setting: WorkletSetting) => void;
startOutputRecording: () => void
stopOutputRecording: () => Promise<void>
2023-01-11 22:52:01 +03:00
}
export const useWorkletSetting = (props: UseWorkletSettingProps): WorkletSettingState => {
const [setting, _setSetting] = useState<WorkletSetting>(DefaultWorkletSetting)
2023-01-29 03:42:45 +03:00
const { setItem, getItem, removeItem } = useIndexedDB()
// 初期化 その1 DBから取得
useEffect(() => {
const loadCache = async () => {
const setting = await getItem(INDEXEDDB_KEY_WORKLET)
if (!setting) {
// デフォルト設定
const params = new URLSearchParams(location.search);
const colab = params.get("colab")
if (colab == "true") {
_setSetting({
numTrancateTreshold: 300,
volTrancateThreshold: 0.0005,
volTrancateLength: 32,
})
} else {
_setSetting({
numTrancateTreshold: 150,
volTrancateThreshold: 0.0005,
volTrancateLength: 32,
})
}
} else {
_setSetting({
...(setting as WorkletSetting)
})
}
}
loadCache()
}, [])
2023-01-11 22:52:01 +03:00
2023-01-29 03:42:45 +03:00
// 初期化 その2 クライアントに設定
useEffect(() => {
if (!props.voiceChangerClient) return
props.voiceChangerClient.configureWorklet(setting)
}, [props.voiceChangerClient, setting])
2023-01-11 22:52:01 +03:00
const setSetting = useMemo(() => {
return (setting: WorkletSetting) => {
if (!props.voiceChangerClient) return
props.voiceChangerClient.configureWorklet(setting)
_setSetting(setting)
2023-01-29 03:42:45 +03:00
setItem(INDEXEDDB_KEY_WORKLET, setting)
2023-01-11 22:52:01 +03:00
}
}, [props.voiceChangerClient])
2023-01-29 03:42:45 +03:00
const clearSetting = async () => {
await removeItem(INDEXEDDB_KEY_WORKLET)
}
const startOutputRecording = useMemo(() => {
return () => {
if (!props.voiceChangerClient) return
props.voiceChangerClient.startOutputRecordingWorklet()
}
}, [props.voiceChangerClient])
const stopOutputRecording = useMemo(() => {
return async () => {
if (!props.voiceChangerClient) return
props.voiceChangerClient.stopOutputRecordingWorklet()
}
}, [props.voiceChangerClient])
2023-01-11 22:52:01 +03:00
return {
setting,
2023-01-29 03:42:45 +03:00
clearSetting,
setSetting,
startOutputRecording,
stopOutputRecording
2023-01-11 22:52:01 +03:00
}
}