shellphone.app/app/phone-calls/pages/outgoing-call/[recipient].tsx

91 lines
2.6 KiB
TypeScript
Raw Normal View History

import type { BlitzPage } from "blitz";
2021-08-13 04:43:57 +00:00
import { Routes, useRouter } from "blitz";
import { useCallback, useEffect } from "react";
import { atom, useAtom } from "jotai";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faPhoneAlt as faPhone } from "@fortawesome/pro-solid-svg-icons";
import useRequireOnboarding from "../../../core/hooks/use-require-onboarding";
2021-08-13 04:43:57 +00:00
import useMakeCall from "../../hooks/use-make-call";
2021-08-31 22:42:15 +00:00
import useDevice from "../../hooks/use-device";
import Keypad from "../../components/keypad";
const OutgoingCall: BlitzPage = () => {
2021-08-13 15:52:38 +00:00
useRequireOnboarding();
const [phoneNumber, setPhoneNumber] = useAtom(phoneNumberAtom);
const router = useRouter();
const { isDeviceReady } = useDevice();
const recipient = decodeURIComponent(router.params.recipient);
const onHangUp = useCallback(() => setPhoneNumber(""), [setPhoneNumber]);
2021-08-13 15:52:38 +00:00
const call = useMakeCall({ recipient, onHangUp });
const pressDigit = useAtom(pressDigitAtom)[1];
const onDigitPressProps = useCallback(
(digit: string) => ({
onPress() {
pressDigit(digit);
2021-08-13 04:43:57 +00:00
call.sendDigits(digit);
},
}),
2021-08-13 04:43:57 +00:00
[call, pressDigit],
);
2021-08-13 15:52:38 +00:00
useEffect(() => {
if (isDeviceReady) {
2021-08-13 15:52:38 +00:00
call.makeCall();
}
}, [isDeviceReady]);
return (
<div className="w-96 h-full flex flex-col justify-around py-5 mx-auto text-center text-black bg-white">
<div className="h-16 text-3xl text-gray-700">
<span>{recipient}</span>
</div>
2021-08-13 04:43:57 +00:00
<div className="mb-4 text-gray-600">
<div className="h-8 text-2xl">{phoneNumber}</div>
<div className="h-8 text-lg">{translateState(call.state)}</div>
</div>
<Keypad onDigitPressProps={onDigitPressProps} onZeroPressProps={onDigitPressProps("0")}>
2021-08-13 11:55:05 +00:00
<button
2021-08-13 15:52:38 +00:00
onClick={call.hangUp}
className="cursor-pointer select-none col-start-2 h-12 w-12 flex justify-center items-center mx-auto bg-red-800 rounded-full"
>
<FontAwesomeIcon className="w-6 h-6" icon={faPhone} color="white" size="lg" />
2021-08-13 11:55:05 +00:00
</button>
</Keypad>
</div>
);
2021-08-13 04:43:57 +00:00
function translateState(state: typeof call.state): string {
switch (state) {
case "initial":
case "ready":
return "Connecting...";
case "calling":
return "Calling...";
case "call_in_progress":
return ""; // TODO display time elapsed
case "call_ending":
return "Call ending...";
case "call_ended":
return "Call ended";
}
}
};
const phoneNumberAtom = atom("");
const pressDigitAtom = atom(null, (get, set, digit: string) => {
if (get(phoneNumberAtom).length > 17) {
return;
}
set(phoneNumberAtom, (prevState) => prevState + digit);
});
OutgoingCall.authenticate = { redirectTo: Routes.SignIn() };
export default OutgoingCall;