|  |  |  | import { compact } from 'lodash'; | 
					
						
							|  |  |  | import { createSelector } from 'reselect'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { StateType } from '../reducer'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { SearchStateType } from '../ducks/search'; | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   getConversationLookup, | 
					
						
							|  |  |  |   getSelectedConversation, | 
					
						
							|  |  |  | } from './conversations'; | 
					
						
							|  |  |  | import { ConversationLookupType } from '../ducks/conversations'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { getRegionCode } from './user'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const getSearch = (state: StateType): SearchStateType => state.search; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const getQuery = createSelector( | 
					
						
							|  |  |  |   getSearch, | 
					
						
							|  |  |  |   (state: SearchStateType): string => state.query | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const getSelectedMessage = createSelector( | 
					
						
							|  |  |  |   getSearch, | 
					
						
							|  |  |  |   (state: SearchStateType): string | undefined => state.selectedMessage | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const isSearching = createSelector( | 
					
						
							|  |  |  |   getSearch, | 
					
						
							|  |  |  |   (state: SearchStateType) => { | 
					
						
							|  |  |  |     const { query } = state; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return query && query.trim().length > 1; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const getSearchResults = createSelector( | 
					
						
							|  |  |  |   [ | 
					
						
							|  |  |  |     getSearch, | 
					
						
							|  |  |  |     getRegionCode, | 
					
						
							|  |  |  |     getConversationLookup, | 
					
						
							|  |  |  |     getSelectedConversation, | 
					
						
							|  |  |  |     getSelectedMessage, | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   ( | 
					
						
							|  |  |  |     state: SearchStateType, | 
					
						
							|  |  |  |     regionCode: string, | 
					
						
							|  |  |  |     lookup: ConversationLookupType, | 
					
						
							|  |  |  |     selectedConversation?: string, | 
					
						
							|  |  |  |     selectedMessage?: string | 
					
						
							|  |  |  |   ) => { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       contacts: compact( | 
					
						
							|  |  |  |         state.contacts.map(id => { | 
					
						
							|  |  |  |           const value = lookup[id]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if (value && id === selectedConversation) { | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |               ...value, | 
					
						
							|  |  |  |               isSelected: true, | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           return value; | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       conversations: compact( | 
					
						
							|  |  |  |         state.conversations.map(id => { | 
					
						
							|  |  |  |           const value = lookup[id]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           // Don't return anything when activeAt is undefined (i.e. no current conversations with this user)
 | 
					
						
							|  |  |  |           if (value.activeAt === undefined) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if (value && id === selectedConversation) { | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |               ...value, | 
					
						
							|  |  |  |               isSelected: true, | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           return value; | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       friends: compact( | 
					
						
							|  |  |  |         state.conversations.map(id => { | 
					
						
							|  |  |  |           const value = lookup[id]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const friend = value && value.isFriend ? { ...value } : null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if (friend && id === selectedConversation) { | 
					
						
							|  |  |  |             return { | 
					
						
							|  |  |  |               ...friend, | 
					
						
							|  |  |  |               isSelected: true, | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           return friend; | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       hideMessagesHeader: false, | 
					
						
							|  |  |  |       messages: state.messages.map(message => { | 
					
						
							|  |  |  |         if (message.id === selectedMessage) { | 
					
						
							|  |  |  |           return { | 
					
						
							|  |  |  |             ...message, | 
					
						
							|  |  |  |             isSelected: true, | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return message; | 
					
						
							|  |  |  |       }), | 
					
						
							|  |  |  |       regionCode: regionCode, | 
					
						
							|  |  |  |       searchTerm: state.query, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // We only want to show the start conversation if we don't have the query in our lookup
 | 
					
						
							|  |  |  |       showStartNewConversation: !lookup[state.query], | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | ); |