| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  | import { watchDebounced } from "@vueuse/core"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { UserApi } from "~/lib/api"; | 
					
						
							|  |  |  | import type { ExploreApi } from "~/lib/api/public/explore"; | 
					
						
							|  |  |  | import type { Recipe } from "~/lib/api/types/recipe"; | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export interface UseRecipeSearchReturn { | 
					
						
							|  |  |  |   query: Ref<string>; | 
					
						
							|  |  |  |   error: Ref<string>; | 
					
						
							|  |  |  |   loading: Ref<boolean>; | 
					
						
							|  |  |  |   data: Ref<Recipe[]>; | 
					
						
							| 
									
										
										
										
											2023-03-24 17:21:12 +01:00
										 |  |  |   trigger(): Promise<void>; | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * `useRecipeSearch` constructs a basic reactive search query | 
					
						
							|  |  |  |  * that when `query` is changed, will search for recipes based | 
					
						
							|  |  |  |  * on the query. Useful for searchable list views. For advanced | 
					
						
							|  |  |  |  * search, use the `useRecipeQuery` composable. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  | export function useRecipeSearch(api: UserApi | ExploreApi): UseRecipeSearchReturn { | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  |   const query = ref(""); | 
					
						
							|  |  |  |   const error = ref(""); | 
					
						
							|  |  |  |   const loading = ref(false); | 
					
						
							|  |  |  |   const recipes = ref<Recipe[]>([]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async function searchRecipes(term: string) { | 
					
						
							|  |  |  |     loading.value = true; | 
					
						
							|  |  |  |     const { data, error } = await api.recipes.search({ | 
					
						
							|  |  |  |       search: term, | 
					
						
							|  |  |  |       page: 1, | 
					
						
							|  |  |  |       orderBy: "name", | 
					
						
							|  |  |  |       orderDirection: "asc", | 
					
						
							|  |  |  |       perPage: 20, | 
					
						
							| 
									
										
										
										
											2023-05-30 02:56:20 +02:00
										 |  |  |       _searchSeed: Date.now().toString(), | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (error) { | 
					
						
							|  |  |  |       console.error(error); | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |       recipes.value = []; | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (data) { | 
					
						
							| 
									
										
										
										
											2023-03-24 17:21:12 +01:00
										 |  |  |       recipes.value = data.items; | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     loading.value = false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   watchDebounced( | 
					
						
							|  |  |  |     () => query.value, | 
					
						
							|  |  |  |     async (term: string) => { | 
					
						
							|  |  |  |       await searchRecipes(term); | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     { debounce: 500 }, | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-24 17:21:12 +01:00
										 |  |  |   async function trigger() { | 
					
						
							|  |  |  |     await searchRecipes(query.value); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     query, | 
					
						
							|  |  |  |     error, | 
					
						
							|  |  |  |     loading, | 
					
						
							|  |  |  |     data: recipes, | 
					
						
							| 
									
										
										
										
											2023-03-24 17:21:12 +01:00
										 |  |  |     trigger, | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2023-03-12 12:59:28 -08:00
										 |  |  | } |