tangled
alpha
login
or
join now
mackuba.eu
/
skythread
14
fork
atom
Thread viewer for Bluesky
14
fork
atom
overview
issues
pulls
pipelines
tweaked some null/undefined use
mackuba.eu
3 months ago
0fb2df6a
e6096f63
+22
-22
8 changed files
expand all
collapse all
unified
split
src
api
api.js
minisky.js
components
posts
BlockedPostView.svelte
models
account.svelte.js
pages
ThreadPage.svelte
services
posting_stats.js
timeline_search.js
skythread.js
+4
-4
src/api/api.js
···
61
61
62
62
export class BlueskyAPI extends Minisky {
63
63
64
64
-
/** @param {string | undefined} host, @param {boolean} useAuthentication */
64
64
+
/** @param {string?} host, @param {boolean} useAuthentication */
65
65
constructor(host, useAuthentication) {
66
66
super(host, useAuthentication ? new LocalStorageConfig() : undefined);
67
67
···
255
255
return { cursor: response.cursor, posts: postGroups.flat() };
256
256
}
257
257
258
258
-
/** @param {Post} post, @returns {Promise<(json | undefined)[]>} */
258
258
+
/** @param {Post} post, @returns {Promise<?json[]>} */
259
259
260
260
async loadHiddenReplies(post) {
261
261
let expectedReplyURIs;
···
274
274
let promises = missingReplyURIs.map(uri => this.loadThreadByAtURI(uri));
275
275
let responses = await Promise.allSettled(promises);
276
276
277
277
-
return responses.map(r => (r.status == 'fulfilled') ? r.value : undefined);
277
277
+
return responses.map(r => (r.status == 'fulfilled') ? r.value : null);
278
278
}
279
279
280
280
/**
···
414
414
return data;
415
415
}
416
416
417
417
-
/** @param {string} uri, @returns {Promise<Post | null>} */
417
417
+
/** @param {string} uri, @returns {Promise<Post?>} */
418
418
419
419
async reloadBlockedPost(uri) {
420
420
let { repo } = atURI(uri);
+4
-4
src/api/minisky.js
···
42
42
* @prop {json | null | undefined} user
43
43
* @prop {() => void} save
44
44
*
45
45
-
* @param {string | undefined} host
46
46
-
* @param {MiniskyConfig | null | undefined} [config]
45
45
+
* @param {string?} host
46
46
+
* @param {MiniskyConfig | undefined} [config]
47
47
* @param {MiniskyOptions} [options]
48
48
*/
49
49
···
82
82
* @prop {string | boolean} [auth]
83
83
* @prop {Record<string, string>} [headers]
84
84
*
85
85
-
* @param {string} method, @param {json | null} [params], @param {MiniskyRequestOptions} [options]
85
85
+
* @param {string} method, @param {json?} [params], @param {MiniskyRequestOptions} [options]
86
86
* @returns {Promise<json>}
87
87
*/
88
88
···
115
115
}
116
116
117
117
/**
118
118
-
* @param {string} method, @param {json | null} [data], @param {MiniskyRequestOptions} [options]
118
118
+
* @param {string} method, @param {json?} [data], @param {MiniskyRequestOptions} [options]
119
119
* @returns {Promise<json>}
120
120
*/
121
121
+1
-1
src/components/posts/BlockedPostView.svelte
···
36
36
} else if (post.blocksUser) {
37
37
return "you've blocked them";
38
38
} else {
39
39
-
return undefined;
39
39
+
return null;
40
40
}
41
41
}
42
42
</script>
+2
-2
src/models/account.svelte.js
···
12
12
constructor() {
13
13
let incognito = localStorage.getItem('incognito');
14
14
let biohazard = JSON.parse(localStorage.getItem('biohazard') ?? 'null');
15
15
-
let accountAPI = new BlueskyAPI(undefined, true);
15
15
+
let accountAPI = new BlueskyAPI(null, true);
16
16
17
17
this.#isIncognito = $state(accountAPI.isLoggedIn && !!incognito);
18
18
this.#biohazardEnabled = $state(biohazard);
···
37
37
location.reload();
38
38
}
39
39
40
40
-
/** @returns {boolean | undefined} */
40
40
+
/** @returns {boolean?} */
41
41
42
42
get biohazardEnabled() {
43
43
return this.#biohazardEnabled;
+1
-1
src/pages/ThreadPage.svelte
···
6
6
import ThreadRootParent from '../components/posts/ThreadRootParent.svelte';
7
7
import ThreadRootParentRaw from '../components/posts/ThreadRootParentRaw.svelte';
8
8
9
9
-
let { url = null, author = null, rkey = null } = $props();
9
9
+
let { url = undefined, author = undefined, rkey = undefined } = $props();
10
10
let post = $state();
11
11
let loadingFailed = $state(false);
12
12
+7
-7
src/services/posting_stats.js
···
53
53
}
54
54
}
55
55
56
56
-
/** @param {number} requestedDays, @returns {Promise<PostingStatsResult | undefined>} */
56
56
+
/** @param {number} requestedDays, @returns {Promise<PostingStatsResult?>} */
57
57
58
58
async scanHomeTimeline(requestedDays) {
59
59
let startTime = new Date().getTime();
···
67
67
return this.generateResults(posts, requestedDays, startTime);
68
68
}
69
69
70
70
-
/** @param {string} listURI, @param {number} requestedDays, @returns {Promise<PostingStatsResult | undefined>} */
70
70
+
/** @param {string} listURI, @param {number} requestedDays, @returns {Promise<PostingStatsResult?>} */
71
71
72
72
async scanListTimeline(listURI, requestedDays) {
73
73
let startTime = new Date().getTime();
···
81
81
return this.generateResults(posts, requestedDays, startTime);
82
82
}
83
83
84
84
-
/** @param {UserWithHandle[]} users, @returns {Promise<PostingStatsResult | undefined>} */
84
84
+
/** @param {UserWithHandle[]} users, @returns {Promise<PostingStatsResult?>} */
85
85
86
86
async scanUserTimelines(users, requestedDays) {
87
87
let startTime = new Date().getTime();
···
108
108
return this.generateResults(posts, requestedDays, startTime, { countFetchedDays: false, users: users });
109
109
}
110
110
111
111
-
/** @param {number} requestedDays, @returns {Promise<PostingStatsResult | undefined>} */
111
111
+
/** @param {number} requestedDays, @returns {Promise<PostingStatsResult?>} */
112
112
113
113
async scanYourTimeline(requestedDays) {
114
114
let startTime = new Date().getTime();
···
128
128
* @param {number} requestedDays
129
129
* @param {number} startTime
130
130
* @param {{ countFetchedDays?: boolean, users?: UserWithHandle[] }} options
131
131
-
* @returns {PostingStatsResult | undefined}
131
131
+
* @returns {PostingStatsResult?}
132
132
*/
133
133
134
134
generateResults(posts, requestedDays, startTime, options = {}) {
···
136
136
137
137
if (!last) {
138
138
this.stopScan();
139
139
-
return;
139
139
+
return null;
140
140
}
141
141
142
142
if (this.scanStartTime != startTime) {
143
143
-
return;
143
143
+
return null;
144
144
}
145
145
146
146
let users = {};
+2
-2
src/services/timeline_search.js
···
43
43
this.fetchStartTime = undefined;
44
44
}
45
45
46
46
-
/** @param {json[]} dataPage, @param {number} startTime, @returns {number | undefined} */
46
46
+
/** @param {json[]} dataPage, @param {number} startTime, @returns {number?} */
47
47
48
48
calculateProgress(dataPage, startTime) {
49
49
let last = dataPage.at(-1);
50
50
51
51
-
if (!last) { return }
51
51
+
if (!last) { return null; }
52
52
53
53
let lastDate = feedPostTime(last);
54
54
let daysBack = (startTime - lastDate) / 86400 / 1000;
+1
-1
src/skythread.js
···
49
49
50
50
window.appView = new BlueskyAPI('api.bsky.app', false);
51
51
window.blueAPI = new BlueskyAPI('blue.mackuba.eu', false);
52
52
-
window.accountAPI = new BlueskyAPI(undefined, true);
52
52
+
window.accountAPI = new BlueskyAPI(null, true);
53
53
54
54
if (accountAPI.isLoggedIn) {
55
55
accountAPI.host = accountAPI.user.pdsEndpoint;