+
+
From b8845a6836b6587932380f6d9e972e15847deb62 Mon Sep 17 00:00:00 2001
From: Eliezer Steinbock <3090527+elie222@users.noreply.github.com>
Date: Fri, 14 Nov 2025 16:42:41 +0200
Subject: [PATCH 2/6] mobile fix
---
apps/web/app/(app)/accounts/page.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/web/app/(app)/accounts/page.tsx b/apps/web/app/(app)/accounts/page.tsx
index b8bbc2a44c..75574bef1f 100644
--- a/apps/web/app/(app)/accounts/page.tsx
+++ b/apps/web/app/(app)/accounts/page.tsx
@@ -45,7 +45,7 @@ export default function AccountsPage() {
-
+
{data?.emailAccounts.map((emailAccount) => (
Date: Fri, 14 Nov 2025 17:07:47 +0200
Subject: [PATCH 3/6] show premium card for non premiums
---
apps/web/app/(landing)/components/page.tsx | 2 +-
...PremiumExpiredCard.tsx => PremiumCard.tsx} | 51 ++++++++++++++-----
apps/web/components/SideNav.tsx | 5 +-
3 files changed, 42 insertions(+), 16 deletions(-)
rename apps/web/components/{PremiumExpiredCard.tsx => PremiumCard.tsx} (82%)
diff --git a/apps/web/app/(landing)/components/page.tsx b/apps/web/app/(landing)/components/page.tsx
index a806fb78e9..f72f35ba1c 100644
--- a/apps/web/app/(landing)/components/page.tsx
+++ b/apps/web/app/(landing)/components/page.tsx
@@ -38,7 +38,7 @@ import { SettingCard } from "@/components/SettingCard";
import { IconCircle } from "@/app/(app)/[emailAccountId]/onboarding/IconCircle";
import { ActionBadges } from "@/app/(app)/[emailAccountId]/assistant/Rules";
import { DismissibleVideoCard } from "@/components/VideoCard";
-import { PremiumExpiredCardContent } from "@/components/PremiumExpiredCard";
+import { PremiumExpiredCardContent } from "@/components/PremiumCard";
import {
ResultsDisplay,
ResultDisplayContent,
diff --git a/apps/web/components/PremiumExpiredCard.tsx b/apps/web/components/PremiumCard.tsx
similarity index 82%
rename from apps/web/components/PremiumExpiredCard.tsx
rename to apps/web/components/PremiumCard.tsx
index 4ba71b0163..f3a9eadd32 100644
--- a/apps/web/components/PremiumExpiredCard.tsx
+++ b/apps/web/components/PremiumCard.tsx
@@ -28,11 +28,8 @@ export function PremiumExpiredCardContent({
onDismiss,
isCollapsed = false,
}: PremiumExpiredCardProps & { isCollapsed?: boolean }) {
- // Early return if no premium data
- if (!premium) return null;
-
// Convert string dates to Date objects if needed
- const lemonSqueezyRenewsAt = premium.lemonSqueezyRenewsAt
+ const lemonSqueezyRenewsAt = premium?.lemonSqueezyRenewsAt
? typeof premium.lemonSqueezyRenewsAt === "string"
? new Date(premium.lemonSqueezyRenewsAt)
: premium.lemonSqueezyRenewsAt
@@ -40,17 +37,38 @@ export function PremiumExpiredCardContent({
const isUserPremium = isPremium(
lemonSqueezyRenewsAt,
- premium.stripeSubscriptionStatus || null,
+ premium?.stripeSubscriptionStatus || null,
);
if (isUserPremium) return null;
- // Determine the message based on subscription state
const getSubscriptionMessage = () => {
+ const UPGRADE_MESSAGE = {
+ title: "Upgrade to Premium",
+ description: "Upgrade to Premium to enable your AI email assistant.",
+ };
+
+ if (!premium) {
+ return UPGRADE_MESSAGE;
+ }
+
const status = premium.stripeSubscriptionStatus;
const hasLemonSqueezyExpired =
lemonSqueezyRenewsAt && lemonSqueezyRenewsAt < new Date();
+ // Check if user never had a subscription
+ const hasNoSubscription =
+ !status &&
+ !premium.stripeSubscriptionId &&
+ !premium.lemonSqueezySubscriptionId;
+
+ if (!premium || hasNoSubscription) {
+ return {
+ title: "Upgrade to Premium",
+ description: "Upgrade to Premium to enable your AI email assistant.",
+ };
+ }
+
if (status === "past_due") {
return {
title: "Payment Past Due",
@@ -95,6 +113,15 @@ export function PremiumExpiredCardContent({
const { title, description } = getSubscriptionMessage();
+ const isNewUser =
+ !premium ||
+ (!premium.stripeSubscriptionStatus &&
+ !premium.stripeSubscriptionId &&
+ !premium.lemonSqueezySubscriptionId);
+
+ const buttonText = isNewUser ? "Upgrade" : "Reactivate";
+ const buttonHref = isNewUser ? "/premium" : "/settings";
+
// When collapsed, show only the alert icon with a hover card
if (isCollapsed) {
return (
@@ -112,18 +139,18 @@ export function PremiumExpiredCardContent({
className="w-full bg-orange-600 text-white hover:bg-orange-700 border-0 shadow-sm h-8 mt-2"
>
- Reactivate
+ {buttonText}
}
>
@@ -170,11 +197,11 @@ export function PremiumExpiredCardContent({
className="w-full bg-orange-600 text-white hover:bg-orange-700 border-0 shadow-sm h-8"
>
-
Reactivate
+
{buttonText}
@@ -183,7 +210,7 @@ export function PremiumExpiredCardContent({
);
}
-export function PremiumExpiredCard({
+export function PremiumCard({
isCollapsed = false,
}: {
isCollapsed?: boolean;
diff --git a/apps/web/components/SideNav.tsx b/apps/web/components/SideNav.tsx
index 8c07e0eefb..5e4a5779d8 100644
--- a/apps/web/components/SideNav.tsx
+++ b/apps/web/components/SideNav.tsx
@@ -14,7 +14,6 @@ import {
CalendarIcon,
ChevronDownIcon,
ChevronRightIcon,
- CrownIcon,
FileIcon,
InboxIcon,
type LucideIcon,
@@ -58,7 +57,7 @@ import { prefixPath } from "@/utils/path";
import { ReferralDialog } from "@/components/ReferralDialog";
import { isGoogleProvider } from "@/utils/email/provider-types";
import { NavUser } from "@/components/NavUser";
-import { PremiumExpiredCard } from "@/components/PremiumExpiredCard";
+import { PremiumCard } from "@/components/PremiumCard";
type NavItem = {
name: string;
@@ -233,7 +232,7 @@ export function SideNav({ ...props }: React.ComponentProps) {
-
+
From 54d30bedcc8666ad6771d685482625ba1a70cd81 Mon Sep 17 00:00:00 2001
From: Eliezer Steinbock <3090527+elie222@users.noreply.github.com>
Date: Fri, 14 Nov 2025 17:11:32 +0200
Subject: [PATCH 4/6] v2.19.1
---
version.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version.txt b/version.txt
index 3588849c84..bfd2f0f6e4 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-v2.19.0
+v2.19.1
From 3bfc9564bafabeaa07fc1dbe7bb66629cfc5d65c Mon Sep 17 00:00:00 2001
From: Eliezer Steinbock <3090527+elie222@users.noreply.github.com>
Date: Fri, 14 Nov 2025 17:16:18 +0200
Subject: [PATCH 5/6] Hide card on mobile
---
apps/web/components/VideoCard.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/web/components/VideoCard.tsx b/apps/web/components/VideoCard.tsx
index c6fb4c1592..3e1e95344e 100644
--- a/apps/web/components/VideoCard.tsx
+++ b/apps/web/components/VideoCard.tsx
@@ -106,7 +106,7 @@ const VideoCard = React.forwardRef<