177 lines
5.1 KiB
TypeScript
177 lines
5.1 KiB
TypeScript
|
// @ts-nocheck - TEMP
|
||
|
import AsyncStorage from '@react-native-community/async-storage';
|
||
|
|
||
|
import log from '../../../utils/log';
|
||
|
import { store as reduxStore } from '../../auxStore';
|
||
|
import { ANALYTICS_EVENTS_KEY, CRASH_REPORT_KEY } from '../../constants';
|
||
|
import defaultSettings from '../../../constants/settings';
|
||
|
import database from '../../database';
|
||
|
import subscribeRoomsTmp from '../../methods/subscriptions/rooms';
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
// AsyncStorage
|
||
|
export async function getAllowCrashReport() {
|
||
|
const allowCrashReport = await AsyncStorage.getItem(CRASH_REPORT_KEY);
|
||
|
if (allowCrashReport === null) {
|
||
|
return true;
|
||
|
}
|
||
|
return JSON.parse(allowCrashReport);
|
||
|
}
|
||
|
|
||
|
export async function getAllowAnalyticsEvents() {
|
||
|
const allowAnalyticsEvents = await AsyncStorage.getItem(ANALYTICS_EVENTS_KEY);
|
||
|
if (allowAnalyticsEvents === null) {
|
||
|
return true;
|
||
|
}
|
||
|
return JSON.parse(allowAnalyticsEvents);
|
||
|
}
|
||
|
|
||
|
// TODO: remove this
|
||
|
export async function subscribeRooms(this: any) {
|
||
|
if (!this.roomsSub) {
|
||
|
try {
|
||
|
// TODO: We need to change this naming. Maybe move this logic to the SDK?
|
||
|
this.roomsSub = await subscribeRoomsTmp.call(this);
|
||
|
} catch (e) {
|
||
|
log(e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// TODO: remove this
|
||
|
export function unsubscribeRooms(this: any) {
|
||
|
if (this.roomsSub) {
|
||
|
this.roomsSub.stop();
|
||
|
this.roomsSub = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function parseSettings(settings) {
|
||
|
return settings.reduce((ret, item) => {
|
||
|
ret[item._id] = defaultSettings[item._id] && item[defaultSettings[item._id].type];
|
||
|
if (item._id === 'Hide_System_Messages') {
|
||
|
ret[item._id] = ret[item._id].reduce(
|
||
|
(array, value) => [...array, ...(value === 'mute_unmute' ? ['user-muted', 'user-unmuted'] : [value])],
|
||
|
[]
|
||
|
);
|
||
|
}
|
||
|
return ret;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export function _prepareSettings(settings) {
|
||
|
return settings.map(setting => {
|
||
|
setting[defaultSettings[setting._id].type] = setting.value;
|
||
|
return setting;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export async function hasPermission(permissions, rid?: any) {
|
||
|
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);
|
||
|
}
|
||
|
}
|