From 00532ff69cb37c3ec58d28292ce1265658d3233d Mon Sep 17 00:00:00 2001 From: Bill Date: Thu, 13 May 2021 23:28:45 -0400 Subject: [PATCH] Search updates --- src/api/navigator/TryVisitRoom.ts | 7 ++ src/api/navigator/VisitRoom.ts | 6 ++ src/events/navigator/NavigatorEvent.ts | 2 - src/views/navigator/NavigatorView.tsx | 42 +++-------- .../NavigatorSearchResultItemView.tsx | 5 +- .../views/search/NavigatorSearchView.tsx | 74 ++++++++----------- .../views/search/NavigatorSearchView.types.ts | 25 ++++++- 7 files changed, 80 insertions(+), 81 deletions(-) create mode 100644 src/api/navigator/TryVisitRoom.ts create mode 100644 src/api/navigator/VisitRoom.ts diff --git a/src/api/navigator/TryVisitRoom.ts b/src/api/navigator/TryVisitRoom.ts new file mode 100644 index 00000000..83b1aa8f --- /dev/null +++ b/src/api/navigator/TryVisitRoom.ts @@ -0,0 +1,7 @@ +import { RoomInfoComposer } from 'nitro-renderer'; +import { SendMessageHook } from '../../hooks/messages/message-event'; + +export function TryVisitRoom(roomId: number): void +{ + SendMessageHook(new RoomInfoComposer(roomId, false, true)); +} diff --git a/src/api/navigator/VisitRoom.ts b/src/api/navigator/VisitRoom.ts new file mode 100644 index 00000000..9448f66d --- /dev/null +++ b/src/api/navigator/VisitRoom.ts @@ -0,0 +1,6 @@ +import { GetRoomSessionManager } from '../nitro'; + +export function VisitRoom(roomId: number, password: string = null): void +{ + GetRoomSessionManager().createSession(roomId, password); +} diff --git a/src/events/navigator/NavigatorEvent.ts b/src/events/navigator/NavigatorEvent.ts index 6d3127ee..46b496ea 100644 --- a/src/events/navigator/NavigatorEvent.ts +++ b/src/events/navigator/NavigatorEvent.ts @@ -5,8 +5,6 @@ export class NavigatorEvent extends NitroEvent public static SHOW_NAVIGATOR: string = 'NE_SHOW_NAVIGATOR'; public static HIDE_NAVIGATOR: string = 'NE_HIDE_NAVIGATOR'; public static TOGGLE_NAVIGATOR: string = 'NE_TOGGLE_NAVIGATOR'; - public static VISIT_ROOM: string = 'NE_VISIT_ROOM'; - public static TRY_VISIT_ROOM: string = 'NE_TRY_VISIT_ROOM'; private _roomId: number; private _password: string; diff --git a/src/views/navigator/NavigatorView.tsx b/src/views/navigator/NavigatorView.tsx index a24e1697..50e5e3dd 100644 --- a/src/views/navigator/NavigatorView.tsx +++ b/src/views/navigator/NavigatorView.tsx @@ -1,6 +1,5 @@ -import { NavigatorInitComposer, NavigatorSearchComposer, RoomInfoComposer, RoomSessionEvent } from 'nitro-renderer'; +import { NavigatorInitComposer, NavigatorSearchComposer, RoomSessionEvent } from 'nitro-renderer'; import { FC, useCallback, useEffect, useReducer, useState } from 'react'; -import { GetRoomSessionManager } from '../../api'; import { NavigatorEvent } from '../../events'; import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event'; import { useUiEvent } from '../../hooks/events/ui/ui-event'; @@ -20,16 +19,6 @@ export const NavigatorView: FC = props => const [ navigatorState, dispatchNavigatorState ] = useReducer(NavigatorReducer, initialNavigator); const { needsNavigatorUpdate = false, topLevelContext = null, topLevelContexts = null } = navigatorState; - const visitRoom = useCallback((roomId: number, password: string = null) => - { - GetRoomSessionManager().createSession(roomId, password); - }, []); - - const tryVisitRoom = useCallback((roomId: number) => - { - SendMessageHook(new RoomInfoComposer(roomId, false, true)); - }, []); - const onNavigatorEvent = useCallback((event: NavigatorEvent) => { switch(event.type) @@ -43,20 +32,12 @@ export const NavigatorView: FC = props => case NavigatorEvent.TOGGLE_NAVIGATOR: setIsVisible(value => !value); return; - case NavigatorEvent.VISIT_ROOM: - visitRoom(event.roomId, event.password); - return; - case NavigatorEvent.TRY_VISIT_ROOM: - tryVisitRoom(event.roomId); - return; } - }, [ 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); const onRoomSessionEvent = useCallback((event: RoomSessionEvent) => { @@ -70,6 +51,11 @@ export const NavigatorView: FC = props => useRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent); + const sendSearch = useCallback((searchValue: string, contextCode: string) => + { + SendMessageHook(new NavigatorSearchComposer(contextCode, searchValue)); + }, []); + useEffect(() => { if(!isVisible || !needsNavigatorUpdate) return; @@ -82,21 +68,13 @@ export const NavigatorView: FC = props => }); SendMessageHook(new NavigatorInitComposer()); - }, [ isVisible, needsNavigatorUpdate ]); - const sendSearch = useCallback((code: string, data: string) => - { - SendMessageHook(new NavigatorSearchComposer(code, data)); - }, []); - useEffect(() => { if(!topLevelContexts || !topLevelContexts.length) return; - const context = topLevelContexts[0]; - - sendSearch(context.code, ''); + sendSearch('', topLevelContexts[0].code); }, [ topLevelContexts, sendSearch ]); return ( @@ -108,11 +86,11 @@ export const NavigatorView: FC = props => { topLevelContexts.map((context, index) => { - return sendSearch(context.code, '') } /> + return sendSearch('', context.code) } /> }) } - + } diff --git a/src/views/navigator/views/search-result-item/NavigatorSearchResultItemView.tsx b/src/views/navigator/views/search-result-item/NavigatorSearchResultItemView.tsx index 81ae8b20..f11cf1b2 100644 --- a/src/views/navigator/views/search-result-item/NavigatorSearchResultItemView.tsx +++ b/src/views/navigator/views/search-result-item/NavigatorSearchResultItemView.tsx @@ -1,8 +1,7 @@ import classNames from 'classnames'; import { RoomDataParser } from 'nitro-renderer'; import { FC, MouseEvent } from 'react'; -import { NavigatorEvent } from '../../../../events'; -import { dispatchUiEvent } from '../../../../hooks/events/ui/ui-event'; +import { TryVisitRoom } from '../../../../api/navigator/TryVisitRoom'; import { NavigatorSearchResultItemViewProps } from './NavigatorSearchResultItemView.types'; export const NavigatorSearchResultItemView: FC = props => @@ -39,7 +38,7 @@ export const NavigatorSearchResultItemView: FC = props => { - const searchFilters: INavigatorSearchFilter[] = [ - { - name: 'anything', - query: null - }, - { - name: 'room.name', - query: 'roomname' - }, - { - name: 'owner', - query: 'owner' - }, - { - name: 'tag', - query: 'tag' - }, - { - name: 'group', - query: 'group' - } - ]; + const { sendSearch = null } = props; + const [ searchFilterIndex, setSearchFilterIndex ] = useState(0); + const [ searchValue, setSearchValue ] = useState(''); + const [ lastSearchQuery, setLastSearchQuery ] = useState(''); + const { navigatorState = null } = useNavigatorContext(); + const { topLevelContext = null } = navigatorState; - const [ searchFilter, setSearchFilter ] = useState(0); - const [ searchString, setSearchString ] = useState(''); - - const search = useCallback(() => + const processSearch = useCallback(() => { - if(!searchFilters[searchFilter]) return; - - props.onSendSearch(searchFilters[searchFilter].query, searchString); - }, [ searchFilter, searchString ]); + if(!topLevelContext) return; - useEffect(() => - { - search(); - }, [ searchFilter ]); + let searchFilter = SearchFilterOptions[searchFilterIndex]; - const handleKeyDown = (event: React.KeyboardEvent) => + if(!searchFilter) searchFilter = SearchFilterOptions[0]; + + const searchQuery = ((searchFilter.query ? (searchFilter.query + ':') : '') + searchValue); + + if(lastSearchQuery === searchQuery) return; + + setLastSearchQuery(searchQuery); + sendSearch((searchQuery || ''), topLevelContext.code); + }, [ lastSearchQuery, searchFilterIndex, searchValue, topLevelContext, sendSearch ]); + + const handleKeyDown = (event: KeyboardEvent) => { - if(event.key === 'Enter') search(); + if(event.key !== 'Enter') return; + + processSearch(); }; return (
- setSearchFilterIndex(parseInt(event.target.value)) }> + { SearchFilterOptions.map((filter, index) => { - return + return }) }
- setSearchString(event.target.value) } onKeyDown={ event => handleKeyDown(event) } /> + setSearchValue(event.target.value) } onKeyDown={ event => handleKeyDown(event) } />
-
diff --git a/src/views/navigator/views/search/NavigatorSearchView.types.ts b/src/views/navigator/views/search/NavigatorSearchView.types.ts index d21f82e1..02cb7b7b 100644 --- a/src/views/navigator/views/search/NavigatorSearchView.types.ts +++ b/src/views/navigator/views/search/NavigatorSearchView.types.ts @@ -1,6 +1,6 @@ export interface NavigatorSearchViewProps { - onSendSearch: (code: string, data: string) => void; + sendSearch: (searchValue: string, contextCode: string) => void; } export interface INavigatorSearchFilter @@ -8,3 +8,26 @@ export interface INavigatorSearchFilter name: string; query: string; } + +export const SearchFilterOptions: INavigatorSearchFilter[] = [ + { + name: 'anything', + query: null + }, + { + name: 'room.name', + query: 'roomname' + }, + { + name: 'owner', + query: 'owner' + }, + { + name: 'tag', + query: 'tag' + }, + { + name: 'group', + query: 'group' + } +];