Skip to content

Commit 063ec9d

Browse files
mikewheatonConvex, Inc.
authored andcommitted
Dashboard: Capture More PostHog Events (#44265)
Captures more events for PostHog analytics. GitOrigin-RevId: 2c69751246b93f31b3146f4fc722760d75aafba2
1 parent 83f658e commit 063ec9d

25 files changed

+163
-10
lines changed

npm-packages/dashboard-common/src/elements/CopyButton.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ export function CopyButton({
1010
tip,
1111
tipSide,
1212
disabled,
13+
onCopied,
1314
}: {
1415
text: string;
1516
className?: string;
1617
inline?: boolean;
1718
tip?: string;
1819
tipSide?: "top" | "bottom" | "left" | "right";
1920
disabled?: boolean;
21+
onCopied?: () => void;
2022
}) {
2123
const [copied, setCopied] = useState(false);
2224

@@ -27,6 +29,7 @@ export function CopyButton({
2729
await copyTextToClipboard(text);
2830
if (canceled) return;
2931
setCopied(true);
32+
onCopied?.();
3033

3134
setTimeout(() => {
3235
if (canceled) return;

npm-packages/dashboard-common/src/features/functionRunner/components/FunctionEditor.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ export function useFunctionEditor(
176176
componentId: ComponentId,
177177
runHistoryItem: RunHistoryItem | undefined,
178178
setRunHistoryItem: (item: RunHistoryItem) => void,
179+
onRanCustomQuery?: () => void,
179180
) {
180181
const { resolvedTheme: currentTheme } = useTheme();
181182
const prefersDark = currentTheme === "dark";
@@ -418,7 +419,10 @@ export function useFunctionEditor(
418419
),
419420
runCustomQueryButton: (
420421
<Button
421-
onClick={onSave}
422+
onClick={() => {
423+
void onSave();
424+
onRanCustomQuery?.();
425+
}}
422426
size="sm"
423427
className={classNames("items-center justify-center", "w-full")}
424428
loading={isInFlight}

npm-packages/dashboard-common/src/features/functionRunner/components/FunctionResult.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export function useFunctionResult({
2727
componentId,
2828
args,
2929
runHistoryItem,
30+
onCopiedQueryResult,
3031
}: {
3132
udfType?: "Mutation" | "Action" | "Query" | "HttpAction";
3233
onSubmit(): {
@@ -38,6 +39,7 @@ export function useFunctionResult({
3839
componentId: ComponentId;
3940
args: Record<string, Value>;
4041
runHistoryItem?: RunHistoryItem;
42+
onCopiedQueryResult?: () => void;
4143
}) {
4244
const { appendRunHistory } = useRunHistory(
4345
functionIdentifier || "",
@@ -205,6 +207,7 @@ export function useFunctionResult({
205207
lastRequestTiming={lastRequestTiming}
206208
requestFilter={requestFilter}
207209
startCursor={startCursor}
210+
onCopiedQueryResult={onCopiedQueryResult}
208211
/>
209212
),
210213
runFunction,

npm-packages/dashboard-common/src/features/functionRunner/components/FunctionRunnerWrapper.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,15 @@ export function FunctionRunnerWrapper({
2222
setIsVertical,
2323
isExpanded,
2424
setIsExpanded,
25+
onRanCustomQuery,
26+
onCopiedQueryResult,
2527
}: {
2628
isVertical: boolean;
2729
setIsVertical: (isVertical: boolean) => void;
2830
isExpanded: boolean;
2931
setIsExpanded: (isExpanded: boolean) => void;
32+
onRanCustomQuery?: () => void;
33+
onCopiedQueryResult?: () => void;
3034
}) {
3135
const deploymentState = useQuery(udfs.deploymentState.deploymentState);
3236
const router = useRouter();
@@ -99,6 +103,8 @@ export function FunctionRunnerWrapper({
99103
setIsVertical={setIsGlobalRunnerVerticalAndLog}
100104
isExpanded={isExpanded}
101105
setIsExpanded={setIsExpanded}
106+
onRanCustomQuery={onRanCustomQuery}
107+
onCopiedQueryResult={onCopiedQueryResult}
102108
/>
103109
{!isGlobalRunnerShown && deploymentState?.state !== "paused" && (
104110
<Button

npm-packages/dashboard-common/src/features/functionRunner/components/FunctionTester.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,15 @@ export function GlobalFunctionTester({
8888
setIsVertical,
8989
isExpanded,
9090
setIsExpanded,
91+
onRanCustomQuery,
92+
onCopiedQueryResult,
9193
}: {
9294
isVertical: boolean;
9395
setIsVertical: (v: boolean) => void;
9496
isExpanded: boolean;
9597
setIsExpanded: (v: boolean) => void;
98+
onRanCustomQuery?: () => void;
99+
onCopiedQueryResult?: () => void;
96100
}) {
97101
const isShowing = useIsGlobalRunnerShown();
98102
const hideGlobalRunner = useHideGlobalRunner();
@@ -149,13 +153,15 @@ export function GlobalFunctionTester({
149153
argsValidator,
150154
runHistoryItem,
151155
setRunHistoryItem,
156+
onCopiedQueryResult,
152157
});
153158
const { queryEditor, customQueryResult, runCustomQueryButton } =
154159
useFunctionEditor(
155160
selectedItem?.fn.type === "customQuery" ? selectedItem.fn.table : null,
156161
selectedItem?.componentId ?? null,
157162
runHistoryItem,
158163
setRunHistoryItem,
164+
onRanCustomQuery,
159165
);
160166

161167
const { useLogDeploymentEvent } = useContext(DeploymentInfoContext);
@@ -423,13 +429,15 @@ export function useFunctionTester({
423429
impersonation = true,
424430
runHistoryItem,
425431
setRunHistoryItem,
432+
onCopiedQueryResult,
426433
}: {
427434
moduleFunction: ModuleFunction | null;
428435
initialArgs?: Record<string, Value>;
429436
argsValidator?: ValidatorJSON;
430437
impersonation?: boolean;
431438
runHistoryItem?: RunHistoryItem;
432439
setRunHistoryItem?: (item?: RunHistoryItem) => void;
440+
onCopiedQueryResult?: () => void;
433441
}) {
434442
const [parameters, setParameters] = useState<Record<string, Value>>(
435443
initialArgs || {},
@@ -565,6 +573,7 @@ export function useFunctionTester({
565573
componentId: moduleFunction?.componentId || null,
566574
args: parameters,
567575
runHistoryItem,
576+
onCopiedQueryResult,
568577
});
569578

570579
const queryResult = moduleFunction &&
@@ -575,6 +584,7 @@ export function useFunctionTester({
575584
module={moduleFunction}
576585
parameters={parameters}
577586
reactClient={reactClient}
587+
onCopiedQueryResult={onCopiedQueryResult}
578588
/>
579589
);
580590

npm-packages/dashboard-common/src/features/functionRunner/components/QueryResult.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ export function QueryResult({
1919
parameters,
2020
reactClient,
2121
paused,
22+
onCopiedQueryResult,
2223
}: {
2324
reactClient: ConvexReactClient;
2425
module: FunctionTypes.ModuleFunction;
2526
parameters: DefaultFunctionArgs;
2627
paused: boolean;
28+
onCopiedQueryResult?: () => void;
2729
}) {
2830
if (module.udfType !== "Query") {
2931
throw new Error("Invalid udf type");
@@ -74,6 +76,7 @@ export function QueryResult({
7476
}
7577
requestFilter={null}
7678
startCursor={0}
79+
onCopiedQueryResult={onCopiedQueryResult}
7780
/>
7881
</div>
7982
);

npm-packages/dashboard-common/src/features/functionRunner/components/Result.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ function ResultImpl({
2020
queryStatus,
2121
requestFilter,
2222
startCursor,
23+
onCopiedQueryResult,
2324
}: {
2425
result?: FunctionResult;
2526
// If the request is in flight.
@@ -33,6 +34,7 @@ function ResultImpl({
3334
queryStatus?: React.ReactNode;
3435
requestFilter: RequestFilter | null;
3536
startCursor: number;
37+
onCopiedQueryResult?: () => void;
3638
}) {
3739
const {
3840
loading: isFormattingCode,
@@ -92,6 +94,7 @@ function ResultImpl({
9294
className="h-4 p-0"
9395
tip="Copy Result Value"
9496
disabled={loading || result === undefined}
97+
onCopied={onCopiedQueryResult}
9598
/>
9699
)}
97100
</div>

npm-packages/dashboard-common/src/features/settings/components/PauseDeployment.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ const PAUSE_EXPLANATION: string[] = [
2323
"Cron jobs will be skipped.",
2424
];
2525

26-
export function PauseDeployment() {
26+
export function PauseDeployment({
27+
onPausedDeployment,
28+
}: {
29+
onPausedDeployment?: () => void;
30+
}) {
2731
const deploymentState = useQuery(udfs.deploymentState.deploymentState);
2832
const { useCurrentDeployment, useHasProjectAdminPermissions } = useContext(
2933
DeploymentInfoContext,
@@ -46,7 +50,13 @@ export function PauseDeployment() {
4650
}
4751
}, [deploymentState]);
4852
async function toggle() {
49-
await changeDeploymentState(paused ? "running" : "paused");
53+
const nextState = paused ? "running" : "paused";
54+
await changeDeploymentState(nextState);
55+
56+
// Only fire the callback when we pause a running deployment.
57+
if (!paused && nextState === "paused") {
58+
onPausedDeployment?.();
59+
}
5060
}
5161
function changeVerb(isPaused: boolean) {
5262
return isPaused ? "Resume" : "Pause";
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { PauseDeployment } from "@common/features/settings/components/PauseDeployment";
22
import { DeploymentSettingsLayout } from "@common/layouts/DeploymentSettingsLayout";
33

4-
export function PauseDeploymentView() {
4+
export function PauseDeploymentView({
5+
onPausedDeployment,
6+
}: {
7+
onPausedDeployment?: () => void;
8+
}) {
59
return (
610
<DeploymentSettingsLayout page="pause-deployment">
7-
<PauseDeployment />
11+
<PauseDeployment onPausedDeployment={onPausedDeployment} />
812
</DeploymentSettingsLayout>
913
);
1014
}

npm-packages/dashboard-common/src/features/settings/components/integrations/AxiomConfigurationForm.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ type Unpacked<T> = T extends (infer U)[] ? U : never;
3434
export function AxiomConfigurationForm({
3535
onClose,
3636
existingConfig,
37+
onAddedIntegration,
3738
}: {
3839
onClose: () => void;
3940
existingConfig: Infer<typeof axiomConfig> | null;
41+
onAddedIntegration?: () => void;
4042
}) {
4143
const isUsingLegacyFormat = integrationUsingLegacyFormat(existingConfig);
4244
const createAxiomIntegration = useCreateAxiomIntegration();
@@ -63,6 +65,7 @@ export function AxiomConfigurationForm({
6365
values.version,
6466
values.ingestUrl,
6567
);
68+
onAddedIntegration?.();
6669
onClose();
6770
},
6871
validationSchema: axiomValidationSchema,

0 commit comments

Comments
 (0)