ComputeSizeRecommendationSection.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { AnimatePresence, motion } from 'framer-motion'
  2. import { ReactNode } from 'react'
  3. import { UseFormReturn } from 'react-hook-form'
  4. import { COMPUTE_BASELINE_IOPS, COMPUTE_MAX_IOPS } from 'shared-data'
  5. import { Admonition } from 'ui-patterns/admonition'
  6. import { DiskStorageSchemaType } from '../DiskManagement.schema'
  7. import {
  8. calculateComputeSizeRequiredForIops,
  9. calculateMaxIopsForComputeSize,
  10. mapAddOnVariantIdToComputeSize,
  11. } from '../DiskManagement.utils'
  12. import { RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3 } from './DiskManagement.constants'
  13. interface ComputeSizeRecommendationSectionProps {
  14. actions?: ReactNode
  15. form: UseFormReturn<DiskStorageSchemaType>
  16. }
  17. export function ComputeSizeRecommendationSection({
  18. actions,
  19. form,
  20. }: ComputeSizeRecommendationSectionProps) {
  21. const { watch } = form
  22. const computeSize = watch('computeSize')
  23. const iops = watch('provisionedIOPS')
  24. const computeSizeRecommendedForIops = calculateComputeSizeRequiredForIops(iops)
  25. const maxIopsForComputeSize = calculateMaxIopsForComputeSize(computeSize ?? 'ci_micro')
  26. const isVisible =
  27. iops > maxIopsForComputeSize &&
  28. !RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3.includes(computeSize ?? 'ci_micro')
  29. return (
  30. <AnimatePresence initial={false}>
  31. {isVisible && (
  32. <motion.div
  33. initial={{ opacity: 0, height: 0 }}
  34. animate={{ opacity: 1, height: 'auto' }}
  35. exit={{ opacity: 0, height: 0 }}
  36. transition={{ duration: 0.15 }}
  37. >
  38. <Admonition
  39. type="default"
  40. title={`Your compute size baseline is ${COMPUTE_BASELINE_IOPS[computeSize ?? 'ci_micro']} IOPS (max ${COMPUTE_MAX_IOPS[computeSize ?? 'ci_micro'] ?? maxIopsForComputeSize} IOPS)`}
  41. >
  42. <div className="flex flex-col gap-2">
  43. <div>
  44. <p className="text-sm text-foreground-light">
  45. To achieve higher IOPS performance we recommend using the{' '}
  46. <span className="text-foreground">
  47. {mapAddOnVariantIdToComputeSize(computeSizeRecommendedForIops)}
  48. </span>{' '}
  49. compute size.
  50. </p>
  51. </div>
  52. {actions && <div>{actions}</div>}
  53. </div>
  54. </Admonition>
  55. </motion.div>
  56. )}
  57. </AnimatePresence>
  58. )
  59. }