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;
|