@ethora/chat-component-rn 26.7.4 → 26.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -54
- package/README.md +8 -31
- package/lib/commonjs/assets/icons.js +2 -7
- package/lib/commonjs/assets/icons.js.map +1 -1
- package/lib/commonjs/components/Header/HeaderRoomList.js +6 -20
- package/lib/commonjs/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ChatRoom.js +14 -36
- package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/commonjs/components/MainComponents/MessageList.js +23 -7
- package/lib/commonjs/components/MainComponents/MessageList.js.map +1 -1
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js +13 -14
- package/lib/commonjs/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/commonjs/components/MainComponents/RoomList.js +32 -62
- package/lib/commonjs/components/MainComponents/RoomList.js.map +1 -1
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js +98 -309
- package/lib/commonjs/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +110 -320
- package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +213 -552
- package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +2 -6
- package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/commonjs/components/Modals/Modal/Modal.js +0 -8
- package/lib/commonjs/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js +1 -2
- package/lib/commonjs/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js +104 -202
- package/lib/commonjs/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js +0 -8
- package/lib/commonjs/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js +2 -4
- package/lib/commonjs/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js +21 -7
- package/lib/commonjs/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js +244 -507
- package/lib/commonjs/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js +46 -74
- package/lib/commonjs/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/commonjs/components/Modals/styledModalComponents.js +2 -9
- package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js +7 -17
- package/lib/commonjs/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/commonjs/components/styled/SendInput.js +11 -80
- package/lib/commonjs/components/styled/SendInput.js.map +1 -1
- package/lib/commonjs/components/styled/StyledComponents.js +3 -9
- package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js +4 -11
- package/lib/commonjs/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/commonjs/context/xmppProvider.js +35 -6
- package/lib/commonjs/context/xmppProvider.js.map +1 -1
- package/lib/commonjs/helpers/updateMessagesTillLast.js +40 -12
- package/lib/commonjs/helpers/updateMessagesTillLast.js.map +1 -1
- package/lib/commonjs/hooks/useChatRoomFocus.js +9 -3
- package/lib/commonjs/hooks/useChatRoomFocus.js.map +1 -1
- package/lib/commonjs/hooks/useLogout.js +5 -0
- package/lib/commonjs/hooks/useLogout.js.map +1 -1
- package/lib/commonjs/hooks/useSendMessage.js +50 -23
- package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
- package/lib/commonjs/i18n/strings.js +1 -121
- package/lib/commonjs/i18n/strings.js.map +1 -1
- package/lib/commonjs/main.js +0 -6
- package/lib/commonjs/main.js.map +1 -1
- package/lib/commonjs/networking/api-requests/user.api.js +0 -59
- package/lib/commonjs/networking/api-requests/user.api.js.map +1 -1
- package/lib/commonjs/networking/outboundQueue.js +18 -0
- package/lib/commonjs/networking/outboundQueue.js.map +1 -1
- package/lib/commonjs/networking/stanzaHandlers.js +10 -1
- package/lib/commonjs/networking/stanzaHandlers.js.map +1 -1
- package/lib/commonjs/networking/xmppClient.js +107 -7
- package/lib/commonjs/networking/xmppClient.js.map +1 -1
- package/lib/commonjs/roomStore/chatSettingsSlice.js +1 -3
- package/lib/commonjs/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/commonjs/roomStore/roomsSlice.js +22 -3
- package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
- package/lib/module/assets/icons.js +1 -6
- package/lib/module/assets/icons.js.map +1 -1
- package/lib/module/components/Header/HeaderRoomList.js +6 -20
- package/lib/module/components/Header/HeaderRoomList.js.map +1 -1
- package/lib/module/components/MainComponents/ChatRoom.js +14 -36
- package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
- package/lib/module/components/MainComponents/MessageList.js +24 -8
- package/lib/module/components/MainComponents/MessageList.js.map +1 -1
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js +13 -14
- package/lib/module/components/MainComponents/ProfileImagePlaceholder.js.map +1 -1
- package/lib/module/components/MainComponents/RoomList.js +32 -62
- package/lib/module/components/MainComponents/RoomList.js.map +1 -1
- package/lib/module/components/Menu/HeaderRoomListMenu.js +101 -311
- package/lib/module/components/Menu/HeaderRoomListMenu.js.map +1 -1
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js +113 -311
- package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +217 -555
- package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +2 -6
- package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
- package/lib/module/components/Modals/Modal/Modal.js +1 -9
- package/lib/module/components/Modals/Modal/Modal.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/ModalContent.js +1 -2
- package/lib/module/components/Modals/NewChatModal/ModalContent.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js +106 -205
- package/lib/module/components/Modals/NewChatModal/NewChatModal.js.map +1 -1
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js +0 -8
- package/lib/module/components/Modals/NewChatModal/UpdNewChatModal.js.map +1 -1
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js +2 -4
- package/lib/module/components/Modals/SelectUsersModal/SelectUsersModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js +23 -9
- package/lib/module/components/Modals/UserProfileModal/EditUserModal.js.map +1 -1
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js +248 -509
- package/lib/module/components/Modals/UserProfileModal/UserProfileModal.js.map +1 -1
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js +48 -76
- package/lib/module/components/Modals/UserSettingsModal/UserSettingsModal.js.map +1 -1
- package/lib/module/components/Modals/styledModalComponents.js +2 -9
- package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
- package/lib/module/components/RoomComponents/ChatRoomItem.js +7 -17
- package/lib/module/components/RoomComponents/ChatRoomItem.js.map +1 -1
- package/lib/module/components/styled/SendInput.js +12 -81
- package/lib/module/components/styled/SendInput.js.map +1 -1
- package/lib/module/components/styled/StyledComponents.js +3 -9
- package/lib/module/components/styled/StyledComponents.js.map +1 -1
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js +4 -11
- package/lib/module/components/styled/StyledInputComponents/StyledInputComponents.js.map +1 -1
- package/lib/module/context/xmppProvider.js +35 -6
- package/lib/module/context/xmppProvider.js.map +1 -1
- package/lib/module/helpers/updateMessagesTillLast.js +41 -13
- package/lib/module/helpers/updateMessagesTillLast.js.map +1 -1
- package/lib/module/hooks/useChatRoomFocus.js +9 -3
- package/lib/module/hooks/useChatRoomFocus.js.map +1 -1
- package/lib/module/hooks/useLogout.js +5 -0
- package/lib/module/hooks/useLogout.js.map +1 -1
- package/lib/module/hooks/useSendMessage.js +51 -24
- package/lib/module/hooks/useSendMessage.js.map +1 -1
- package/lib/module/i18n/strings.js +1 -121
- package/lib/module/i18n/strings.js.map +1 -1
- package/lib/module/main.js +1 -1
- package/lib/module/main.js.map +1 -1
- package/lib/module/networking/api-requests/user.api.js +0 -56
- package/lib/module/networking/api-requests/user.api.js.map +1 -1
- package/lib/module/networking/outboundQueue.js +17 -0
- package/lib/module/networking/outboundQueue.js.map +1 -1
- package/lib/module/networking/stanzaHandlers.js +10 -1
- package/lib/module/networking/stanzaHandlers.js.map +1 -1
- package/lib/module/networking/xmppClient.js +107 -7
- package/lib/module/networking/xmppClient.js.map +1 -1
- package/lib/module/roomStore/chatSettingsSlice.js +1 -3
- package/lib/module/roomStore/chatSettingsSlice.js.map +1 -1
- package/lib/module/roomStore/roomsSlice.js +20 -2
- package/lib/module/roomStore/roomsSlice.js.map +1 -1
- package/lib/typescript/assets/icons.d.ts +0 -16
- package/lib/typescript/assets/icons.d.ts.map +1 -1
- package/lib/typescript/components/Header/HeaderRoomList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/ProfileImagePlaceholder.d.ts.map +1 -1
- package/lib/typescript/components/MainComponents/RoomList.d.ts.map +1 -1
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts +0 -3
- package/lib/typescript/components/Menu/HeaderRoomListMenu.d.ts.map +1 -1
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts +0 -9
- package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts +0 -10
- package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/Modal/Modal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts +2 -4
- package/lib/typescript/components/Modals/NewChatModal/ModalContent.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/NewChatModal.d.ts +1 -1
- package/lib/typescript/components/Modals/NewChatModal/NewChatModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/NewChatModal/UpdNewChatModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts +1 -6
- package/lib/typescript/components/Modals/SelectUsersModal/SelectUsersModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/EditUserModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts +0 -16
- package/lib/typescript/components/Modals/UserProfileModal/UserProfileModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts +0 -1
- package/lib/typescript/components/Modals/UserSettingsModal/UserSettingsModal.d.ts.map +1 -1
- package/lib/typescript/components/Modals/styledModalComponents.d.ts.map +1 -1
- package/lib/typescript/components/RoomComponents/ChatRoomItem.d.ts.map +1 -1
- package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledComponents.d.ts.map +1 -1
- package/lib/typescript/components/styled/StyledInputComponents/StyledInputComponents.d.ts.map +1 -1
- package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
- package/lib/typescript/helpers/updateMessagesTillLast.d.ts.map +1 -1
- package/lib/typescript/hooks/useChatRoomFocus.d.ts.map +1 -1
- package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
- package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
- package/lib/typescript/i18n/strings.d.ts.map +1 -1
- package/lib/typescript/main.d.ts +1 -1
- package/lib/typescript/main.d.ts.map +1 -1
- package/lib/typescript/networking/api-requests/user.api.d.ts +0 -27
- package/lib/typescript/networking/api-requests/user.api.d.ts.map +1 -1
- package/lib/typescript/networking/outboundQueue.d.ts +16 -0
- package/lib/typescript/networking/outboundQueue.d.ts.map +1 -1
- package/lib/typescript/networking/stanzaHandlers.d.ts.map +1 -1
- package/lib/typescript/networking/xmppClient.d.ts +33 -1
- package/lib/typescript/networking/xmppClient.d.ts.map +1 -1
- package/lib/typescript/roomStore/chatSettingsSlice.d.ts.map +1 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts +18 -1
- package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
- package/lib/typescript/types/models/room.model.d.ts +15 -0
- package/lib/typescript/types/models/room.model.d.ts.map +1 -1
- package/lib/typescript/types/types.d.ts +20 -20
- package/lib/typescript/types/types.d.ts.map +1 -1
- package/package.json +1 -6
- package/src/assets/icons.tsx +9 -48
- package/src/components/Header/HeaderRoomList.tsx +5 -20
- package/src/components/MainComponents/ChatRoom.tsx +20 -38
- package/src/components/MainComponents/MessageList.tsx +24 -8
- package/src/components/MainComponents/ProfileImagePlaceholder.tsx +14 -21
- package/src/components/MainComponents/RoomList.tsx +34 -65
- package/src/components/Menu/HeaderRoomListMenu.tsx +71 -310
- package/src/components/Modals/AttachSheet/AttachSheet.tsx +97 -331
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +279 -598
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +2 -4
- package/src/components/Modals/Modal/Modal.tsx +0 -7
- package/src/components/Modals/NewChatModal/ModalContent.tsx +3 -6
- package/src/components/Modals/NewChatModal/NewChatModal.tsx +117 -219
- package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +1 -12
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +4 -14
- package/src/components/Modals/UserProfileModal/EditUserModal.tsx +25 -9
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +307 -617
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +58 -75
- package/src/components/Modals/styledModalComponents.tsx +2 -9
- package/src/components/RoomComponents/ChatRoomItem.tsx +7 -14
- package/src/components/styled/SendInput.tsx +12 -83
- package/src/components/styled/StyledComponents.ts +3 -9
- package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +4 -11
- package/src/context/xmppProvider.tsx +41 -8
- package/src/helpers/updateMessagesTillLast.tsx +42 -17
- package/src/hooks/useChatRoomFocus.ts +11 -3
- package/src/hooks/useLogout.tsx +7 -0
- package/src/hooks/useSendMessage.tsx +60 -24
- package/src/i18n/strings.ts +1 -121
- package/src/main.ts +1 -1
- package/src/networking/api-requests/user.api.ts +0 -71
- package/src/networking/outboundQueue.ts +29 -0
- package/src/networking/stanzaHandlers.ts +9 -1
- package/src/networking/xmppClient.ts +118 -7
- package/src/roomStore/chatSettingsSlice.ts +1 -3
- package/src/roomStore/roomsSlice.ts +20 -2
- package/src/types/models/room.model.ts +15 -0
- package/src/types/types.ts +20 -22
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js +0 -226
- package/lib/commonjs/components/Modals/ChatProfileModal/ReportChatModal.js.map +0 -1
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js +0 -556
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileHeader.js.map +0 -1
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js +0 -210
- package/lib/commonjs/components/Modals/ProfileHeader/ProfileMenu.js.map +0 -1
- package/lib/commonjs/helpers/getChatBackground.js +0 -23
- package/lib/commonjs/helpers/getChatBackground.js.map +0 -1
- package/lib/commonjs/helpers/mediaLibraryRuntime.js +0 -31
- package/lib/commonjs/helpers/mediaLibraryRuntime.js.map +0 -1
- package/lib/commonjs/helpers/pickImageAsset.js +0 -68
- package/lib/commonjs/helpers/pickImageAsset.js.map +0 -1
- package/lib/commonjs/helpers/sheetGestures.js +0 -32
- package/lib/commonjs/helpers/sheetGestures.js.map +0 -1
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js +0 -223
- package/lib/module/components/Modals/ChatProfileModal/ReportChatModal.js.map +0 -1
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js +0 -548
- package/lib/module/components/Modals/ProfileHeader/ProfileHeader.js.map +0 -1
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js +0 -205
- package/lib/module/components/Modals/ProfileHeader/ProfileMenu.js.map +0 -1
- package/lib/module/helpers/getChatBackground.js +0 -18
- package/lib/module/helpers/getChatBackground.js.map +0 -1
- package/lib/module/helpers/mediaLibraryRuntime.js +0 -25
- package/lib/module/helpers/mediaLibraryRuntime.js.map +0 -1
- package/lib/module/helpers/pickImageAsset.js +0 -63
- package/lib/module/helpers/pickImageAsset.js.map +0 -1
- package/lib/module/helpers/sheetGestures.js +0 -26
- package/lib/module/helpers/sheetGestures.js.map +0 -1
- package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts +0 -9
- package/lib/typescript/components/Modals/ChatProfileModal/ReportChatModal.d.ts.map +0 -1
- package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts +0 -75
- package/lib/typescript/components/Modals/ProfileHeader/ProfileHeader.d.ts.map +0 -1
- package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts +0 -25
- package/lib/typescript/components/Modals/ProfileHeader/ProfileMenu.d.ts.map +0 -1
- package/lib/typescript/helpers/getChatBackground.d.ts +0 -15
- package/lib/typescript/helpers/getChatBackground.d.ts.map +0 -1
- package/lib/typescript/helpers/mediaLibraryRuntime.d.ts +0 -3
- package/lib/typescript/helpers/mediaLibraryRuntime.d.ts.map +0 -1
- package/lib/typescript/helpers/pickImageAsset.d.ts +0 -27
- package/lib/typescript/helpers/pickImageAsset.d.ts.map +0 -1
- package/lib/typescript/helpers/sheetGestures.d.ts +0 -20
- package/lib/typescript/helpers/sheetGestures.d.ts.map +0 -1
- package/src/components/Modals/ChatProfileModal/ReportChatModal.tsx +0 -244
- package/src/components/Modals/ProfileHeader/ProfileHeader.tsx +0 -615
- package/src/components/Modals/ProfileHeader/ProfileMenu.tsx +0 -217
- package/src/helpers/getChatBackground.ts +0 -18
- package/src/helpers/mediaLibraryRuntime.ts +0 -25
- package/src/helpers/pickImageAsset.ts +0 -68
- package/src/helpers/sheetGestures.ts +0 -25
package/CHANGELOG.md
CHANGED
|
@@ -5,60 +5,6 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this pr
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
-
### Added
|
|
9
|
-
|
|
10
|
-
- **Profile header polish (both the chat and the user profile).** The back / "…" row is taller and sits further from the top edge, and its buttons are inset 20 pt so a button's centre line matches the collapsed avatar's — they used to sit closer to the edge than the avatar below them. The glyphs inside the hero's round buttons always paint white now (several SDK icons ignore their `color` prop and paint white regardless, so tinting the rest to the title colour left a mix of black and white in one row); on a light fill the circle darkens instead of the glyph. And on the user profile the "…" menu appears once the header is collapsed, carrying exactly the same actions the hero's buttons do — collapsed, those buttons are off-screen and were unreachable.
|
|
11
|
-
|
|
12
|
-
- **Settings screen restyled.** Manage Data and Visibility are separate white cards on a light grey ground — rounded, shadowed, each its own tap target with a chevron — instead of two rows sharing one bordered block. Their labels come from the i18n table now (`settings.manageData.title` / `settings.visibility.title`), so the misspelled hardcoded "Visiblility" is gone. The shared full-screen modal header (Settings, Manage Data, Visibility, the shares screens…) got the same card treatment as the room-list header: rounded bottom corners and a soft shadow in place of its hairline rule. Tests in `userSettingsScreen.test.tsx`.
|
|
13
|
-
|
|
14
|
-
- **Tapping a room's avatar opens the chat.** Only the text half of a row did: `ProfileImagePlaceholder` wraps its avatar in a Touchable, which became the responder and swallowed the tap. The avatar is now wrapped in a `pointerEvents: 'none'` view, so the whole row is one target. Row separators also darkened to `#C6CFDA` — the old `#F0F0F0` was lighter than the list's new ground and had disappeared into it.
|
|
15
|
-
- **`config.headerMenu` accepts `true`.** The room-list burger (left of the header) previously required a host callback, so an app that just wanted the SDK's own menu had nothing to pass. `headerMenu: true` now shows the button and opens that menu — the same sheet the header avatar opens; a function still means the host drives its own drawer, and `disableRoomMenu` hides the button either way. Enabled in the testbed app. Tests in `roomListSearchOverlay.test.tsx`.
|
|
16
|
-
|
|
17
|
-
- **Room list, headers and composer restyled.** The room list's ground is now `#E8EDF2` (the search field keeps its white card on top of it, and a host's `roomListStyles` still overrides it). The search strip floats over the list on a transparent background — the rooms scroll underneath it — while staying fixed rather than scrolling away; the list's top padding is measured from the strip, so it always starts clear of the field. Both headers — the room list's and the in-chat one — became white cards with 20 pt rounded bottom corners and a soft drop shadow in place of their hairline bottom rule, and the composer mirrors it: rounded top corners with the shadow cast upwards instead of a rule that read as a seam. For those corners to be visible at all, the surface behind them had to stop being white: the chat container (and the empty-room placeholder) now paint the conversation's own colour through the new `getChatBackgroundColor` helper — which is also what the message list uses, so the two can't drift — and the rounded top plus upward shadow live on the composer's dock alone, with the inner container transparent: on the inner view too, its shadow fell onto the dock as a faint seam that read as two different whites, and an opaque inner view simply painted over the dock's rounded corners (a border radius doesn't clip children without `overflow: hidden`, which would clip the shadow as well).
|
|
18
|
-
|
|
19
|
-
- **The room-list header menu is a bottom sheet.** New Chat / Profile / Settings (and Sign out when the host enables it) used to slide in as a full-height drawer covering 70% of the screen from the right; they now come up from the bottom in a sheet exactly as tall as its rows, with a grab handle and fully rounded corners, inset 3 pt all round so the dimmed screen shows as a thin line around it — reachable by thumb, and the list stays visible behind it. Like the create-chat dialog it presents through a real RN `<Modal>`; as an in-tree overlay it was bounded by the room list's own container, which left a pale strip of app background under the sheet and stopped the dim short of the host's chrome. It can be pulled down to dismiss: the grab area at the top claims the gesture on touch-down, and the body claims it in the capture phase, because a drag starting on a row hands the responder to that row's Touchable on touch-down and a non-capturing responder is never consulted again (the same fix went into the attach sheet's body). The drag offset is a second `translateY` entry rather than an `Animated.add` around the parent's natively-driven value, and is handed to the native driver when the sheet opens — a transform that mixes a native node with a JS-only one drops the JS updates, which reads as a drag that moves nothing. and it is unmounted while closed rather than parked off-screen, where its shadow bled along the bottom edge. The row icons take `colors.primary`. Same testIDs, same logout flow.
|
|
20
|
-
- **The testbed app no longer pads the bottom safe area** (`AppLoginChatsRn` passes `edges={['top','left','right']}`): the blank white band it reserved sat under the room list and under every sheet the chat presents. Content now runs under the home indicator, the way a messenger does.
|
|
21
|
-
- **Drag-to-dismiss thresholds now live in `helpers/sheetGestures.ts`** and are shared by the attach sheet, the menu sheet and anything added later, so a pull feels the same everywhere (the attach sheet re-exports them, so its tests are unchanged).
|
|
22
|
-
- **The room-list header avatar is a little bigger** (30 → 36 pt), with the header's side slots widened to match.
|
|
23
|
-
|
|
24
|
-
- **"Create new chat" redesigned.** Title, a round 72 pt picker (camera glyph, tap to pick, long-press to clear), a "Chat name" field, a multi-line "Description (optional)" field, and Cancel / Create side by side. The private-chat toggle from the design is deliberately left out.
|
|
25
|
-
- It presents itself through a real RN `<Modal>` (`statusBarTranslucent`), so it covers the whole window with the design's opaque light ground (the chat list behind is hidden, not showing through a translucent dim). The old in-tree overlay stopped at the SDK's own frame and left the host app's chrome — tab bars, headers — undimmed above it. `Modal/Modal.tsx` skips its shared backdrop for this one so nothing dims twice.
|
|
26
|
-
- Every accent (the picture circle, the Create button) uses the configured `colors.primary` instead of the hardcoded `#0052CD` blue. Validation, image upload and both creation paths (REST `postRoom` and the XMPP `createRoomStanza` fallback) are unchanged. Tests in `newChatModal.test.tsx`.
|
|
27
|
-
|
|
28
|
-
- **User profile screen rebuilt on the same header as the chat profile.** The picture becomes a full-bleed hero (or a flat colour with two initials) with the same parallax, collapse-into-a-bar and frosted blur; the collapsing header, the "…" menu and the over-scroll behaviour now live in shared `ProfileHeader` / `ProfileMenu` components that both screens use.
|
|
29
|
-
- Actions differ by whose profile it is: **your own** gets Account (the existing settings modal), Share, Edit and Log out as round buttons, plus a **Leave** button at the right end of the name row that runs the SDK's full logout teardown (`runLogoutFlow` — the same confirm copy, callbacks and cleanup as the room-list menu's Sign out). **Someone else's** gets Message (creates the private room, as before) and Share. Nothing is left behind a "…" overflow, so this screen has no menu button at all. Share opens the system share sheet with the name and user id, behind a new `ShareIcon` (three linked nodes) — the `SendItemIcon` it borrowed at first is a textured token badge with a hardcoded blue outline that ignored the button's tint. Per the design, the counters and the QR button are gone; Block is not offered because the SDK has no blocking anywhere (no API, no XMPP privacy lists — `BlockedUsersModal` is a static placeholder).
|
|
30
|
-
- **About** shows the user's description, with "No description" as the fallback.
|
|
31
|
-
- **Tabs on your own profile**: Language, Media and Documents. Language lists `LANGUAGE_OPTIONS` with the active one checked and writes the same `langSource` the in-chat globe uses. Media and Documents come from one `GET /v2/files/` on open, split by mime type (with a filename-extension fallback for deployments that store no mimetype); a tab only appears when it has something in it, and tapping a file opens the existing file-preview modal. Another user's profile has no tabs at all — that endpoint is scoped to the JWT owner, so it would show *your* files on *their* page.
|
|
32
|
-
- New `getUserFiles()` / `isMediaFile()` in `user.api.ts` read both the v2 `{ results, pagination }` shape and the legacy `{ items }` one, and fall through the field aliases (`location` / `locations[]`, `originalname` / `filename`) different deployments use. Tests in `userProfileScreen.test.tsx`.
|
|
33
|
-
|
|
34
|
-
- **Chat profile screen rebuilt around the chat photo.** The picture is now a full-bleed hero with the chat name, member count and round action buttons over it; scrolling the member list collapses it into a compact bar (small avatar + name + member count) that fades in over the same photo, and pulling down zooms the picture. Both the parallax and the collapse run off a single `Animated.Value` fed by `Animated.event(..., { useNativeDriver: true })`, so the whole transition stays on the UI thread. A chat with no picture gets a solid background (the per-chat avatar colour, config `colors.avatar`/primary) with two uppercase initials, same rule people's avatars use.
|
|
35
|
-
- Below the hero: the description and chat-type cards, an **Add Members** row (moderators of group chats only — it opens the existing `SelectUsersModal`, which now takes an optional `trigger` render prop), and the member list with the owner/moderator role on the right and a red `banned` label for banned members. Moderators get a per-row remove button (confirmed with a native alert) in place of the old three-dot menu, whose "Appoint as an admin" and "Unban" entries did nothing but open unrelated modals.
|
|
36
|
-
- Actions: **Leave** (an unavailable presence via `leaveTheRoomStanza`, then the room is dropped from the store, which closes the screen) and **Report**, plus a "…" menu with **Edit** (change the chat picture), **Remove photo**, **Report** and **Delete and Leave** — every entry gated on what the signed-in user can actually do. Report opens a new sheet with the seven `report.category.*` options the i18n table has always carried and posts them to `POST /v1/chats/reports/{chatName}`.
|
|
37
|
-
- The collapsed bar follows the design's third screen: a buttons row (back, "…") with the 48 pt round avatar, chat name and member count on their own row below it, over the frosted picture.
|
|
38
|
-
- The header frosts as it collapses: an `expo-blur` `BlurView` (intensity 92, with a 0.28 dim over it) on the picture, its opacity driven by the same scroll value. `expo-blur` is a new OPTIONAL peer dependency (`>=13.0.0`, dev-pinned to `~57.0.2`). Having the JS package is not enough — the native view has to be in the binary, and an app that installed it without rebuilding renders a red "Unimplemented component: ExpoBlurView" box — so the layer is gated on `requireNativeModule('ExpoBlur')` succeeding and falls back to a plain dim otherwise.
|
|
39
|
-
- The collapsed state is always reachable: the scroll content gets a `minHeight` of the measured viewport plus the hero-to-bar distance, so a chat with two members can still be pulled up instead of springing back.
|
|
40
|
-
- **Search** sits to the left of Leave (the action row is centred: Search / Leave / Report) and filters the member list by full name. Opening it from an expanded header collapses the picture out of the way; dismissing search — or just putting the keyboard away — puts the header back exactly as it was. From an already-collapsed header it only opens the field, and since the hero's button is off-screen there, **Search joins the "…" menu** while collapsed.
|
|
41
|
-
- Over-scrolling downwards stretches the picture instead of painting a second copy of it: the backdrop reaches 400 pt above the hero, clips itself, and scales about its own bottom edge by exactly the amount the over-scroll exposed. The parallax is clamped at zero for negative offsets — left extending, it lifted the picture off that bottom edge and showed a band of backdrop colour beneath it.
|
|
42
|
-
- The "…" menu is now anchored to its own button and unfolds out of it — it measures the button with `measureInWindow` and scales the card up from its top-right corner. The shared `DropdownMenu` pins its card at a hard-coded `top: 95`, which on this screen landed over the host app's tab bar with no relation to the button.
|
|
43
|
-
- Without a picture the hero is ONE flat colour (`colors.avatar`, else the primary) with no scrims — the two stacked scrims that used to sit on it showed their seam as two different greens. Over a photo the white text sits on a gradient that fades in from nothing over the bottom 220 pt — stacked from 16 alpha-ramped bands, since the package carries no gradient dependency. (A single flat overlay has a hard top edge, which read as the bottom half of the picture being darkened.) The initials sit in the upper half so they never collide with the chat name.
|
|
44
|
-
- Removed per the design: the QR button (it had no handler behind it — `setVisible` was dead state) and the favourites star, which this SDK never had. `typography.profile.screenTitle` now styles the chat name in the collapsed bar; `typography.profile.title` the name over the photo. New i18n keys (`modal.chatProfile.addMembers`, `.membersLabel`, `.membersUnavailable`, `.removeMember`, `.removePhoto`, `action.edit`, `action.deleteAndLeave`, `status.banned`) are translated in all six built-in locales. `LeaveIcon`, `ReportIcon` and `BackIcon` now honour their `color` prop (their strokes were hardcoded); defaults are unchanged, so every existing call site looks the same. Tests in `chatProfileScreen.test.tsx`.
|
|
45
|
-
|
|
46
|
-
- **Attach sheet reworked into a Slack-style media picker.** Tapping the paperclip now opens on a "Photos & Videos" section: a horizontal strip with a camera tile first, then the 12 most recent photos read through `expo-media-library` (optional peer). Tapping a thumbnail attaches it directly, skipping the system picker; "View Library" opens the full `expo-image-picker` gallery; "Upload a File" below the divider is the document route. Every existing capability (take a photo, pick from the gallery, pick a file) is still one tap away, and picks keep going through the same deferred-until-dismissed handler as before. iOS `ph://` asset ids are resolved via `getAssetInfoAsync` to an on-disk uri, MIME is derived from the filename extension, images still get the HEIC→JPEG pass, and file size is probed so the 50 MB cap is enforced client-side. The Cancel button is gone (backdrop tap, drag-down and the back gesture all close the sheet), as are the per-row hint lines. New typography key `typography.attachSheet.viewLibrary`; `rowHint` and `cancelButton` are deprecated. Tests in `attachSheetRecents.test.tsx`.
|
|
47
|
-
- Library permission is requested by `SendInput` **before** the sheet opens, not from inside it: iOS cannot present the permission alert while an RN `<Modal>` owns the screen (the same UIKit limitation that used to swallow the pickers), so asking from within resolved to a silent "denied" and left the strip permanently empty. Only the first paperclip tap of a session goes through the check. Without access the strip is simply the camera tile — there is no nagging "allow access" placeholder.
|
|
48
|
-
- Thumbnails are resolved to real `file://` paths before they are rendered. On iOS the library hands out `ph://` identifiers, and React Native has had no PhotoLibrary image loader since CameraRoll left core — the one `expo-media-library` ships isn't picked up under the New Architecture, so every thumbnail redboxed with `No suitable image URL loader found for ph://…` and the second open crawled under the pile of them. `getAssetInfoAsync(asset, { shouldDownloadFromNetwork: false })` maps each asset to its on-disk original (Android's uri is already a file path and skips the call entirely); iCloud-only assets resolve to nothing and are dropped from the strip rather than being pulled over the network to draw an 88 pt tile. The tapped photo is then handed over with no further native round-trip. The strip lists photos only — `<Image>` cannot decode a video file, and poster frames would mean another native dependency; videos stay one tap away behind "View Library".
|
|
49
|
-
- Thumbnails are decoded at 2× their display size (explicit `width`/`height` on the image `source`, `resizeMethod="resize"` on Android) instead of at full sensor resolution, the strip loads 250 ms after the sheet opens rather than during the entry animation, results are cached for 15 s across open/close, and `expo-media-library` is now required lazily on first open instead of at chat-render time — the sheet no longer stutters when it is opened and closed repeatedly.
|
|
50
|
-
- **The attach sheet's grabber now drags.** Two `PanResponder`s share one follow-the-finger animation: the grab handle claims the gesture on touch-down (so a pull on the bar always drags), while the sheet body claims only once the movement is clearly vertical, leaving row taps and the horizontal strip scroll alone. Release past 90 pt (or a flick over 0.8 px/ms) closes the sheet with the normal slide-down animation from wherever the finger let go; anything shorter springs back.
|
|
51
|
-
|
|
52
|
-
- **`config.logout` — built-in "Sign out" item in the room-list header menu.** `{ enabled, label?, confirm?, onBeforeLogout?, onAfterLogout? }`. Rendered last (after New Chat / Profile / Settings) with a logout icon tinted `colors.primary`; hidden unless `enabled: true`, so existing menus are unchanged. Tap flow: close drawer → native confirm (`confirm` defaults to `true`; pass an object to customise title/message/button copy, `false` to skip) → `await onBeforeLogout?.()` (return `false` to cancel) → `await logoutService.performLogout()` (full teardown: XMPP, redux, persisted slices, AsyncStorage, REST cache) → `await onAfterLogout?.()` for the host's own session/navigation logout. Host callback errors are caught and logged via `console.warn` — a throwing `onBeforeLogout` cancels, a throwing `onAfterLogout` is swallowed after the teardown has landed. Documented in README ("Logging out") and `instructions.md`. Tests in `headerRoomListMenuLogout.test.tsx`.
|
|
53
|
-
- **`useLogout` is now exported from the package root** (previously only `logoutService`), so a host can build its own button with the same awaitable teardown.
|
|
54
|
-
|
|
55
|
-
### Fixed
|
|
56
|
-
|
|
57
|
-
- **The signed-in user's description was thrown away on every login.** `unpackAndTransform` (the shaper `setUser` runs every payload through) hardcoded `description: ''`, so the profile's About section could never show your own bio no matter what the server returned. It now carries `input?.description` through.
|
|
58
|
-
- **Avatars for names that start with a digit rendered blank.** `ProfileImagePlaceholder` picked initials with `/^[a-zA-Zа-яА-ЯёЁ]$/`, so a member called "2Test 2User" matched neither letter and got an empty coloured circle. The class is now `/^[\p{L}\p{N}]$/u` — every script's letters plus digits.
|
|
59
|
-
- **"Save to gallery" in the file preview threw instead of saving (SDK 54+).** `expo-media-library` 17 moved its function API behind the `expo-media-library/legacy` subpath and turned the root's same-named exports into stubs that `console.warn` and then `throw` ("Method `saveToLibraryAsync` imported from "expo-media-library" is deprecated"). Since the names still exist and still type-check, the breakage was invisible: every save attempt ended in the generic "Failed to save the file" alert, and each one also queued a LogBox warning whose stack symbolication stalls the JS thread in dev builds. All call sites now go through the new `helpers/mediaLibraryRuntime.ts`, which prefers `/legacy`, falls back to the root export for older versions, returns `null` when the optional peer isn't installed, and memoises the result. Tests in `mediaLibraryRuntime.test.ts`.
|
|
60
|
-
- **iOS: attach-sheet rows (Take photo / Photo or video / Document) did nothing, and the next tap threw `PickingInProgressException: Different document picking in progress`.** The picker handler was invoked from the exit-animation completion callback in the same tick as `setMounted(false)` — but that only *starts* RN `<Modal>`'s native dismiss, so the sheet's UIViewController was still on screen when `expo-image-picker` / `expo-document-picker` called `currentViewController().present(picker)`. UIKit silently dropped the present, the promise never resolved, and expo-document-picker kept its `pickingContext` stuck. `AttachSheet` now fires the pending handler from `<Modal onDismiss>` on iOS (the only signal that the view controller is really gone); Android, where `onDismiss` never fires, keeps running it from the animation callback. The handler is nulled before invocation so it runs at most once, and an interrupted animation (`finished: false`) still does nothing. Tests in `attachSheetPendingHandler.test.tsx`. On iOS, picker rows also skip the sheet's slide-down (the modal is hidden immediately, so `onDismiss` arrives ~50 ms after the tap instead of ~300 ms); Cancel and backdrop taps keep the animated close. The old 350 ms iOS `setTimeout` in `SendInput.handleFileSelection` that tried to paper over the same race is removed — the Document picker now opens as soon as the sheet is gone instead of noticeably later.
|
|
61
|
-
|
|
62
8
|
### Security
|
|
63
9
|
|
|
64
10
|
- **Chat tokens, the XMPP password, and message history are no longer stored in plaintext AsyncStorage.** All four bearer credentials on `User` (REST access + refresh token, XMPP password, secure-media fileToken) now go through the platform Keychain (iOS) / Keystore-backed EncryptedSharedPreferences (Android) via the optional `expo-secure-store` peer dependency, instead of sitting in AsyncStorage's plain SQLite/plist storage. The persisted message-history and room-list cache (`roomStore/persistence.ts`) is now AES-256-CBC encrypted at rest, with the symmetric key itself held in that same secure store — envelope encryption, since bulk history is too large (and unbounded) for direct Keychain storage. `expo-secure-store` is optional (mirrors `expo-video`/`expo-audio` etc.): a host that hasn't added it falls back to namespaced-but-still-unencrypted AsyncStorage with one logged warning, so nothing breaks for existing consumers, but the secure path is what ships by default for any host on the standard Expo dependency set.
|
package/README.md
CHANGED
|
@@ -71,11 +71,9 @@ Image / video / document / audio send & receive, HEIC→JPEG conversion, profile
|
|
|
71
71
|
```bash
|
|
72
72
|
npx expo install \
|
|
73
73
|
expo-audio expo-video expo-clipboard expo-document-picker \
|
|
74
|
-
expo-image-manipulator expo-image-picker expo-media-library
|
|
74
|
+
expo-image-manipulator expo-image-picker expo-media-library
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
> `expo-blur` is only used to frost the chat picture as the chat-profile header collapses. Skip it and that layer falls back to a plain dim — everything else is unaffected.
|
|
78
|
-
|
|
79
77
|
> Video playback uses **`expo-video`** (`useVideoPlayer` / `VideoView`) and audio uses **`expo-audio`** (`createAudioPlayer` / `useAudioRecorder`). Install both. The discontinued `expo-av` is no longer used anywhere in the SDK, so consumers on Expo SDK 57 / RN 0.86 with the New Architecture can drop it.
|
|
80
78
|
|
|
81
79
|
> No `metro.config.js` shim is required. As of `26.5.5` the SDK no longer statically imports any legacy `react-native-*` native modules; the bundled `withEthoraShims` helper is preserved as a no-op for backward compat with older setups.
|
|
@@ -273,28 +271,6 @@ function SignOutButton() {
|
|
|
273
271
|
}
|
|
274
272
|
```
|
|
275
273
|
|
|
276
|
-
### Built-in "Sign out" menu item
|
|
277
|
-
|
|
278
|
-
Don't want to build your own button? Enable the item in the room-list header menu (the drawer with New Chat / Profile / Settings). It renders last, tinted with `config.colors.primary`, and runs the same awaitable teardown as `useLogout()`:
|
|
279
|
-
|
|
280
|
-
```tsx
|
|
281
|
-
<Chat
|
|
282
|
-
config={{
|
|
283
|
-
logout: {
|
|
284
|
-
enabled: true,
|
|
285
|
-
label: 'Sign out', // default
|
|
286
|
-
confirm: { message: 'Sign out of chat?' }, // `true` (default) uses stock copy, `false` skips the dialog
|
|
287
|
-
onBeforeLogout: async () => {
|
|
288
|
-
// return false to cancel (e.g. unsaved draft guard)
|
|
289
|
-
},
|
|
290
|
-
onAfterLogout: () => navigation.replace('SignIn'), // runs AFTER the full teardown
|
|
291
|
-
},
|
|
292
|
-
}}
|
|
293
|
-
/>
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
Tap flow: close drawer → confirmation (native `Alert`) → `await onBeforeLogout?.()` (`false` cancels) → `await logoutService.performLogout()` → `await onAfterLogout?.()`. The host-side session/navigation logout belongs in `onAfterLogout` — by the time it runs, XMPP is disconnected and every persisted key is gone. Errors thrown by either callback are caught and logged via `console.warn`; a throwing `onBeforeLogout` cancels the logout. With `enabled: false` (or the option omitted) the menu is unchanged.
|
|
297
|
-
|
|
298
274
|
Why awaitable: the persistence layer debounces writes by 200 ms, and the chat slice removes its persisted user fire-and-forget. If the host navigated / re-mounted `<Chat>` immediately after a non-awaited call, the next bootstrap could occasionally rehydrate stale state ("old chats reappear"). Awaiting the returned promise eliminates that race. The function never rejects — any internal failure is logged via `console.warn`, so a non-awaited call still won't crash the host. For non-React contexts you can call `logoutService.performLogout()` directly (same Promise).
|
|
299
275
|
|
|
300
276
|
## Customization flags worth knowing
|
|
@@ -304,7 +280,7 @@ Why awaitable: the persistence layer debounces writes by 200 ms, and the chat sl
|
|
|
304
280
|
| `disableProfilesInteractions` | Disables entry to the **user-profile popup** — the in-bubble avatar tap on other users' messages. The avatar is still rendered, just non-interactive. (Does **not** affect the chat-title press → use `disableChatInfo.disableChatHeaderMenu` for that.) |
|
|
305
281
|
| `disableChatInfo.disableChatHeaderMenu` | Disables the **chat-info modal entry point** in the header (tapping the chat title / icon). Use this when you want the header purely informational. The chat-info modal itself has further granular flags (`disableDescription`, `disableType`, `disableMembers`, `hideMembers`, `disableIconEdit`). |
|
|
306
282
|
| `disableChatInfo.disableRoomMenu` | Hides the **three-dots overflow menu on the right of the chat-room header** (the `RoomMenu` with "Leave", etc.). The center panel (avatar + chat name) stays fully visible. **Not** to be confused with the top-level `disableRoomMenu`, which hides the context menu in the **room list**, not the open-chat header. |
|
|
307
|
-
| `disableChatInfo.disableIconEdit` | Makes the chat
|
|
283
|
+
| `disableChatInfo.disableIconEdit` | Makes the chat icon read-only in the chat-info modal — hides the press-to-pick picker AND the remove affordance regardless of the user's role. The icon still renders. |
|
|
308
284
|
| `disableChatHeaderBurgerMenuIcon` | Hides the burger icon in the chat header (the icon that opens the room-list dropdown). `chatHeaderBurgerMenu` controls only the dropdown — set this when you want neither rendered. |
|
|
309
285
|
| `enableAudio` | Opt-in voice messages. **Off by default.** When `true`, an idle input (no text, no attachments) shows a mic icon in the send-button slot — tap → start recording → stop & send. iOS apps need `NSMicrophoneUsageDescription` in Info.plist (add via `expo-audio`'s plugin block in `app.json`). Receiving voice messages from other clients (incl. legacy web `.bin` voicemails) is **independent of this flag** — incoming audio plays regardless. |
|
|
310
286
|
| `disableMemberProfileActions` | Hides the whole "Message / Copy User Id" action block **inside** the chat-info member-profile popup. The popup itself still opens — to block the tap entirely, use `disableChatInfo.disableMemberTap`. |
|
|
@@ -336,14 +312,15 @@ Individual labels accept a `{ fontSize?, fontWeight? }` override. Each only sets
|
|
|
336
312
|
typography: {
|
|
337
313
|
headerTitle: { fontSize: 18, fontWeight: '600' }, // room title in the chat header
|
|
338
314
|
profile: {
|
|
339
|
-
screenTitle: { fontSize: 20, fontWeight: '700' }, //
|
|
340
|
-
title: { fontSize: 24 }, //
|
|
315
|
+
screenTitle: { fontSize: 20, fontWeight: '700' }, // "Chat Profile" title in the modal header bar
|
|
316
|
+
title: { fontSize: 24 }, // big room-name title on the profile screen
|
|
341
317
|
memberName: { fontSize: 16, fontWeight: '600' },
|
|
342
318
|
},
|
|
343
319
|
attachSheet: {
|
|
344
|
-
title: { fontSize:
|
|
345
|
-
|
|
346
|
-
|
|
320
|
+
title: { fontSize: 13, fontWeight: '600' }, // "Attach" header label
|
|
321
|
+
rowLabel: { fontSize: 16, fontWeight: '500' }, // row labels (Take photo / Photo or video / Document)
|
|
322
|
+
rowHint: { fontSize: 13 }, // the small grey subtitle under each row
|
|
323
|
+
cancelButton: { fontSize: 16, fontWeight: '600' },
|
|
347
324
|
},
|
|
348
325
|
},
|
|
349
326
|
}}
|