LanguageSelector.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { ChevronDown, Terminal } from 'lucide-react'
  2. import { useState } from 'react'
  3. import {
  4. Button,
  5. Command,
  6. CommandGroup,
  7. CommandItem,
  8. CommandList,
  9. Popover,
  10. PopoverContent,
  11. PopoverTrigger,
  12. } from 'ui'
  13. import { BASE_PATH } from '@/lib/constants'
  14. import { useAppStateSnapshot } from '@/state/app-state'
  15. interface LanguageSelectorProps {
  16. /**
  17. * Only show icons to represent the language
  18. */
  19. simplifiedVersion?: boolean
  20. }
  21. const LanguageSelector = ({ simplifiedVersion = false }: LanguageSelectorProps) => {
  22. const snap = useAppStateSnapshot()
  23. const [showLanguage, setShowLanguage] = useState(false)
  24. const updateLanguage = (value: 'js' | 'bash') => {
  25. snap.setDocsLanguage(value)
  26. setShowLanguage(false)
  27. }
  28. return (
  29. <div className="flex items-center gap-x-2">
  30. <Popover modal={false} open={showLanguage} onOpenChange={setShowLanguage}>
  31. <PopoverTrigger asChild>
  32. <Button
  33. type="default"
  34. className={simplifiedVersion ? 'px-1' : ''}
  35. icon={
  36. simplifiedVersion ? (
  37. snap.docsLanguage === 'js' ? (
  38. <img
  39. src={`${BASE_PATH}/img/libraries/javascript-icon.svg`}
  40. alt={`javascript logo`}
  41. width="14"
  42. />
  43. ) : (
  44. <Terminal size={14} strokeWidth={2.5} />
  45. )
  46. ) : undefined
  47. }
  48. iconRight={!simplifiedVersion && <ChevronDown size={14} strokeWidth={2} />}
  49. >
  50. {!simplifiedVersion
  51. ? `Language: ${snap.docsLanguage === 'js' ? 'Javascript' : 'Bash'}`
  52. : undefined}
  53. </Button>
  54. </PopoverTrigger>
  55. <PopoverContent className="p-0 w-24" side="bottom" align="end">
  56. <Command>
  57. <CommandList>
  58. <CommandGroup>
  59. <CommandItem
  60. className="cursor-pointer"
  61. onSelect={() => updateLanguage('js')}
  62. onClick={() => updateLanguage('js')}
  63. >
  64. <p>Javascript</p>
  65. </CommandItem>
  66. <CommandItem
  67. className="cursor-pointer"
  68. onSelect={() => updateLanguage('bash')}
  69. onClick={() => updateLanguage('bash')}
  70. >
  71. <p>Bash</p>
  72. </CommandItem>
  73. </CommandGroup>
  74. </CommandList>
  75. </Command>
  76. </PopoverContent>
  77. </Popover>
  78. </div>
  79. )
  80. }
  81. export default LanguageSelector