adding in search and router

This commit is contained in:
talksik
2022-06-11 06:35:23 -05:00
parent 818475234a
commit 57351d31c9
7 changed files with 391 additions and 6 deletions
@@ -0,0 +1,30 @@
// make do router given absense of react router in desktop apps
import React, { useState } from 'react';
export enum EPage {
START_NEW_CONVERSATION = 'START_NEW_CONVERSATION',
FULL_PAGE_OMNI_SEARCH = 'FULL_PAGE_OMNI_SEARCH',
CONVERSATION_DETAILS = 'CONVERSATION_DETAILS',
PROFILE = 'PROFILE',
WELCOME = 'WELCOME',
}
interface IRouterContext {
page: EPage;
setPage?: React.Dispatch<React.SetStateAction<EPage>>;
}
const RouterContext = React.createContext<IRouterContext>({
page: EPage.START_NEW_CONVERSATION,
});
export function RouterProvider({ children }: { children: React.ReactNode }) {
const [page, setPage] = useState<EPage>(EPage.START_NEW_CONVERSATION);
return <RouterContext.Provider value={{ page, setPage }}>{children}</RouterContext.Provider>;
}
export default function useRouter() {
return React.useContext(RouterContext);
}
@@ -0,0 +1,147 @@
import React, { useCallback, useContext, useState } from 'react';
import Conversation from '@nirvana/core/models/conversation.model';
import { ConversationMap } from '../util/types';
import User from '@nirvana/core/models/user.model';
import useAuth from './AuthProvider';
import { useDebounce } from 'react-use';
interface ISearchContext {
searchUsers?: (searchQuery: string) => void;
omniSearch?: (searchQuery: string) => void;
searchConversations?: (searchQuery: string) => void;
conversationResults: Conversation[];
userResults: User[];
isSearching: boolean;
// transparency into what our search is searching for
searchQuery: string;
clearSearch?: () => void;
}
const SearchContext = React.createContext<ISearchContext>({
isSearching: false,
conversationResults: [],
userResults: [],
searchQuery: '',
});
export function SearchProvider({ children }: { children: React.ReactNode }) {
const { user } = useAuth();
// const { conversationMap } = useConversations();
const [searchQuery, setSearchQuery] = useState<string>('');
const [userResults, setUserResultsResults] = useState<User[]>([]);
const [conversationResults, setConversationResultsResults] = useState<Conversation[]>([]);
const [isSearching, setIsSearching] = useState<boolean>(false);
// debounce user search and any other async ones
const [, cancel] = useDebounce(
async () => {
if (searchQuery) {
// let results = await firestoreSearchUsers(searchQuery);
// results = results.filter((userResult) => userResult. user._id);
const results = [];
setUserResultsResults(results);
console.warn('searched users', results);
}
setIsSearching(false);
},
1000,
[searchQuery, setUserResultsResults, user, setIsSearching],
);
// any view will hit this when they want and start the debounce process
const searchUsers = useCallback(
(searchQuery: string) => {
setSearchQuery(searchQuery);
setIsSearching(true);
},
[setSearchQuery, setIsSearching],
);
/**
*
* @param searchQuery
* given a search query, finds conversations
*/
const searchRelevantConversations = useCallback(
async (searchQuery: string): Promise<Conversation[]> => {
const relevantConversations: Conversation[] = [];
// Object.values(conversationMap).forEach((conversation) => {
// for (const cachedConversationUser of conversation.userCache) {
// if (
// cachedConversationUser.email
// .toLocaleLowerCase()
// .includes(searchQuery.toLocaleLowerCase())
// ) {
// relevantConversations.push(conversation);
// return;
// }
// if (
// cachedConversationUser.displayName
// .toLocaleLowerCase()
// .includes(searchQuery.toLocaleLowerCase())
// ) {
// relevantConversations.push(conversation);
// return;
// }
// }
// if (conversation.name?.toLocaleLowerCase().includes(searchQuery.toLocaleLowerCase())) {
// relevantConversations.push(conversation);
// return;
// }
// });
return relevantConversations;
},
[],
);
const omniSearch = useCallback(
async (searchQuery: string) => {
searchQuery = searchQuery.replace('/', '');
setSearchQuery(searchQuery);
// user search
setIsSearching(true);
// client side conversation search
const relevantConversations = await searchRelevantConversations(searchQuery);
setConversationResultsResults(relevantConversations);
},
[setIsSearching, setSearchQuery, setConversationResultsResults, searchRelevantConversations],
);
const clearSearch = useCallback(() => setSearchQuery(''), [setSearchQuery]);
return (
<SearchContext.Provider
value={{
isSearching,
omniSearch,
searchUsers,
userResults,
conversationResults,
searchQuery,
clearSearch,
}}
>
{children}
</SearchContext.Provider>
);
}
export default function useSearch() {
return useContext(SearchContext);
}