fix up frontend ux for subscriptions

This commit is contained in:
Abi Raja 2024-01-03 16:48:04 -05:00
parent 2bc22b1653
commit c7482be855
4 changed files with 22 additions and 12 deletions

View File

@ -1,14 +1,18 @@
import { useStore } from "../store/store";
export function OnboardingNote() { export function OnboardingNote() {
const setPricingDialogOpen = useStore((state) => state.setPricingDialogOpen);
return ( return (
<div className="flex flex-col space-y-4 bg-green-700 p-2 rounded text-stone-200 text-sm"> <div className="flex flex-col space-y-4 bg-green-700 p-2 rounded text-stone-200 text-sm">
<span> <span>
To use Screenshot to Code,{" "} To use Screenshot to Code,{" "}
<a <a
className="inline underline hover:opacity-70" className="inline underline hover:opacity-70 cursor-pointer"
href="https://buy.stripe.com/8wM6sre70gBW1nqaEE" onClick={() => setPricingDialogOpen(true)}
target="_blank" target="_blank"
> >
buy some credits (100 generations for $15) subscribe (100 generations for $15)
</a>{" "} </a>{" "}
or use your own OpenAI API key with GPT4 vision access ( or use your own OpenAI API key with GPT4 vision access (
<a <a

View File

@ -15,6 +15,7 @@ export default function AvatarDropdown() {
const { user, isLoaded, isSignedIn } = useUser(); const { user, isLoaded, isSignedIn } = useUser();
const { signOut } = useClerk(); const { signOut } = useClerk();
const subscriberTier = useStore((state) => state.subscriberTier); const subscriberTier = useStore((state) => state.subscriberTier);
const setPricingDialogOpen = useStore((state) => state.setPricingDialogOpen);
const isFreeUser = subscriberTier === "free"; const isFreeUser = subscriberTier === "free";
// If Clerk is still loading or user is logged out, don't show anything // If Clerk is still loading or user is logged out, don't show anything
@ -33,12 +34,7 @@ export default function AvatarDropdown() {
{/* Free users */} {/* Free users */}
{isFreeUser && ( {isFreeUser && (
<DropdownMenuItem asChild={true}> <DropdownMenuItem asChild={true}>
<a <a onClick={() => setPricingDialogOpen(true)}>Get pro</a>
href="https://buy.stripe.com/8wM6sre70gBW1nqaEE"
target="_blank"
>
Buy credits
</a>
</DropdownMenuItem> </DropdownMenuItem>
)} )}
{/* Paying user */} {/* Paying user */}

View File

@ -11,24 +11,29 @@ import { FaCheckCircle } from "react-icons/fa";
import Spinner from "../custom-ui/Spinner"; import Spinner from "../custom-ui/Spinner";
import useStripeCheckout from "./useStripeCheckout"; import useStripeCheckout from "./useStripeCheckout";
import { Button } from "../ui/button"; import { Button } from "../ui/button";
import { useStore } from "../../store/store";
const LOGOS = ["microsoft", "amazon", "mit", "stanford", "bytedance", "baidu"]; const LOGOS = ["microsoft", "amazon", "mit", "stanford", "bytedance", "baidu"];
const SELL_SUBSCRIPTIONS = false; const SELL_SUBSCRIPTIONS = true;
const PricingDialog: React.FC = () => { const PricingDialog: React.FC = () => {
const { checkout, isLoadingCheckout } = useStripeCheckout(); const { checkout, isLoadingCheckout } = useStripeCheckout();
const [paymentInterval, setPaymentInterval] = React.useState< const [paymentInterval, setPaymentInterval] = React.useState<
"monthly" | "yearly" "monthly" | "yearly"
>("monthly"); >("monthly");
const [showDialog, setShowDialog] = useStore((state) => [
state.isPricingDialogOpen,
state.setPricingDialogOpen,
]);
return ( return (
<Dialog> <Dialog open={showDialog} onOpenChange={(isOpen) => setShowDialog(isOpen)}>
<DialogTrigger <DialogTrigger
className="fixed z-50 bottom-28 right-5 rounded-md shadow-lg bg-black className="fixed z-50 bottom-28 right-5 rounded-md shadow-lg bg-black
text-white px-4 text-xs py-3 cursor-pointer" text-white px-4 text-xs py-3 cursor-pointer"
> >
buy 100 code generations for $15 get 100 code generations for $15
</DialogTrigger> </DialogTrigger>
<DialogContent className="max-w-2xl"> <DialogContent className="max-w-2xl">
<DialogHeader> <DialogHeader>

View File

@ -1,11 +1,16 @@
import { create } from "zustand"; import { create } from "zustand";
interface Store { interface Store {
isPricingDialogOpen: boolean;
setPricingDialogOpen: (isOpen: boolean) => void;
subscriberTier: string; subscriberTier: string;
setSubscriberTier: (tier: string) => void; setSubscriberTier: (tier: string) => void;
} }
export const useStore = create<Store>((set) => ({ export const useStore = create<Store>((set) => ({
isPricingDialogOpen: false,
setPricingDialogOpen: (isOpen: boolean) =>
set(() => ({ isPricingDialogOpen: isOpen })),
subscriberTier: "", subscriberTier: "",
setSubscriberTier: (tier: string) => set(() => ({ subscriberTier: tier })), setSubscriberTier: (tier: string) => set(() => ({ subscriberTier: tier })),
})); }));