nitro-react/src/hooks/rooms/widgets/useFriendRequestWidget.ts

83 lines
2.7 KiB
TypeScript
Raw Normal View History

2022-04-17 20:40:11 -04:00
import { RoomObjectCategory, RoomObjectUserType } from '@nitrots/nitro-renderer';
2022-07-18 20:48:54 -04:00
import { useEffect, useMemo, useState } from 'react';
import { GetRoomSession, MessengerRequest } from '../../../api';
2022-04-17 20:40:11 -04:00
import { useFriends } from '../../friends';
2022-07-18 20:48:54 -04:00
import { useUserAddedEvent, useUserRemovedEvent } from '../engine';
2022-04-17 20:40:11 -04:00
const useFriendRequestWidgetState = () =>
{
const [ activeRequests, setActiveRequests ] = useState<{ roomIndex: number, request: MessengerRequest }[]>([]);
const [ dismissedRequestIds, setDismissedRequestIds ] = useState<number[]>([]);
const { requests = [] } = useFriends();
const displayedRequests = useMemo(() => activeRequests.filter(request => (dismissedRequestIds.indexOf(request.request.requesterUserId) === -1)), [ activeRequests, dismissedRequestIds ]);
const hideFriendRequest = (userId: number) =>
{
setDismissedRequestIds(prevValue =>
{
if(prevValue.indexOf(userId) >= 0) return prevValue;
const newValue = [ ...prevValue ];
newValue.push(userId);
return newValue;
});
}
2022-07-18 20:48:54 -04:00
useUserAddedEvent(true, event =>
2022-04-17 20:40:11 -04:00
{
if(event.category !== RoomObjectCategory.UNIT) return;
2022-07-18 20:48:54 -04:00
const userData = GetRoomSession().userDataManager.getUserDataByIndex(event.id);
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
if(!userData || (userData.type !== RoomObjectUserType.getTypeNumber(RoomObjectUserType.USER))) return;
const request = requests.find(request => (request.requesterUserId === userData.webID));
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
if(!request || activeRequests.find(request => (request.request.requesterUserId === userData.webID))) return;
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
const newValue = [ ...activeRequests ];
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
newValue.push({ roomIndex: userData.roomIndex, request });
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
setActiveRequests(newValue);
});
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
useUserRemovedEvent(true, event =>
{
if(event.category !== RoomObjectCategory.UNIT) return;
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
const index = activeRequests.findIndex(request => (request.roomIndex === event.id));
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
if(index === -1) return;
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
const newValue = [ ...activeRequests ];
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
newValue.splice(index, 1);
2022-04-17 20:40:11 -04:00
2022-07-18 20:48:54 -04:00
setActiveRequests(newValue);
});
2022-04-17 20:40:11 -04:00
useEffect(() =>
{
const newDisplayedRequests: { roomIndex: number, request: MessengerRequest }[] = [];
for(const request of requests)
{
const userData = GetRoomSession().userDataManager.getUserData(request.requesterUserId);
if(!userData) continue;
newDisplayedRequests.push({ roomIndex: userData.roomIndex, request });
}
setActiveRequests(newDisplayedRequests);
}, [ requests ]);
return { displayedRequests, hideFriendRequest };
}
export const useFriendRequestWidget = useFriendRequestWidgetState;