import type { RouterOutputs } from '@/trpc/client'; import { SheetContent } from '@/components/ui/sheet'; import { useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { popModal } from '.'; import { ModalHeader } from './Modal/Container'; import { ColorSquare } from '@/components/color-square'; import { InputWithLabel, WithLabel } from '@/components/forms/input-with-label'; import { PureFilterItem } from '@/components/report/sidebar/filters/FilterItem'; import { Button } from '@/components/ui/button'; import { Combobox } from '@/components/ui/combobox'; import { ComboboxAdvanced } from '@/components/ui/combobox-advanced'; import { ComboboxEvents } from '@/components/ui/combobox-events'; import { Textarea } from '@/components/ui/textarea'; import { useAppParams } from '@/hooks/use-app-params'; import { useEventNames } from '@/hooks/use-event-names'; import { useEventProperties } from '@/hooks/use-event-properties'; import { useTRPC } from '@/integrations/trpc/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { shortId } from '@openpanel/common'; import { zCreateNotificationRule } from '@openpanel/validation'; import { useMutation, useQuery } from '@tanstack/react-query'; import { FilterIcon, PlusIcon, SaveIcon, TrashIcon } from 'lucide-react'; import { Controller, type SubmitHandler, type UseFormReturn, useFieldArray, useForm, useWatch, } from 'react-hook-form'; import type { z } from 'zod'; interface Props { rule?: RouterOutputs['notification']['rules'][number]; } type IForm = z.infer; export default function AddNotificationRule({ rule }: Props) { const client = useQueryClient(); const { organizationId, projectId } = useAppParams(); const form = useForm({ resolver: zodResolver(zCreateNotificationRule), defaultValues: { id: rule?.id ?? '', name: rule?.name ?? '', sendToApp: rule?.sendToApp ?? false, sendToEmail: rule?.sendToEmail ?? false, integrations: rule?.integrations.map((integration) => integration.id) ?? [], projectId, template: rule?.template ?? '', config: rule?.config ?? { type: 'events', events: [ { name: '', segment: 'event', filters: [], }, ], }, }, }); const trpc = useTRPC(); const mutation = useMutation( trpc.notification.createOrUpdateRule.mutationOptions({ onSuccess() { toast.success( rule ? 'Notification rule updated' : 'Notification rule created', ); client.refetchQueries( trpc.notification.rules.queryFilter({ projectId, }), ); popModal(); }, }), ); const integrationsQuery = useQuery( trpc.integration.list.queryOptions({ organizationId: organizationId!, }), ); const eventsArray = useFieldArray({ control: form.control, name: 'config.events', }); const onSubmit: SubmitHandler = (data) => { if (!data.config.events[0]?.name) { toast.error('At least one event is required'); return; } mutation.mutate(data); }; const integrations = integrationsQuery.data ?? []; return (
( )} />
{eventsArray.fields.map((field, index) => { return ( eventsArray.remove(index)} /> ); })}

Customize your notification message. You can grab any property from your event.

  • {'{{name}}'} - The name of the event
  • {'{{rule_name}}'} - The name of the rule
  • {'{{properties.your.property}}'} - Get the value of a custom property
  • {'{{profile.firstName}}'} - Get the value of a profile property
  • And many more... profileId createdAt country city os osVersion browser browserVersion device brand model path origin referrer referrerName referrerType
} >