index.tsx 3.5 KB

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