|
import CopyToClipboard from '@/components/copy-to-clipboard'; |
|
import HightLightMarkdown from '@/components/highlight-markdown'; |
|
import { SharedFrom } from '@/constants/chat'; |
|
import { useTranslate } from '@/hooks/common-hooks'; |
|
import { IModalProps } from '@/interfaces/common'; |
|
import { |
|
Card, |
|
Checkbox, |
|
Form, |
|
Modal, |
|
Select, |
|
Tabs, |
|
TabsProps, |
|
Typography, |
|
} from 'antd'; |
|
import { useMemo, useState } from 'react'; |
|
|
|
import { useIsDarkTheme } from '@/components/theme-provider'; |
|
import { |
|
LanguageAbbreviation, |
|
LanguageAbbreviationMap, |
|
} from '@/constants/common'; |
|
import { cn } from '@/lib/utils'; |
|
import styles from './index.less'; |
|
|
|
const { Paragraph, Link } = Typography; |
|
|
|
const EmbedModal = ({ |
|
visible, |
|
hideModal, |
|
token = '', |
|
form, |
|
beta = '', |
|
isAgent, |
|
}: IModalProps<any> & { |
|
token: string; |
|
form: SharedFrom; |
|
beta: string; |
|
isAgent: boolean; |
|
}) => { |
|
const { t } = useTranslate('chat'); |
|
const isDarkTheme = useIsDarkTheme(); |
|
|
|
const [visibleAvatar, setVisibleAvatar] = useState(false); |
|
const [locale, setLocale] = useState(''); |
|
|
|
const languageOptions = useMemo(() => { |
|
return Object.values(LanguageAbbreviation).map((x) => ({ |
|
label: LanguageAbbreviationMap[x], |
|
value: x, |
|
})); |
|
}, []); |
|
|
|
const generateIframeSrc = () => { |
|
let src = `${location.origin}/chat/share?shared_id=${token}&from=${form}&auth=${beta}`; |
|
if (visibleAvatar) { |
|
src += '&visible_avatar=1'; |
|
} |
|
if (locale) { |
|
src += `&locale=${locale}`; |
|
} |
|
return src; |
|
}; |
|
|
|
const iframeSrc = generateIframeSrc(); |
|
|
|
const text = ` |
|
~~~ html |
|
<iframe |
|
src="${iframeSrc}" |
|
style="width: 100%; height: 100%; min-height: 600px" |
|
frameborder="0" |
|
> |
|
</iframe> |
|
~~~ |
|
`; |
|
|
|
const items: TabsProps['items'] = [ |
|
{ |
|
key: '1', |
|
label: t('fullScreenTitle'), |
|
children: ( |
|
<Card |
|
title={t('fullScreenDescription')} |
|
extra={<CopyToClipboard text={text}></CopyToClipboard>} |
|
className={styles.codeCard} |
|
> |
|
<div className="p-2"> |
|
<h2 className="mb-3">Option:</h2> |
|
|
|
<Form.Item |
|
label={t('avatarHidden')} |
|
labelCol={{ span: 6 }} |
|
wrapperCol={{ span: 18 }} |
|
> |
|
<Checkbox |
|
checked={visibleAvatar} |
|
onChange={(e) => setVisibleAvatar(e.target.checked)} |
|
></Checkbox> |
|
</Form.Item> |
|
<Form.Item |
|
label={t('locale')} |
|
labelCol={{ span: 6 }} |
|
wrapperCol={{ span: 18 }} |
|
> |
|
<Select |
|
placeholder="Select a locale" |
|
onChange={(value) => setLocale(value)} |
|
options={languageOptions} |
|
style={{ width: '100%' }} |
|
/> |
|
</Form.Item> |
|
</div> |
|
<HightLightMarkdown>{text}</HightLightMarkdown> |
|
</Card> |
|
), |
|
}, |
|
{ |
|
key: '2', |
|
label: t('partialTitle'), |
|
children: t('comingSoon'), |
|
}, |
|
{ |
|
key: '3', |
|
label: t('extensionTitle'), |
|
children: t('comingSoon'), |
|
}, |
|
]; |
|
|
|
const onChange = (key: string) => { |
|
console.log(key); |
|
}; |
|
|
|
return ( |
|
<Modal |
|
title={t('embedIntoSite', { keyPrefix: 'common' })} |
|
open={visible} |
|
style={{ top: 300 }} |
|
width={'50vw'} |
|
onOk={hideModal} |
|
onCancel={hideModal} |
|
> |
|
<Tabs defaultActiveKey="1" items={items} onChange={onChange} /> |
|
<div className="text-base font-medium mt-4 mb-1"> |
|
{t(isAgent ? 'flow' : 'chat', { keyPrefix: 'header' })} |
|
<span className="ml-1 inline-block">ID</span> |
|
</div> |
|
<Paragraph |
|
copyable={{ text: token }} |
|
className={cn(styles.id, { |
|
[styles.darkId]: isDarkTheme, |
|
})} |
|
> |
|
{token} |
|
</Paragraph> |
|
<Link |
|
href={ |
|
isAgent |
|
? 'https://ragflow.io/docs/dev/http_api_reference#create-session-with-agent' |
|
: 'https://ragflow.io/docs/dev/http_api_reference#create-session-with-chat-assistant' |
|
} |
|
target="_blank" |
|
> |
|
{t('howUseId', { keyPrefix: isAgent ? 'flow' : 'chat' })} |
|
</Link> |
|
</Modal> |
|
); |
|
}; |
|
|
|
export default EmbedModal; |
|
|