Skip to content

Commit b1b9aac

Browse files
committed
chore
1 parent 82cca61 commit b1b9aac

2 files changed

Lines changed: 23 additions & 27 deletions

File tree

apps/web/modules/settings/my-account/phone-numbers-view.tsx

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
"use client";
22

3+
import { zodResolver } from "@hookform/resolvers/zod";
4+
import { isValidPhoneNumber } from "libphonenumber-js";
35
import { useSearchParams } from "next/navigation";
46
import { useState, useEffect } from "react";
57
import { Controller, useForm } from "react-hook-form";
8+
import z from "zod";
69

710
import { Dialog } from "@calcom/features/components/controlled-dialog";
811
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
@@ -36,11 +39,19 @@ const SkeletonLoader = () => {
3639
);
3740
};
3841

42+
const formSchema = z.object({
43+
phoneNumber: z.string().refine((val) => isValidPhoneNumber(val)),
44+
terminationUri: z.string().min(1, "Termination URI is required"),
45+
sipTrunkAuthUsername: z.string().optional(),
46+
sipTrunkAuthPassword: z.string().optional(),
47+
nickname: z.string().optional(),
48+
});
49+
3950
function PhoneNumbersView({
4051
numbers = [],
4152
revalidatePage,
4253
}: {
43-
numbers?: RouterOutputs["viewer"]["loggedInViewerRouter"]["list"];
54+
numbers?: RouterOutputs["viewer"]["phoneNumber"]["list"];
4455
revalidatePage: () => Promise<void>;
4556
}) {
4657
const { t } = useLocale();
@@ -51,7 +62,8 @@ function PhoneNumbersView({
5162
const utils = trpc.useUtils();
5263
const searchParams = useSearchParams();
5364

54-
const formMethods = useForm({
65+
const formMethods = useForm<z.infer<typeof formSchema>>({
66+
resolver: zodResolver(formSchema),
5567
defaultValues: {
5668
phoneNumber: "",
5769
terminationUri: "",
@@ -103,8 +115,8 @@ function PhoneNumbersView({
103115
});
104116

105117
const importNumberMutation = trpc.viewer.phoneNumber.import.useMutation({
106-
onSuccess: async (data: { message?: string }) => {
107-
showToast(data.message || "Phone number imported successfully", "success");
118+
onSuccess: async () => {
119+
showToast("Phone number imported successfully", "success");
108120
await utils.viewer.phoneNumber.list.invalidate();
109121
await utils.viewer.me.get.invalidate();
110122
await formMethods.reset();
@@ -197,7 +209,7 @@ function PhoneNumbersView({
197209
<div>
198210
{numbers.length > 0 ? (
199211
<div className="border-subtle rounded-b-lg border border-t-0">
200-
{numbers.map((number, index) => (
212+
{numbers.map((number, index: number) => (
201213
<div
202214
key={number.id}
203215
className={`flex items-center justify-between p-6 ${
@@ -283,11 +295,7 @@ function PhoneNumbersView({
283295
<span className="flex items-center gap-1">
284296
{t("phone_number")}
285297
<Tooltip content={t("phone_number_info_tooltip")}>
286-
<Icon
287-
name="info"
288-
className="h-4 w-4 cursor-pointer text-gray-400"
289-
title={t("phone_number_info_tooltip")}
290-
/>
298+
<Icon name="info" className="h-4 w-4 cursor-pointer text-gray-400" />
291299
</Tooltip>
292300
</span>
293301
}
@@ -312,11 +320,7 @@ function PhoneNumbersView({
312320
<span className="flex items-center gap-1">
313321
{t("termination_uri")}
314322
<Tooltip content={t("termination_uri_info_tooltip")}>
315-
<Icon
316-
name="info"
317-
className="h-4 w-4 cursor-pointer text-gray-400"
318-
title={t("termination_uri_info_tooltip")}
319-
/>
323+
<Icon name="info" className="h-4 w-4 cursor-pointer text-gray-400" />
320324
</Tooltip>
321325
</span>
322326
}
@@ -370,11 +374,7 @@ function PhoneNumbersView({
370374
<span className="flex items-center gap-1">
371375
{t("sip_trunk_password")} ({t("optional")})
372376
<Tooltip content={t("sip_trunk_password_info_tooltip")}>
373-
<Icon
374-
name="info"
375-
className="h-4 w-4 cursor-pointer text-gray-400"
376-
title={t("sip_trunk_password_info_tooltip")}
377-
/>
377+
<Icon name="info" className="h-4 w-4 cursor-pointer text-gray-400" />
378378
</Tooltip>
379379
</span>
380380
}
@@ -399,11 +399,7 @@ function PhoneNumbersView({
399399
<span className="flex items-center gap-1">
400400
{t("nickname")} ({t("optional")})
401401
<Tooltip content={t("nickname_info_tooltip")}>
402-
<Icon
403-
name="info"
404-
className="h-4 w-4 cursor-pointer text-gray-400"
405-
title={t("nickname_info_tooltip")}
406-
/>
402+
<Icon name="info" className="h-4 w-4 cursor-pointer text-gray-400" />
407403
</Tooltip>
408404
</span>
409405
}
@@ -459,10 +455,9 @@ export default function PhoneNumbersQueryView({
459455
cachedNumbers,
460456
revalidatePage,
461457
}: {
462-
cachedNumbers: RouterOutputs["viewer"]["loggedInViewerRouter"]["list"];
458+
cachedNumbers: RouterOutputs["viewer"]["phoneNumber"]["list"];
463459
revalidatePage: () => Promise<void>;
464460
}) {
465-
const { t } = useLocale();
466461
const { data: numbers, isPending } = trpc.viewer.phoneNumber.list.useQuery(undefined, {
467462
suspense: false,
468463
});

packages/features/eventtypes/lib/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ export type TabMap = {
198198
webhooks?: React.ReactNode;
199199
workflows?: React.ReactNode;
200200
payments?: React.ReactNode;
201+
aiSelfServe?: React.ReactNode;
201202
};
202203

203204
export type SettingsToggleClassNames = {

0 commit comments

Comments
 (0)