2022-03-30 10:19:09 -04:00
|
|
|
import { BadgeReceivedEvent, BadgesEvent, RequestBadgesComposer, SetActivatedBadgesComposer } from '@nitrots/nitro-renderer';
|
|
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
|
|
import { useBetween } from 'use-between';
|
2022-04-01 17:08:50 -04:00
|
|
|
import { UseMessageEventHook } from '..';
|
2022-03-30 12:42:04 -04:00
|
|
|
import { GetConfiguration, SendMessageComposer } from '../../api';
|
2022-03-30 10:19:09 -04:00
|
|
|
import { useSharedVisibility } from '../useSharedVisibility';
|
|
|
|
|
2022-03-30 12:46:48 -04:00
|
|
|
const useInventoryBadgesState = () =>
|
2022-03-30 10:19:09 -04:00
|
|
|
{
|
|
|
|
const [ isVisible, setIsVisible ] = useState(false);
|
|
|
|
const [ needsUpdate, setNeedsUpdate ] = useState(true);
|
2022-03-30 12:42:04 -04:00
|
|
|
const [ badgeCodes, setBadgeCodes ] = useState<string[]>([]);
|
|
|
|
const [ badgeIds, setBadgeIds ] = useState<number[]>([]);
|
|
|
|
const [ activeBadgeCodes, setActiveBadgeCodes ] = useState<string[]>([]);
|
|
|
|
const [ selectedBadgeCode, setSelectedBadgeCode ] = useState<string>(null);
|
2022-03-30 10:19:09 -04:00
|
|
|
|
|
|
|
const maxBadgeCount = GetConfiguration<number>('user.badges.max.slots', 5);
|
2022-03-30 12:42:04 -04:00
|
|
|
const isWearingBadge = (badgeCode: string) => (activeBadgeCodes.indexOf(badgeCode) >= 0);
|
|
|
|
const canWearBadges = () => (activeBadgeCodes.length < maxBadgeCount);
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-03-30 12:42:04 -04:00
|
|
|
const toggleBadge = (badgeCode: string) =>
|
2022-03-30 10:19:09 -04:00
|
|
|
{
|
2022-03-30 12:42:04 -04:00
|
|
|
setActiveBadgeCodes(prevValue =>
|
2022-04-01 17:08:50 -04:00
|
|
|
{
|
|
|
|
const newValue = [ ...prevValue ];
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
const index = newValue.indexOf(badgeCode);
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
if(index === -1)
|
|
|
|
{
|
|
|
|
if(!canWearBadges()) return prevValue;
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
newValue.push(badgeCode);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
newValue.splice(index, 1);
|
|
|
|
}
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
const composer = new SetActivatedBadgesComposer();
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
for(let i = 0; i < maxBadgeCount; i++) composer.addActivatedBadge(newValue[i] || null);
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
SendMessageComposer(composer);
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
return newValue;
|
|
|
|
});
|
2022-03-30 10:19:09 -04:00
|
|
|
}
|
|
|
|
|
2022-03-30 12:42:04 -04:00
|
|
|
const selectBadge = (badgeCode: string) =>
|
2022-03-30 10:19:09 -04:00
|
|
|
{
|
2022-03-30 12:42:04 -04:00
|
|
|
if(badgeCodes.indexOf(badgeCode) === -1) return;
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-03-30 12:42:04 -04:00
|
|
|
setSelectedBadgeCode(badgeCode);
|
|
|
|
}
|
|
|
|
|
|
|
|
const getBadgeId = (badgeCode: string) =>
|
|
|
|
{
|
|
|
|
const index = badgeCodes.indexOf(badgeCode);
|
|
|
|
|
|
|
|
if(index === -1) return 0;
|
|
|
|
|
|
|
|
return (badgeIds[index] || 0);
|
2022-03-30 10:19:09 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
const onBadgesEvent = useCallback((event: BadgesEvent) =>
|
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
2022-04-01 17:08:50 -04:00
|
|
|
const newBadgeCodes = parser.getAllBadgeCodes();
|
|
|
|
const newBadgeIds: number[] = [];
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
for(const newBadgeCode of newBadgeCodes) newBadgeIds.push(parser.getBadgeId(newBadgeCode));
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
setBadgeCodes(newBadgeCodes);
|
|
|
|
setBadgeIds(newBadgeIds);
|
|
|
|
setActiveBadgeCodes(parser.getActiveBadgeCodes());
|
2022-03-30 10:19:09 -04:00
|
|
|
}, []);
|
|
|
|
|
|
|
|
UseMessageEventHook(BadgesEvent, onBadgesEvent);
|
|
|
|
|
|
|
|
const onBadgeReceivedEvent = useCallback((event: BadgeReceivedEvent) =>
|
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
setBadgeCodes(prevValue =>
|
|
|
|
{
|
|
|
|
const newValue = [ ...prevValue ];
|
|
|
|
|
|
|
|
newValue.push(parser.badgeCode);
|
|
|
|
|
|
|
|
return newValue;
|
|
|
|
});
|
|
|
|
|
|
|
|
setBadgeIds(prevValue =>
|
2022-03-30 12:42:04 -04:00
|
|
|
{
|
2022-04-01 17:08:50 -04:00
|
|
|
const newValue = [ ...prevValue ];
|
|
|
|
|
|
|
|
newValue.push(parser.badgeId);
|
|
|
|
|
|
|
|
return newValue;
|
2022-03-30 12:42:04 -04:00
|
|
|
});
|
2022-03-30 10:19:09 -04:00
|
|
|
}, []);
|
|
|
|
|
|
|
|
UseMessageEventHook(BadgeReceivedEvent, onBadgeReceivedEvent);
|
|
|
|
|
|
|
|
useEffect(() =>
|
|
|
|
{
|
2022-03-30 12:42:04 -04:00
|
|
|
if(!badgeCodes || !badgeCodes.length) return;
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-03-30 12:42:04 -04:00
|
|
|
setSelectedBadgeCode(prevValue =>
|
2022-04-01 17:08:50 -04:00
|
|
|
{
|
|
|
|
let newValue = prevValue;
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
if(newValue && (badgeCodes.indexOf(newValue) === -1)) newValue = null;
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
if(!newValue) newValue = badgeCodes[0];
|
2022-03-30 10:19:09 -04:00
|
|
|
|
2022-04-01 17:08:50 -04:00
|
|
|
return newValue;
|
|
|
|
});
|
2022-03-30 12:42:04 -04:00
|
|
|
}, [ badgeCodes ]);
|
2022-03-30 10:19:09 -04:00
|
|
|
|
|
|
|
useEffect(() =>
|
|
|
|
{
|
|
|
|
if(!isVisible || !needsUpdate) return;
|
|
|
|
|
|
|
|
SendMessageComposer(new RequestBadgesComposer());
|
|
|
|
|
|
|
|
setNeedsUpdate(false);
|
|
|
|
}, [ isVisible, needsUpdate ]);
|
|
|
|
|
2022-03-30 12:42:04 -04:00
|
|
|
return { badgeCodes, activeBadgeCodes, selectedBadgeCode, isWearingBadge, canWearBadges, toggleBadge, selectBadge, getBadgeId, setIsVisible };
|
2022-03-30 10:19:09 -04:00
|
|
|
}
|
|
|
|
|
2022-03-30 12:46:48 -04:00
|
|
|
export const useInventoryBadges = () =>
|
2022-03-30 10:19:09 -04:00
|
|
|
{
|
2022-03-30 12:46:48 -04:00
|
|
|
const { setIsVisible, ...rest } = useBetween(useInventoryBadgesState);
|
2022-03-30 10:19:09 -04:00
|
|
|
const { isVisible = false, activate = null, deactivate = null } = useSharedVisibility();
|
|
|
|
|
|
|
|
useEffect(() =>
|
|
|
|
{
|
|
|
|
const id = activate();
|
|
|
|
|
|
|
|
return () => deactivate(id);
|
|
|
|
}, [ activate, deactivate ]);
|
|
|
|
|
|
|
|
useEffect(() =>
|
|
|
|
{
|
|
|
|
setIsVisible(isVisible);
|
|
|
|
}, [ isVisible, setIsVisible ]);
|
|
|
|
|
|
|
|
return { ...rest };
|
|
|
|
}
|