verdnatura-chat/app/lib/methods/helpers.ts

115 lines
3.5 KiB
TypeScript

// @ts-nocheck - TEMP
import log from '../../utils/log';
import { store as reduxStore } from '../store/auxStore';
import database from '../database';
export function isGroupChat(room): boolean {
return ((room.uids && room.uids.length > 2) || (room.usernames && room.usernames.length > 2)) ?? false;
}
export function getRoomAvatar(room) {
if (isGroupChat(room) && room.uids && room.usernames) {
return room.uids.length + room.usernames.join();
}
return room.prid ? room.fname : room.name;
}
export function getUidDirectMessage(room) {
const { id: userId } = reduxStore.getState().login.user;
if (!room) {
return null;
}
// legacy method
if (!room?.uids && room.rid && room.t === 'd' && userId) {
return room.rid.replace(userId, '').trim();
}
if (isGroupChat(room)) {
return null;
}
const me = room.uids?.find(uid => uid === userId);
const other = room.uids?.filter(uid => uid !== userId);
return other && other.length ? other[0] : me;
}
export function getRoomTitle(room) {
const { UI_Use_Real_Name: useRealName, UI_Allow_room_names_with_special_chars: allowSpecialChars } =
reduxStore.getState().settings;
const { username } = reduxStore.getState().login.user;
if (isGroupChat(room) && !(room.name && room.name.length) && room.usernames) {
return room.usernames
.filter(u => u !== username)
.sort((u1, u2) => u1.localeCompare(u2))
.join(', ');
}
if (allowSpecialChars && room.t !== 'd') {
return room.fname || room.name;
}
return ((room.prid || useRealName) && room.fname) || room.name;
}
export function getSenderName(sender) {
const { UI_Use_Real_Name: useRealName } = reduxStore.getState().settings;
return useRealName ? sender.name : sender.username;
}
export function canAutoTranslate() {
try {
const { AutoTranslate_Enabled } = reduxStore.getState().settings;
if (!AutoTranslate_Enabled) {
return false;
}
const autoTranslatePermission = reduxStore.getState().permissions['auto-translate'];
const userRoles = reduxStore.getState().login?.user?.roles ?? [];
return autoTranslatePermission?.some(role => userRoles.includes(role)) ?? false;
} catch (e) {
log(e);
return false;
}
}
export function isRead(item) {
let isUnread = item.archived !== true && item.open === true; // item is not archived and not opened
isUnread = isUnread && (item.unread > 0 || item.alert === true); // either its unread count > 0 or its alert
return !isUnread;
}
export function hasRole(role): boolean {
const shareUser = reduxStore.getState().share.user;
const loginUser = reduxStore.getState().login.user;
const userRoles = shareUser?.roles || loginUser?.roles || [];
return userRoles.indexOf(role) > -1;
}
export async function hasPermission(permissions, rid?: any): boolean[] {
let roomRoles = [];
if (rid) {
const db = database.active;
const subsCollection = db.get('subscriptions');
try {
// get the room from database
const room = await subsCollection.find(rid);
// get room roles
roomRoles = room.roles || [];
} catch (error) {
console.log('hasPermission -> Room not found');
return permissions.map(() => false);
}
}
try {
const shareUser = reduxStore.getState().share.user;
const loginUser = reduxStore.getState().login.user;
// get user roles on the server from redux
const userRoles = shareUser?.roles || loginUser?.roles || [];
const mergedRoles = [...new Set([...roomRoles, ...userRoles])];
return permissions.map(permission => permission?.some(r => mergedRoles.includes(r) ?? false));
} catch (e) {
log(e);
}
}