import { Device, Connection } from "twilio-client"; import useVoiceState, { VoiceState } from "../Hooks/voice-state"; import { useState } from "react"; import { MockDevice } from "../Mocks/mock-device"; export interface Voice { startDevice(token: string): void; answer(): void; reject(): void; hangup(): void; dial(phoneNumber: string): void; voiceState: VoiceState; } export default function useVoice() { const state = useVoiceState(); console.log("Creating new voice"); const [device, setDevice] = useState(); const [connection, setConnection] = useState(); const startDevice = (token: string) => { // const device = new Device(token) const device = new MockDevice(token); console.log("Creating new device", device); device.on("ready", () => state.onDeviceStateUpdate("Disconnected")); device.on("offline", () => state.onDeviceStateUpdate("Offline")); device.on("disconnect", () => { setConnection(undefined); state.onDeviceStateUpdate("Disconnected") }); device.on("cancel", () => { setConnection(undefined); state.onDeviceStateUpdate("Disconnected") }); device.on("incoming", (incomingConnection: Connection) => { state.onDeviceStateUpdate("Ringing", incomingConnection.parameters.From); incomingConnection.on("accept", () => state.onDeviceStateUpdate("Connected")); incomingConnection.on("disconnect", () => state.onDeviceStateUpdate("Disconnected")); incomingConnection.on("mute", muted => state.onDeviceStateUpdate(muted ? "Muted" : "Connected")); setConnection(incomingConnection); }); setDevice(device); } const answer = () => { connection?.accept(); } const reject = () => { connection?.reject(); } const hangup = () => { device?.disconnectAll(); } const dial = (phoneNumber: string) => { const connection = device?.connect({To: phoneNumber}); connection?.on("accept", () => state.onDeviceStateUpdate("Connected")); connection?.on("disconnect", () => state.onDeviceStateUpdate("Disconnected")); connection?.on("mute", muted => state.onDeviceStateUpdate(muted ? "Muted" : "Connected")); setConnection(connection); } return { startDevice, answer, reject, hangup, dial, voiceState: state.voiceState, } as Voice; }