📛 Add remove badge from Inventory

This commit is contained in:
duckietm
2026-02-19 14:47:02 +01:00
parent 3cf8c9b89a
commit 2a67e9bb00
2 changed files with 35 additions and 17 deletions
@@ -1,7 +1,9 @@
import { DeleteBadgeMessageComposer } from '@nitrots/nitro-renderer';
import { FC, useEffect, useState } from 'react'; import { FC, useEffect, useState } from 'react';
import { LocalizeBadgeName, LocalizeText, UnseenItemCategory } from '../../../../api'; import { FaTrashAlt } from 'react-icons/fa';
import { LocalizeBadgeName, LocalizeText, SendMessageComposer, UnseenItemCategory } from '../../../../api';
import { LayoutBadgeImageView } from '../../../../common'; import { LayoutBadgeImageView } from '../../../../common';
import { useInventoryBadges, useInventoryUnseenTracker } from '../../../../hooks'; import { useInventoryBadges, useInventoryUnseenTracker, useNotification } from '../../../../hooks';
import { InfiniteGrid, NitroButton } from '../../../../layout'; import { InfiniteGrid, NitroButton } from '../../../../layout';
import { InventoryBadgeItemView } from './InventoryBadgeItemView'; import { InventoryBadgeItemView } from './InventoryBadgeItemView';
@@ -11,9 +13,24 @@ export const InventoryBadgeView: FC<{ filteredBadgeCodes?: string[] }> = props =
const [ isVisible, setIsVisible ] = useState(false); const [ isVisible, setIsVisible ] = useState(false);
const { badgeCodes = [], activeBadgeCodes = [], selectedBadgeCode = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, getBadgeId = null, activate = null, deactivate = null } = useInventoryBadges(); const { badgeCodes = [], activeBadgeCodes = [], selectedBadgeCode = null, isWearingBadge = null, canWearBadges = null, toggleBadge = null, getBadgeId = null, activate = null, deactivate = null } = useInventoryBadges();
const { isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker(); const { isUnseen = null, removeUnseen = null } = useInventoryUnseenTracker();
const { showConfirm = null } = useNotification();
const displayCodes = (filteredBadgeCodes !== null ? filteredBadgeCodes : badgeCodes); const displayCodes = (filteredBadgeCodes !== null ? filteredBadgeCodes : badgeCodes);
const attemptDeleteBadge = () =>
{
if(!selectedBadgeCode) return;
showConfirm(
LocalizeText('inventory.delete.confirm_delete.info', [ 'furniname', 'amount' ], [ LocalizeBadgeName(selectedBadgeCode), '1' ]),
() => SendMessageComposer(new DeleteBadgeMessageComposer(selectedBadgeCode)),
null,
null,
null,
LocalizeText('inventory.delete.confirm_delete.title')
);
};
useEffect(() => useEffect(() =>
{ {
if(!selectedBadgeCode || !isUnseen(UnseenItemCategory.BADGE, getBadgeId(selectedBadgeCode))) return; if(!selectedBadgeCode || !isUnseen(UnseenItemCategory.BADGE, getBadgeId(selectedBadgeCode))) return;
@@ -61,11 +78,17 @@ export const InventoryBadgeView: FC<{ filteredBadgeCodes?: string[] }> = props =
<LayoutBadgeImageView shrink badgeCode={ selectedBadgeCode } /> <LayoutBadgeImageView shrink badgeCode={ selectedBadgeCode } />
<span className="text-sm truncate grow">{ LocalizeBadgeName(selectedBadgeCode) }</span> <span className="text-sm truncate grow">{ LocalizeBadgeName(selectedBadgeCode) }</span>
</div> </div>
<NitroButton <div className="flex items-center gap-2">
disabled={ !isWearingBadge(selectedBadgeCode) && !canWearBadges() } <NitroButton
onClick={ event => toggleBadge(selectedBadgeCode) }> className="grow"
{ LocalizeText(isWearingBadge(selectedBadgeCode) ? 'inventory.badges.clearbadge' : 'inventory.badges.wearbadge') } disabled={ !isWearingBadge(selectedBadgeCode) && !canWearBadges() }
</NitroButton> onClick={ event => toggleBadge(selectedBadgeCode) }>
{ LocalizeText(isWearingBadge(selectedBadgeCode) ? 'inventory.badges.clearbadge' : 'inventory.badges.wearbadge') }
</NitroButton>
<NitroButton className="!bg-danger hover:!bg-danger/80 p-1" onClick={ attemptDeleteBadge }>
<FaTrashAlt className="fa-icon" />
</NitroButton>
</div>
</div> } </div> }
</div> </div>
</div> </div>
+5 -10
View File
@@ -61,29 +61,24 @@ const useInventoryBadgesState = () =>
useMessageEvent<BadgesEvent>(BadgesEvent, event => useMessageEvent<BadgesEvent>(BadgesEvent, event =>
{ {
const parser = event.getParser(); const parser = event.getParser();
const badgesToAdd: string[] = []; const allBadgeCodes = parser.getAllBadgeCodes();
setBadgeIds(prevValue => setBadgeIds(() =>
{ {
const newValue = new Map(prevValue); const newValue = new Map<string, number>();
parser.getAllBadgeCodes().forEach(code => allBadgeCodes.forEach(code =>
{ {
const exists = badgeCodes.indexOf(code) >= 0;
const badgeId = parser.getBadgeId(code); const badgeId = parser.getBadgeId(code);
newValue.set(code, badgeId); newValue.set(code, badgeId);
if(exists) return;
badgesToAdd.push(code);
}); });
return newValue; return newValue;
}); });
setActiveBadgeCodes(parser.getActiveBadgeCodes()); setActiveBadgeCodes(parser.getActiveBadgeCodes());
setBadgeCodes(prev => [ ...prev, ...badgesToAdd ]); setBadgeCodes(allBadgeCodes);
}); });
useMessageEvent<BadgeReceivedEvent>(BadgeReceivedEvent, event => useMessageEvent<BadgeReceivedEvent>(BadgeReceivedEvent, event =>