mirror of https://github.com/cheeaun/phanpy
63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
import { api } from '../utils/api';
|
|
import store from '../utils/store';
|
|
|
|
const LIMIT = 200;
|
|
const MAX_FETCH = 10;
|
|
|
|
export async function fetchFollowedTags() {
|
|
const { masto } = api();
|
|
const iterator = masto.v1.followedTags.list({
|
|
limit: LIMIT,
|
|
});
|
|
const tags = [];
|
|
let fetchCount = 0;
|
|
do {
|
|
const { value, done } = await iterator.next();
|
|
if (done || value?.length === 0) break;
|
|
tags.push(...value);
|
|
fetchCount++;
|
|
} while (fetchCount < MAX_FETCH);
|
|
tags.sort((a, b) => a.name.localeCompare(b.name));
|
|
console.log(tags);
|
|
|
|
if (tags.length) {
|
|
setTimeout(() => {
|
|
// Save to local storage, with saved timestamp
|
|
store.account.set('followedTags', {
|
|
tags,
|
|
updatedAt: Date.now(),
|
|
});
|
|
}, 1);
|
|
}
|
|
|
|
return tags;
|
|
}
|
|
|
|
const MAX_AGE = 24 * 60 * 60 * 1000; // 1 day
|
|
export async function getFollowedTags() {
|
|
try {
|
|
const { tags, updatedAt } = store.account.get('followedTags') || {};
|
|
if (!tags?.length) return await fetchFollowedTags();
|
|
if (Date.now() - updatedAt > MAX_AGE) {
|
|
// Stale-while-revalidate
|
|
fetchFollowedTags();
|
|
return tags;
|
|
}
|
|
return tags;
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
const fauxDiv = document.createElement('div');
|
|
export const extractTagsFromStatus = (content) => {
|
|
if (!content) return [];
|
|
if (content.indexOf('#') === -1) return [];
|
|
fauxDiv.innerHTML = content;
|
|
const hashtagLinks = fauxDiv.querySelectorAll('a.hashtag');
|
|
if (!hashtagLinks.length) return [];
|
|
return Array.from(hashtagLinks).map((a) =>
|
|
a.innerText.trim().replace(/^[^#]*#+/, ''),
|
|
);
|
|
};
|