Skip to content

Commit 28887c7

Browse files
authored
🐛 fix: add the preview publish to market button preview check (#12105)
feat: add the preview publish to market button preview check
1 parent 1cc9034 commit 28887c7

5 files changed

Lines changed: 113 additions & 16 deletions

File tree

locales/en-US/setting.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@
268268
"marketPublish.upload.button": "Publish New Version",
269269
"marketPublish.upload.tooltip": "Publish a new version to Agent Community",
270270
"marketPublish.uploadGroup.tooltip": "Publish a new version to Group Community",
271+
"marketPublish.validation.confirmPublish": "Are you sure you want to publish to the market?",
272+
"marketPublish.validation.emptyName": "Cannot publish: Name is required",
273+
"marketPublish.validation.emptySystemRole": "Cannot publish: System Role is required",
271274
"memory.enabled.desc": "Allow LobeHub to extract preferences and info from conversations and use them later. You can view, edit, or clear memory anytime.",
272275
"memory.enabled.title": "Enable Memory",
273276
"memory.title": "Memory Settings",

locales/zh-CN/setting.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@
268268
"marketPublish.upload.button": "发布新版本",
269269
"marketPublish.upload.tooltip": "发布新版本到助理社区",
270270
"marketPublish.uploadGroup.tooltip": "向群组社区发布新版本",
271+
"marketPublish.validation.confirmPublish": "确定要发布到市场吗?",
272+
"marketPublish.validation.emptyName": "无法发布:名称不能为空",
273+
"marketPublish.validation.emptySystemRole": "无法发布:系统角色不能为空",
271274
"memory.enabled.desc": "允许 LobeHub 从对话中提取偏好和信息,并在之后使用。您可以随时查看、编辑或清除记忆内容。",
272275
"memory.enabled.title": "启用记忆功能",
273276
"memory.title": "记忆设置",

src/app/[variants]/(main)/agent/profile/features/Header/AgentPublishButton/PublishButton.tsx

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { Button } from '@lobehub/ui';
22
import { ShapesUploadIcon } from '@lobehub/ui/icons';
3+
import { Popconfirm } from 'antd';
4+
import isEqual from 'fast-deep-equal';
35
import { memo, useCallback, useMemo, useState } from 'react';
46
import { useTranslation } from 'react-i18next';
57

68
import { message } from '@/components/AntdStaticMethods';
79
import { useMarketAuth } from '@/layout/AuthProvider/MarketAuth';
810
import { resolveMarketAuthError } from '@/layout/AuthProvider/MarketAuth/errors';
11+
import { useAgentStore } from '@/store/agent';
12+
import { agentSelectors } from '@/store/agent/selectors';
913

1014
import ForkConfirmModal from './ForkConfirmModal';
1115
import type { MarketPublishAction } from './types';
@@ -25,10 +29,17 @@ const PublishButton = memo<MarketPublishButtonProps>(({ action, onPublishSuccess
2529
onSuccess: onPublishSuccess,
2630
});
2731

32+
// Agent data for validation
33+
const meta = useAgentStore(agentSelectors.currentAgentMeta, isEqual);
34+
const systemRole = useAgentStore(agentSelectors.currentAgentSystemRole);
35+
2836
// Fork confirmation modal state
2937
const [showForkModal, setShowForkModal] = useState(false);
3038
const [originalAgentInfo, setOriginalAgentInfo] = useState<OriginalAgentInfo | null>(null);
3139

40+
// Publish confirmation popconfirm state
41+
const [confirmOpened, setConfirmOpened] = useState(false);
42+
3243
const buttonConfig = useMemo(() => {
3344
if (action === 'upload') {
3445
return {
@@ -60,7 +71,25 @@ const PublishButton = memo<MarketPublishButtonProps>(({ action, onPublishSuccess
6071
await publish();
6172
}, [checkOwnership, publish]);
6273

63-
const handleButtonClick = useCallback(async () => {
74+
const handleButtonClick = useCallback(() => {
75+
// Validate name and systemRole
76+
if (!meta?.title || meta.title.trim() === '') {
77+
message.error({ content: t('marketPublish.validation.emptyName') });
78+
return;
79+
}
80+
81+
if (!systemRole || systemRole.trim() === '') {
82+
message.error({ content: t('marketPublish.validation.emptySystemRole') });
83+
return;
84+
}
85+
86+
// Open popconfirm for user confirmation
87+
setConfirmOpened(true);
88+
}, [meta?.title, systemRole, t]);
89+
90+
const handleConfirmPublish = useCallback(async () => {
91+
setConfirmOpened(false);
92+
6493
if (!isAuthenticated) {
6594
try {
6695
await signIn();
@@ -98,14 +127,29 @@ const PublishButton = memo<MarketPublishButtonProps>(({ action, onPublishSuccess
98127

99128
return (
100129
<>
101-
<Button
102-
icon={ShapesUploadIcon}
103-
loading={loading}
104-
onClick={handleButtonClick}
105-
title={buttonTitle}
130+
<Popconfirm
131+
arrow={false}
132+
okButtonProps={{ type: 'primary' }}
133+
onCancel={() => setConfirmOpened(false)}
134+
onConfirm={handleConfirmPublish}
135+
onOpenChange={(open) => {
136+
if (!open) {
137+
setConfirmOpened(false);
138+
}
139+
}}
140+
open={confirmOpened}
141+
placement="bottomRight"
142+
title={t('marketPublish.validation.confirmPublish')}
106143
>
107-
{t('publishToCommunity')}
108-
</Button>
144+
<Button
145+
icon={ShapesUploadIcon}
146+
loading={loading}
147+
onClick={handleButtonClick}
148+
title={buttonTitle}
149+
>
150+
{t('publishToCommunity')}
151+
</Button>
152+
</Popconfirm>
109153
<ForkConfirmModal
110154
loading={isPublishing}
111155
onCancel={handleForkCancel}

src/app/[variants]/(main)/group/profile/features/Header/GroupPublishButton/PublishButton.tsx

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { Button } from '@lobehub/ui';
22
import { ShapesUploadIcon } from '@lobehub/ui/icons';
3+
import { Popconfirm } from 'antd';
4+
import isEqual from 'fast-deep-equal';
35
import { memo, useCallback, useMemo, useState } from 'react';
46
import { useTranslation } from 'react-i18next';
57

68
import { message } from '@/components/AntdStaticMethods';
79
import { useMarketAuth } from '@/layout/AuthProvider/MarketAuth';
810
import { resolveMarketAuthError } from '@/layout/AuthProvider/MarketAuth/errors';
11+
import { useAgentGroupStore } from '@/store/agentGroup';
12+
import { agentGroupSelectors } from '@/store/agentGroup/selectors';
913

1014
import GroupForkConfirmModal from './GroupForkConfirmModal';
1115
import type { MarketPublishAction, OriginalGroupInfo } from './types';
@@ -25,10 +29,17 @@ const PublishButton = memo<GroupPublishButtonProps>(({ action, onPublishSuccess
2529
onSuccess: onPublishSuccess,
2630
});
2731

32+
// Group data for validation
33+
const currentGroupMeta = useAgentGroupStore(agentGroupSelectors.currentGroupMeta, isEqual);
34+
const currentGroup = useAgentGroupStore(agentGroupSelectors.currentGroup);
35+
2836
// Fork confirmation modal state
2937
const [showForkModal, setShowForkModal] = useState(false);
3038
const [originalGroupInfo, setOriginalGroupInfo] = useState<OriginalGroupInfo | null>(null);
3139

40+
// Publish confirmation popconfirm state
41+
const [confirmOpened, setConfirmOpened] = useState(false);
42+
3243
const buttonConfig = useMemo(() => {
3344
if (action === 'upload') {
3445
return {
@@ -60,7 +71,25 @@ const PublishButton = memo<GroupPublishButtonProps>(({ action, onPublishSuccess
6071
await publish();
6172
}, [checkOwnership, publish]);
6273

63-
const handleButtonClick = useCallback(async () => {
74+
const handleButtonClick = useCallback(() => {
75+
// Validate name and systemRole (stored in content)
76+
if (!currentGroupMeta?.title || currentGroupMeta.title.trim() === '') {
77+
message.error({ content: t('marketPublish.validation.emptyName') });
78+
return;
79+
}
80+
81+
if (!currentGroup?.content || currentGroup.content.trim() === '') {
82+
message.error({ content: t('marketPublish.validation.emptySystemRole') });
83+
return;
84+
}
85+
86+
// Open popconfirm for user confirmation
87+
setConfirmOpened(true);
88+
}, [currentGroupMeta?.title, currentGroup?.content, t]);
89+
90+
const handleConfirmPublish = useCallback(async () => {
91+
setConfirmOpened(false);
92+
6493
if (!isAuthenticated) {
6594
try {
6695
await signIn();
@@ -98,14 +127,29 @@ const PublishButton = memo<GroupPublishButtonProps>(({ action, onPublishSuccess
98127

99128
return (
100129
<>
101-
<Button
102-
icon={ShapesUploadIcon}
103-
loading={loading}
104-
onClick={handleButtonClick}
105-
title={buttonTitle}
130+
<Popconfirm
131+
arrow={false}
132+
okButtonProps={{ type: 'primary' }}
133+
onCancel={() => setConfirmOpened(false)}
134+
onConfirm={handleConfirmPublish}
135+
onOpenChange={(open) => {
136+
if (!open) {
137+
setConfirmOpened(false);
138+
}
139+
}}
140+
open={confirmOpened}
141+
placement="bottomRight"
142+
title={t('marketPublish.validation.confirmPublish')}
106143
>
107-
{t('publishToCommunity')}
108-
</Button>
144+
<Button
145+
icon={ShapesUploadIcon}
146+
loading={loading}
147+
onClick={handleButtonClick}
148+
title={buttonTitle}
149+
>
150+
{t('publishToCommunity')}
151+
</Button>
152+
</Popconfirm>
109153
<GroupForkConfirmModal
110154
loading={isPublishing}
111155
onCancel={handleForkCancel}

src/locales/default/setting.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,9 @@ export default {
294294
'marketPublish.upload.button': 'Publish New Version',
295295
'marketPublish.upload.tooltip': 'Publish a new version to Agent Community',
296296
'marketPublish.uploadGroup.tooltip': 'Publish a new version to Group Community',
297+
'marketPublish.validation.confirmPublish': 'Are you sure you want to publish to the market?',
298+
'marketPublish.validation.emptyName': 'Cannot publish: Name is required',
299+
'marketPublish.validation.emptySystemRole': 'Cannot publish: System Role is required',
297300
'memory.enabled.desc':
298301
'Allow LobeHub to extract preferences and info from conversations and use them later. You can view, edit, or clear memory anytime.',
299302
'memory.enabled.title': 'Enable Memory',

0 commit comments

Comments
 (0)