dify-run
/
web
/app
/components
/header
/account-setting
/data-source-page
/data-source-notion
/index.tsx
| 'use client' | |
| import type { FC } from 'react' | |
| import React, { useEffect, useState } from 'react' | |
| import useSWR from 'swr' | |
| import Panel from '../panel' | |
| import { DataSourceType } from '../panel/types' | |
| import type { DataSourceNotion as TDataSourceNotion } from '@/models/common' | |
| import { useAppContext } from '@/context/app-context' | |
| import { fetchNotionConnection } from '@/service/common' | |
| import NotionIcon from '@/app/components/base/notion-icon' | |
| const Icon: FC<{ | |
| src: string | |
| name: string | |
| className: string | |
| }> = ({ src, name, className }) => { | |
| return ( | |
| <NotionIcon | |
| src={src} | |
| name={name} | |
| className={className} | |
| /> | |
| ) | |
| } | |
| type Props = { | |
| workspaces: TDataSourceNotion[] | |
| } | |
| const DataSourceNotion: FC<Props> = ({ | |
| workspaces, | |
| }) => { | |
| const { isCurrentWorkspaceManager } = useAppContext() | |
| const [canConnectNotion, setCanConnectNotion] = useState(false) | |
| const { data } = useSWR(canConnectNotion ? '/oauth/data-source/notion' : null, fetchNotionConnection) | |
| const connected = !!workspaces.length | |
| const handleConnectNotion = () => { | |
| if (!isCurrentWorkspaceManager) | |
| return | |
| setCanConnectNotion(true) | |
| } | |
| const handleAuthAgain = () => { | |
| if (data?.data) | |
| window.location.href = data.data | |
| else | |
| setCanConnectNotion(true) | |
| } | |
| useEffect(() => { | |
| if (data?.data) | |
| window.location.href = data.data | |
| }, [data]) | |
| return ( | |
| <Panel | |
| type={DataSourceType.notion} | |
| isConfigured={connected} | |
| onConfigure={handleConnectNotion} | |
| readOnly={!isCurrentWorkspaceManager} | |
| isSupportList | |
| configuredList={workspaces.map(workspace => ({ | |
| id: workspace.id, | |
| logo: ({ className }: { className: string }) => ( | |
| <Icon | |
| src={workspace.source_info.workspace_icon!} | |
| name={workspace.source_info.workspace_name} | |
| className={className} | |
| />), | |
| name: workspace.source_info.workspace_name, | |
| isActive: workspace.is_bound, | |
| notionConfig: { | |
| total: workspace.source_info.total || 0, | |
| }, | |
| }))} | |
| onRemove={() => { }} // handled in operation/index.tsx | |
| notionActions={{ | |
| onChangeAuthorizedPage: handleAuthAgain, | |
| }} | |
| /> | |
| ) | |
| } | |
| export default React.memo(DataSourceNotion) | |