RSNewWebUI/webui-src/app/boards/boards_util.js
2026-08-02 20:46:00 +05:30

158 lines
4.2 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 channels 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_BOARD = GROUP_SUBSCRIBE_ADMIN + GROUP_SUBSCRIBE_SUBSCRIBED + GROUP_SUBSCRIBE_PUBLISH;
const GXS_VOTE_DOWN = 0x0001;
const GXS_VOTE_UP = 0x0002;
// rsgxscircles.h:50
const PUBLIC = 1; // Public distribution
const EXTERNAL = 2; // Restricted to an external circle, based on GxsIds
const NODES_GROUP = 3;
const Data = {
DisplayBoards: {}, // boardID -> board info
Posts: {}, // boardID, PostID -> {post, isSearched}
Comments: {}, // threadID, msgID -> {Comment, showReplies}
};
async function updateDisplayBoards(keyid, details) {
const res1 = await rs.rsJsonApiRequest('/rsPosted/getBoardsInfo', {
boardsIds: [keyid],
});
details = res1.body.boardsInfo[0];
Data.DisplayBoards[keyid] = {
name: details.mMeta.mGroupName,
isSearched: true,
description: details.mDescription,
image: details.mGroupImage,
author: details.mMeta.mAuthorId,
isSubscribed:
details.mMeta.mSubscribeFlags === GROUP_SUBSCRIBE_SUBSCRIBED ||
details.mMeta.mSubscribeFlags === GROUP_MY_BOARD,
posts: details.mMeta.mVisibleMsgCount,
activity: details.mMeta.mLastPost,
created: details.mMeta.mPublishTs,
all: details,
};
if (Data.Posts[keyid] === undefined) {
Data.Posts[keyid] = {};
}
/* const res2 = await rs.rsJsonApiRequest('/rsPosted/getContentSummaries', {
boardId: keyid,
});
if (res2.body.retval) {
res2.body.summaries.map((content) => {
updateContent(content, keyid);
});
}*/
}
const DisplayBoardsFromList = () => {
return {
oninit: (v) => {},
view: (v) =>
m(
'tr',
{
key: v.attrs.id,
class:
Data.DisplayBoards[v.attrs.id] && Data.DisplayBoards[v.attrs.id].isSearched
? ''
: 'hidden',
onclick: () => {
m.route.set('/boards/:tab/:mGroupId', {
tab: v.attrs.category,
mGroupId: v.attrs.id,
});
},
},
[m('td', Data.DisplayBoards[v.attrs.id] ? Data.DisplayBoards[v.attrs.id].name : '')]
),
};
};
const BoardSummary = () => {
let keyid = {};
return {
oninit: (v) => {
keyid = v.attrs.details.mGroupId;
updateDisplayBoards(keyid);
},
view: (v) => {},
};
};
const BoardTable = () => {
return {
oninit: (v) => {},
view: (v) => m('table.boards', [m('tr', [m('th', 'Board Name')]), v.children]),
};
};
function popupmessage(message) {
const container = document.getElementById('modal-container');
container.style.display = 'block';
m.render(
container,
m('.modal-content[id=composepopup]', [
m(
'button.red',
{
onclick: () => (container.style.display = 'none'),
},
m('i.fas.fa-times')
),
message,
])
);
}
const SearchBar = () => {
let searchString = '';
return {
view: (v) =>
m('input[type=text][id=searchboard][placeholder=Search Subject].searchbar', {
value: searchString,
oninput: (e) => {
searchString = e.target.value.toLowerCase();
for (const hash in Data.DisplayBoards) {
if (Data.DisplayBoards[hash].name.toLowerCase().indexOf(searchString) > -1) {
Data.DisplayBoards[hash].isSearched = true;
} else {
Data.DisplayBoards[hash].isSearched = false;
}
}
},
}),
};
};
module.exports = {
Data,
SearchBar,
popupmessage,
BoardSummary,
DisplayBoardsFromList,
updateDisplayBoards,
BoardTable,
GROUP_SUBSCRIBE_ADMIN,
GROUP_SUBSCRIBE_NOT_SUBSCRIBED,
GROUP_SUBSCRIBE_PUBLISH,
GROUP_SUBSCRIBE_SUBSCRIBED,
GROUP_MY_BOARD,
GXS_VOTE_DOWN,
GXS_VOTE_UP,
PUBLIC,
EXTERNAL,
NODES_GROUP,
};