mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-09 15:05:35 +00:00
55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import Collection from '#models/collection';
|
|
import Link from '#models/link';
|
|
import { route } from '@izzyjs/route/client';
|
|
import { appendCollectionId } from '~/lib/navigation';
|
|
import { SearchItem, SearchResult } from '~/types/search';
|
|
|
|
export function buildSearchItem(
|
|
item: Collection | Link,
|
|
type: SearchItem['type']
|
|
): SearchItem {
|
|
return {
|
|
id: item.id,
|
|
name: item.name,
|
|
url:
|
|
type === 'link'
|
|
? (item as Link).url
|
|
: appendCollectionId(route('dashboard').url, item.id),
|
|
type,
|
|
collection: type === 'link' ? (item as Link).collection : undefined,
|
|
};
|
|
}
|
|
|
|
export function formatSearchItem(
|
|
item: SearchItem,
|
|
searchTerm: string
|
|
): SearchResult | null {
|
|
const lowerCaseSearchTerm = searchTerm.toLowerCase().trim();
|
|
const lowerCaseName = item.name.toLowerCase().trim();
|
|
|
|
let currentIndex = 0;
|
|
let formattedName = '';
|
|
|
|
for (const [i, element] of Object(lowerCaseName).entries()) {
|
|
if (element === lowerCaseSearchTerm[currentIndex]) {
|
|
formattedName += `<b>${item.name[i]}</b>`;
|
|
currentIndex++;
|
|
} else {
|
|
formattedName += item.name[i];
|
|
}
|
|
}
|
|
|
|
if (currentIndex !== lowerCaseSearchTerm.length) {
|
|
// Search term not fully matched
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
id: item.id,
|
|
name: <div dangerouslySetInnerHTML={{ __html: formattedName }} />,
|
|
url: item.url,
|
|
type: item.type,
|
|
collection: item.collection,
|
|
};
|
|
}
|