@@ -11,10 +11,14 @@ import { useFormState } from "react-dom";
1111import { ServerActionResult } from "@/shared/model/server-action-error-return.model" ;
1212import { Input } from "@/components/ui/input" ;
1313import { AppRateLimitsModel , appRateLimitsZodModel } from "@/shared/model/app-rate-limits.model" ;
14- import { useEffect } from "react" ;
14+ import { useEffect , useState } from "react" ;
1515import { toast } from "sonner" ;
1616import { AppExtendedModel } from "@/shared/model/app-extended.model" ;
1717import { cn } from "@/frontend/utils/utils" ;
18+ import { getRessourceDataApp } from "../overview/actions" ;
19+ import { PodsResourceInfoModel } from "@/shared/model/pods-resource-info.model" ;
20+ import { KubeSizeConverter } from "@/shared/utils/kubernetes-size-converter.utils" ;
21+ import { Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from "@/components/ui/tooltip" ;
1822
1923
2024export default function GeneralAppRateLimits ( { app, readonly } : {
@@ -27,6 +31,23 @@ export default function GeneralAppRateLimits({ app, readonly }: {
2731 disabled : readonly
2832 } ) ;
2933
34+ const [ monitoringData , setMonitoringData ] = useState < PodsResourceInfoModel | undefined > ( undefined ) ;
35+
36+ useEffect ( ( ) => {
37+ getRessourceDataApp ( app . projectId , app . id ) . then ( ( res ) => {
38+ if ( res . status === 'success' && res . data ) {
39+ setMonitoringData ( res . data ) ;
40+ }
41+ } ) . catch ( ( ) => { /* pod may not be running, silently ignore */ } ) ;
42+ } , [ app . id , app . projectId ] ) ;
43+
44+ const suggestedMemoryMb = monitoringData && monitoringData . ramAbsolutBytes
45+ ? Math . ceil ( KubeSizeConverter . fromBytesToMegabytes ( monitoringData . ramAbsolutBytes ) )
46+ : undefined ;
47+ const suggestedCpuMillicores = monitoringData && monitoringData . cpuAbsolutCores
48+ ? Math . max ( 1 , Math . round ( monitoringData . cpuAbsolutCores * 1000 ) )
49+ : undefined ;
50+
3051 const [ state , formAction ] = useFormState ( ( state : ServerActionResult < any , any > , payload : AppRateLimitsModel ) => saveGeneralAppRateLimits ( state , payload , app . id ) , FormUtils . getInitialFormState < typeof appRateLimitsZodModel > ( ) ) ;
3152 useEffect ( ( ) => {
3253 if ( state . status === 'success' ) {
@@ -90,6 +111,23 @@ export default function GeneralAppRateLimits({ app, readonly }: {
90111 < Input type = "number" { ...field } value = { field . value as string | number | readonly string [ ] | undefined } />
91112 </ FormControl >
92113 < FormMessage />
114+ { ! readonly && suggestedMemoryMb !== undefined && (
115+ < TooltipProvider >
116+ < Tooltip delayDuration = { 200 } >
117+ < TooltipTrigger asChild >
118+ < span
119+ className = "inline-flex cursor-pointer items-center rounded-full border border-blue-300 bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 hover:bg-blue-100 dark:border-blue-700 dark:bg-blue-950 dark:text-blue-300 dark:hover:bg-blue-900"
120+ onClick = { ( ) => form . setValue ( 'memoryReservation' , suggestedMemoryMb ) }
121+ >
122+ ~ { suggestedMemoryMb } MB
123+ </ span >
124+ </ TooltipTrigger >
125+ < TooltipContent >
126+ < p > Suggestion based on current pod resource usage</ p >
127+ </ TooltipContent >
128+ </ Tooltip >
129+ </ TooltipProvider >
130+ ) }
93131 </ FormItem >
94132 ) }
95133 />
@@ -118,6 +156,23 @@ export default function GeneralAppRateLimits({ app, readonly }: {
118156 < Input type = "number" { ...field } value = { field . value as string | number | readonly string [ ] | undefined } />
119157 </ FormControl >
120158 < FormMessage />
159+ { ! readonly && suggestedCpuMillicores !== undefined && (
160+ < TooltipProvider >
161+ < Tooltip delayDuration = { 200 } >
162+ < TooltipTrigger asChild >
163+ < span
164+ className = "inline-flex cursor-pointer items-center rounded-full border border-blue-300 bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 hover:bg-blue-100 dark:border-blue-700 dark:bg-blue-950 dark:text-blue-300 dark:hover:bg-blue-900"
165+ onClick = { ( ) => form . setValue ( 'cpuReservation' , suggestedCpuMillicores ) }
166+ >
167+ ~ { suggestedCpuMillicores } m
168+ </ span >
169+ </ TooltipTrigger >
170+ < TooltipContent >
171+ < p > Suggestion based on current pod resource usage</ p >
172+ </ TooltipContent >
173+ </ Tooltip >
174+ </ TooltipProvider >
175+ ) }
121176 </ FormItem >
122177 ) }
123178 />
0 commit comments