nitro-react/src/views/friend-list/FriendListView.tsx

73 lines
3.2 KiB
TypeScript
Raw Normal View History

2021-04-22 09:11:27 +02:00
import { MessengerInitComposer } from 'nitro-renderer';
2021-06-23 05:22:32 +02:00
import React, { FC, useCallback, useEffect, useReducer, useState } from 'react';
import { createPortal } from 'react-dom';
2021-04-22 08:54:49 +02:00
import { FriendListEvent } from '../../events';
import { useUiEvent } from '../../hooks/events/ui/ui-event';
2021-04-22 09:11:27 +02:00
import { SendMessageHook } from '../../hooks/messages/message-event';
2021-06-23 11:34:07 +02:00
import { NitroCardAccordionItemView, NitroCardAccordionView, NitroCardHeaderView, NitroCardView } from '../../layout';
2021-04-22 08:54:49 +02:00
import { LocalizeText } from '../../utils/LocalizeText';
2021-06-23 05:22:32 +02:00
import { FriendListContextProvider } from './context/FriendListContext';
2021-04-22 08:54:49 +02:00
import { FriendListMessageHandler } from './FriendListMessageHandler';
2021-06-23 05:22:32 +02:00
import { FriendListViewProps } from './FriendListView.types';
import { FriendListReducer, initialFriendList } from './reducers/FriendListReducer';
import { FriendBarView } from './views/friend-bar/FriendBarView';
import { FriendListFriendsView } from './views/friends/FriendListFriendsView';
2021-04-22 08:54:49 +02:00
export const FriendListView: FC<FriendListViewProps> = props =>
{
2021-06-23 05:22:32 +02:00
const [ isVisible, setIsVisible ] = useState(false);
const [ isReady, setIsReady ] = useState(false);
const [ friendListState, dispatchFriendListState ] = useReducer(FriendListReducer, initialFriendList);
const { settings = null } = friendListState;
2021-04-22 08:54:49 +02:00
const onFriendListEvent = useCallback((event: FriendListEvent) =>
{
switch(event.type)
{
case FriendListEvent.SHOW_FRIEND_LIST:
setIsVisible(true);
return;
case FriendListEvent.TOGGLE_FRIEND_LIST:
setIsVisible(value => !value);
return;
}
}, []);
useUiEvent(FriendListEvent.SHOW_FRIEND_LIST, onFriendListEvent);
useUiEvent(FriendListEvent.TOGGLE_FRIEND_LIST, onFriendListEvent);
2021-04-22 09:11:27 +02:00
useEffect(() =>
{
2021-06-23 05:22:32 +02:00
if(!settings) return;
2021-04-22 09:11:27 +02:00
2021-06-23 05:22:32 +02:00
setIsReady(true);
}, [ settings ]);
2021-04-22 09:11:27 +02:00
useEffect(() =>
{
SendMessageHook(new MessengerInitComposer());
}, []);
2021-04-22 08:54:49 +02:00
return (
2021-06-23 05:22:32 +02:00
<FriendListContextProvider value={ { friendListState, dispatchFriendListState } }>
<FriendListMessageHandler />
{ isReady && createPortal(<FriendBarView />, document.getElementById('toolbar-friend-bar-container')) }
2021-05-12 06:29:33 +02:00
{ isVisible &&
<NitroCardView className="nitro-friend-list">
<NitroCardHeaderView headerText={ LocalizeText('friendlist.friends') } onCloseClick={ event => setIsVisible(false) } />
<NitroCardAccordionView>
<NitroCardAccordionItemView headerText="Friends" contentClassName="ps-3">
<FriendListFriendsView />
</NitroCardAccordionItemView>
<NitroCardAccordionItemView headerText="Friend Requests" contentClassName="ps-3">
abc
</NitroCardAccordionItemView>
<NitroCardAccordionItemView headerText="Search" contentClassName="ps-3">
abc
</NitroCardAccordionItemView>
</NitroCardAccordionView>
</NitroCardView> }
2021-06-23 05:22:32 +02:00
</FriendListContextProvider>
2021-04-22 08:54:49 +02:00
);
}