Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
c3e665f
pull non legends list changes from other branch
chrisnojima-zoom Apr 7, 2026
87649da
WIP
chrisnojima-zoom Apr 7, 2026
4085ac0
Merge branch 'nojima/HOTPOT-next-670-clean-2' into nojima/ZCLIENT-sma…
chrisnojima Apr 7, 2026
0a0f058
WIP
chrisnojima Apr 7, 2026
9ad69ff
WIP
chrisnojima-zoom Apr 7, 2026
480dbc5
WIP
chrisnojima Apr 7, 2026
4b6bc14
WIP
chrisnojima-zoom Apr 7, 2026
3bba9a2
WIP
chrisnojima-zoom Apr 7, 2026
08e096b
WIP
chrisnojima-zoom Apr 8, 2026
e9f2d84
WIP
chrisnojima-zoom Apr 8, 2026
ae335ff
WIP
chrisnojima-zoom Apr 8, 2026
f7006f0
WIP
chrisnojima-zoom Apr 8, 2026
260cc3e
WIP
chrisnojima-zoom Apr 8, 2026
999504e
Merge branch 'nojima/HOTPOT-next-670-clean-2' into nojima/ZCLIENT-sma…
chrisnojima Apr 8, 2026
0d11b91
Merge branch 'nojima/HOTPOT-next-670-clean-2' into nojima/ZCLIENT-sma…
chrisnojima Apr 8, 2026
a39f89b
Merge branch 'nojima/HOTPOT-next-670-clean-2' into nojima/ZCLIENT-sma…
chrisnojima Apr 8, 2026
9275d73
WIP
chrisnojima-zoom Apr 8, 2026
2ba43f9
WIP
chrisnojima-zoom Apr 8, 2026
83984f7
WIP
chrisnojima-zoom Apr 8, 2026
2b3f975
WIP
chrisnojima Apr 8, 2026
4203c03
WIP
chrisnojima-zoom Apr 8, 2026
1d62edf
WIP
chrisnojima Apr 8, 2026
608dfab
WIP
chrisnojima-zoom Apr 8, 2026
d5ddf81
WIP
chrisnojima-zoom Apr 8, 2026
fba9ece
WIP
chrisnojima-zoom Apr 8, 2026
f20d79e
WIP
chrisnojima-zoom Apr 8, 2026
e5bd8b5
WIP
chrisnojima-zoom Apr 8, 2026
ead9819
WIP
chrisnojima-zoom Apr 8, 2026
af72dd9
WIP
chrisnojima-zoom Apr 8, 2026
b14b0ea
WIP
chrisnojima-zoom Apr 8, 2026
2ef186d
WIP
chrisnojima-zoom Apr 8, 2026
db173c7
WIP
chrisnojima-zoom Apr 8, 2026
c3c9a9b
WIP
chrisnojima-zoom Apr 8, 2026
95caec2
WIP
chrisnojima-zoom Apr 8, 2026
b794435
WIP
chrisnojima-zoom Apr 8, 2026
efe229f
WIP
chrisnojima-zoom Apr 8, 2026
11aa690
WIP
chrisnojima-zoom Apr 8, 2026
1afa564
WIP
chrisnojima-zoom Apr 8, 2026
102d0de
WIP
chrisnojima-zoom Apr 8, 2026
a03a2df
WIP
chrisnojima-zoom Apr 8, 2026
c398d7a
WIP
chrisnojima-zoom Apr 8, 2026
aed19b3
WIP
chrisnojima-zoom Apr 8, 2026
913f3bd
WIP
chrisnojima-zoom Apr 8, 2026
ceec493
WIP
chrisnojima-zoom Apr 8, 2026
6de065a
WIP
chrisnojima-zoom Apr 9, 2026
5832799
WIP
chrisnojima Apr 9, 2026
0d9855b
WIP
chrisnojima-zoom Apr 9, 2026
505416f
WIP
chrisnojima-zoom Apr 9, 2026
0e4cf0d
WIP
chrisnojima-zoom Apr 9, 2026
697e33e
WIP
chrisnojima-zoom Apr 9, 2026
f4be1fa
WIP
chrisnojima-zoom Apr 9, 2026
7ed5ad9
WIP
chrisnojima-zoom Apr 9, 2026
b8cdba3
WIP
chrisnojima Apr 9, 2026
b3b0d20
WIP
chrisnojima-zoom Apr 9, 2026
a5dfc21
WIP
chrisnojima-zoom Apr 9, 2026
6e6b92d
WIP
chrisnojima Apr 9, 2026
bca7921
WIP
chrisnojima-zoom Apr 9, 2026
4907c02
WIP
chrisnojima-zoom Apr 9, 2026
09a4fe9
WIP
chrisnojima-zoom Apr 9, 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
24 changes: 18 additions & 6 deletions shared/chat/conversation/list-area/index.desktop.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -366,12 +366,13 @@ const useScrolling = (p: {
}

const useItems = (p: {
centeredHighlightOrdinal: T.Chat.Ordinal | undefined
messageOrdinals: ReadonlyArray<T.Chat.Ordinal>
centeredOrdinal: T.Chat.Ordinal | undefined
editingOrdinal: T.Chat.Ordinal | undefined
messageTypeMap: ReadonlyMap<T.Chat.Ordinal, T.Chat.RenderMessageType> | undefined
}) => {
const {messageTypeMap, messageOrdinals, centeredOrdinal, editingOrdinal} = p
const {messageTypeMap, messageOrdinals, centeredHighlightOrdinal, centeredOrdinal, editingOrdinal} = p
const ordinalsInAWaypoint = 10
const rowRenderer = (ordinal: T.Chat.Ordinal) => {
const type = messageTypeMap?.get(ordinal) ?? 'text'
Expand All @@ -393,11 +394,14 @@ const useItems = (p: {
'WrapperMessage-hoverBox',
'WrapperMessage-decorated',
'WrapperMessage-hoverColor',
{highlighted: centeredOrdinal === ordinal || editingOrdinal === ordinal}
{highlighted: centeredHighlightOrdinal === ordinal || editingOrdinal === ordinal}
)}
>
<Separator trailingItem={ordinal} />
<Clazz ordinal={ordinal} />
<Clazz
isCenteredHighlight={centeredHighlightOrdinal === ordinal}
ordinal={ordinal}
/>
</div>
)
}
Expand Down Expand Up @@ -487,9 +491,11 @@ const ThreadWrapper = function ThreadWrapper() {
C.useShallow(s => {
const {messageTypeMap, editing: editingOrdinal, id: conversationIDKey} = s
const {messageCenterOrdinal: mco, messageOrdinals = noOrdinals, loaded} = s
const centeredOrdinal = mco && mco.highlightMode !== 'none' ? mco.ordinal : undefined
const centeredHighlightOrdinal = mco && mco.highlightMode !== 'none' ? mco.ordinal : undefined
const centeredOrdinal = mco?.ordinal
const containsLatestMessage = s.isCaughtUp()
return {
centeredHighlightOrdinal,
centeredOrdinal,
containsLatestMessage,
conversationIDKey,
Expand All @@ -500,7 +506,7 @@ const ThreadWrapper = function ThreadWrapper() {
}
})
)
const {conversationIDKey, editingOrdinal, centeredOrdinal} = data
const {conversationIDKey, editingOrdinal, centeredHighlightOrdinal, centeredOrdinal} = data
const {containsLatestMessage, messageOrdinals, loaded, messageTypeMap} = data
const copyToClipboard = useConfigState(s => s.dispatch.defer.copyToClipboard)
const listRef = React.useRef<HTMLDivElement | null>(null)
Expand Down Expand Up @@ -561,7 +567,13 @@ const ThreadWrapper = function ThreadWrapper() {
}
}

const items = useItems({centeredOrdinal, editingOrdinal, messageOrdinals, messageTypeMap})
const items = useItems({
centeredHighlightOrdinal,
centeredOrdinal,
editingOrdinal,
messageOrdinals,
messageTypeMap,
})
const setListContents = useHandleListResize({
centeredOrdinal,
isLockedToBottom,
Expand Down
17 changes: 14 additions & 3 deletions shared/chat/conversation/list-area/index.native.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,12 @@ const ConversationList = function ConversationList() {
const [lastED, setLastED] = React.useState(extraData)

const loaded = Chat.useChatContext(s => s.loaded)
const centeredOrdinal =
Chat.useChatContext(s => s.messageCenterOrdinal)?.ordinal ?? T.Chat.numberToOrdinal(-1)
const messageCenterOrdinal = Chat.useChatContext(s => s.messageCenterOrdinal)
const centeredHighlightOrdinal =
messageCenterOrdinal && messageCenterOrdinal.highlightMode !== 'none'
? messageCenterOrdinal.ordinal
: T.Chat.numberToOrdinal(-1)
const centeredOrdinal = messageCenterOrdinal?.ordinal ?? T.Chat.numberToOrdinal(-1)
const messageTypeMap = Chat.useChatContext(s => s.messageTypeMap)
const _messageOrdinals = Chat.useChatContext(s => s.messageOrdinals)

Expand All @@ -126,7 +130,14 @@ const ConversationList = function ConversationList() {
const type = messageTypeMap.get(ordinal) ?? 'text'
const Clazz = getMessageRender(type)
if (!Clazz) return null
return <PerfProfiler id={`Msg-${type}`}><Clazz ordinal={ordinal} /></PerfProfiler>
return (
<PerfProfiler id={`Msg-${type}`}>
<Clazz
isCenteredHighlight={centeredHighlightOrdinal === ordinal}
ordinal={ordinal}
/>
</PerfProfiler>
)
}

const recycleTypeRef = React.useRef(new Map<T.Chat.Ordinal, string>())
Expand Down
4 changes: 2 additions & 2 deletions shared/chat/conversation/messages/account-payment/wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import {WrapperMessage, useCommon, type Props} from '../wrapper/wrapper'
import type PaymentMessageType from './container'

function WrapperPayment(p: Props) {
const {ordinal} = p
const common = useCommon(ordinal)
const {ordinal, isCenteredHighlight} = p
const common = useCommon(ordinal, isCenteredHighlight)
const message = Chat.useChatContext(s => s.messageMap.get(ordinal))

if (message?.type !== 'requestPayment' && message?.type !== 'sendPayment') return null
Expand Down
33 changes: 24 additions & 9 deletions shared/chat/conversation/messages/attachment/file.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,22 @@ function FileContainer(p: OwnProps) {

const switchTab = C.Router2.switchTab
const navigateAppend = C.Router2.navigateAppend
const onSaltpackFileOpen = (path: string, name: typeof CryptoRoutes.decryptTab | typeof CryptoRoutes.verifyTab) => {
const onSaltpackFileOpen = (
path: string,
name: typeof CryptoRoutes.decryptTab | typeof CryptoRoutes.verifyTab
) => {
switchTab(C.Tabs.cryptoTab)
navigateAppend({
name,
params: {
entryNonce: makeUUID(),
seedInputPath: path,
seedInputType: 'file',
navigateAppend(
{
name,
params: {
entryNonce: makeUUID(),
seedInputPath: path,
seedInputType: 'file',
},
},
}, true)
true
)
}
const openLocalPathInSystemFileManagerDesktop = useFSState(
s => s.dispatch.defer.openLocalPathInSystemFileManagerDesktop
Expand Down Expand Up @@ -123,6 +129,7 @@ function FileContainer(p: OwnProps) {
<Kb.Box2
direction="vertical"
fullWidth={true}
relative={true}
style={Kb.Styles.collapseStyles([styles.containerStyle, getEditStyle(isEditing), styles.filename])}
>
<Kb.Box2 direction="horizontal" fullWidth={true} gap="tiny" centerChildren={true}>
Expand Down Expand Up @@ -182,7 +189,7 @@ function FileContainer(p: OwnProps) {
</Kb.Box2>
)}
{!!progressLabel && (
<Kb.Box2 direction="horizontal" fullWidth={true} alignItems="center">
<Kb.Box2 direction="horizontal" fullWidth={true} alignItems="center" style={styles.progressOverlay}>
<Kb.Text type="BodySmall" style={styles.progressLabelStyle}>
{progressLabel}
</Kb.Text>
Expand Down Expand Up @@ -245,6 +252,14 @@ const styles = Kb.Styles.styleSheetCreate(
color: Kb.Styles.globalColors.black_50,
marginRight: Kb.Styles.globalMargins.tiny,
},
progressOverlay: {
backgroundColor: Kb.Styles.globalColors.greyLight,
bottom: 0,
left: 0,
opacity: 0.9,
position: 'absolute',
width: 'auto',
},
retry: {
color: Kb.Styles.globalColors.redDark,
textDecorationLine: 'underline',
Expand Down
34 changes: 17 additions & 17 deletions shared/chat/conversation/messages/attachment/wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,56 +2,56 @@ import type AudioAttachmentType from './audio'
import type FileAttachmentType from './file'
import type ImageAttachmentType from './image'
import type VideoAttachmentType from './video'
import {WrapperMessage, useCommonWithData, useMessageData, type Props} from '../wrapper/wrapper'
import {WrapperMessageView, useCommonWithData, useMessageData, type Props} from '../wrapper/wrapper'

export function WrapperAttachmentAudio(p: Props) {
const {ordinal} = p
const messageData = useMessageData(ordinal)
const {ordinal, isCenteredHighlight = false} = p
const messageData = useMessageData(ordinal, isCenteredHighlight)
const common = useCommonWithData(ordinal, messageData)
const {default: AudioAttachment} = require('./audio') as {default: typeof AudioAttachmentType}
return (
<WrapperMessage {...p} {...common} messageData={messageData}>
<WrapperMessageView {...p} {...common} messageData={messageData}>
<AudioAttachment />
</WrapperMessage>
</WrapperMessageView>
)
}
export function WrapperAttachmentFile(p: Props) {
const {ordinal} = p
const messageData = useMessageData(ordinal)
const {ordinal, isCenteredHighlight = false} = p
const messageData = useMessageData(ordinal, isCenteredHighlight)
const common = useCommonWithData(ordinal, messageData)
const {showPopup} = common

const {default: FileAttachment} = require('./file') as {default: typeof FileAttachmentType}

return (
<WrapperMessage {...p} {...common} messageData={messageData}>
<WrapperMessageView {...p} {...common} messageData={messageData}>
<FileAttachment showPopup={showPopup} />
</WrapperMessage>
</WrapperMessageView>
)
}
export function WrapperAttachmentVideo(p: Props) {
const {ordinal} = p
const messageData = useMessageData(ordinal)
const {ordinal, isCenteredHighlight = false} = p
const messageData = useMessageData(ordinal, isCenteredHighlight)
const common = useCommonWithData(ordinal, messageData)
const {showPopup} = common
const {default: VideoAttachment} = require('./video') as {default: typeof VideoAttachmentType}

return (
<WrapperMessage {...p} {...common} messageData={messageData}>
<WrapperMessageView {...p} {...common} messageData={messageData}>
<VideoAttachment showPopup={showPopup} />
</WrapperMessage>
</WrapperMessageView>
)
}
export function WrapperAttachmentImage(p: Props) {
const {ordinal} = p
const messageData = useMessageData(ordinal)
const {ordinal, isCenteredHighlight = false} = p
const messageData = useMessageData(ordinal, isCenteredHighlight)
const common = useCommonWithData(ordinal, messageData)
const {showPopup} = common
const {default: ImageAttachment} = require('./image') as {default: typeof ImageAttachmentType}

return (
<WrapperMessage {...p} {...common} messageData={messageData}>
<WrapperMessageView {...p} {...common} messageData={messageData}>
<ImageAttachment showPopup={showPopup} />
</WrapperMessage>
</WrapperMessageView>
)
}
4 changes: 2 additions & 2 deletions shared/chat/conversation/messages/pin/wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import {WrapperMessage, useCommon, type Props} from '../wrapper/wrapper'
import type PinType from '.'

function WrapperPin(p: Props) {
const {ordinal} = p
const common = useCommon(ordinal)
const {ordinal, isCenteredHighlight} = p
const common = useCommon(ordinal, isCenteredHighlight)
const message = Chat.useChatContext(s => s.messageMap.get(ordinal))

if (message?.type !== 'pin') return null
Expand Down
10 changes: 9 additions & 1 deletion shared/chat/conversation/messages/reactions-rows.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as C from '@/constants'
import * as Message from '@/constants/chat/message'
import * as Chat from '@/stores/chat'
import * as Kb from '@/common-adapters'
import * as React from 'react'
Expand All @@ -13,7 +14,14 @@ const emptyEmojis: ReadonlyArray<string> = []

function ReactionsRowContainer() {
const ordinal = useOrdinal()
const emojis = Chat.useChatContext(C.useShallow(s => s.reactionOrderMap.get(ordinal) ?? emptyEmojis))
const emojis = Chat.useChatContext(
C.useShallow(s => {
const fromMap = s.reactionOrderMap.get(ordinal)
if (fromMap?.length) return fromMap
const reactions = s.messageMap.get(ordinal)?.reactions
return reactions?.size ? Message.getReactionOrder(reactions) : emptyEmojis
})
)

return emojis.length === 0 ? null : (
<Kb.Box2 direction="horizontal" gap="xtiny" fullWidth={true} style={styles.container}>
Expand Down
Loading