blob: 96f69de107f228c261edb597bae53eaf25d89e1e [file] [log] [blame]
import {waitFor} from 'poll-until-promise';
import {CCApi} from '../../../../common/api.js';
import {parseUrl} from '../../../../common/commonUtils.js';
import {getAuthUser} from '../../../../common/communityConsoleUtils.js';
export default class Thread {
constructor(forumId, threadId) {
this.forumId = forumId;
this.threadId = threadId;
this._details = null;
}
static fromUrl(url) {
const rawThread = parseUrl(url);
if (!rawThread) return null;
return new Thread(rawThread.forum, rawThread.thread);
}
loadThreadDetails() {
if (this._details) return Promise.resolve(true);
return waitFor(
() => {
return CCApi(
'ViewForum', {
1: '0', // forumID,
// options
2: {
3: false, // withMessages
5: true, // withUserProfile
6: false, // withUserReadState
7: false, // withStickyThreads
9: false, // withRequestorProfile
10: false, // withPromotedMessages
11: false, // withExpertResponder
12: `forum:${this.forumId} thread:${
this.threadId}`, // forumViewFilters
16: false, // withThreadNotes
17: false, // withExpertReplyingIndicator
},
},
/* authenticated = */ true, getAuthUser())
.then(res => {
if (res?.['1']?.['2']?.length < 1)
throw new Error(
`Couldn't retrieve thread details (forum: ${
this.forumId}, thread: ${this.thread}).`);
return res?.['1']?.['2']?.[0];
});
},
{
interval: 500,
timeout: 2000,
})
.then(thread => {
this._details = thread;
return true;
});
}
get opName() {
return this._details?.['4']?.['1']?.['1'];
}
get opUserId() {
return this._details?.['4']?.['3'];
}
get forumTitle() {
return this._details?.['23'];
}
get isRead() {
return !!this._details?.['6'];
}
get isStarred() {
return !!this._details?.['7']?.['1'];
}
get numMessages() {
return this._details?.['8'];
}
get numAnswers() {
return this._details?.['15'];
}
get numSuggestedAnswers() {
return this._details?.['32'];
}
get title() {
return this._details?.['2']?.['9'];
}
get lastMessageId() {
return this._details?.['2']?.['10'];
}
get payload() {
return this._details?.['2']?.['13'];
}
// Accessors in the style of
// https://support.google.com/communities/answer/9147001.
get op_name() {
return this.opName;
}
get forum_name() {
return this.forumTitle;
}
}