1- import { constants , Plan } from '@brunolemos/devhub-core'
21import React , { useContext , useEffect , useState } from 'react'
32
4- import { getDefaultDevHubHeaders } from '../helpers'
5- import { useIsMountedRef } from '../hooks/use-is-mounted-ref'
3+ import {
4+ fetchPlansState ,
5+ getCachedPublicPlans ,
6+ PlansState ,
7+ } from '../helpers/plans'
8+ import { useDynamicRef } from '../hooks/use-dynamic-ref'
69import { useAuth } from './AuthContext'
710
811export interface PlansProps {
912 children : React . ReactNode
1013}
1114
12- export interface PlansState {
13- freePlan : Plan | undefined
14- freeTrialDays : number
15- freeTrialPlan : Plan | undefined
16- paidPlans : Plan [ ]
17- plans : Plan [ ]
18- userPlanInfo : Plan | undefined
19- }
20-
2115const initialState : PlansState = {
2216 freePlan : undefined ,
2317 freeTrialDays : 0 ,
@@ -31,44 +25,27 @@ export const PlansContext = React.createContext(initialState)
3125PlansContext . displayName = 'PlansContext'
3226
3327export function PlansProvider ( props : PlansProps ) {
34- const isMountedRef = useIsMountedRef ( )
35-
36- const [ state , setState ] = useState ( initialState )
28+ const [ state , setState ] = useState ( getCachedPublicPlans ( ) || initialState )
3729
3830 const { authData } = useAuth ( )
3931
32+ const stateRef = useDynamicRef ( state )
4033 useEffect ( ( ) => {
34+ if ( stateRef . current === getCachedPublicPlans ( ) && ! authData . appToken )
35+ return
4136 ; ( async ( ) => {
4237 try {
43- const response = await fetch ( `${ constants . API_BASE_URL } /plans` , {
44- method : 'GET' ,
45- headers : {
46- ...getDefaultDevHubHeaders ( { appToken : authData . appToken } ) ,
47- 'Content-Type' : 'application/json' ,
48- } ,
49- } )
50-
51- if ( ! isMountedRef . current ) return
52-
53- const data = ( await response . json ( ) ) as PlansState
54-
55- if ( ! ( data && data . plans ) ) {
56- throw new Error ( 'Something went wrong' )
57- }
58-
59- setState ( {
60- freePlan : data . freePlan ,
61- freeTrialDays : data . freeTrialDays ,
62- freeTrialPlan : data . freeTrialPlan ,
63- paidPlans : data . plans . filter ( plan => plan . amount > 0 ) ,
64- plans : data . plans ,
65- userPlanInfo : data . userPlanInfo ,
66- } )
38+ const s = await fetchPlansState ( authData . appToken )
39+ setState ( s )
6740 } catch ( error ) {
68- if ( ! isMountedRef . current ) return
41+ //
6942 }
7043 } ) ( )
71- } , [ authData . appToken , authData . plan && authData . plan . id ] )
44+ } , [
45+ ! ! authData . appToken ,
46+ authData . github . login ,
47+ authData . plan && authData . plan . id ,
48+ ] )
7249
7350 return (
7451 < PlansContext . Provider value = { state } >
0 commit comments