From 14d0e5b16c684edfbb965961cfce58937e358490 Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Wed, 19 Nov 2025 22:27:33 +0100 Subject: [PATCH 1/5] Fix stream keys --- .gitignore | 1 + apps/api/.env.production | 12 ++++++++++++ apps/main/.env.production | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 apps/api/.env.production diff --git a/.gitignore b/.gitignore index a8e3e84..7419555 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ htmlcov/ # Environment files .env* +!.env.production !.env.example .turbo diff --git a/apps/api/.env.production b/apps/api/.env.production new file mode 100644 index 0000000..b9de357 --- /dev/null +++ b/apps/api/.env.production @@ -0,0 +1,12 @@ +SUPABASE_URL=https://mhcafqvzbrrwvahpvvzd.supabase.co + +STREAM_CHAT_API_KEY=h7bwnn8ynjpx + +XTABLO_URL=https://app.xtablo.com + +R2_ACCOUNT_ID="9715fa14c5e5d1612301572cf1c6bbee" + +TASKS_SECRET="gT3BAytmNwhe1wKmvgREBlWcqK0=" + +EMAIL_USER="baptiste@xtablo.com" +EMAIL_CLIENT_ID="904332563417-e2n7pchtgnkrkp360baaebfeig55maig.apps.googleusercontent.com" \ No newline at end of file diff --git a/apps/main/.env.production b/apps/main/.env.production index 68144f6..d0c8c5c 100644 --- a/apps/main/.env.production +++ b/apps/main/.env.production @@ -4,7 +4,7 @@ VITE_SUPABASE_URL=https://mhcafqvzbrrwvahpvvzd.supabase.co VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im1oY2FmcXZ6YnJyd3ZhaHB2dnpkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDEyNDEzMjEsImV4cCI6MjA1NjgxNzMyMX0.Otxn5BWCPD2ABlMM59hCgeur9Tf_Q7PndAbTkqXDPtM VITE_SUPABASE_ID=mhcafqvzbrrwvahpvvzd -VITE_STREAM_CHAT_API_KEY="v4yf8rs94aa8" +VITE_STREAM_CHAT_API_KEY="h7bwnn8ynjpx" VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51SPKLPAto3YQ7YhIrM5ViAUXWuSwKJeHyOyOINVg9cnwxxOcbMlyhxQcDYWDSLNQJukafxbc7kqpkGI82lFezaiM00rgcALKB0 VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID=price_1SPr3qAto3YQ7YhIALNeFBva From 0b070493348169406dd898394de9f6e7b2ce6a28 Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Tue, 25 Nov 2025 09:18:55 +0100 Subject: [PATCH 2/5] Fix copies in subscription card --- apps/main/src/components/SubscriptionCard.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/main/src/components/SubscriptionCard.tsx b/apps/main/src/components/SubscriptionCard.tsx index a4fdb69..5cac9b7 100644 --- a/apps/main/src/components/SubscriptionCard.tsx +++ b/apps/main/src/components/SubscriptionCard.tsx @@ -15,6 +15,7 @@ import { useCreatePortalSession, useReactivateSubscription, useSubscription, + useTrialExpiration, } from "../hooks/stripe"; import { useUser } from "../providers/UserStoreProvider"; @@ -31,6 +32,8 @@ export function SubscriptionCard() { const { mutate: reactivateSubscription, isPending: reactivatePending } = useReactivateSubscription(); + const { daysRemaining } = useTrialExpiration(); + const isPaying = user.plan !== "none" && user.plan !== "beta"; const isBeta = user.plan === "beta"; @@ -138,16 +141,15 @@ export function SubscriptionCard() { )} - {/* Free Tier */} {!isPaying && !isBeta && (

- Plan Gratuit + Période d'essai {daysRemaining ? `(${daysRemaining} jours restants)` : ""}

- Fonctionnalités limitées + Fonctionnalités illimitées jusqu'à la fin de votre période d'essai

From ebc65ef000898f7a33392f7a0a5212e94443e3ae Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Tue, 25 Nov 2025 09:21:38 +0100 Subject: [PATCH 3/5] Fix price --- apps/main/.env.production | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/main/.env.production b/apps/main/.env.production index 25a272b..93946f1 100644 --- a/apps/main/.env.production +++ b/apps/main/.env.production @@ -7,6 +7,6 @@ VITE_SUPABASE_ID=mhcafqvzbrrwvahpvvzd VITE_STREAM_CHAT_API_KEY="h7bwnn8ynjpx" VITE_STRIPE_PUBLISHABLE_KEY=pk_live_51Qc159AmcXPHW4mTHUTW6it2mdZ3KQTxZGXZ188DKpXuXgpirUWOj24dnb7DzbcEAu45nU1S5k66Nm4liY3IlGOW00pndRsgUM -VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID=price_1SPr3qAto3YQ7YhIALNeFBva +VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID=price_1SO0HAAmcXPHW4mTkFIh3CvF VITE_API_URL=https://xablo-api-636270553187.europe-west1.run.app \ No newline at end of file From 1342f69efa05ab1fb2aea03896379ab0922249ff Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Tue, 25 Nov 2025 10:06:35 +0100 Subject: [PATCH 4/5] Finish stripe integration for MVP --- apps/api/src/routers/stripe.ts | 17 +++++++++++++++++ apps/main/src/components/SubscriptionCard.tsx | 13 ++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/apps/api/src/routers/stripe.ts b/apps/api/src/routers/stripe.ts index 190201a..3e9d09d 100644 --- a/apps/api/src/routers/stripe.ts +++ b/apps/api/src/routers/stripe.ts @@ -68,6 +68,23 @@ const createCheckoutSession = ( return c.json({ error: "priceId is required" }, 400); } + const { data: price } = await supabase + .schema("stripe") + .from("prices") + .select("*") + .eq("id", priceId) + .maybeSingle(); + + if (!price) { + return c.json({ error: "Price not found" }, 404); + } + + const allowedInfiniteUsers = ["arbelleville@gmail.com", "baptiste.belleville74@gmail.com"]; + + if (price.unit_amount === 0 && !allowedInfiniteUsers.includes(user.email!)) { + return c.json({ error: "This price is not available" }, 400); + } + try { // Get or create Stripe customer let customerId: string; diff --git a/apps/main/src/components/SubscriptionCard.tsx b/apps/main/src/components/SubscriptionCard.tsx index 5cac9b7..6115856 100644 --- a/apps/main/src/components/SubscriptionCard.tsx +++ b/apps/main/src/components/SubscriptionCard.tsx @@ -7,7 +7,6 @@ import { CardHeader, CardTitle, } from "@xtablo/ui/components/card"; -import { Text } from "@xtablo/ui/components/typography"; import { AlertCircle, CheckCircle2, CreditCard, Loader2Icon, Sparkles } from "lucide-react"; import { useCancelSubscription, @@ -38,7 +37,8 @@ export function SubscriptionCard() { const isBeta = user.plan === "beta"; // Replace with your actual price ID from Stripe Dashboard - const STANDARD_MONTHLY_PRICE_ID = import.meta.env.VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID || ""; + + const priceId = import.meta.env.VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID || ""; const getStatusBadge = () => { // Check for beta plan first @@ -156,12 +156,12 @@ export function SubscriptionCard() { - {!STANDARD_MONTHLY_PRICE_ID && ( - - Configuration Stripe requise - - )}
)} From 9ba49c68cac4fff5e3a918d352c73d005609fe20 Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Tue, 25 Nov 2025 10:11:04 +0100 Subject: [PATCH 5/5] Allow infinite users --- apps/api/src/routers/stripe.ts | 6 +++++- apps/main/.env.production | 1 + apps/main/src/components/SubscriptionCard.tsx | 14 +++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/api/src/routers/stripe.ts b/apps/api/src/routers/stripe.ts index 3e9d09d..daa6204 100644 --- a/apps/api/src/routers/stripe.ts +++ b/apps/api/src/routers/stripe.ts @@ -79,7 +79,11 @@ const createCheckoutSession = ( return c.json({ error: "Price not found" }, 404); } - const allowedInfiniteUsers = ["arbelleville@gmail.com", "baptiste.belleville74@gmail.com"]; + const allowedInfiniteUsers = [ + "arbelleville@gmail.com", + "baptiste.belleville74@gmail.com", + "hugo@xtablo.com", + ]; if (price.unit_amount === 0 && !allowedInfiniteUsers.includes(user.email!)) { return c.json({ error: "This price is not available" }, 400); diff --git a/apps/main/.env.production b/apps/main/.env.production index 93946f1..44de9ae 100644 --- a/apps/main/.env.production +++ b/apps/main/.env.production @@ -8,5 +8,6 @@ VITE_STREAM_CHAT_API_KEY="h7bwnn8ynjpx" VITE_STRIPE_PUBLISHABLE_KEY=pk_live_51Qc159AmcXPHW4mTHUTW6it2mdZ3KQTxZGXZ188DKpXuXgpirUWOj24dnb7DzbcEAu45nU1S5k66Nm4liY3IlGOW00pndRsgUM VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID=price_1SO0HAAmcXPHW4mTkFIh3CvF +VITE_STRIPE_INFINITE_PRICE_ID=price_1SXHp8AmcXPHW4mTbus6j4Za VITE_API_URL=https://xablo-api-636270553187.europe-west1.run.app \ No newline at end of file diff --git a/apps/main/src/components/SubscriptionCard.tsx b/apps/main/src/components/SubscriptionCard.tsx index 6115856..a6c257c 100644 --- a/apps/main/src/components/SubscriptionCard.tsx +++ b/apps/main/src/components/SubscriptionCard.tsx @@ -18,6 +18,12 @@ import { } from "../hooks/stripe"; import { useUser } from "../providers/UserStoreProvider"; +const allowedInfiniteUsers = [ + "arbelleville@gmail.com", + "baptiste.belleville74@gmail.com", + "hugo@xtablo.com", +]; + /** * Subscription management card for Settings page * Shows current subscription status and allows users to upgrade/manage @@ -38,7 +44,13 @@ export function SubscriptionCard() { // Replace with your actual price ID from Stripe Dashboard - const priceId = import.meta.env.VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID || ""; + const infinitePriceId = import.meta.env.VITE_STRIPE_INFINITE_PRICE_ID || ""; + const standardPriceId = import.meta.env.VITE_STRIPE_STANDARD_MONTHLY_PRICE_ID || ""; + + const priceId = + allowedInfiniteUsers.includes(user.email!) && infinitePriceId + ? infinitePriceId + : standardPriceId; const getStatusBadge = () => { // Check for beta plan first