Merge pull request #5640 from code-october/feature/enableCodeFold

支持前端使能/禁用代码折叠
This commit is contained in:
Dogtiti 2024-10-11 20:43:43 +08:00 committed by GitHub
commit d18bd8a48a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 64 additions and 8 deletions

View File

@ -169,6 +169,12 @@ export function PreCode(props: { children: any }) {
} }
function CustomCode(props: { children: any; className?: string }) { function CustomCode(props: { children: any; className?: string }) {
const chatStore = useChatStore();
const session = chatStore.currentSession();
const config = useAppConfig();
const enableCodeFold =
session.mask?.enableCodeFold !== false && config.enableCodeFold;
const ref = useRef<HTMLPreElement>(null); const ref = useRef<HTMLPreElement>(null);
const [collapsed, setCollapsed] = useState(true); const [collapsed, setCollapsed] = useState(true);
const [showToggle, setShowToggle] = useState(false); const [showToggle, setShowToggle] = useState(false);
@ -184,25 +190,30 @@ function CustomCode(props: { children: any; className?: string }) {
const toggleCollapsed = () => { const toggleCollapsed = () => {
setCollapsed((collapsed) => !collapsed); setCollapsed((collapsed) => !collapsed);
}; };
const renderShowMoreButton = () => {
if (showToggle && enableCodeFold && collapsed) {
return (
<div className={`show-hide-button ${collapsed ? "collapsed" : "expanded"}`}>
<button onClick={toggleCollapsed}>{Locale.NewChat.More}</button>
</div>
);
}
return null;
};
return ( return (
<> <>
<code <code
className={props?.className} className={props?.className}
ref={ref} ref={ref}
style={{ style={{
maxHeight: collapsed ? "400px" : "none", maxHeight: enableCodeFold && collapsed ? "400px" : "none",
overflowY: "hidden", overflowY: "hidden",
}} }}
> >
{props.children} {props.children}
</code> </code>
{showToggle && collapsed && (
<div {renderShowMoreButton()}
className={`show-hide-button ${collapsed ? "collapsed" : "expanded"}`}
>
<button onClick={toggleCollapsed}>{Locale.NewChat.More}</button>
</div>
)}
</> </>
); );
} }

View File

@ -183,6 +183,23 @@ export function MaskConfig(props: {
></input> ></input>
</ListItem> </ListItem>
)} )}
{globalConfig.enableCodeFold && (
<ListItem
title={Locale.Mask.Config.CodeFold.Title}
subTitle={Locale.Mask.Config.CodeFold.SubTitle}
>
<input
aria-label={Locale.Mask.Config.CodeFold.Title}
type="checkbox"
checked={props.mask.enableCodeFold !== false}
onChange={(e) => {
props.updateMask((mask) => {
mask.enableCodeFold = e.currentTarget.checked;
});
}}
></input>
</ListItem>
)}
{!props.shouldSyncFromGlobal ? ( {!props.shouldSyncFromGlobal ? (
<ListItem <ListItem

View File

@ -1509,6 +1509,22 @@ export function Settings() {
} }
></input> ></input>
</ListItem> </ListItem>
<ListItem
title={Locale.Mask.Config.CodeFold.Title}
subTitle={Locale.Mask.Config.CodeFold.SubTitle}
>
<input
aria-label={Locale.Mask.Config.CodeFold.Title}
type="checkbox"
checked={config.enableCodeFold}
data-testid="enable-code-fold-checkbox"
onChange={(e) =>
updateConfig(
(config) => (config.enableCodeFold = e.currentTarget.checked),
)
}
></input>
</ListItem>
</List> </List>
<SyncItems /> <SyncItems />

View File

@ -665,6 +665,10 @@ const cn = {
Title: "启用Artifacts", Title: "启用Artifacts",
SubTitle: "启用之后可以直接渲染HTML页面", SubTitle: "启用之后可以直接渲染HTML页面",
}, },
CodeFold: {
Title: "启用代码折叠",
SubTitle: "启用之后可以自动折叠/展开过长的代码块",
},
Share: { Share: {
Title: "分享此面具", Title: "分享此面具",
SubTitle: "生成此面具的直达链接", SubTitle: "生成此面具的直达链接",

View File

@ -675,6 +675,11 @@ const en: LocaleType = {
Title: "Enable Artifacts", Title: "Enable Artifacts",
SubTitle: "Can render HTML page when enable artifacts.", SubTitle: "Can render HTML page when enable artifacts.",
}, },
CodeFold: {
Title: "Enable CodeFold",
SubTitle:
"Automatically collapse/expand overly long code blocks when CodeFold is enabled",
},
Share: { Share: {
Title: "Share This Mask", Title: "Share This Mask",
SubTitle: "Generate a link to this mask", SubTitle: "Generate a link to this mask",

View File

@ -52,6 +52,8 @@ export const DEFAULT_CONFIG = {
enableArtifacts: true, // show artifacts config enableArtifacts: true, // show artifacts config
enableCodeFold: true, // code fold config
disablePromptHint: false, disablePromptHint: false,
dontShowMaskSplashScreen: false, // dont show splash screen when create chat dontShowMaskSplashScreen: false, // dont show splash screen when create chat

View File

@ -19,6 +19,7 @@ export type Mask = {
builtin: boolean; builtin: boolean;
plugin?: string[]; plugin?: string[];
enableArtifacts?: boolean; enableArtifacts?: boolean;
enableCodeFold?: boolean;
}; };
export const DEFAULT_MASK_STATE = { export const DEFAULT_MASK_STATE = {