@raster-app/react 0.1.0-canary-32ca74d → 0.1.0-canary-58c063f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/use-asset-search.js
CHANGED
|
@@ -65,9 +65,11 @@ export function useAssetSearch(scope, rawQuery) {
|
|
|
65
65
|
void fetchNextPage({ cancelRefetch: false });
|
|
66
66
|
}, [hasMore, fetchNextPage]);
|
|
67
67
|
useEffect(() => {
|
|
68
|
+
if (query === debouncedQuery)
|
|
69
|
+
return;
|
|
68
70
|
const timer = setTimeout(() => setDebouncedQuery(query), SEARCH_DEBOUNCE_MS);
|
|
69
71
|
return () => clearTimeout(timer);
|
|
70
|
-
}, [query]);
|
|
72
|
+
}, [query, debouncedQuery]);
|
|
71
73
|
return {
|
|
72
74
|
active,
|
|
73
75
|
query,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-asset-search.js","sourceRoot":"","sources":["../src/use-asset-search.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"use-asset-search.js","sourceRoot":"","sources":["../src/use-asset-search.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype InfiniteData,\n\ttype QueryKey,\n\tskipToken,\n\tuseInfiniteQuery,\n} from '@tanstack/react-query'\nimport { useCallback, useEffect, useState } from 'react'\n\nimport {\n\ttype RasterApiError,\n\tSEARCH_PAGE_SIZE,\n\ttype SearchHit,\n\ttype SearchResult,\n} from '@raster-app/sdk'\n\nimport { useRasterClient } from './context.js'\nimport { rasterKeys } from './query-keys.js'\nimport { useCredentialIdentity } from './use-session.js'\n\n/** How long typing must pause before a query is sent, so a word costs one request. */\nconst SEARCH_DEBOUNCE_MS = 300\n\n/** Where a search looks: one organization, optionally narrowed to one of its libraries. */\nexport type SearchScope = {\n\torganizationId: string\n\t/** Null searches every library in the organization. */\n\tlibraryId: string | null\n}\n\nexport type AssetSearch = {\n\t/** Whether there is a query to show results for — views swap to results on this. */\n\tactive: boolean\n\t/** The trimmed query the results are (or will be) for. */\n\tquery: string\n\t/** Null until the first page has landed. */\n\thits: Array<SearchHit> | null\n\t/** Total matches in scope, from the index — not just those loaded so far. */\n\tfound: number\n\tisSearching: boolean\n\thasMore: boolean\n\t/** Fetch the next page. A no-op while one is already in flight, at the end, or after a failure. */\n\tloadMore: () => void\n\terror: RasterApiError | null\n}\n\ntype Results = Pick<SearchResult, 'hits' | 'found'>\n\nfunction toResults(data: InfiniteData<SearchResult>): Results {\n\treturn {\n\t\t// The index can shift between pages; a hit already shown is not shown twice.\n\t\thits: Array.from(\n\t\t\tnew Map(data.pages.flatMap((page) => page.hits).map((hit) => [hit.id, hit])).values()\n\t\t),\n\t\tfound: data.pages[data.pages.length - 1]?.found ?? 0,\n\t}\n}\n\n/**\n * Full-text search over Raster, as a header search box drives it. The previous results stay\n * on screen while the next query runs, since a grid that blanks on every keystroke makes\n * typing feel destructive. A null scope switches the search off.\n */\nexport function useAssetSearch(scope: SearchScope | null, rawQuery: string): AssetSearch {\n\tconst client = useRasterClient()\n\n\tconst identity = useCredentialIdentity()\n\n\tconst [debouncedQuery, setDebouncedQuery] = useState('')\n\n\tconst query = rawQuery.trim()\n\tconst active = scope !== null && query !== ''\n\n\tconst { data, error, isFetching, isError, hasNextPage, fetchNextPage } = useInfiniteQuery<\n\t\tSearchResult,\n\t\tRasterApiError,\n\t\tResults,\n\t\tQueryKey,\n\t\tnumber\n\t>({\n\t\tqueryKey: [\n\t\t\t...rasterKeys.search(identity, scope?.organizationId ?? null),\n\t\t\tscope?.libraryId ?? null,\n\t\t\tdebouncedQuery,\n\t\t],\n\t\tqueryFn:\n\t\t\tscope === null\n\t\t\t\t? skipToken\n\t\t\t\t: ({ pageParam, signal }) =>\n\t\t\t\t\t\tclient.search({\n\t\t\t\t\t\t\torganizationId: scope.organizationId,\n\t\t\t\t\t\t\tlibraryIds: scope.libraryId === null ? undefined : [scope.libraryId],\n\t\t\t\t\t\t\tquery: debouncedQuery,\n\t\t\t\t\t\t\tpage: pageParam,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t}),\n\t\tinitialPageParam: 1,\n\t\tgetNextPageParam: (lastPage, pages) =>\n\t\t\tlastPage.hits.length === SEARCH_PAGE_SIZE && pages.length * SEARCH_PAGE_SIZE < lastPage.found\n\t\t\t\t? pages.length + 1\n\t\t\t\t: undefined,\n\t\tselect: toResults,\n\t\t// `keepPreviousData` within one sign-in's search of one organization. The observer holds\n\t\t// the last account's results after their cache is dropped, and a hit names its library but\n\t\t// not its organization, so one shown under another organization would be acted on there.\n\t\tplaceholderData: (previous, previousQuery) => {\n\t\t\tconst [, signIn, , organizationId] = previousQuery?.queryKey ?? []\n\t\t\treturn signIn === identity && organizationId === scope?.organizationId ? previous : undefined\n\t\t},\n\t\t// A blank `q` returns recent assets rather than matches.\n\t\tenabled: identity !== null && active && debouncedQuery !== '',\n\t})\n\n\tconst shown = active ? data : undefined\n\t// Up from the keystroke rather than from when the request goes out, so the spinner confirms\n\t// the typing was noticed.\n\tconst isSearching = active && (query !== debouncedQuery || isFetching)\n\t// A failure also stops paging, rather than let an observer retry it on every scroll.\n\tconst hasMore = active && hasNextPage && !isError\n\n\tconst loadMore = useCallback(() => {\n\t\tif (hasMore) void fetchNextPage({ cancelRefetch: false })\n\t}, [hasMore, fetchNextPage])\n\n\tuseEffect(() => {\n\t\tif (query === debouncedQuery) return\n\t\tconst timer = setTimeout(() => setDebouncedQuery(query), SEARCH_DEBOUNCE_MS)\n\t\treturn () => clearTimeout(timer)\n\t}, [query, debouncedQuery])\n\n\treturn {\n\t\tactive,\n\t\tquery,\n\t\thits: shown?.hits ?? null,\n\t\tfound: shown?.found ?? 0,\n\t\tisSearching,\n\t\thasMore,\n\t\tloadMore,\n\t\terror: active ? error : null,\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@raster-app/react",
|
|
3
|
-
"version": "0.1.0-canary-
|
|
3
|
+
"version": "0.1.0-canary-58c063f",
|
|
4
4
|
"description": "React provider and hooks for the Raster SDK: session, organizations, libraries, assets, search and uploads.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://raster.app/docs/api/sdk",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"test": "bun test"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@raster-app/sdk": "0.1.0-canary-
|
|
43
|
+
"@raster-app/sdk": "0.1.0-canary-58c063f",
|
|
44
44
|
"@tanstack/react-query": "^5.103.1",
|
|
45
45
|
"@tanstack/react-virtual": "^3.14.13"
|
|
46
46
|
},
|