locale.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. 'use client'
  2. import { Menu, Transition } from '@headlessui/react'
  3. import { Fragment } from 'react'
  4. import { GlobeAltIcon } from '@heroicons/react/24/outline'
  5. export const LOCALES = [
  6. { value: 'en', name: 'EN' },
  7. { value: 'zh-Hans', name: '简体中文' },
  8. ]
  9. export const RFC_LOCALES = [
  10. { value: 'en-US', name: 'EN' },
  11. { value: 'zh-Hans', name: '简体中文' },
  12. ]
  13. interface ISelectProps {
  14. items: Array<{ value: string; name: string }>
  15. value?: string
  16. className?: string
  17. onChange?: (value: string) => void
  18. }
  19. export default function Select({
  20. items,
  21. value,
  22. onChange
  23. }: ISelectProps) {
  24. const item = items.filter(item => item.value === value)[0]
  25. return (
  26. <div className="w-56 text-right">
  27. <Menu as="div" className="relative inline-block text-left">
  28. <div>
  29. <Menu.Button className="inline-flex w-full justify-center items-center
  30. rounded-lg px-2 py-1
  31. text-gray-600 text-xs font-medium
  32. border border-gray-200">
  33. <GlobeAltIcon className="w-5 h-5 mr-2 " aria-hidden="true" />
  34. {item?.name}
  35. </Menu.Button>
  36. </div>
  37. <Transition
  38. as={Fragment}
  39. enter="transition ease-out duration-100"
  40. enterFrom="transform opacity-0 scale-95"
  41. enterTo="transform opacity-100 scale-100"
  42. leave="transition ease-in duration-75"
  43. leaveFrom="transform opacity-100 scale-100"
  44. leaveTo="transform opacity-0 scale-95"
  45. >
  46. <Menu.Items className="absolute right-0 mt-2 w-28 origin-top-right divide-y divide-gray-100 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
  47. <div className="px-1 py-1 ">
  48. {items.map((item) => {
  49. return <Menu.Item key={item.value}>
  50. {({ active }) => (
  51. <button
  52. className={`${active ? 'bg-gray-100' : ''
  53. } group flex w-full items-center rounded-md px-2 py-2 text-sm`}
  54. onClick={(evt) => {
  55. evt.preventDefault()
  56. onChange && onChange(item.value)
  57. }}
  58. >
  59. {item.name}
  60. </button>
  61. )}
  62. </Menu.Item>
  63. })}
  64. </div>
  65. </Menu.Items>
  66. </Transition>
  67. </Menu>
  68. </div>
  69. )
  70. }
  71. export function InputSelect({
  72. items,
  73. value,
  74. onChange
  75. }: ISelectProps) {
  76. const item = items.filter(item => item.value === value)[0]
  77. return (
  78. <div className="w-full">
  79. <Menu as="div" className="w-full">
  80. <div>
  81. <Menu.Button className="iappearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 sm:text-sm h-[38px] text-left">
  82. {item?.name}
  83. </Menu.Button>
  84. </div>
  85. <Transition
  86. as={Fragment}
  87. enter="transition ease-out duration-100"
  88. enterFrom="transform opacity-0 scale-95"
  89. enterTo="transform opacity-100 scale-100"
  90. leave="transition ease-in duration-75"
  91. leaveFrom="transform opacity-100 scale-100"
  92. leaveTo="transform opacity-0 scale-95"
  93. >
  94. <Menu.Items className="absolute right-0 mt-2 w-full origin-top-right divide-y divide-gray-100 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none z-10">
  95. <div className="px-1 py-1 ">
  96. {items.map((item) => {
  97. return <Menu.Item key={item.value}>
  98. {({ active }) => (
  99. <button
  100. className={`${active ? 'bg-gray-100' : ''
  101. } group flex w-full items-center rounded-md px-2 py-2 text-sm`}
  102. onClick={() => {
  103. onChange && onChange(item.value)
  104. }}
  105. >
  106. {item.name}
  107. </button>
  108. )}
  109. </Menu.Item>
  110. })}
  111. </div>
  112. </Menu.Items>
  113. </Transition>
  114. </Menu>
  115. </div>
  116. )
  117. }