+8









Joe Au-Yeung
GitHub
sean-brydon
Peer Richelsen
zomars
Hariom Balhara
Julian Benegas
Alan
Kszemi
Leo Giovanetti
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Crowdin Bot
kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
Carina Wollendorfer
CarinaWolli
Noah
Syed Ali Shahbaz
Udit Takkar
ded1fce6fa
* Fix breadcrumb colors * HorizontalTabs * Team List Item WIP * Horizontal Tabs * Cards * Remove team list item WIP * Login Page * Add welcome back i118n * EventType page work * Update EventType Icons * WIP Availability * Horizontal Tab Work * Add build command for in root * Update build DIr/command * Add Edit Button + change buttons to v2 * Availablitiy page * Fix IPAD * Make mobile look a little nicer * WIP bookingshell * Remove list items from breaking build * Mian bulk of Booking Page. * Few updates to components * Fix chormatic feedback * Fix banner * Fix Empty Screen * Text area + embded window fixes * Semi fix avatar * Troubleshoot container + Active on count * Improve mobile * NITS * Fix padding on input * Fix icons * Starting to move event types settings to tabs * Begin migration to single page form * Single page tabs * Limits Page * Advanced tab * Add RHF to dependancies * Most of advanced tab * Solved RHF mismtach * Build fixes * RHF conditionals fixes * Improved legibility * Major refactor/organisation into optional V2 UI * Portal EditLocationModal * Fix dialoug form * Update imports * Auto Animate + custom inputs WIP * Custom Inputs * WIP Apps * Fixing stories imports * Stripe app * Remove duplicate dialog * Remove duplicate dialog * Fix embed URL * Fix app toggles + number of active apps * Fix container padding on disabledBorder prop * Removes strict * EventType Team page WIP * Fix embed * NIT * Add Darkmode gray color * V2 Shell WIP * Create my account folder * Add profile section * Fix headings on shell V2 * Fix mobile layout with V2 shell * V2 create event type button * Checked Team Select * Hidden to happen on save - not on toggle * Team Attendee Select animation * WIP * Fix scheduling type and remove multi select label * Fix overflow on teams url * Finish profile fields * Show toast on success * General tab WIP * Even Type move order handles * Add switching of destination calendar * List calendar and delete * Render empty screenwhen no calendars * Fix Embed TS errors * Fix TS errors * Fix Eslint errors * Fix TS errors for UI * Fix ESLINT error * added SidebarCard for promo to v2 and storybook (#3906) Co-authored-by: Julian Benegas <julianbenegas99@gmail.com> Co-authored-by: Alan <alannnc@gmail.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> * Tooltip Provider - Wrapper due to dep upgrade * public event type list darkmode * V2 Color changes to public booking * Remove unused component * Fix typecheck * Transfer to SSR * Appearance screen made * V2 image uploader * WIP appearance page * Remove unnecessary data from viewer.me * Add profile translations * Add translations to general page * Add calendar switch * Add calendar switch * Add translations to appearance page * Clean up conferencing page * Clean up appearance page * Draft shell on md screen * fixed slots availability by fixing buffertime (#3756) Co-authored-by: Peer Richelsen <peeroke@gmail.com> * Hidding import features from other services (#3970) * Update PULL_REQUEST_TEMPLATE.md * Fixes CLS when loading Avatars (#3973) * Fixes CLS when loading Avatars * Update packages/ui/v2/core/Avatar.tsx Co-authored-by: Leo Giovanetti <hello@leog.me> Co-authored-by: Leo Giovanetti <hello@leog.me> * New Crowdin translations by Github Action (#3954) Co-authored-by: Crowdin Bot <support+bot@crowdin.com> * Adding continue button to connectCalendar on getting-started view (#3971) * Adding continue button to connectCalendar view getting-started * Fixing extra space Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Leo Giovanetti <hello@leog.me> * 2.0 Settings / My Account {View} (#3874) * Fix breadcrumb colors * HorizontalTabs * Team List Item WIP * Horizontal Tabs * Cards * Remove team list item WIP * Login Page * Add welcome back i118n * EventType page work * Update EventType Icons * WIP Availability * Horizontal Tab Work * Add build command for in root * Update build DIr/command * Add Edit Button + change buttons to v2 * Availablitiy page * Fix IPAD * Make mobile look a little nicer * WIP bookingshell * Remove list items from breaking build * Mian bulk of Booking Page. * Few updates to components * Fix chormatic feedback * Fix banner * Fix Empty Screen * Text area + embded window fixes * Semi fix avatar * Troubleshoot container + Active on count * Improve mobile * NITS * Fix padding on input * Fix icons * Starting to move event types settings to tabs * Begin migration to single page form * Single page tabs * Limits Page * Advanced tab * Add RHF to dependancies * Most of advanced tab * Solved RHF mismtach * Build fixes * RHF conditionals fixes * Improved legibility * Major refactor/organisation into optional V2 UI * Portal EditLocationModal * Fix dialoug form * Update imports * Auto Animate + custom inputs WIP * Custom Inputs * WIP Apps * Fixing stories imports * Stripe app * Remove duplicate dialog * Remove duplicate dialog * Fix embed URL * Fix app toggles + number of active apps * Fix container padding on disabledBorder prop * Removes strict * EventType Team page WIP * Fix embed * NIT * Add Darkmode gray color * V2 Shell WIP * Create my account folder * Add profile section * Fix headings on shell V2 * Fix mobile layout with V2 shell * V2 create event type button * Checked Team Select * Hidden to happen on save - not on toggle * Team Attendee Select animation * WIP * Fix scheduling type and remove multi select label * Fix overflow on teams url * Finish profile fields * Show toast on success * General tab WIP * Even Type move order handles * Add switching of destination calendar * List calendar and delete * Render empty screenwhen no calendars * Fix Embed TS errors * Fix TS errors * Fix Eslint errors * Fix TS errors for UI * Fix ESLINT error * added SidebarCard for promo to v2 and storybook (#3906) Co-authored-by: Julian Benegas <julianbenegas99@gmail.com> Co-authored-by: Alan <alannnc@gmail.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> * Tooltip Provider - Wrapper due to dep upgrade * public event type list darkmode * V2 Color changes to public booking * Remove unused component * Fix typecheck * Transfer to SSR * Appearance screen made * V2 image uploader * WIP appearance page * Remove unnecessary data from viewer.me * Add profile translations * Add translations to general page * Add calendar switch * Add calendar switch * Add translations to appearance page * Clean up conferencing page * Settings sidebar fixes * Updates middleware * Update SettingsLayout.tsx * Settings layout improvements * Type fix Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Julian Benegas <julianbenegas99@gmail.com> Co-authored-by: Alan <alannnc@gmail.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * AppStore CLI: Making video app creation a breeze with major cleanup of locations code throughout (#3825) * Fix breadcrumb colors * HorizontalTabs * Team List Item WIP * Horizontal Tabs * Cards * Remove team list item WIP * Login Page * Add welcome back i118n * EventType page work * Update EventType Icons * WIP Availability * Horizontal Tab Work * Add build command for in root * Update build DIr/command * Add Edit Button + change buttons to v2 * Availablitiy page * Fix IPAD * Make mobile look a little nicer * WIP bookingshell * Remove list items from breaking build * Add Embed ModalBox for routing forms * Mian bulk of Booking Page. * Few updates to components * Fix chormatic feedback * Add duplicate form support * Fix duplication logic * Change to feathericons everywhere and other fixes * Dont allow routes for fallback route * Fix banner * Fix Empty Screen * Text area + embded window fixes * Semi fix avatar * Fix all TS issues * Fix tests * Troubleshoot container + Active on count * Support routing using query params * Improve mobile * NITS * Fix padding on input * Support multiselect in router endpoint * Fix the issue where app goes in embed mode after viewing embed once * Fix icons * Add router url tests * Add Responses download and form toggling tests * Add required validation test * Change Icons everywhere * App typeform app * Improvements in cli * Starting to move event types settings to tabs * Begin migration to single page form * Single page tabs * Limits Page * Advanced tab * Add RHF to dependancies * Add typeform how-to-use page * Add typeform how-to-use page and screenshots * Most of advanced tab * Solved RHF mismtach * Build fixes * RHF conditionals fixes * Improved legibility * Fix TS error * Add missing image * Update CliApp.tsx * Major refactor/organisation into optional V2 UI * Portal EditLocationModal * Fix dialoug form * Update imports * Auto Animate + custom inputs WIP * Custom Inputs * WIP Apps * Fixing stories imports * Stripe app * Remove duplicate dialog * Remove duplicate dialog * Major locations cleanup, 10s of bug fixes and app-store improvements * Fix missing pieces * More fixes * Fix embed URL * Fix app toggles + number of active apps * Fix container padding on disabledBorder prop * Removes strict * more fixes * EventType Team page WIP * Fix embed * NIT * Add Darkmode gray color * V2 Shell WIP * Fix headings on shell V2 * Fix mobile layout with V2 shell * V2 create event type button * Checked Team Select * Hidden to happen on save - not on toggle * Team Attendee Select animation * Fix scheduling type and remove multi select label * Fix overflow on teams url * Revert console * Revert api * Fix Embed TS errors * Fix TS errors * Fix Eslint errors * Fix TS errors for UI * Fix ESLINT error * Fix TS errors * Add missing import * Fix CLI * Add a default placeholder * Remove hardcoded daily:integrations * Fix message for payment page * Revert api and console to main * Update README * Fix TS errors * Fix Lint warnings * Fix Tests * Fix conflict issues * Fix conflict issues Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: zomars <zomars@me.com> * Button to test a workflow action (#3873) * add Test action button + UI improvements * add test action functionality * add confirmation dialog before sending SMS * code clean up * show error message if test action fails * disable test action button in edit mode * fixes SMS testing * use updated values * fix wrongly updated data in useEffect * fix typo * code clean up * fix UI issue in mobile view * small design fix Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * Improve CLI App Help Text (#3982) * Adds deprecation notice to QueryCell (#3977) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * added campfire.to app (#3984) * fixed file size campfire (#3985) * added campfire.to app * fixed file size * Draft shell on md screen * Draft small settings bar * Add padding to dropdown menu * WIP * Create mobile settings nav * Fix conferencing render * Only display mobile settings nav * Clean up my account section * Clean up * Remove old draft shell * Remove old draft shell * Implement changes from #3817 * WIP * Create webhooks page * WIP Webhook form * WIP * WIP Webhook * WIP * Create edit webhook page * Edit webhooks * Edit API keys * Update API key name * Create embeds page * Fix type errors * Remove embeds page * Improves Zapier response and payload (#3892) * improve listBookings API call * improve payload for zapier call * use more readable location for integrations * remove cancellation reason * convert location to readbale string * code clean up * code clean up * updated expected webhook response for e2e tests * fix failing e2e * revert webhook response Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * fixed dark mode team page (#4315) * Checkly formatting * Move hidden label to toggle on events page (#4320) * Add events for routing forms * Bring shell changes from main * Clean up * WIP * V2 Multi-select (Team Select) (#4324) * --init * design improved * further fine tuning * more fixes * removed extra JSX tag * added story * NIT * revert to use of CheckedTeamSelect * Removes comments Co-authored-by: Peer Richelsen <peeroke@gmail.com> * fix: toggle alligment (#4361) * fix: add checked tranform for switch (#4357) * fixed input size on mobile, fixed settings (#4360) * fixed input size on mobile, fixed settings (#4360) * Fix merge errors * Fix API key page * Fix type error Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Julian Benegas <julianbenegas99@gmail.com> Co-authored-by: Alan <alannnc@gmail.com> Co-authored-by: Kszemi <mkrzemien11@gmail.com> Co-authored-by: Leo Giovanetti <hello@leog.me> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Carina Wollendorfer <30310907+CarinaWolli@users.noreply.github.com> Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: Noah <hi@noahflk.com> Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
246 lines
8.4 KiB
TypeScript
246 lines
8.4 KiB
TypeScript
import { Webhook } from "@prisma/client";
|
|
import { useEffect, useState } from "react";
|
|
import { Controller, useForm } from "react-hook-form";
|
|
|
|
import customTemplate, { hasTemplateIntegration } from "@calcom/features/webhooks/utils/integrationTemplate";
|
|
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
import showToast from "@calcom/lib/notification";
|
|
import { trpc } from "@calcom/trpc/react";
|
|
import Button from "@calcom/ui/Button";
|
|
import { DialogFooter } from "@calcom/ui/Dialog";
|
|
import Switch from "@calcom/ui/Switch";
|
|
import { FieldsetLegend, Form, InputGroupBox, TextArea, TextField } from "@calcom/ui/form/fields";
|
|
|
|
import { WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP } from "@lib/webhooks/constants";
|
|
|
|
import { TWebhook } from "@components/webhook/WebhookListItem";
|
|
import WebhookTestDisclosure from "@components/webhook/WebhookTestDisclosure";
|
|
|
|
/** @deprecated Moved to `packages/features/webhooks` */
|
|
export default function WebhookDialogForm(props: {
|
|
eventTypeId?: number;
|
|
defaultValues?: TWebhook;
|
|
app?: string;
|
|
handleClose: () => void;
|
|
webhooks: Webhook[];
|
|
}) {
|
|
const { t } = useLocale();
|
|
const utils = trpc.useContext();
|
|
const appId = props.app;
|
|
const webhooks = props.webhooks;
|
|
|
|
const triggers = !appId
|
|
? WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP["core"]
|
|
: WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP[appId as keyof typeof WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP];
|
|
const {
|
|
defaultValues = {
|
|
id: "",
|
|
eventTriggers: triggers,
|
|
subscriberUrl: "",
|
|
active: true,
|
|
payloadTemplate: null,
|
|
secret: null,
|
|
} as Omit<TWebhook, "userId" | "createdAt" | "eventTypeId" | "appId">,
|
|
} = props;
|
|
|
|
const [useCustomPayloadTemplate, setUseCustomPayloadTemplate] = useState(!!defaultValues.payloadTemplate);
|
|
const [changeSecret, setChangeSecret] = useState(false);
|
|
const [newSecret, setNewSecret] = useState("");
|
|
const hasSecretKey = !!defaultValues.secret;
|
|
const currentSecret = defaultValues.secret;
|
|
|
|
const subscriberUrlReserved = (subscriberUrl: string, id: string): boolean => {
|
|
return !!webhooks.find((webhook) => webhook.subscriberUrl === subscriberUrl && webhook.id !== id);
|
|
};
|
|
|
|
const form = useForm({
|
|
defaultValues,
|
|
});
|
|
|
|
const handleInput = (event: React.FormEvent<HTMLInputElement>) => {
|
|
setNewSecret(event.currentTarget.value);
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (changeSecret) {
|
|
form.unregister("secret", { keepDefaultValue: false });
|
|
}
|
|
}, [changeSecret]);
|
|
|
|
return (
|
|
<Form
|
|
data-testid="WebhookDialogForm"
|
|
form={form}
|
|
handleSubmit={async (event) => {
|
|
if (subscriberUrlReserved(event.subscriberUrl, event.id)) {
|
|
showToast(t("webhook_subscriber_url_reserved"), "error");
|
|
return;
|
|
}
|
|
const e = changeSecret
|
|
? { ...event, eventTypeId: props.eventTypeId, appId }
|
|
: { ...event, secret: currentSecret, eventTypeId: props.eventTypeId, appId };
|
|
if (!useCustomPayloadTemplate && event.payloadTemplate) {
|
|
event.payloadTemplate = null;
|
|
}
|
|
if (event.id) {
|
|
await utils.client.mutation("viewer.webhook.edit", e);
|
|
await utils.invalidateQueries(["viewer.webhook.list"]);
|
|
showToast(t("webhook_updated_successfully"), "success");
|
|
} else {
|
|
await utils.client.mutation("viewer.webhook.create", e);
|
|
await utils.invalidateQueries(["viewer.webhook.list"]);
|
|
showToast(t("webhook_created_successfully"), "success");
|
|
}
|
|
props.handleClose();
|
|
}}
|
|
className="space-y-4">
|
|
<div>
|
|
<input type="hidden" {...form.register("id")} />
|
|
</div>
|
|
<fieldset className="space-y-2">
|
|
<InputGroupBox className="border-0 bg-gray-50">
|
|
<Controller
|
|
control={form.control}
|
|
name="active"
|
|
render={({ field }) => (
|
|
<Switch
|
|
label={field.value ? t("webhook_enabled") : t("webhook_disabled")}
|
|
defaultChecked={field.value}
|
|
onCheckedChange={(isChecked) => {
|
|
form.setValue("active", isChecked);
|
|
}}
|
|
/>
|
|
)}
|
|
/>
|
|
</InputGroupBox>
|
|
</fieldset>
|
|
<div>
|
|
<TextField
|
|
label={t("subscriber_url")}
|
|
{...form.register("subscriberUrl")}
|
|
required
|
|
type="url"
|
|
onChange={(e) => {
|
|
form.setValue("subscriberUrl", e.target.value);
|
|
if (hasTemplateIntegration({ url: e.target.value })) {
|
|
setUseCustomPayloadTemplate(true);
|
|
form.setValue("payloadTemplate", customTemplate({ url: e.target.value }));
|
|
}
|
|
}}
|
|
/>
|
|
</div>
|
|
<fieldset className="space-y-2">
|
|
<FieldsetLegend>{t("event_triggers")}</FieldsetLegend>
|
|
<InputGroupBox className="border-0 bg-gray-50">
|
|
{triggers.map((key) => (
|
|
<Controller
|
|
key={key}
|
|
control={form.control}
|
|
name="eventTriggers"
|
|
render={({ field }) => (
|
|
<Switch
|
|
label={t(key.toLowerCase())}
|
|
defaultChecked={field.value.includes(key)}
|
|
onCheckedChange={(isChecked) => {
|
|
const value = field.value;
|
|
const newValue = isChecked ? [...value, key] : value.filter((v) => v !== key);
|
|
|
|
form.setValue("eventTriggers", newValue, {
|
|
shouldDirty: true,
|
|
});
|
|
}}
|
|
/>
|
|
)}
|
|
/>
|
|
))}
|
|
</InputGroupBox>
|
|
</fieldset>
|
|
<fieldset className="space-y-2">
|
|
{!!hasSecretKey && !changeSecret && (
|
|
<>
|
|
<FieldsetLegend>{t("secret")}</FieldsetLegend>
|
|
<div className="rounded-sm bg-gray-50 p-2 text-xs text-neutral-900">
|
|
{t("forgotten_secret_description")}
|
|
</div>
|
|
<Button
|
|
color="secondary"
|
|
type="button"
|
|
className="py-1 text-xs"
|
|
onClick={() => {
|
|
setChangeSecret(true);
|
|
}}>
|
|
{t("change_secret")}
|
|
</Button>
|
|
</>
|
|
)}
|
|
{!!hasSecretKey && changeSecret && (
|
|
<>
|
|
<TextField
|
|
autoComplete="off"
|
|
label={t("secret")}
|
|
{...form.register("secret")}
|
|
value={newSecret}
|
|
onChange={handleInput}
|
|
type="text"
|
|
placeholder={t("leave_blank_to_remove_secret")}
|
|
/>
|
|
<Button
|
|
color="secondary"
|
|
type="button"
|
|
className="py-1 text-xs"
|
|
onClick={() => {
|
|
setChangeSecret(false);
|
|
}}>
|
|
{t("cancel")}
|
|
</Button>
|
|
</>
|
|
)}
|
|
{!hasSecretKey && (
|
|
<TextField autoComplete="off" label={t("secret")} {...form.register("secret")} type="text" />
|
|
)}
|
|
</fieldset>
|
|
<fieldset className="space-y-2">
|
|
<FieldsetLegend>{t("payload_template")}</FieldsetLegend>
|
|
<div className="space-x-3 text-sm rtl:space-x-reverse">
|
|
<label>
|
|
<input
|
|
className="text-neutral-900 focus:ring-neutral-500"
|
|
type="radio"
|
|
name="useCustomPayloadTemplate"
|
|
onChange={(value) => setUseCustomPayloadTemplate(!value.target.checked)}
|
|
defaultChecked={!useCustomPayloadTemplate}
|
|
/>{" "}
|
|
Default
|
|
</label>
|
|
<label>
|
|
<input
|
|
className="text-neutral-900 focus:ring-neutral-500"
|
|
onChange={(value) => setUseCustomPayloadTemplate(value.target.checked)}
|
|
name="useCustomPayloadTemplate"
|
|
type="radio"
|
|
defaultChecked={useCustomPayloadTemplate}
|
|
/>{" "}
|
|
Custom
|
|
</label>
|
|
</div>
|
|
{useCustomPayloadTemplate && (
|
|
<TextArea
|
|
{...form.register("payloadTemplate")}
|
|
defaultValue={useCustomPayloadTemplate && (defaultValues.payloadTemplate || "")}
|
|
rows={3}
|
|
/>
|
|
)}
|
|
</fieldset>
|
|
<WebhookTestDisclosure />
|
|
<DialogFooter>
|
|
<Button type="button" color="secondary" onClick={props.handleClose} tabIndex={-1}>
|
|
{t("cancel")}
|
|
</Button>
|
|
<Button type="submit" loading={form.formState.isSubmitting}>
|
|
{t("save")}
|
|
</Button>
|
|
</DialogFooter>
|
|
</Form>
|
|
);
|
|
}
|