mirror of
https://github.com/cupcakearmy/nicco.io.git
synced 2024-12-22 08:06:29 +00:00
search
This commit is contained in:
parent
44224ffb85
commit
b465c067d9
@ -9219,6 +9219,11 @@ export type GQLPostsOneQueryVariables = Exact<{
|
|||||||
|
|
||||||
export type GQLPostsOneQuery = { readonly __typename?: 'RootQuery', readonly post: { readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } } };
|
export type GQLPostsOneQuery = { readonly __typename?: 'RootQuery', readonly post: { readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } } };
|
||||||
|
|
||||||
|
export type GQLSearchQueryVariables = Exact<{ [key: string]: never; }>;
|
||||||
|
|
||||||
|
|
||||||
|
export type GQLSearchQuery = { readonly __typename?: 'RootQuery', readonly posts: { readonly __typename?: 'RootQueryToPostConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> }, readonly projects: { readonly __typename?: 'RootQueryToProjectConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Project', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly project: { readonly __typename?: 'Project_Project', readonly date: string, readonly link: string, readonly description: string } }> }, readonly works: { readonly __typename?: 'RootQueryToWorkConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Work', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly work: { readonly __typename?: 'Work_Work', readonly date: string, readonly link: string, readonly role: string, readonly image: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> } };
|
||||||
|
|
||||||
export const BasePageFragmentDoc = gql`
|
export const BasePageFragmentDoc = gql`
|
||||||
fragment BasePage on Page {
|
fragment BasePage on Page {
|
||||||
id
|
id
|
||||||
@ -9362,6 +9367,27 @@ export const PostsOneDocument = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
${BasePostFragmentDoc}`;
|
${BasePostFragmentDoc}`;
|
||||||
|
export const SearchDocument = gql`
|
||||||
|
query Search {
|
||||||
|
posts(first: 100) {
|
||||||
|
nodes {
|
||||||
|
...BasePost
|
||||||
|
}
|
||||||
|
}
|
||||||
|
projects(first: 100) {
|
||||||
|
nodes {
|
||||||
|
...BaseProject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
works(first: 100) {
|
||||||
|
nodes {
|
||||||
|
...BaseWork
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
${BasePostFragmentDoc}
|
||||||
|
${BaseProjectFragmentDoc}
|
||||||
|
${BaseWorkFragmentDoc}`;
|
||||||
|
|
||||||
export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string) => Promise<T>;
|
export type SdkFunctionWrapper = <T>(action: (requestHeaders?:Record<string, string>) => Promise<T>, operationName: string) => Promise<T>;
|
||||||
|
|
||||||
@ -9399,6 +9425,9 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper =
|
|||||||
},
|
},
|
||||||
PostsOne(variables: GQLPostsOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<GQLPostsOneQuery> {
|
PostsOne(variables: GQLPostsOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<GQLPostsOneQuery> {
|
||||||
return withWrapper((wrappedRequestHeaders) => client.request<GQLPostsOneQuery>(PostsOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PostsOne');
|
return withWrapper((wrappedRequestHeaders) => client.request<GQLPostsOneQuery>(PostsOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PostsOne');
|
||||||
|
},
|
||||||
|
Search(variables?: GQLSearchQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise<GQLSearchQuery> {
|
||||||
|
return withWrapper((wrappedRequestHeaders) => client.request<GQLSearchQuery>(SearchDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'Search');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -125,3 +125,21 @@ query PostsOne($slug: ID!) {
|
|||||||
...BasePost
|
...BasePost
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query Search {
|
||||||
|
posts(first: 100) {
|
||||||
|
nodes {
|
||||||
|
...BasePost
|
||||||
|
}
|
||||||
|
}
|
||||||
|
projects(first: 100) {
|
||||||
|
nodes {
|
||||||
|
...BaseProject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
works(first: 100) {
|
||||||
|
nodes {
|
||||||
|
...BaseWork
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,51 +1,29 @@
|
|||||||
|
import { SDK } from '$lib/gql'
|
||||||
|
import type { GQLBasePageFragment } from '$lib/gql/gen'
|
||||||
import lunr from 'lunr'
|
import lunr from 'lunr'
|
||||||
// import { BaseAttributes, Call, gql, Page } from '$lib/api'
|
|
||||||
|
|
||||||
// function removeHTML(s: string) {
|
function removeHTML(s: string) {
|
||||||
// return s.replace(/<.*?>|\s+|&#\d+;/g, ' ').trim()
|
return s.replace(/<.*?>|\s+|&#\d+;/g, ' ').trim()
|
||||||
// }
|
}
|
||||||
|
|
||||||
// function convertForIdx(type: string, items: Page[]) {
|
function convertForIdx(type: string, items: GQLBasePageFragment[]) {
|
||||||
// const keys: (keyof Page)[] = ['title', 'content', 'slug']
|
const keys: (keyof GQLBasePageFragment)[] = ['title', 'content', 'slug']
|
||||||
// return items.map((item) => ({
|
return items.map((item) => ({
|
||||||
// url: `${type}/${item.slug}`,
|
url: `${type}/${item.slug}`,
|
||||||
// data: keys.map((field) => removeHTML(item[field] ?? '')).join(' '),
|
data: keys.map((field) => removeHTML(item[field] ?? '')).join(' '),
|
||||||
// }))
|
}))
|
||||||
// }
|
}
|
||||||
|
|
||||||
// async function getAll() {
|
|
||||||
// const all = await Call<Record<'posts' | 'projects' | 'works', { nodes: Page[] }>>(gql`
|
|
||||||
// query {
|
|
||||||
// posts(first: 1000) {
|
|
||||||
// nodes {
|
|
||||||
// ${BaseAttributes}
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// projects(first: 1000) {
|
|
||||||
// nodes {
|
|
||||||
// ${BaseAttributes}
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// works(first: 1000) {
|
|
||||||
// nodes {
|
|
||||||
// ${BaseAttributes}
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// `)
|
|
||||||
// return all
|
|
||||||
// }
|
|
||||||
|
|
||||||
export const get = async () => {
|
export const get = async () => {
|
||||||
// const all = await getAll()
|
const { __typename, ...all } = await SDK.Search()
|
||||||
// const converted = Object.entries(all)
|
const converted = Object.entries(all)
|
||||||
// .map(([type, data]) => convertForIdx(type, data.nodes))
|
.map(([type, data]) => convertForIdx(type, data.nodes))
|
||||||
// .flat()
|
.flat()
|
||||||
|
|
||||||
const idx = lunr(function () {
|
const idx = lunr(function () {
|
||||||
this.ref('url')
|
this.ref('url')
|
||||||
this.field('data')
|
this.field('data')
|
||||||
// converted.forEach((doc) => this.add(doc))
|
converted.forEach((doc) => this.add(doc))
|
||||||
})
|
})
|
||||||
|
|
||||||
return { body: idx }
|
return { body: idx }
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
export let prebuilt: any
|
export let prebuilt: any
|
||||||
let needle: string | null = null
|
let needle: string | null = null
|
||||||
let results: SearchResultItem[] = []
|
let results: SearchResultItem[] = []
|
||||||
|
let input: HTMLInputElement
|
||||||
|
|
||||||
const idx = lunr.Index.load(prebuilt)
|
const idx = lunr.Index.load(prebuilt)
|
||||||
|
|
||||||
@ -34,7 +35,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$: if (needle) {
|
$: if (needle !== null) {
|
||||||
if (typeof window !== 'undefined') {
|
if (typeof window !== 'undefined') {
|
||||||
window.history.replaceState(null, '', `/search?q=${needle ?? ''}`)
|
window.history.replaceState(null, '', `/search?q=${needle ?? ''}`)
|
||||||
}
|
}
|
||||||
@ -43,19 +44,18 @@
|
|||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
needle = new URLSearchParams(window.location.search).get('q')
|
needle = new URLSearchParams(window.location.search).get('q')
|
||||||
|
input.focus()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<SimplePage title="Search" expanded={false}>
|
<SimplePage title="Search" expanded={false}>
|
||||||
<input bind:value={needle} placeholder="needle" />
|
<input bind:this={input} bind:value={needle} placeholder="needle" />
|
||||||
{#if needle}
|
{#if needle}
|
||||||
<ul>
|
<ul>
|
||||||
{#each results as result (result.ref)}
|
{#each results as result (result.ref)}
|
||||||
<SearchResult {result} />
|
<SearchResult {result} />
|
||||||
{/each}
|
{/each}
|
||||||
</ul>
|
</ul>
|
||||||
{:else}
|
|
||||||
<p>Start typing...</p>
|
|
||||||
{/if}
|
{/if}
|
||||||
</SimplePage>
|
</SimplePage>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user