RSNewWebUI/webui-src/app/forums/forums_util.js
2023-06-19 23:57:35 +05:30

207 lines
5.9 KiB
JavaScript

const m = require('mithril');
const rs = require('rswebui');
const GROUP_SUBSCRIBE_ADMIN = 0x01; // means: you have the admin key for this group
const GROUP_SUBSCRIBE_PUBLISH = 0x02; // means: you have the publish key for thiss group. Typical use: publish key in forums are shared with specific friends.
const GROUP_SUBSCRIBE_SUBSCRIBED = 0x04; // means: you are subscribed to a group, which makes you a source for this group to your friend nodes.
const GROUP_SUBSCRIBE_NOT_SUBSCRIBED = 0x08;
const GROUP_MY_FORUM = GROUP_SUBSCRIBE_ADMIN + GROUP_SUBSCRIBE_SUBSCRIBED + GROUP_SUBSCRIBE_PUBLISH;
const THREAD_UNREAD = 0x00000003;
const Data = {
DisplayForums: {},
Threads: {},
ParentThreads: {},
ParentThreadMap: {},
};
async function updatedisplayforums(keyid, details = {}) {
const res = await rs.rsJsonApiRequest('/rsgxsforums/getForumsInfo', {
forumIds: [keyid], // keyid: Forumid
});
details = res.body.forumsInfo[0];
Data.DisplayForums[keyid] = {
// struct for a forum
name: details.mMeta.mGroupName,
author: details.mMeta.mAuthorId,
isSearched: true,
description: details.mDescription,
isSubscribed:
details.mMeta.mSubscribeFlags === GROUP_SUBSCRIBE_SUBSCRIBED ||
details.mMeta.mSubscribeFlags === GROUP_MY_FORUM,
activity: details.mMeta.mLastPost,
created: details.mMeta.mPublishTs,
};
if (Data.Threads[keyid] === undefined) {
Data.Threads[keyid] = {};
}
const res2 = await rs.rsJsonApiRequest('/rsgxsforums/getForumMsgMetaData', {
forumId: keyid,
});
if (res2.body.retval) {
res2.body.msgMetas.map(async (thread) => {
const res3 = await rs.rsJsonApiRequest('/rsgxsforums/getForumContent', {
forumId: keyid,
msgsIds: [thread.mMsgId],
});
if (
res3.body.retval &&
(Data.Threads[keyid][thread.mOrigMsgId] === undefined ||
Data.Threads[keyid][thread.mOrigMsgId].thread.mMeta.mPublishTs.xint64 <
thread.mPublishTs.xint64)
// here we get the latest edited thread for each thread by comparing the publish time
) {
Data.Threads[keyid][thread.mOrigMsgId] = { thread: res3.body.msgs[0], showReplies: false };
if (
Data.Threads[keyid][thread.mOrigMsgId] &&
Data.Threads[keyid][thread.mOrigMsgId].thread.mMeta.mMsgStatus === THREAD_UNREAD
) {
let parent = Data.Threads[keyid][thread.mOrigMsgId].thread.mMeta.mParentId;
while (Data.Threads[keyid][parent]) {
// to mark all parent threads of an inread thread
Data.Threads[keyid][parent].thread.mMeta.mMsgStatus = THREAD_UNREAD;
parent = Data.Threads[keyid][parent].thread.mMeta.mParentId;
}
}
if (Data.ParentThreads[keyid] === undefined) {
Data.ParentThreads[keyid] = {};
}
if (thread.mThreadId === thread.mParentId) {
// top level thread.
Data.ParentThreads[keyid][thread.mOrigMsgId] =
Data.Threads[keyid][thread.mOrigMsgId].thread.mMeta;
} else {
if (Data.ParentThreadMap[thread.mParentId] === undefined) {
Data.ParentThreadMap[thread.mParentId] = {};
}
Data.ParentThreadMap[thread.mParentId][thread.mOrigMsgId] = thread;
}
}
});
}
}
const DisplayForumsFromList = () => {
return {
view: (v) =>
m(
'tr',
{
key: v.attrs.id,
class:
Data.DisplayForums[v.attrs.id] && Data.DisplayForums[v.attrs.id].isSearched
? ''
: 'hidden',
onclick: () => {
m.route.set('/forums/:tab/:mGroupId', {
tab: v.attrs.category,
mGroupId: v.attrs.id,
});
},
},
[m('td', Data.DisplayForums[v.attrs.id] ? Data.DisplayForums[v.attrs.id].name : '')]
),
};
};
const ForumSummary = () => {
let keyid = {};
return {
oninit: (v) => {
keyid = v.attrs.details.mGroupId;
updatedisplayforums(keyid);
},
view: (v) => {},
};
};
const ForumTable = () => {
return {
view: (v) => m('table.forums', [m('tr', [m('th', 'Forum Name')]), v.children]),
};
};
const ThreadsTable = () => {
return {
oninit: (v) => {},
view: (v) =>
m('table.threads', [
m('tr', [m('th', 'Comment'), m('th', 'Date'), m('th', 'Author')]),
v.children,
]),
};
};
const ThreadsReplyTable = () => {
return {
oninit: (v) => {},
view: (v) =>
m('table.threadreply', [
m('tr', [
m('th', ''),
m('th', 'Comment'),
m('th', 'Unread'),
m('th', 'Author'),
m('th', 'Date'),
]),
v.children,
]),
};
};
const SearchBar = () => {
let searchString = '';
return {
view: (v) =>
m('input[type=text][id=searchforum][placeholder=Search Subject].searchbar', {
value: searchString,
oninput: (e) => {
searchString = e.target.value.toLowerCase();
for (const hash in Data.DisplayForums) {
if (Data.DisplayForums[hash].name.toLowerCase().indexOf(searchString) > -1) {
Data.DisplayForums[hash].isSearched = true;
} else {
Data.DisplayForums[hash].isSearched = false;
}
}
},
}),
};
};
function popupmessage(message) {
const container = document.getElementById('modal-container');
container.style.display = 'block';
m.render(
container,
m('.modal-content', [
m(
'button.red',
{
onclick: () => (container.style.display = 'none'),
},
m('i.fas.fa-times')
),
message,
])
);
}
module.exports = {
Data,
SearchBar,
ForumSummary,
DisplayForumsFromList,
ForumTable,
ThreadsTable,
ThreadsReplyTable,
popupmessage,
updatedisplayforums,
GROUP_SUBSCRIBE_ADMIN,
GROUP_SUBSCRIBE_NOT_SUBSCRIBED,
GROUP_SUBSCRIBE_PUBLISH,
GROUP_SUBSCRIBE_SUBSCRIBED,
GROUP_MY_FORUM,
THREAD_UNREAD,
};