shellphone.app/app/phone-calls/pages/outgoing-call/[recipient].tsx
2021-09-01 06:42:15 +08:00

91 lines
2.6 KiB
TypeScript

import type { BlitzPage } from "blitz";
import { Routes, useRouter } from "blitz";
import { useEffect, useMemo } 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";
import useMakeCall from "../../hooks/use-make-call";
import useDevice from "../../hooks/use-device";
import Keypad from "../../components/keypad";
const OutgoingCall: BlitzPage = () => {
useRequireOnboarding();
const [phoneNumber, setPhoneNumber] = useAtom(phoneNumberAtom);
const router = useRouter();
const device = useDevice();
const recipient = decodeURIComponent(router.params.recipient);
const onHangUp = useMemo(() => () => setPhoneNumber(""), [setPhoneNumber]);
const call = useMakeCall({ recipient, onHangUp });
const pressDigit = useAtom(pressDigitAtom)[1];
const onDigitPressProps = useMemo(
() => (digit: string) => ({
onPress() {
pressDigit(digit);
call.sendDigits(digit);
},
}),
[call, pressDigit],
);
useEffect(() => {
if (device !== null) {
call.makeCall();
}
}, [device]);
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>
<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")}>
<button
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" />
</button>
</Keypad>
</div>
);
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;