Skip to content

Commit 1d014af

Browse files
committed
Show a confirmation diaglog if you’re downgrading from Pro to Hobby
1 parent a0071b9 commit 1d014af

File tree

1 file changed

+78
-25
lines changed

1 file changed

+78
-25
lines changed

apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx

Lines changed: 78 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
ShieldCheckIcon,
55
XMarkIcon,
66
} from "@heroicons/react/20/solid";
7-
import { XCircleIcon } from "@heroicons/react/24/outline";
7+
import { ArrowDownCircleIcon, XCircleIcon } from "@heroicons/react/24/outline";
88
import { Form, useFetcher, useLocation, useNavigation } from "@remix-run/react";
99
import { ActionFunctionArgs } from "@remix-run/server-runtime";
1010
import { PlainClient, uiComponent } from "@team-plain/typescript-sdk";
@@ -44,6 +44,7 @@ import { logger } from "~/services/logger.server";
4444
import { setPlan } from "~/services/platform.v3.server";
4545
import { requireUser } from "~/services/session.server";
4646
import { cn } from "~/utils/cn";
47+
import React from "react";
4748

4849
const Params = z.object({
4950
organizationSlug: z.string(),
@@ -302,6 +303,7 @@ export function TierFree({
302303
const formAction = `/resources/orgs/${organizationSlug}/select-plan`;
303304
const isLoading = navigation.formAction === formAction;
304305
const [isDialogOpen, setIsDialogOpen] = useState(false);
306+
const [isLackingFeaturesChecked, setIsLackingFeaturesChecked] = useState(false);
305307

306308
const status = subscription?.freeTierStatus ?? "requires_connect";
307309

@@ -418,7 +420,7 @@ export function TierFree({
418420
{`Downgrade to ${plan.title}`}
419421
</Button>
420422
</DialogTrigger>
421-
<DialogContent className="max-w-md">
423+
<DialogContent className="sm:max-w-md">
422424
<DialogHeader>Downgrade plan</DialogHeader>
423425
<div className="mb-2 mt-4 flex items-start gap-3">
424426
<span>
@@ -451,13 +453,22 @@ export function TierFree({
451453
variant="simple"
452454
label={label}
453455
labelClassName="text-text-dimmed"
456+
onChange={(isChecked: boolean) => {
457+
if (label === "Lacking features I need") {
458+
setIsLackingFeaturesChecked(isChecked);
459+
}
460+
}}
454461
/>
455462
</li>
456463
))}
457464
</ul>
458465
</div>
459466
<div>
460-
<Header2 className="mb-1">What can we do to improve?</Header2>
467+
<Header2 className="mb-1">
468+
{isLackingFeaturesChecked
469+
? "What features do you need? Or how can we improve?"
470+
: "What can we do to improve?"}
471+
</Header2>
461472
<TextArea id="improvement-suggestions" name="message" />
462473
</div>
463474
</div>
@@ -467,12 +478,11 @@ export function TierFree({
467478
</Button>
468479
<Button
469480
variant="danger/medium"
470-
type="submit"
471-
form="subscribe"
472481
disabled={isLoading}
473482
LeadingIcon={
474483
isLoading && "submitting" ? () => <Spinner color="white" /> : undefined
475484
}
485+
form="subscribe"
476486
>
477487
Downgrade plan
478488
</Button>
@@ -543,6 +553,7 @@ export function TierHobby({
543553
const navigation = useNavigation();
544554
const formAction = `/resources/orgs/${organizationSlug}/select-plan`;
545555
const isLoading = navigation.formAction === formAction;
556+
const [isDialogOpen, setIsDialogOpen] = useState(false);
546557

547558
return (
548559
<TierContainer isHighlighted={isHighlighted}>
@@ -555,26 +566,68 @@ export function TierHobby({
555566
<input type="hidden" name="type" value="paid" />
556567
<input type="hidden" name="planCode" value={plan.code} />
557568
<input type="hidden" name="callerPath" value={location.pathname} />
558-
<Button
559-
variant={isHighlighted ? "primary/large" : "tertiary/large"}
560-
fullWidth
561-
className="text-md font-medium"
562-
disabled={
563-
isLoading ||
564-
(subscription?.plan?.code === plan.code && subscription.canceledAt === undefined)
565-
}
566-
LeadingIcon={
567-
isLoading && navigation.formData?.get("planCode") === plan.code ? Spinner : undefined
568-
}
569-
>
570-
{subscription?.plan === undefined
571-
? "Select plan"
572-
: subscription.plan.type === "free" || subscription.canceledAt !== undefined
573-
? `Upgrade to ${plan.title}`
574-
: subscription.plan.code === plan.code
575-
? "Current plan"
576-
: `Downgrade to ${plan.title}`}
577-
</Button>
569+
{subscription?.plan !== undefined &&
570+
subscription.plan.type !== "free" &&
571+
subscription.canceledAt === undefined &&
572+
subscription.plan.code !== plan.code ? (
573+
<Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>
574+
<DialogTrigger asChild>
575+
<Button variant="tertiary/large" fullWidth className="text-md font-medium">
576+
{`Downgrade to ${plan.title}`}
577+
</Button>
578+
</DialogTrigger>
579+
<DialogContent className="sm:max-w-md">
580+
<DialogHeader>Downgrade plan</DialogHeader>
581+
<div className="mb-2 mt-4 flex items-start gap-3">
582+
<span>
583+
<ArrowDownCircleIcon className="size-12 text-blue-500" />
584+
</span>
585+
<Paragraph variant="base/bright" className="text-text-bright">
586+
By downgrading you will lose access to your current plan’s features and your
587+
included credits will be reduced.
588+
</Paragraph>
589+
</div>
590+
<DialogFooter>
591+
<Button variant="tertiary/medium" onClick={() => setIsDialogOpen(false)}>
592+
Dismiss
593+
</Button>
594+
<Button
595+
variant="tertiary/medium"
596+
disabled={isLoading}
597+
LeadingIcon={
598+
isLoading && "submitting" ? () => <Spinner color="white" /> : undefined
599+
}
600+
form="subscribe"
601+
>
602+
{`Downgrade to ${plan.title}`}
603+
</Button>
604+
</DialogFooter>
605+
</DialogContent>
606+
</Dialog>
607+
) : (
608+
<Button
609+
variant={isHighlighted ? "primary/large" : "tertiary/large"}
610+
fullWidth
611+
className="text-md font-medium"
612+
disabled={
613+
isLoading ||
614+
(subscription?.plan?.code === plan.code && subscription.canceledAt === undefined)
615+
}
616+
LeadingIcon={
617+
isLoading && navigation.formData?.get("planCode") === plan.code
618+
? Spinner
619+
: undefined
620+
}
621+
>
622+
{subscription?.plan === undefined
623+
? "Select plan"
624+
: subscription.plan.type === "free" || subscription.canceledAt !== undefined
625+
? `Upgrade to ${plan.title}`
626+
: subscription.plan.code === plan.code
627+
? "Current plan"
628+
: `Upgrade to ${plan.title}`}
629+
</Button>
630+
)}
578631
</div>
579632
</Form>
580633
<ul className="flex flex-col gap-2.5">

0 commit comments

Comments
 (0)