diff --git a/web/app/(humanInputLayout)/form/[token]/form.tsx b/web/app/(humanInputLayout)/form/[token]/form.tsx index 55292af07f..5587e13b0f 100644 --- a/web/app/(humanInputLayout)/form/[token]/form.tsx +++ b/web/app/(humanInputLayout)/form/[token]/form.tsx @@ -1,5 +1,5 @@ 'use client' -import React from 'react' +import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import useDocumentTitle from '@/hooks/use-document-title' import { useParams } from 'next/navigation' @@ -7,30 +7,40 @@ import { RiCheckboxCircleFill, RiInformation2Fill, } from '@remixicon/react' +import Loading from '@/app/components/base/loading' import AppIcon from '@/app/components/base/app-icon' import { Markdown } from '@/app/components/base/markdown' -import Button, { } from '@/app/components/base/button' +import Button from '@/app/components/base/button' import DifyLogo from '@/app/components/base/logo/dify-logo' import { UserActionButtonType } from '@/app/components/workflow/nodes/human-input/types' - +import type { FormInputItem, UserAction } from '@/app/components/workflow/nodes/human-input/types' +import { getHumanInputForm, submitHumanInputForm } from '@/service/share' import cn from '@/utils/classnames' -import { MOCK_DATA } from './mock' - -const success = true - -const expired = true - -const submitted = true +export type FormData = { + site: any + form_content: string + inputs: FormInputItem[] + user_actions: UserAction[] + timeout: number + timeout_unit: 'hour' | 'day' +} const FormContent = () => { const { t } = useTranslation() - const { token } = useParams() + const { token } = useParams<{ token: string }>() useDocumentTitle('') - const { site } = MOCK_DATA.site - const { form_content, user_actions, timeout, timeout_unit } = MOCK_DATA + const [isLoading, setIsLoading] = useState(true) + const [isSubmitting, setIsSubmitting] = useState(false) + const [formData, setFormData] = useState() + const [inputs, setInputs] = useState({}) + const [success, setSuccess] = useState(false) + const [expired, setExpired] = useState(false) + const [submitted, setSubmitted] = useState(false) + + const site = formData?.site.site const getButtonStyle = (style: UserActionButtonType) => { if (style === UserActionButtonType.Primary) @@ -43,6 +53,43 @@ const FormContent = () => { return 'ghost' } + const getForm = async (token: string) => { + try { + const data = await getHumanInputForm(token) + setFormData(data) + setIsLoading(false) + } + catch (error) { + console.error(error) + } + } + + const submit = async (actionID: string) => { + setIsSubmitting(true) + try { + await submitHumanInputForm(token, { inputs, action: actionID }) + setSuccess(true) + } + catch (error) { + console.error(error) + setExpired(true) + setSubmitted(true) + } + finally { + setIsSubmitting(false) + } + } + + useEffect(() => { + getForm(token) + }, [token]) + + if (isLoading || !formData) { + return ( + + ) + } + if (success) { return (
@@ -138,16 +185,21 @@ const FormContent = () => {
- +
- {user_actions.map((action: any) => ( - ))}
- {timeout_unit === 'day' ? t('share.humanInput.timeoutDay', { count: timeout }) : t('share.humanInput.timeoutHour', { count: timeout })} + {formData.timeout_unit === 'day' ? t('share.humanInput.timeoutDay', { count: formData.timeout }) : t('share.humanInput.timeoutHour', { count: formData.timeout })}