Skip to content

Commit 69cd317

Browse files
authored
fix: update usage panel to use Credit 250 experiment (#4600)
1 parent 7a36e01 commit 69cd317

File tree

5 files changed

+71
-19
lines changed

5 files changed

+71
-19
lines changed

src/checkout/CheckoutForm.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@ import {CheckoutContext} from 'src/checkout/context/checkout'
3939
import {event} from 'src/cloud/utils/reporting'
4040

4141
// Constants
42-
import {
43-
CREDIT_250_EXPERIMENT_ID,
44-
PAYG_CREDIT_EXPERIMENT_ID,
45-
} from 'src/shared/constants'
42+
import {CREDIT_250_EXPERIMENT_ID} from 'src/shared/constants'
4643

4744
// Utils
4845
import {isFlagEnabled} from 'src/shared/utils/featureFlag'
@@ -82,7 +79,7 @@ const CheckoutForm: FC = () => {
8279
>
8380
Upgrade to Usage-Based Account
8481
</h1>
85-
{isFlagEnabled('credit250Experiment') && (
82+
{isFlagEnabled('credit250Experiment') && !isPaygCreditActive && (
8683
<GoogleOptimizeExperiment
8784
experimentID={CREDIT_250_EXPERIMENT_ID}
8885
variants={[
@@ -124,7 +121,7 @@ const CheckoutForm: FC = () => {
124121

125122
{isPaygCreditActive && (
126123
<GoogleOptimizeExperiment
127-
experimentID={PAYG_CREDIT_EXPERIMENT_ID}
124+
experimentID={CREDIT_250_EXPERIMENT_ID}
128125
variants={[
129126
<div
130127
className="checkout-form--banner"

src/checkout/context/checkout.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ import {
2424
} from 'src/shared/copy/notifications'
2525
import {
2626
BALANCE_THRESHOLD_DEFAULT,
27+
CREDIT_250_EXPERIMENT_ID,
2728
EMPTY_ZUORA_PARAMS,
2829
} from 'src/shared/constants'
29-
import {PAYG_CREDIT_EXPERIMENT_ID} from 'src/shared/constants'
3030

3131
// Types
3232
import {CreditCardParams, RemoteDataState} from 'src/types'
@@ -87,8 +87,6 @@ export const CheckoutContext = React.createContext<CheckoutContextType>(
8787
DEFAULT_CONTEXT
8888
)
8989

90-
const CHECKOUT_PARAM_CODE = '757vMPJiCMdTFkO4'
91-
9290
export const CheckoutProvider: FC<Props> = React.memo(({children}) => {
9391
const dispatch = useDispatch()
9492

@@ -258,11 +256,8 @@ export const CheckoutProvider: FC<Props> = React.memo(({children}) => {
258256
return errs.length
259257
}
260258

261-
const query = new URLSearchParams(window.location.search)
262-
const checkoutCode = query.get('c')
263259
const isPaygCreditActive =
264-
getExperimentVariantId(PAYG_CREDIT_EXPERIMENT_ID) === '1' &&
265-
checkoutCode === CHECKOUT_PARAM_CODE
260+
getExperimentVariantId(CREDIT_250_EXPERIMENT_ID) === '1'
266261

267262
const handleSubmit = useCallback(
268263
async (paymentMethodId: string) => {

src/usage/context/usage.test.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {calculateCreditDaysUsed} from 'src/usage/context/usage'
2+
3+
describe('calculateCreditDaysUsed', () => {
4+
const ONE_DAY_MILLSECONDS = 1000 * 60 * 60 * 24
5+
6+
it('handles falsy values as invalid date', () => {
7+
expect(calculateCreditDaysUsed(undefined)).toEqual(NaN)
8+
expect(calculateCreditDaysUsed(null)).toEqual(NaN)
9+
expect(calculateCreditDaysUsed('')).toEqual(NaN)
10+
})
11+
12+
it('handles valid dates in the past', () => {
13+
const yesterday = new Date(Date.now() - ONE_DAY_MILLSECONDS).toISOString()
14+
const twoDaysAgo = new Date(
15+
Date.now() - 2 * ONE_DAY_MILLSECONDS
16+
).toISOString()
17+
const oneWeekAgo = new Date(
18+
Date.now() - 7 * ONE_DAY_MILLSECONDS
19+
).toISOString()
20+
const thirtyDaysAgo = new Date(
21+
Date.now() - 30 * ONE_DAY_MILLSECONDS
22+
).toISOString()
23+
24+
expect(calculateCreditDaysUsed(yesterday)).toEqual(1)
25+
expect(calculateCreditDaysUsed(twoDaysAgo)).toEqual(2)
26+
expect(calculateCreditDaysUsed(oneWeekAgo)).toEqual(7)
27+
expect(calculateCreditDaysUsed(thirtyDaysAgo)).toEqual(30)
28+
})
29+
30+
it('handles valid dates in the future', () => {
31+
const tomorrow = new Date(Date.now() + ONE_DAY_MILLSECONDS).toISOString()
32+
const twoDaysFromNow = new Date(
33+
Date.now() + 2 * ONE_DAY_MILLSECONDS
34+
).toISOString()
35+
const oneWeekFromNow = new Date(
36+
Date.now() + 7 * ONE_DAY_MILLSECONDS
37+
).toISOString()
38+
const thirtyDaysFromNow = new Date(
39+
Date.now() + 30 * ONE_DAY_MILLSECONDS
40+
).toISOString()
41+
42+
expect(calculateCreditDaysUsed(tomorrow)).toEqual(-1)
43+
expect(calculateCreditDaysUsed(twoDaysFromNow)).toEqual(-2)
44+
expect(calculateCreditDaysUsed(oneWeekFromNow)).toEqual(-7)
45+
expect(calculateCreditDaysUsed(thirtyDaysFromNow)).toEqual(-30)
46+
})
47+
})

src/usage/context/usage.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {isFlagEnabled} from 'src/shared/utils/featureFlag'
1616
// Constants
1717
import {PAYG_CREDIT_DAYS} from 'src/shared/constants'
1818
import {DEFAULT_USAGE_TIME_RANGE} from 'src/shared/constants/timeRanges'
19+
import {MILLISECONDS_IN_ONE_DAY} from 'src/utils/datetime/constants'
1920

2021
// Types
2122
import {
@@ -79,6 +80,16 @@ export const UsageContext = React.createContext<UsageContextType>(
7980
DEFAULT_CONTEXT
8081
)
8182

83+
export const calculateCreditDaysUsed = (creditStartDate: string): number => {
84+
if (!creditStartDate) {
85+
return NaN
86+
}
87+
const startDate = new Date(creditStartDate)
88+
const current = new Date()
89+
const diffTime = current.getTime() - startDate.getTime()
90+
return Math.floor(diffTime / MILLISECONDS_IN_ONE_DAY)
91+
}
92+
8293
export const UsageProvider: FC<Props> = React.memo(({children}) => {
8394
const [billingDateTime, setBillingDateTime] = useState('')
8495
const [usageVectors, setUsageVectors] = useState([])
@@ -103,12 +114,12 @@ export const UsageProvider: FC<Props> = React.memo(({children}) => {
103114
const {quartzMe} = useSelector(getMe)
104115
const parser = isFlagEnabled('fastFromFlux') ? fastFromFlux : fromFlux
105116

106-
const creditDaysUsed = useMemo(() => {
107-
const startDate = new Date(quartzMe?.paygCreditStartDate)
108-
const current = new Date()
109-
const diffTime = Math.abs(current.getTime() - startDate.getTime())
110-
return Math.floor(diffTime / (1000 * 60 * 60 * 24))
111-
}, [quartzMe?.paygCreditStartDate])
117+
const paygCreditStartDate = quartzMe?.paygCreditStartDate ?? ''
118+
119+
const creditDaysUsed = useMemo(
120+
() => calculateCreditDaysUsed(paygCreditStartDate),
121+
[paygCreditStartDate]
122+
)
112123

113124
const paygCreditEnabled =
114125
creditDaysUsed >= 0 && creditDaysUsed < PAYG_CREDIT_DAYS

src/utils/datetime/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ export const RFC3339_PATTERN = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(\s|T)?(\d\d)(:)?(
55
// Hard-coded dates required by the backend for caching purposes
66
export const CACHING_REQUIRED_START_DATE = '1677-09-21T00:12:43.145224194Z'
77
export const CACHING_REQUIRED_END_DATE = '2262-04-11T23:47:16.854775806Z'
8+
9+
export const MILLISECONDS_IN_ONE_DAY = 1000 * 60 * 60 * 24

0 commit comments

Comments
 (0)