import { BadgeImageReadyEvent, GetEventDispatcher, GetSessionDataManager, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; import { GetConfigurationValue, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; import { Base, BaseProps } from '../Base'; export interface LayoutBadgeImageViewProps extends BaseProps { badgeCode: string; isGroup?: boolean; showInfo?: boolean; customTitle?: string; isGrayscale?: boolean; scale?: number; } export const LayoutBadgeImageView: FC = props => { const { badgeCode = null, isGroup = false, showInfo = false, customTitle = null, isGrayscale = false, scale = 1, classNames = [], style = {}, children = null, ...rest } = props; const [ imageElement, setImageElement ] = useState(null); const getClassNames = useMemo(() => { const newClassNames: string[] = [ 'relative w-[40px] h-[40px] bg-no-repeat bg-center' ]; if(isGroup) newClassNames.push('group-badge'); if(isGrayscale) newClassNames.push('grayscale'); if(classNames.length) newClassNames.push(...classNames); return newClassNames; }, [ classNames, isGroup, isGrayscale ]); const getStyle = useMemo(() => { let newStyle: CSSProperties = {}; if(imageElement) { newStyle.backgroundImage = `url(${ (isGroup) ? imageElement.src : GetConfigurationValue('badge.asset.url').replace('%badgename%', badgeCode.toString()) })`; newStyle.width = imageElement.width; newStyle.height = imageElement.height; if(scale !== 1) { newStyle.transform = `scale(${ scale })`; if(!(scale % 1)) newStyle.imageRendering = 'pixelated'; newStyle.width = (imageElement.width * scale); newStyle.height = (imageElement.height * scale); } } if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; }, [ badgeCode, isGroup, imageElement, scale, style ]); useEffect(() => { if(!badgeCode || !badgeCode.length) return; let didSetBadge = false; const onBadgeImageReadyEvent = async (event: BadgeImageReadyEvent) => { if(event.badgeId !== badgeCode) return; if(isGroup) { const element = await TextureUtils.generateImage(new NitroSprite(event.image)); element.onload = () => setImageElement(element); } else { const badgeUrl = GetConfigurationValue('badge.asset.url').replace('%badgename%', badgeCode.toString()); const img = new Image(); img.onload = () => setImageElement(img); img.src = badgeUrl; } didSetBadge = true; GetEventDispatcher().removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); }; GetEventDispatcher().addEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); const texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode); if(texture && !didSetBadge) { if(isGroup) { (async () => { const element = await TextureUtils.generateImage(new NitroSprite(texture)); element.onload = () => setImageElement(element); })(); } else { const badgeUrl = GetConfigurationValue('badge.asset.url').replace('%badgename%', badgeCode.toString()); const img = new Image(); img.onload = () => setImageElement(img); img.src = badgeUrl; } } return () => GetEventDispatcher().removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); }, [ badgeCode, isGroup ]); return ( { (showInfo && GetConfigurationValue('badge.descriptions.enabled', true)) &&
{ isGroup ? customTitle : LocalizeBadgeName(badgeCode) }
{ isGroup ? LocalizeText('group.badgepopup.body') : LocalizeBadgeDescription(badgeCode) }
} { children } ); };