11"use client" ;
22
3+ import { zodResolver } from "@hookform/resolvers/zod" ;
4+ import { isValidPhoneNumber } from "libphonenumber-js" ;
35import { useSearchParams } from "next/navigation" ;
46import { useState , useEffect } from "react" ;
57import { Controller , useForm } from "react-hook-form" ;
8+ import z from "zod" ;
69
710import { Dialog } from "@calcom/features/components/controlled-dialog" ;
811import 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+
3950function 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 } ) ;
0 commit comments