Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion package/src/libraries/backend/routes/productRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@ const listProductsHandler = withAuth({
fn: async ({
autumn,
customer_id,
searchParams,
}: {
autumn: Autumn;
customer_id: string;
searchParams?: {
entityId?: string;
};
}) => {
return await autumn.products.list({
customer_id,
customer_id: customer_id,
entity_id: searchParams?.entityId,
});
},
requireCustomer: false,
Expand Down
17 changes: 11 additions & 6 deletions package/src/libraries/react/AutumnContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export interface AutumnContextParams {
client: AutumnClient;

// Internal
entityId?: string | null;
paywallDialog: AutumnDialogContext;
attachDialog: AutumnDialogContext;
paywallRef: React.RefObject<any>;
Expand All @@ -27,20 +28,22 @@ export const AutumnContext = createContext<AutumnContextParams>({

client: new AutumnClient({ backendUrl: "" }),

entityId: undefined,

paywallDialog: {
props: null,
setProps: () => {},
setProps: () => { },
open: false,
setOpen: () => {},
setComponent: () => {},
setOpen: () => { },
setComponent: () => { },
},

attachDialog: {
props: null,
setProps: () => {},
setProps: () => { },
open: false,
setOpen: () => {},
setComponent: () => {},
setOpen: () => { },
setComponent: () => { },
},

paywallRef: { current: null },
Expand All @@ -50,10 +53,12 @@ export const useAutumnContext = ({
AutumnContext,
name,
errorIfNotInitialized = true,
entityId,
}: {
AutumnContext: React.Context<AutumnContextParams>;
name: string;
errorIfNotInitialized?: boolean;
entityId?: string | null;
}) => {
const context = useContext(AutumnContext);

Expand Down
13 changes: 6 additions & 7 deletions package/src/libraries/react/client/ReactAutumnClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export interface IAutumnClient {
};

products: {
list(): AutumnPromise<{ list: Product[] }>;
list(args: any): AutumnPromise<{ list: Product[] }>;
};
}

Expand Down Expand Up @@ -211,8 +211,7 @@ export class AutumnClient implements IAutumnClient {
`[Autumn] Detected CORS credentials: ${corsResult.includeCredentials}`
);
console.warn(
`[Autumn] To disable this warning, you can set includeCredentials={${
corsResult.includeCredentials ? "true" : "false"
`[Autumn] To disable this warning, you can set includeCredentials={${corsResult.includeCredentials ? "true" : "false"
}} in <AutumnProvider />`
);
this.includeCredentials = corsResult.includeCredentials;
Expand Down Expand Up @@ -260,10 +259,10 @@ export class AutumnClient implements IAutumnClient {
body =
method === "POST"
? {
...body,
[this.camelCase ? "customerData" : "customer_data"]:
this.customerData || undefined,
}
...body,
[this.camelCase ? "customerData" : "customer_data"]:
this.customerData || undefined,
}
: undefined;

const includeCredentials = await this.shouldIncludeCredentials();
Expand Down
22 changes: 20 additions & 2 deletions package/src/libraries/react/client/clientProdMethods.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
import type { AutumnPromise } from "@sdk/response";
import type { Product } from "src/sdk/products/prodTypes";
import type { AutumnClient } from "./ReactAutumnClient";
import type { ListProductsParams } from "./types/clientProdTypes";

export async function listProductsMethod(this: AutumnClient): AutumnPromise<{
export async function listProductsMethod(this: AutumnClient, params?: ListProductsParams): AutumnPromise<{
list: Product[];
}> {
const res = await this.get(`${this.prefix}/products`);
let path = `${this.prefix}/products`;

// Append query params to the path
// available: customer_id (optional), entity_id (optional)
const queryParams = new URLSearchParams();
for (const [key, value] of Object.entries(params ?? {})) {
if (value !== undefined) {
queryParams.append(key, String(value));
}
}

// minor optimization to avoid adding ? if no query params
const queryString = queryParams.toString();
if (queryString) {
path += `?${queryString}`;
}

const res = await this.get(path);
return res;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface ListProductsParams {
customerId?: string;
entityId?: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ import { Loader2 } from "lucide-react";

export default function PricingTable({
productDetails,
entityId,
}: {
productDetails?: ProductDetails[];
entityId?: string;
}) {
const { customer, checkout } = useCustomer({ errorOnNotFound: false });

const [isAnnual, setIsAnnual] = useState(false);
const { products, isLoading, error } = usePricingTable({ productDetails });
const { products, isLoading, error } = usePricingTable({ productDetails, entityId });

if (isLoading) {
return (
Expand Down Expand Up @@ -102,7 +104,7 @@ const PricingTableContext = createContext<{
showFeatures: boolean;
}>({
isAnnualToggle: false,
setIsAnnualToggle: () => {},
setIsAnnualToggle: () => { },
products: [],
showFeatures: true,
});
Expand Down Expand Up @@ -206,8 +208,8 @@ export const PricingCard = ({
const isRecommended = productDisplay?.recommend_text ? true : false;
const mainPriceDisplay = product.properties?.is_free
? {
primary_text: "Free",
}
primary_text: "Free",
}
: product.items[0].display;

const featureItems = product.properties?.is_free
Expand All @@ -219,7 +221,7 @@ export const PricingCard = ({
className={cn(
" au-w-full au-h-full au-py-6 au-text-foreground au-border au-rounded-lg au-shadow-sm au-max-w-xl",
isRecommended &&
"lg:au--translate-y-6 lg:au-shadow-lg dark:au-shadow-zinc-800/80 lg:au-h-[calc(100%+48px)] au-bg-secondary/40",
"lg:au--translate-y-6 lg:au-shadow-lg dark:au-shadow-zinc-800/80 lg:au-h-[calc(100%+48px)] au-bg-secondary/40",
className
)}
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const useAutumnBase = ({
}) => {
const { attachDialog, paywallDialog } = context || {};

const { refetch: refetchPricingTable } = usePricingTableBase({ client });
const { refetch: refetchPricingTable } = usePricingTableBase({ client, params: { entityId: context?.entityId || undefined } });

const attachWithoutDialog = async (params: AttachParams) => {
const result = await client.attach(params);
Expand Down
3 changes: 2 additions & 1 deletion package/src/libraries/react/hooks/useEntityBase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ export const useEntityBase = ({
const context = useAutumnContext({
AutumnContext,
name: "useEntity",
entityId,
});

const fetchEntity = async () => {
if (!entityId) {
return null;
}


const { data, error } = await client.entities.get(entityId, params);

if (error) {
Expand Down
3 changes: 2 additions & 1 deletion package/src/libraries/react/hooks/usePricingTable.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { usePricingTableBase } from "./usePricingTableBase";
import { usePricingTableBase } from "./usePricingTableBase";
import { ProductDetails } from "../client/types/clientPricingTableTypes";
import { AutumnContext, useAutumnContext } from "@/AutumnContext";

export const usePricingTable = (params?: {
productDetails?: ProductDetails[];
entityId?: string;
}) => {
const context = useAutumnContext({
AutumnContext,
Expand Down
7 changes: 5 additions & 2 deletions package/src/libraries/react/hooks/usePricingTableBase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -195,11 +195,14 @@ export const usePricingTableBase = ({
client: AutumnClient | ConvexAutumnClient;
params?: {
productDetails?: ProductDetails[];
entityId?: string;
};
}) => {
const fetcher = async () => {
try {
const { data, error } = await client.products.list();
const { data, error } = await client.products.list({
entityId: params?.entityId,
});
if (error) throw error;

return data?.list || [];
Expand All @@ -212,7 +215,7 @@ export const usePricingTableBase = ({
};

const { data, error, mutate } = useSWR<Product[], AutumnError>(
["pricing-table", client.backendUrl],
["pricing-table", client.backendUrl, params?.entityId],
fetcher,
{ ...defaultSWRConfig }
);
Expand Down
1 change: 1 addition & 0 deletions package/src/next/client/hooks/usePricingTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ProductDetails } from "../../../libraries/react/client/types/clientPric

export const usePricingTable = (params?: {
productDetails?: ProductDetails[];
entityId?: string;
}) => {
const context = useAutumnContext({
AutumnContext,
Expand Down
1 change: 1 addition & 0 deletions package/src/sdk/products/prodTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ export interface CreateProductParams {

export interface ListProductsParams {
customer_id?: string;
entity_id?: string;
}

export interface DeleteProductParams {
Expand Down