chore: open URL from model detail page should open in an external browser (#4611)
* chore: open URL from model detail page should open in an external browser * chore: remove unused param
This commit is contained in:
parent
404c3f096e
commit
8419973d5e
@ -1,4 +1,4 @@
|
|||||||
import { useCallback } from 'react'
|
import { useCallback, useMemo } from 'react'
|
||||||
|
|
||||||
import { ModelSource } from '@janhq/core'
|
import { ModelSource } from '@janhq/core'
|
||||||
|
|
||||||
@ -20,6 +20,8 @@ import { toGigabytes } from '@/utils/converter'
|
|||||||
|
|
||||||
import { extractModelName } from '@/utils/modelSource'
|
import { extractModelName } from '@/utils/modelSource'
|
||||||
|
|
||||||
|
import { fuzzySearch } from '@/utils/search'
|
||||||
|
|
||||||
import { mainViewStateAtom } from '@/helpers/atoms/App.atom'
|
import { mainViewStateAtom } from '@/helpers/atoms/App.atom'
|
||||||
import { assistantsAtom } from '@/helpers/atoms/Assistant.atom'
|
import { assistantsAtom } from '@/helpers/atoms/Assistant.atom'
|
||||||
import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom'
|
import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom'
|
||||||
@ -66,6 +68,11 @@ const ModelItemHeader = ({ model, onSelectedModel }: Props) => {
|
|||||||
const isDownloaded = downloadedModels.some((md) =>
|
const isDownloaded = downloadedModels.some((md) =>
|
||||||
model.models.some((m) => m.id === md.id)
|
model.models.some((m) => m.id === md.id)
|
||||||
)
|
)
|
||||||
|
const defaultModel = useMemo(() => {
|
||||||
|
return model.models?.find(
|
||||||
|
(e) => e.id.includes('q4-km') || fuzzySearch('q4km', e.id)
|
||||||
|
)
|
||||||
|
}, [model])
|
||||||
|
|
||||||
let downloadButton = (
|
let downloadButton = (
|
||||||
<div className="group flex h-8 cursor-pointer items-center justify-center rounded-md bg-[hsla(var(--primary-bg))]">
|
<div className="group flex h-8 cursor-pointer items-center justify-center rounded-md bg-[hsla(var(--primary-bg))]">
|
||||||
@ -76,19 +83,21 @@ const ModelItemHeader = ({ model, onSelectedModel }: Props) => {
|
|||||||
<span className="mx-4 font-medium text-white">Download</span>
|
<span className="mx-4 font-medium text-white">Download</span>
|
||||||
</div>
|
</div>
|
||||||
<Dropdown
|
<Dropdown
|
||||||
className="z-50 max-h-[240px] min-w-[240px] max-w-[320px] overflow-y-auto border border-[hsla(var(--app-border))] bg-[hsla(var(--app-bg))] shadow"
|
className="z-50 min-w-[240px]"
|
||||||
options={model.models?.map((e) => ({
|
options={model.models?.map((e) => ({
|
||||||
name: (
|
name: (
|
||||||
<div className="flex space-x-2">
|
<div className="flex space-x-2">
|
||||||
<span className="line-clamp-1 max-w-[340px] font-normal">
|
<span className="line-clamp-1 max-w-[340px] font-normal">
|
||||||
{e.id}
|
{e.id}
|
||||||
</span>
|
</span>
|
||||||
|
{e.id === defaultModel?.id && (
|
||||||
<Badge
|
<Badge
|
||||||
theme="secondary"
|
theme="secondary"
|
||||||
className="inline-flex w-[60px] items-center font-medium"
|
className="inline-flex w-[60px] items-center font-medium"
|
||||||
>
|
>
|
||||||
<span>Default</span>
|
<span>Default</span>
|
||||||
</Badge>
|
</Badge>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
value: e.id,
|
value: e.id,
|
||||||
|
|||||||
@ -10,6 +10,8 @@ import ModelLabel from '@/containers/ModelLabel'
|
|||||||
|
|
||||||
import ModelItemHeader from '@/screens/Hub/ModelList/ModelHeader'
|
import ModelItemHeader from '@/screens/Hub/ModelList/ModelHeader'
|
||||||
|
|
||||||
|
import { markdownComponents } from '@/screens/Thread/ThreadCenterPanel/TextMessage/MarkdownUtils'
|
||||||
|
|
||||||
import { toGigabytes } from '@/utils/converter'
|
import { toGigabytes } from '@/utils/converter'
|
||||||
import { extractDescription } from '@/utils/modelSource'
|
import { extractDescription } from '@/utils/modelSource'
|
||||||
import '@/styles/components/model.scss'
|
import '@/styles/components/model.scss'
|
||||||
@ -31,7 +33,10 @@ const ModelItem: React.FC<Props> = ({ model, onSelectedModel }) => {
|
|||||||
<ModelLabel size={model.models?.[0]?.size} />
|
<ModelLabel size={model.models?.[0]?.size} />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<Markdown className="md-short-desc line-clamp-3 max-w-full overflow-hidden font-light text-[hsla(var(--text-secondary))]">
|
<Markdown
|
||||||
|
className="md-short-desc line-clamp-3 max-w-full overflow-hidden font-light text-[hsla(var(--text-secondary))]"
|
||||||
|
components={markdownComponents}
|
||||||
|
>
|
||||||
{extractDescription(model.metadata?.description) || '-'}
|
{extractDescription(model.metadata?.description) || '-'}
|
||||||
</Markdown>
|
</Markdown>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -20,6 +20,8 @@ import { useClipboard } from '@/hooks/useClipboard'
|
|||||||
|
|
||||||
import { getLanguageFromExtension } from '@/utils/codeLanguageExtension'
|
import { getLanguageFromExtension } from '@/utils/codeLanguageExtension'
|
||||||
|
|
||||||
|
import { markdownComponents } from './MarkdownUtils'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
text: string
|
text: string
|
||||||
isUser?: boolean
|
isUser?: boolean
|
||||||
@ -222,6 +224,7 @@ export const MarkdownTextMessage = memo(
|
|||||||
wrapCodeBlocksWithoutVisit,
|
wrapCodeBlocksWithoutVisit,
|
||||||
].filter((e) => !!e) as PluggableList
|
].filter((e) => !!e) as PluggableList
|
||||||
}
|
}
|
||||||
|
components={markdownComponents}
|
||||||
>
|
>
|
||||||
{preprocessMarkdown(text)}
|
{preprocessMarkdown(text)}
|
||||||
</Markdown>
|
</Markdown>
|
||||||
|
|||||||
@ -0,0 +1,14 @@
|
|||||||
|
import { Components } from 'react-markdown'
|
||||||
|
|
||||||
|
export const markdownComponents: Partial<Components> = {
|
||||||
|
a: ({ href, children, ...props }) => (
|
||||||
|
<a
|
||||||
|
target="_blank"
|
||||||
|
href={href}
|
||||||
|
className="text-[hsla(var(--app-link))]"
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</a>
|
||||||
|
),
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user