| @@ -45,6 +45,7 @@ export type AppPublisherProps = { | |||
| multipleModelConfigs?: ModelAndParameter[] | |||
| /** modelAndParameter is passed when debugWithMultipleModel is true */ | |||
| onPublish?: (params?: any) => Promise<any> | any | |||
| onRestore?: () => Promise<any> | any | |||
| onToggle?: (state: boolean) => void | |||
| crossAxisOffset?: number | |||
| toolPublished?: boolean | |||
| @@ -62,6 +63,7 @@ const AppPublisher = ({ | |||
| debugWithMultipleModel = false, | |||
| multipleModelConfigs = [], | |||
| onPublish, | |||
| onRestore, | |||
| onToggle, | |||
| crossAxisOffset = 0, | |||
| toolPublished, | |||
| @@ -76,13 +78,14 @@ const AppPublisher = ({ | |||
| const { app_base_url: appBaseURL = '', access_token: accessToken = '' } = appDetail?.site ?? {} | |||
| const appMode = (appDetail?.mode !== 'completion' && appDetail?.mode !== 'workflow') ? 'chat' : appDetail.mode | |||
| const appURL = `${appBaseURL}/${appMode}/${accessToken}` | |||
| const isChatApp = ['chat', 'agent-chat', 'completion'].includes(appDetail?.mode || '') | |||
| const language = useGetLanguage() | |||
| const formatTimeFromNow = useCallback((time: number) => { | |||
| return dayjs(time).locale(language === 'zh_Hans' ? 'zh-cn' : language.replace('_', '-')).fromNow() | |||
| }, [language]) | |||
| const handlePublish = async (params?: ModelAndParameter | PublishWorkflowParams) => { | |||
| const handlePublish = useCallback(async (params?: ModelAndParameter | PublishWorkflowParams) => { | |||
| try { | |||
| await onPublish?.(params) | |||
| setPublished(true) | |||
| @@ -90,7 +93,15 @@ const AppPublisher = ({ | |||
| catch { | |||
| setPublished(false) | |||
| } | |||
| } | |||
| }, [onPublish]) | |||
| const handleRestore = useCallback(async () => { | |||
| try { | |||
| await onRestore?.() | |||
| setOpen(false) | |||
| } | |||
| catch {} | |||
| }, [onRestore]) | |||
| const handleTrigger = useCallback(() => { | |||
| const state = !open | |||
| @@ -122,20 +133,27 @@ const AppPublisher = ({ | |||
| const [embeddingModalOpen, setEmbeddingModalOpen] = useState(false) | |||
| const openPublishModal = () => { | |||
| const openPublishModal = useCallback(() => { | |||
| setOpen(false) | |||
| setPublishModalOpen(true) | |||
| } | |||
| }, []) | |||
| const closePublishModal = () => { | |||
| const closePublishModal = useCallback(() => { | |||
| setPublishModalOpen(false) | |||
| } | |||
| }, []) | |||
| const onClickPublishBtn = useCallback(() => { | |||
| if (isChatApp) | |||
| handlePublish() | |||
| else | |||
| openPublishModal() | |||
| }, [isChatApp, handlePublish, openPublishModal]) | |||
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.shift.p`, (e) => { | |||
| e.preventDefault() | |||
| if (publishDisabled || published) | |||
| return | |||
| openPublishModal() | |||
| onClickPublishBtn() | |||
| } | |||
| , { exactMatch: true, useCapture: true }) | |||
| @@ -168,8 +186,18 @@ const AppPublisher = ({ | |||
| </div> | |||
| {publishedAt | |||
| ? ( | |||
| <div className='flex items-center system-sm-medium text-text-secondary'> | |||
| {t('workflow.common.publishedAt')} {formatTimeFromNow(publishedAt)} | |||
| <div className='flex justify-between items-center'> | |||
| <div className='flex items-center system-sm-medium text-text-secondary'> | |||
| {t('workflow.common.publishedAt')} {formatTimeFromNow(publishedAt)} | |||
| </div> | |||
| {isChatApp && <Button | |||
| variant='secondary-accent' | |||
| size='small' | |||
| onClick={handleRestore} | |||
| disabled={published} | |||
| > | |||
| {t('workflow.common.restore')} | |||
| </Button>} | |||
| </div> | |||
| ) | |||
| : ( | |||
| @@ -189,7 +217,7 @@ const AppPublisher = ({ | |||
| <Button | |||
| variant='primary' | |||
| className='w-full mt-3' | |||
| onClick={openPublishModal} | |||
| onClick={onClickPublishBtn} | |||
| disabled={publishDisabled || published} | |||
| > | |||
| { | |||