Compare commits

..

No commits in common. '527a66af959af5ee43c15fb52675367c3001bbd1' and '134011bcafcc8d45ac917b9f1e2f89ccac94bb5e' have entirely different histories.

@ -19,7 +19,6 @@
"try": "试一下" "try": "试一下"
}, },
"back": "返回发现", "back": "返回发现",
"collectSuccess": "收藏成功",
"category": { "category": {
"assistant": { "assistant": {
"all": "全部", "all": "全部",

@ -19,7 +19,6 @@
"try": "試一下" "try": "試一下"
}, },
"back": "返回發現", "back": "返回發現",
"collectSuccess": "收藏成功",
"category": { "category": {
"assistant": { "assistant": {
"academic": "學術", "academic": "學術",

@ -8,7 +8,6 @@ import { useGlobalStore } from '@/store/global';
import { SidebarTabKey } from '@/store/global/initialState'; import { SidebarTabKey } from '@/store/global/initialState';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
import { useSessionStore } from '@/store/session'; import { useSessionStore } from '@/store/session';
import { useUserStore } from '@/store/user';
import { createStyles } from 'antd-style'; import { createStyles } from 'antd-style';
import {Button, Image} from "antd"; import {Button, Image} from "antd";
@ -44,13 +43,7 @@ const TopActions = memo<TopActionProps>(({ tab }) => {
const { showMarket, enableKnowledgeBase } = useServerConfigStore(featureFlagsSelectors); const { showMarket, enableKnowledgeBase } = useServerConfigStore(featureFlagsSelectors);
const { styles, cx } = useStyles() const { styles, cx } = useStyles()
const [value, setValue] = useState("chat") const [value, setValue] = useState("chat")
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
console.log(userId,'3837373266262266')
const testFuc = (s: UserStore) => {
console.log(s,'999999999')
}
testFuc(useUserStore.getState())
return ( return (
<div style={{ width: '100%', textAlign: 'center'}}> <div style={{ width: '100%', textAlign: 'center'}}>
<Link <Link
@ -68,7 +61,7 @@ const TopActions = memo<TopActionProps>(({ tab }) => {
<div className={value == '/chat' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div> <div className={value == '/chat' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link> </Link>
{enableKnowledgeBase && ( {enableKnowledgeBase && (
<Link className={value == '/discover/assistants' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} aria-label={t('tab.files')} href={`/discover/assistants?userid=${userId}`} onClick={() => {setValue("/discover/assistants"); window.localStorage.setItem("nowChat", "")}}> <Link className={value == '/discover/assistants' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} aria-label={t('tab.files')} href={`/discover/assistants?userid=${localStorage.getItem('userId')}`} onClick={() => {setValue("/discover/assistants"); window.localStorage.setItem("nowChat", "")}}>
<Image alt={"files"} className={cx(styles.iconImg)} preview={false} src="/images/zs.png" /> <Image alt={"files"} className={cx(styles.iconImg)} preview={false} src="/images/zs.png" />
<div className={value == '/discover/assistants' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div> <div className={value == '/discover/assistants' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link> </Link>
@ -80,7 +73,7 @@ const TopActions = memo<TopActionProps>(({ tab }) => {
</Link> </Link>
)} )}
{showMarket && ( {showMarket && (
<Link className={value == '/model' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} aria-label={t('tab.Model')} href={`/discover/models?userid=${userId}`} onClick={() => {setValue("/model"); window.localStorage.setItem("nowChat", "")}}> <Link className={value == '/model' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} aria-label={t('tab.Model')} href={'/model'} onClick={() => {setValue("/model"); window.localStorage.setItem("nowChat", "")}}>
<Image alt={"model"} className={cx(styles.iconImg)} preview={false} src="/images/mx.png" /> <Image alt={"model"} className={cx(styles.iconImg)} preview={false} src="/images/mx.png" />
<div className={value == '/model' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div> <div className={value == '/model' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link> </Link>
@ -92,7 +85,7 @@ const TopActions = memo<TopActionProps>(({ tab }) => {
</Link> </Link>
)} )}
{showMarket && ( {showMarket && (
<Link className={value == '/plugins' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} aria-label={t('tab.Plugins')} href={`/discover/plugins?userid=${userId}`} onClick={() => {setValue("/plugins"); window.localStorage.setItem("nowChat", "")}}> <Link className={value == '/plugins' ? cx(styles.linkUrl, styles.linkclic) : cx(styles.linkUrl)} aria-label={t('tab.Plugins')} href={'/discover/plugins'} onClick={() => {setValue("/plugins"); window.localStorage.setItem("nowChat", "")}}>
<Image alt={"plugins"} className={cx(styles.iconImg)} preview={false} src="/images/cj.png" /> <Image alt={"plugins"} className={cx(styles.iconImg)} preview={false} src="/images/cj.png" />
<div className={value == '/plugins' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div> <div className={value == '/plugins' ? cx(styles.iconText, styles.iconSelectText) : cx(styles.iconText) }></div>
</Link> </Link>

@ -9,7 +9,9 @@ import { usePlatform } from '@/hooks/usePlatform';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig'; import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
import { UserOutlined, SearchOutlined } from '@ant-design/icons'; import { UserOutlined, SearchOutlined } from '@ant-design/icons';
import { LayoutProps } from './type'; import { LayoutProps } from './type';
import { Divider, Avatar } from "antd"; import { Divider, Input, Avatar } from "antd";
const { Search } = Input;
const title = { const title = {
"/chat": '会话', "/chat": '会话',
"/discover/assistants": "助手", "/discover/assistants": "助手",
@ -23,7 +25,6 @@ const title = {
const useStyles = createStyles(({ css, token }) => ({ const useStyles = createStyles(({ css, token }) => ({
topCenten: css` topCenten: css`
width: 100%; width: 100%;
line-height: 60px;
background: #FFFFFF; background: #FFFFFF;
box-sizing: border-box; box-sizing: border-box;
/* 分割线颜色 */ /* 分割线颜色 */
@ -37,7 +38,7 @@ const useStyles = createStyles(({ css, token }) => ({
display: inline-block display: inline-block
`, `,
dividerCen: css` dividerCen: css`
width: 1px; width: 2px;
height: 26px; height: 26px;
background-color: #d8d8d8; background-color: #d8d8d8;
margin: 8px 16px; margin: 8px 16px;
@ -47,8 +48,8 @@ const useStyles = createStyles(({ css, token }) => ({
display: inline-block; display: inline-block;
`, `,
nameSpn: css` nameSpn: css`
margin-right: 16px; margin-right: 80px;
margin-left: 18px; margin-left: 8px;
display: inline-block; display: inline-block;
`, `,
serchIcon: css` serchIcon: css`
@ -70,9 +71,9 @@ const Layout = memo<LayoutProps>(({ children, nav }) => {
const { isPWA } = usePlatform(); const { isPWA } = usePlatform();
const theme = useTheme(); const theme = useTheme();
const { styles, cx } = useStyles() const { styles, cx } = useStyles()
console.log(window?.location?.pathname,'3837373666router--------------------------------------------')
const { showCloudPromotion } = useServerConfigStore(featureFlagsSelectors); const { showCloudPromotion } = useServerConfigStore(featureFlagsSelectors);
const pathName = window?.location?.pathname
return ( return (
<> <>
{showCloudPromotion && <CloudBanner />} {showCloudPromotion && <CloudBanner />}
@ -86,20 +87,7 @@ const Layout = memo<LayoutProps>(({ children, nav }) => {
width={'100%'} width={'100%'}
> >
{nav} {nav}
<div style={{ width: '100%' }}> {children}
<div className={cx(styles.topCenten)}>
<div className={cx(styles.ledDiv)}>
<span className={cx(styles.leftTitle)} style={{ marginLeft: '16px' }}>AI</span>
<Divider className={cx(styles.dividerCen)} type="vertical" />
<span className={cx(styles.leftTitle)}>{title[pathName]}</span>
</div>
<div className={cx(styles.ledDiv)} style={{ height: '42px', lineHeight: "42px", textAlign: 'right' }}>
<Avatar style={{ backgroundColor: '#90ACFF' }} icon={<UserOutlined />} />
<span className={cx(styles.nameSpn)}> </span>
</div>
</div>
{children}
</div>
</Flexbox> </Flexbox>
</> </>
); );

@ -17,8 +17,17 @@ interface AssistantActionProps extends FlexboxProps {
const AssistantAction = memo<AssistantActionProps>(({ identifier, data }) => { const AssistantAction = memo<AssistantActionProps>(({ identifier, data }) => {
return ( return (
<Flexbox align={'center'} gap={8} horizontal style={{marginLeft: 100}}> <Flexbox align={'center'} gap={8} horizontal>
<AddAgent data={data} /> <AddAgent data={data} />
<ShareButton
meta={{
avatar: data.meta.avatar,
desc: data.meta.description,
hashtags: data.meta.tags,
title: data.meta.title,
url: urlJoin(OFFICIAL_URL, '/discover/assistant', identifier),
}}
/>
</Flexbox> </Flexbox>
); );
}); });

@ -13,8 +13,9 @@ import { Flexbox } from 'react-layout-kit';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { DiscoverAssistantItem } from '@/types/discover'; import { DiscoverAssistantItem } from '@/types/discover';
import { useUserStore } from '@/store/user';
import GitHubAvatar from '../../../../components/GitHubAvatar'; import GitHubAvatar from '../../../../components/GitHubAvatar';
import Back from '../../../features/Back';
import Actions from './Actions'; import Actions from './Actions';
export const useStyles = createStyles(({ css, token }) => ({ export const useStyles = createStyles(({ css, token }) => ({
tag: css` tag: css`
@ -47,8 +48,8 @@ export const useStyles = createStyles(({ css, token }) => ({
`, `,
conTitle: css` conTitle: css`
width: 125px; width: 125px;
height: 40px; height: 50px;
line-height: 40px; line-height: 50px;
text-align: center; text-align: center;
color: #fff; color: #fff;
font-size: 20px; font-size: 20px;
@ -58,11 +59,9 @@ export const useStyles = createStyles(({ css, token }) => ({
`, `,
description: css` description: css`
padding: 0 45px; padding: 0 45px;
margin-top: 10px;
`, `,
tag: css` tag: css`
padding: 0px 45px; padding: 0px 45px;
margin-bottom: 10px;
`, `,
})); }));
@ -76,10 +75,8 @@ const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
const { styles, theme } = useStyles(); const { styles, theme } = useStyles();
const router = useRouter() const router = useRouter()
const { t } = useTranslation('discover'); const { t } = useTranslation('discover');
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
const handleBack = () => { const handleBack = () => {
router.push('/discover/assistants?userid=' + userId) router.push('/discover/assistants?userid=' + localStorage.getItem('userId'))
} }
return ( return (
<Flexbox gap={12} width={'100%'}> <Flexbox gap={12} width={'100%'}>
@ -121,9 +118,17 @@ const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
{data.meta.tags && ( {data.meta.tags && (
<Flexbox gap={4} horizontal wrap={'wrap'}> <Flexbox gap={4} horizontal wrap={'wrap'}>
{data.meta.tags.map((tag) => ( {data.meta.tags.map((tag) => (
<Tag key={tag} style={{ margin: 0 }}> <Link
{startCase(tag).trim()} href={qs.stringifyUrl({
</Tag> query: { q: tag, type: 'assistants' },
url: '/discover/search',
})}
key={tag}
>
<Tag key={tag} style={{ margin: 0 }}>
{startCase(tag).trim()}
</Tag>
</Link>
))} ))}
</Flexbox> </Flexbox>
)} )}

@ -11,9 +11,9 @@ import { DiscoverPlugintem } from '@/types/discover';
import { isMobileDevice } from '@/utils/responsive'; import { isMobileDevice } from '@/utils/responsive';
import DetailLayout from '../../features/DetailLayout'; import DetailLayout from '../../features/DetailLayout';
// import Actions from './features/Actions'; import Actions from './features/Actions';
import Header from './features/Header'; import Header from './features/Header';
// import InfoSidebar from './features/InfoSidebar'; import InfoSidebar from './features/InfoSidebar';
import Temp from './features/Temp'; import Temp from './features/Temp';
// import ConversationExample from './features/ConversationExample'; // import ConversationExample from './features/ConversationExample';

@ -40,10 +40,17 @@ const DetailLayout = memo<DetailLayoutProps>(
<div style={{ backgroundColor: '#fff'}}> <div style={{ backgroundColor: '#fff'}}>
{header} {header}
<Flexbox gap={32} horizontal width={'100%'}> <Flexbox gap={32} horizontal width={'100%'}>
<Flexbox flex={1} gap={48} style={{ overflow: 'hidden', position: 'relative',padding: '0 30px' }}> <Flexbox flex={1} gap={48} style={{ overflow: 'hidden', position: 'relative' }}>
{children} {children}
<Footer /> <Footer />
</Flexbox> </Flexbox>
<SidebarContainer>
<Flexbox gap={16} width={'100%'}>
{actions}
{statistics}
</Flexbox>
{sidebar}
</SidebarContainer>
</Flexbox> </Flexbox>
</div> </div>
</> </>

@ -61,7 +61,7 @@ const HighlightBlock = memo<HighlightBlockProps>(({ avatar, title, icon, childre
const { styles } = useStyles(); const { styles } = useStyles();
const mobile = useServerConfigStore((s) => s.isMobile); const mobile = useServerConfigStore((s) => s.isMobile);
return ( return (
<Flexbox className={styles.container} flex={'none'} width={'100%'} {...rest} style={{marginTop: 20}}> <Flexbox className={styles.container} flex={'none'} width={'100%'} {...rest}>
<Flexbox <Flexbox
align={'center'} align={'center'}
className={styles.header} className={styles.header}

@ -9,8 +9,7 @@ import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit'; import { Flexbox } from 'react-layout-kit';
import { DiscoverModelItem } from '@/types/discover'; import { DiscoverModelItem } from '@/types/discover';
import { useRouter } from 'next/navigation';
import { useUserStore } from '@/store/user';
import ModelFeatureTags from '../../../../features/ModelFeatureTags'; import ModelFeatureTags from '../../../../features/ModelFeatureTags';
import Back from '../../../features/Back'; import Back from '../../../features/Back';
@ -30,38 +29,6 @@ export const useStyles = createStyles(({ css, token }) => ({
font-weight: bold; font-weight: bold;
line-height: 1.2; line-height: 1.2;
`, `,
top: css`
padding: 20px 0px;
box-sizing: border-box;
border-width: 0px 0px 2px 0px;
border-style: solid;
border-color: rgba(187, 204, 253, 0.24);
padding: 20px 50px;
`,
topBtn: css`
border-radius: 20px;
color: #2E62FF;
border: 1px solid #2E62FF;
`,
conTitle: css`
width: 125px;
height: 40px;
line-height: 40px;
text-align: center;
color: #fff;
font-size: 20px;
border-radius: 0px 129px 129px 0px;
opacity: 1;
background: linear-gradient(270deg, #2D65FF 0%, rgba(0, 166, 255, 0.52) 99%);
`,
description: css`
padding: 0 45px;
margin-top: 10px;
`,
tag: css`
padding: 0px 45px;
margin-bottom: 10px;
`,
})); }));
interface HeaderProps { interface HeaderProps {
@ -72,16 +39,12 @@ interface HeaderProps {
const Header = memo<HeaderProps>(({ identifier, data, mobile }) => { const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
const { styles, theme } = useStyles(); const { styles, theme } = useStyles();
const router = useRouter()
const { t } = useTranslation(['discover', 'models']); const { t } = useTranslation(['discover', 'models']);
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
const handleBack = () => {
router.push('/discover/models?userid=' + userId)
}
return ( return (
<Flexbox gap={12} width={'100%'}> <Flexbox gap={12} width={'100%'}>
<Flexbox align={'center'} gap={8} horizontal justify={'space-between'} width={'100%'} className={styles.top}> {!mobile && <Back href={'/discover/models'} />}
<Flexbox align={'center'} gap={8} horizontal justify={'space-between'} width={'100%'}>
<Flexbox align={'center'} gap={16} horizontal justify={'flex-start'}> <Flexbox align={'center'} gap={16} horizontal justify={'flex-start'}>
<ModelIcon model={identifier} size={48} type={'avatar'} /> <ModelIcon model={identifier} size={48} type={'avatar'} />
<Flexbox gap={2}> <Flexbox gap={2}>
@ -101,20 +64,20 @@ const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
</Flexbox> </Flexbox>
{!mobile && ( {!mobile && (
<Flexbox align={'center'} gap={4} horizontal justify={'flex-end'}> <Flexbox align={'center'} gap={4} horizontal justify={'flex-end'}>
<Button className={styles.topBtn} onClick={() => handleBack()}></Button> <Link href={'/discover/models'}>
<Button className={styles.tag} shape={'round'} size={'small'}>
{t('tab.models')}
</Button>
</Link>
</Flexbox> </Flexbox>
)} )}
</Flexbox> </Flexbox>
<div className={styles.conTitle}></div> {data.meta.description && <div>{t(`${identifier}.description`, { ns: 'models' })}</div>}
{data.meta.description && <div className={styles.description}>{t(`${identifier}.description`, { ns: 'models' })}</div>} <ModelFeatureTags
<div className={styles.tag}> functionCall={data.meta.functionCall}
<ModelFeatureTags tokens={data.meta.tokens}
functionCall={data.meta.functionCall} vision={data.meta.vision}
tokens={data.meta.tokens} />
vision={data.meta.vision}
/>
</div>
<div className={styles.conTitle}></div>
</Flexbox> </Flexbox>
); );
}); });

@ -95,10 +95,10 @@ const Page = async ({ params, searchParams }: Props) => {
<> <>
<StructuredData ld={ld} /> <StructuredData ld={ld} />
<DetailLayout <DetailLayout
// actions={<Actions data={data} identifier={identifier} providerData={providerData} />} actions={<Actions data={data} identifier={identifier} providerData={providerData} />}
header={<Header data={data} identifier={identifier} mobile={mobile} />} header={<Header data={data} identifier={identifier} mobile={mobile} />}
mobile={mobile} mobile={mobile}
// sidebar={<InfoSidebar data={data} identifier={identifier} mobile={mobile} />} sidebar={<InfoSidebar data={data} identifier={identifier} mobile={mobile} />}
/* ↓ cloud slot ↓ */ /* ↓ cloud slot ↓ */
/* ↑ cloud slot ↑ */ /* ↑ cloud slot ↑ */

@ -11,11 +11,11 @@ import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit'; import { Flexbox } from 'react-layout-kit';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useUserStore } from '@/store/user';
import { useRouter } from 'next/navigation';
import { DiscoverPlugintem } from '@/types/discover'; import { DiscoverPlugintem } from '@/types/discover';
import Back from '../../../features/Back'; import Back from '../../../features/Back';
export const useStyles = createStyles(({ css, token }) => ({ export const useStyles = createStyles(({ css, token }) => ({
tag: css` tag: css`
color: ${token.colorTextSecondary}; color: ${token.colorTextSecondary};
@ -32,38 +32,6 @@ export const useStyles = createStyles(({ css, token }) => ({
font-weight: bold; font-weight: bold;
line-height: 1.2; line-height: 1.2;
`, `,
top: css`
padding: 20px 0px;
box-sizing: border-box;
border-width: 0px 0px 2px 0px;
border-style: solid;
border-color: rgba(187, 204, 253, 0.24);
padding: 20px 50px;
`,
topBtn: css`
border-radius: 20px;
color: #2E62FF;
border: 1px solid #2E62FF;
`,
conTitle: css`
width: 125px;
height: 40px;
line-height: 40px;
text-align: center;
color: #fff;
font-size: 20px;
border-radius: 0px 129px 129px 0px;
opacity: 1;
background: linear-gradient(270deg, #2D65FF 0%, rgba(0, 166, 255, 0.52) 99%);
`,
description: css`
padding: 0 45px;
margin-top: 10px;
`,
tag: css`
padding: 0px 45px;
margin-bottom: 10px;
`,
})); }));
interface HeaderProps { interface HeaderProps {
@ -74,16 +42,12 @@ interface HeaderProps {
const Header = memo<HeaderProps>(({ identifier, data, mobile }) => { const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
const { styles, theme } = useStyles(); const { styles, theme } = useStyles();
const router = useRouter()
const { t } = useTranslation('discover'); const { t } = useTranslation('discover');
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
const handleBack = () => {
router.push('/discover/plugins?userid=' + userId)
}
return ( return (
<Flexbox gap={12} width={'100%'}> <Flexbox gap={12} width={'100%'}>
<Flexbox align={'center'} gap={8} horizontal justify={'space-between'} width={'100%'} className={styles.top}> {!mobile && <Back href={'/discover/plugins'} />}
<Flexbox align={'center'} gap={8} horizontal justify={'space-between'} width={'100%'}>
<Flexbox align={'center'} gap={16} horizontal justify={'flex-start'}> <Flexbox align={'center'} gap={16} horizontal justify={'flex-start'}>
<Avatar <Avatar
alt={identifier} alt={identifier}
@ -107,24 +71,42 @@ const Header = memo<HeaderProps>(({ identifier, data, mobile }) => {
</Flexbox> </Flexbox>
{!mobile && ( {!mobile && (
<Flexbox align={'center'} gap={4} horizontal justify={'flex-end'}> <Flexbox align={'center'} gap={4} horizontal justify={'flex-end'}>
<Button className={styles.topBtn} onClick={() => handleBack()}></Button> <Link href={'/discover/plugins'}>
<Button className={styles.tag} shape={'round'} size={'small'}>
{t('tab.plugins')}
</Button>
</Link>
{data.meta?.category && (
<>
<Icon color={theme.colorTextSecondary} icon={ChevronRight} />
<Link href={urlJoin('/discover/plugins', data.meta?.category || '')}>
<Button className={styles.tag} shape={'round'} size={'small'}>
{t(`category.plugin.${data.meta?.category}` as any)}
</Button>
</Link>
</>
)}
</Flexbox> </Flexbox>
)} )}
</Flexbox> </Flexbox>
<div className={styles.conTitle}></div> <div>{data.meta.description}</div>
<div className={styles.description}>{data.meta.description}</div> {data.meta.tags && (
<div className={styles.tag}> <Flexbox gap={4} horizontal wrap={'wrap'}>
{data.meta.tags && ( {data.meta.tags.map((tag) => (
<Flexbox gap={4} horizontal wrap={'wrap'}> <Link
{data.meta.tags.map((tag) => ( href={qs.stringifyUrl({
<Tag key={tag} style={{ margin: 0 }}> query: { q: tag },
{startCase(tag).trim()} url: '/discover/search',
</Tag> })}
))} key={tag}
</Flexbox> >
)} <Tag key={tag} style={{ margin: 0 }}>
</div> {startCase(tag).trim()}
<div className={styles.conTitle}></div> </Tag>
</Link>
))}
</Flexbox>
)}
</Flexbox> </Flexbox>
); );
}); });

@ -84,10 +84,10 @@ const Page = async ({ params, searchParams }: Props) => {
<> <>
<StructuredData ld={ld} /> <StructuredData ld={ld} />
<DetailLayout <DetailLayout
// actions={<Actions data={data} identifier={identifier} />} actions={<Actions data={data} identifier={identifier} />}
header={<Header data={data} identifier={identifier} mobile={mobile} />} header={<Header data={data} identifier={identifier} mobile={mobile} />}
mobile={mobile} mobile={mobile}
// sidebar={<InfoSidebar data={data} identifier={identifier} mobile={mobile} />} sidebar={<InfoSidebar data={data} identifier={identifier} mobile={mobile} />}
/* ↓ cloud slot ↓ */ /* ↓ cloud slot ↓ */
/* ↑ cloud slot ↑ */ /* ↑ cloud slot ↑ */

@ -32,7 +32,45 @@ const Page = async ({ params, searchParams }: Props) => {
const mobile = isMobileDevice(); const mobile = isMobileDevice();
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
console.log(params.slug,3333333) console.log(params.slug,3333333)
const items = await discoverService.getAssistantCategory(locale, params.slug); let items;
if(params.slug == "collect") {
const res = await request({
url: "/flxai/api/robot/appaiassistant/getAllAiAssistant",
method: "get",
params: {
userid: searchParams.userid
}
})
items = res.data;
items = items.map((item,index)=> {
item.classify = 'collect';
return item
})
} else {
const res = await request({
url: "/flxai/api/robot/appaiassistant/getAllAiAssistant",
method: "get",
params: {
userid: searchParams.userid
}
})
const array2Object = {};
res?.data?.forEach(item => {
array2Object[item.identifier] = item;
});
items = await discoverService.getAssistantCategory(locale, params.slug);
items = items.map((item,index)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
console.log('3838383838',matchingItem);
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
})
}
console.log(8272772727,items) console.log(8272772727,items)
const ld = ldModule.generate({ const ld = ldModule.generate({
description: t('discover.assistants.description'), description: t('discover.assistants.description'),

@ -13,8 +13,6 @@ import CardBanner from '../../../components/CardBanner';
import GitHubAvatar from '../../../components/GitHubAvatar'; import GitHubAvatar from '../../../components/GitHubAvatar';
import { useCategoryItem } from '../../assistants/features/useCategory'; import { useCategoryItem } from '../../assistants/features/useCategory';
import { StarOutlined } from '@ant-design/icons'; import { StarOutlined } from '@ant-design/icons';
import { useUserStore } from '@/store/user';
import { useTranslation } from 'react-i18next';
const Link = dynamic(() => import('next/link'), { const Link = dynamic(() => import('next/link'), {
loading: () => <Skeleton.Button size={'small'} style={{ height: 22 }} />, loading: () => <Skeleton.Button size={'small'} style={{ height: 22 }} />,
ssr: false, ssr: false,
@ -82,15 +80,12 @@ const AssistantCard = memo<AssistantCardProps>(
const { avatar, title, description, tags = [], category } = meta; const { avatar, title, description, tags = [], category } = meta;
const { createAt,homepage,identifier,schemaVersion,status,classify } = {...rest} const { createAt,homepage,identifier,schemaVersion,status,classify } = {...rest}
const { cx, styles, theme } = useStyles(); const { cx, styles, theme } = useStyles();
const { t } = useTranslation('discover');
const { message } = App.useApp(); const { message } = App.useApp();
const categoryItem = useCategoryItem(category, 12); const categoryItem = useCategoryItem(category, 12);
const isCompact = variant === 'compact'; const isCompact = variant === 'compact';
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
// console.log(tags,avatar,author,9383737) // console.log(tags,avatar,author,9383737)
console.log(userId,9999999999) console.log(status,9999999999)
const [val, setVal] = useState('') const [val, setVal] = useState(status)
const handleCollect = (e) => { const handleCollect = (e) => {
console.log(e,8844848) console.log(e,8844848)
e.preventDefault() e.preventDefault()
@ -107,7 +102,7 @@ const AssistantCard = memo<AssistantCardProps>(
"title": title, "title": title,
"category": category, "category": category,
"schemaVersion": schemaVersion, "schemaVersion": schemaVersion,
"userid": userId, "userid": localStorage.getItem('userId'),
} }
request({ request({
url: "/flxai/api/robot/appaiassistant", url: "/flxai/api/robot/appaiassistant",
@ -116,7 +111,7 @@ const AssistantCard = memo<AssistantCardProps>(
}).then(response => { }).then(response => {
console.log(response,222222222) console.log(response,222222222)
if (response.code == 0) { if (response.code == 0) {
message.success(t('collectSuccess')); message.success('收藏成功')
setVal("1") setVal("1")
} }
}).catch(error => { }).catch(error => {
@ -136,7 +131,7 @@ const AssistantCard = memo<AssistantCardProps>(
); );
const renderElement = () => { const renderElement = () => {
if (classify != 'collect') { if (classify != 'collect') {
if(status == "1" || val == "1") { if(val == "1") {
return <div className={styles.collectBtn} onClick={(e) => {e.stopPropagation()}}><StarOutlined style={{color: '#FFAD01'}}/></div> return <div className={styles.collectBtn} onClick={(e) => {e.stopPropagation()}}><StarOutlined style={{color: '#FFAD01'}}/></div>
} else { } else {
return <div className={styles.collectBtn} style={{background: '#F1F1F1'}} onClick={(e) => handleCollect(e)}><StarOutlined style={{color: '#D6D6D6'}}/></div> return <div className={styles.collectBtn} style={{background: '#F1F1F1'}} onClick={(e) => handleCollect(e)}><StarOutlined style={{color: '#D6D6D6'}}/></div>

@ -7,7 +7,7 @@ import urlJoin from 'url-join';
import { useQueryRoute } from '@/hooks/useQueryRoute'; import { useQueryRoute } from '@/hooks/useQueryRoute';
import { AssistantCategory } from '@/types/discover'; import { AssistantCategory } from '@/types/discover';
import { useUserStore } from '@/store/user';
import CategoryMenu from '../../../components/CategoryMenu'; import CategoryMenu from '../../../components/CategoryMenu';
import { useCategory } from './useCategory'; import { useCategory } from './useCategory';
@ -21,9 +21,7 @@ const Category = memo(() => {
return 'all'; return 'all';
}, [pathname]); }, [pathname]);
const router = useQueryRoute(); const router = useQueryRoute();
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
console.log(userId,'category333333')
return ( return (
<CategoryMenu <CategoryMenu
items={items.map((item: any) => ({ items={items.map((item: any) => ({
@ -32,7 +30,7 @@ const Category = memo(() => {
<Link <Link
href={urlJoin( href={urlJoin(
'/discover/assistants', '/discover/assistants',
item.key === AssistantCategory.All ? '' : item.key + '?userid=' + userId, item.key === AssistantCategory.All ? '' : item.key + '?userid=' + localStorage.getItem('userId'),
)} )}
> >
{item.label} {item.label}
@ -40,7 +38,7 @@ const Category = memo(() => {
), ),
}))} }))}
onSelect={({ key }) => { onSelect={({ key }) => {
router.push(urlJoin('/discover/assistants', key === AssistantCategory.All ? '' : key + '?userid=' + userId)); router.push(urlJoin('/discover/assistants', key === AssistantCategory.All ? '' : key + '?userid=' + localStorage.getItem('userId')));
}} }}
selectedKeys={[selectedKey || 'all']} selectedKeys={[selectedKey || 'all']}
/> />

@ -3,7 +3,7 @@
import { Grid } from '@lobehub/ui'; import { Grid } from '@lobehub/ui';
import {Button, Empty, Image, Tag} from 'antd'; import {Button, Empty, Image, Tag} from 'antd';
import Link from 'next/link'; import Link from 'next/link';
import {memo, useMemo, useEffect, useState} from 'react'; import {memo, useMemo, useState} from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
@ -13,8 +13,8 @@ import SearchResultCount from '../../../components/SearchResultCount';
import Title from '../../../components/Title'; import Title from '../../../components/Title';
import VirtuosoGridList from '../../../components/VirtuosoGridList'; import VirtuosoGridList from '../../../components/VirtuosoGridList';
import Card from './Card'; import Card from './Card';
import request from '@/app/api/request'; import {createStyles} from "antd-style";
import { useUserStore } from '@/store/user';
export interface ListProps { export interface ListProps {
category?: string; category?: string;
items?: DiscoverAssistantItem[]; items?: DiscoverAssistantItem[];
@ -22,69 +22,133 @@ export interface ListProps {
searchKeywords?: string; searchKeywords?: string;
} }
const useStyles = createStyles(({css, token}) => ({
top: css`
padding: 20px 0px;
box-sizing: border-box;
border-width: 0px 0px 2px 0px;
border-style: solid;
border-color: rgba(187, 204, 253, 0.24);
padding: 20px 50px;
`,
topFirAc: css`
width: 86px;
height: 86px;
display: inline-block;
border-radius: 86px;
border: 4px solid #6D94FF;
`,
topSecAc: css`
width: 60px;
height: 60px;
border-radius: 60px;
margin: 9px;
text-align: center;
line-height: 50px;
font-size: 26px;
border: 4px solid #6D94FF;
`,
topBtn: css`
border-radius: 20px;
color: #2E62FF;
border: 1px solid #2E62FF;
`,
topRight: css`
width: 50%;
text-align: right;
display: inline-block
`,
topLeft: css`
width: 50%;
display: inline-block
`,
title: css`
display: inline-block;
vertical-align: middle;
margin-top: -10px;
margin-left: 25px
`,
des: css`
margin-top: 5px;
font-size: 12px;
color: #999
`,
desImg: css`
margin: 0px 5px;
width: 20px
`,
time: css`
display: inline-block;
margin-left: 5px
`,
conTitle: css`
margin: 12px 0;
width: 125px;
height: 50px;
line-height: 50px;
text-align: center;
color: #fff;
font-size: 20px;
border-radius: 0px 129px 129px 0px;
opacity: 1;
background: linear-gradient(270deg, #2D65FF 0%, rgba(0, 166, 255, 0.52) 99%);
`,
description: css`
padding: 20px 50px;
`,
tag: css`
padding: 0px 50px;
margin-bottom: 20px;
`,
set: css`
padding: 0px 30px 20px;
`,
setBtn: css`
background: #EDF2FF;
width: 80px;
border-radius: 40px;
color: #0044FF;
`,
setText: css`
padding: 0px 50px 20px;
`,
setOl: css`
display: inline-block;
width: 8px;
height: 8px;
background: #0044FF;
margin-right: 10px;
`,
rwDes: css`
padding: 0px 70px 20px;
`,
}))
const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] }) => { const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] }) => {
const { t } = useTranslation('discover'); const { t } = useTranslation('discover');
const { styles, cx } = useStyles()
const router = useRouter() const router = useRouter()
const [stData, setStData] = useState(items)
const recentLength = mobile ? 4 : 8;
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
console.log(userId,'zhushou---3837373266262266')
console.log('zhushou--------------',items)
const { all, recent, last } = useMemo(() => { const { all, recent, last } = useMemo(() => {
const recentLength = mobile ? 4 : 8;
return { return {
all: stData, all: items,
last: stData.slice(recentLength), last: items.slice(recentLength),
recent: stData.slice(0, recentLength), recent: items.slice(0, recentLength),
};
}, [stData, mobile]);
useEffect(() => {
const fetchData = async() => {
if(category == "collect") {
const res = await request({
url: "/flxai/api/robot/appaiassistant/getAllAiAssistant",
method: "get",
params: {
userid: userId
}
})
setStData(res?.data.map((item,index)=> {
item.classify = 'collect';
return item
}))
} else {
const res = await request({
url: "/flxai/api/robot/appaiassistant/getAllAiAssistant",
method: "get",
params: {
userid: userId
}
})
const array2Object = {};
res?.data?.forEach((item) => {
array2Object[item.identifier] = item;
});
console.log('chajian22222222222222222222222222222--------------')
setStData(stData.map((item,index)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
}))
}
}; };
fetchData(); }, [items, mobile]);
}, []); // 空数组[]意味着仅在组件挂载时调用一次
console.log(category,recent,last,92929292) console.log(category,recent,last,92929292)
const [val, setVal] = useState("")
const handleClickCard = (item) => { const handleClickCard = (item) => {
console.log(item) console.log(item)
setVal(item)
router.push(urlJoin('/discover/assistant/', item.identifier)) router.push(urlJoin('/discover/assistant/', item.identifier))
} }
const handleBack = () => {
setVal("")
}
if (searchKeywords) { if (searchKeywords) {
if (!items || items?.length === 0) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />; if (!items || items?.length === 0) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />;
return ( return (

@ -5,6 +5,7 @@ import { metadataModule } from '@/server/metadata';
import { DiscoverService } from '@/server/services/discover'; import { DiscoverService } from '@/server/services/discover';
import { translation } from '@/server/translation'; import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive'; import { isMobileDevice } from '@/utils/responsive';
import request from '@/app/api/request';
import List from './features/List'; import List from './features/List';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
type Props = { searchParams: { hl?: Locales } }; type Props = { searchParams: { hl?: Locales } };
@ -26,7 +27,31 @@ const Page = async ({ searchParams }: Props) => {
const mobile = isMobileDevice(); const mobile = isMobileDevice();
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
console.log(searchParams,22222222222) console.log(searchParams,22222222222)
const items = await discoverService.getAssistantList(locale); const res = await request({
url: "/flxai/api/robot/appaiassistant/getAllAiAssistant",
method: "get",
params: {
userid: searchParams.userid
}
})
console.log(res,4322222)
const array2Object = {};
res?.data?.forEach(item => {
array2Object[item.identifier] = item;
});
let items = await discoverService.getAssistantList(locale);
console.log(8272772727,'jiangxucong')
items = items.map((item,index)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
console.log('5959595959',matchingItem);
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
})
const ld = ldModule.generate({ const ld = ldModule.generate({
description: t('discover.assistants.description'), description: t('discover.assistants.description'),
title: t('discover.assistants.title'), title: t('discover.assistants.title'),

@ -9,13 +9,14 @@ import { DiscoverService } from '@/server/services/discover';
import { translation } from '@/server/translation'; import { translation } from '@/server/translation';
import { AssistantCategory } from '@/types/discover'; import { AssistantCategory } from '@/types/discover';
import { isMobileDevice } from '@/utils/responsive'; import { isMobileDevice } from '@/utils/responsive';
import List from '../features/List'; import List from '../features/List';
type Props = { params: { slug: AssistantCategory }; searchParams: { hl?: Locales } }; type Props = { params: { slug: AssistantCategory }; searchParams: { hl?: Locales } };
export const generateMetadata = async ({ params, searchParams }: Props) => { export const generateMetadata = async ({ params, searchParams }: Props) => {
const { t, locale } = await translation('metadata', searchParams?.hl); const { t, locale } = await translation('metadata', searchParams?.hl);
console.log('jiangxucong---model----------------------------')
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
const list = await discoverService.getProviderList(locale); const list = await discoverService.getProviderList(locale);
const cate = list.find((cate) => cate.identifier === params.slug); const cate = list.find((cate) => cate.identifier === params.slug);
@ -36,12 +37,12 @@ const Page = async ({ params, searchParams }: Props) => {
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
const list = await discoverService.getProviderList(locale); const list = await discoverService.getProviderList(locale);
const cate = list.find((cate) => cate.identifier === params.slug); const cate = list.find((cate) => cate.identifier === params.slug);
console.log(params.slug,3333333)
const items = await discoverService.getModelCategory(locale, params.slug); const items = await discoverService.getModelCategory(locale, params.slug);
const ld = ldModule.generate({ const ld = ldModule.generate({
description: t('discover.models.description'), description: t('discover.models.description'),
title: [cate?.meta.title, t('discover.models.title')].join(' · '), title: [cate?.meta.title, t('discover.models.title')].join(' · '),
url: urlJoin('/discover/models', params.slug + '?userid=' + searchParams.userid), url: urlJoin('/discover/models', params.slug),
webpage: { webpage: {
enable: true, enable: true,
search: '/discover/search', search: '/discover/search',

@ -1,14 +1,14 @@
import { ModelIcon } from '@lobehub/icons'; import { ModelIcon } from '@lobehub/icons';
import { Typography, App } from 'antd'; import { Typography } from 'antd';
import { createStyles } from 'antd-style'; import { createStyles } from 'antd-style';
import { memo, useState } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Flexbox, FlexboxProps } from 'react-layout-kit'; import { Flexbox, FlexboxProps } from 'react-layout-kit';
import { useUserStore } from '@/store/user';
import { DiscoverModelItem } from '@/types/discover'; import { DiscoverModelItem } from '@/types/discover';
import { StarOutlined } from '@ant-design/icons';
import ModelFeatureTags from '../../../features/ModelFeatureTags'; import ModelFeatureTags from '../../../features/ModelFeatureTags';
import request from '@/app/api/request';
const { Paragraph, Title } = Typography; const { Paragraph, Title } = Typography;
const useStyles = createStyles(({ css, token, isDarkMode }) => ({ const useStyles = createStyles(({ css, token, isDarkMode }) => ({
@ -65,79 +65,17 @@ const useStyles = createStyles(({ css, token, isDarkMode }) => ({
token: css` token: css`
font-family: ${token.fontFamilyCode}; font-family: ${token.fontFamilyCode};
`, `,
collectBtn: css`
font-size: 12px;
width: 20px;
height: 20px;
line-height: 20px;
border-radius: 50%;
background: #FFF3D9;
text-align: center;
`,
})); }));
export interface ModelCardProps extends DiscoverModelItem, FlexboxProps { export interface ModelCardProps extends DiscoverModelItem, FlexboxProps {
showCategory?: boolean; showCategory?: boolean;
} }
const ModelCard = memo<ModelCardProps>(({ className, meta, socialData, identifier, ...rest }) => { const ModelCard = memo<ModelCardProps>(({ className, meta, identifier, ...rest }) => {
const { title, description, functionCall, vision, tokens, category, id, displayName, enabled } = meta; const { description, title, functionCall, vision, tokens } = meta;
const { conversations, likes, tokens: socialDataToken } = socialData;
// console.log(socialDataToken,"7373736262626----------------------------",meta)
const { createdAt, providers, suggestions, status, classify } = {...rest}
const { t } = useTranslation('models'); const { t } = useTranslation('models');
const { t:d } = useTranslation('discover');
const { cx, styles } = useStyles(); const { cx, styles } = useStyles();
const { message } = App.useApp();
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
const [val, setVal] = useState(status)
const handleCollect = (e) => {
console.log(e,8844848)
e.preventDefault()
e.stopPropagation()
const params = {
"identifier": identifier,
"metaId": id,
"displayname": displayName,
"description": description,
"title": title,
"conversations": conversations,
"enabled": enabled,
"metaTokens": tokens,
"createdAt": createdAt,
"tokens": socialDataToken,
"suggestions": suggestions.join(','),
"category": category,
"providers": providers.join(','),
"likes": likes,
"userid": userId,
}
request({
url: "/flxai/api/robot/appaimodel",
method: "post",
data: params
}).then(response => {
console.log(response,222222222)
if (response.code == 0) {
message.success(d('collectSuccess'));
setVal("1")
}
}).catch(error => {
console.error('Error fetching data: ', error);
})
}
const renderElement = () => {
if (classify != 'collect') {
if(val == "1") {
return <div className={styles.collectBtn} onClick={(e) => {e.stopPropagation()}}><StarOutlined style={{color: '#FFAD01'}}/></div>
} else {
return <div className={styles.collectBtn} style={{background: '#F1F1F1'}} onClick={(e) => handleCollect(e)}><StarOutlined style={{color: '#D6D6D6'}}/></div>
}
} else {
return;
}
};
return ( return (
<Flexbox className={cx(styles.container, className)} gap={24} key={identifier} {...rest}> <Flexbox className={cx(styles.container, className)} gap={24} key={identifier} {...rest}>
<Flexbox <Flexbox
@ -168,10 +106,8 @@ const ModelCard = memo<ModelCardProps>(({ className, meta, socialData, identifie
{t(`${identifier}.description`)} {t(`${identifier}.description`)}
</Paragraph> </Paragraph>
)} )}
<Flexbox gap={6} horizontal style={{ flexWrap: 'wrap',justifyContent: 'space-between' }}>
<ModelFeatureTags functionCall={functionCall} tokens={tokens} vision={vision} /> <ModelFeatureTags functionCall={functionCall} tokens={tokens} vision={vision} />
{renderElement()}
</Flexbox>
</Flexbox> </Flexbox>
</Flexbox> </Flexbox>
); );

@ -4,13 +4,13 @@ import { ProviderIcon } from '@lobehub/icons';
import { Icon } from '@lobehub/ui'; import { Icon } from '@lobehub/ui';
import { MenuProps } from 'antd'; import { MenuProps } from 'antd';
import { useTheme } from 'antd-style'; import { useTheme } from 'antd-style';
import { LayoutPanelTop,Star } from 'lucide-react'; import { LayoutPanelTop } from 'lucide-react';
import Link from 'next/link'; import Link from 'next/link';
import { usePathname } from 'next/navigation'; import { usePathname } from 'next/navigation';
import { memo, useMemo } from 'react'; import { memo, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useUserStore } from '@/store/user';
import { useQueryRoute } from '@/hooks/useQueryRoute'; import { useQueryRoute } from '@/hooks/useQueryRoute';
import { DiscoverProviderItem } from '@/types/discover'; import { DiscoverProviderItem } from '@/types/discover';
@ -26,26 +26,20 @@ const Category = memo<{ data: DiscoverProviderItem[] }>(({ data }) => {
}, [pathname]); }, [pathname]);
const router = useQueryRoute(); const router = useQueryRoute();
const theme = useTheme(); const theme = useTheme();
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
const { t } = useTranslation('discover'); const { t } = useTranslation('discover');
const items: MenuProps['items'] = [ const items: MenuProps['items'] = [
{ {
icon: <Icon color="#003BFF" icon={LayoutPanelTop} size={ICON_SIZE} />, icon: <Icon color={theme.colorTextSecondary} icon={LayoutPanelTop} size={ICON_SIZE} />,
key: 'all', key: 'all',
label: t('category.plugin.all'), label: t('category.plugin.all'),
}, },
{
icon: <Icon color="#FFAD01" icon={Star} size={ICON_SIZE} />,
key: 'collect',
label: t('category.plugin.collect'),
},
...data.map((item) => ({ ...data.map((item) => ({
icon: ( icon: (
<ProviderIcon <ProviderIcon
provider={item.identifier} provider={item.identifier}
size={18} size={18}
style={{ color: "#2A4DFF" }} style={{ color: theme.colorTextSecondary }}
type={'mono'} type={'mono'}
/> />
), ),

@ -5,15 +5,14 @@ import Link from 'next/link';
import { memo } from 'react'; import { memo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useRouter } from 'next/navigation';
import { DiscoverModelItem } from '@/types/discover'; import { DiscoverModelItem } from '@/types/discover';
import { Grid } from '@lobehub/ui';
import SearchResultCount from '../../../components/SearchResultCount'; import SearchResultCount from '../../../components/SearchResultCount';
import Title from '../../../components/Title'; import Title from '../../../components/Title';
import VirtuosoGridList from '../../../components/VirtuosoGridList'; import VirtuosoGridList from '../../../components/VirtuosoGridList';
import Card from './Card'; import Card from './Card';
import request from '@/app/api/request';
import { useUserStore } from '@/store/user';
export interface ListProps { export interface ListProps {
category?: string; category?: string;
items?: DiscoverModelItem[]; items?: DiscoverModelItem[];
@ -21,54 +20,9 @@ export interface ListProps {
searchKeywords?: string; searchKeywords?: string;
} }
const List = memo<ListProps>(async ({ category, searchKeywords, items = [] }) => { const List = memo<ListProps>(({ category, searchKeywords, items = [] }) => {
const { t } = useTranslation('discover'); const { t } = useTranslation('discover');
const router = useRouter()
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
console.log(userId,'models---3837373266262266')
console.log('models---99999999',items)
if(category == "collect") {
const res = await request({
url: "/flxai/api/robot/appaimodel/getAllAiModel",
method: "get",
params: {
userid: userId
}
})
items = res.data;
items = items.map((item,index)=> {
item.classify = 'collect';
return item
})
} else {
const res = await request({
url: "/flxai/api/robot/appaimodel/getAllAiModel",
method: "get",
params: {
userid: userId
}
})
const array2Object = {};
res?.data?.forEach(item => {
array2Object[item.identifier] = item;
});
items = items.map((item,index)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
console.log('3838383838',matchingItem);
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
})
}
const handleClickCard = (item) => {
console.log(item)
router.push(urlJoin('/discover/model/', item.identifier))
}
if (searchKeywords) { if (searchKeywords) {
if (!items || items?.length === 0) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />; if (!items || items?.length === 0) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />;
return ( return (
@ -78,9 +32,9 @@ const List = memo<ListProps>(async ({ category, searchKeywords, items = [] }) =>
data={items} data={items}
initialItemCount={24} initialItemCount={24}
itemContent={(_, item) => ( itemContent={(_, item) => (
// <Link href={urlJoin('/discover/model/', item.identifier)} key={item.identifier}> <Link href={urlJoin('/discover/model/', item.identifier)} key={item.identifier}>
<Card onClick={() => handleClickCard(item)} showCategory {...item} /> <Card showCategory {...item} />
// </Link> </Link>
)} )}
style={{ style={{
minHeight: '75vh', minHeight: '75vh',
@ -92,34 +46,19 @@ const List = memo<ListProps>(async ({ category, searchKeywords, items = [] }) =>
return ( return (
<> <>
{category == "collect"?( <Title tag={items.length}>{t('models.list')}</Title>
<> <VirtuosoGridList
<Title tag={items.length}></Title> data={items}
<Grid maxItemWidth={280} rows={4}> initialItemCount={24}
{items.map((item) => ( itemContent={(_, item) => (
// <Link href={urlJoin('/discover/assistant/', item.identifier)} key={item.identifier}> <Link href={urlJoin('/discover/model/', item.identifier)} key={item.identifier}>
<Card onClick={() => handleClickCard(item)} showCategory={!category} {...item} /> <Card showCategory={!category} {...item} />
// </Link> </Link>
))} )}
</Grid> style={{
</> minHeight: '75vh',
):( }}
<> />
<Title tag={items.length}>{t('models.list')}</Title>
<VirtuosoGridList
data={items}
initialItemCount={24}
itemContent={(_, item) => (
// <Link href={urlJoin('/discover/model/', item.identifier)} key={item.identifier}>
<Card onClick={() => handleClickCard(item)} showCategory={!category} {...item} />
// </Link>
)}
style={{
minHeight: '75vh',
}}
/>
</>
)}
</> </>
); );
}); });

@ -8,7 +8,7 @@ import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive'; import { isMobileDevice } from '@/utils/responsive';
import List from './features/List'; import List from './features/List';
import urlJoin from 'url-join';
type Props = { searchParams: { hl?: Locales } }; type Props = { searchParams: { hl?: Locales } };
export const generateMetadata = async ({ searchParams }: Props) => { export const generateMetadata = async ({ searchParams }: Props) => {
@ -26,14 +26,14 @@ export const generateMetadata = async ({ searchParams }: Props) => {
const Page = async ({ searchParams }: Props) => { const Page = async ({ searchParams }: Props) => {
const { t, locale } = await translation('metadata', searchParams?.hl); const { t, locale } = await translation('metadata', searchParams?.hl);
const mobile = isMobileDevice(); const mobile = isMobileDevice();
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
const items = await discoverService.getModelList(locale); const items = await discoverService.getModelList(locale);
console.log(8272772727,'jiangxucong')
const ld = ldModule.generate({ const ld = ldModule.generate({
description: t('discover.models.description'), description: t('discover.models.description'),
title: t('discover.models.title'), title: t('discover.models.title'),
url: urlJoin('/discover/models?userid=',searchParams.userid), url: '/discover/models',
webpage: { webpage: {
enable: true, enable: true,
search: '/discover/search', search: '/discover/search',

@ -8,6 +8,7 @@ import { DiscoverService } from '@/server/services/discover';
import { translation } from '@/server/translation'; import { translation } from '@/server/translation';
import { PluginCategory } from '@/types/discover'; import { PluginCategory } from '@/types/discover';
import { isMobileDevice } from '@/utils/responsive'; import { isMobileDevice } from '@/utils/responsive';
import List from '../features/List'; import List from '../features/List';
type Props = { params: { slug: PluginCategory }; searchParams: { hl?: Locales } }; type Props = { params: { slug: PluginCategory }; searchParams: { hl?: Locales } };
@ -29,12 +30,14 @@ const Page = async ({ params, searchParams }: Props) => {
const { t, locale } = await translation('metadata', searchParams?.hl); const { t, locale } = await translation('metadata', searchParams?.hl);
const { t: td } = await translation('discover', searchParams?.hl); const { t: td } = await translation('discover', searchParams?.hl);
const mobile = isMobileDevice(); const mobile = isMobileDevice();
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
const items = await discoverService.getPluginCategory(locale, params.slug); const items = await discoverService.getPluginCategory(locale, params.slug);
const ld = ldModule.generate({ const ld = ldModule.generate({
description: t('discover.plugins.description'), description: t('discover.plugins.description'),
title: [td(`category.plugin.${params.slug}`), t('discover.plugins.title')].join(' · '), title: [td(`category.plugin.${params.slug}`), t('discover.plugins.title')].join(' · '),
url: urlJoin('/discover/plugins', params.slug + '?userid=' + searchParams.userid), url: urlJoin('/discover/plugins', params.slug),
webpage: { webpage: {
enable: true, enable: true,
search: '/discover/search', search: '/discover/search',

@ -1,19 +1,18 @@
import { Avatar, Tag } from '@lobehub/ui'; import { Avatar, Tag } from '@lobehub/ui';
import { Skeleton, Typography, App } from 'antd'; import { Skeleton, Typography } from 'antd';
import { createStyles } from 'antd-style'; import { createStyles } from 'antd-style';
import { startCase } from 'lodash-es'; import { startCase } from 'lodash-es';
import dynamic from 'next/dynamic'; import dynamic from 'next/dynamic';
import qs from 'query-string'; import qs from 'query-string';
import { memo, useState } from 'react'; import { memo } from 'react';
import { Center, Flexbox, FlexboxProps } from 'react-layout-kit'; import { Center, Flexbox, FlexboxProps } from 'react-layout-kit';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useTranslation } from 'react-i18next';
import { DiscoverPlugintem } from '@/types/discover'; import { DiscoverPlugintem } from '@/types/discover';
import { useUserStore } from '@/store/user';
import CardBanner from '../../../components/CardBanner'; import CardBanner from '../../../components/CardBanner';
import { useCategoryItem } from './useCategory'; import { useCategoryItem } from './useCategory';
import { StarOutlined } from '@ant-design/icons';
import request from '@/app/api/request';
const Link = dynamic(() => import('next/link'), { const Link = dynamic(() => import('next/link'), {
loading: () => <Skeleton.Button size={'small'} style={{ height: 22 }} />, loading: () => <Skeleton.Button size={'small'} style={{ height: 22 }} />,
ssr: false, ssr: false,
@ -62,15 +61,6 @@ const useStyles = createStyles(({ css, token, isDarkMode }) => ({
font-size: 18px !important; font-size: 18px !important;
font-weight: bold; font-weight: bold;
`, `,
collectBtn: css`
font-size: 12px;
width: 20px;
height: 20px;
line-height: 20px;
border-radius: 50%;
background: #FFF3D9;
text-align: center;
`,
})); }));
interface PluginCardProps interface PluginCardProps
@ -83,63 +73,10 @@ interface PluginCardProps
const PluginCard = memo<PluginCardProps>( const PluginCard = memo<PluginCardProps>(
({ className, showCategory, meta, createdAt, author, variant, ...rest }) => { ({ className, showCategory, meta, createdAt, author, variant, ...rest }) => {
const { avatar, title, description, tags = [], category } = meta; const { avatar, title, description, tags = [], category } = meta;
const { createAt, homepage, identifier, schemaVersion, status, classify, manifest,locale } = {...rest}
const categoryItem = useCategoryItem(category, 12); const categoryItem = useCategoryItem(category, 12);
const { cx, styles, theme } = useStyles(); const { cx, styles, theme } = useStyles();
const { t } = useTranslation('discover');
const { message } = App.useApp();
const isCompact = variant === 'compact'; const isCompact = variant === 'compact';
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
console.log(status,"9383737-------------------------------------")
console.log(manifest,locale,"plugins9999999999-------------------")
const [val, setVal] = useState('')
const handleCollect = (e) => {
console.log(e,8844848)
e.preventDefault()
e.stopPropagation()
const params = {
"author": author,
"createdAt": createdAt,
"homepage": homepage,
"identifier": identifier,
"avatar": avatar,
"description": description,
"tags": tags.join(','),
"title": title,
"category": category,
"schemaVersion": schemaVersion,
"manifest": manifest,
"locale": locale,
"userid": userId,
}
request({
url: "/flxai/api/robot/appaiplugin",
method: "post",
data: params
}).then(response => {
console.log(response,222222222)
if (response.code == 0) {
message.success(t('collectSuccess'));
setVal("1")
}
}).catch(error => {
console.error('Error fetching data: ', error);
})
}
const renderElement = () => {
console.log(classify,'66666----------------------')
if (classify != 'collect') {
console.log(status,"222222222--------------------------")
if(status == "1" || val == "1") {
return <div className={styles.collectBtn} onClick={(e) => {e.stopPropagation()}}><StarOutlined style={{color: '#FFAD01'}}/></div>
} else {
return <div className={styles.collectBtn} style={{background: '#F1F1F1'}} onClick={(e) => handleCollect(e)}><StarOutlined style={{color: '#D6D6D6'}}/></div>
}
} else {
return;
}
};
return ( return (
<Flexbox className={cx(styles.container, className)} gap={24} {...rest}> <Flexbox className={cx(styles.container, className)} gap={24} {...rest}>
{!isCompact && <CardBanner avatar={avatar} />} {!isCompact && <CardBanner avatar={avatar} />}
@ -184,28 +121,29 @@ const PluginCard = memo<PluginCardProps>(
<Paragraph className={styles.desc} ellipsis={{ rows: 2 }}> <Paragraph className={styles.desc} ellipsis={{ rows: 2 }}>
{description} {description}
</Paragraph> </Paragraph>
<Flexbox gap={6} horizontal style={{ flexWrap: 'wrap',justifyContent: 'space-between' }}> <Flexbox gap={6} horizontal style={{ flexWrap: 'wrap' }}>
<div onClick={(e) => {e.stopPropagation()}} style={{width: '85%'}}> {showCategory && categoryItem ? (
{showCategory && categoryItem ? ( <Link href={urlJoin('/discover/plugins', categoryItem.key)}>
<Tag icon={categoryItem.icon} style={{ margin: '0 5' }}> <Tag icon={categoryItem.icon} style={{ margin: 0 }}>
{categoryItem.label} {categoryItem.label}
</Tag> </Tag>
) : ( </Link>
tags ) : (
.slice(0, 4) tags
.filter(Boolean) .slice(0, 4)
.map((tag: string, index) => { .filter(Boolean)
const url = qs.stringifyUrl({ .map((tag: string, index) => {
query: { q: tag, type: 'plugins' }, const url = qs.stringifyUrl({
url: '/discover/search', query: { q: tag, type: 'plugins' },
}); url: '/discover/search',
return ( });
<Tag style={{ margin: '0 5' }}>{startCase(tag).trim()}</Tag> return (
); <Link href={url} key={index}>
}) <Tag style={{ margin: 0 }}>{startCase(tag).trim()}</Tag>
)} </Link>
</div> );
{renderElement()} })
)}
</Flexbox> </Flexbox>
</Flexbox> </Flexbox>
</Flexbox> </Flexbox>

@ -7,7 +7,7 @@ import urlJoin from 'url-join';
import { useQueryRoute } from '@/hooks/useQueryRoute'; import { useQueryRoute } from '@/hooks/useQueryRoute';
import { PluginCategory } from '@/types/discover'; import { PluginCategory } from '@/types/discover';
import { useUserStore } from '@/store/user';
import CategoryMenu from '../../../components/CategoryMenu'; import CategoryMenu from '../../../components/CategoryMenu';
import { useCategory } from './useCategory'; import { useCategory } from './useCategory';
@ -21,8 +21,7 @@ const Category = memo(() => {
return 'all'; return 'all';
}, [pathname]); }, [pathname]);
const router = useQueryRoute(); const router = useQueryRoute();
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
return ( return (
<CategoryMenu <CategoryMenu
items={items.map((item: any) => ({ items={items.map((item: any) => ({

@ -3,18 +3,17 @@
import { Grid } from '@lobehub/ui'; import { Grid } from '@lobehub/ui';
import { Empty } from 'antd'; import { Empty } from 'antd';
import Link from 'next/link'; import Link from 'next/link';
import { memo, useMemo, useEffect,useState } from 'react'; import { memo, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import urlJoin from 'url-join'; import urlJoin from 'url-join';
import { useRouter } from 'next/navigation';
import { DiscoverPlugintem } from '@/types/discover'; import { DiscoverPlugintem } from '@/types/discover';
import SearchResultCount from '../../../components/SearchResultCount'; import SearchResultCount from '../../../components/SearchResultCount';
import Title from '../../../components/Title'; import Title from '../../../components/Title';
import VirtuosoGridList from '../../../components/VirtuosoGridList'; import VirtuosoGridList from '../../../components/VirtuosoGridList';
import Card from './Card'; import Card from './Card';
import request from '@/app/api/request';
import { useUserStore } from '@/store/user';
export interface ListProps { export interface ListProps {
category?: string; category?: string;
items: DiscoverPlugintem[]; items: DiscoverPlugintem[];
@ -24,68 +23,14 @@ export interface ListProps {
const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] }) => { const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] }) => {
const { t } = useTranslation('discover'); const { t } = useTranslation('discover');
const router = useRouter()
const [stData, setStData] = useState(items)
const recentLength = mobile ? 4 : 8; const recentLength = mobile ? 4 : 8;
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
console.log(userId,'chajian---3837373266262266')
console.log('chajian33333333--------------',items)
const { all, recent, last } = useMemo(() => { const { all, recent, last } = useMemo(() => {
return { return {
all: stData, all: items,
last: stData.slice(recentLength), last: items.slice(recentLength),
recent: stData.slice(0, recentLength), recent: items.slice(0, recentLength),
};
}, [stData, mobile]);
useEffect(() => {
const fetchData = async() => {
if(category == "collect") {
const res = await request({
url: "/flxai/api/robot/appaiplugin/getAllAiPlugin",
method: "get",
params: {
userid: userId
}
})
setStData(res?.data.map((item,index)=> {
item.classify = 'collect';
return item
}))
} else {
const res = await request({
url: "/flxai/api/robot/appaiplugin/getAllAiPlugin",
method: "get",
params: {
userid: userId
}
})
const array2Object = {};
res?.data?.forEach((item) => {
array2Object[item.identifier] = item;
});
console.log('chajian22222222222222222222222222222--------------')
setStData(stData.map((item,index)=> {
const matchingItem = array2Object[item.identifier];
if (matchingItem) {
matchingItem.status = '1';
return matchingItem
} else {
item.status = '0';
return item
}
}))
}
}; };
fetchData(); }, [items, mobile]);
}, []); // 空数组[]意味着仅在组件挂载时调用一次
console.log('chajian999999999999999--------------',stData)
const handleClickCard = (item) => {
console.log(item)
router.push(urlJoin('/discover/plugin/', item.identifier))
}
if (searchKeywords) { if (searchKeywords) {
if (!items || items?.length === 0) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />; if (!items || items?.length === 0) return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />;
@ -96,7 +41,9 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
data={all} data={all}
initialItemCount={24} initialItemCount={24}
itemContent={(_, item) => ( itemContent={(_, item) => (
<Card onClick={() => handleClickCard(item)} showCategory variant={'compact'} {...item} /> <Link href={urlJoin('/discover/plugin/', item.identifier)} key={item.identifier}>
<Card showCategory variant={'compact'} {...item} />
</Link>
)} )}
style={{ style={{
minHeight: '75vh', minHeight: '75vh',
@ -108,40 +55,29 @@ const List = memo<ListProps>(({ category, mobile, searchKeywords, items = [] })
return ( return (
<> <>
{category == "collect"?( <Title>{t('plugins.recentSubmits')}</Title>
<> <Grid maxItemWidth={280} rows={4}>
<Title tag={all.length}></Title> {recent.map((item) => (
<Grid maxItemWidth={280} rows={4}> <Link href={urlJoin('/discover/plugin/', item.identifier)} key={item.identifier}>
{all?.map((item) => ( <Card showCategory={!category} {...item} />
// <Link href={urlJoin('/discover/assistant/', item.identifier)} key={item.identifier}> </Link>
<Card onClick={() => handleClickCard(item)} showCategory={!category} {...item} /> ))}
// </Link> </Grid>
))} {last && last?.length > 0 && (
</Grid>
</>
):(
<> <>
<Title>{t('plugins.recentSubmits')}</Title> <Title tag={last.length}>{t('plugins.list')}</Title>
<Grid maxItemWidth={280} rows={4}> <VirtuosoGridList
{recent?.map((item) => ( data={last}
<Card onClick={() => handleClickCard(item)} showCategory={!category} {...item} /> initialItemCount={12}
))} itemContent={(_, item) => (
</Grid> <Link href={urlJoin('/discover/plugin/', item.identifier)} key={item.identifier}>
{last && last?.length > 0 && ( <Card showCategory={!category} variant={'compact'} {...item} />
<> </Link>
<Title tag={last.length}>{t('plugins.list')}</Title> )}
<VirtuosoGridList style={{
data={last} minHeight: '75vh',
initialItemCount={12} }}
itemContent={(_, item) => ( />
<Card onClick={() => handleClickCard(item)} showCategory={!category} variant={'compact'} {...item} />
)}
style={{
minHeight: '75vh',
}}
/>
</>
)}
</> </>
)} )}
</> </>

@ -37,42 +37,42 @@ export const useCategory = (fontsize?: number) => {
label: t('category.plugin.collect'), label: t('category.plugin.collect'),
}, },
{ {
icon: <Icon color="#FF4D4D" icon={ImagePlay} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={ImagePlay} size={size} />,
key: PluginCategory.MediaGenerate, key: PluginCategory.MediaGenerate,
label: t('category.plugin.media-generate'), label: t('category.plugin.media-generate'),
}, },
{ {
icon: <Icon color="#5BD941" icon={ScanSearch} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={ScanSearch} size={size} />,
key: PluginCategory.WebSearch, key: PluginCategory.WebSearch,
label: t('category.plugin.web-search'), label: t('category.plugin.web-search'),
}, },
{ {
icon: <Icon color="#FF34AD" icon={Receipt} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={Receipt} size={size} />,
key: PluginCategory.StocksFinance, key: PluginCategory.StocksFinance,
label: t('category.plugin.stocks-finance'), label: t('category.plugin.stocks-finance'),
}, },
{ {
icon: <Icon color="#FF9B06" icon={PocketKnife} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={PocketKnife} size={size} />,
key: PluginCategory.Tools, key: PluginCategory.Tools,
label: t('category.plugin.tools'), label: t('category.plugin.tools'),
}, },
{ {
icon: <Icon color="#0095FF" icon={Umbrella} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={Umbrella} size={size} />,
key: PluginCategory.LifeStyle, key: PluginCategory.LifeStyle,
label: t('category.plugin.life-style'), label: t('category.plugin.life-style'),
}, },
{ {
icon: <Icon color="#00B0CB" icon={MicroscopeIcon} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={MicroscopeIcon} size={size} />,
key: PluginCategory.ScienceEducation, key: PluginCategory.ScienceEducation,
label: t('category.plugin.science-education'), label: t('category.plugin.science-education'),
}, },
{ {
icon: <Icon color="#E138FF" icon={TwitterIcon} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={TwitterIcon} size={size} />,
key: PluginCategory.Social, key: PluginCategory.Social,
label: t('category.plugin.social'), label: t('category.plugin.social'),
}, },
{ {
icon: <Icon color="#0CD66D" icon={Gamepad2} size={size} />, icon: <Icon color={theme.colorTextSecondary} icon={Gamepad2} size={size} />,
key: PluginCategory.GamingEntertainment, key: PluginCategory.GamingEntertainment,
label: t('category.plugin.gaming-entertainment'), label: t('category.plugin.gaming-entertainment'),
}, },

@ -5,8 +5,9 @@ import { metadataModule } from '@/server/metadata';
import { DiscoverService } from '@/server/services/discover'; import { DiscoverService } from '@/server/services/discover';
import { translation } from '@/server/translation'; import { translation } from '@/server/translation';
import { isMobileDevice } from '@/utils/responsive'; import { isMobileDevice } from '@/utils/responsive';
import List from './features/List'; import List from './features/List';
import urlJoin from 'url-join';
type Props = { searchParams: { hl?: Locales } }; type Props = { searchParams: { hl?: Locales } };
export const generateMetadata = async ({ searchParams }: Props) => { export const generateMetadata = async ({ searchParams }: Props) => {
@ -24,14 +25,14 @@ export const generateMetadata = async ({ searchParams }: Props) => {
const Page = async ({ searchParams }: Props) => { const Page = async ({ searchParams }: Props) => {
const { t, locale } = await translation('metadata', searchParams?.hl); const { t, locale } = await translation('metadata', searchParams?.hl);
const mobile = isMobileDevice(); const mobile = isMobileDevice();
const discoverService = new DiscoverService(); const discoverService = new DiscoverService();
console.log(searchParams.userid,'plugins555555555555-----------------')
const items = await discoverService.getPluginList(locale); const items = await discoverService.getPluginList(locale);
const ld = ldModule.generate({ const ld = ldModule.generate({
description: t('discover.plugins.description'), description: t('discover.plugins.description'),
title: t('discover.plugins.title'), title: t('discover.plugins.title'),
url: urlJoin('/discover/plugins?userid=',searchParams.userid), url: '/discover/plugins',
webpage: { webpage: {
enable: true, enable: true,
search: '/discover/search', search: '/discover/search',

@ -9,7 +9,7 @@ const Layout = ({ children }: PropsWithChildren) => {
return ( return (
<> <>
<NProgress /> <NProgress />
<Flexbox height={'100%'} style={{ overflow: 'hidden', position: 'relative',marginTop: '-64px' }} width={'100%'}> <Flexbox height={'100%'} style={{ overflow: 'hidden', position: 'relative' }} width={'100%'}>
<Header /> <Header />
{children} {children}
</Flexbox> </Flexbox>

@ -13,7 +13,7 @@ import { useQueryRoute } from '@/hooks/useQueryRoute';
import { DiscoverTab } from '@/types/discover'; import { DiscoverTab } from '@/types/discover';
import { useNav } from './useNav'; import { useNav } from './useNav';
import { useUserStore } from '@/store/user';
export const useStyles = createStyles(({ css, prefixCls, token }) => ({ export const useStyles = createStyles(({ css, prefixCls, token }) => ({
active: css` active: css`
box-shadow: ${token.boxShadow}; box-shadow: ${token.boxShadow};
@ -41,16 +41,15 @@ const StoreSearchBar = memo<StoreSearchBarProps>(({ mobile, onBlur, onFocus, ...
const router = useQueryRoute(); const router = useQueryRoute();
const activeType = activeKey === DiscoverTab.Home ? DiscoverTab.Assistants : activeKey; const activeType = activeKey === DiscoverTab.Home ? DiscoverTab.Assistants : activeKey;
const getUserId = (s: UserStore) => s.user?.id
const userId = getUserId(useUserStore.getState())
useEffect(() => { useEffect(() => {
if (!pathname.includes('/discover/search')) return; if (!pathname.includes('/discover/search')) return;
// 使用 useQueryState 时,当 handleSearch 为空时无法回跳 // 使用 useQueryState 时,当 handleSearch 为空时无法回跳
if (!q) router.push(urlJoin('/discover', activeType), { query: { userid: userId }, replace: true }); if (!q) router.push(urlJoin('/discover', activeType), { query: { userid: localStorage.getItem('userId') }, replace: true });
}, [q, pathname, activeType]); }, [q, pathname, activeType]);
const handleSearch = (value: string) => { const handleSearch = (value: string) => {
router.push('/discover/search', { query: { q: value, type: activeType, userid: userId } }); router.push('/discover/search', { query: { q: value, type: activeType, userid: localStorage.getItem('userId') } });
}; };
return ( return (

@ -19,7 +19,6 @@ export default {
try: '试一下', try: '试一下',
}, },
back: '返回发现', back: '返回发现',
collectSuccess: '收藏成功',
category: { category: {
assistant: { assistant: {
'all': "全部", 'all': "全部",

@ -96,7 +96,7 @@ export const createCommonSlice: StateCreator<
data.avatar || data.userId data.avatar || data.userId
? merge(get().user, { avatar: data.avatar, id: data.userId }) ? merge(get().user, { avatar: data.avatar, id: data.userId })
: get().user; : get().user;
console.log(user,'777777777777777777777777')
set( set(
{ {
defaultSettings, defaultSettings,

Loading…
Cancel
Save