2022-06-06 22:42:48 +02:00
/* eslint-disable @typescript-eslint/ban-ts-comment */
2022-05-04 17:09:48 +01:00
/ *
Copyright 2022 Matrix . org Foundation C . I . C .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
2022-02-04 16:55:57 -08:00
import React from "react" ;
2022-06-06 22:42:48 +02:00
import { Item } from "@react-stately/collections" ;
2022-01-05 16:54:13 -08:00
import { Modal } from "../Modal" ;
2021-12-06 17:34:10 -08:00
import styles from "./SettingsModal.module.css" ;
2022-01-21 15:43:03 -08:00
import { TabContainer , TabItem } from "../tabs/Tabs" ;
2022-01-05 16:54:13 -08:00
import { ReactComponent as AudioIcon } from "../icons/Audio.svg" ;
import { ReactComponent as VideoIcon } from "../icons/Video.svg" ;
import { ReactComponent as DeveloperIcon } from "../icons/Developer.svg" ;
2022-01-05 17:27:01 -08:00
import { SelectInput } from "../input/SelectInput" ;
2022-06-08 17:22:46 +02:00
import { useMediaHandler } from "./useMediaHandler" ;
2022-05-31 10:43:05 -04:00
import { useSpatialAudio , useShowInspector } from "./useSetting" ;
2022-02-04 16:55:57 -08:00
import { FieldRow , InputField } from "../input/Input" ;
2022-02-01 15:11:06 -08:00
import { Button } from "../button" ;
2022-04-07 14:22:36 -07:00
import { useDownloadDebugLog } from "./submit-rageshake" ;
2022-02-16 11:29:43 -08:00
import { Body } from "../typography/Typography" ;
2021-12-06 17:34:10 -08:00
2022-06-06 22:42:48 +02:00
interface Props {
setShowInspector : boolean ;
showInspector : boolean ;
[ rest : string ] : unknown ;
}
export const SettingsModal = ( props : Props ) = > {
2021-12-06 17:34:10 -08:00
const {
audioInput ,
audioInputs ,
setAudioInput ,
videoInput ,
videoInputs ,
setVideoInput ,
2022-02-22 18:32:51 -08:00
audioOutput ,
audioOutputs ,
setAudioOutput ,
} = useMediaHandler ( ) ;
2022-06-06 22:42:48 +02:00
2022-05-31 10:43:05 -04:00
const [ spatialAudio , setSpatialAudio ] = useSpatialAudio ( ) ;
const [ showInspector , setShowInspector ] = useShowInspector ( ) ;
2021-12-06 17:34:10 -08:00
2022-02-04 16:55:57 -08:00
const downloadDebugLog = useDownloadDebugLog ( ) ;
2022-02-01 15:11:06 -08:00
2021-12-06 17:34:10 -08:00
return (
< Modal
title = "Settings"
isDismissable
2021-12-10 10:54:18 -08:00
mobileFullScreen
2021-12-06 17:34:10 -08:00
className = { styles . settingsModal }
2022-05-31 10:43:05 -04:00
{ . . . props }
2021-12-06 17:34:10 -08:00
>
< TabContainer className = { styles . tabContainer } >
< TabItem
title = {
< >
< AudioIcon width = { 16 } height = { 16 } / >
< span > Audio < / span >
< / >
}
>
< SelectInput
label = "Microphone"
selectedKey = { audioInput }
onSelectionChange = { setAudioInput }
>
{ audioInputs . map ( ( { deviceId , label } ) = > (
< Item key = { deviceId } > { label } < / Item >
) ) }
< / SelectInput >
2022-02-22 18:32:51 -08:00
{ audioOutputs . length > 0 && (
< SelectInput
label = "Speaker"
selectedKey = { audioOutput }
onSelectionChange = { setAudioOutput }
>
{ audioOutputs . map ( ( { deviceId , label } ) = > (
< Item key = { deviceId } > { label } < / Item >
) ) }
< / SelectInput >
) }
2022-05-31 10:43:05 -04:00
< FieldRow >
< InputField
id = "spatialAudio"
2022-06-06 11:19:40 -04:00
label = "Spatial audio"
2022-05-31 10:43:05 -04:00
type = "checkbox"
checked = { spatialAudio }
2022-06-06 11:26:48 -04:00
description = "This will make a speaker's audio seem as if it is coming from where their tile is positioned on screen. (Experimental feature: this may impact the stability of audio.)"
2022-06-06 22:42:48 +02:00
// @ts-ignore
onChange = { ( event : Event ) = > setSpatialAudio ( event . target . checked ) }
2022-05-31 10:43:05 -04:00
/ >
< / FieldRow >
2021-12-06 17:34:10 -08:00
< / TabItem >
< TabItem
title = {
< >
< VideoIcon width = { 16 } height = { 16 } / >
< span > Video < / span >
< / >
}
>
< SelectInput
2022-06-02 13:53:19 -04:00
label = "Camera"
2021-12-06 17:34:10 -08:00
selectedKey = { videoInput }
onSelectionChange = { setVideoInput }
>
{ videoInputs . map ( ( { deviceId , label } ) = > (
< Item key = { deviceId } > { label } < / Item >
) ) }
< / SelectInput >
< / TabItem >
< TabItem
title = {
< >
< DeveloperIcon width = { 16 } height = { 16 } / >
< span > Developer < / span >
< / >
}
>
2022-02-16 11:29:43 -08:00
< FieldRow >
< Body className = { styles . fieldRowText } >
Version : { import . meta . env . VITE_APP_VERSION || "dev" }
< / Body >
< / FieldRow >
2021-12-06 17:34:10 -08:00
< FieldRow >
< InputField
id = "showInspector"
name = "inspector"
label = "Show Call Inspector"
type = "checkbox"
checked = { showInspector }
2022-06-06 22:42:48 +02:00
// @ts-ignore
onChange = { ( e : Event ) = > setShowInspector ( e . target . checked ) }
2021-12-06 17:34:10 -08:00
/ >
< / FieldRow >
2022-02-01 15:11:06 -08:00
< FieldRow >
< Button onPress = { downloadDebugLog } > Download Debug Logs < / Button >
< / FieldRow >
2021-12-06 17:34:10 -08:00
< / TabItem >
< / TabContainer >
< / Modal >
) ;
2022-05-31 10:43:05 -04:00
} ;