Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion web-app/src/containers/Card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export function CardItem({
)}
>
<div className="space-y-1.5">
<h1 className="font-medium line-clamp-1">{title}</h1>
<h1 className="font-medium">{title}</h1>
{description && (
<span className="text-main-view-fg/70 leading-normal">
{description}
Expand Down
2 changes: 1 addition & 1 deletion web-app/src/containers/DropdownModelProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ const DropdownModelProvider = ({ model }: DropdownModelProviderProps) => {
</span>
</button>
</DropdownMenuTrigger>
{currentModel && (
{currentModel?.settings && (
<ModelSetting
model={currentModel as Model}
provider={provider as ProviderObject}
Expand Down
102 changes: 64 additions & 38 deletions web-app/src/routes/hub.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,14 @@ function Hub() {
{}
)
const [isSearching, setIsSearching] = useState(false)
const [showOnlyDownloaded, setShowOnlyDownloaded] = useState(false)
const addModelSourceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(
null
)

const { getProviderByName } = useModelProvider()
const llamaProvider = getProviderByName('llama.cpp')

const toggleModelExpansion = (modelId: string) => {
setExpandedModels((prev) => ({
...prev,
Expand All @@ -83,16 +87,29 @@ function Hub() {

// Filtered models
const filteredModels = useMemo(() => {
// Apply additional filters here if needed
return searchValue.length
? sortedModels?.filter((e) =>
fuzzySearch(
searchValue.replace(/\s+/g, '').toLowerCase(),
e.id.toLowerCase()
)
let filtered = sortedModels

// Apply search filter
if (searchValue.length) {
filtered = filtered?.filter((e) =>
fuzzySearch(
searchValue.replace(/\s+/g, '').toLowerCase(),
e.id.toLowerCase()
)
: sortedModels
}, [searchValue, sortedModels])
)
}

// Apply downloaded filter
if (showOnlyDownloaded) {
filtered = filtered?.filter((model) =>
model.models.some((variant) =>
llamaProvider?.models.some((m: { id: string }) => m.id === variant.id)
)
)
}

return filtered
}, [searchValue, sortedModels, showOnlyDownloaded, llamaProvider?.models])

useEffect(() => {
fetchSources()
Expand Down Expand Up @@ -135,9 +152,6 @@ function Hub() {
[downloads]
)

const { getProviderByName } = useModelProvider()
const llamaProvider = getProviderByName('llama.cpp')

const navigate = useNavigate()

const handleUseModel = useCallback(
Expand Down Expand Up @@ -207,33 +221,45 @@ function Hub() {
className="w-full focus:outline-none"
/>
</div>
<DropdownMenu>
<DropdownMenuTrigger>
<span
title="Edit Theme"
className="flex cursor-pointer items-center gap-1 px-2 py-1 rounded-sm bg-main-view-fg/15 text-sm outline-none text-main-view-fg font-medium"
>
{
sortOptions.find((option) => option.value === sortSelected)
?.name
}
</span>
</DropdownMenuTrigger>
<DropdownMenuContent side="bottom" align="end">
{sortOptions.map((option) => (
<DropdownMenuItem
className={cn(
'cursor-pointer my-0.5',
sortSelected === option.value && 'bg-main-view-fg/5'
)}
key={option.value}
onClick={() => setSortSelected(option.value)}
<div className="flex items-center gap-2 shrink-0">
<DropdownMenu>
<DropdownMenuTrigger>
<span
title="Edit Theme"
className="flex cursor-pointer items-center gap-1 px-2 py-1 rounded-sm bg-main-view-fg/15 text-sm outline-none text-main-view-fg font-medium"
>
{option.name}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
{
sortOptions.find(
(option) => option.value === sortSelected
)?.name
}
</span>
</DropdownMenuTrigger>
<DropdownMenuContent side="bottom" align="end">
{sortOptions.map((option) => (
<DropdownMenuItem
className={cn(
'cursor-pointer my-0.5',
sortSelected === option.value && 'bg-main-view-fg/5'
)}
key={option.value}
onClick={() => setSortSelected(option.value)}
>
{option.name}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
<div className="flex items-center gap-2">
<Switch
checked={showOnlyDownloaded}
onCheckedChange={setShowOnlyDownloaded}
/>
<span className="text-xs text-main-view-fg/70 font-medium whitespace-nowrap">
Downloaded
</span>
</div>
</div>
</div>
</HeaderPage>
<div className="p-4 w-full h-[calc(100%-32px)] overflow-y-auto">
Expand Down
Loading