Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
11ae23e
WIP
chrisnojima-zoom Apr 9, 2026
7862b92
WIP
chrisnojima-zoom Apr 9, 2026
3e6de5b
WIP
chrisnojima-zoom Apr 9, 2026
359614c
WIP
chrisnojima-zoom Apr 9, 2026
b5c5be7
WIP
chrisnojima-zoom Apr 9, 2026
dd971e3
WIP
chrisnojima Apr 9, 2026
b34db32
WIP
chrisnojima Apr 9, 2026
fe8cd8c
WIP
chrisnojima-zoom Apr 9, 2026
19fb069
move search out of store
chrisnojima-zoom Apr 9, 2026
51c6036
WIP
chrisnojima-zoom Apr 9, 2026
1b6c7dd
fix go deadlocks
chrisnojima Apr 9, 2026
04dc2eb
go test for lock
chrisnojima Apr 9, 2026
f152f43
WIP
chrisnojima-zoom Apr 9, 2026
27fc24d
WIP
chrisnojima-zoom Apr 9, 2026
257a3a9
remove error flow from zus
chrisnojima-zoom Apr 9, 2026
d21df66
WIP
chrisnojima-zoom Apr 10, 2026
91c7a05
WIP
chrisnojima Apr 10, 2026
67c46e5
WIP
chrisnojima-zoom Apr 10, 2026
ecfc846
WIP
chrisnojima-zoom Apr 10, 2026
fc37ea7
WIP
chrisnojima-zoom Apr 10, 2026
1cdcb87
WIP
chrisnojima-zoom Apr 10, 2026
008a4e7
WIP
chrisnojima-zoom Apr 10, 2026
bb18a83
WIP
chrisnojima-zoom Apr 10, 2026
da3066e
WIP
chrisnojima-zoom Apr 10, 2026
63a864b
WIP
chrisnojima-zoom Apr 10, 2026
48ab3fe
WIP
chrisnojima-zoom Apr 10, 2026
a7a396c
WIP
chrisnojima-zoom Apr 10, 2026
9784739
WIP
chrisnojima Apr 10, 2026
db35b24
WIP
chrisnojima-zoom Apr 10, 2026
7a2c680
WIP
chrisnojima-zoom Apr 10, 2026
5637c49
WIP
chrisnojima-zoom Apr 10, 2026
d4fd1ee
WIP
chrisnojima-zoom Apr 10, 2026
463e10d
WIP
chrisnojima Apr 10, 2026
a260b24
WIP
chrisnojima-zoom Apr 10, 2026
58f9703
WIP
chrisnojima-zoom Apr 10, 2026
e4410bd
WIP
chrisnojima-zoom Apr 10, 2026
b04f1a6
WIP
chrisnojima Apr 10, 2026
c75fb2a
WIP
chrisnojima-zoom Apr 10, 2026
39f3e03
WIP
chrisnojima-zoom Apr 10, 2026
ca0f2f2
WIP
chrisnojima-zoom Apr 10, 2026
2f03535
WIP
chrisnojima-zoom Apr 10, 2026
b9f1f7b
WIP
chrisnojima-zoom Apr 10, 2026
12791c8
WIP
chrisnojima-zoom Apr 10, 2026
4586a79
WIP
chrisnojima-zoom Apr 10, 2026
f041946
WIP
chrisnojima-zoom Apr 10, 2026
b497ed3
WIP
chrisnojima-zoom Apr 10, 2026
e5aaa17
WIP
chrisnojima-zoom Apr 10, 2026
16c658b
WIP
chrisnojima-zoom Apr 10, 2026
ac9e5b4
WIP
chrisnojima-zoom Apr 10, 2026
1b42a3a
dont load always
chrisnojima-zoom Apr 10, 2026
a675825
WIP
chrisnojima-zoom Apr 10, 2026
fb71d8c
WIP
chrisnojima-zoom Apr 10, 2026
37d241e
merge
chrisnojima-zoom Apr 10, 2026
32baabd
merge nojima/HOTPOT-next-670-clean-2
chrisnojima Apr 13, 2026
4d05590
WIP
chrisnojima Apr 13, 2026
f80b05b
WIP
chrisnojima Apr 13, 2026
10bb8fc
WIP
chrisnojima Apr 13, 2026
eb3e51e
WIP
chrisnojima-zoom Apr 13, 2026
45a61f2
WIP
chrisnojima Apr 13, 2026
f909f64
WIP
chrisnojima-zoom Apr 13, 2026
8512022
WIP
chrisnojima-zoom Apr 13, 2026
94a9540
WIP
chrisnojima-zoom Apr 13, 2026
fd28c59
WIP
chrisnojima-zoom Apr 13, 2026
7bbeabc
WIP
chrisnojima-zoom Apr 13, 2026
5b648d2
WIP
chrisnojima-zoom Apr 13, 2026
97d24a6
move more chat 5 (#29142)
chrisnojima-zoom Apr 14, 2026
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
3 changes: 3 additions & 0 deletions go/chat/flipmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,7 @@ func (m *FlipManager) handleSummaryUpdate(ctx context.Context, gameID chat1.Flip
formatted := m.formatError(ctx, update.Err)
status = chat1.UICoinFlipStatus{
GameID: gameID.FlipGameIDStr(),
ConvID: convID.ConvIDStr(),
Phase: chat1.UICoinFlipPhase_ERROR,
ProgressText: fmt.Sprintf("Something went wrong: %s", update.Err),
Participants: parts,
Expand All @@ -632,6 +633,7 @@ func (m *FlipManager) handleSummaryUpdate(ctx context.Context, gameID chat1.Flip
}
status = chat1.UICoinFlipStatus{
GameID: gameID.FlipGameIDStr(),
ConvID: convID.ConvIDStr(),
Phase: chat1.UICoinFlipPhase_COMPLETE,
}
m.addResult(ctx, &status, update.Result, convID)
Expand Down Expand Up @@ -669,6 +671,7 @@ func (m *FlipManager) handleUpdate(ctx context.Context, update flip.GameStateUpd
GameID: gameID.FlipGameIDStr(),
}
}
status.ConvID = update.Metadata.ConversationID.ConvIDStr()

switch {
case update.Err != nil:
Expand Down
2 changes: 2 additions & 0 deletions go/protocol/chat1/chat_ui.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions protocol/avdl/chat1/chat_ui.avdl
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@ protocol chatUi {
}
record UICoinFlipStatus {
FlipGameIDStr gameID;
ConvIDStr convID;
UICoinFlipPhase phase;
string progressText;
string resultText;
Expand Down
4 changes: 4 additions & 0 deletions protocol/json/chat1/chat_ui.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions shared/chat/conversation/messages/reaction-tooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -225,11 +225,13 @@ const styles = Kb.Styles.styleSheetCreate(
},
}),
userContainer: {
alignSelf: 'stretch',
backgroundColor: Kb.Styles.globalColors.white,
paddingBottom: Kb.Styles.globalMargins.xtiny,
paddingLeft: Kb.Styles.globalMargins.small,
paddingRight: Kb.Styles.globalMargins.small,
paddingTop: Kb.Styles.globalMargins.xtiny,
width: '100%',
},
}) as const
)
Expand Down
3 changes: 2 additions & 1 deletion shared/chat/conversation/messages/special-top-message.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ import MakeTeamCard from './cards/make-team'
import NewChatCard from './cards/new-chat'
import ProfileResetNotice from './system-profile-reset-notice'
import RetentionNotice from './retention-notice'
import {useChatThreadRouteParams} from '../thread-search-route'
import {usingFlashList} from '../list-area/flashlist-config'
import * as FS from '@/constants/fs'
import {useCurrentUserState} from '@/stores/current-user'

const ErrorMessage = () => {
const createConversationError = Chat.useChatState(s => s.createConversationError)
const createConversationError = useChatThreadRouteParams()?.createConversationError
const createConversation = Chat.useChatState(s => s.dispatch.createConversation)

const _onCreateWithoutThem = (allowedUsers: ReadonlyArray<string>) => {
Expand Down
2 changes: 1 addition & 1 deletion shared/chat/conversation/messages/text/coinflip/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ function CoinFlipContainer() {
return {flipGameID, isSendError, message, sendMessage, text}
})
)
const status = Chat.useChatState(s => s.flipStatusMap.get(flipGameID))
const status = Chat.useChatContext(s => s.flipStatusMap.get(flipGameID))
const onFlipAgain = () => {
text && sendMessage(text.stringValue())
}
Expand Down
8 changes: 4 additions & 4 deletions shared/chat/conversation/messages/wrapper/wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ const getCommonMessageData = ({
message: T.Chat.Message
messageCenterOrdinal: ConvoState['messageCenterOrdinal']
ordinal: T.Chat.Ordinal
paymentStatusMap: ReturnType<typeof Chat.useChatState.getState>['paymentStatusMap']
paymentStatusMap: ConvoState['paymentStatusMap']
unfurlPrompt: ConvoState['unfurlPrompt']
you: string
}) => {
Expand Down Expand Up @@ -375,7 +375,7 @@ export const useMessageData = (ordinal: T.Chat.Ordinal, isCenteredHighlight?: bo
message,
messageCenterOrdinal: s.messageCenterOrdinal,
ordinal,
paymentStatusMap: Chat.useChatState.getState().paymentStatusMap,
paymentStatusMap: s.paymentStatusMap,
unfurlPrompt: s.unfurlPrompt,
you,
})
Expand Down Expand Up @@ -406,7 +406,7 @@ const useMessageDataWithMessage = (ordinal: T.Chat.Ordinal, isCenteredHighlight?
message,
messageCenterOrdinal: s.messageCenterOrdinal,
ordinal,
paymentStatusMap: Chat.useChatState.getState().paymentStatusMap,
paymentStatusMap: s.paymentStatusMap,
unfurlPrompt: s.unfurlPrompt,
you,
})
Expand Down Expand Up @@ -460,7 +460,7 @@ type WrapperMessageProps = {

const successfulInlinePaymentStatuses = ['completed', 'claimable']
const hasSuccessfulInlinePayments = (
paymentStatusMap: Chat.State['paymentStatusMap'],
paymentStatusMap: ConvoState['paymentStatusMap'],
message: T.Chat.Message
): boolean => {
if (message.type !== 'text' || !message.inlinePaymentIDs) {
Expand Down
20 changes: 17 additions & 3 deletions shared/chat/conversation/thread-search-route.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
import {getRouteParamsFromRoute, type RootRouteProps} from '@/router-v2/route-params'
import type * as T from '@/constants/types'
import {getRouteParamsFromRoute, type RootParamList, type RootRouteProps} from '@/router-v2/route-params'
import {useRoute} from '@react-navigation/native'

export type ThreadSearchRoute = {
query?: string
}

export type ThreadSearchRouteProps = {
createConversationError?: T.Chat.CreateConversationError
threadSearch?: ThreadSearchRoute
}

export const useThreadSearchRoute = (): ThreadSearchRoute | undefined => {
const isThreadSearchRouteParams = (
params: RootParamList['chatConversation'] | RootParamList['chatRoot'] | undefined
): params is ThreadSearchRouteProps =>
!!params &&
typeof params === 'object' &&
(Object.prototype.hasOwnProperty.call(params, 'threadSearch') ||
Object.prototype.hasOwnProperty.call(params, 'createConversationError'))

export const useChatThreadRouteParams = (): ThreadSearchRouteProps | undefined => {
const route = useRoute<RootRouteProps<'chatConversation'> | RootRouteProps<'chatRoot'>>()
const params = getRouteParamsFromRoute<'chatConversation' | 'chatRoot'>(route)
return params && typeof params === 'object' && 'threadSearch' in params ? params.threadSearch : undefined
return isThreadSearchRouteParams(params) ? params : undefined
}

export const useThreadSearchRoute = (): ThreadSearchRoute | undefined => {
return useChatThreadRouteParams()?.threadSearch
}
2 changes: 1 addition & 1 deletion shared/chat/inbox-search/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -309,9 +309,9 @@ export default function InboxSearchContainer(ownProps: OwnProps) {
[
botsResults.length,
nameResults.length,
nameResultsUnread,
openTeamsResults.length,
textCollapsed,
nameResultsUnread,
_textResults.length,
]
)
Expand Down
9 changes: 6 additions & 3 deletions shared/chat/inbox/index.desktop.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
import BigTeamsDivider from './row/big-teams-divider'
import BuildTeam from './row/build-team'
import InboxSearch from '../inbox-search'
import TeamsDivider from './row/teams-divider'
import ConnectedTeamsDivider from './row/teams-divider-container'
import UnreadShortcut from './unread-shortcut'
import * as Kb from '@/common-adapters'
import type {LegendListRef} from '@/common-adapters'
Expand Down Expand Up @@ -52,6 +52,7 @@ const FakeRemovingRow = () => <Kb.Box2 direction="horizontal" style={styles.fake
const dragKey = 'application/keybase_inbox'

const DragLine = (p: {
rows: ReadonlyArray<RowItem>
scrollDiv: React.RefObject<HTMLDivElement | null>
inboxNumSmallRows: number
showButton: boolean
Expand All @@ -60,7 +61,7 @@ const DragLine = (p: {
toggleSmallTeamsExpanded: () => void
setInboxNumSmallRows: (n: number) => void
}) => {
const {inboxNumSmallRows, showButton, scrollDiv, hiddenCount} = p
const {rows, inboxNumSmallRows, showButton, scrollDiv, hiddenCount} = p
const {smallTeamsExpanded, toggleSmallTeamsExpanded, setInboxNumSmallRows} = p
const [dragY, setDragY] = React.useState(-1)
const [dividerVisualTop, setDividerVisualTop] = React.useState(0)
Expand Down Expand Up @@ -183,7 +184,8 @@ const DragLine = (p: {
<Kb.Box2 direction="vertical" style={styles.spacer} />
</>
)}
<TeamsDivider
<ConnectedTeamsDivider
rows={rows}
hiddenCountDelta={newSmallRows !== 0 ? -newSmallRows : 0}
key="divider"
toggle={toggleSmallTeamsExpanded}
Expand Down Expand Up @@ -276,6 +278,7 @@ function InboxBody(props: ControlledInboxProps) {
if (item.type === 'divider') {
return (
<DragLine
rows={rows}
scrollDiv={scrollDiv}
inboxNumSmallRows={inboxNumSmallRows}
showButton={item.showButton}
Expand Down
5 changes: 3 additions & 2 deletions shared/chat/inbox/index.native.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import {PerfProfiler} from '@/perf/react-profiler'
import * as RowSizes from './row/sizes'
import BigTeamsDivider from './row/big-teams-divider'
import BuildTeam from './row/build-team'
import ConnectedTeamsDivider from './row/teams-divider-container'
import SearchRow from './search-row'
import InboxSearch from '../inbox-search'
import TeamsDivider from './row/teams-divider'
import UnreadShortcut from './unread-shortcut'
import type * as T from '@/constants/types'
import {Alert} from 'react-native'
Expand Down Expand Up @@ -101,7 +101,8 @@ function InboxBody(p: ControlledInboxProps) {
let element: React.ReactElement | null
if (row.type === 'divider') {
element = (
<TeamsDivider
<ConnectedTeamsDivider
rows={rows}
showButton={row.showButton}
hiddenCount={row.hiddenCount}
toggle={toggleSmallTeamsExpanded}
Expand Down
43 changes: 43 additions & 0 deletions shared/chat/inbox/row/teams-divider-container.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import * as C from '@/constants'
import * as Chat from '@/stores/chat'
import * as React from 'react'
import type {ChatInboxRowItem} from '../rowitem'
import TeamsDivider from './teams-divider'

type Props = Omit<React.ComponentProps<typeof TeamsDivider>, 'badgeCount'> & {
rows: ReadonlyArray<ChatInboxRowItem>
}

const TeamsDividerContainer = React.memo(function TeamsDividerContainer(props: Props) {
const {rows, ...rest} = props
const {badgeStateVersion, smallTeamBadgeCount} = Chat.useChatState(
C.useShallow(s => ({
badgeStateVersion: s.badgeStateVersion,
smallTeamBadgeCount: s.smallTeamBadgeCount,
}))
)

const visibleSmallConvIDs = React.useMemo(() => {
const ids: Array<string> = []
for (const row of rows) {
if (row.type === 'small') {
ids.push(row.conversationIDKey)
}
}
return ids
}, [rows])

const visibleBadges = React.useMemo(() => {
void badgeStateVersion // we need to trigger on this also
let total = 0
for (const conversationIDKey of visibleSmallConvIDs) {
total += Chat.getConvoState(conversationIDKey).badge
}
return total
}, [badgeStateVersion, visibleSmallConvIDs])

const hiddenSmallBadgeCount = Math.max(0, smallTeamBadgeCount - visibleBadges)
return <TeamsDivider {...rest} badgeCount={hiddenSmallBadgeCount} />
})

export default TeamsDividerContainer
15 changes: 2 additions & 13 deletions shared/chat/inbox/row/teams-divider.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import * as Kb from '@/common-adapters'
import * as T from '@/constants/types'
import * as Chat from '@/stores/chat'
import * as RowSizes from './sizes'

type Props = {
badgeCount?: number
hiddenCountDelta?: number
smallTeamsExpanded: boolean
showButton: boolean
Expand All @@ -13,24 +13,13 @@ type Props = {
}

function TeamsDivider(props: Props) {
const {showButton, style, hiddenCountDelta, toggle, smallTeamsExpanded} = props
const {badgeCount = 0, showButton, style, hiddenCountDelta, toggle, smallTeamsExpanded} = props
let {hiddenCount} = props

if (!Kb.Styles.isMobile) {
hiddenCount += hiddenCountDelta ?? 0
}

// Read badge count, subtracting visible small team badges so we only count hidden ones
const badgeCount = Chat.useChatState(s => {
let visibleBadges = 0
for (const row of s.inboxRows) {
if (row.type === 'small') {
visibleBadges += Chat.getConvoState(row.conversationIDKey).badge
}
}
return Math.max(0, s.smallTeamBadgeCount - visibleBadges)
})

// only show if there's more to load
const reallyShow = showButton && !!hiddenCount
const loadMore = async () => T.RPCChat.localRequestInboxSmallIncreaseRpcPromise().catch(() => {})
Expand Down
Loading