ConnectButton.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Plug } from 'lucide-react'
  2. import { parseAsBoolean, useQueryState } from 'nuqs'
  3. import { ComponentProps } from 'react'
  4. import { Button, cn } from 'ui'
  5. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  6. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  7. import { PROJECT_STATUS } from '@/lib/constants'
  8. import { useTrack } from '@/lib/telemetry/track'
  9. import { useAppStateSnapshot } from '@/state/app-state'
  10. interface ConnectButtonProps {
  11. buttonType?: ComponentProps<typeof Button>['type']
  12. className?: string
  13. iconOnly?: boolean
  14. }
  15. export const ConnectButton = ({
  16. buttonType = 'default',
  17. className,
  18. iconOnly = false,
  19. }: ConnectButtonProps) => {
  20. const { data: selectedProject } = useSelectedProjectQuery()
  21. const { setConnectSheetSource } = useAppStateSnapshot()
  22. const isActiveHealthy = selectedProject?.status === PROJECT_STATUS.ACTIVE_HEALTHY
  23. const track = useTrack()
  24. const [, setShowConnect] = useQueryState('showConnect', parseAsBoolean.withDefault(false))
  25. return (
  26. <ButtonTooltip
  27. type={buttonType}
  28. disabled={!isActiveHealthy}
  29. className={cn('rounded-full', className)}
  30. icon={<Plug className="rotate-90" />}
  31. onClick={() => {
  32. track('header_connect_button_clicked')
  33. setConnectSheetSource('header_button')
  34. setShowConnect(true)
  35. }}
  36. tooltip={{
  37. content: {
  38. side: 'bottom',
  39. text: !isActiveHealthy
  40. ? 'Project is currently not active and cannot be connected'
  41. : undefined,
  42. },
  43. }}
  44. >
  45. <span className={cn({ 'sr-only': iconOnly })}>Connect</span>
  46. </ButtonTooltip>
  47. )
  48. }