From 61ca898f9c3b2fc560872c02641b442be4cbc665 Mon Sep 17 00:00:00 2001 From: toca Date: Mon, 20 Oct 2025 07:15:49 +0200 Subject: [PATCH] Create avatar utils file in common --- src/common/avatarUtils.js | 68 +++++++++++++++++++++++++++++++++++++++ src/common/index.js | 5 +++ 2 files changed, 73 insertions(+) create mode 100644 src/common/avatarUtils.js diff --git a/src/common/avatarUtils.js b/src/common/avatarUtils.js new file mode 100644 index 000000000..235d8a994 --- /dev/null +++ b/src/common/avatarUtils.js @@ -0,0 +1,68 @@ +// Copyright (C) 2017-2025 Smart code 203358507 + +const CryptoJS = require('crypto-js'); + +const getGravatarUrl = (email, size = 200, defaultType = 'retro', rating = 'pg') => { + if (!email || typeof email !== 'string') { + throw new Error('Email is required and must be a string'); + } + + // Generate proper MD5 hash as required by Gravatar + const hash = CryptoJS.MD5(email.toLowerCase().trim()).toString(); + return `https://www.gravatar.com/avatar/${hash}?s=${size}&d=${defaultType}&r=${rating}`; +}; + +const getAvatarUrl = (auth, size = 200) => { + // Anonymous user + if (!auth) { + // Return the webpack asset path for anonymous image + try { + return require('../../images/anonymous.png'); + } catch (_) { + return '/images/anonymous.png'; + } + } + + // Custom avatar takes priority + if (auth.user.avatar) { + return auth.user.avatar; + } + + // Gravatar if email exists + if (auth.user.email) { + return getGravatarUrl(auth.user.email, size); + } + + // Default avatar fallback + try { + return require('../../images/default_avatar.png'); + } catch (_) { + return '/images/default_avatar.png'; + } +}; + +// Available Gravatar default types +const GRAVATAR_DEFAULTS = { + MYSTERY_PERSON: 'mp', + IDENTICON: 'identicon', + MONSTER: 'monsterid', + WAVATAR: 'wavatar', + RETRO: 'retro', + ROBOHASH: 'robohash', + BLANK: 'blank' +}; + +// Available Gravatar ratings +const GRAVATAR_RATINGS = { + G: 'g', // General - suitable for all audiences + PG: 'pg', // Parental guidance suggested + R: 'r', // Restricted + X: 'x' // Adult content +}; + +module.exports = { + getGravatarUrl, + getAvatarUrl, + GRAVATAR_DEFAULTS, + GRAVATAR_RATINGS +}; diff --git a/src/common/index.js b/src/common/index.js index 25df5c158..652ec05b2 100644 --- a/src/common/index.js +++ b/src/common/index.js @@ -29,6 +29,7 @@ const useTorrent = require('./useTorrent'); const useTranslate = require('./useTranslate'); const { default: useOrientation } = require('./useOrientation'); const { default: useLanguageSorting } = require('./useLanguageSorting'); +const { getGravatarUrl, getAvatarUrl, GRAVATAR_DEFAULTS, GRAVATAR_RATINGS } = require('./avatarUtils'); module.exports = { FileDropProvider, @@ -65,4 +66,8 @@ module.exports = { useTranslate, useOrientation, useLanguageSorting, + getGravatarUrl, + getAvatarUrl, + GRAVATAR_DEFAULTS, + GRAVATAR_RATINGS, };