Setup friend-bar

This commit is contained in:
Bill 2021-06-22 23:22:32 -04:00
parent 4919f05821
commit 60465968ea
13 changed files with 166 additions and 88 deletions

View File

@ -1,25 +1,32 @@
import { GetFriendRequestsComposer, MessengerInitEvent } from 'nitro-renderer'; import { GetFriendRequestsComposer, MessengerInitEvent } from 'nitro-renderer';
import { useCallback } from 'react'; import { FC, useCallback } from 'react';
import { CreateMessageHook, SendMessageHook } from '../../hooks/messages/message-event'; import { CreateMessageHook, SendMessageHook } from '../../hooks/messages/message-event';
import { useFriendListContext } from './context/FriendListContext';
import { FriendListMessageHandlerProps } from './FriendListMessageHandler.types'; import { FriendListMessageHandlerProps } from './FriendListMessageHandler.types';
import { FriendListActions } from './reducers/FriendListReducer';
import { MessengerSettings } from './utils/MessengerSettings'; import { MessengerSettings } from './utils/MessengerSettings';
export function FriendListMessageHandler(props: FriendListMessageHandlerProps): JSX.Element export const FriendListMessageHandler: FC<FriendListMessageHandlerProps> = props =>
{ {
const { setMessengerSettings = null } = props; const { friendListState = null, dispatchFriendListState = null } = useFriendListContext();
const onMessengerInitEvent = useCallback((event: MessengerInitEvent) => const onMessengerInitEvent = useCallback((event: MessengerInitEvent) =>
{ {
const parser = event.getParser(); const parser = event.getParser();
setMessengerSettings(new MessengerSettings( dispatchFriendListState({
type: FriendListActions.UPDATE_SETTINGS,
payload: {
settings: new MessengerSettings(
parser.userFriendLimit, parser.userFriendLimit,
parser.normalFriendLimit, parser.normalFriendLimit,
parser.extendedFriendLimit, parser.extendedFriendLimit,
parser.categories)); parser.categories)
}
});
SendMessageHook(new GetFriendRequestsComposer()); SendMessageHook(new GetFriendRequestsComposer());
}, [ setMessengerSettings ]); }, [ dispatchFriendListState ]);
CreateMessageHook(MessengerInitEvent, onMessengerInitEvent); CreateMessageHook(MessengerInitEvent, onMessengerInitEvent);

View File

@ -1,6 +1,5 @@
import { MessengerSettings } from './utils/MessengerSettings';
export interface FriendListMessageHandlerProps export interface FriendListMessageHandlerProps
{ {
setMessengerSettings: (messengerSettings: MessengerSettings) => void;
} }

View File

@ -1,5 +1,6 @@
import { MessengerInitComposer } from 'nitro-renderer'; import { MessengerInitComposer } from 'nitro-renderer';
import React, { FC, useCallback, useEffect, useState } from 'react'; import React, { FC, useCallback, useEffect, useReducer, useState } from 'react';
import { createPortal } from 'react-dom';
import { FriendListEvent } from '../../events'; import { FriendListEvent } from '../../events';
import { useUiEvent } from '../../hooks/events/ui/ui-event'; import { useUiEvent } from '../../hooks/events/ui/ui-event';
import { SendMessageHook } from '../../hooks/messages/message-event'; import { SendMessageHook } from '../../hooks/messages/message-event';
@ -7,20 +8,19 @@ import { NitroCardHeaderView, NitroCardView } from '../../layout';
import { NitroCardAccordionItemView } from '../../layout/card/accordion/item/NitroCardAccordionItemView'; import { NitroCardAccordionItemView } from '../../layout/card/accordion/item/NitroCardAccordionItemView';
import { NitroCardAccordionView } from '../../layout/card/accordion/NitroCardAccordionView'; import { NitroCardAccordionView } from '../../layout/card/accordion/NitroCardAccordionView';
import { LocalizeText } from '../../utils/LocalizeText'; import { LocalizeText } from '../../utils/LocalizeText';
import { FriendListContextProvider } from './context/FriendListContext';
import { FriendListMessageHandler } from './FriendListMessageHandler'; import { FriendListMessageHandler } from './FriendListMessageHandler';
import { FriendListTabs, FriendListViewProps, IFriendListContext } from './FriendListView.types'; import { FriendListViewProps } from './FriendListView.types';
import { FriendListFriendsView } from './friends/FriendListFriendsView'; import { FriendListReducer, initialFriendList } from './reducers/FriendListReducer';
import { MessengerSettings } from './utils/MessengerSettings'; import { FriendBarView } from './views/friend-bar/FriendBarView';
import { FriendListFriendsView } from './views/friends/FriendListFriendsView';
export const FriendListContext = React.createContext<IFriendListContext>(null);
export const FriendListView: FC<FriendListViewProps> = props => export const FriendListView: FC<FriendListViewProps> = props =>
{ {
const tabs = [ FriendListTabs.FRIENDS, FriendListTabs.REQUESTS, FriendListTabs.SEARCH ];
const [ isVisible, setIsVisible ] = useState(false); const [ isVisible, setIsVisible ] = useState(false);
const [ currentTab, setCurrentTab ] = useState<string>(null); const [ isReady, setIsReady ] = useState(false);
const [ messengerSettings, setMessengerSettings ] = useState<MessengerSettings>(null); const [ friendListState, dispatchFriendListState ] = useReducer(FriendListReducer, initialFriendList);
const { settings = null } = friendListState;
const onFriendListEvent = useCallback((event: FriendListEvent) => const onFriendListEvent = useCallback((event: FriendListEvent) =>
{ {
@ -40,13 +40,10 @@ export const FriendListView: FC<FriendListViewProps> = props =>
useEffect(() => useEffect(() =>
{ {
setCurrentTab(tabs[0]); if(!settings) return;
}, [ tabs ]);
useEffect(() => setIsReady(true);
{ }, [ settings ]);
if(!messengerSettings) return;
}, [ messengerSettings ]);
useEffect(() => useEffect(() =>
{ {
@ -54,8 +51,9 @@ export const FriendListView: FC<FriendListViewProps> = props =>
}, []); }, []);
return ( return (
<FriendListContext.Provider value={{ currentTab: currentTab, onSetCurrentTab: setCurrentTab }}> <FriendListContextProvider value={ { friendListState, dispatchFriendListState } }>
<FriendListMessageHandler setMessengerSettings={ setMessengerSettings } /> <FriendListMessageHandler />
{ isReady && createPortal(<FriendBarView />, document.getElementById('toolbar-friend-bar-container')) }
{ isVisible && { isVisible &&
<NitroCardView className="nitro-friend-list"> <NitroCardView className="nitro-friend-list">
<NitroCardHeaderView headerText={ LocalizeText('friendlist.friends') } onCloseClick={ event => setIsVisible(false) } /> <NitroCardHeaderView headerText={ LocalizeText('friendlist.friends') } onCloseClick={ event => setIsVisible(false) } />
@ -71,6 +69,6 @@ export const FriendListView: FC<FriendListViewProps> = props =>
</NitroCardAccordionItemView> </NitroCardAccordionItemView>
</NitroCardAccordionView> </NitroCardAccordionView>
</NitroCardView> } </NitroCardView> }
</FriendListContext.Provider> </FriendListContextProvider>
); );
} }

View File

@ -1,12 +1,6 @@
export interface FriendListViewProps export interface FriendListViewProps
{} {}
export interface IFriendListContext
{
currentTab: string;
onSetCurrentTab: (tab: string) => void;
}
export class FriendListTabs export class FriendListTabs
{ {
public static readonly FRIENDS: string = 'friendlist.friends'; public static readonly FRIENDS: string = 'friendlist.friends';

View File

@ -0,0 +1,14 @@
import { createContext, FC, useContext } from 'react';
import { FriendListContextProps, IFriendListContext } from './FriendListContext.type';
const FriendListContext = createContext<IFriendListContext>({
friendListState: null,
dispatchFriendListState: null
});
export const FriendListContextProvider: FC<FriendListContextProps> = props =>
{
return <FriendListContext.Provider value={ props.value }>{ props.children }</FriendListContext.Provider>
}
export const useFriendListContext = () => useContext(FriendListContext);

View File

@ -0,0 +1,13 @@
import { Dispatch, ProviderProps } from 'react';
import { IFriendListAction, IFriendListState } from '../reducers/FriendListReducer';
export interface IFriendListContext
{
friendListState: IFriendListState;
dispatchFriendListState: Dispatch<IFriendListAction>;
}
export interface FriendListContextProps extends ProviderProps<IFriendListContext>
{
}

View File

@ -0,0 +1,39 @@
import { Reducer } from 'react';
import { MessengerSettings } from '../utils/MessengerSettings';
export interface IFriendListState
{
settings: MessengerSettings
}
export interface IFriendListAction
{
type: string;
payload: {
settings?: MessengerSettings
}
}
export class FriendListActions
{
public static RESET_STATE: string = 'FLA_RESET_STATE';
public static UPDATE_SETTINGS: string = 'FLA_UPDATE_SETTINGS';
}
export const initialFriendList: IFriendListState = {
settings: null
}
export const FriendListReducer: Reducer<IFriendListState, IFriendListAction> = (state, action) =>
{
switch(action.type)
{
case FriendListActions.UPDATE_SETTINGS: {
const settings = (action.payload.settings || state.settings || null);
return { ...state, settings };
}
default:
return state;
}
}

View File

@ -0,0 +1,9 @@
import { FC } from 'react';
import { FriendBarViewProps } from './FriendBarView.types';
export const FriendBarView: FC<FriendBarViewProps> = props =>
{
return (
<div>friend bar</div>
);
}

View File

@ -0,0 +1,4 @@
export interface FriendBarViewProps
{
}

View File

@ -1,12 +1,12 @@
import { FC, useContext, useState } from 'react'; import { FC, useState } from 'react';
import { NitroCardAccordionItemView } from '../../../layout/card/accordion/item/NitroCardAccordionItemView'; import { NitroCardAccordionItemView } from '../../../../layout/card/accordion/item/NitroCardAccordionItemView';
import { NitroCardAccordionView } from '../../../layout/card/accordion/NitroCardAccordionView'; import { NitroCardAccordionView } from '../../../../layout/card/accordion/NitroCardAccordionView';
import { FriendListContext } from '../FriendListView'; import { useFriendListContext } from '../../context/FriendListContext';
import { FriendListFriendsViewProps } from './FriendListFriendsView.types'; import { FriendListFriendsViewProps } from './FriendListFriendsView.types';
export const FriendListFriendsView: FC<FriendListFriendsViewProps> = props => export const FriendListFriendsView: FC<FriendListFriendsViewProps> = props =>
{ {
const friendListContext = useContext(FriendListContext); const { friendListState = null } = useFriendListContext();
const [ isOnlineFriendsExtended, setIsOnlineFriendsExtended ] = useState(false); const [ isOnlineFriendsExtended, setIsOnlineFriendsExtended ] = useState(false);
const [ isOfflineFriendsExtended, setIsOfflineFriendsExtended ] = useState(false); const [ isOfflineFriendsExtended, setIsOfflineFriendsExtended ] = useState(false);

View File

@ -1,8 +1,6 @@
import { Nitro, RoomSessionEvent } from 'nitro-renderer'; import { Nitro, RoomSessionEvent } from 'nitro-renderer';
import { FC, useCallback, useEffect, useState } from 'react'; import { FC, useCallback, useEffect, useState } from 'react';
import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event'; import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event';
import { TransitionAnimation } from '../../layout/transitions/TransitionAnimation';
import { TransitionAnimationTypes } from '../../layout/transitions/TransitionAnimation.types';
import { AvatarEditorView } from '../avatar-editor/AvatarEditorView'; import { AvatarEditorView } from '../avatar-editor/AvatarEditorView';
import { CatalogView } from '../catalog/CatalogView'; import { CatalogView } from '../catalog/CatalogView';
import { FriendListView } from '../friend-list/FriendListView'; import { FriendListView } from '../friend-list/FriendListView';
@ -46,10 +44,8 @@ export const MainView: FC<MainViewProps> = props =>
return ( return (
<div className="nitro-main"> <div className="nitro-main">
{ landingViewVisible && <HotelView /> } { landingViewVisible && <HotelView /> }
<RoomHostView />
<TransitionAnimation className="nitro-toolbar-container" type={ TransitionAnimationTypes.FADE_UP } inProp={ isReady } timeout={ 300 }>
<ToolbarView isInRoom={ !landingViewVisible } /> <ToolbarView isInRoom={ !landingViewVisible } />
</TransitionAnimation> <RoomHostView />
<AvatarEditorView /> <AvatarEditorView />
<NavigatorView /> <NavigatorView />
<InventoryView /> <InventoryView />

View File

@ -57,11 +57,12 @@ export const ToolbarView: FC<ToolbarViewProps> = props =>
CreateMessageHook(UserInfoEvent, onUserInfoEvent); CreateMessageHook(UserInfoEvent, onUserInfoEvent);
return ( return (
<> <div className="nitro-toolbar-container">
<TransitionAnimation type={ TransitionAnimationTypes.FADE_IN } inProp={ isMeExpanded } timeout={ 300 }> <TransitionAnimation type={ TransitionAnimationTypes.FADE_IN } inProp={ isMeExpanded } timeout={ 300 }>
<ToolbarMeView setMeExpanded={ setMeExpanded } handleToolbarItemClick={ handleToolbarItemClick } /> <ToolbarMeView setMeExpanded={ setMeExpanded } handleToolbarItemClick={ handleToolbarItemClick } />
</TransitionAnimation> </TransitionAnimation>
<div className="d-flex nitro-toolbar py-1 px-3"> <div className="d-flex justify-content-between nitro-toolbar py-1 px-3">
<div className="d-flex toolbar-left-side">
<div className="navigation-items navigation-avatar pe-1 me-2"> <div className="navigation-items navigation-avatar pe-1 me-2">
<div className="navigation-item"> <div className="navigation-item">
<div className={ 'toolbar-avatar ' + (isMeExpanded ? 'active ' : '') } onClick={ event => setMeExpanded(!isMeExpanded) }> <div className={ 'toolbar-avatar ' + (isMeExpanded ? 'active ' : '') } onClick={ event => setMeExpanded(!isMeExpanded) }>
@ -103,6 +104,10 @@ export const ToolbarView: FC<ToolbarViewProps> = props =>
</div> </div>
<div id="toolbar-chat-input-container" className="d-flex align-items-center" /> <div id="toolbar-chat-input-container" className="d-flex align-items-center" />
</div> </div>
</> <div className="d-flex toolbar-right-side">
<div id="toolbar-friend-bar-container" />
</div>
</div>
</div>
); );
} }