fix: autumn-js invalidates cache

This commit is contained in:
John Yeo
2026-03-17 13:48:54 +00:00
parent a70accb1de
commit 134a0facd3
4 changed files with 54 additions and 56 deletions

View File

@@ -6,7 +6,7 @@ import type {
ClientOpenCustomerPortalParams,
ClientSetupPaymentParams,
} from "autumn-js/react";
import { useCustomer } from "autumn-js/react";
import { useCustomer, useListPlans } from "autumn-js/react";
import { useId, useState } from "react";
import { DataViewer } from "@/components/debug/DataViewer";
import { DebugCard } from "@/components/debug/DebugCard";
@@ -53,6 +53,9 @@ const toErrorPayload = ({ error }: { error: unknown }) => {
};
export default function UseAutumnScenarioPage() {
const customerResult = useCustomer({
errorOnNotFound: false,
});
const {
isLoading,
error,
@@ -62,10 +65,11 @@ export default function UseAutumnScenarioPage() {
check,
setupPayment,
openCustomerPortal,
} = useCustomer({
errorOnNotFound: false,
});
} = customerResult;
const plansResult = useListPlans();
const [showDebugData, setShowDebugData] = useState(false);
const [lastUpdatedAt, setLastUpdatedAt] = useState<string | null>(null);
const [isRunning, setIsRunning] = useState(false);
const [lastAction, setLastAction] = useState<LastActionState>(null);
@@ -83,7 +87,7 @@ export default function UseAutumnScenarioPage() {
const [setupPaymentSuccessUrl, setSetupPaymentSuccessUrl] = useState("");
const [setupPaymentPlanId, setSetupPaymentPlanId] = useState("");
const [checkoutSessionParams, setCheckoutSessionParams] = useState(
'{\n "billing_address_collection": "required",\n "automatic_tax": { "enabled": true }\n}',
'{\n "billing_address_collection": "required"\n}',
);
// Form element IDs
@@ -569,6 +573,36 @@ export default function UseAutumnScenarioPage() {
value={lastAction?.error ?? null}
defaultExpandedDepth={3}
/>
<DebugCard
title="Hook Data"
actions={
<label className="flex items-center gap-2 text-sm text-zinc-600">
<input
type="checkbox"
checked={showDebugData}
onChange={(e) => setShowDebugData(e.target.checked)}
className="rounded border-zinc-300"
/>
Show
</label>
}
>
{showDebugData && (
<div className="grid gap-4 lg:grid-cols-2">
<DataViewer
title="useCustomer"
value={customerResult.data ?? null}
defaultExpandedDepth={2}
/>
<DataViewer
title="useListPlans"
value={plansResult.data ?? null}
defaultExpandedDepth={2}
/>
</div>
)}
</DebugCard>
</div>
);
}

View File

@@ -1,7 +1,7 @@
{
"name": "autumn-js",
"description": "Autumn JS Library",
"version": "1.0.3",
"version": "1.0.4",
"repository": "github:useautumn/autumn",
"homepage": "https://docs.useautumn.com",
"main": "./dist/sdk/index.js",

View File

@@ -1,5 +1,6 @@
"use client";
import { useQueryClient } from "@tanstack/react-query";
import type {
AttachResponse,
BillingUpdateResponse,
@@ -48,6 +49,7 @@ export const useCustomerActions = ({
client: IAutumnClient;
customer: Customer | null;
}) => {
const queryClient = useQueryClient();
const attach = useCallback(
async (params: AttachParams): Promise<AttachResponse> => {
const response = await client.attach({
@@ -60,10 +62,12 @@ export const useCustomerActions = ({
url: response.paymentUrl,
openInNewTab: params.openInNewTab,
});
} else {
queryClient.invalidateQueries({ queryKey: ["autumn"] });
}
return response;
},
[client],
[client, queryClient],
);
const previewAttach = useCallback(
@@ -84,10 +88,12 @@ export const useCustomerActions = ({
url: response.paymentUrl,
openInNewTab: params.openInNewTab,
});
} else {
queryClient.invalidateQueries({ queryKey: ["autumn"] });
}
return response;
},
[client],
[client, queryClient],
);
const previewUpdateSubscription = useCallback(
@@ -140,10 +146,12 @@ export const useCustomerActions = ({
url: response.paymentUrl,
openInNewTab: params.openInNewTab,
});
} else {
queryClient.invalidateQueries({ queryKey: ["autumn"] });
}
return response;
},
[client],
[client, queryClient],
);
const previewMultiAttach = useCallback(

View File

@@ -1,5 +1,4 @@
import { test } from "bun:test";
import { type ApiCustomerV3, tryCatch } from "@autumn/shared";
import { expectCustomerFeatureCorrect } from "@tests/integration/billing/utils/expectCustomerFeatureCorrect";
import {
calculateTrialEndMs,
@@ -12,57 +11,14 @@ import { initScenario, s } from "@tests/utils/testInitUtils/initScenario";
import { advanceTestClock } from "@/utils/scriptUtils/testClockUtils";
test("temp: paid default trial customer can upgrade to premium", async () => {
const customerId = `temp-default-trial-upgrade`;
const defaultTrial = products.defaultTrial({
id: "default-trial",
items: [items.monthlyMessages({ includedUsage: 500 })],
trialDays: 7,
cardRequired: false,
});
const premium = products.premium({
id: "premium",
items: [items.monthlyMessages({ includedUsage: 1000 })],
});
const customerId = `sdk-test-customer`;
const { autumnV1, ctx, testClockId } = await initScenario({
customerId,
setup: [
s.customer({ testClock: true, withDefault: true }),
s.products({ list: [defaultTrial, premium] }),
s.customer({ testClock: true, paymentMethod: "success" }),
// s.products({ list: [defaultTrial, premium] }),
],
actions: [],
});
const customerBeforeUpgrade =
await autumnV1.customers.get<ApiCustomerV3>(customerId);
await expectProductTrialing({
customer: customerBeforeUpgrade,
productId: defaultTrial.id,
trialEndsAt: calculateTrialEndMs({ trialDays: 7 }),
});
expectCustomerFeatureCorrect({
customer: customerBeforeUpgrade,
featureId: TestFeature.Messages,
includedUsage: 500,
balance: 500,
usage: 0,
});
try {
await autumnV1.billing.attach({
customer_id: customerId,
product_id: premium.id,
// redirect_mode: "redirect_mode",
});
} catch (error) {}
await advanceTestClock({
stripeCli: ctx.stripeCli,
testClockId: testClockId!,
numberOfDays: 12,
});
});