Openstatus www.openstatus.dev

chore: add pricing

authored by

Maximilian Kaske and committed by
Maximilian Kaske
6ff69266 a3474e7d

+14 -14
+1 -1
apps/web/src/components/banner/coming-soon-banner.tsx
··· 1 - import { Alert, AlertTitle, AlertDescription } from "@openstatus/ui"; 1 + import { Alert, AlertDescription, AlertTitle } from "@openstatus/ui"; 2 2 import { Hourglass } from "lucide-react"; 3 3 4 4 interface Props {
+7 -7
apps/web/src/components/forms/monitor/form.tsx
··· 36 36 import { SectionAssertions } from "./section-assertions"; 37 37 import { SectionDanger } from "./section-danger"; 38 38 import { SectionNotifications } from "./section-notifications"; 39 + import { SectionOtel } from "./section-otel"; 39 40 import { SectionRequests } from "./section-requests"; 40 41 import { SectionScheduling } from "./section-scheduling"; 41 42 import { SectionStatusPage } from "./section-status-page"; 42 - import { SectionOtel } from "./section-otel"; 43 43 44 44 interface Props { 45 45 defaultSection?: string; ··· 93 93 // biome-ignore lint/suspicious/noExplicitAny: <explanation> 94 94 headerAssertions: _assertions.filter((a) => a.type === "header") as any, // TS considers a.type === "status" 95 95 textBodyAssertions: _assertions.filter( 96 - (a) => a.type === "textBody" 96 + (a) => a.type === "textBody", 97 97 // biome-ignore lint/suspicious/noExplicitAny: <explanation> 98 98 ) as any, // TS considers a.type === "textBody" 99 99 degradedAfter: defaultValues?.degradedAfter, ··· 107 107 const [pingFailed, setPingFailed] = React.useState(false); 108 108 const type = React.useMemo( 109 109 () => (defaultValues ? "update" : "create"), 110 - [defaultValues] 110 + [defaultValues], 111 111 ); 112 112 113 113 const handleDataUpdateOrInsertion = async (props: InsertMonitor) => { ··· 154 154 finally: () => { 155 155 setPending(false); 156 156 }, 157 - } 157 + }, 158 158 ); 159 159 }; 160 160 ··· 189 189 body && 190 190 body !== "" && 191 191 headers?.some( 192 - (h) => h.key === "Content-Type" && h.value === "application/json" 192 + (h) => h.key === "Content-Type" && h.value === "application/json", 193 193 ) 194 194 ) { 195 195 const validJSON = validateJSON(body); ··· 218 218 ...(statusAssertions || []), 219 219 ...(headerAssertions || []), 220 220 ...(textBodyAssertions || []), 221 - ]) 221 + ]), 222 222 ); 223 223 224 224 const data = (await res.json()) as RegionChecker; ··· 254 254 if (error instanceof Error && error.name === "AbortError") { 255 255 return { 256 256 error: `Abort error: request takes more then ${formatDuration( 257 - ABORT_TIMEOUT 257 + ABORT_TIMEOUT, 258 258 )}.`, 259 259 }; 260 260 }
+5 -5
apps/web/src/components/forms/monitor/section-otel.tsx
··· 1 1 "use client"; 2 2 3 3 import { X } from "lucide-react"; 4 - import { useFieldArray, type UseFormReturn } from "react-hook-form"; 4 + import { type UseFormReturn, useFieldArray } from "react-hook-form"; 5 5 6 6 import type { InsertMonitor } from "@openstatus/db/src/schema"; 7 7 import type { Limits } from "@openstatus/db/src/schema/plan/schema"; ··· 17 17 Input, 18 18 } from "@openstatus/ui"; 19 19 20 - import { SectionHeader } from "../shared/section-header"; 20 + import { ComingSoonBanner } from "@/components/banner/coming-soon-banner"; 21 21 import { ProFeatureAlert } from "@/components/billing/pro-feature-alert"; 22 - import { ComingSoonBanner } from "@/components/banner/coming-soon-banner"; 22 + import { SectionHeader } from "../shared/section-header"; 23 23 24 24 interface Props { 25 25 form: UseFormReturn<InsertMonitor>; ··· 45 45 <div className="grid w-full gap-4"> 46 46 <SectionHeader 47 47 title="OpenTelemetry" 48 - description="Configure your OpenTelemetry endpoint to send metrics to." 48 + description="Configure your OpenTelemetry Exporter." 49 49 /> 50 50 <div className="grid sm:grid-cols-2 md:grid-cols-3"> 51 51 <FormField ··· 63 63 /> 64 64 </FormControl> 65 65 <FormDescription> 66 - The endpoint to send metrics to. 66 + The endpoint to send the metrics to. 67 67 </FormDescription> 68 68 <FormMessage /> 69 69 </FormItem>
+1 -1
apps/web/src/config/pricing-table.tsx
··· 50 50 label: "Multi-region monitoring", 51 51 }, 52 52 { value: "max-regions", label: "Number of Regions" }, 53 - 54 53 { value: "data-retention", label: "Data retention" }, 55 54 { value: "screenshots", label: "Screenshots upon failure" }, 55 + { value: "otel", label: "OTel Exporter", badge: "Coming soon" }, 56 56 ], 57 57 }, 58 58 "synthetic-checks": {