@@ -44,6 +44,16 @@ def calculate_weekly_credits(vcpu: int, ram: float) -> float:
4444MESSAGES_VALUES = [0 ] + [50 * (2 ** i ) for i in range (9 )] + [20000 , 0 ]
4545
4646
47+ def get_is_enterprise_tier (messages_tier_index : int ) -> bool :
48+ """Check if slider is at Enterprise position"""
49+ return messages_tier_index == len (MESSAGES_VALUES ) - 1
50+
51+
52+ def get_message_credits (messages_tier_index : int ) -> int :
53+ """Get credits from message tier slider"""
54+ return MESSAGES_VALUES [messages_tier_index ]
55+
56+
4757class MachineState (rx .State ):
4858 machines : rx .Field [list [Machine ]] = rx .field (default_factory = list )
4959 messages_tier_index : rx .Field [int ] = rx .field (default = 0 )
@@ -62,12 +72,10 @@ def update_machine(self, index: int, new_machine_index: int):
6272
6373 @rx .event (temporal = True )
6474 def update_messages_tier (self , new_tier_index : int ):
75+ if new_tier_index == self .messages_tier_index :
76+ return
6577 self .messages_tier_index = new_tier_index
6678
67- def _get_message_credits (self ) -> int :
68- """Get credits from message tier slider"""
69- return MESSAGES_VALUES [self .messages_tier_index ]
70-
7179 def _get_machines_credits (self ) -> float :
7280 """Calculate total weekly credits of all machines"""
7381 return sum (
@@ -77,7 +85,9 @@ def _get_machines_credits(self) -> float:
7785
7886 def _get_total_credits (self ) -> float :
7987 """Calculate total credits as numeric value"""
80- return self ._get_message_credits () + round (self ._get_machines_credits (), 2 )
88+ return get_message_credits (self .messages_tier_index ) + round (
89+ self ._get_machines_credits (), 2
90+ )
8191
8292 def _find_tier_for_credits (self , credits : float ) -> dict | None :
8393 """Find Pro tier that fits the given credits, or None if Enterprise needed"""
@@ -92,37 +102,32 @@ def machines_weekly_credits(self) -> float:
92102 """For UI display of machine credits"""
93103 return self ._get_machines_credits ()
94104
95- @rx .var
96- def is_enterprise_tier (self ) -> bool :
97- """Check if slider is at Enterprise position"""
98- return self .messages_tier_index == len (MESSAGES_VALUES ) - 1
99-
100105 @rx .var
101106 def current_tier (self ) -> dict :
102107 """Current tier info based on message credits only"""
103- msg_credits = self ._get_message_credits ( )
108+ msg_credits = get_message_credits ( self .messages_tier_index )
104109
105- if self .is_enterprise_tier :
110+ if get_is_enterprise_tier ( self .messages_tier_index ) :
106111 return {
107112 "key" : "Enterprise" ,
108113 "credits" : msg_credits ,
109114 "price" : "custom" ,
110- "messages" : "custom" ,
111115 }
112116
113117 tier = self ._find_tier_for_credits (msg_credits )
114118 return {
115119 "key" : tier ["key" ] if tier else "Enterprise" ,
116120 "credits" : msg_credits ,
117121 "price" : tier ["price" ] if tier else "custom" ,
118- "messages" : msg_credits ,
119122 }
120123
121124 @rx .var
122125 def total_credits (self ) -> str :
123126 """Total credits display string"""
124127 total = self ._get_total_credits ()
125- if self .is_enterprise_tier or not self ._find_tier_for_credits (total ):
128+ if get_is_enterprise_tier (
129+ self .messages_tier_index
130+ ) or not self ._find_tier_for_credits (total ):
126131 return "Custom"
127132 return f"{ total :,} "
128133
@@ -137,15 +142,13 @@ def recommended_tier_info(self) -> dict:
137142 "needs_enterprise" : False ,
138143 "name" : f"{ tier ['key' ]} Plan" ,
139144 "credits" : tier ["credits" ],
140- "messages" : round (tier ["credits" ] / 10 , 1 ),
141145 }
142146
143147 return {
144148 "price" : "Custom" ,
145149 "needs_enterprise" : True ,
146150 "name" : "Enterprise" ,
147151 "credits" : "Custom" ,
148- "messages" : "custom" ,
149152 }
150153
151154 @rx .event
@@ -162,18 +165,18 @@ def total_credits_card() -> rx.Component:
162165 rx .el .div (
163166 rx .el .div (
164167 rx .cond (
165- MachineState .is_enterprise_tier ,
168+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
166169 rx .el .span (
167170 "Reflex Build Credits (Custom)" ,
168171 class_name = "text-secondary-11 text-sm font-medium" ,
169172 ),
170173 rx .el .span (
171- f"Reflex Build Credits ({ format_number (MachineState .current_tier ['messages ' ])} )" ,
174+ f"Reflex Build Credits ({ format_number (MachineState .current_tier ['credits ' ])} )" ,
172175 class_name = "text-secondary-11 text-sm font-medium" ,
173176 ),
174177 ),
175178 rx .cond (
176- MachineState .is_enterprise_tier ,
179+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
177180 rx .el .span (
178181 "Custom" ,
179182 class_name = "text-secondary-12 text-sm font-medium ml-auto font-mono" ,
@@ -211,9 +214,9 @@ def total_credits_card() -> rx.Component:
211214 class_name = "flex flex-row gap-2 items-center justify-between" ,
212215 ),
213216 rx .el .div (
214- rx .el .span (
217+ rx .el .span (
215218 rx .cond (
216- MachineState .recommended_tier_info [ "needs_enterprise" ] ,
219+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
217220 rx .el .span (
218221 "Get a custom quote for your needs" ,
219222 class_name = "text-secondary-12 text-sm font-medium" ,
@@ -236,27 +239,27 @@ def total_credits_card() -> rx.Component:
236239 ),
237240 ),
238241 class_name = "text-center" ,
239- ),
242+ ),
240243 class_name = "flex flex-col gap-2 mt-4 pt-2 justify-center" ,
241244 ),
242245 rx .cond (
243- MachineState .recommended_tier_info [ "needs_enterprise" ] ,
244- lemcal_dialog (
245- ui .button (
246- "Contact Sales" ,
247- size = "sm" ,
248- class_name = "font-semibold w-full" ,
249- ),
250- ),
251- ui .link (
252- render_ = ui .button (
253- "Upgrade Now" ,
254- size = "sm" ,
255- class_name = "font-semibold w-full" ,
256- ),
257- to = f"{ REFLEX_CLOUD_URL .rstrip ('/' )} /?redirect_url={ REFLEX_CLOUD_URL .rstrip ('/' )} /billing/" ,
258- target = "_blank" ,
259- ),
246+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
247+ lemcal_dialog (
248+ ui .button (
249+ "Contact Sales" ,
250+ size = "sm" ,
251+ class_name = "font-semibold w-full" ,
252+ ),
253+ ),
254+ ui .link (
255+ render_ = ui .button (
256+ "Upgrade Now" ,
257+ size = "sm" ,
258+ class_name = "font-semibold w-full" ,
259+ ),
260+ to = f"{ REFLEX_CLOUD_URL .rstrip ('/' )} /?redirect_url={ REFLEX_CLOUD_URL .rstrip ('/' )} /billing/" ,
261+ target = "_blank" ,
262+ ),
260263 ),
261264 class_name = "flex flex-col gap-2" ,
262265 ),
@@ -270,31 +273,31 @@ def messages_card() -> rx.Component:
270273 rx .el .div (
271274 ui .icon ("StarCircleIcon" , class_name = "text-secondary-11 size-5" ),
272275 rx .cond (
273- MachineState .is_enterprise_tier ,
276+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
274277 rx .el .span (
275278 "Custom Reflex Build Credits / Month" ,
276279 class_name = "text-secondary-12 lg:text-lg text-base font-medium" ,
277280 ),
278281 rx .el .span (
279- f"{ format_number (MachineState .current_tier ['messages ' ])} Reflex Build Credits / Month" ,
282+ f"{ format_number (MachineState .current_tier ['credits ' ])} Reflex Build Credits / Month" ,
280283 class_name = "text-secondary-12 lg:text-lg text-base font-medium" ,
281284 ),
282285 ),
283286 class_name = "flex flex-row gap-2 items-center" ,
284287 ),
285288 rx .el .div (
286- rx .cond (
287- MachineState .is_enterprise_tier ,
288- rx .el .span (
289- "Custom" ,
290- class_name = "text-secondary-12 lg:text-lg text-base font-medium" ,
291- ),
292- rx .el .span (
293- format_number (MachineState .current_tier ["credits" ]),
294- " Credits" ,
295- class_name = "text-secondary-12 lg:text-lg text-base font-medium font-mono" ,
296- ),
297- ),
289+ rx .cond (
290+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
291+ rx .el .span (
292+ "Custom" ,
293+ class_name = "text-secondary-12 lg:text-lg text-base font-medium" ,
294+ ),
295+ rx .el .span (
296+ format_number (MachineState .current_tier ["credits" ]),
297+ " Credits" ,
298+ class_name = "text-secondary-12 lg:text-lg text-base font-medium font-mono" ,
299+ ),
300+ ),
298301 class_name = "flex flex-row gap-1.5 items-center" ,
299302 ),
300303 class_name = "flex flex-row gap-2 items-center justify-between" ,
@@ -306,13 +309,15 @@ def messages_card() -> rx.Component:
306309 ui .tooltip (
307310 trigger = ui .slider .thumb (),
308311 content = rx .cond (
309- MachineState .is_enterprise_tier ,
312+ get_is_enterprise_tier ( MachineState .messages_tier_index ) ,
310313 "Custom" ,
311314 rx .cond (
312- MachineState .is_enterprise_tier ,
315+ get_is_enterprise_tier (
316+ MachineState .messages_tier_index
317+ ),
313318 "Custom Messages" ,
314- f"{ format_number (MachineState .current_tier ['messages ' ])} Messages" ,
315- ),
319+ f"{ format_number (MachineState .current_tier ['credits ' ])} Messages" ,
320+ ),
316321 ),
317322 open = message_tooltip_open_cs .value ,
318323 side = "bottom" ,
0 commit comments