94 lines
2.2 KiB
TypeScript
94 lines
2.2 KiB
TypeScript
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<Device>();
|
|
const [connection, setConnection] = useState<Connection>();
|
|
|
|
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;
|
|
} |