- {description} + {t("no_workflows_description")}
- {buttonOnClick && buttonText && ( - - )} -{activeOn.eventType.title}
- ))}> +{activeOn.eventType.title}
+ ))}> ++ {form.formState?.errors?.steps[step.stepNumber - 1]?.sendTo?.message || ""} +
+ )} > )} diff --git a/packages/features/ee/workflows/lib/reminders/reminderScheduler.ts b/packages/features/ee/workflows/lib/reminders/reminderScheduler.ts index 769ac11f41..6ef3f02b61 100644 --- a/packages/features/ee/workflows/lib/reminders/reminderScheduler.ts +++ b/packages/features/ee/workflows/lib/reminders/reminderScheduler.ts @@ -54,6 +54,7 @@ export const scheduleWorkflowReminders = async ( step.template, step.sender || SENDER_ID, workflow.userId, + workflow.teamId, step.numberVerificationPending ); } else if ( @@ -124,6 +125,7 @@ export const sendCancelledReminders = async ( step.template, step.sender || SENDER_ID, workflow.userId, + workflow.teamId, step.numberVerificationPending ); } else if ( diff --git a/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts b/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts index 6b17c0dbb0..fe726b4a65 100644 --- a/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts +++ b/packages/features/ee/workflows/lib/reminders/smsReminderManager.ts @@ -53,7 +53,8 @@ export const scheduleSMSReminder = async ( workflowStepId: number, template: WorkflowTemplates, sender: string, - userId: number, + userId?: number | null, + teamId?: number | null, isVerificationPending = false ) => { const { startTime, endTime } = evt; @@ -69,7 +70,10 @@ export const scheduleSMSReminder = async ( async function getIsNumberVerified() { if (action === WorkflowActions.SMS_ATTENDEE) return true; const verifiedNumber = await prisma.verifiedNumber.findFirst({ - where: { userId, phoneNumber: reminderPhone || "" }, + where: { + OR: [{ userId }, { teamId }], + phoneNumber: reminderPhone || "", + }, }); if (!!verifiedNumber) return true; return isVerificationPending; diff --git a/packages/features/ee/workflows/lib/reminders/verifyPhoneNumber.ts b/packages/features/ee/workflows/lib/reminders/verifyPhoneNumber.ts index 4f911cd59a..6041747e5d 100644 --- a/packages/features/ee/workflows/lib/reminders/verifyPhoneNumber.ts +++ b/packages/features/ee/workflows/lib/reminders/verifyPhoneNumber.ts @@ -6,13 +6,21 @@ export const sendVerificationCode = async (phoneNumber: string) => { return twilio.sendVerificationCode(phoneNumber); }; -export const verifyPhoneNumber = async (phoneNumber: string, code: string, userId: number) => { +export const verifyPhoneNumber = async ( + phoneNumber: string, + code: string, + userId?: number, + teamId?: number +) => { + if (!userId && !teamId) return true; + const verificationStatus = await twilio.verifyNumber(phoneNumber, code); if (verificationStatus === "approved") { await prisma.verifiedNumber.create({ data: { userId, + teamId, phoneNumber, }, }); diff --git a/packages/features/ee/workflows/pages/index.tsx b/packages/features/ee/workflows/pages/index.tsx index dbaee5bb90..55c95eff84 100644 --- a/packages/features/ee/workflows/pages/index.tsx +++ b/packages/features/ee/workflows/pages/index.tsx @@ -1,26 +1,34 @@ import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; +import type { Dispatch, SetStateAction } from "react"; +import { useState, useEffect } from "react"; import Shell from "@calcom/features/shell/Shell"; +import { classNames } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { HttpError } from "@calcom/lib/http-error"; import { trpc } from "@calcom/trpc/react"; -import { Button, showToast } from "@calcom/ui"; -import { FiPlus } from "@calcom/ui/components/icon"; +import { AnimatedPopover, Avatar, CreateButton, showToast } from "@calcom/ui"; import LicenseRequired from "../../common/components/v2/LicenseRequired"; import SkeletonLoader from "../components/SkeletonLoaderList"; +import type { WorkflowType } from "../components/WorkflowListPage"; import WorkflowList from "../components/WorkflowListPage"; function WorkflowsPage() { const { t } = useLocale(); - const session = useSession(); const router = useRouter(); + const [checkedFilterItems, setCheckedFilterItems] = useState<{ userId: number | null; teamIds: number[] }>({ + userId: session.data?.user.id || null, + teamIds: [], + }); - const { data, isLoading } = trpc.viewer.workflows.list.useQuery(); + const { data: allWorkflowsData, isLoading } = trpc.viewer.workflows.list.useQuery(); - const createMutation = trpc.viewer.workflows.createV2.useMutation({ + const [filteredWorkflows, setFilteredWorkflows] = useState