diff --git a/src/api/index.ts b/src/api/index.ts index c94255a..813d28d 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -3,6 +3,7 @@ import { FetchError, FetchTransport, Queue, + RegisteredUser, StatusCodes, } from "./types"; import { MSG_SOMETHING_WRONG } from "./constants"; @@ -144,3 +145,10 @@ export const getQueues = () => { `${advancedSettings.apiServer}/Accounts/${advancedSettings.accountSid}/Queues` ); }; + +export const getSelfRegisteredUser = (username: string) => { + const advancedSettings = getAdvancedSettings(); + return getFetch( + `${advancedSettings.apiServer}/Accounts/${advancedSettings.accountSid}/RegisteredSipUsers/${username}` + ); +}; diff --git a/src/api/types.ts b/src/api/types.ts index a99625b..a7fc7b1 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -34,3 +34,14 @@ export interface Queue { name: string; length: number; } + +export interface RegisteredUser { + name: string; + contact: string; + expiryTime: number; + protocol: string; + allow_direct_app_calling: boolean; + allow_direct_queue_calling: boolean; + allow_direct_user_calling: boolean; + registered_status: string; +} diff --git a/src/window/phone/index.tsx b/src/window/phone/index.tsx index 0e6fecd..9df353c 100644 --- a/src/window/phone/index.tsx +++ b/src/window/phone/index.tsx @@ -52,9 +52,15 @@ import { import { OutGoingCall } from "./outgoing-call"; import { v4 as uuidv4 } from "uuid"; import IconButtonMenu, { IconButtonMenuItems } from "src/components/menu"; -import { getApplications, getQueues, getRegisteredUser } from "src/api"; +import { + getApplications, + getQueues, + getRegisteredUser, + getSelfRegisteredUser, +} from "src/api"; import JambonzSwitch from "src/components/switch"; import { DEFAULT_TOAST_DURATION } from "src/common/constants"; +import { RegisteredUser } from "src/api/types"; type PhoneProbs = { sipDomain: string; @@ -100,6 +106,13 @@ export const Phone = ({ const sipDisplayNameRef = useRef(""); const [isForceChangeUaStatus, setIsForceChangeUaStatus] = useState(false); const isInputNumberFocusRef = useRef(false); + const [registeredUser, setRegisteredUser] = useState>( + { + allow_direct_app_calling: false, + allow_direct_queue_calling: false, + allow_direct_user_calling: false, + } + ); const toast = useToast(); useEffect(() => { @@ -162,6 +175,17 @@ export const Phone = ({ } }, [status]); + useEffect(() => { + getSelfRegisteredUser(sipUsernameRef.current).then(({ json }) => { + setRegisteredUser(json); + }); + setInterval(() => { + getSelfRegisteredUser(sipUsernameRef.current).then(({ json }) => { + setRegisteredUser(json); + }); + }, 20000); + }, []); + // useEffect(() => { // chrome.runtime.onMessage.addListener(function (request) { // const msg = request as Message; @@ -478,91 +502,98 @@ export const Phone = ({ > {isAdvanceMode && isSipClientIdle(callStatus) && ( - } - tooltip="Call an online user" - noResultLabel="No one else is online" - onClick={(_, value) => { - setInputNumber(value); - makeOutboundCall(value); - }} - onOpen={() => { - return new Promise( - (resolve, reject) => { - getRegisteredUser() - .then(({ json }) => { - resolve( - json - .filter((u) => !u.includes(sipUsername)) - .map((u) => { - const uName = u.match(/(^.*)@.*/); - return { - name: uName ? uName[1] : u, - value: uName ? uName[1] : u, - }; - }) - ); - }) - .catch((err) => reject(err)); - } - ); - }} - /> - } - tooltip="Take a call from queue" - noResultLabel="No calls in queue" - onClick={(name, value) => { - setAppName(`Queue ${name}`); - const calledQueue = `queue-${value}`; - setInputNumber(""); - makeOutboundCall(calledQueue, `Queue ${name}`); - }} - onOpen={() => { - return new Promise( - (resolve, reject) => { - getQueues() - .then(({ json }) => { - resolve( - json.map((q) => ({ - name: `${q.name} (${q.length})`, - value: q.name, - })) - ); - }) - .catch((err) => reject(err)); - } - ); - }} - /> + {registeredUser.allow_direct_user_calling && ( + } + tooltip="Call an online user" + noResultLabel="No one else is online" + onClick={(_, value) => { + setInputNumber(value); + makeOutboundCall(value); + }} + onOpen={() => { + return new Promise( + (resolve, reject) => { + getRegisteredUser() + .then(({ json }) => { + resolve( + json + .filter((u) => !u.includes(sipUsername)) + .map((u) => { + const uName = u.match(/(^.*)@.*/); + return { + name: uName ? uName[1] : u, + value: uName ? uName[1] : u, + }; + }) + ); + }) + .catch((err) => reject(err)); + } + ); + }} + /> + )} - } - tooltip="Call an application" - noResultLabel="No applications" - onClick={(name, value) => { - setAppName(`App ${name}`); - const calledAppId = `app-${value}`; - setInputNumber(""); - makeOutboundCall(calledAppId, `App ${name}`); - }} - onOpen={() => { - return new Promise( - (resolve, reject) => { - getApplications() - .then(({ json }) => { - resolve( - json.map((a) => ({ - name: a.name, - value: a.application_sid, - })) - ); - }) - .catch((err) => reject(err)); - } - ); - }} - /> + {registeredUser.allow_direct_queue_calling && ( + } + tooltip="Take a call from queue" + noResultLabel="No calls in queue" + onClick={(name, value) => { + setAppName(`Queue ${name}`); + const calledQueue = `queue-${value}`; + setInputNumber(""); + makeOutboundCall(calledQueue, `Queue ${name}`); + }} + onOpen={() => { + return new Promise( + (resolve, reject) => { + getQueues() + .then(({ json }) => { + resolve( + json.map((q) => ({ + name: `${q.name} (${q.length})`, + value: q.name, + })) + ); + }) + .catch((err) => reject(err)); + } + ); + }} + /> + )} + + {registeredUser.allow_direct_app_calling && ( + } + tooltip="Call an application" + noResultLabel="No applications" + onClick={(name, value) => { + setAppName(`App ${name}`); + const calledAppId = `app-${value}`; + setInputNumber(""); + makeOutboundCall(calledAppId, `App ${name}`); + }} + onOpen={() => { + return new Promise( + (resolve, reject) => { + getApplications() + .then(({ json }) => { + resolve( + json.map((a) => ({ + name: a.name, + value: a.application_sid, + })) + ); + }) + .catch((err) => reject(err)); + } + ); + }} + /> + )} )}