pl-fe: default avatar/header detection cleanup

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk
2025-10-27 11:43:19 +01:00
parent ef1aba32af
commit f50ac8d73e
9 changed files with 46 additions and 45 deletions

View File

@ -1,6 +1,7 @@
import pick from 'lodash.pick';
import * as v from 'valibot';
import { isDefaultAvatar, isDefaultHeader } from '../utils/accounts';
import { guessFqn } from '../utils/domain';
import { customEmojiSchema } from './custom-emoji';
@ -30,6 +31,8 @@ const preprocessAccount = v.transform((account: any) => {
domain,
avatar: account.avatar || account.avatar_static,
header: account.header || account.header_static,
avatar_default: isDefaultAvatar(account.avatar || account.avatar_static),
header_default: isDefaultHeader(account.header || account.header_static),
local: typeof account.pleroma?.is_local === 'boolean' ? account.pleroma.is_local : account.acct.split('@')[1] === undefined,
discoverable: account.discoverable || account.pleroma?.source?.discoverable,
verified: account.verified || account.pleroma?.tags?.includes('verified'),
@ -187,6 +190,9 @@ const baseAccountSchema = v.object({
pleroma: v.optional(v.any(), undefined),
source: v.optional(v.any(), undefined),
}),
avatar_default: v.fallback(v.boolean(), false),
header_default: v.fallback(v.boolean(), false),
});
const accountWithMovedAccountSchema = v.object({

View File

@ -1,5 +1,6 @@
import * as v from 'valibot';
import { isDefaultAvatar, isDefaultHeader } from '../utils/accounts';
import { getDomainFromURL } from '../utils/domain';
import { customEmojiSchema } from './custom-emoji';
@ -35,6 +36,8 @@ const groupSchema = v.pipe(v.any(), v.transform((group: any) => {
...group,
avatar: group.avatar || group.avatar_static,
header: group.header || group.header_static,
avatar_default: isDefaultAvatar(group.avatar || group.avatar_static),
header_default: isDefaultHeader(group.header || group.header_static),
};
}), v.object({
avatar: v.fallback(v.string(), ''),
@ -58,6 +61,9 @@ const groupSchema = v.pipe(v.any(), v.transform((group: any) => {
avatar_description: v.fallback(v.string(), ''),
header_description: v.fallback(v.string(), ''),
avatar_default: v.fallback(v.boolean(), false),
header_default: v.fallback(v.boolean(), false),
}));
/**

View File

@ -0,0 +1,27 @@
/** Default header filenames from various backends */
const DEFAULT_HEADERS: string[] = [
'/assets/default_header.webp', // GoToSocial
'/headers/original/missing.png', // Mastodon
'/api/v1/accounts/identicon', // Mitra
'/images/banner.png', // Pleroma
'/assets/transparent.png', // Iceshrimp.net
];
/** Check if the avatar is a default avatar */
const isDefaultHeader = (url: string = '') => url === '' || DEFAULT_HEADERS.some(header => url.endsWith(header));
/** Default avatar filenames from various backends */
const DEFAULT_AVATARS = [
...([1, 2, 3, 4, 5, 6].map(i => `/assets/default_avatars/GoToSocial_icon${i}.webp`)), // GoToSocial
'/avatars/original/missing.png', // Mastodon
'/api/v1/accounts/identicon', // Mitra
'/images/avi.png', // Pleroma
];
/** Check if the avatar is a default avatar */
const isDefaultAvatar = (url: string = '') => url === '' || DEFAULT_AVATARS.some(avatar => url.endsWith(avatar));
export {
isDefaultHeader,
isDefaultAvatar,
};