2023-02-07 17:31:46 +01:00
|
|
|
import { useEffect, useRef } from 'preact/hooks';
|
2023-02-03 14:08:08 +01:00
|
|
|
import { useSnapshot } from 'valtio';
|
|
|
|
|
|
|
|
import Timeline from '../components/timeline';
|
2023-02-05 17:17:19 +01:00
|
|
|
import { api } from '../utils/api';
|
2023-03-21 17:09:36 +01:00
|
|
|
import { filteredItems } from '../utils/filters';
|
2023-02-05 18:10:49 +01:00
|
|
|
import states from '../utils/states';
|
2023-02-07 17:31:46 +01:00
|
|
|
import { getStatus, saveStatus } from '../utils/states';
|
2023-12-14 18:58:29 +01:00
|
|
|
import {
|
|
|
|
assignFollowedTags,
|
|
|
|
clearFollowedTagsState,
|
|
|
|
dedupeBoosts,
|
|
|
|
} from '../utils/timeline-utils';
|
2023-02-03 14:08:08 +01:00
|
|
|
import useTitle from '../utils/useTitle';
|
|
|
|
|
|
|
|
const LIMIT = 20;
|
|
|
|
|
2023-02-15 03:49:36 +01:00
|
|
|
function Following({ title, path, id, ...props }) {
|
2023-02-18 14:37:34 +01:00
|
|
|
useTitle(title || 'Following', path || '/following');
|
2023-10-12 06:48:09 +02:00
|
|
|
const { masto, streaming, instance } = api();
|
2023-02-03 14:08:08 +01:00
|
|
|
const snapStates = useSnapshot(states);
|
|
|
|
const homeIterator = useRef();
|
2023-02-07 17:31:46 +01:00
|
|
|
const latestItem = useRef();
|
|
|
|
|
2023-04-14 09:30:04 +02:00
|
|
|
console.debug('RENDER Following', title, id);
|
|
|
|
|
2023-02-03 14:08:08 +01:00
|
|
|
async function fetchHome(firstLoad) {
|
|
|
|
if (firstLoad || !homeIterator.current) {
|
2023-10-12 06:48:09 +02:00
|
|
|
homeIterator.current = masto.v1.timelines.home.list({ limit: LIMIT });
|
2023-02-03 14:08:08 +01:00
|
|
|
}
|
2023-02-06 16:50:00 +01:00
|
|
|
const results = await homeIterator.current.next();
|
2023-03-21 17:09:36 +01:00
|
|
|
let { value } = results;
|
2023-02-06 16:50:00 +01:00
|
|
|
if (value?.length) {
|
2023-12-20 09:04:37 +01:00
|
|
|
let latestItemChanged = false;
|
2023-02-07 17:31:46 +01:00
|
|
|
if (firstLoad) {
|
2023-12-20 09:04:37 +01:00
|
|
|
if (value[0].id !== latestItem.current) {
|
|
|
|
latestItemChanged = true;
|
|
|
|
}
|
2023-02-07 17:31:46 +01:00
|
|
|
latestItem.current = value[0].id;
|
2023-03-21 17:09:36 +01:00
|
|
|
console.log('First load', latestItem.current);
|
2023-02-07 17:31:46 +01:00
|
|
|
}
|
|
|
|
|
2023-11-03 14:45:31 +01:00
|
|
|
// value = filteredItems(value, 'home');
|
2023-02-06 16:50:00 +01:00
|
|
|
value.forEach((item) => {
|
|
|
|
saveStatus(item, instance);
|
|
|
|
});
|
2023-03-26 18:47:29 +02:00
|
|
|
value = dedupeBoosts(value, instance);
|
2023-12-20 09:04:37 +01:00
|
|
|
if (firstLoad && latestItemChanged) clearFollowedTagsState();
|
2023-12-14 18:58:29 +01:00
|
|
|
assignFollowedTags(value, instance);
|
2023-02-10 15:23:19 +01:00
|
|
|
|
|
|
|
// ENFORCE sort by datetime (Latest first)
|
|
|
|
value.sort((a, b) => {
|
|
|
|
const aDate = new Date(a.createdAt);
|
|
|
|
const bDate = new Date(b.createdAt);
|
|
|
|
return bDate - aDate;
|
|
|
|
});
|
2023-02-06 16:50:00 +01:00
|
|
|
}
|
2023-05-14 15:13:36 +02:00
|
|
|
return {
|
|
|
|
...results,
|
|
|
|
value,
|
|
|
|
};
|
2023-02-03 14:08:08 +01:00
|
|
|
}
|
|
|
|
|
2023-02-07 17:31:46 +01:00
|
|
|
async function checkForUpdates() {
|
|
|
|
try {
|
2023-10-12 06:48:09 +02:00
|
|
|
const results = await masto.v1.timelines.home
|
|
|
|
.list({
|
2023-02-07 17:31:46 +01:00
|
|
|
limit: 5,
|
|
|
|
since_id: latestItem.current,
|
|
|
|
})
|
|
|
|
.next();
|
2023-03-21 17:09:36 +01:00
|
|
|
let { value } = results;
|
2023-02-09 15:27:49 +01:00
|
|
|
console.log('checkForUpdates', latestItem.current, value);
|
2024-04-09 17:35:17 +02:00
|
|
|
const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported
|
|
|
|
if (value?.length && !valueContainsLatestItem) {
|
2023-03-25 13:18:53 +01:00
|
|
|
latestItem.current = value[0].id;
|
2023-03-26 17:18:36 +02:00
|
|
|
value = dedupeBoosts(value, instance);
|
2023-03-25 13:18:53 +01:00
|
|
|
value = filteredItems(value, 'home');
|
|
|
|
if (value.some((item) => !item.reblog)) {
|
|
|
|
return true;
|
|
|
|
}
|
2023-02-07 17:31:46 +01:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-10-12 06:48:09 +02:00
|
|
|
let sub;
|
2023-02-08 12:11:33 +01:00
|
|
|
(async () => {
|
2023-10-12 06:48:09 +02:00
|
|
|
if (streaming) {
|
|
|
|
sub = streaming.user.subscribe();
|
|
|
|
console.log('🎏 Streaming user', sub);
|
|
|
|
for await (const entry of sub) {
|
|
|
|
if (!sub) break;
|
|
|
|
if (entry.event === 'status.update') {
|
|
|
|
const status = entry.payload;
|
|
|
|
console.log(`🔄 Status ${status.id} updated`);
|
|
|
|
saveStatus(status, instance);
|
|
|
|
} else if (entry.event === 'delete') {
|
|
|
|
const statusID = entry.payload;
|
|
|
|
console.log(`❌ Status ${statusID} deleted`);
|
|
|
|
// delete states.statuses[statusID];
|
|
|
|
const s = getStatus(statusID, instance);
|
|
|
|
if (s) s._deleted = true;
|
|
|
|
}
|
|
|
|
}
|
2023-12-12 01:34:06 +01:00
|
|
|
console.log('💥 Streaming user loop STOPPED');
|
2023-10-12 06:48:09 +02:00
|
|
|
}
|
2023-02-08 12:11:33 +01:00
|
|
|
})();
|
2023-02-07 17:31:46 +01:00
|
|
|
return () => {
|
2023-10-12 06:48:09 +02:00
|
|
|
sub?.unsubscribe?.();
|
|
|
|
sub = null;
|
2023-02-07 17:31:46 +01:00
|
|
|
};
|
2023-10-12 06:48:09 +02:00
|
|
|
}, [streaming]);
|
2023-02-07 17:31:46 +01:00
|
|
|
|
2023-02-03 14:08:08 +01:00
|
|
|
return (
|
|
|
|
<Timeline
|
2023-02-09 15:27:49 +01:00
|
|
|
title={title || 'Following'}
|
|
|
|
id={id || 'following'}
|
2023-02-03 14:08:08 +01:00
|
|
|
emptyText="Nothing to see here."
|
|
|
|
errorText="Unable to load posts."
|
2023-02-18 17:05:46 +01:00
|
|
|
instance={instance}
|
2023-02-03 14:08:08 +01:00
|
|
|
fetchItems={fetchHome}
|
2023-02-07 17:31:46 +01:00
|
|
|
checkForUpdates={checkForUpdates}
|
2023-02-06 16:50:00 +01:00
|
|
|
useItemID
|
2023-02-03 14:08:08 +01:00
|
|
|
boostsCarousel={snapStates.settings.boostsCarousel}
|
2023-02-15 03:49:36 +01:00
|
|
|
{...props}
|
2023-11-03 14:45:31 +01:00
|
|
|
// allowFilters
|
|
|
|
filterContext="home"
|
2023-12-14 18:58:29 +01:00
|
|
|
showFollowedTags
|
2024-01-30 07:34:54 +01:00
|
|
|
showReplyParent
|
2023-02-03 14:08:08 +01:00
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default Following;
|