From 1cef206c13013f90a0811a9c221189bdcae33eb9 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Sun, 1 Dec 2024 21:09:13 +0800 Subject: [PATCH] Fix share page feedback auth (#3284) * fix: share page mark auth * perf: lang check * perf: load share --- packages/global/core/chat/api.d.ts | 8 +++--- .../ChatBox/components/FeedbackModal.tsx | 18 ++++--------- .../core/chat/ChatContainer/ChatBox/index.tsx | 26 ++++-------------- .../Publish/Link/SelectUsingWayModal.tsx | 10 +++---- projects/app/src/pages/chat/share.tsx | 27 +++++++++---------- projects/app/src/web/common/utils/i18n.ts | 3 ++- .../core/chat/context/chatRecordContext.tsx | 23 ++++++---------- 7 files changed, 39 insertions(+), 76 deletions(-) diff --git a/packages/global/core/chat/api.d.ts b/packages/global/core/chat/api.d.ts index 4646d9083..f40fa5986 100644 --- a/packages/global/core/chat/api.d.ts +++ b/packages/global/core/chat/api.d.ts @@ -1,11 +1,9 @@ -export type UpdateChatFeedbackProps = { +import { OutLinkChatAuthProps } from '../../support/permission/chat'; + +export type UpdateChatFeedbackProps = OutLinkChatAuthProps & { appId: string; chatId: string; dataId: string; - shareId?: string; - teamId?: string; - teamToken?: string; - outLinkUid?: string; userBadFeedback?: string; userGoodFeedback?: string; }; diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/FeedbackModal.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/FeedbackModal.tsx index f62ffd403..294dbfc8e 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/FeedbackModal.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/FeedbackModal.tsx @@ -4,30 +4,25 @@ import MyModal from '@fastgpt/web/components/common/MyModal'; import { useRequest } from '@fastgpt/web/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import { updateChatUserFeedback } from '@/web/core/chat/api'; +import { useContextSelector } from 'use-context-selector'; +import { ChatBoxContext } from '../Provider'; const FeedbackModal = ({ appId, chatId, dataId, - teamId, - teamToken, - shareId, - outLinkUid, onSuccess, onClose }: { appId: string; chatId: string; dataId: string; - shareId?: string; - teamId?: string; - teamToken?: string; - outLinkUid?: string; onSuccess: (e: string) => void; onClose: () => void; }) => { const ref = useRef(null); const { t } = useTranslation(); + const outLinkAuthData = useContextSelector(ChatBoxContext, (v) => v.outLinkAuthData); const { mutate, isLoading } = useRequest({ mutationFn: async () => { @@ -36,11 +31,8 @@ const FeedbackModal = ({ appId, chatId, dataId, - shareId, - teamId, - teamToken, - outLinkUid, - userBadFeedback: val + userBadFeedback: val, + ...outLinkAuthData }); }, onSuccess() { diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx index e1d379e5a..405808887 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx @@ -137,10 +137,6 @@ const ChatBox = ({ const chatRecords = useContextSelector(ChatRecordContext, (v) => v.chatRecords); const setChatRecords = useContextSelector(ChatRecordContext, (v) => v.setChatRecords); const isChatRecordsLoaded = useContextSelector(ChatRecordContext, (v) => v.isChatRecordsLoaded); - const setIsChatRecordsLoaded = useContextSelector( - ChatRecordContext, - (v) => v.setIsChatRecordsLoaded - ); const ScrollData = useContextSelector(ChatRecordContext, (v) => v.ScrollData); const appId = useContextSelector(ChatBoxContext, (v) => v.appId); @@ -687,12 +683,9 @@ const ChatBox = ({ updateChatUserFeedback({ appId, chatId, - teamId, - teamToken, dataId: chat.dataId, - shareId, - outLinkUid, - userGoodFeedback: isGoodFeedback ? undefined : 'yes' + userGoodFeedback: isGoodFeedback ? undefined : 'yes', + ...outLinkAuthData }); } catch (error) {} }; @@ -708,11 +701,10 @@ const ChatBox = ({ ); updateChatUserFeedback({ appId, - teamId, - teamToken, chatId, dataId: chat.dataId, - userGoodFeedback: undefined + userGoodFeedback: undefined, + ...outLinkAuthData }); }; }); @@ -737,10 +729,7 @@ const ChatBox = ({ appId, chatId, dataId: chat.dataId, - shareId, - teamId, - teamToken, - outLinkUid + ...outLinkAuthData }); } catch (error) {} }; @@ -864,7 +853,6 @@ const ChatBox = ({ abortRequest(); setChatRecords([]); - setIsChatRecordsLoaded(false); setValue('chatStarted', false); }, scrollToBottom(behavior = 'auto') { @@ -1040,12 +1028,8 @@ const ChatBox = ({ {!!feedbackId && chatId && ( setFeedbackId(undefined)} onSuccess={(content: string) => { setChatRecords((state) => diff --git a/projects/app/src/pages/app/detail/components/Publish/Link/SelectUsingWayModal.tsx b/projects/app/src/pages/app/detail/components/Publish/Link/SelectUsingWayModal.tsx index b3d11fe2a..1fad9055f 100644 --- a/projects/app/src/pages/app/detail/components/Publish/Link/SelectUsingWayModal.tsx +++ b/projects/app/src/pages/app/detail/components/Publish/Link/SelectUsingWayModal.tsx @@ -50,8 +50,8 @@ const SelectUsingWayModal = ({ share, onClose }: { share: OutLinkSchema; onClose defaultValues: { usingWay: UsingWayEnum.link, showHistory: true, - scriptIconCanDrag: true, - scriptDefaultOpen: true, + scriptIconCanDrag: false, + scriptDefaultOpen: false, scriptOpenIcon: 'data:image/svg+xml;base64,PHN2ZyB0PSIxNjkwNTMyNzg1NjY0IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQxMzIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNNTEyIDMyQzI0Ny4wNCAzMiAzMiAyMjQgMzIgNDY0QTQxMC4yNCA0MTAuMjQgMCAwIDAgMTcyLjQ4IDc2OEwxNjAgOTY1LjEyYTI1LjI4IDI1LjI4IDAgMCAwIDM5LjA0IDIyLjRsMTY4LTExMkE1MjguNjQgNTI4LjY0IDAgMCAwIDUxMiA4OTZjMjY0Ljk2IDAgNDgwLTE5MiA0ODAtNDMyUzc3Ni45NiAzMiA1MTIgMzJ6IG0yNDQuOCA0MTZsLTM2MS42IDMwMS43NmExMi40OCAxMi40OCAwIDAgMS0xOS44NC0xMi40OGw1OS4yLTIzMy45MmgtMTYwYTEyLjQ4IDEyLjQ4IDAgMCAxLTcuMzYtMjMuMzZsMzYxLjYtMzAxLjc2YTEyLjQ4IDEyLjQ4IDAgMCAxIDE5Ljg0IDEyLjQ4bC01OS4yIDIzMy45MmgxNjBhMTIuNDggMTIuNDggMCAwIDEgOCAyMi4wOHoiIGZpbGw9IiM0ZTgzZmQiIHAtaWQ9IjQxMzMiPjwvcGF0aD48L3N2Zz4=', scriptCloseIcon: @@ -96,6 +96,7 @@ const SelectUsingWayModal = ({ share, onClose }: { share: OutLinkSchema; onClose [UsingWayEnum.script]: { blockTitle: t('common:core.app.outLink.Script block title'), code: ` -` +>` } }; diff --git a/projects/app/src/pages/chat/share.tsx b/projects/app/src/pages/chat/share.tsx index aa63964bb..f7d7ec04a 100644 --- a/projects/app/src/pages/chat/share.tsx +++ b/projects/app/src/pages/chat/share.tsx @@ -84,10 +84,11 @@ const OutLink = (props: Props) => { const chatRecords = useContextSelector(ChatRecordContext, (v) => v.chatRecords); const totalRecordsCount = useContextSelector(ChatRecordContext, (v) => v.totalRecordsCount); + const isChatRecordsLoaded = useContextSelector(ChatRecordContext, (v) => v.isChatRecordsLoaded); const initSign = useRef(false); const [chatData, setChatData] = useState(defaultChatData); - const { loading: isLoading } = useRequest2( + const { data, loading: isLoading } = useRequest2( async () => { const shareId = outLinkAuthData.shareId; const outLinkUid = outLinkAuthData.outLinkUid; @@ -104,19 +105,12 @@ const OutLink = (props: Props) => { resetVariables({ variables: res.variables }); + + return res; }, { manual: false, refreshDeps: [shareId, outLinkAuthData, chatId], - onSuccess() { - // send init message - if (!initSign.current) { - initSign.current = true; - if (window !== top) { - window.top?.postMessage({ type: 'shareChatReady' }, '*'); - } - } - }, onError(e: any) { if (chatId) { onChangeChatId(''); @@ -127,6 +121,14 @@ const OutLink = (props: Props) => { } } ); + useEffect(() => { + if (initSign.current === false && data && isChatRecordsLoaded) { + initSign.current = true; + if (window !== top) { + window.top?.postMessage({ type: 'shareChatReady' }, '*'); + } + } + }, [data, isChatRecordsLoaded]); const startChat = useCallback( async ({ @@ -295,8 +297,6 @@ const Render = (props: Props) => { const { localUId, loaded } = useShareChatStore(); const { source, chatId, setSource, setAppId, setOutLinkAuthData } = useChatStore(); - const [isLoaded, setIsLoaded] = useState(false); - const chatHistoryProviderParams = useMemo(() => { return { shareId, outLinkUid: authToken || customUid || localUId }; }, [authToken, customUid, localUId, shareId]); @@ -311,11 +311,8 @@ const Render = (props: Props) => { }, [appId, chatHistoryProviderParams.outLinkUid, chatId, shareId]); useMount(() => { - setIsLoaded(true); - setSource('share'); }); - const systemLoaded = isLoaded && loaded && chatHistoryProviderParams.outLinkUid; // Set outLinkAuthData useEffect(() => { diff --git a/projects/app/src/web/common/utils/i18n.ts b/projects/app/src/web/common/utils/i18n.ts index 2986ac6fa..9d611fc48 100644 --- a/projects/app/src/web/common/utils/i18n.ts +++ b/projects/app/src/web/common/utils/i18n.ts @@ -22,5 +22,6 @@ export const langMap = { }; export const serviceSideProps = (content: any, ns: I18nNsType = []) => { - return serverSideTranslations(content.locale, ['common', 'error', ...ns], null, content.locales); + const lang = content.req?.cookies?.NEXT_LOCALE || content.locale; + return serverSideTranslations(lang, ['common', 'error', ...ns], null, content.locales); }; diff --git a/projects/app/src/web/core/chat/context/chatRecordContext.tsx b/projects/app/src/web/core/chat/context/chatRecordContext.tsx index 0e98a92fd..0e1a05a17 100644 --- a/projects/app/src/web/core/chat/context/chatRecordContext.tsx +++ b/projects/app/src/web/core/chat/context/chatRecordContext.tsx @@ -2,7 +2,7 @@ import { getPaginationRecordsBody } from '@/pages/api/core/chat/getPaginationRec import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; import { PaginationResponse } from '@fastgpt/web/common/fetch/type'; import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; -import React, { ReactNode, useMemo, useState } from 'react'; +import React, { ReactNode, useEffect, useMemo, useState } from 'react'; import { createContext, useContextSelector } from 'use-context-selector'; import { ChatItemContext } from './chatItemContext'; import { getChatRecords } from '../api'; @@ -14,7 +14,6 @@ type ChatRecordContextType = { chatRecords: ChatSiteItemType[]; setChatRecords: React.Dispatch>; isChatRecordsLoaded: boolean; - setIsChatRecordsLoaded: React.Dispatch>; totalRecordsCount: number; ScrollData: ({ children, @@ -31,9 +30,7 @@ export const ChatRecordContext = createContext({ throw new Error('Function not implemented.'); }, isChatRecordsLoaded: false, - setIsChatRecordsLoaded: function (value: React.SetStateAction): void { - throw new Error('Function not implemented.'); - }, + totalRecordsCount: 0, ScrollData: function ({ children, @@ -59,6 +56,10 @@ const ChatRecordContextProvider = ({ const ChatBoxRef = useContextSelector(ChatItemContext, (v) => v.ChatBoxRef); const [isChatRecordsLoaded, setIsChatRecordsLoaded] = useState(false); + useEffect(() => { + setIsChatRecordsLoaded(false); + }, [params]); + const { data: chatRecords, ScrollData, @@ -104,17 +105,9 @@ const ChatRecordContextProvider = ({ setChatRecords, totalRecordsCount, ScrollData, - isChatRecordsLoaded, - setIsChatRecordsLoaded + isChatRecordsLoaded }; - }, [ - ScrollData, - chatRecords, - setChatRecords, - totalRecordsCount, - isChatRecordsLoaded, - setIsChatRecordsLoaded - ]); + }, [ScrollData, chatRecords, setChatRecords, totalRecordsCount, isChatRecordsLoaded]); return {children}; };