import { useAsync, ref } from "@nuxtjs/composition-api"; import { set } from "@vueuse/core"; import { useAsyncKey } from "./use-utils"; import { useApiSingleton } from "~/composables/use-api"; import { Recipe } from "~/types/api-types/recipe"; export const allRecipes = ref([]); export const recentRecipes = ref([]); const rand = (n: number) => Math.floor(Math.random() * n); function swap(t: Array, i: number, j: number) { const q = t[i]; t[i] = t[j]; t[j] = q; return t; } export const useSorter = () => { function sortAToZ(list: Array) { list.sort((a, b) => { const textA = a.name.toUpperCase(); const textB = b.name.toUpperCase(); return textA < textB ? -1 : textA > textB ? 1 : 0; }); } function sortByCreated(list: Array) { list.sort((a, b) => (a.dateAdded > b.dateAdded ? -1 : 1)); } function sortByUpdated(list: Array) { list.sort((a, b) => (a.dateUpdated > b.dateUpdated ? -1 : 1)); } function sortByRating(list: Array) { list.sort((a, b) => (a.rating > b.rating ? -1 : 1)); } function randomRecipe(list: Array): Recipe { return list[Math.floor(Math.random() * list.length)]; } function shuffle(list: Array) { let last = list.length; let n; while (last > 0) { n = rand(last); swap(list, n, --last); } } return { sortAToZ, sortByCreated, sortByUpdated, sortByRating, randomRecipe, shuffle, }; }; export const useLazyRecipes = function () { const api = useApiSingleton(); const recipes = ref([]); async function fetchMore(start: number, limit: number) { const { data } = await api.recipes.getAll(start, limit); if (data) { data.forEach((recipe) => { recipes.value?.push(recipe); }); } } return { recipes, fetchMore, }; }; export const useRecipes = (all = false, fetchRecipes = true) => { const api = useApiSingleton(); // recipes is non-reactive!! const { recipes, start, end } = (() => { if (all) { return { recipes: allRecipes, start: 0, end: 9999, }; } else { return { recipes: recentRecipes, start: 0, end: 30, }; } })(); async function refreshRecipes() { const { data } = await api.recipes.getAll(start, end); if (data) { set(recipes, data); } } function getAllRecipes() { useAsync(async () => { await refreshRecipes(); }, useAsyncKey()); } function assignSorted(val: Array) { recipes.value = val; } if (fetchRecipes) { getAllRecipes(); } return { getAllRecipes, assignSorted, refreshRecipes }; };