-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathApplyCouponDialog.tsx
More file actions
104 lines (96 loc) · 3.35 KB
/
ApplyCouponDialog.tsx
File metadata and controls
104 lines (96 loc) · 3.35 KB
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
import { Form, useNavigation } from "@remix-run/react";
import { Button } from "~/components/primitives/Buttons";
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
} from "~/components/primitives/Dialog";
import { Paragraph } from "~/components/primitives/Paragraph";
import * as Property from "~/components/primitives/PropertyTable";
export type ApplyCouponTarget = {
orgId: string;
orgSlug: string;
orgTitle: string;
planCode: string | null;
subscriptionId: string | null;
stripeCustomerId: string;
stripeCustomerEmail: string;
dealKey: string;
dealLabel: string;
dealCategory: string;
};
type ApplyCouponDialogProps = {
target: ApplyCouponTarget | null;
open: boolean;
onOpenChange: (open: boolean) => void;
};
export function ApplyCouponDialog({ target, open, onOpenChange }: ApplyCouponDialogProps) {
const navigation = useNavigation();
const isSubmitting = navigation.state !== "idle";
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent>
<DialogHeader>
{target
? `Apply ${target.dealLabel} to ${target.orgTitle}?`
: "Apply coupon deal"}
</DialogHeader>
{target && (
<>
<Paragraph variant="small" className="text-text-dimmed">
Re-read the org and Stripe customer below before applying. The
coupon will be added to the org's active Stripe subscription.
</Paragraph>
<Property.Table>
<Property.Item>
<Property.Label>Org</Property.Label>
<Property.Value>
{target.orgSlug} · {target.planCode ?? "Free"}
</Property.Value>
</Property.Item>
<Property.Item>
<Property.Label>Stripe customer</Property.Label>
<Property.Value>
{target.stripeCustomerId} ({target.stripeCustomerEmail})
</Property.Value>
</Property.Item>
<Property.Item>
<Property.Label>Stripe sub</Property.Label>
<Property.Value>{target.subscriptionId ?? "—"}</Property.Value>
</Property.Item>
<Property.Item>
<Property.Label>Coupon</Property.Label>
<Property.Value>
{target.dealKey} · {target.dealCategory}
</Property.Value>
</Property.Item>
</Property.Table>
<Form method="post" className="flex flex-col gap-3">
<input type="hidden" name="intent" value="apply" />
<input type="hidden" name="orgId" value={target.orgId} />
<input type="hidden" name="dealKey" value={target.dealKey} />
<DialogFooter>
<Button
type="button"
variant="tertiary/medium"
onClick={() => onOpenChange(false)}
disabled={isSubmitting}
>
Cancel
</Button>
<Button
type="submit"
variant="primary/medium"
disabled={isSubmitting || !target.subscriptionId}
>
Apply
</Button>
</DialogFooter>
</Form>
</>
)}
</DialogContent>
</Dialog>
);
}