Skip to content

Commit 46b70cd

Browse files
committed
Update layout script source and enhance ProPlan component with usage limit notification
1 parent bd7fbd6 commit 46b70cd

File tree

10 files changed

+54
-44
lines changed

10 files changed

+54
-44
lines changed

client/src/app/layout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ export default function RootLayout({
9494
</TooltipProvider>
9595
{globalThis?.location?.hostname === "app.rybbit.io" && (
9696
<Script
97-
src="https://app.rybbit.io/api/script.js"
98-
data-site-id="349"
97+
src="https://demo.rybbit.io/api/script.js"
98+
data-site-id="22"
9999
strategy="afterInteractive"
100100
/>
101101
)}

client/src/app/settings/subscription/components/ProPlan.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,25 @@ export function ProPlan() {
167167
</div>
168168
<Progress value={usagePercentage} />
169169
</div>
170+
171+
{currentUsage >= eventLimit && (
172+
<div className="mt-4 p-3 bg-amber-50 dark:bg-amber-900/20 rounded-md border border-amber-200 dark:border-amber-800">
173+
<div className="flex items-center justify-between">
174+
<p className="text-sm text-amber-700 dark:text-amber-300">
175+
<strong>Usage limit reached!</strong> You've exceeded
176+
your plan's event limit.
177+
</p>
178+
<Button
179+
variant="success"
180+
size="sm"
181+
onClick={handleChangePlan}
182+
disabled={isProcessing}
183+
>
184+
Upgrade Plan
185+
</Button>
186+
</div>
187+
</div>
188+
)}
170189
</div>
171190
</div>
172191

server/src/api/sites/addSite.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { FastifyReply, FastifyRequest } from "fastify";
22
import { db } from "../../db/postgres/postgres.js";
33
import { sites } from "../../db/postgres/schema.js";
44
import { loadAllowedDomains } from "../../lib/allowedDomains.js";
5-
import { auth } from "../../lib/auth.js";
5+
import { getSessionFromReq } from "../../lib/auth-utils.js";
66
import { siteConfig } from "../../lib/siteConfig.js";
77

88
export async function addSite(
@@ -36,9 +36,7 @@ export async function addSite(
3636
}
3737

3838
try {
39-
// Get the current user's session
40-
const headers = new Headers(request.headers as any);
41-
const session = await auth!.api.getSession({ headers });
39+
const session = await getSessionFromReq(request);
4240

4341
if (!session?.user?.id) {
4442
return reply.status(401).send({

server/src/api/sites/getSites.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export async function getSites(req: FastifyRequest, reply: FastifyReply) {
5959
let isOwner = false;
6060
let ownerId = "";
6161

62-
if (!IS_CLOUD || godMode) {
62+
if (!IS_CLOUD) {
6363
return {
6464
...site,
6565
monthlyEventCount: 0,

server/src/api/stripe/getSubscription.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,28 +65,30 @@ export async function getSubscriptionInner(userId: string) {
6565
console.error("Plan details not found for price ID:", priceId);
6666
// Still return the basic subscription info even if local plan details missing
6767
return {
68-
id: subscription.id,
69-
planName: "Unknown Plan", // Indicate missing details
70-
status: subscription.status,
71-
currentPeriodEnd: new Date(subscriptionItem.current_period_end * 1000),
72-
cancelAtPeriodEnd: subscription.cancel_at_period_end,
73-
eventLimit: 0, // Unknown limit
74-
monthlyEventCount: user.monthlyEventCount,
75-
interval: subscriptionItem.price.recurring?.interval ?? "unknown",
76-
};
68+
id: subscription.id,
69+
planName: "Unknown Plan", // Indicate missing details
70+
status: subscription.status,
71+
currentPeriodEnd: new Date(
72+
subscriptionItem.current_period_end * 1000
73+
),
74+
cancelAtPeriodEnd: subscription.cancel_at_period_end,
75+
eventLimit: 0, // Unknown limit
76+
monthlyEventCount: user.monthlyEventCount,
77+
interval: subscriptionItem.price.recurring?.interval ?? "unknown",
78+
};
7779
}
7880

7981
// 4. Format and return the subscription data
8082
const responseData = {
81-
id: subscription.id,
82-
planName: planDetails.name,
83-
status: subscription.status,
84-
currentPeriodEnd: new Date(subscriptionItem.current_period_end * 1000),
85-
cancelAtPeriodEnd: subscription.cancel_at_period_end,
86-
eventLimit: planDetails.limits.events,
87-
monthlyEventCount: user.monthlyEventCount,
88-
interval: subscriptionItem.price.recurring?.interval ?? "unknown",
89-
};
83+
id: subscription.id,
84+
planName: planDetails.name,
85+
status: subscription.status,
86+
currentPeriodEnd: new Date(subscriptionItem.current_period_end * 1000),
87+
cancelAtPeriodEnd: subscription.cancel_at_period_end,
88+
eventLimit: planDetails.limits.events,
89+
monthlyEventCount: user.monthlyEventCount,
90+
interval: subscriptionItem.price.recurring?.interval ?? "unknown",
91+
};
9092

9193
return responseData;
9294
}

server/src/api/user/getUserOrganizations.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { FastifyRequest, FastifyReply } from "fastify";
22
import { db } from "../../db/postgres/postgres.js";
33
import { eq } from "drizzle-orm";
44
import { member, organization } from "../../db/postgres/schema.js";
5-
import { getSession } from "../../lib/auth-utils.js";
5+
import { getSessionFromReq } from "../../lib/auth-utils.js";
66

77
export const getUserOrganizations = async (
88
request: FastifyRequest,
99
reply: FastifyReply
1010
) => {
1111
try {
12-
const session = await getSession(request);
12+
const session = await getSessionFromReq(request);
1313

1414
if (!session?.user.id) {
1515
return reply.status(401).send({ error: "Unauthorized" });

server/src/api/user/listOrganizationMembers.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { db } from "../../db/postgres/postgres.js";
33
import { member, user } from "../../db/postgres/schema.js";
44
import { eq, and } from "drizzle-orm";
55
import { auth } from "../../lib/auth.js";
6+
import { getSessionFromReq } from "../../lib/auth-utils.js";
67

78
interface ListOrganizationMembersRequest {
89
Params: {
@@ -25,9 +26,7 @@ export async function listOrganizationMembers(
2526
try {
2627
const { organizationId } = request.params;
2728

28-
// Get current user's session
29-
const headers = new Headers(request.headers as any);
30-
const session = await auth!.api.getSession({ headers });
29+
const session = await getSessionFromReq(request);
3130

3231
if (!session?.user?.id) {
3332
return reply.status(401).send({

server/src/cron/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { updateUsersMonthlyUsage } from "./monthly-usage-checker.js";
66
export async function initializeCronJobs() {
77
console.log("Initializing cron jobs...");
88

9-
if (IS_CLOUD) {
9+
if (IS_CLOUD && process.env.NODE_ENV !== "development") {
1010
// Schedule the monthly usage checker to run every 5 minutes
1111
cron.schedule("*/5 * * * *", updateUsersMonthlyUsage);
1212
updateUsersMonthlyUsage();

server/src/index.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,11 @@ import { listOrganizationMembers } from "./api/user/listOrganizationMembers.js";
4545
import { initializeCronJobs } from "./cron/index.js";
4646
import { initializeClickhouse } from "./db/clickhouse/clickhouse.js";
4747
import { allowList, loadAllowedDomains } from "./lib/allowedDomains.js";
48-
import { mapHeaders } from "./lib/auth-utils.js";
48+
import { getSessionFromReq, mapHeaders } from "./lib/auth-utils.js";
4949
import { auth } from "./lib/auth.js";
5050
import { siteConfig } from "./lib/siteConfig.js";
5151
import { trackEvent } from "./tracker/trackEvent.js";
5252
import { extractSiteId, isSitePublic, normalizeOrigin } from "./utils.js";
53-
54-
// Import Stripe handlers
5553
import { createCheckoutSession } from "./api/stripe/createCheckoutSession.js";
5654
import { createPortalSession } from "./api/stripe/createPortalSession.js";
5755
import { getSubscription } from "./api/stripe/getSubscription.js";
@@ -182,11 +180,7 @@ server.addHook("onRequest", async (request, reply) => {
182180
}
183181

184182
try {
185-
// Convert Fastify headers object into Fetch-compatible Headers
186-
const headers = new Headers(request.headers as HeadersInit);
187-
188-
// Get session from BetterAuth
189-
const session = await auth!.api.getSession({ headers });
183+
const session = await getSessionFromReq(request);
190184

191185
if (!session) {
192186
return reply.status(401).send({ error: "Unauthorized" });

server/src/lib/auth-utils.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@ export function mapHeaders(headers: any) {
1616
return map;
1717
}
1818

19-
export async function getSession(req: FastifyRequest) {
19+
export async function getSessionFromReq(req: FastifyRequest) {
2020
const headers = new Headers(req.headers as any);
2121
const session = await auth!.api.getSession({ headers });
2222
return session;
2323
}
2424

2525
export async function getUserGodMode(req: FastifyRequest) {
26-
const headers = new Headers(req.headers as any);
27-
const session = await auth!.api.getSession({ headers });
26+
const session = await getSessionFromReq(req);
2827
const userId = session?.user.id;
2928

3029
if (!userId) {
@@ -43,8 +42,7 @@ export async function getSitesUserHasAccessTo(
4342
req: FastifyRequest,
4443
adminOnly = false
4544
) {
46-
const headers = new Headers(req.headers as any);
47-
const session = await auth!.api.getSession({ headers });
45+
const session = await getSessionFromReq(req);
4846

4947
const userId = session?.user.id;
5048

0 commit comments

Comments
 (0)