Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion shared/chat/routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {makeChatScreen} from './make-chat-screen'
import * as FS from '@/constants/fs'
import type * as T from '@/constants/types'
import chatNewChat from '../team-building/page'
import {TeamBuilderScreen} from '../team-building/page'
import {headerNavigationOptions} from './conversation/header-area'
import {useConfigState} from '@/stores/config'
import {useModalHeaderState} from '@/stores/modal-header'
Expand All @@ -15,6 +16,7 @@ import inboxAndConvoGetOptions from './inbox-and-conversation-get-options'
import {defineRouteMap} from '@/constants/types/router'
import type {BlockModalContext} from './blocking/block-modal'
import type {ChatRootRouteParams} from './inbox-and-conversation'
import {onTeamBuildingFinished} from '@/stores/convostate'
const Convo = React.lazy(async () => import('./conversation/container'))

type ChatBlockingRouteParams = {
Expand All @@ -40,6 +42,10 @@ const emptyChatSearchBotsRouteParams: ChatSearchBotsRouteParams = {}
const emptyChatShowNewTeamDialogRouteParams: ChatShowNewTeamDialogRouteParams = {}
const emptyChatRootRouteParams: ChatRootRouteParams = {}

const ChatTeamBuilderScreen = (p: Parameters<typeof TeamBuilderScreen>[0]) => (
<TeamBuilderScreen {...p} onComplete={onTeamBuildingFinished} />
)

const PDFShareButton = ({url}: {url?: string}) => {
const showShareActionSheet = useConfigState(s => s.dispatch.defer.showShareActionSheet)
return (
Expand Down Expand Up @@ -267,7 +273,10 @@ export const newModalRoutes = defineRouteMap({
return {default: MessagePopupModal}
})
),
chatNewChat,
chatNewChat: {
...chatNewChat,
screen: ChatTeamBuilderScreen,
},
chatPDF: makeChatScreen(
React.lazy(async () => import('./pdf')),
{
Expand Down
3 changes: 1 addition & 2 deletions shared/common-adapters/wave-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import NativeEmoji from './emoji/native-emoji'
import * as Styles from '@/styles'
import * as T from '@/constants/types'
import logger from '@/logger'
import {storeRegistry} from '@/stores/store-registry'
import {useCurrentUserState} from '@/stores/current-user'

const Kb = {
Expand Down Expand Up @@ -86,7 +85,7 @@ const WaveButtonImpl = (props: Props) => {
logger.warn("WaveButton: couldn't resolve wave conversation")
return
}
storeRegistry.getConvoState(conversationIDKey).dispatch.sendMessage(':wave:')
ConvoState.getConvoState(conversationIDKey).dispatch.sendMessage(':wave:')
},
error => {
logger.warn('Could not send in WaveButton', error.message)
Expand Down
9 changes: 7 additions & 2 deletions shared/constants/chat/meta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ import * as T from '@/constants/types'
import * as Teams from '@/constants/teams'
import * as Message from './message'
import {base64ToUint8Array, uint8ArrayToHex} from '@/util/uint8array'
import {storeRegistry} from '@/stores/store-registry'
import type * as ConvoStateType from '@/stores/convostate'
import {useCurrentUserState} from '@/stores/current-user'

const getConvoState = (conversationIDKey: T.Chat.ConversationIDKey) => {
const {getConvoState} = require('@/stores/convostate') as typeof ConvoStateType
return getConvoState(conversationIDKey)
}

const conversationMemberStatusToMembershipType = (m: T.RPCChat.ConversationMemberStatus) => {
switch (m) {
case T.RPCChat.ConversationMemberStatus.active:
Expand Down Expand Up @@ -267,7 +272,7 @@ export const inboxUIItemToConversationMeta = (
const username = useCurrentUserState.getState().username
const devicename = useCurrentUserState.getState().deviceName
const getLastOrdinal = () =>
storeRegistry.getConvoState(conversationIDKey).messageOrdinals?.at(-1) ?? T.Chat.numberToOrdinal(0)
getConvoState(conversationIDKey).messageOrdinals?.at(-1) ?? T.Chat.numberToOrdinal(0)
const message = Message.uiMessageToMessage(
conversationIDKey,
i.pinnedMsg.message,
Expand Down
136 changes: 39 additions & 97 deletions shared/constants/init/shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,36 +28,39 @@ import type * as UseTeamsStateType from '@/stores/teams'
import type * as UseTracker2StateType from '@/stores/tracker'
import type * as UnlockFoldersType from '@/stores/unlock-folders'
import type * as UseUsersStateType from '@/stores/users'
import {createTBStore, getTBStore} from '@/stores/team-building'
import {getTBStore} from '@/stores/team-building'
import {getSelectedConversation} from '@/constants/chat/common'
import * as CryptoRoutes from '@/constants/crypto'
import {emitDeepLink} from '@/router-v2/linking'
import {ignorePromise} from '../utils'
import {isMobile, isPhone, serverConfigFileName} from '../platform'
import {storeRegistry} from '@/stores/store-registry'
import {useAvatarState} from '@/common-adapters/avatar/store'
import {useChatState} from '@/stores/chat'
import {useConfigState} from '@/stores/config'
import {useCurrentUserState} from '@/stores/current-user'
import {useDaemonState} from '@/stores/daemon'
import {useDarkModeState} from '@/stores/darkmode'
import {useFollowerState} from '@/stores/followers'
import {useFSState} from '@/stores/fs'
import {useModalHeaderState} from '@/stores/modal-header'
import {usePeopleState} from '@/stores/people'
import {useProvisionState} from '@/stores/provision'
import {useSettingsEmailState} from '@/stores/settings-email'
import {useSettingsPhoneState} from '@/stores/settings-phone'
import {useSettingsContactsState} from '@/stores/settings-contacts'
import {useTeamsState} from '@/stores/teams'
import {useUsersState} from '@/stores/users'
import {useWaitingState} from '@/stores/waiting'
import {useRouterState} from '@/stores/router'
import * as Util from '@/constants/router'
import {
getConvoState,
onChatInboxSynced,
onGetInboxConvsUnboxed,
onGetInboxUnverifiedConvs,
onInboxLayoutChanged,
onIncomingInboxUIItem,
handleConvoEngineIncoming,
onRouteChanged as onConvoRouteChanged,
onTeamBuildingFinished as onConvoTeamBuildingFinished,
syncBadgeState,
syncGregorExplodingModes,
} from '@/stores/convostate'
Expand Down Expand Up @@ -90,7 +93,7 @@ export const onEngineConnected = () => {
ignorePromise(registerUIs())
}
useConfigState.getState().dispatch.onEngineConnected()
storeRegistry.getState('daemon').dispatch.startHandshake()
useDaemonState.getState().dispatch.startHandshake()
{
const notifyCtl = async () => {
try {
Expand Down Expand Up @@ -120,61 +123,7 @@ export const onEngineDisconnected = () => {
await logger.dump()
}
ignorePromise(f())
storeRegistry.getState('daemon').dispatch.setError(new Error('Disconnected'))
}

// Initialize team building callbacks. Not ideal but keeping all the existing logic for now.
export const initTeamBuildingCallbacks = () => {
const commonCallbacks = {
onAddMembersWizardPushMembers: (members: Array<T.Teams.AddingMember>) => {
useTeamsState.getState().dispatch.addMembersWizardPushMembers(members)
},
}

const namespaces: Array<T.TB.AllowedNamespace> = ['chat', 'crypto', 'teams', 'people']
for (const namespace of namespaces) {
const store = createTBStore(namespace)
const currentState = store.getState()
store.setState({
dispatch: {
...currentState.dispatch,
defer: {
...currentState.dispatch.defer,
...commonCallbacks,
...(namespace === 'chat'
? {
onFinishedTeamBuildingChat: users => {
onConvoTeamBuildingFinished(users)
},
}
: {}),
...(namespace === 'crypto'
? {
onFinishedTeamBuildingCrypto: users => {
const visible = Util.getVisibleScreen()
const visibleParams =
visible?.name === 'cryptoTeamBuilder'
? (visible.params as {teamBuilderNonce?: string} | undefined)
: undefined
const teamBuilderUsers = [...users].map(({serviceId, username}) => ({serviceId, username}))
Util.clearModals()
Util.navigateAppend(
{
name: CryptoRoutes.encryptTab,
params: {
teamBuilderNonce: visibleParams?.teamBuilderNonce,
teamBuilderUsers,
},
},
true
)
},
}
: {}),
},
},
})
}
useDaemonState.getState().dispatch.setError(new Error('Disconnected'))
}

export const initSharedSubscriptions = () => {
Expand Down Expand Up @@ -236,45 +185,41 @@ export const initSharedSubscriptions = () => {
// Re-get info about our account if you log in/we're done handshaking/became reachable
if (s.gregorReachable === T.RPCGen.Reachable.yes) {
// not in waiting state
if (storeRegistry.getState('daemon').handshakeWaiters.size === 0) {
ignorePromise(storeRegistry.getState('daemon').dispatch.loadDaemonBootstrapStatus())
if (useDaemonState.getState().handshakeWaiters.size === 0) {
ignorePromise(useDaemonState.getState().dispatch.loadDaemonBootstrapStatus())
}
storeRegistry.getState('teams').dispatch.eagerLoadTeams()
useTeamsState.getState().dispatch.eagerLoadTeams()
}
}

if (s.installerRanCount !== old.installerRanCount) {
storeRegistry.getState('fs').dispatch.checkKbfsDaemonRpcStatus()
useFSState.getState().dispatch.checkKbfsDaemonRpcStatus()
}

if (s.loggedIn !== old.loggedIn) {
if (s.loggedIn) {
ignorePromise(storeRegistry.getState('daemon').dispatch.loadDaemonBootstrapStatus())
storeRegistry.getState('fs').dispatch.checkKbfsDaemonRpcStatus()
ignorePromise(useDaemonState.getState().dispatch.loadDaemonBootstrapStatus())
useFSState.getState().dispatch.checkKbfsDaemonRpcStatus()
} else {
clearSignupEmail()
clearSignupDeviceNameDraft()
}
storeRegistry
.getState('daemon')
.dispatch.loadDaemonAccounts(
s.configuredAccounts.length,
s.loggedIn,
useConfigState.getState().dispatch.refreshAccounts
)
useDaemonState.getState().dispatch.loadDaemonAccounts(
s.configuredAccounts.length,
s.loggedIn,
useConfigState.getState().dispatch.refreshAccounts
)
if (!s.loggedInCausedbyStartup) {
ignorePromise(useConfigState.getState().dispatch.refreshAccounts())
}
}

if (s.revokedTrigger !== old.revokedTrigger) {
storeRegistry
.getState('daemon')
.dispatch.loadDaemonAccounts(
s.configuredAccounts.length,
s.loggedIn,
useConfigState.getState().dispatch.refreshAccounts
)
useDaemonState.getState().dispatch.loadDaemonAccounts(
s.configuredAccounts.length,
s.loggedIn,
useConfigState.getState().dispatch.refreshAccounts
)
}

if (s.configuredAccounts !== old.configuredAccounts) {
Expand All @@ -283,12 +228,12 @@ export const initSharedSubscriptions = () => {
name: account.username,
}))
if (updates.length > 0) {
storeRegistry.getState('users').dispatch.updates(updates)
useUsersState.getState().dispatch.updates(updates)
}
}

if (s.active !== old.active) {
const cs = storeRegistry.getConvoState(getSelectedConversation())
const cs = getConvoState(getSelectedConversation())
cs.dispatch.markThreadAsRead()
}
})
Expand All @@ -298,7 +243,7 @@ export const initSharedSubscriptions = () => {
useDaemonState.subscribe((s, old) => {
if (s.handshakeVersion !== old.handshakeVersion) {
useDarkModeState.getState().dispatch.loadDarkPrefs()
storeRegistry.getState('chat').dispatch.loadStaticConfig()
useChatState.getState().dispatch.loadStaticConfig()
const configState = useConfigState.getState()
s.dispatch.loadDaemonAccounts(
configState.configuredAccounts.length,
Expand Down Expand Up @@ -326,7 +271,7 @@ export const initSharedSubscriptions = () => {
configDispatch.setHTTPSrvInfo(bootstrap.httpSrvInfo.address, bootstrap.httpSrvInfo.token)
}

storeRegistry.getState('chat').dispatch.updateUserReacjis(userReacjis)
useChatState.getState().dispatch.updateUserReacjis(userReacjis)
}
}

Expand Down Expand Up @@ -388,16 +333,16 @@ export const initSharedSubscriptions = () => {
Util.getTab(prev) === Tabs.fsTab &&
next &&
Util.getTab(next) !== Tabs.fsTab &&
storeRegistry.getState('fs').criticalUpdate
useFSState.getState().criticalUpdate
) {
const {dispatch} = storeRegistry.getState('fs')
const {dispatch} = useFSState.getState()
dispatch.setCriticalUpdate(false)
}
const fsRrouteNames = ['fsRoot', 'barePreview']
const wasScreen = fsRrouteNames.includes(Util.getVisibleScreen(prev)?.name ?? '')
const isScreen = fsRrouteNames.includes(Util.getVisibleScreen(next)?.name ?? '')
if (wasScreen !== isScreen) {
const {dispatch} = storeRegistry.getState('fs')
const {dispatch} = useFSState.getState()
if (wasScreen) {
dispatch.userOut()
} else {
Expand All @@ -411,11 +356,11 @@ export const initSharedSubscriptions = () => {
}

if (prev && Util.getTab(prev) === Tabs.peopleTab && next && Util.getTab(next) !== Tabs.peopleTab) {
storeRegistry.getState('people').dispatch.markViewed()
usePeopleState.getState().dispatch.markViewed()
}

if (prev && Util.getTab(prev) === Tabs.teamsTab && next && Util.getTab(next) !== Tabs.teamsTab) {
storeRegistry.getState('teams').dispatch.clearNavBadges()
useTeamsState.getState().dispatch.clearNavBadges()
}

// Clear "check your inbox" in settings when you leave the settings tab
Expand All @@ -424,15 +369,14 @@ export const initSharedSubscriptions = () => {
Util.getTab(prev) === Tabs.settingsTab &&
next &&
Util.getTab(next) !== Tabs.settingsTab &&
storeRegistry.getState('settings-email').addedEmail
useSettingsEmailState.getState().addedEmail
) {
storeRegistry.getState('settings-email').dispatch.resetAddedEmail()
useSettingsEmailState.getState().dispatch.resetAddedEmail()
}

onConvoRouteChanged(prev, next)
})
)
initTeamBuildingCallbacks()
}

// This is to defer loading stores we don't need immediately.
Expand Down Expand Up @@ -543,7 +487,7 @@ export const _onEngineIncoming = (action: EngineGen.Actions) => {
{
const emailAddress = action.payload.params.emailAddress
if (emailAddress) {
storeRegistry.getState('settings-email').dispatch.notifyEmailVerified(emailAddress)
useSettingsEmailState.getState().dispatch.notifyEmailVerified(emailAddress)
}
clearSignupEmail()
}
Expand All @@ -563,14 +507,12 @@ export const _onEngineIncoming = (action: EngineGen.Actions) => {
break
case 'keybase.1.NotifyPhoneNumber.phoneNumbersChanged': {
const {list} = action.payload.params
storeRegistry
.getState('settings-phone')
.dispatch.notifyPhoneNumberPhoneNumbersChanged(list ?? undefined)
useSettingsPhoneState.getState().dispatch.notifyPhoneNumberPhoneNumbersChanged(list ?? undefined)
break
}
case 'keybase.1.NotifyEmailAddress.emailsChanged': {
const list = action.payload.params.list ?? []
storeRegistry.getState('settings-email').dispatch.notifyEmailAddressEmailsChanged(list)
useSettingsEmailState.getState().dispatch.notifyEmailAddressEmailsChanged(list)
break
}
case 'chat.1.chatUi.chatInboxFailed':
Expand Down
Loading