{"version":3,"sources":["components/Message/message.component.tsx","components/Camera/device-selection.component.tsx","components/AmbientLightSensorComponent/ambient-light-sensor.component.tsx","components/SpeechRecognition/speech-recognition.component.tsx","serviceWorker.ts","App.tsx","components/Icons/icons.component.tsx","components/NavigationBar/navigation-bar.component.tsx","components/OfflineWaning/offline-waring.component.tsx","components/ToDoTask/todo-task.component.tsx","components/ToDoTask/todo-list.component.tsx","components/Vibrate/vibrate.component.tsx","components/TextToSpeech/text-to-speech.component.tsx","components/Microphone/microphone.component.tsx","index.tsx"],"names":["Message","props","className","message","DeviceSelectionComponent","state","devices","deviceId","label","groupId","kind","permissionStatus","isCameraSupported","navigator","mediaDevices","selectedDevice","getAvailableVideoDevices","bind","permissions","query","name","then","console","log","setState","onchange","onChangePermissionStatus","this","evt","currentTarget","value","forEach","mediaDevice","map","d","includes","push","length","enumerateDevices","options","i","key","id","onChange","onChangeDevice","handleChange","selected","Component","AmbientLightSensorComponent","isSupported","window","illuminance","bgColor","onUpdateDeviceLight","update","componentDidMount","sensor","eval","addEventListener","event","start","e","error","colorPart","Math","min","toFixed","style","backgroundColor","SpeechRecognitionComponent","speechRecognition","mediaDevicesStatus","isRecording","onEndRecognition","stop","onStop","onClick","interimResults","lang","continuous","onresult","onend","resultIndex","results","isFinal","content","transcript","trim","readOutLoud","speech","SpeechSynthesisUtterance","text","volume","rate","pitch","speechSynthesis","speak","position","top","color","isLocalhost","Boolean","location","hostname","match","registerValidSW","swUrl","config","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","catch","sentryOptions","dsn","process","release","Sentry","App","src","alt","href","target","rel","Icon","NavigationBar","exact","to","activeClassName","OfflineWaring","isOffline","onLine","onChangeNetworkState","removeEventListener","width","textAlign","React","PureComponent","ToDoTask","TodoListComponent","isLocalStorageSupported","localStorage","savedTasksString","getItem","tasks","JSON","parse","inputTask","preventDefault","status","setItem","stringify","task","index","renderTasks","onSubmit","onAddTask","autoFocus","onClearList","VibrateComponent","vibrate","randomVibrate","TextToSpeechComponent","type","onChangeInput","MicrophoneComponent","currentStream","isStreamming","mediaRecorder","chunks","isMicrophoneSupported","selectedMicrophone","recordedAudios","setMediaStream","onChangeMicrophone","onDataAvailable","startStreamming","stopStreamming","stream","a","MediaRecorder","ondataavailable","data","info","saveRecording","blob","Blob","audioURL","URL","createObjectURL","getUserMedia","audio","warn","getTracks","track","undefined","audioTracks","controls","renderAudios","startRecording","stopRecording","GeolocationComponent","lazy","CameraComponent","history","createBrowserHistory","listen","pathname","search","ga","ReactDOM","render","StrictMode","fallback","path","component","patch","document","getElementById","origin","fetch","headers","response","contentType","get","indexOf","ready","unregister","reload","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.a23b7a8a.chunk.js","sourcesContent":["import React from 'react';\n\ntype MessageProps = {\n message: string\n}\n\nexport const Message = (props: MessageProps) =>\n
\n
\n

\n {props.message}\n

\n
\n
","import React, { Component } from 'react';\nimport { Message } from 'components/Message/message.component';\n\ntype DeviceSelectionState = {\n devices: MediaDeviceInfo[],\n permissionStatus: string,\n isCameraSupported: boolean,\n selectedDevice: string\n}\n\ntype DeviceSelectionProps = {\n kind: string,\n onChangeDevice: Function,\n selected: string\n}\n\nexport default class DeviceSelectionComponent extends Component {\n\n constructor(props: any) {\n super(props);\n\n this.state = {\n devices: [{deviceId: '', label: 'default', groupId: '', kind: props.kind} as MediaDeviceInfo],\n permissionStatus: '',\n isCameraSupported: !!navigator.mediaDevices,\n selectedDevice: '',\n };\n this.getAvailableVideoDevices = this.getAvailableVideoDevices.bind(this);\n }\n\n componentDidMount() {\n navigator.permissions.query({ name: 'camera' })\n .then(function (permissionStatus) {\n console.log('camera permission state is ', permissionStatus.state);\n return permissionStatus;\n })\n .then(permissionStatus => {\n this.setState({\n ...this.state,\n permissionStatus: permissionStatus.state\n });\n permissionStatus.onchange = () => this.onChangePermissionStatus(permissionStatus);\n });\n }\n\n onChangePermissionStatus(permissionStatus: PermissionStatus) {\n\n if (this.state.permissionStatus === permissionStatus.state) {\n return;\n }\n this.setState({\n ...this.state,\n permissionStatus: permissionStatus.state\n });\n }\n\n handleChange(evt: React.FormEvent) {\n this.setState({ selectedDevice: evt.currentTarget.value });\n }\n\n getAvailableVideoDevices(mediaDevices: MediaDeviceInfo[]) {\n let devices: MediaDeviceInfo[] = [];\n mediaDevices.forEach(mediaDevice => {\n if (mediaDevice.kind !== this.props.kind || this.state.devices.map(d => d.deviceId).includes(mediaDevice.deviceId)) {\n return;\n }\n devices.push(mediaDevice);\n });\n\n if (devices.length === 0) {\n return;\n }\n\n this.setState({ devices: [...this.state.devices, ...devices] });\n }\n\n render() {\n if (!this.state.isCameraSupported) {\n return ()\n }\n\n switch (this.state.permissionStatus) {\n case 'granted':\n navigator.mediaDevices.enumerateDevices().then(this.getAvailableVideoDevices);\n const options = !this.state?.devices ? null : this.state.devices.map(i => );\n return ();\n case 'denied':\n return (You have denied access to your camera api.);\n case 'prompted':\n return (Please allow us to access your camera api.);\n default:\n return (Loading...);\n }\n }\n}","import React, { Component } from 'react';\nimport { Message } from 'components/Message/message.component';\n\ntype AmbientLightSensorState = {\n isSupported: boolean,\n illuminance: number,\n permissionStatus: string,\n bgColor: string\n};\n\nexport default class AmbientLightSensorComponent extends Component<{}, AmbientLightSensorState> {\n\n constructor(props: any) {\n super(props);\n\n this.state = {\n isSupported: (\"AmbientLightSensor\" in window),\n illuminance: 0,\n permissionStatus: '',\n bgColor: '#000000'\n }\n\n this.onChangePermissionStatus = this.onChangePermissionStatus.bind(this);\n this.onUpdateDeviceLight = this.onUpdateDeviceLight.bind(this);\n this.update = this.update.bind(this);\n }\n\n componentDidMount() {\n if (!this.state.isSupported) {\n return;\n }\n\n try {\n navigator.permissions.query({ name: 'ambient-light-sensor' })\n .then(function (permissionStatus) {\n console.log('ambient-light-sensor permission state is ', permissionStatus.state);\n return permissionStatus;\n })\n .then(permissionStatus => {\n this.setState({\n ...this.state,\n permissionStatus: permissionStatus.state\n });\n permissionStatus.onchange = () => this.onChangePermissionStatus(permissionStatus);\n });\n\n //TODO: REMOVE EVAL\n // eslint-disable-next-line no-eval\n var sensor = eval('new AmbientLightSensor()');\n sensor.addEventListener(\"reading\", (event: any) => this.update(sensor.illuminance));\n sensor.start();\n\n if (\"ondevicelight\" in window) {\n window.addEventListener(\"devicelight\", this.onUpdateDeviceLight);\n }\n\n } catch (e) {\n console.error(e);\n }\n }\n\n onUpdateDeviceLight(event: any) {\n this.update(event.value);\n }\n\n onChangePermissionStatus(permissionStatus: PermissionStatus) {\n this.setState({\n ...this.state,\n permissionStatus: permissionStatus.state\n });\n }\n\n update(illuminance: number) {\n const colorPart = Math.min(255, illuminance).toFixed(0);\n\n this.setState({\n illuminance,\n bgColor: `rgb(${colorPart},${colorPart},${colorPart})`\n });\n }\n\n render() {\n if (!this.state.isSupported) {\n return ()\n }\n\n if (this.state.permissionStatus !== 'granted') {\n switch (this.state.permissionStatus) {\n case 'denied':\n return ();\n case 'prompt':\n return ();\n default:\n return ();\n }\n }\n\n return (\n
\n \n
\n );\n }\n}\n\n","import React, { Component } from 'react';\nimport { Message } from 'components/Message/message.component';\n\ntype SpeechRecognitionProps = {\n message: string,\n mediaDevicesStatus: string,\n isRecording: boolean\n}\n\nexport default class SpeechRecognitionComponent extends Component<{}, SpeechRecognitionProps> {\n\n private isSupported: boolean;\n private speechRecognition: any;\n\n constructor(props: any) {\n super(props);\n\n this.state = {\n message: '',\n mediaDevicesStatus: '',\n isRecording: false\n }\n\n\n this.speechRecognition = eval('new webkitSpeechRecognition()');\n this.isSupported = !!this.speechRecognition;\n\n this.onEndRecognition = this.onEndRecognition.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.onStop = this.onStop.bind(this);\n this.onClick = this.onClick.bind(this);\n }\n\n componentDidMount() {\n navigator.permissions.query({ name: 'microphone' })\n .then(function (permissionStatus) {\n console.log('microphone permission state is ', permissionStatus.state);\n return permissionStatus;\n })\n .then(permissionStatus => {\n this.setState({\n ...this.state,\n mediaDevicesStatus: permissionStatus.state\n });\n permissionStatus.onchange = () => this.onChangePermissionStatus(permissionStatus);\n });\n }\n\n onChangePermissionStatus(permissionStatus: PermissionStatus) {\n this.setState({\n ...this.state,\n mediaDevicesStatus: permissionStatus.state\n });\n }\n\n start() {\n this.speechRecognition.interimResults = true;\n this.speechRecognition.lang = \"en-US\";\n this.speechRecognition.continuous = true;\n\n this.setState({ isRecording: true }, () => this.speechRecognition.start());\n\n // This event happens when you talk in the microphone\n this.speechRecognition.onresult = this.onEndRecognition;\n this.speechRecognition.onend = this.onStop;\n };\n\n onStop() {\n this.setState({ isRecording: false });\n }\n\n stop() {\n this.speechRecognition.stop();\n }\n\n onEndRecognition(event: any) {\n for (let i = event.resultIndex; i < event.results.length; i++) {\n if (event.results[i].isFinal) {\n // Here you can get the string of what you told\n const content = event.results[i][0].transcript.trim();\n\n if (this.state.message !== content) {\n this.setState({ message: content });\n this.readOutLoud(content);\n }\n }\n }\n }\n\n onClick() {\n if (this.state.isRecording) {\n this.stop();\n return;\n }\n\n this.start();\n }\n\n readOutLoud(message: string) {\n var speech = new SpeechSynthesisUtterance();\n\n // Set the text and voice attributes.\n speech.text = message;\n speech.volume = 1;\n speech.rate = 1;\n speech.pitch = 1;\n\n window.speechSynthesis.speak(speech);\n }\n\n onChangeInput(e: React.FormEvent) {\n this.setState({ message: e.currentTarget.value });\n }\n\n render() {\n\n if (!this.isSupported) {\n return ()\n }\n\n if (this.state.mediaDevicesStatus !== 'granted') {\n switch (this.state.mediaDevicesStatus) {\n case 'denied':\n return ();\n case 'prompt':\n return ();\n default:\n return ();\n }\n }\n\n return (\n
\n {this.state.message ?? 'Say something to me'}\n
\n

{this.state.isRecording ? 'Stop' : 'Click and say something'}

\n
\n
\n );\n\n }\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n//#2\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport * as Sentry from '@sentry/browser';\n\nimport logo from './logo.png';\nimport './App.css';\n\nconst sentryOptions = {\n dsn: process.env.REACT_APP_SENTRY_DSN,\n release: `my-project-name@${process.env.REACT_APP_VERSION}`\n} as Sentry.BrowserOptions;\n\nSentry.init(sentryOptions);\n\nfunction App() {\n return (\n
\n
\n \"logo\"\n

\n Welcome to PWA Samples.\n

\n \n Source code available\n \n
\n
\n );\n}\n\nexport default App;\n","import React from 'react';\n\ntype IconProps = {\n name: string,\n alt?: string,\n style?: React.CSSProperties\n}\n\nexport const Icon = (props: IconProps & React.CSSProperties) =>\n{props.name}","import React from 'react';\nimport { NavLink } from 'react-router-dom';\n\nimport { Icon } from 'components/Icons/icons.component';\n\ntype NavigationProps = {\n history: any\n}\n\nexport const NavigationBar = (props: NavigationProps) =>\n
\n \n
\n","import React from 'react';\n\ntype OfflineState = {\n isOffline: boolean\n}\n\nexport default class OfflineWaring extends React.PureComponent<{}, OfflineState> {\n\n constructor(props: any) {\n super(props);\n\n this.state = {\n isOffline: !navigator.onLine\n }\n }\n\n componentDidMount(){\n\t\t// Add event listener offline to detect network loss.\n\t\twindow.addEventListener(\"offline\", () => this.onChangeNetworkState(true));\n\n\t\t// Add event listener online to detect network recovery.\n\t\twindow.addEventListener(\"online\", () => this.onChangeNetworkState(false));\n }\n \n componentWillUnmount() {\n\t\t// Remove event listener offline to detect network loss.\n\t\twindow.removeEventListener(\"offline\", () => this.onChangeNetworkState(true));\n\n\t\t// Remove event listener online to detect network recovery.\n\t\twindow.removeEventListener(\"online\", () => this.onChangeNetworkState(false));\n }\n \n onChangeNetworkState(isOffline: boolean) {\n\t\tthis.setState({isOffline});\n }\n \n render() {\n if (!this.state.isOffline) {\n return null;\n }\n\n return (\n
\n signal_wifi_off You are offline\n
);\n }\n}","import React from 'react';\nimport TodoTaskModel from './todo-task.model';\n\nexport const ToDoTask = (props: TodoTaskModel) =>\n
  • {props.text}
  • ","import React, { Component } from 'react';\nimport { Message } from 'components/Message/message.component';\nimport TodoTaskModel from './todo-task.model';\nimport { ToDoTask } from './todo-task.component';\nimport { Icon } from 'components/Icons/icons.component';\n\ntype TodoListState = {\n isSupported: boolean,\n tasks: TodoTaskModel[],\n inputTask: string\n};\n\nexport default class TodoListComponent extends Component<{}, TodoListState> {\n\n constructor(props: any) {\n super(props);\n\n const isLocalStorageSupported = !!window.localStorage;\n\n const savedTasksString = isLocalStorageSupported ? localStorage.getItem('todo-tasks') ?? '[]' : '[]';\n\n this.state = {\n isSupported: isLocalStorageSupported,\n tasks: JSON.parse(savedTasksString),\n inputTask: ''\n }\n }\n\n onChange(evt: React.FormEvent) {\n evt.preventDefault();\n this.setState({\n inputTask: evt.currentTarget.value\n });\n }\n\n onAddTask() {\n const tasks = this.state.tasks;\n tasks.push({ text: this.state.inputTask, status: 'todo'});\n\n localStorage.setItem('todo-tasks', JSON.stringify(tasks));\n this.setState({\n tasks: tasks,\n inputTask: ''\n });\n }\n\n onClearList() {\n localStorage.setItem('todo-tasks', '[]');\n this.setState({\n tasks: []\n });\n }\n\n renderTasks() {\n if (this.state.tasks.length === 0) {\n return null;\n }\n\n const tasks = this.state.tasks.map((task, index) => );\n return (\n
      \n {tasks}\n
    );\n }\n\n render() {\n if (!this.state.isSupported) {\n return ()\n }\n\n return (\n
    \n {this.renderTasks()}\n
    \n
    \n \n
    \n \n \n
    \n
    \n );\n }\n}\n\n","import React, { Component } from 'react';\nimport { Message } from 'components/Message/message.component';\n\nexport default class VibrateComponent extends Component<{}, {}> {\n\n randomVibrate(evt: any) {\n navigator.vibrate([100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100]);\n console.log('vibrate');\n }\n\n render() {\n if (!navigator.vibrate) {\n return ()\n }\n\n return (\n
    \n
    \n

    Click me

    \n
    \n
    \n );\n }\n}\n\n","import React, { Component } from 'react';\nimport { Message } from 'components/Message/message.component';\n\ntype MessageProps = {\n message: string\n}\n\nexport default class TextToSpeechComponent extends Component<{}, MessageProps> {\n\n constructor(props: any) {\n super(props);\n\n this.state = {\n message: ''\n }\n\n this.readOutLoud = this.readOutLoud.bind(this);\n }\n\n readOutLoud(message: string) {\n var speech = new SpeechSynthesisUtterance();\n\n // Set the text and voice attributes.\n speech.text = message;\n speech.volume = 1;\n speech.rate = 1;\n speech.pitch = 1;\n\n window.speechSynthesis.speak(speech);\n }\n\n onChangeInput(e: React.FormEvent) {\n this.setState({ message: e.currentTarget.value });\n }\n\n render() {\n\n if (!window.speechSynthesis) {\n return ()\n }\n\n return (\n
    \n \n
    this.readOutLoud(this.state.message)}>\n

    Say it

    \n
    \n
    \n );\n\n }\n}\n","import React, { Component } from 'react';\nimport DeviceSelectionComponent from 'components/Camera/device-selection.component';\nimport { Message } from 'components/Message/message.component';\nimport { MediaRecorder, IMediaRecorder } from 'extendable-media-recorder';\n\n\ntype MicrophoneState = {\n mediaDevicesStatus: string,\n isMicrophoneSupported: boolean,\n isRecording: boolean,\n selectedMicrophone: string\n recordedAudios: string[],\n};\n\nexport default class MicrophoneComponent extends Component<{}, MicrophoneState> {\n\n private currentStream?: MediaStream;\n private isStreamming: boolean = false;\n private mediaRecorder: IMediaRecorder | undefined;\n private chunks: any[] = [];\n\n constructor(props: {}) {\n super(props);\n this.state = {\n mediaDevicesStatus: '',\n isMicrophoneSupported: !!navigator.mediaDevices,\n isRecording: false,\n selectedMicrophone: '',\n recordedAudios: []\n };\n\n this.setMediaStream = this.setMediaStream.bind(this);\n this.onChangeMicrophone = this.onChangeMicrophone.bind(this);\n this.onStop = this.onStop.bind(this);\n this.onDataAvailable = this.onDataAvailable.bind(this);\n }\n\n componentDidMount() {\n navigator.permissions.query({ name: 'microphone' })\n .then(function (permissionStatus) {\n console.log('microphone permission state is ', permissionStatus.state);\n return permissionStatus;\n })\n .then(permissionStatus => {\n this.setState({\n ...this.state,\n mediaDevicesStatus: permissionStatus.state\n });\n permissionStatus.onchange = () => this.onChangePermissionStatus(permissionStatus);\n });\n this.startStreamming();\n }\n\n componentWillUnmount() {\n if (typeof this.currentStream !== 'undefined') {\n this.stopStreamming();\n }\n\n if(!!this.mediaRecorder) {\n this.mediaRecorder.removeEventListener('stop', this.onStop);\n }\n }\n\n onChangePermissionStatus(permissionStatus: PermissionStatus) {\n this.setState({\n ...this.state,\n mediaDevicesStatus: permissionStatus.state\n });\n\n if (this.isStreamming) {\n return;\n }\n this.startStreamming();\n }\n\n async setMediaStream(stream: MediaStream) {\n\n if (stream) {\n this.currentStream = stream;\n }\n\n this.mediaRecorder = new MediaRecorder(stream); \n this.mediaRecorder.addEventListener('stop', this.onStop);\n this.mediaRecorder.ondataavailable = this.onDataAvailable;\n }\n\n onStop(e: any) {\n console.log(\"data available after MediaRecorder.stop() called.\");\n\n ;\n console.log(\"recorder stopped\");\n\n \n }\n\n onDataAvailable(e: any) {\n this.chunks.push(e.data);\n console.log(\"data available called.\");\n\n if (!this.mediaRecorder || this.mediaRecorder.state === 'recording') {\n return;\n }\n\n console.info(\"data available called after stop.\");\n this.saveRecording();\n }\n\n saveRecording() {\n const blob = new Blob(this.chunks, { 'type': 'audio/oog; codecs=opus' });\n this.chunks = [];\n const audioURL = window.URL.createObjectURL(blob);\n this.setState({ recordedAudios: [...this.state.recordedAudios, audioURL] });\n }\n\n startRecording() {\n if (!this.mediaRecorder || this.mediaRecorder.state === 'recording') {\n return;\n }\n\n // Kick off the recording.\n this.mediaRecorder.start();\n this.setState({isRecording: true});\n console.log(\"start recording\");\n }\n\n stopRecording() {\n if (!this.mediaRecorder || this.mediaRecorder.state !== 'recording') {\n return;\n }\n\n this.mediaRecorder?.stop();\n this.setState({isRecording: false});\n console.log(\"stop recording\");\n }\n\n startStreamming() {\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n navigator.mediaDevices.getUserMedia({ audio: true }).then(this.setMediaStream).catch((error) => console.warn(JSON.stringify(error)));\n this.isStreamming = true;\n }\n }\n\n stopStreamming() {\n this.currentStream?.getTracks().forEach(track => {\n track.stop();\n });\n\n this.currentStream = undefined;\n this.isStreamming = false;\n }\n\n onChangeMicrophone(evt: React.FormEvent) {\n if (typeof this.currentStream !== 'undefined') {\n this.stopStreamming();\n }\n\n const value = evt.currentTarget.value;\n\n this.startStreamming();\n\n this.setState({\n ...this.state,\n selectedMicrophone: value\n });\n }\n\n renderAudios() {\n if (this.state.recordedAudios.length === 0) {\n return null;\n }\n\n const audioTracks = this.state.recordedAudios.map((track, index) =>\n
  • \n \n
  • );\n\n return (
      {audioTracks}
    );\n }\n\n render() {\n\n if (!this.state.isMicrophoneSupported) {\n return ()\n }\n\n if (this.state.mediaDevicesStatus !== 'granted') {\n switch (this.state.mediaDevicesStatus) {\n case 'denied':\n return ();\n case 'prompt':\n return ();\n default:\n return ();\n }\n }\n\n return (\n
    \n
    \n {this.renderAudios()}\n
    \n
    \n \n \n \n
    \n
    \n );\n }\n}","import React, { Suspense, lazy } from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom';\nimport { createBrowserHistory } from 'history';\nimport * as Sentry from '@sentry/browser';\nimport * as serviceWorker from './serviceWorker';\n\nimport './index.scss';\nimport App from './App';\nimport { Message } from 'components/Message/message.component';\nimport { NavigationBar } from 'components/NavigationBar/navigation-bar.component';\nimport OfflineWaring from 'components/OfflineWaning/offline-waring.component';\nimport AmbientLightSensorComponent from 'components/AmbientLightSensorComponent/ambient-light-sensor.component';\nimport TodoListComponent from 'components/ToDoTask/todo-list.component';\nimport VibrateComponent from 'components/Vibrate/vibrate.component';\nimport TextToSpeechComponent from 'components/TextToSpeech/text-to-speech.component';\nimport MicrophoneComponent from 'components/Microphone/microphone.component';\nimport SpeechRecognitionComponent from 'components/SpeechRecognition/speech-recognition.component';\n\nconst GeolocationComponent = lazy(() => import('components/Geolocation/geolocation.component'));\nconst CameraComponent = lazy(() => import('components/Camera/camera.component'));\n\ndeclare global {\n interface Window { ga: any; }\n}\n\nSentry.init({dsn: process.env.REACT_APP_SENTRY_DSN, release: process.env.REACT_APP_VERSION });\nvar history = createBrowserHistory();\n\nhistory.listen((location) => {\n console.log(\"Send page view: \" + location.pathname + location.search);\n if (!window.ga)\n return;\n\n window.ga('set', 'page', location.pathname + location.search);\n window.ga('send', 'pageview');\n});\n\nReactDOM.render(\n \n \n \n }>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.register();\n"],"sourceRoot":""}