mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-11 10:53:52 +02:00
285 lines
6.8 KiB
JavaScript
285 lines
6.8 KiB
JavaScript
import { useAppearanceSettingsStore, useUserStore } from '../../stores';
|
|
import { languageMappings } from '../constants';
|
|
import { timeToText } from './base/format';
|
|
import { HueToHex } from './base/ui';
|
|
import { convertFileUrlToImageUrl } from './common';
|
|
|
|
/**
|
|
*
|
|
* @param {object} ctx
|
|
* @returns {string?}
|
|
*/
|
|
function userOnlineForTimestamp(ctx) {
|
|
if (ctx.ref.state === 'online' && ctx.ref.$online_for) {
|
|
return new Date(ctx.ref.$online_for).toJSON();
|
|
} else if (ctx.ref.state === 'active' && ctx.ref.$active_for) {
|
|
return new Date(ctx.ref.$active_for).toJSON();
|
|
} else if (ctx.ref.$offline_for) {
|
|
return new Date(ctx.ref.$offline_for).toJSON();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} language
|
|
* @returns
|
|
*/
|
|
function languageClass(language) {
|
|
const style = {};
|
|
const mapping = languageMappings[language];
|
|
if (typeof mapping !== 'undefined') {
|
|
style[mapping] = true;
|
|
} else {
|
|
style.unknown = true;
|
|
}
|
|
return style;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} userId
|
|
* @returns
|
|
*/
|
|
async function getNameColour(userId) {
|
|
const hue = await AppApi.GetColourFromUserID(userId);
|
|
return HueToHex(hue);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} text
|
|
* @returns
|
|
*/
|
|
function removeEmojis(text) {
|
|
if (!text) {
|
|
return '';
|
|
}
|
|
return text
|
|
.replace(
|
|
/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g,
|
|
''
|
|
)
|
|
.replace(/\s+/g, ' ')
|
|
.trim();
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {object} user
|
|
* @param {boolean} pendingOffline
|
|
* @returns
|
|
*/
|
|
function userStatusClass(user, pendingOffline = false) {
|
|
const userStore = useUserStore();
|
|
const style = {};
|
|
if (typeof user === 'undefined') {
|
|
return style;
|
|
}
|
|
let id = '';
|
|
if (user.id) {
|
|
id = user.id;
|
|
} else if (user.userId) {
|
|
id = user.userId;
|
|
}
|
|
if (id === userStore.currentUser.id) {
|
|
return statusClass(user.status);
|
|
}
|
|
if (!user.isFriend) {
|
|
return style;
|
|
}
|
|
if (pendingOffline) {
|
|
// Pending offline
|
|
style.offline = true;
|
|
} else if (
|
|
user.status !== 'active' &&
|
|
user.location === 'private' &&
|
|
user.state === '' &&
|
|
id &&
|
|
!userStore.currentUser.onlineFriends.includes(id)
|
|
) {
|
|
// temp fix
|
|
if (userStore.currentUser.activeFriends.includes(id)) {
|
|
// Active
|
|
style.active = true;
|
|
} else {
|
|
// Offline
|
|
style.offline = true;
|
|
}
|
|
} else if (user.state === 'active') {
|
|
// Active
|
|
style.active = true;
|
|
} else if (user.location === 'offline') {
|
|
// Offline
|
|
style.offline = true;
|
|
} else if (user.status === 'active') {
|
|
// Online
|
|
style.online = true;
|
|
} else if (user.status === 'join me') {
|
|
// Join Me
|
|
style.joinme = true;
|
|
} else if (user.status === 'ask me') {
|
|
// Ask Me
|
|
style.askme = true;
|
|
} else if (user.status === 'busy') {
|
|
// Do Not Disturb
|
|
style.busy = true;
|
|
}
|
|
if (
|
|
user.$platform &&
|
|
user.$platform !== 'standalonewindows' &&
|
|
user.$platform !== 'web'
|
|
) {
|
|
style.mobile = true;
|
|
}
|
|
return style;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} status
|
|
* @returns {object}
|
|
*/
|
|
function statusClass(status) {
|
|
const style = {};
|
|
if (typeof status !== 'undefined') {
|
|
if (status === 'active') {
|
|
// Online
|
|
style.online = true;
|
|
} else if (status === 'join me') {
|
|
// Join Me
|
|
style.joinme = true;
|
|
} else if (status === 'ask me') {
|
|
// Ask Me
|
|
style.askme = true;
|
|
} else if (status === 'busy') {
|
|
// Do Not Disturb
|
|
style.busy = true;
|
|
}
|
|
}
|
|
return style;
|
|
}
|
|
|
|
/**
|
|
* @param {object} user - User Ref Object
|
|
* @param {boolean} isIcon - is use for icon (about 40x40)
|
|
* @param {string} resolution - requested icon resolution (default 128),
|
|
* @param {boolean} isUserDialogIcon - is use for user dialog icon
|
|
* @returns {string} - img url
|
|
*/
|
|
function userImage(
|
|
user,
|
|
isIcon = false,
|
|
resolution = '128',
|
|
isUserDialogIcon = false
|
|
) {
|
|
const appAppearanceSettingsStore = useAppearanceSettingsStore();
|
|
if (!user) {
|
|
return '';
|
|
}
|
|
if (
|
|
(isUserDialogIcon && user.userIcon) ||
|
|
(appAppearanceSettingsStore.displayVRCPlusIconsAsAvatar &&
|
|
user.userIcon)
|
|
) {
|
|
if (isIcon) {
|
|
return convertFileUrlToImageUrl(user.userIcon);
|
|
}
|
|
return user.userIcon;
|
|
}
|
|
|
|
if (user.profilePicOverrideThumbnail) {
|
|
if (isIcon) {
|
|
return user.profilePicOverrideThumbnail.replace(
|
|
'/256',
|
|
`/${resolution}`
|
|
);
|
|
}
|
|
return user.profilePicOverrideThumbnail;
|
|
}
|
|
if (user.profilePicOverride) {
|
|
return user.profilePicOverride;
|
|
}
|
|
if (user.thumbnailUrl) {
|
|
return user.thumbnailUrl;
|
|
}
|
|
if (user.currentAvatarThumbnailImageUrl) {
|
|
if (isIcon) {
|
|
return user.currentAvatarThumbnailImageUrl.replace(
|
|
'/256',
|
|
`/${resolution}`
|
|
);
|
|
}
|
|
return user.currentAvatarThumbnailImageUrl;
|
|
}
|
|
if (user.currentAvatarImageUrl) {
|
|
if (isIcon) {
|
|
return convertFileUrlToImageUrl(user.currentAvatarImageUrl);
|
|
}
|
|
return user.currentAvatarImageUrl;
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {object} user
|
|
* @returns {string|*}
|
|
*/
|
|
function userImageFull(user) {
|
|
const appAppearanceSettingsStore = useAppearanceSettingsStore();
|
|
if (
|
|
appAppearanceSettingsStore.displayVRCPlusIconsAsAvatar &&
|
|
user.userIcon
|
|
) {
|
|
return user.userIcon;
|
|
}
|
|
if (user.profilePicOverride) {
|
|
return user.profilePicOverride;
|
|
}
|
|
return user.currentAvatarImageUrl;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} user
|
|
* @returns {*|string}
|
|
*/
|
|
function parseUserUrl(user) {
|
|
const url = new URL(user);
|
|
const urlPath = url.pathname;
|
|
if (urlPath.substring(5, 11) === '/user/') {
|
|
const userId = urlPath.substring(11);
|
|
return userId;
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {object} ctx
|
|
* @returns {string}
|
|
*/
|
|
function userOnlineFor(ctx) {
|
|
if (ctx.ref.state === 'online' && ctx.ref.$online_for) {
|
|
return timeToText(Date.now() - ctx.ref.$online_for);
|
|
} else if (ctx.ref.state === 'active' && ctx.ref.$active_for) {
|
|
return timeToText(Date.now() - ctx.ref.$active_for);
|
|
} else if (ctx.ref.$offline_for) {
|
|
return timeToText(Date.now() - ctx.ref.$offline_for);
|
|
}
|
|
return '-';
|
|
}
|
|
|
|
export {
|
|
userOnlineForTimestamp,
|
|
languageClass,
|
|
getNameColour,
|
|
removeEmojis,
|
|
userStatusClass,
|
|
statusClass,
|
|
userImage,
|
|
userImageFull,
|
|
parseUserUrl,
|
|
userOnlineFor
|
|
};
|