nitro-react/src/views/navigator/NavigatorView.tsx

122 lines
5.0 KiB
TypeScript
Raw Normal View History

2021-05-05 00:38:31 +02:00
import { NavigatorInitComposer, NavigatorSearchComposer, RoomInfoComposer, RoomSessionEvent } from 'nitro-renderer';
import { FC, useCallback, useEffect, useReducer, useState } from 'react';
import { GetRoomSessionManager } from '../../api';
2021-04-19 18:34:31 +02:00
import { NavigatorEvent } from '../../events';
import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event';
import { useUiEvent } from '../../hooks/events/ui/ui-event';
2021-04-21 05:36:39 +02:00
import { SendMessageHook } from '../../hooks/messages/message-event';
2021-05-05 00:38:31 +02:00
import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../layout';
2021-04-19 18:34:31 +02:00
import { LocalizeText } from '../../utils/LocalizeText';
2021-05-05 00:38:31 +02:00
import { NavigatorContextProvider } from './context/NavigatorContext';
2021-04-21 05:36:39 +02:00
import { NavigatorMessageHandler } from './NavigatorMessageHandler';
2021-05-05 00:38:31 +02:00
import { NavigatorViewProps } from './NavigatorView.types';
import { initialNavigator, NavigatorActions, NavigatorReducer } from './reducers/NavigatorReducer';
import { NavigatorSearchResultSetView } from './views/search-result-set/NavigatorSearchResultSetView';
import { NavigatorSearchView } from './views/search/NavigatorSearchView';
2021-04-24 03:05:18 +02:00
export const NavigatorView: FC<NavigatorViewProps> = props =>
2021-04-18 06:58:57 +02:00
{
2021-05-05 00:38:31 +02:00
const [ isVisible, setIsVisible ] = useState(false);
const [ navigatorState, dispatchNavigatorState ] = useReducer(NavigatorReducer, initialNavigator);
const { needsNavigatorUpdate = false, topLevelContext = null, topLevelContexts = null } = navigatorState;
2021-05-05 00:38:31 +02:00
const visitRoom = useCallback((roomId: number, password: string = null) =>
{
GetRoomSessionManager().createSession(roomId, password);
2021-05-05 00:38:31 +02:00
}, []);
2021-05-05 00:38:31 +02:00
const tryVisitRoom = useCallback((roomId: number) =>
{
2021-05-05 00:38:31 +02:00
SendMessageHook(new RoomInfoComposer(roomId, false, true));
}, []);
2021-04-19 18:34:31 +02:00
const onNavigatorEvent = useCallback((event: NavigatorEvent) =>
{
switch(event.type)
{
case NavigatorEvent.SHOW_NAVIGATOR:
setIsVisible(true);
return;
2021-05-05 00:38:31 +02:00
case NavigatorEvent.HIDE_NAVIGATOR:
setIsVisible(false);
return;
2021-04-19 18:34:31 +02:00
case NavigatorEvent.TOGGLE_NAVIGATOR:
setIsVisible(value => !value);
return;
2021-05-05 00:38:31 +02:00
case NavigatorEvent.VISIT_ROOM:
visitRoom(event.roomId, event.password);
return;
case NavigatorEvent.TRY_VISIT_ROOM:
tryVisitRoom(event.roomId);
return;
2021-04-19 18:34:31 +02:00
}
2021-05-05 00:38:31 +02:00
}, [ visitRoom, tryVisitRoom ]);
useUiEvent(NavigatorEvent.SHOW_NAVIGATOR, onNavigatorEvent);
useUiEvent(NavigatorEvent.HIDE_NAVIGATOR, onNavigatorEvent);
useUiEvent(NavigatorEvent.TOGGLE_NAVIGATOR, onNavigatorEvent);
useUiEvent(NavigatorEvent.VISIT_ROOM, onNavigatorEvent);
useUiEvent(NavigatorEvent.TRY_VISIT_ROOM, onNavigatorEvent);
2021-04-18 06:58:57 +02:00
2021-04-19 18:34:31 +02:00
const onRoomSessionEvent = useCallback((event: RoomSessionEvent) =>
{
switch(event.type)
{
case RoomSessionEvent.CREATED:
setIsVisible(false);
return;
}
}, []);
2021-05-05 00:38:31 +02:00
useRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent);
2021-04-19 18:34:31 +02:00
useEffect(() =>
{
2021-05-05 00:38:31 +02:00
if(!isVisible || !needsNavigatorUpdate) return;
2021-04-19 18:34:31 +02:00
2021-05-05 00:38:31 +02:00
dispatchNavigatorState({
type: NavigatorActions.SET_NEEDS_UPDATE,
payload: {
flag: false
}
});
SendMessageHook(new NavigatorInitComposer());
2021-04-19 18:34:31 +02:00
2021-05-05 00:38:31 +02:00
}, [ isVisible, needsNavigatorUpdate ]);
const sendSearch = useCallback((code: string, data: string) =>
{
SendMessageHook(new NavigatorSearchComposer(code, data));
}, []);
2021-04-19 18:34:31 +02:00
2021-04-21 05:36:39 +02:00
useEffect(() =>
{
2021-05-05 00:38:31 +02:00
if(!topLevelContexts || !topLevelContexts.length) return;
2021-04-21 05:36:39 +02:00
2021-05-05 00:38:31 +02:00
const context = topLevelContexts[0];
sendSearch(context.code, '');
}, [ topLevelContexts, sendSearch ]);
2021-04-19 18:34:31 +02:00
2021-04-18 06:58:57 +02:00
return (
2021-05-05 00:38:31 +02:00
<NavigatorContextProvider value={ { navigatorState, dispatchNavigatorState } }>
<NavigatorMessageHandler />
{ isVisible &&
<NitroCardView className="nitro-navigator">
<NitroCardHeaderView headerText={ LocalizeText('navigator.title') } onCloseClick={ event => setIsVisible(false) } />
<NitroCardTabsView>
{ topLevelContexts.map((context, index) =>
{
return <NitroCardTabsItemView key={ index } tabText={ LocalizeText(('navigator.toplevelview.' + context.code)) } isActive={ (topLevelContext === context) } onClick={ event => sendSearch(context.code, '') } />
}) }
</NitroCardTabsView>
<NitroCardContentView>
2021-05-13 01:57:30 +02:00
<NavigatorSearchView onSendSearch={ sendSearch } />
2021-05-05 00:38:31 +02:00
<NavigatorSearchResultSetView />
</NitroCardContentView>
</NitroCardView> }
</NavigatorContextProvider>
2021-04-18 06:58:57 +02:00
);
}