mirror of
https://github.com/RetroShare/RSNewWebUI.git
synced 2026-09-12 19:50:04 +05:00
191 lines
5.0 KiB
JavaScript
191 lines
5.0 KiB
JavaScript
const m = require('mithril');
|
|
const rs = require('rswebui');
|
|
const Data = require('network/network_data');
|
|
const peopleUtil = require('people/people_util');
|
|
|
|
const State = {
|
|
ownProfile: {
|
|
name: 'Loading...',
|
|
ssl_id: '',
|
|
gpg_id: '',
|
|
customState: '',
|
|
avatar: '',
|
|
},
|
|
ownGxsIds: [],
|
|
selectedOwnGxsId: '',
|
|
selectedOwnGxsDetails: null,
|
|
selectedFriendGpgId: null,
|
|
activeTab: 'details', // 'details' | 'chat'
|
|
searchString: '',
|
|
gpgToGxsIdMap: {},
|
|
gxsIdToDetailsMap: {},
|
|
gxsIdentities: [],
|
|
currentChatPeerId: null,
|
|
chatMessages: [],
|
|
chatInputMsg: '',
|
|
showMailCompose: false,
|
|
};
|
|
|
|
function loadOwnProfile() {
|
|
rs.rsJsonApiRequest('/rsConfig/getConfigNetStatus', {}, (data) => {
|
|
if (data && data.status) {
|
|
State.ownProfile.name = data.status.ownName || 'Unknown';
|
|
State.ownProfile.ssl_id = data.status.ownId || '';
|
|
|
|
if (State.ownProfile.ssl_id) {
|
|
rs.rsJsonApiRequest('/rsChats/getCustomStateString', { peer_id: State.ownProfile.ssl_id }, (statusData) => {
|
|
if (statusData && statusData.retval) {
|
|
State.ownProfile.customState = statusData.retval;
|
|
m.redraw();
|
|
}
|
|
});
|
|
|
|
rs.rsJsonApiRequest('/rsPeers/getPeerDetails', { sslId: State.ownProfile.ssl_id }, (detData) => {
|
|
if (detData && detData.det && detData.det.gpg_id) {
|
|
State.ownProfile.gpg_id = detData.det.gpg_id;
|
|
m.redraw();
|
|
}
|
|
});
|
|
|
|
rs.rsJsonApiRequest('/rsChats/getAvatar', { pid: State.ownProfile.ssl_id }, (avatarData) => {
|
|
if (avatarData && avatarData.retval && avatarData.avatar_base64_string) {
|
|
State.ownProfile.avatar = avatarData.avatar_base64_string;
|
|
m.redraw();
|
|
}
|
|
});
|
|
}
|
|
m.redraw();
|
|
}
|
|
});
|
|
|
|
peopleUtil.ownIds((ids) => {
|
|
if (ids) {
|
|
State.ownGxsIds = ids.filter(
|
|
(id) => id && id !== '0000000000000000' && Number(id) !== 0
|
|
);
|
|
if (State.ownGxsIds.length > 0 && !State.selectedOwnGxsId) {
|
|
State.selectedOwnGxsId = State.ownGxsIds[0];
|
|
loadSelectedOwnGxsDetails();
|
|
}
|
|
m.redraw();
|
|
}
|
|
});
|
|
}
|
|
|
|
function loadSelectedOwnGxsDetails() {
|
|
if (!State.selectedOwnGxsId) return;
|
|
rs.rsJsonApiRequest(
|
|
'/rsIdentity/getIdDetails',
|
|
{ id: State.selectedOwnGxsId },
|
|
(data) => {
|
|
if (data && data.details) {
|
|
State.selectedOwnGxsDetails = data.details;
|
|
m.redraw();
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
function fetchIdDetails(gxsId) {
|
|
if (!gxsId) return;
|
|
if (State.gxsIdToDetailsMap[gxsId] === undefined) {
|
|
State.gxsIdToDetailsMap[gxsId] = null;
|
|
rs.rsJsonApiRequest('/rsIdentity/getIdDetails', { id: gxsId }, (detData) => {
|
|
if (detData && detData.details) {
|
|
State.gxsIdToDetailsMap[gxsId] = detData.details;
|
|
const pgpId = detData.details.mPgpId;
|
|
if (pgpId && pgpId !== '0000000000000000') {
|
|
State.gpgToGxsIdMap[pgpId.toLowerCase()] = gxsId;
|
|
}
|
|
m.redraw();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function loadGxsIdentities() {
|
|
rs.rsJsonApiRequest('/rsIdentity/getIdentitiesSummaries', {}, (data) => {
|
|
if (data && data.ids) {
|
|
State.gxsIdentities = data.ids.map((u) => u.mGroupId);
|
|
m.redraw();
|
|
}
|
|
});
|
|
}
|
|
|
|
function startDirectChat(sslId) {
|
|
State.currentChatPeerId = sslId;
|
|
State.chatMessages = [];
|
|
loadDirectChatMessages();
|
|
}
|
|
|
|
function getOnlineSslId(gpgId) {
|
|
const friend = Data.gpgDetails[gpgId];
|
|
if (!friend || !friend.locations || friend.locations.length === 0) return null;
|
|
const onlineLoc = friend.locations.find((loc) => loc.isOnline);
|
|
return onlineLoc ? onlineLoc.id : friend.locations[0].id;
|
|
}
|
|
|
|
function loadDirectChatMessages() {
|
|
rs.events[15].notify = (chatMessage) => {
|
|
if (
|
|
chatMessage.chat_id &&
|
|
(chatMessage.chat_id.type === 1 || chatMessage.chat_id.type === 2) &&
|
|
rs.idToHex(chatMessage.chat_id) === State.currentChatPeerId
|
|
) {
|
|
State.chatMessages.push(chatMessage);
|
|
m.redraw();
|
|
scrollChatToBottom();
|
|
}
|
|
};
|
|
}
|
|
|
|
function sendDirectChatMessage() {
|
|
if (!State.chatInputMsg.trim() || !State.currentChatPeerId) return;
|
|
|
|
const msg = State.chatInputMsg;
|
|
State.chatInputMsg = '';
|
|
|
|
rs.rsJsonApiRequest(
|
|
'/rsChats/sendChat',
|
|
{
|
|
id: { type: 1, peer_id: State.currentChatPeerId },
|
|
msg,
|
|
},
|
|
(data, success) => {
|
|
if (success) {
|
|
State.chatMessages.push({
|
|
chat_id: { type: 1, peer_id: State.currentChatPeerId },
|
|
msg,
|
|
sendTime: Date.now() / 1000,
|
|
incoming: false,
|
|
own: true,
|
|
});
|
|
m.redraw();
|
|
scrollChatToBottom();
|
|
} else {
|
|
console.error('[RS] Failed to send direct chat message');
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
function scrollChatToBottom() {
|
|
setTimeout(() => {
|
|
const el = document.getElementById('chat-messages-container');
|
|
if (el) el.scrollTop = el.scrollHeight;
|
|
}, 100);
|
|
}
|
|
|
|
module.exports = {
|
|
State,
|
|
loadOwnProfile,
|
|
loadSelectedOwnGxsDetails,
|
|
fetchIdDetails,
|
|
loadGxsIdentities,
|
|
startDirectChat,
|
|
getOnlineSslId,
|
|
loadDirectChatMessages,
|
|
sendDirectChatMessage,
|
|
scrollChatToBottom,
|
|
};
|