-
-
Notifications
You must be signed in to change notification settings - Fork 6.9k
Expand file tree
/
Copy pathplan-form.ts
More file actions
91 lines (86 loc) · 3.16 KB
/
plan-form.ts
File metadata and controls
91 lines (86 loc) · 3.16 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
import { z } from 'zod'
import type { TFunction } from 'i18next'
import { parseQuotaFromDollars, quotaUnitsToDollars } from '@/lib/format'
import type { SubscriptionPlan, PlanPayload } from '../types'
export function getPlanFormSchema(t: TFunction) {
return z.object({
title: z.string().min(1, t('Please enter plan title')),
subtitle: z.string().optional(),
price_amount: z.coerce.number().min(0, t('Please enter amount')),
duration_unit: z.enum(['year', 'month', 'day', 'hour', 'custom']),
duration_value: z.coerce.number().min(1),
custom_seconds: z.coerce.number().min(0).optional(),
quota_reset_period: z.enum([
'never',
'daily',
'weekly',
'monthly',
'custom',
]),
quota_reset_custom_seconds: z.coerce.number().min(0).optional(),
enabled: z.boolean(),
sort_order: z.coerce.number(),
max_purchase_per_user: z.coerce.number().min(0),
total_amount: z.coerce.number().min(0),
upgrade_group: z.string().optional(),
stripe_price_id: z.string().optional(),
creem_product_id: z.string().optional(),
})
}
export type PlanFormValues = z.infer<ReturnType<typeof getPlanFormSchema>>
export const PLAN_FORM_DEFAULTS: PlanFormValues = {
title: '',
subtitle: '',
price_amount: 0,
duration_unit: 'month',
duration_value: 1,
custom_seconds: 0,
quota_reset_period: 'never',
quota_reset_custom_seconds: 0,
enabled: true,
sort_order: 0,
max_purchase_per_user: 0,
total_amount: 0,
upgrade_group: '',
stripe_price_id: '',
creem_product_id: '',
}
export function planToFormValues(plan: SubscriptionPlan): PlanFormValues {
return {
title: plan.title || '',
subtitle: plan.subtitle || '',
price_amount: Number(plan.price_amount || 0),
duration_unit: plan.duration_unit || 'month',
duration_value: Number(plan.duration_value || 1),
custom_seconds: Number(plan.custom_seconds || 0),
quota_reset_period: plan.quota_reset_period || 'never',
quota_reset_custom_seconds: Number(plan.quota_reset_custom_seconds || 0),
enabled: plan.enabled !== false,
sort_order: Number(plan.sort_order || 0),
max_purchase_per_user: Number(plan.max_purchase_per_user || 0),
total_amount: Number(quotaUnitsToDollars(plan.total_amount || 0).toFixed(2)),
upgrade_group: plan.upgrade_group || '',
stripe_price_id: plan.stripe_price_id || '',
creem_product_id: plan.creem_product_id || '',
}
}
export function formValuesToPlanPayload(values: PlanFormValues): PlanPayload {
return {
plan: {
...values,
price_amount: Number(values.price_amount || 0),
currency: 'USD',
duration_value: Number(values.duration_value || 0),
custom_seconds: Number(values.custom_seconds || 0),
quota_reset_period: values.quota_reset_period || 'never',
quota_reset_custom_seconds:
values.quota_reset_period === 'custom'
? Number(values.quota_reset_custom_seconds || 0)
: 0,
sort_order: Number(values.sort_order || 0),
max_purchase_per_user: Number(values.max_purchase_per_user || 0),
total_amount: parseQuotaFromDollars(Number(values.total_amount || 0)),
upgrade_group: values.upgrade_group || '',
},
}
}