Changeset View
Changeset View
Standalone View
Standalone View
web/selectors/thread-selectors.js
// @flow | // @flow | ||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { useDispatch } from 'react-redux'; | import { useDispatch } from 'react-redux'; | ||||
import { createSelector } from 'reselect'; | |||||
import { ENSCacheContext } from 'lib/components/ens-cache-provider.react.js'; | import { ENSCacheContext } from 'lib/components/ens-cache-provider.react.js'; | ||||
import { useLoggedInUserInfo } from 'lib/hooks/account-hooks.js'; | import { useLoggedInUserInfo } from 'lib/hooks/account-hooks.js'; | ||||
import { createPendingSidebar } from 'lib/shared/thread-utils.js'; | import { | ||||
createPendingSidebar, | |||||
threadInHomeChatList, | |||||
} from 'lib/shared/thread-utils.js'; | |||||
import type { | import type { | ||||
ComposableMessageInfo, | ComposableMessageInfo, | ||||
RobotextMessageInfo, | RobotextMessageInfo, | ||||
} from 'lib/types/message-types.js'; | } from 'lib/types/message-types.js'; | ||||
import type { ThreadInfo } from 'lib/types/thread-types.js'; | import type { ThreadInfo, RawThreadInfo } from 'lib/types/thread-types.js'; | ||||
import { values } from 'lib/utils/objects.js'; | |||||
import { getDefaultTextMessageRules } from '../markdown/rules.react.js'; | import { getDefaultTextMessageRules } from '../markdown/rules.react.js'; | ||||
import { updateNavInfoActionType } from '../redux/action-types.js'; | import { updateNavInfoActionType } from '../redux/action-types.js'; | ||||
import type { AppState } from '../redux/redux-setup.js'; | |||||
import { useSelector } from '../redux/redux-utils.js'; | import { useSelector } from '../redux/redux-utils.js'; | ||||
function useOnClickThread( | function useOnClickThread( | ||||
thread: ?ThreadInfo, | thread: ?ThreadInfo, | ||||
): (event: SyntheticEvent<HTMLElement>) => void { | ): (event: SyntheticEvent<HTMLElement>) => void { | ||||
const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
return React.useCallback( | return React.useCallback( | ||||
(event: SyntheticEvent<HTMLElement>) => { | (event: SyntheticEvent<HTMLElement>) => { | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | function useDrawerSelectedThreadID(): ?string { | ||||
const pickedCommunityID = useSelector( | const pickedCommunityID = useSelector( | ||||
state => state.communityPickerStore.calendar, | state => state.communityPickerStore.calendar, | ||||
); | ); | ||||
const inCalendar = useSelector(state => state.navInfo.tab === 'calendar'); | const inCalendar = useSelector(state => state.navInfo.tab === 'calendar'); | ||||
return inCalendar ? pickedCommunityID : activeChatThreadID; | return inCalendar ? pickedCommunityID : activeChatThreadID; | ||||
} | } | ||||
const unreadCountInSelectedCommunity: (state: AppState) => number = | |||||
createSelector( | |||||
(state: AppState) => state.threadStore.threadInfos, | |||||
(state: AppState) => state.communityPickerStore.chat, | |||||
( | |||||
threadInfos: { +[id: string]: RawThreadInfo }, | |||||
communityID: ?string, | |||||
): number => | |||||
values(threadInfos).filter( | |||||
threadInfo => | |||||
threadInHomeChatList(threadInfo) && | |||||
threadInfo.currentUser.unread && | |||||
(!communityID || communityID === threadInfo.community), | |||||
).length, | |||||
); | |||||
export { | export { | ||||
useOnClickThread, | useOnClickThread, | ||||
useThreadIsActive, | useThreadIsActive, | ||||
useOnClickPendingSidebar, | useOnClickPendingSidebar, | ||||
useOnClickNewThread, | useOnClickNewThread, | ||||
useDrawerSelectedThreadID, | useDrawerSelectedThreadID, | ||||
unreadCountInSelectedCommunity, | |||||
}; | }; |