index.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. 'use client'
  2. import { useTranslation } from 'react-i18next'
  3. import { Fragment } from 'react'
  4. import { Menu, Transition } from '@headlessui/react'
  5. import NotionIcon from '../../notion-icon'
  6. import s from './index.module.css'
  7. import cn from '@/utils/classnames'
  8. import type { DataSourceNotionWorkspace } from '@/models/common'
  9. type WorkspaceSelectorProps = {
  10. value: string
  11. items: Omit<DataSourceNotionWorkspace, 'total'>[]
  12. onSelect: (v: string) => void
  13. }
  14. export default function WorkspaceSelector({
  15. value,
  16. items,
  17. onSelect,
  18. }: WorkspaceSelectorProps) {
  19. const { t } = useTranslation()
  20. const currentWorkspace = items.find(item => item.workspace_id === value)
  21. return (
  22. <Menu as="div" className="relative inline-block text-left">
  23. {
  24. ({ open }) => (
  25. <>
  26. <Menu.Button className={`flex items-center justify-center h-7 rounded-md hover:bg-gray-50 ${open && 'bg-gray-50'} cursor-pointer`}>
  27. <NotionIcon
  28. className='ml-1 mr-2'
  29. src={currentWorkspace?.workspace_icon}
  30. name={currentWorkspace?.workspace_name}
  31. />
  32. <div className='mr-1 w-[90px] text-left text-sm font-medium text-gray-700 truncate' title={currentWorkspace?.workspace_name}>{currentWorkspace?.workspace_name}</div>
  33. <div className='mr-1 px-1 h-[18px] bg-primary-50 rounded-lg text-xs font-medium text-primary-600'>{currentWorkspace?.pages.length}</div>
  34. <div className={cn(s['down-arrow'], 'mr-2 w-3 h-3')} />
  35. </Menu.Button>
  36. <Transition
  37. as={Fragment}
  38. enter="transition ease-out duration-100"
  39. enterFrom="transform opacity-0 scale-95"
  40. enterTo="transform opacity-100 scale-100"
  41. leave="transition ease-in duration-75"
  42. leaveFrom="transform opacity-100 scale-100"
  43. leaveTo="transform opacity-0 scale-95"
  44. >
  45. <Menu.Items
  46. className={cn(
  47. s.popup,
  48. `absolute left-0 top-8 w-80
  49. origin-top-right rounded-lg bg-white
  50. border-[0.5px] border-gray-200`,
  51. )}
  52. >
  53. <div className="p-1 max-h-50 overflow-auto">
  54. {
  55. items.map(item => (
  56. <Menu.Item key={item.workspace_id}>
  57. <div
  58. className='flex items-center px-3 h-9 hover:bg-gray-50 cursor-pointer'
  59. onClick={() => onSelect(item.workspace_id)}
  60. >
  61. <NotionIcon
  62. className='shrink-0 mr-2'
  63. src={item.workspace_icon}
  64. name={item.workspace_name}
  65. />
  66. <div className='grow mr-2 text-sm text-gray-700 truncate' title={item.workspace_name}>{item.workspace_name}</div>
  67. <div className='shrink-0 text-xs font-medium text-primary-600'>
  68. {item.pages.length} {t('common.dataSource.notion.selector.pageSelected')}
  69. </div>
  70. </div>
  71. </Menu.Item>
  72. ))
  73. }
  74. </div>
  75. </Menu.Items>
  76. </Transition>
  77. </>
  78. )
  79. }
  80. </Menu>
  81. )
  82. }