mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-20 07:13:51 +02:00
refactor store
This commit is contained in:
120
src/shared/utils/notificationTransforms.js
Normal file
120
src/shared/utils/notificationTransforms.js
Normal file
@@ -0,0 +1,120 @@
|
||||
import { replaceBioSymbols } from './base/string';
|
||||
|
||||
/**
|
||||
* Remove null/undefined keys from a notification JSON object
|
||||
* and sanitize message/title fields with replaceBioSymbols.
|
||||
* @param {object} json - notification data (mutated in place)
|
||||
* @returns {object} the same json reference
|
||||
*/
|
||||
export function sanitizeNotificationJson(json) {
|
||||
for (const key in json) {
|
||||
if (json[key] === null || typeof json[key] === 'undefined') {
|
||||
delete json[key];
|
||||
}
|
||||
}
|
||||
if (json.message) {
|
||||
json.message = replaceBioSymbols(json.message);
|
||||
}
|
||||
if (json.title) {
|
||||
json.title = replaceBioSymbols(json.title);
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a notification's details field from string to object if needed.
|
||||
* @param {*} details - raw details value
|
||||
* @returns {object} parsed details object
|
||||
*/
|
||||
export function parseNotificationDetails(details) {
|
||||
if (details === Object(details)) {
|
||||
return details;
|
||||
}
|
||||
if (details !== '{}' && typeof details === 'string') {
|
||||
try {
|
||||
const object = JSON.parse(details);
|
||||
if (object === Object(object)) {
|
||||
return object;
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a default V1 notification ref from JSON data.
|
||||
* Does NOT perform cache lookup — caller is responsible for
|
||||
* checking existing refs and merging.
|
||||
* @param {object} json - sanitized notification JSON
|
||||
* @returns {object} default notification ref
|
||||
*/
|
||||
export function createDefaultNotificationRef(json) {
|
||||
const ref = {
|
||||
id: '',
|
||||
senderUserId: '',
|
||||
senderUsername: '',
|
||||
type: '',
|
||||
message: '',
|
||||
details: {},
|
||||
seen: false,
|
||||
created_at: '',
|
||||
// VRCX
|
||||
$isExpired: false,
|
||||
//
|
||||
...json
|
||||
};
|
||||
ref.details = parseNotificationDetails(ref.details);
|
||||
return ref;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a default V2 notification ref from JSON data.
|
||||
* Handles boop legacy formatting.
|
||||
* @param {object} json - sanitized notification JSON
|
||||
* @param {string} endpointDomain - API endpoint domain for emoji URLs
|
||||
* @returns {object} default notification V2 ref
|
||||
*/
|
||||
export function createDefaultNotificationV2Ref(json) {
|
||||
return {
|
||||
id: '',
|
||||
createdAt: '',
|
||||
updatedAt: '',
|
||||
expiresAt: '',
|
||||
type: '',
|
||||
link: '',
|
||||
linkText: '',
|
||||
message: '',
|
||||
title: '',
|
||||
imageUrl: '',
|
||||
seen: false,
|
||||
senderUserId: '',
|
||||
senderUsername: '',
|
||||
data: {},
|
||||
responses: [],
|
||||
details: {},
|
||||
version: 2,
|
||||
...json
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply legacy boop formatting to a V2 notification ref.
|
||||
* Mutates the ref in place.
|
||||
* @param {object} ref - notification V2 ref
|
||||
* @param {string} endpointDomain - API endpoint domain for emoji URLs
|
||||
*/
|
||||
export function applyBoopLegacyHandling(ref, endpointDomain) {
|
||||
if (ref.type !== 'boop' || !ref.title) {
|
||||
return;
|
||||
}
|
||||
ref.message = ref.title;
|
||||
ref.title = '';
|
||||
if (ref.details?.emojiId?.startsWith('default_')) {
|
||||
ref.imageUrl = ref.details.emojiId;
|
||||
ref.message += ` ${ref.details.emojiId.replace('default_', '')}`;
|
||||
} else {
|
||||
ref.imageUrl = `${endpointDomain}/file/${ref.details.emojiId}/${ref.details.emojiVersion}`;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user