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

View File

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

View File

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

View File

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