@ethora/chat-component-rn 26.4.1
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/LICENSE +661 -0
- package/README.md +148 -0
- package/empty-shim.js +15 -0
- package/index.js +13 -0
- package/metro.js +72 -0
- package/package.json +99 -0
- package/src/api.config.ts +34 -0
- package/src/assets/BG.png +0 -0
- package/src/assets/BG.tsx +56 -0
- package/src/assets/File.svg +4 -0
- package/src/assets/ForzaCare.png +0 -0
- package/src/assets/ForzaCare.tsx +27 -0
- package/src/assets/icons.tsx +685 -0
- package/src/assets/images.tsx +41 -0
- package/src/assets/test.xml +243 -0
- package/src/components/AuthForms/Login.tsx +295 -0
- package/src/components/AuthForms/LoginAnonym.tsx +68 -0
- package/src/components/AuthForms/Register.tsx +8 -0
- package/src/components/ContextMenu/ContextMenuComponents.tsx +87 -0
- package/src/components/DropdownMenu/DropdownMenu.tsx +244 -0
- package/src/components/ExampleComponents/CustomMessage.tsx +92 -0
- package/src/components/ExampleComponents/CustomTypingIndicatorExamples.tsx +239 -0
- package/src/components/Header/HeaderRoomList.tsx +104 -0
- package/src/components/InputComponents/AudioInput.tsx +24 -0
- package/src/components/InputComponents/AudioRecorder.tsx +100 -0
- package/src/components/InputComponents/MediaInput.tsx +114 -0
- package/src/components/InputComponents/RecordingIndicator.tsx +77 -0
- package/src/components/InputComponents/Search.tsx +135 -0
- package/src/components/InputComponents/TextInput.tsx +66 -0
- package/src/components/MainComponents/ChatHeader.tsx +163 -0
- package/src/components/MainComponents/ChatRoom.tsx +392 -0
- package/src/components/MainComponents/ChatWrapper.tsx +318 -0
- package/src/components/MainComponents/ChooseChatMessage.tsx +44 -0
- package/src/components/MainComponents/ConnectionBanner.tsx +33 -0
- package/src/components/MainComponents/EditWrapper.tsx +72 -0
- package/src/components/MainComponents/LoginWrapper.tsx +134 -0
- package/src/components/MainComponents/MediaMessage.tsx +55 -0
- package/src/components/MainComponents/MessageContainer.tsx +122 -0
- package/src/components/MainComponents/MessageList.tsx +429 -0
- package/src/components/MainComponents/NoMessagesPlaceholder.tsx +49 -0
- package/src/components/MainComponents/ProfileImagePlaceholder.tsx +143 -0
- package/src/components/MainComponents/RNStyled.tsx +34 -0
- package/src/components/MainComponents/ReduxWrapper.tsx +40 -0
- package/src/components/MainComponents/RoomList.tsx +246 -0
- package/src/components/MainComponents/Select.tsx +165 -0
- package/src/components/MainComponents/Switch.tsx +73 -0
- package/src/components/MainComponents/SystemMessage.tsx +42 -0
- package/src/components/Menu/HeaderRoomListMenu.tsx +169 -0
- package/src/components/MenuRoom/MenuRoom.tsx +46 -0
- package/src/components/MessageBubble/Avatar.tsx +84 -0
- package/src/components/MessageBubble/BottomReplyContainer.tsx +117 -0
- package/src/components/MessageBubble/CustomDivider.tsx +10 -0
- package/src/components/MessageBubble/DeletedMessage.tsx +36 -0
- package/src/components/MessageBubble/Message.tsx +400 -0
- package/src/components/MessageBubble/MessageInteractions.tsx +247 -0
- package/src/components/MessageBubble/MessageReaction.tsx +149 -0
- package/src/components/MessageBubble/MessageReply.tsx +50 -0
- package/src/components/MessageBubble/MessageTranslations.tsx +30 -0
- package/src/components/Modals/AddMembersModal/AddMembersModal.tsx +142 -0
- package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +471 -0
- package/src/components/Modals/ChatProfileModal/DeleteChatModal.tsx +91 -0
- package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +298 -0
- package/src/components/Modals/Modal/Modal.tsx +52 -0
- package/src/components/Modals/ModalHeaderComponent.tsx +41 -0
- package/src/components/Modals/ModalSelectMedia/ModalSelectMedia.tsx +285 -0
- package/src/components/Modals/ModalWrapper/ModalWrapper.tsx +103 -0
- package/src/components/Modals/NewChatModal/ModalContent.tsx +151 -0
- package/src/components/Modals/NewChatModal/NewChatModal.tsx +391 -0
- package/src/components/Modals/NewChatModal/UpdNewChatModal.tsx +136 -0
- package/src/components/Modals/SelectUsersModal/SelectUsersModal.tsx +134 -0
- package/src/components/Modals/SettingsModals/BlockedUsers/BlockedUsersModal.tsx +63 -0
- package/src/components/Modals/SettingsModals/DocumentShares/DocumentSharesModal.tsx +115 -0
- package/src/components/Modals/SettingsModals/ManageDataModal/ManageDataModal.tsx +121 -0
- package/src/components/Modals/SettingsModals/ManageDataModal/StyledComponents.ts +0 -0
- package/src/components/Modals/SettingsModals/ProfileShares/ProfileShares.tsx +65 -0
- package/src/components/Modals/SettingsModals/Referrals/Referrals.tsx +90 -0
- package/src/components/Modals/SettingsModals/SharedStyledComponents.ts +74 -0
- package/src/components/Modals/SettingsModals/Visibility/RadioInput.tsx +59 -0
- package/src/components/Modals/SettingsModals/Visibility/StyledComponents.ts +32 -0
- package/src/components/Modals/SettingsModals/Visibility/VisibilityModal.tsx +146 -0
- package/src/components/Modals/UserProfileModal/EditUserModal.tsx +163 -0
- package/src/components/Modals/UserProfileModal/UserProfileModal.tsx +410 -0
- package/src/components/Modals/UserSettingsModal/UserSettingsModal.tsx +85 -0
- package/src/components/Modals/styledModalComponents.tsx +181 -0
- package/src/components/OperationalModal/OperationalModal.tsx +78 -0
- package/src/components/RoomComponents/ChatRoomItem.tsx +219 -0
- package/src/components/RoomComponents/LastMessageItem.tsx +47 -0
- package/src/components/RoomComponents/styled/LastAudioMessage.tsx +62 -0
- package/src/components/RoomComponents/styled/LastMessageEmoji.tsx +26 -0
- package/src/components/RoomComponents/styled/LastMessageFile.tsx +54 -0
- package/src/components/RoomComponents/styled/LastMessagePhoto.tsx +54 -0
- package/src/components/RoomComponents/styled/LastMessageVideo.tsx +70 -0
- package/src/components/RoomComponents/styled/LastTextMessage.tsx +65 -0
- package/src/components/RoomComponents/styled/StyledRoomComponents.ts +53 -0
- package/src/components/SortDropDown/index.tsx +76 -0
- package/src/components/Thread/ThreadHeader.tsx +41 -0
- package/src/components/Thread/ThreadWrapper.tsx +270 -0
- package/src/components/Toast/Toast.tsx +128 -0
- package/src/components/Toast/index.ts +13 -0
- package/src/components/UsersList/StyledComponents.ts +30 -0
- package/src/components/UsersList/UsersList.tsx +112 -0
- package/src/components/styled/ActionButton.tsx +40 -0
- package/src/components/styled/AudioMessage.tsx +82 -0
- package/src/components/styled/Button.tsx +107 -0
- package/src/components/styled/ChatWrapperBox.tsx +9 -0
- package/src/components/styled/DateLabel.tsx +77 -0
- package/src/components/styled/Loader.tsx +65 -0
- package/src/components/styled/MediaFilePreview.tsx +42 -0
- package/src/components/styled/MediaModal.tsx +54 -0
- package/src/components/styled/MessageImage.tsx +54 -0
- package/src/components/styled/NewMessageLabel.tsx +50 -0
- package/src/components/styled/RoomListComponents/index.tsx +164 -0
- package/src/components/styled/SendInput.tsx +297 -0
- package/src/components/styled/StyledComponents.ts +320 -0
- package/src/components/styled/StyledInput.tsx +101 -0
- package/src/components/styled/StyledInputComponents/AudioComponents.tsx +1 -0
- package/src/components/styled/StyledInputComponents/Composing.tsx +97 -0
- package/src/components/styled/StyledInputComponents/CustomTypingIndicator.tsx +261 -0
- package/src/components/styled/StyledInputComponents/MediaComponents.tsx +90 -0
- package/src/components/styled/StyledInputComponents/StyledInputComponents.tsx +131 -0
- package/src/components/styled/StyledInputComponents/VideoComponents.tsx +49 -0
- package/src/components/styled/TreadLabel.tsx +50 -0
- package/src/components/styled/UnsupportedType.tsx +95 -0
- package/src/components/styled/VideoMessage.tsx +68 -0
- package/src/context/MessageNotificationContext.tsx +335 -0
- package/src/context/PushNotificationProvider.tsx +78 -0
- package/src/context/ToastContext.tsx +63 -0
- package/src/context/toastProvider.tsx +0 -0
- package/src/context/xmppProvider.tsx +364 -0
- package/src/helpers/block_scroll.ts +95 -0
- package/src/helpers/chatAutoEnterer.ts +46 -0
- package/src/helpers/checkUniqueUsers.tsx +31 -0
- package/src/helpers/constants/CHAT_TYPES.ts +6 -0
- package/src/helpers/constants/LANGUAGE_OPTIONS.ts +14 -0
- package/src/helpers/constants/LOCAL_STORAGE.ts +3 -0
- package/src/helpers/constants/MESSAGE_INTERACTIONS.ts +29 -0
- package/src/helpers/constants/MODAL_TYPES.ts +57 -0
- package/src/helpers/constants/PLATFORM_CONSTANTS.ts +3 -0
- package/src/helpers/createMainMessageForThread.ts +23 -0
- package/src/helpers/createMessageFromXml.ts +118 -0
- package/src/helpers/createRoomFromApi.tsx +27 -0
- package/src/helpers/createUserNameFromSetUser.ts +15 -0
- package/src/helpers/dateComparison.ts +12 -0
- package/src/helpers/debounce.ts +10 -0
- package/src/helpers/ensureScopedChatCache.ts +61 -0
- package/src/helpers/extractUniqueMembersFromRooms.ts +45 -0
- package/src/helpers/formatNumberWithCommas.ts +3 -0
- package/src/helpers/getBooleanFromString.ts +7 -0
- package/src/helpers/getDataFromXml.ts +80 -0
- package/src/helpers/getNumberFromString.ts +5 -0
- package/src/helpers/getRoomsWithRetry.ts +45 -0
- package/src/helpers/getTintedColor.ts +28 -0
- package/src/helpers/getUnnamedUsers.ts +39 -0
- package/src/helpers/handleCopyClick.ts +3 -0
- package/src/helpers/handleXmppError.ts +14 -0
- package/src/helpers/hashcolor.ts +34 -0
- package/src/helpers/historyPreloadScheduler.ts +264 -0
- package/src/helpers/initRoomsPresence.ts +32 -0
- package/src/helpers/initXmppRooms.tsx +71 -0
- package/src/helpers/insertMessageWithDelimiter.ts +96 -0
- package/src/helpers/isChatIdPresentInArray.ts +54 -0
- package/src/helpers/localStorageUser.ts +9 -0
- package/src/helpers/markdownParser.tsx +295 -0
- package/src/helpers/nanoToMs.ts +3 -0
- package/src/helpers/parseMessageBody.tsx +516 -0
- package/src/helpers/parseUrls.tsx +42 -0
- package/src/helpers/resolveInitBeforeLoadUser.ts +240 -0
- package/src/helpers/storeConsole.ts +26 -0
- package/src/helpers/transformTranslatations.ts +16 -0
- package/src/helpers/updateMessagesTillLast.tsx +104 -0
- package/src/helpers/updatedChatLastTimestamps.ts +29 -0
- package/src/helpers/validator.ts +20 -0
- package/src/helpers/walletUsername.ts +12 -0
- package/src/hooks/hooks.ts +6 -0
- package/src/hooks/useChatSettingState.tsx +38 -0
- package/src/hooks/useChatWrapperInit.ts +266 -0
- package/src/hooks/useComposing.tsx +59 -0
- package/src/hooks/useCustomTypingIndicator.tsx +193 -0
- package/src/hooks/useEventHandlers.tsx +81 -0
- package/src/hooks/useGetNewArchRoom.tsx +57 -0
- package/src/hooks/useHeapSender.tsx +88 -0
- package/src/hooks/useLocalStorage.tsx +53 -0
- package/src/hooks/useLogout.tsx +31 -0
- package/src/hooks/useMessageHeapState.tsx +11 -0
- package/src/hooks/useMessageLoaderQueue.tsx +90 -0
- package/src/hooks/useMessageQueue.ts +146 -0
- package/src/hooks/usePendingNotification.ts +49 -0
- package/src/hooks/usePrevious.tsx +15 -0
- package/src/hooks/usePushNotifications.ts +106 -0
- package/src/hooks/useQRCodeChatHandler.ts +58 -0
- package/src/hooks/useRoomInitialization.tsx +160 -0
- package/src/hooks/useRoomState.tsx +47 -0
- package/src/hooks/useRoomUrl.tsx +41 -0
- package/src/hooks/useSendMessage.tsx +306 -0
- package/src/hooks/useUnreadMessagesCounter.ts +55 -0
- package/src/hooks/useXmppInitialization.ts +148 -0
- package/src/main.ts +45 -0
- package/src/networking/api-requests/auth.api.ts +140 -0
- package/src/networking/api-requests/push.api.ts +55 -0
- package/src/networking/api-requests/roomMembers.api.ts +20 -0
- package/src/networking/api-requests/rooms.api.ts +142 -0
- package/src/networking/api-requests/user.api.ts +65 -0
- package/src/networking/apiClient.ts +149 -0
- package/src/networking/helpers/refreshChecker.ts +13 -0
- package/src/networking/stanzaHandlers.ts +418 -0
- package/src/networking/xmpp/actionSetTimestampToPrivateStore.xmpp.ts +37 -0
- package/src/networking/xmpp/allRoomPresences.xmpp.ts +10 -0
- package/src/networking/xmpp/createPrivateRoom.xmpp.ts +26 -0
- package/src/networking/xmpp/createRoom.xmpp.ts +35 -0
- package/src/networking/xmpp/createRoomPresence.xmpp.ts +74 -0
- package/src/networking/xmpp/createTimeoutPromise.xmpp.ts +15 -0
- package/src/networking/xmpp/deleteMessage.xmpp.ts +19 -0
- package/src/networking/xmpp/editMessage.xmpp.ts +46 -0
- package/src/networking/xmpp/getChatsPrivateStoreRequest.xmpp.ts +57 -0
- package/src/networking/xmpp/getHistory.xmpp.ts +140 -0
- package/src/networking/xmpp/getLastMessageArchive.xmpp.ts +24 -0
- package/src/networking/xmpp/getRoomInfo.xmpp.ts +15 -0
- package/src/networking/xmpp/getRoomMembers.xmpp.ts +13 -0
- package/src/networking/xmpp/getRooms.xmpp.ts +43 -0
- package/src/networking/xmpp/getRoomsPaged.xmpp.ts +59 -0
- package/src/networking/xmpp/handlePong.xmpp.ts +7 -0
- package/src/networking/xmpp/handleStanzas.xmpp.ts +55 -0
- package/src/networking/xmpp/inviteRoomRequest.xmpp.ts +25 -0
- package/src/networking/xmpp/leaveTheRoom.xmpp.ts +15 -0
- package/src/networking/xmpp/listenerManager.ts +116 -0
- package/src/networking/xmpp/presenceInRoom.xmpp.ts +57 -0
- package/src/networking/xmpp/roomConfig.xmpp.ts +71 -0
- package/src/networking/xmpp/sendMediaMessage.xmpp.ts +97 -0
- package/src/networking/xmpp/sendMessageReaction.xmpp.ts +41 -0
- package/src/networking/xmpp/sendPing.xmpp.ts +21 -0
- package/src/networking/xmpp/sendTextMessage.xmpp.ts +99 -0
- package/src/networking/xmpp/sendTextMessageWithTranslateTag.xmpp.ts +44 -0
- package/src/networking/xmpp/sendTypingRequest.xmpp.ts +26 -0
- package/src/networking/xmpp/setChatsPrivateStoreRequest.xmpp.ts +48 -0
- package/src/networking/xmpp/setMeAsOwner.xmpp.ts +52 -0
- package/src/networking/xmpp/setRoomImage.xmpp.ts +26 -0
- package/src/networking/xmpp/setVCard.xmpp.ts +19 -0
- package/src/networking/xmpp/subscribeToRoomMessages.xmpp.ts +75 -0
- package/src/networking/xmppClient.ts +603 -0
- package/src/roomStore/Middleware/logoutMiddleware.tsx +24 -0
- package/src/roomStore/Middleware/newMessageMidlleware.tsx +87 -0
- package/src/roomStore/Middleware/reactionsMiddleware.tsx +77 -0
- package/src/roomStore/Middleware/testMiddleware.tsx +20 -0
- package/src/roomStore/Middleware/unreadMidlleware.tsx +58 -0
- package/src/roomStore/chatSettingsSlice.ts +178 -0
- package/src/roomStore/index.ts +68 -0
- package/src/roomStore/persistence.ts +152 -0
- package/src/roomStore/roomHeapSlice.ts +37 -0
- package/src/roomStore/roomsSlice.ts +353 -0
- package/src/services/pushNotifications.ts +170 -0
- package/src/services/pushSubscriptionService.ts +145 -0
- package/src/types/messages.ts +61 -0
- package/src/types/models/action.model.ts +30 -0
- package/src/types/models/config.model.ts +16 -0
- package/src/types/models/customComponents.model.ts +53 -0
- package/src/types/models/language.model.ts +11 -0
- package/src/types/models/media.model.ts +5 -0
- package/src/types/models/message.model.ts +69 -0
- package/src/types/models/modal.model.ts +9 -0
- package/src/types/models/room.model.ts +120 -0
- package/src/types/models/user.model.ts +90 -0
- package/src/types/models/xmpp.model.ts +155 -0
- package/src/types/types.ts +505 -0
- package/src/utils/PriorityQueue.ts +47 -0
- package/src/utils/actionHelpers.ts +40 -0
- package/src/utils/actionLogger.ts +64 -0
- package/src/utils/clientRegistry.ts +80 -0
- package/src/utils/devLogger.ts +197 -0
- package/src/utils/messageNotificationManager.ts +108 -0
- package/src/utils/resendMessage.ts +87 -0
- package/src/utils/toastEmitter.ts +27 -0
- package/src/utils/xmppMemoryMonitor.ts +63 -0
- package/src/version.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Ethora Chat Component — React Native (`@ethora/chat-component-rn`)
|
|
2
|
+
|
|
3
|
+
React Native chat UI + chat core for iOS and Android, powered by the Ethora platform (REST + XMPP). Mount a `<Chat />` component, point it at an Ethora app, and get a production-oriented mobile chat experience: rooms, threads, message history, media, push notifications, and pluggable auth.
|
|
4
|
+
|
|
5
|
+
**Part of the [Ethora SDK ecosystem](https://github.com/dappros/ethora#ecosystem)** — see all SDKs, tools, and sample apps. Follow cross-SDK updates in the [Release Notes](https://github.com/dappros/ethora/blob/main/RELEASE-NOTES.md).
|
|
6
|
+
|
|
7
|
+
> Looking for the React.js (web) version? See [`@ethora/chat-component`](https://github.com/dappros/ethora-chat-component).
|
|
8
|
+
|
|
9
|
+
## What you get
|
|
10
|
+
|
|
11
|
+
- Room list and room chat UI (Native / iOS + Android)
|
|
12
|
+
- Message history (MAM), replies, edits, deletes
|
|
13
|
+
- Typing indicators
|
|
14
|
+
- Push notifications (FCM / APNs)
|
|
15
|
+
- Pluggable auth (default / JWT / injected user / custom)
|
|
16
|
+
- Custom message bubble, input, scroll, and day-separator overrides
|
|
17
|
+
|
|
18
|
+
## Default backend endpoints
|
|
19
|
+
|
|
20
|
+
The package defaults to the canonical Ethora Cloud endpoints:
|
|
21
|
+
|
|
22
|
+
| Purpose | Default value |
|
|
23
|
+
|---------|---------------|
|
|
24
|
+
| API base URL | `https://api.chat.ethora.com/v1` |
|
|
25
|
+
| XMPP WebSocket | `wss://xmpp.chat.ethora.com/ws` |
|
|
26
|
+
| XMPP host | `xmpp.chat.ethora.com` |
|
|
27
|
+
| XMPP MUC (conference) | `conference.xmpp.chat.ethora.com` |
|
|
28
|
+
| Web / sign up | `https://app.chat.ethora.com` |
|
|
29
|
+
| Swagger / API docs | `https://api.chat.ethora.com/api-docs/#/` |
|
|
30
|
+
|
|
31
|
+
To target QA, point the equivalent props/env vars at `chat-qa.ethora.com`. To self-host, override with your own `xmppSettings` and `baseUrl` — see the example below.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# inside an existing React Native project
|
|
37
|
+
npm install @ethora/chat-component-rn
|
|
38
|
+
# or
|
|
39
|
+
yarn add @ethora/chat-component-rn
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
iOS only:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
cd ios && pod install
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Quick start
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import React from 'react';
|
|
52
|
+
import { SafeAreaView } from 'react-native';
|
|
53
|
+
import { Chat, XmppProvider } from '@ethora/chat-component-rn';
|
|
54
|
+
|
|
55
|
+
export default function App() {
|
|
56
|
+
return (
|
|
57
|
+
<SafeAreaView style={{ flex: 1 }}>
|
|
58
|
+
<XmppProvider>
|
|
59
|
+
<Chat
|
|
60
|
+
config={{
|
|
61
|
+
appId: 'YOUR_APP_ID',
|
|
62
|
+
baseUrl: 'https://api.chat.ethora.com/v1',
|
|
63
|
+
xmppSettings: {
|
|
64
|
+
devServer: 'wss://xmpp.chat.ethora.com/ws',
|
|
65
|
+
host: 'xmpp.chat.ethora.com',
|
|
66
|
+
conference: 'conference.xmpp.chat.ethora.com',
|
|
67
|
+
},
|
|
68
|
+
}}
|
|
69
|
+
/>
|
|
70
|
+
</XmppProvider>
|
|
71
|
+
</SafeAreaView>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Sign up at [app.chat.ethora.com/register](https://app.chat.ethora.com/register) to get an `appId` (and optionally an app token / JWT for backend integrations). For a guided setup that writes config files into your project, run `npx @ethora/setup`.
|
|
77
|
+
|
|
78
|
+
## Authentication modes
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
// JWT login (recommended for production apps that already have user auth)
|
|
82
|
+
<Chat config={{ jwtLogin: { enabled: true, token: 'PLACEHOLDER_JWT' } }} />
|
|
83
|
+
|
|
84
|
+
// Inject an already-authenticated user
|
|
85
|
+
<Chat
|
|
86
|
+
config={{
|
|
87
|
+
userLogin: {
|
|
88
|
+
enabled: true,
|
|
89
|
+
user: {
|
|
90
|
+
_id: 'PLACEHOLDER_USER_ID',
|
|
91
|
+
appId: 'PLACEHOLDER_APP_ID',
|
|
92
|
+
firstName: 'Jane',
|
|
93
|
+
lastName: 'Doe',
|
|
94
|
+
token: 'PLACEHOLDER_ACCESS_TOKEN',
|
|
95
|
+
refreshToken: 'PLACEHOLDER_REFRESH_TOKEN',
|
|
96
|
+
xmppPassword: 'PLACEHOLDER_XMPP_PASSWORD',
|
|
97
|
+
username: 'PLACEHOLDER_USERNAME',
|
|
98
|
+
walletAddress: 'PLACEHOLDER_WALLET_ADDRESS',
|
|
99
|
+
defaultWallet: { walletAddress: 'PLACEHOLDER_WALLET_ADDRESS' },
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
}}
|
|
103
|
+
/>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Pinning a single room
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
<Chat
|
|
110
|
+
roomJID="ROOM_JID@conference.xmpp.chat.ethora.com"
|
|
111
|
+
config={{ setRoomJidInPath: false }}
|
|
112
|
+
/>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Local development
|
|
116
|
+
|
|
117
|
+
This repo is bootstrapped with `@react-native-community/cli`. To run it as its own RN sample app rather than as a library:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
git clone https://github.com/dappros/ethora-chat-component-rn.git
|
|
121
|
+
cd ethora-chat-component-rn
|
|
122
|
+
yarn install
|
|
123
|
+
cd ios && pod install && cd ..
|
|
124
|
+
yarn start # Metro
|
|
125
|
+
yarn ios # in another terminal
|
|
126
|
+
yarn android # in another terminal
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
> Make sure you have completed the [React Native environment setup](https://reactnative.dev/docs/environment-setup) before proceeding.
|
|
130
|
+
|
|
131
|
+
## Related
|
|
132
|
+
|
|
133
|
+
- [`@ethora/chat-component`](https://github.com/dappros/ethora-chat-component) — React.js (web) chat SDK
|
|
134
|
+
- [`ethora-sdk-android`](https://github.com/dappros/ethora-sdk-android) — Native Android SDK (Kotlin / Compose)
|
|
135
|
+
- [`ethora-sdk-swift`](https://github.com/dappros/ethora-sdk-swift) — Native iOS SDK (Swift / SwiftUI)
|
|
136
|
+
- [`ethora-setup`](https://github.com/dappros/ethora-setup) — `npx @ethora/setup` to bootstrap an Ethora app
|
|
137
|
+
- [Ethora monorepo](https://github.com/dappros/ethora) — full ecosystem entry point
|
|
138
|
+
- API docs (Swagger): [api.chat.ethora.com/api-docs/#/](https://api.chat.ethora.com/api-docs/#/)
|
|
139
|
+
|
|
140
|
+
## Support
|
|
141
|
+
|
|
142
|
+
- Forum: <https://forum.ethora.com/>
|
|
143
|
+
- Discord: <https://discord.gg/Sm6bAHA3ZC>
|
|
144
|
+
- Status: <https://uptime.chat.ethora.com>
|
|
145
|
+
|
|
146
|
+
## License
|
|
147
|
+
|
|
148
|
+
AGPL. See [LICENSE](./LICENSE).
|
package/empty-shim.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// No-op module used by metro to stand in for optional native deps that
|
|
2
|
+
// the source tree references but the testbed never actually invokes
|
|
3
|
+
// (image-crop-picker, document-picker, etc.). Exporting a Proxy means
|
|
4
|
+
// `default` access and method calls won't throw on require, only when
|
|
5
|
+
// actually invoked.
|
|
6
|
+
const noop = () => undefined;
|
|
7
|
+
const handler = {
|
|
8
|
+
get(_target, prop) {
|
|
9
|
+
if (prop === '__esModule') return true;
|
|
10
|
+
if (prop === 'default') return new Proxy(noop, handler);
|
|
11
|
+
if (prop === Symbol.toPrimitive) return () => '';
|
|
12
|
+
return new Proxy(noop, handler);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
module.exports = new Proxy(noop, handler);
|
package/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @format
|
|
3
|
+
*
|
|
4
|
+
* Expo entry — registerRootComponent handles both Expo Go and bare/
|
|
5
|
+
* prebuild flows. The gesture-handler import has to be the very first
|
|
6
|
+
* thing the app evaluates.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import 'react-native-gesture-handler';
|
|
10
|
+
import { registerRootComponent } from 'expo';
|
|
11
|
+
import App from './App';
|
|
12
|
+
|
|
13
|
+
registerRootComponent(App);
|
package/metro.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metro helper for consumers of @ethora/chat-component.
|
|
3
|
+
*
|
|
4
|
+
* The chat library statically references several optional native
|
|
5
|
+
* modules (image-crop-picker, document-picker, audio-recorder,
|
|
6
|
+
* permissions, clipboard, etc.) so feature flags can flip them on
|
|
7
|
+
* without dynamic-import gymnastics. Consumers who don't enable
|
|
8
|
+
* those features still need Metro to resolve the imports — this
|
|
9
|
+
* helper points them at a noop shim.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
*
|
|
13
|
+
* // metro.config.js
|
|
14
|
+
* const { getDefaultConfig } = require('expo/metro-config');
|
|
15
|
+
* const { withEthoraShims } = require('@ethora/chat-component/metro');
|
|
16
|
+
*
|
|
17
|
+
* module.exports = withEthoraShims(getDefaultConfig(__dirname));
|
|
18
|
+
*
|
|
19
|
+
* If you DO install one of the listed modules in your app, drop it
|
|
20
|
+
* from `OPTIONAL_NATIVE_MODULES` (or pass `{ skip: [...] }`).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const path = require('path');
|
|
24
|
+
|
|
25
|
+
const OPTIONAL_NATIVE_MODULES = [
|
|
26
|
+
'react-native-image-crop-picker',
|
|
27
|
+
'react-native-document-picker',
|
|
28
|
+
'react-native-image-picker',
|
|
29
|
+
'react-native-audio-recorder-player',
|
|
30
|
+
'react-native-fs',
|
|
31
|
+
'react-native-video',
|
|
32
|
+
'react-native-permissions',
|
|
33
|
+
'@react-native-clipboard/clipboard',
|
|
34
|
+
'react-native-emoji-selector',
|
|
35
|
+
'@react-native-camera-roll/camera-roll',
|
|
36
|
+
'@react-native-community/checkbox',
|
|
37
|
+
'react-native-qrcode-svg',
|
|
38
|
+
'emoji-mart',
|
|
39
|
+
'luxon',
|
|
40
|
+
'react-native-pdf',
|
|
41
|
+
'react-native-image-zoom-viewer',
|
|
42
|
+
'react-native-blob-util',
|
|
43
|
+
'react-native-haptic-feedback',
|
|
44
|
+
'rn-fetch-blob',
|
|
45
|
+
'react-native-share',
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const SHIM_PATH = path.resolve(__dirname, 'empty-shim.js');
|
|
49
|
+
|
|
50
|
+
function withEthoraShims(config, { skip = [] } = {}) {
|
|
51
|
+
const skipSet = new Set(skip);
|
|
52
|
+
const shims = OPTIONAL_NATIVE_MODULES.filter((m) => !skipSet.has(m));
|
|
53
|
+
const lookup = new Set(shims);
|
|
54
|
+
|
|
55
|
+
const previousResolveRequest =
|
|
56
|
+
config.resolver && config.resolver.resolveRequest;
|
|
57
|
+
|
|
58
|
+
config.resolver = config.resolver || {};
|
|
59
|
+
config.resolver.resolveRequest = (context, moduleName, platform) => {
|
|
60
|
+
if (lookup.has(moduleName)) {
|
|
61
|
+
return { filePath: SHIM_PATH, type: 'sourceFile' };
|
|
62
|
+
}
|
|
63
|
+
if (previousResolveRequest) {
|
|
64
|
+
return previousResolveRequest(context, moduleName, platform);
|
|
65
|
+
}
|
|
66
|
+
return context.resolveRequest(context, moduleName, platform);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return config;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = { withEthoraShims, OPTIONAL_NATIVE_MODULES };
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ethora/chat-component-rn",
|
|
3
|
+
"version": "26.04.01",
|
|
4
|
+
"description": "Drop-in XMPP chat component for React Native / Expo. <Chat config={...}/> and you're done.",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"react-native": "src/main.ts",
|
|
7
|
+
"source": "src/main.ts",
|
|
8
|
+
"types": "src/main.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"src",
|
|
11
|
+
"metro.js",
|
|
12
|
+
"empty-shim.js",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"react": ">=18.0.0",
|
|
17
|
+
"react-native": ">=0.73.0",
|
|
18
|
+
"react-native-svg": ">=14.0.0",
|
|
19
|
+
"react-native-reanimated": ">=3.0.0",
|
|
20
|
+
"@react-native-async-storage/async-storage": ">=1.21.0",
|
|
21
|
+
"react-native-get-random-values": ">=1.10.0",
|
|
22
|
+
"react-native-gesture-handler": ">=2.0.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependenciesMeta": {
|
|
25
|
+
"react-native-svg": { "optional": false },
|
|
26
|
+
"react-native-reanimated": { "optional": false },
|
|
27
|
+
"@react-native-async-storage/async-storage": { "optional": false },
|
|
28
|
+
"react-native-get-random-values": { "optional": false },
|
|
29
|
+
"react-native-gesture-handler": { "optional": true }
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"start": "expo start",
|
|
33
|
+
"android": "expo run:android",
|
|
34
|
+
"ios": "expo run:ios",
|
|
35
|
+
"web": "expo start --web",
|
|
36
|
+
"prebuild": "expo prebuild",
|
|
37
|
+
"lint": "eslint .",
|
|
38
|
+
"test": "jest"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@reduxjs/toolkit": "^2.5.0",
|
|
42
|
+
"@xmpp/client": "^0.13.1",
|
|
43
|
+
"axios": "^1.7.9",
|
|
44
|
+
"js-sha256": "^0.11.0",
|
|
45
|
+
"react-redux": "^9.2.0",
|
|
46
|
+
"styled-components": "^6.1.13"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@babel/core": "^7.25.2",
|
|
50
|
+
"@babel/preset-env": "^7.25.3",
|
|
51
|
+
"@babel/runtime": "^7.25.0",
|
|
52
|
+
"@react-native-async-storage/async-storage": "2.2.0",
|
|
53
|
+
"@types/jest": "^29.5.12",
|
|
54
|
+
"@types/react": "~19.1.0",
|
|
55
|
+
"@types/react-test-renderer": "^19.1.0",
|
|
56
|
+
"babel-jest": "^29.6.3",
|
|
57
|
+
"eslint": "^8.19.0",
|
|
58
|
+
"eslint-config-expo": "~9.2.0",
|
|
59
|
+
"expo": "~54.0.0",
|
|
60
|
+
"expo-build-properties": "^55.0.14",
|
|
61
|
+
"expo-status-bar": "~3.0.0",
|
|
62
|
+
"jest": "^29.6.3",
|
|
63
|
+
"jest-expo": "~54.0.0",
|
|
64
|
+
"prettier": "2.8.8",
|
|
65
|
+
"react": "19.1.0",
|
|
66
|
+
"react-native": "0.81.5",
|
|
67
|
+
"react-native-gesture-handler": "~2.28.0",
|
|
68
|
+
"react-native-get-random-values": "~1.11.0",
|
|
69
|
+
"react-native-reanimated": "~4.1.0",
|
|
70
|
+
"react-native-safe-area-context": "~5.6.0",
|
|
71
|
+
"react-native-screens": "~4.16.0",
|
|
72
|
+
"react-native-svg": "15.12.1",
|
|
73
|
+
"react-native-worklets": "~0.5.0",
|
|
74
|
+
"react-qr-code": "^2.0.15",
|
|
75
|
+
"react-test-renderer": "19.1.0",
|
|
76
|
+
"typescript": "~5.9.0"
|
|
77
|
+
},
|
|
78
|
+
"engines": {
|
|
79
|
+
"node": ">=18"
|
|
80
|
+
},
|
|
81
|
+
"author": "Ethora",
|
|
82
|
+
"license": "AGPL-3.0-only",
|
|
83
|
+
"keywords": [
|
|
84
|
+
"chat",
|
|
85
|
+
"messaging",
|
|
86
|
+
"react",
|
|
87
|
+
"react-native",
|
|
88
|
+
"expo",
|
|
89
|
+
"react-component",
|
|
90
|
+
"messenger",
|
|
91
|
+
"reactjs",
|
|
92
|
+
"web3",
|
|
93
|
+
"xmpp",
|
|
94
|
+
"ethora"
|
|
95
|
+
],
|
|
96
|
+
"publishConfig": {
|
|
97
|
+
"access": "public"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//This is a file with appToken for Ethora and examles how objects look like
|
|
2
|
+
|
|
3
|
+
export const appToken =
|
|
4
|
+
'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlzVXNlckRhdGFFbmNyeXB0ZWQiOmZhbHNlLCJwYXJlbnRBcHBJZCI6bnVsbCwiaXNBbGxvd2VkTmV3QXBwQ3JlYXRlIjp0cnVlLCJpc0Jhc2VBcHAiOnRydWUsIl9pZCI6IjY0NmNjOGRjOTZkNGE0ZGM4ZjdiMmYyZCIsImRpc3BsYXlOYW1lIjoiRXRob3JhIiwiZG9tYWluTmFtZSI6ImV0aG9yYSIsImNyZWF0b3JJZCI6IjY0NmNjOGQzOTZkNGE0ZGM4ZjdiMmYyNSIsInVzZXJzQ2FuRnJlZSI6dHJ1ZSwiZGVmYXVsdEFjY2Vzc0Fzc2V0c09wZW4iOnRydWUsImRlZmF1bHRBY2Nlc3NQcm9maWxlT3BlbiI6dHJ1ZSwiYnVuZGxlSWQiOiJjb20uZXRob3JhIiwicHJpbWFyeUNvbG9yIjoiIzAwM0U5QyIsInNlY29uZGFyeUNvbG9yIjoiIzI3NzVFQSIsImNvaW5TeW1ib2wiOiJFVE8iLCJjb2luTmFtZSI6IkV0aG9yYSBDb2luIiwiUkVBQ1RfQVBQX0ZJUkVCQVNFX0FQSV9LRVkiOiJBSXphU3lEUWRrdnZ4S0t4NC1XcmpMUW9ZZjA4R0ZBUmdpX3FPNGciLCJSRUFDVF9BUFBfRklSRUJBU0VfQVVUSF9ET01BSU4iOiJldGhvcmEtNjY4ZTkuZmlyZWJhc2VhcHAuY29tIiwiUkVBQ1RfQVBQX0ZJUkVCQVNFX1BST0pFQ1RfSUQiOiJldGhvcmEtNjY4ZTkiLCJSRUFDVF9BUFBfRklSRUJBU0VfU1RPUkFHRV9CVUNLRVQiOiJldGhvcmEtNjY4ZTkuYXBwc3BvdC5jb20iLCJSRUFDVF9BUFBfRklSRUJBU0VfTUVTU0FHSU5HX1NFTkRFUl9JRCI6Ijk3MjkzMzQ3MDA1NCIsIlJFQUNUX0FQUF9GSVJFQkFTRV9BUFBfSUQiOiIxOjk3MjkzMzQ3MDA1NDp3ZWI6ZDQ2ODJlNzZlZjAyZmQ5YjljZGFhNyIsIlJFQUNUX0FQUF9GSVJFQkFTRV9NRUFTVVJNRU5UX0lEIjoiRy1XSE03WFJaNEM4IiwiUkVBQ1RfQVBQX1NUUklQRV9QVUJMSVNIQUJMRV9LRVkiOiIiLCJSRUFDVF9BUFBfU1RSSVBFX1NFQ1JFVF9LRVkiOiIiLCJjcmVhdGVkQXQiOiIyMDIzLTA1LTIzVDE0OjA4OjI4LjEzNloiLCJ1cGRhdGVkQXQiOiIyMDIzLTA1LTIzVDE0OjA4OjI4LjEzNloiLCJfX3YiOjB9LCJpYXQiOjE2ODQ4NTA5MjV9.-IqNVMsf8GyS9Z-_yuNW7hpSmejajjAy-W0J8TadRIM';
|
|
5
|
+
export const defaultUser = {
|
|
6
|
+
_id: '65831a646edcd3cee0545757',
|
|
7
|
+
firstName: 'Raze',
|
|
8
|
+
lastName: 'Yuki',
|
|
9
|
+
xmppPassword: 'HDC7qnWI16',
|
|
10
|
+
walletAddress: '0x6816810a7Fe04FC9b800f9D11564C0e4aEC25D78',
|
|
11
|
+
token:
|
|
12
|
+
'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVzZXJJZCI6IjY1ODMxYTY0NmVkY2QzY2VlMDU0NTc1NyIsImFwcElkIjoiNjQ2Y2M4ZGM5NmQ0YTRkYzhmN2IyZjJkIn0sImlhdCI6MTcxODI1OTMzNCwiZXhwIjoxNzE4MjYwMjM0fQ.-eG07yKkNL6sAFw_-xwBxjios6XtWF6n1MExphyg4W4',
|
|
13
|
+
refreshToken:
|
|
14
|
+
'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVzZXJJZCI6IjY1ODMxYTY0NmVkY2QzY2VlMDU0NTc1NyIsImFwcElkIjoiNjQ2Y2M4ZGM5NmQ0YTRkYzhmN2IyZjJkIn0sImlhdCI6MTcxODI1OTMzNCwiZXhwIjoxNzE4ODY0MTM0fQ.Zs7_eLdefD3i6nEO1b_XbFZA_q9SWFKDghj8HqJ2fC0',
|
|
15
|
+
profileImage:
|
|
16
|
+
'https://lh3.googleusercontent.com/a/ACg8ocLPzhjmRoDe9ZXawhnZN3nd0eEhrqoKwRicJyM6q2z_=s96-c',
|
|
17
|
+
isProfileOpen: true,
|
|
18
|
+
isAssetsOpen: true,
|
|
19
|
+
referrerId: '',
|
|
20
|
+
isAllowedNewAppCreate: true,
|
|
21
|
+
isAgreeWithTerms: false,
|
|
22
|
+
company: [],
|
|
23
|
+
appId: '646cc8dc96d4a4dc8f7b2f2d',
|
|
24
|
+
homeScreen: '',
|
|
25
|
+
defaultWallet: {
|
|
26
|
+
walletAddress: '0x6816810a7Fe04FC9b800f9D11564C0e4aEC25D78',
|
|
27
|
+
},
|
|
28
|
+
email: 'yukiraze9@gmail.com',
|
|
29
|
+
username: '',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const defRoom = {
|
|
33
|
+
jid: '5f9a4603b2b5bbfa6b228b642127c56d03b778ad594c52b755e605c977303979@conference.xmpp.ethoradev.com',
|
|
34
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import Svg, { G, Path } from 'react-native-svg';
|
|
2
|
+
|
|
3
|
+
export const BG = ({ color = '#0052CD', ...props }) => (
|
|
4
|
+
<Svg width="393" height="444" viewBox="0 0 393 444" fill="none" {...props}>
|
|
5
|
+
<G opacity="0.4">
|
|
6
|
+
<Path
|
|
7
|
+
fill-rule="evenodd"
|
|
8
|
+
clip-rule="evenodd"
|
|
9
|
+
d="M45.1107 -0.969366L10.4442 8.31949L21.2812 48.7637L-19.163 59.6007L-9.87414 94.2672L30.5701 83.4302L41.4071 123.874L76.0736 114.586L65.2366 74.1413L105.681 63.3043L96.392 28.6379L55.9477 39.4749L45.1107 -0.969366ZM28.9179 53.1728L-11.5264 64.0098L-2.2375 98.6763L38.2067 87.8393L49.0437 128.284L83.7102 118.995L72.8732 78.5504L113.317 67.7134L104.029 33.0469L63.5844 43.8839L52.7474 3.43971L18.0809 12.7286L28.9179 53.1728ZM20.8336 14.3179L31.6706 54.7621L-8.7736 65.5991L-0.648195 95.9235L39.796 85.0865L50.633 125.531L80.9575 117.405L70.1205 76.9611L110.565 66.1241L102.439 35.7997L61.9951 46.6367L51.1581 6.19246L20.8336 14.3179Z"
|
|
10
|
+
fill="#80E1E4"
|
|
11
|
+
/>
|
|
12
|
+
<Path
|
|
13
|
+
fill-rule="evenodd"
|
|
14
|
+
clip-rule="evenodd"
|
|
15
|
+
d="M412.306 279.321L374.277 255.962L347.026 300.329L302.659 273.078L279.3 311.107L323.667 338.358L296.416 382.725L334.445 406.083L361.696 361.717L406.063 388.968L429.422 350.939L385.055 323.688L412.306 279.321ZM349.575 310.995L305.208 283.743L281.849 321.772L326.216 349.023L298.965 393.39L336.994 416.749L364.245 372.382L408.612 399.633L431.97 361.604L387.603 334.353L414.855 289.986L376.826 266.628L349.575 310.995ZM377.745 270.472L350.493 314.839L306.126 287.588L285.694 320.853L330.061 348.105L302.809 392.472L336.075 412.904L363.326 368.537L407.693 395.789L428.126 362.523L383.759 335.272L411.01 290.905L377.745 270.472Z"
|
|
16
|
+
fill="#80E1E4"
|
|
17
|
+
/>
|
|
18
|
+
<Path
|
|
19
|
+
fill-rule="evenodd"
|
|
20
|
+
clip-rule="evenodd"
|
|
21
|
+
d="M344.804 47.786L330.418 51.6406L334.915 68.4236L318.132 72.9206L321.987 87.3061L338.77 82.8091L343.267 99.5922L357.652 95.7376L353.155 78.9545L369.938 74.4575L366.084 60.072L349.301 64.5691L344.804 47.786ZM338.084 70.2533L321.301 74.7503L325.156 89.1358L341.939 84.6388L346.436 101.422L360.821 97.5672L356.324 80.7842L373.107 76.2872L369.253 61.9017L352.47 66.3987L347.973 49.6156L333.587 53.4702L338.084 70.2533ZM334.73 54.1297L339.227 70.9128L322.444 75.4098L325.815 87.9935L342.598 83.4964L347.095 100.28L359.679 96.9077L355.182 80.1247L371.965 75.6276L368.593 63.044L351.81 67.541L347.313 50.7579L334.73 54.1297Z"
|
|
22
|
+
fill="#80E1E4"
|
|
23
|
+
/>
|
|
24
|
+
<Path
|
|
25
|
+
fill-rule="evenodd"
|
|
26
|
+
clip-rule="evenodd"
|
|
27
|
+
d="M39.9687 356.98L25.1186 355.851L23.8017 373.176L6.47657 371.86L5.34781 386.71L22.673 388.027L21.3561 405.352L36.2062 406.48L37.5231 389.155L54.8482 390.472L55.977 375.622L38.6518 374.305L39.9687 356.98ZM26.1856 375.953L8.86046 374.636L7.7317 389.486L25.0568 390.803L23.74 408.128L38.5901 409.257L39.907 391.931L57.2321 393.248L58.3609 378.398L41.0357 377.081L42.3526 359.756L27.5025 358.627L26.1856 375.953ZM28.3618 359.628L27.0449 376.953L9.71978 375.636L8.7324 388.626L26.0575 389.943L24.7407 407.269L37.7308 408.256L39.0476 390.931L56.3728 392.248L57.3602 379.258L40.035 377.941L41.3519 360.616L28.3618 359.628Z"
|
|
28
|
+
fill="#80E1E4"
|
|
29
|
+
/>
|
|
30
|
+
<Path
|
|
31
|
+
fill-rule="evenodd"
|
|
32
|
+
clip-rule="evenodd"
|
|
33
|
+
d="M2.17667 234.203L-3.40209 240.057L3.42773 246.566L-3.08082 253.396L2.77331 258.975L9.28187 252.145L16.1117 258.653L21.6905 252.799L14.8606 246.291L21.3692 239.461L15.5151 233.882L9.0065 240.712L2.17667 234.203ZM5.41405 246.518L-1.09451 253.348L4.75963 258.927L11.2682 252.097L18.098 258.605L23.6768 252.751L16.8469 246.243L23.3555 239.413L17.5014 233.834L10.9928 240.664L4.16299 234.155L-1.41577 240.01L5.41405 246.518ZM-0.699773 239.992L6.13005 246.501L-0.378507 253.331L4.74238 258.211L11.2509 251.381L18.0808 257.889L22.9608 252.769L16.1309 246.26L22.6395 239.43L17.5186 234.55L11.0101 241.38L4.18024 234.871L-0.699773 239.992Z"
|
|
34
|
+
fill="#80E1E4"
|
|
35
|
+
/>
|
|
36
|
+
<Path
|
|
37
|
+
fill-rule="evenodd"
|
|
38
|
+
clip-rule="evenodd"
|
|
39
|
+
d="M217.874 -5.57336L212.295 0.280773L219.125 6.78933L212.616 13.6192L218.471 19.1979L224.979 12.3681L231.809 18.8766L237.388 13.0225L230.558 6.51396L237.066 -0.315865L231.212 -5.89463L224.704 0.935195L217.874 -5.57336ZM221.111 6.7415L214.603 13.5713L220.457 19.1501L226.965 12.3203L233.795 18.8288L239.374 12.9747L232.544 6.46613L239.053 -0.363698L233.199 -5.94246L226.69 0.887364L219.86 -5.62119L214.281 0.232942L221.111 6.7415ZM214.997 0.215697L221.827 6.72425L215.319 13.5541L220.44 18.4341L226.948 11.6043L233.778 18.1128L238.658 12.9919L231.828 6.48337L238.337 -0.346451L233.216 -5.22646L226.707 1.60336L219.878 -4.90519L214.997 0.215697Z"
|
|
40
|
+
fill="#80E1E4"
|
|
41
|
+
/>
|
|
42
|
+
<Path
|
|
43
|
+
fill-rule="evenodd"
|
|
44
|
+
clip-rule="evenodd"
|
|
45
|
+
d="M390.22 148.798L384.641 154.652L391.471 161.161L384.963 167.991L390.817 173.569L397.325 166.74L404.155 173.248L409.734 167.394L402.904 160.886L409.413 154.056L403.559 148.477L397.05 155.307L390.22 148.798ZM393.458 161.113L386.949 167.943L392.803 173.522L399.312 166.692L406.141 173.2L411.72 167.346L404.89 160.838L411.399 154.008L405.545 148.429L399.036 155.259L392.206 148.75L386.628 154.605L393.458 161.113ZM387.344 154.587L394.174 161.096L387.665 167.926L392.786 172.806L399.294 165.976L406.124 172.484L411.004 167.364L404.174 160.855L410.683 154.025L405.562 149.145L399.054 155.975L392.224 149.466L387.344 154.587Z"
|
|
46
|
+
fill="#80E1E4"
|
|
47
|
+
/>
|
|
48
|
+
<Path
|
|
49
|
+
fill-rule="evenodd"
|
|
50
|
+
clip-rule="evenodd"
|
|
51
|
+
d="M158.663 349.694L153.084 355.548L159.914 362.056L153.406 368.886L159.26 374.465L165.768 367.635L172.598 374.144L178.177 368.29L171.347 361.781L177.856 354.951L172.001 349.372L165.493 356.202L158.663 349.694ZM161.9 362.009L155.392 368.838L161.246 374.417L167.755 367.587L174.584 374.096L180.163 368.242L173.333 361.733L179.842 354.903L173.988 349.325L167.479 356.154L160.649 349.646L155.071 355.5L161.9 362.009ZM155.787 355.483L162.616 361.991L156.108 368.821L161.229 373.701L167.737 366.871L174.567 373.38L179.447 368.259L172.617 361.75L179.126 354.921L174.005 350.041L167.496 356.87L160.667 350.362L155.787 355.483Z"
|
|
52
|
+
fill="#80E1E4"
|
|
53
|
+
/>
|
|
54
|
+
</G>
|
|
55
|
+
</Svg>
|
|
56
|
+
);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="46" height="46" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="40" height="40" rx="8" fill="#F2E6F6"/>
|
|
3
|
+
<path d="M27 17V27C27 28.1046 26.1046 29 25 29H15C13.8954 29 13 28.1046 13 27V26V13C13 11.8954 13.8954 11 15 11H21M27 17L21 11M27 17H23C21.8954 17 21 16.1046 21 15V11" stroke="#60269E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Svg, { Defs, Image, Pattern, Rect, Use } from 'react-native-svg';
|
|
3
|
+
|
|
4
|
+
export const ForzaCare = () => (
|
|
5
|
+
<Svg width="139" height="40" viewBox="0 0 139 40" fill="none">
|
|
6
|
+
<Rect width="138.462" height="40" fill="url(#pattern0_338_11831)" />
|
|
7
|
+
<Defs>
|
|
8
|
+
<Pattern
|
|
9
|
+
id="pattern0_338_11831"
|
|
10
|
+
patternContentUnits="objectBoundingBox"
|
|
11
|
+
width="1"
|
|
12
|
+
height="1"
|
|
13
|
+
>
|
|
14
|
+
<Use
|
|
15
|
+
xlinkHref="#image0_338_11831"
|
|
16
|
+
transform="matrix(0.0037037 0 0 0.0128205 0 -0.128205)"
|
|
17
|
+
/>
|
|
18
|
+
</Pattern>
|
|
19
|
+
<Image
|
|
20
|
+
id="image0_338_11831"
|
|
21
|
+
width="270"
|
|
22
|
+
height="88"
|
|
23
|
+
xlinkHref="data:image/png;base64,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"
|
|
24
|
+
/>
|
|
25
|
+
</Defs>
|
|
26
|
+
</Svg>
|
|
27
|
+
);
|