index.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react'
  5. import cn from '@/utils/classnames'
  6. import Popover from '@/app/components/base/popover'
  7. import { languages } from '@/i18n/language'
  8. export type ILanguageSelectProps = {
  9. currentLanguage: string
  10. onSelect: (language: string) => void
  11. disabled?: boolean
  12. }
  13. const LanguageSelect: FC<ILanguageSelectProps> = ({
  14. currentLanguage,
  15. onSelect,
  16. disabled,
  17. }) => {
  18. return (
  19. <Popover
  20. manualClose
  21. trigger='click'
  22. disabled={disabled}
  23. popupClassName='z-20'
  24. htmlContent={
  25. <div className='w-full p-1'>
  26. {languages.filter(language => language.supported).map(({ prompt_name }) => (
  27. <div
  28. key={prompt_name}
  29. className='w-full py-2 px-3 inline-flex items-center justify-between hover:bg-state-base-hover rounded-lg cursor-pointer'
  30. onClick={() => onSelect(prompt_name)}
  31. >
  32. <span className='text-text-secondary system-sm-medium'>{prompt_name}</span>
  33. {(currentLanguage === prompt_name) && <RiCheckLine className='size-4 text-text-accent' />}
  34. </div>
  35. ))}
  36. </div>
  37. }
  38. btnElement={
  39. <div className={cn('inline-flex items-center gap-x-[1px]', disabled && 'cursor-not-allowed')}>
  40. <span className={cn(
  41. 'px-[3px] system-xs-semibold text-components-button-tertiary-text',
  42. disabled ? 'text-components-button-tertiary-text-disabled' : '',
  43. )}>
  44. {currentLanguage}
  45. </span>
  46. <RiArrowDownSLine className={cn(
  47. 'size-3.5 text-components-button-tertiary-text',
  48. disabled ? 'text-components-button-tertiary-text-disabled' : '',
  49. )} />
  50. </div>
  51. }
  52. btnClassName={() => cn(
  53. '!border-0 rounded-md !px-1.5 !py-1 !mx-1 !bg-components-button-tertiary-bg !hover:bg-components-button-tertiary-bg',
  54. disabled ? 'bg-components-button-tertiary-bg-disabled' : '',
  55. )}
  56. className='!w-[140px] h-fit !z-20 !translate-x-0 !left-1'
  57. />
  58. )
  59. }
  60. export default React.memo(LanguageSelect)