mirror of
https://github.com/cheeaun/phanpy.git
synced 2025-03-08 09:07:44 +03:00
114 lines
2.5 KiB
JavaScript
114 lines
2.5 KiB
JavaScript
import { api } from './api';
|
|
import pmem from './pmem';
|
|
import store from './store';
|
|
|
|
const FETCH_MAX_AGE = 1000 * 60; // 1 minute
|
|
const MAX_AGE = 24 * 60 * 60 * 1000; // 1 day
|
|
|
|
export const fetchLists = pmem(
|
|
async () => {
|
|
const { masto } = api();
|
|
const lists = await masto.v1.lists.list();
|
|
lists.sort((a, b) => a.title.localeCompare(b.title));
|
|
|
|
if (lists.length) {
|
|
setTimeout(() => {
|
|
// Save to local storage, with saved timestamp
|
|
store.account.set('lists', {
|
|
lists,
|
|
updatedAt: Date.now(),
|
|
});
|
|
}, 1);
|
|
}
|
|
|
|
return lists;
|
|
},
|
|
{
|
|
maxAge: FETCH_MAX_AGE,
|
|
},
|
|
);
|
|
|
|
export async function getLists() {
|
|
try {
|
|
const { lists, updatedAt } = store.account.get('lists') || {};
|
|
if (!lists?.length) return await fetchLists();
|
|
if (Date.now() - updatedAt > MAX_AGE) {
|
|
// Stale-while-revalidate
|
|
fetchLists();
|
|
return lists;
|
|
}
|
|
return lists;
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export const fetchList = pmem(
|
|
(id) => {
|
|
const { masto } = api();
|
|
return masto.v1.lists.$select(id).fetch();
|
|
},
|
|
{
|
|
maxAge: FETCH_MAX_AGE,
|
|
},
|
|
);
|
|
|
|
export async function getList(id) {
|
|
const { lists } = store.account.get('lists') || {};
|
|
console.log({ lists });
|
|
if (lists?.length) {
|
|
const theList = lists.find((l) => l.id === id);
|
|
if (theList) return theList;
|
|
}
|
|
try {
|
|
return fetchList(id);
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function getListTitle(id) {
|
|
const list = await getList(id);
|
|
return list?.title || '';
|
|
}
|
|
|
|
export function addListStore(list) {
|
|
const { lists } = store.account.get('lists') || {};
|
|
if (lists?.length) {
|
|
lists.push(list);
|
|
lists.sort((a, b) => a.title.localeCompare(b.title));
|
|
store.account.set('lists', {
|
|
lists,
|
|
updatedAt: Date.now(),
|
|
});
|
|
}
|
|
}
|
|
|
|
export function updateListStore(list) {
|
|
const { lists } = store.account.get('lists') || {};
|
|
if (lists?.length) {
|
|
const index = lists.findIndex((l) => l.id === list.id);
|
|
if (index !== -1) {
|
|
lists[index] = list;
|
|
lists.sort((a, b) => a.title.localeCompare(b.title));
|
|
store.account.set('lists', {
|
|
lists,
|
|
updatedAt: Date.now(),
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
export function deleteListStore(listID) {
|
|
const { lists } = store.account.get('lists') || {};
|
|
if (lists?.length) {
|
|
const index = lists.findIndex((l) => l.id === listID);
|
|
if (index !== -1) {
|
|
lists.splice(index, 1);
|
|
store.account.set('lists', {
|
|
lists,
|
|
updatedAt: Date.now(),
|
|
});
|
|
}
|
|
}
|
|
}
|