mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 10:13:32 -04:00 
			
		
		
		
	* fixed incorrect var ref * added public recipe pagination route * refactored frontend public/explore API * fixed broken public cards * hid context menu from cards when public * fixed public app header * fixed random recipe * added public food, category, tag, and tool routes * not sure why I thought that would work * added public organizer/foods stores * disabled clicking on tags/categories * added public link to profile page * linting * force a 404 if the group slug is missing or invalid * oops * refactored to fit sidebar into explore * fixed invalid logic for app header * removed most sidebar options from public * added backend routes for public cookbooks * added explore cookbook pages/apis * codegen * added backend tests * lint * fixes v-for keys * I do not understand but sure why not --------- Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
		
			
				
	
	
		
			159 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Ref, useAsync } from "@nuxtjs/composition-api";
 | |
| import { useAsyncKey } from "../use-utils";
 | |
| import { BaseCRUDAPI, BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients";
 | |
| import { QueryValue } from "~/lib/api/base/route";
 | |
| 
 | |
| type BoundT = {
 | |
|   id?: string | number;
 | |
| };
 | |
| 
 | |
| interface PublicStoreActions<T extends BoundT> {
 | |
|   getAll(page?: number, perPage?: number, params?: any): Ref<T[] | null>;
 | |
|   refresh(): Promise<void>;
 | |
| }
 | |
| 
 | |
| interface StoreActions<T extends BoundT> extends PublicStoreActions<T> {
 | |
|   createOne(createData: T): Promise<void>;
 | |
|   updateOne(updateData: T): Promise<void>;
 | |
|   deleteOne(id: string | number): Promise<void>;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * usePublicStoreActions is a factory function that returns a set of methods
 | |
|  * that can be reused to manage the state of a data store without using
 | |
|  * Vuex. This is primarily used for basic GET/GETALL operations that required
 | |
|  * a lot of refreshing hooks to be called on operations
 | |
|  */
 | |
| export function usePublicStoreActions<T extends BoundT>(
 | |
|   api: BaseCRUDAPIReadOnly<T>,
 | |
|   allRef: Ref<T[] | null> | null,
 | |
|   loading: Ref<boolean>
 | |
| ): PublicStoreActions<T> {
 | |
|   function getAll(page = 1, perPage = -1, params = {} as Record<string, QueryValue>) {
 | |
|     params.orderBy ??= "name";
 | |
|     params.orderDirection ??= "asc";
 | |
| 
 | |
|     loading.value = true;
 | |
|     const allItems = useAsync(async () => {
 | |
|       const { data } = await api.getAll(page, perPage, params);
 | |
| 
 | |
|       if (data && allRef) {
 | |
|         allRef.value = data.items;
 | |
|       }
 | |
| 
 | |
|       if (data) {
 | |
|         return data.items ?? [];
 | |
|       } else {
 | |
|         return [];
 | |
|       }
 | |
|     }, useAsyncKey());
 | |
| 
 | |
|     loading.value = false;
 | |
|     return allItems;
 | |
|   }
 | |
| 
 | |
|   async function refresh() {
 | |
|     loading.value = true;
 | |
|     const { data } = await api.getAll();
 | |
| 
 | |
|     if (data && data.items && allRef) {
 | |
|       allRef.value = data.items;
 | |
|     }
 | |
| 
 | |
|     loading.value = false;
 | |
|   }
 | |
| 
 | |
|   return {
 | |
|     getAll,
 | |
|     refresh,
 | |
|   };
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * useStoreActions is a factory function that returns a set of methods
 | |
|  * that can be reused to manage the state of a data store without using
 | |
|  * Vuex. This is primarily used for basic CRUD operations that required
 | |
|  * a lot of refreshing hooks to be called on operations
 | |
|  */
 | |
| export function useStoreActions<T extends BoundT>(
 | |
|   api: BaseCRUDAPI<unknown, T, unknown>,
 | |
|   allRef: Ref<T[] | null> | null,
 | |
|   loading: Ref<boolean>
 | |
| ): StoreActions<T> {
 | |
|   function getAll(page = 1, perPage = -1, params = {} as Record<string, QueryValue>) {
 | |
|     params.orderBy ??= "name";
 | |
|     params.orderDirection ??= "asc";
 | |
| 
 | |
|     loading.value = true;
 | |
|     const allItems = useAsync(async () => {
 | |
|       const { data } = await api.getAll(page, perPage, params);
 | |
| 
 | |
|       if (data && allRef) {
 | |
|         allRef.value = data.items;
 | |
|       }
 | |
| 
 | |
|       if (data) {
 | |
|         return data.items ?? [];
 | |
|       } else {
 | |
|         return [];
 | |
|       }
 | |
|     }, useAsyncKey());
 | |
| 
 | |
|     loading.value = false;
 | |
|     return allItems;
 | |
|   }
 | |
| 
 | |
|   async function refresh() {
 | |
|     loading.value = true;
 | |
|     const { data } = await api.getAll();
 | |
| 
 | |
|     if (data && data.items && allRef) {
 | |
|       allRef.value = data.items;
 | |
|     }
 | |
| 
 | |
|     loading.value = false;
 | |
|   }
 | |
| 
 | |
|   async function createOne(createData: T) {
 | |
|     loading.value = true;
 | |
|     const { data } = await api.createOne(createData);
 | |
|     if (data && allRef?.value) {
 | |
|       allRef.value.push(data);
 | |
|     } else {
 | |
|       refresh();
 | |
|     }
 | |
|     loading.value = false;
 | |
|   }
 | |
| 
 | |
|   async function updateOne(updateData: T) {
 | |
|     if (!updateData.id) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     loading.value = true;
 | |
|     const { data } = await api.updateOne(updateData.id, updateData);
 | |
|     if (data && allRef?.value) {
 | |
|       refresh();
 | |
|     }
 | |
|     loading.value = false;
 | |
|   }
 | |
| 
 | |
|   async function deleteOne(id: string | number) {
 | |
|     loading.value = true;
 | |
|     const { response } = await api.deleteOne(id);
 | |
|     if (response && allRef?.value) {
 | |
|       refresh();
 | |
|     }
 | |
|     loading.value = false;
 | |
|   }
 | |
| 
 | |
|   return {
 | |
|     getAll,
 | |
|     refresh,
 | |
|     createOne,
 | |
|     updateOne,
 | |
|     deleteOne,
 | |
|   };
 | |
| }
 |