From 5423d7540eff8c413d4da69212eaf49d984c0114 Mon Sep 17 00:00:00 2001 From: Joel Date: Thu, 16 Apr 2026 18:21:05 +0800 Subject: [PATCH] fix: value change --- .../embedded/__tests__/index.spec.tsx | 8 +- .../app/overview/embedded/index.tsx | 128 ++++++++++++------ 2 files changed, 96 insertions(+), 40 deletions(-) diff --git a/web/app/components/app/overview/embedded/__tests__/index.spec.tsx b/web/app/components/app/overview/embedded/__tests__/index.spec.tsx index 3e43bed5bd..d7fa6f4db8 100644 --- a/web/app/components/app/overview/embedded/__tests__/index.spec.tsx +++ b/web/app/components/app/overview/embedded/__tests__/index.spec.tsx @@ -167,10 +167,14 @@ describe('Embedded', () => { expect(screen.getByLabelText('Secret')).toBeInTheDocument() }) - fireEvent.change(screen.getByLabelText('Secret'), { - target: { value: 'top-secret' }, + await act(async () => { + fireEvent.change(screen.getByLabelText('Secret'), { + target: { value: 'top-secret' }, + }) }) + expect(document.querySelector('pre')?.textContent ?? '').toContain('/chatbot/token') + await waitFor(() => { const codeBlock = document.querySelector('pre') expect(codeBlock?.textContent ?? '').toContain('/chatbot/token?secret=dG9wLXNlY3JldA%3D%3D') diff --git a/web/app/components/app/overview/embedded/index.tsx b/web/app/components/app/overview/embedded/index.tsx index 66fb8a0255..7d7e29bc7b 100644 --- a/web/app/components/app/overview/embedded/index.tsx +++ b/web/app/components/app/overview/embedded/index.tsx @@ -1,3 +1,4 @@ +import type { MutableRefObject } from 'react' import type { WorkflowHiddenStartVariable, WorkflowLaunchInputValue } from '../app-card-utils' import type { SiteInfo } from '@/models/share' import { cn } from '@langgenius/dify-ui/cn' @@ -8,7 +9,7 @@ import { RiClipboardLine, } from '@remixicon/react' import copy from 'copy-to-clipboard' -import { Suspense, use, useEffect, useMemo, useState } from 'react' +import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import { useThemeContext } from '@/app/components/base/chat/embedded-chatbot/theme/theme-context' @@ -55,14 +56,48 @@ const EMPTY_OPTION_STATUS: OptionStatus = { chromePlugin: false, } +const getSerializedHiddenInputValue = ( + variable: WorkflowHiddenStartVariable, + values: Record, +) => { + const rawValue = values[variable.variable] + if (variable.type === InputVarType.checkbox) + return String(Boolean(rawValue)) + + return String(rawValue ?? '') +} + +const buildEmbeddedIframeUrl = async ({ + appBaseUrl, + accessToken, + variables, + values, +}: { + appBaseUrl: string + accessToken: string + variables: WorkflowHiddenStartVariable[] + values: Record +}) => { + const iframeUrl = new URL(`${appBaseUrl}${basePath}/chatbot/${accessToken}`, window.location.origin) + + await Promise.all(variables.map(async (variable) => { + iframeUrl.searchParams.set(variable.variable, await compressAndEncodeBase64(getSerializedHiddenInputValue(variable, values))) + })) + + return iframeUrl.toString() +} + const AsyncEmbeddedOptionContent = ({ option, iframeUrlPromise, + latestResolvedIframeUrlRef, }: { option: Option iframeUrlPromise: Promise + latestResolvedIframeUrlRef: MutableRefObject }) => { const iframeUrl = use(iframeUrlPromise) + latestResolvedIframeUrlRef.current = iframeUrl if (option === 'chromePlugin') return getChromePluginContent(iframeUrl) @@ -77,48 +112,49 @@ const EmbeddedContent = ({ hiddenInputs, }: Required> & Pick) => { const { t } = useTranslation() - const [option, setOption] = useState