| 
									
										
										
										
											2025-09-27 19:17:08 -05:00
										 |  |  | import type { AsyncData, NuxtError } from "#app"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { BoundT } from "./types"; | 
					
						
							|  |  |  | import type { BaseCRUDAPI, BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients"; | 
					
						
							|  |  |  | import type { QueryValue } from "~/lib/api/base/route"; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  | interface ReadOnlyStoreActions<T extends BoundT> { | 
					
						
							| 
									
										
										
										
											2025-09-27 19:17:08 -05:00
										 |  |  |   getAll(page?: number, perPage?: number, params?: any): AsyncData<T[] | null, NuxtError<unknown> | null>; | 
					
						
							| 
									
										
										
										
											2024-10-11 19:36:26 -05:00
										 |  |  |   refresh(page?: number, perPage?: number, params?: any): Promise<void>; | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  | interface StoreActions<T extends BoundT> extends ReadOnlyStoreActions<T> { | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |   createOne(createData: T): Promise<T | null>; | 
					
						
							|  |  |  |   updateOne(updateData: T): Promise<T | null>; | 
					
						
							|  |  |  |   deleteOne(id: string | number): Promise<T | null>; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  |  * useReadOnlyActions is a factory function that returns a set of methods | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |  * 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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  | export function useReadOnlyActions<T extends BoundT>( | 
					
						
							| 
									
										
										
										
											2025-09-27 19:17:08 -05:00
										 |  |  |   storeKey: string, | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |   api: BaseCRUDAPIReadOnly<T>, | 
					
						
							|  |  |  |   allRef: Ref<T[] | null> | null, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   loading: Ref<boolean>, | 
					
						
							| 
									
										
										
										
											2024-09-22 09:59:20 -05:00
										 |  |  | ): ReadOnlyStoreActions<T> { | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |   function getAll(page = 1, perPage = -1, params = {} as Record<string, QueryValue>) { | 
					
						
							|  |  |  |     params.orderBy ??= "name"; | 
					
						
							|  |  |  |     params.orderDirection ??= "asc"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-27 19:17:08 -05:00
										 |  |  |     const allItems = useAsyncData(storeKey, async () => { | 
					
						
							| 
									
										
										
										
											2025-09-26 11:25:15 -05:00
										 |  |  |       loading.value = true; | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         const { data } = await api.getAll(page, perPage, params); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (data && allRef) { | 
					
						
							|  |  |  |           allRef.value = data.items; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (data) { | 
					
						
							|  |  |  |           return data.items ?? []; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |           return []; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-09-26 11:25:15 -05:00
										 |  |  |       finally { | 
					
						
							|  |  |  |         loading.value = false; | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return allItems; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-11 19:36:26 -05:00
										 |  |  |   async function refresh(page = 1, perPage = -1, params = {} as Record<string, QueryValue>) { | 
					
						
							| 
									
										
										
										
											2024-10-17 10:35:39 -05:00
										 |  |  |     params.orderBy ??= "name"; | 
					
						
							|  |  |  |     params.orderDirection ??= "asc"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  |     loading.value = true; | 
					
						
							| 
									
										
										
										
											2024-10-11 19:36:26 -05:00
										 |  |  |     const { data } = await api.getAll(page, perPage, params); | 
					
						
							| 
									
										
										
										
											2023-09-14 09:01:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (data && data.items && allRef) { | 
					
						
							|  |  |  |       allRef.value = data.items; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     loading.value = false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     getAll, | 
					
						
							|  |  |  |     refresh, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * 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>( | 
					
						
							| 
									
										
										
										
											2025-09-27 19:17:08 -05:00
										 |  |  |   storeKey: string, | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |   api: BaseCRUDAPI<unknown, T, unknown>, | 
					
						
							|  |  |  |   allRef: Ref<T[] | null> | null, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   loading: Ref<boolean>, | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | ): StoreActions<T> { | 
					
						
							| 
									
										
										
										
											2023-02-26 20:20:26 +01:00
										 |  |  |   function getAll(page = 1, perPage = -1, params = {} as Record<string, QueryValue>) { | 
					
						
							| 
									
										
										
										
											2022-09-15 18:53:58 -05:00
										 |  |  |     params.orderBy ??= "name"; | 
					
						
							|  |  |  |     params.orderDirection ??= "asc"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-27 19:17:08 -05:00
										 |  |  |     const allItems = useAsyncData(storeKey, async () => { | 
					
						
							| 
									
										
										
										
											2025-09-26 11:25:15 -05:00
										 |  |  |       loading.value = true; | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         const { data } = await api.getAll(page, perPage, params); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (data && allRef) { | 
					
						
							|  |  |  |           allRef.value = data.items; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (data) { | 
					
						
							|  |  |  |           return data.items ?? []; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |           return []; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-09-26 11:25:15 -05:00
										 |  |  |       finally { | 
					
						
							|  |  |  |         loading.value = false; | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return allItems; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-11 19:36:26 -05:00
										 |  |  |   async function refresh(page = 1, perPage = -1, params = {} as Record<string, QueryValue>) { | 
					
						
							| 
									
										
										
										
											2024-10-17 10:35:39 -05:00
										 |  |  |     params.orderBy ??= "name"; | 
					
						
							|  |  |  |     params.orderDirection ??= "asc"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     loading.value = true; | 
					
						
							| 
									
										
										
										
											2024-10-11 19:36:26 -05:00
										 |  |  |     const { data } = await api.getAll(page, perPage, params); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |     if (data && data.items && allRef) { | 
					
						
							|  |  |  |       allRef.value = data.items; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |       await refresh(); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |     loading.value = false; | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |     return data; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async function updateOne(updateData: T) { | 
					
						
							|  |  |  |     if (!updateData.id) { | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |       return null; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     loading.value = true; | 
					
						
							|  |  |  |     const { data } = await api.updateOne(updateData.id, updateData); | 
					
						
							|  |  |  |     if (data && allRef?.value) { | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |       await refresh(); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |     loading.value = false; | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |     return data; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async function deleteOne(id: string | number) { | 
					
						
							|  |  |  |     loading.value = true; | 
					
						
							| 
									
										
										
										
											2022-06-03 20:12:32 -08:00
										 |  |  |     const { response } = await api.deleteOne(id); | 
					
						
							|  |  |  |     if (response && allRef?.value) { | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |       await refresh(); | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |     loading.value = false; | 
					
						
							| 
									
										
										
										
											2023-09-15 12:19:34 -05:00
										 |  |  |     return response?.data || null; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:29:59 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     getAll, | 
					
						
							|  |  |  |     refresh, | 
					
						
							|  |  |  |     createOne, | 
					
						
							|  |  |  |     updateOne, | 
					
						
							|  |  |  |     deleteOne, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |