feeds-fun
Version:
Frontend for the Feeds Fun — web-based news reader
70 lines (52 loc) • 1.83 kB
text/typescript
import {computed, ref, watch} from "vue";
import {useRouter} from "vue-router";
import {defineStore} from "pinia";
import type * as t from "@/logic/types";
import * as e from "@/logic/enums";
import * as api from "@/logic/api";
import {Timer} from "@/logic/timer";
import {computedAsync} from "@vueuse/core";
export const useCollectionsStore = defineStore("collectionsStore", () => {
const feeds = ref<{[id: t.CollectionId]: t.CollectionFeedInfo[]}>({});
const collections = computedAsync(async () => {
const collectionsList = await api.getCollections();
const collections: {[key: t.CollectionId]: t.Collection} = {};
for (const collection of collectionsList) {
collections[collection.id] = collection;
}
return collections;
}, {});
const collectionsOrder = computed(() => {
const order = Object.keys(collections.value) as t.CollectionId[];
order.sort((a, b) => {
return collections.value[a].guiOrder - collections.value[b].guiOrder;
});
return order;
});
const collectionsOrdered = computed(() => {
return collectionsOrder.value.map((id) => collections.value[id]);
});
async function getFeeds({collectionId}: {collectionId: t.CollectionId}) {
if (collectionId in feeds.value) {
return feeds.value[collectionId];
}
const feedsList = await api.getCollectionFeeds({collectionId: collectionId});
feeds.value[collectionId] = feedsList;
return feeds.value[collectionId];
}
function getCollectionBySlug({slug}: {slug: t.CollectionSlug}) {
for (const collection of Object.values(collections.value)) {
if (collection.slug === slug) {
return collection;
}
}
return null;
}
return {
collections,
collectionsOrder,
collectionsOrdered,
getFeeds,
getCollectionBySlug
};
});