-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSubscribeModel.tsx
124 lines (104 loc) · 3.32 KB
/
SubscribeModel.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"use client";
import React, { useState } from 'react';
import { toast } from 'react-hot-toast';
import useSubscribeModal from '@/hooks/useSubscribeModal';
import { useUser } from '@/hooks/useUser';
import { postData } from '@/libs/helpers';
import { getStripe } from '@/libs/stripeClient';
import { Price, ProductWithPrice } from '@/types';
import Model from './ui/Model';
import Button from './ui/Button';
interface SubscribeModalProps {
products: ProductWithPrice[];
}
const formatPrice = (price: Price) => {
const priceString = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: price.currency,
minimumFractionDigits: 0
}).format((price?.unit_amount || 0) / 100);
return priceString;
};
const SubscribeModal: React.FC<SubscribeModalProps> = ({
products
}) => {
const subscribeModal = useSubscribeModal();
const { user, isLoading, subscription } = useUser();
const [priceIdLoading, setPriceIdLoading] = useState<string>();
const onChange = (open: boolean) => {
if (!open) {
subscribeModal.onClose();
}
}
const handleCheckout = async (price: Price) => {
setPriceIdLoading(price.id);
if (!user) {
setPriceIdLoading(undefined);
return toast.error('Must be logged in');
}
if (subscription) {
setPriceIdLoading(undefined);
return toast('Already subscribed');
}
try {
const { sessionId } = await postData({
url: '/api/create-checkout-session',
data: { price }
});
const stripe = await getStripe();
stripe?.redirectToCheckout({ sessionId });
} catch (error) {
return toast.error((error as Error)?.message);
} finally {
setPriceIdLoading(undefined);
}
};
let content = (
<div className="text-center">
No products available.
</div>
)
if (products.length) {
content = (
<div>
{products.map((product) => {
if (!product.prices?.length) {
return (
<div key={product.id}>
No prices available
</div>
);
}
return product.prices.map((price) => (
<Button
key={price.id}
onClick={() => handleCheckout(price)}
disabled={isLoading || price.id === priceIdLoading}
className="mb-4"
>
{`Subscribe for ${formatPrice(price)} a ${price.interval}`}
</Button>
))
})}
</div>
)
}
if (subscription) {
content = (
<div className="text-center">
Already subscribed.
</div>
)
}
return (
<Model
title="Only for premium users"
description="Listen to music with Spotify Premium"
isOpen={subscribeModal.isOpen}
onChange={onChange}
>
{content}
</Model>
);
}
export default SubscribeModal;