From e98ce32787d4fb9ddc71efb278f38daf4556253b Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Fri, 26 Apr 2024 10:10:48 -0300 Subject: [PATCH 1/8] fix: add checks to draft auto save (#5639) * fix: disable auto save draft on ShareView screen * fix: remove unnecessary logic for draft saving * fix: checks if any text has been changed before saving the draft on return * chore: fix React warn (dont call state on unmonted component) * chore: remove unnecessary console.log * unmount hack * wip --- .../MessageComposer/hooks/useAutoSaveDraft.ts | 32 +++++++++++++++---- app/lib/methods/helpers/emitter.ts | 3 +- app/lib/methods/sendMessage.ts | 4 --- app/views/RoomView/index.tsx | 4 ++- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/app/containers/MessageComposer/hooks/useAutoSaveDraft.ts b/app/containers/MessageComposer/hooks/useAutoSaveDraft.ts index 88bc7081b..a846237f9 100644 --- a/app/containers/MessageComposer/hooks/useAutoSaveDraft.ts +++ b/app/containers/MessageComposer/hooks/useAutoSaveDraft.ts @@ -1,24 +1,28 @@ +import { useRoute } from '@react-navigation/native'; import { useCallback, useEffect, useRef } from 'react'; +import { saveDraftMessage } from '../../../lib/methods/draftMessage'; import { useRoomContext } from '../../../views/RoomView/context'; import { useFocused } from '../context'; -import { saveDraftMessage } from '../../../lib/methods/draftMessage'; export const useAutoSaveDraft = (text = '') => { + const route = useRoute(); const { rid, tmid, action, selectedMessages } = useRoomContext(); const focused = useFocused(); const oldText = useRef(''); const intervalRef = useRef(); - const saveMessageDraft = useCallback(() => { - if (action === 'edit') return; + const mounted = useRef(true); + const saveMessageDraft = useCallback(() => { + if (route.name === 'ShareView') return; + if (action === 'edit') return; const draftMessage = selectedMessages?.length ? JSON.stringify({ quotes: selectedMessages, msg: text }) : text; - if (oldText.current !== draftMessage) { + if (oldText.current !== draftMessage || (oldText.current === '' && draftMessage === '')) { oldText.current = draftMessage; saveDraftMessage({ rid, tmid, draftMessage }); } - }, [action, rid, tmid, text, selectedMessages?.length]); + }, [action, rid, tmid, text, selectedMessages?.length, route.name]); useEffect(() => { if (focused) { @@ -29,7 +33,23 @@ export const useAutoSaveDraft = (text = '') => { return () => { clearInterval(intervalRef.current); - saveMessageDraft(); }; }, [focused, saveMessageDraft]); + + // hack to call saveMessageDraft when component is unmounted + useEffect(() => { + () => {}; + return () => { + mounted.current = false; + }; + }, []); + + useEffect( + () => () => { + if (!mounted.current) { + saveMessageDraft(); + } + }, + [saveMessageDraft] + ); }; diff --git a/app/lib/methods/helpers/emitter.ts b/app/lib/methods/helpers/emitter.ts index cc7c0ca13..3cc7f6c11 100644 --- a/app/lib/methods/helpers/emitter.ts +++ b/app/lib/methods/helpers/emitter.ts @@ -18,4 +18,5 @@ export type TKeyEmitterEvent = keyof TEmitterEvents; export const emitter = mitt(); -emitter.on('*', (type, e) => console.log(type, e)); +// uncomment the line below to log all events +// emitter.on('*', (type, e) => console.log(type, e)); diff --git a/app/lib/methods/sendMessage.ts b/app/lib/methods/sendMessage.ts index 9dbc6bbb3..1702cc0b1 100644 --- a/app/lib/methods/sendMessage.ts +++ b/app/lib/methods/sendMessage.ts @@ -8,7 +8,6 @@ import { Encryption } from '../encryption'; import { E2EType, IMessage, IUser, TMessageModel } from '../../definitions'; import sdk from '../services/sdk'; import { E2E_MESSAGE_TYPE, E2E_STATUS, messagesStatus } from '../constants'; -import { saveDraftMessage } from './draftMessage'; const changeMessageStatus = async (id: string, status: number, tmid?: string, message?: IMessage) => { const db = database.active; @@ -232,9 +231,6 @@ export async function sendMessage( } await sendMessageCall(message); - // clear draft message when message is sent and app is in background or closed - // do not affect the user experience when the app is in the foreground because the hook useAutoSaveDraft will handle it - saveDraftMessage({ rid, tmid, draftMessage: '' }); } catch (e) { log(e); } diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 9747f82cb..10d1e14f2 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -985,7 +985,9 @@ class RoomView extends React.Component { const { rid } = this.state.room; const { user } = this.props; sendMessage(rid, message, this.tmid, user, tshow).then(() => { - this.setLastOpen(null); + if (this.mounted) { + this.setLastOpen(null); + } Review.pushPositiveEvent(); }); this.resetAction(); From 77d32f4747d328898c941bfcb5c3d7ae41baa3d9 Mon Sep 17 00:00:00 2001 From: Djorkaeff Alexandre Date: Fri, 26 Apr 2024 17:33:11 -0300 Subject: [PATCH 2/8] feat: WatchOS app (#5476) --- .detoxrc.js | 4 +- app/lib/methods/helpers/sslPinning.ts | 1 + .../AppIcon.appiconset/1024 1.png | Bin 0 -> 434710 bytes .../AppIcon.appiconset/Contents.json | 6 + .../AppIcon.appiconset/1024 1.png | Bin 0 -> 57100 bytes .../AppIcon.appiconset/Contents.json | 6 + .../ActionHandler/ErrorActionHandler.swift | 39 + ios/RocketChat Watch App/AppRouter.swift | 83 ++ ios/RocketChat Watch App/AppView.swift | 39 + .../Assets.xcassets/Contents.json | 6 + .../channel-private.imageset/Contents.json | 12 + .../channel-private.png | Bin 0 -> 371 bytes .../channel-public.imageset/Contents.json | 12 + .../channel-public.png | Bin 0 -> 259 bytes .../discussions.imageset/Contents.json | 12 + .../discussions.imageset/discussions.png | Bin 0 -> 517 bytes .../message.imageset/Contents.json | 12 + .../message.imageset/message.png | Bin 0 -> 479 bytes .../teams-private.imageset/Contents.json | 12 + .../teams-private.imageset/teams-private.png | Bin 0 -> 509 bytes .../teams.imageset/Contents.json | 12 + .../Assets.xcassets/teams.imageset/teams.png | Bin 0 -> 512 bytes .../Client/Adapters/JSONAdapter.swift | 10 + .../Client/Adapters/RequestAdapter.swift | 12 + .../Client/Adapters/TokenAdapter.swift | 25 + .../Client/DateCodingStrategy.swift | 44 + .../Client/Extensions/Data+Extensions.swift | 9 + .../Client/Extensions/String+Extensions.swift | 6 + .../Client/Extensions/URL+Extensions.swift | 15 + .../Client/FailableDecodable.swift | 13 + .../Client/HTTP/HTTPMethod.swift | 4 + .../Client/HTTP/Request.swift | 24 + .../Client/Requests/HistoryRequest.swift | 46 + .../Client/Requests/MessagesRequest.swift | 15 + .../Client/Requests/ReadRequest.swift | 20 + .../Client/Requests/RoomsRequest.swift | 16 + .../Client/Requests/SendMessageRequest.swift | 29 + .../Requests/SubscriptionsRequest.swift | 16 + .../Client/Responses/AttachmentResponse.swift | 22 + .../Client/Responses/HistoryResponse.swift | 6 + .../Client/Responses/MessageResponse.swift | 15 + .../Client/Responses/MessagesResponse.swift | 11 + .../Client/Responses/ReadResponse.swift | 5 + .../Client/Responses/RoomsResponse.swift | 26 + .../Responses/SendMessageResponse.swift | 6 + .../Responses/SubscriptionsResponse.swift | 29 + .../Client/Responses/UserResponse.swift | 7 + .../Client/RocketChatClient.swift | 107 ++ .../Client/RocketChatError.swift | 15 + .../URLSessionCertificateHandling.swift | 95 ++ .../Database/Database.swift | 132 ++ .../Default.xcdatamodel/contents | 21 + .../Database/Entity/Attachment.swift | 7 + .../Database/Entity/LoggedUser.swift | 48 + .../Database/Entity/Room.swift | 36 + .../Database/Entity/Server.swift | 78 ++ .../Database/Model/AttachmentModel.swift | 42 + .../Database/Model/MessageModel.swift | 62 + .../Database/Model/RoomModel.swift | 89 ++ .../Database/Model/UserModel.swift | 37 + .../RocketChat.xcdatamodel/contents | 78 ++ .../Database/RocketChatDatabase.swift | 316 +++++ .../DependencyInjection/Dependency.swift | 21 + .../DependencyInjection/Store.swift | 41 + .../ExtensionDelegate.swift | 43 + .../Extensions/Binding+Extensions.swift | 24 + .../Extensions/Color+Extensions.swift | 27 + .../Extensions/Date+Extensions.swift | 7 + .../ToolbarItemPlacement+Extensions.swift | 11 + .../Formatters/Mapper/MessageInfoMapper.swift | 165 +++ .../Formatters/MessageFormatter.swift | 88 ++ .../Formatters/RoomFormatter.swift | 42 + .../Loaders/CancelBag.swift | 10 + .../Loaders/ImageLoader.swift | 33 + .../Loaders/Merge/MergedRoom.swift | 60 + .../Loaders/Merge/MergedRoomMapper.swift | 58 + .../Loaders/Merge/MessageMapper.swift | 48 + .../Loaders/MessageSender.swift | 88 ++ .../Loaders/MessagesLoader.swift | 109 ++ .../Loaders/RoomsLoader.swift | 118 ++ .../Loaders/ServersLoader.swift | 58 + .../Loaders/WatchSession.swift | 98 ++ .../Localizable.xcstrings | 1126 ++++++++++++++++ .../Preview Assets.xcassets/Contents.json | 6 + ios/RocketChat Watch App/RocketChatApp.swift | 23 + ios/RocketChat Watch App/Storage.swift | 32 + .../ViewModels/MessageViewModel.swift | 49 + .../ViewModels/RoomViewModel.swift | 114 ++ .../Views/AttachmentView.swift | 33 + .../Views/ChatScrollView.swift | 28 + ios/RocketChat Watch App/Views/LazyView.swift | 13 + .../Views/LoggedInView.swift | 20 + .../Views/MessageActionView.swift | 34 + .../Views/MessageComposerView.swift | 34 + .../Views/MessageListView.swift | 125 ++ .../Views/MessageView.swift | 139 ++ .../Views/NavigationStackModifier.swift | 30 + .../Views/RemoteImage.swift | 27 + .../Views/RetryView.swift | 20 + .../Views/RoomInfoView.swift | 25 + .../Views/RoomListView.swift | 63 + ios/RocketChat Watch App/Views/RoomView.swift | 48 + .../Views/ServerListView.swift | 116 ++ .../Views/ServerView.swift | 16 + ios/RocketChatRN.xcodeproj/project.pbxproj | 1184 ++++++++++++++++- .../xcschemes/RocketChat Watch.xcscheme | 91 ++ .../xcschemes/RocketChatRN Watch.xcscheme | 77 ++ ios/RocketChatRN/AppDelegate.h | 2 + ios/RocketChatRN/AppDelegate.mm | 4 + ios/SSLPinning/SSLPinning.m | 3 + ios/SSLPinning/SSLPinning.swift | 53 + ios/Shared/Extensions/Bundle+Extensions.swift | 15 + .../Extensions/FileManager+Extensions.swift | 13 + .../Extensions/WatermelonDB+Extensions.swift | 33 + ios/Shared/RocketChat/ClientSSL.swift | 29 + ios/Shared/RocketChat/Database.swift | 94 +- ios/Shared/RocketChat/MMKV.swift | 40 + ios/Shared/RocketChat/Storage.swift | 72 +- ios/Watch/Database/DBServer.swift | 21 + ios/Watch/Database/DBUser.swift | 6 + ios/Watch/WatchConnection.swift | 92 ++ ios/Watch/WatchMessage.swift | 27 + ios/fastlane/Fastfile | 10 +- patches/@nozbe+watermelondb+0.23.0.patch | 12 + 124 files changed, 6880 insertions(+), 118 deletions(-) create mode 100644 ios/Experimental.xcassets/AppIcon.appiconset/1024 1.png create mode 100644 ios/Official.xcassets/AppIcon.appiconset/1024 1.png create mode 100644 ios/RocketChat Watch App/ActionHandler/ErrorActionHandler.swift create mode 100644 ios/RocketChat Watch App/AppRouter.swift create mode 100644 ios/RocketChat Watch App/AppView.swift create mode 100644 ios/RocketChat Watch App/Assets.xcassets/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/channel-private.imageset/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/channel-private.imageset/channel-private.png create mode 100644 ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/channel-public.png create mode 100644 ios/RocketChat Watch App/Assets.xcassets/discussions.imageset/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/discussions.imageset/discussions.png create mode 100644 ios/RocketChat Watch App/Assets.xcassets/message.imageset/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/message.imageset/message.png create mode 100644 ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/teams-private.png create mode 100644 ios/RocketChat Watch App/Assets.xcassets/teams.imageset/Contents.json create mode 100644 ios/RocketChat Watch App/Assets.xcassets/teams.imageset/teams.png create mode 100644 ios/RocketChat Watch App/Client/Adapters/JSONAdapter.swift create mode 100644 ios/RocketChat Watch App/Client/Adapters/RequestAdapter.swift create mode 100644 ios/RocketChat Watch App/Client/Adapters/TokenAdapter.swift create mode 100644 ios/RocketChat Watch App/Client/DateCodingStrategy.swift create mode 100644 ios/RocketChat Watch App/Client/Extensions/Data+Extensions.swift create mode 100644 ios/RocketChat Watch App/Client/Extensions/String+Extensions.swift create mode 100644 ios/RocketChat Watch App/Client/Extensions/URL+Extensions.swift create mode 100644 ios/RocketChat Watch App/Client/FailableDecodable.swift create mode 100644 ios/RocketChat Watch App/Client/HTTP/HTTPMethod.swift create mode 100644 ios/RocketChat Watch App/Client/HTTP/Request.swift create mode 100644 ios/RocketChat Watch App/Client/Requests/HistoryRequest.swift create mode 100644 ios/RocketChat Watch App/Client/Requests/MessagesRequest.swift create mode 100644 ios/RocketChat Watch App/Client/Requests/ReadRequest.swift create mode 100644 ios/RocketChat Watch App/Client/Requests/RoomsRequest.swift create mode 100644 ios/RocketChat Watch App/Client/Requests/SendMessageRequest.swift create mode 100644 ios/RocketChat Watch App/Client/Requests/SubscriptionsRequest.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/HistoryResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/MessageResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/MessagesResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/ReadResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/RoomsResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/SendMessageResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/SubscriptionsResponse.swift create mode 100644 ios/RocketChat Watch App/Client/Responses/UserResponse.swift create mode 100644 ios/RocketChat Watch App/Client/RocketChatClient.swift create mode 100644 ios/RocketChat Watch App/Client/RocketChatError.swift create mode 100644 ios/RocketChat Watch App/Client/URLSessionCertificateHandling.swift create mode 100644 ios/RocketChat Watch App/Database/Database.swift create mode 100644 ios/RocketChat Watch App/Database/Default.xcdatamodeld/Default.xcdatamodel/contents create mode 100644 ios/RocketChat Watch App/Database/Entity/Attachment.swift create mode 100644 ios/RocketChat Watch App/Database/Entity/LoggedUser.swift create mode 100644 ios/RocketChat Watch App/Database/Entity/Room.swift create mode 100644 ios/RocketChat Watch App/Database/Entity/Server.swift create mode 100644 ios/RocketChat Watch App/Database/Model/AttachmentModel.swift create mode 100644 ios/RocketChat Watch App/Database/Model/MessageModel.swift create mode 100644 ios/RocketChat Watch App/Database/Model/RoomModel.swift create mode 100644 ios/RocketChat Watch App/Database/Model/UserModel.swift create mode 100644 ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents create mode 100644 ios/RocketChat Watch App/Database/RocketChatDatabase.swift create mode 100644 ios/RocketChat Watch App/DependencyInjection/Dependency.swift create mode 100644 ios/RocketChat Watch App/DependencyInjection/Store.swift create mode 100644 ios/RocketChat Watch App/ExtensionDelegate.swift create mode 100644 ios/RocketChat Watch App/Extensions/Binding+Extensions.swift create mode 100644 ios/RocketChat Watch App/Extensions/Color+Extensions.swift create mode 100644 ios/RocketChat Watch App/Extensions/Date+Extensions.swift create mode 100644 ios/RocketChat Watch App/Extensions/ToolbarItemPlacement+Extensions.swift create mode 100644 ios/RocketChat Watch App/Formatters/Mapper/MessageInfoMapper.swift create mode 100644 ios/RocketChat Watch App/Formatters/MessageFormatter.swift create mode 100644 ios/RocketChat Watch App/Formatters/RoomFormatter.swift create mode 100644 ios/RocketChat Watch App/Loaders/CancelBag.swift create mode 100644 ios/RocketChat Watch App/Loaders/ImageLoader.swift create mode 100644 ios/RocketChat Watch App/Loaders/Merge/MergedRoom.swift create mode 100644 ios/RocketChat Watch App/Loaders/Merge/MergedRoomMapper.swift create mode 100644 ios/RocketChat Watch App/Loaders/Merge/MessageMapper.swift create mode 100644 ios/RocketChat Watch App/Loaders/MessageSender.swift create mode 100644 ios/RocketChat Watch App/Loaders/MessagesLoader.swift create mode 100644 ios/RocketChat Watch App/Loaders/RoomsLoader.swift create mode 100644 ios/RocketChat Watch App/Loaders/ServersLoader.swift create mode 100644 ios/RocketChat Watch App/Loaders/WatchSession.swift create mode 100644 ios/RocketChat Watch App/Localizable.xcstrings create mode 100644 ios/RocketChat Watch App/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 ios/RocketChat Watch App/RocketChatApp.swift create mode 100644 ios/RocketChat Watch App/Storage.swift create mode 100644 ios/RocketChat Watch App/ViewModels/MessageViewModel.swift create mode 100644 ios/RocketChat Watch App/ViewModels/RoomViewModel.swift create mode 100644 ios/RocketChat Watch App/Views/AttachmentView.swift create mode 100644 ios/RocketChat Watch App/Views/ChatScrollView.swift create mode 100644 ios/RocketChat Watch App/Views/LazyView.swift create mode 100644 ios/RocketChat Watch App/Views/LoggedInView.swift create mode 100644 ios/RocketChat Watch App/Views/MessageActionView.swift create mode 100644 ios/RocketChat Watch App/Views/MessageComposerView.swift create mode 100644 ios/RocketChat Watch App/Views/MessageListView.swift create mode 100644 ios/RocketChat Watch App/Views/MessageView.swift create mode 100644 ios/RocketChat Watch App/Views/NavigationStackModifier.swift create mode 100644 ios/RocketChat Watch App/Views/RemoteImage.swift create mode 100644 ios/RocketChat Watch App/Views/RetryView.swift create mode 100644 ios/RocketChat Watch App/Views/RoomInfoView.swift create mode 100644 ios/RocketChat Watch App/Views/RoomListView.swift create mode 100644 ios/RocketChat Watch App/Views/RoomView.swift create mode 100644 ios/RocketChat Watch App/Views/ServerListView.swift create mode 100644 ios/RocketChat Watch App/Views/ServerView.swift create mode 100644 ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChat Watch.xcscheme create mode 100644 ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChatRN Watch.xcscheme create mode 100644 ios/SSLPinning/SSLPinning.m create mode 100644 ios/SSLPinning/SSLPinning.swift create mode 100644 ios/Shared/Extensions/Bundle+Extensions.swift create mode 100644 ios/Shared/Extensions/FileManager+Extensions.swift create mode 100644 ios/Shared/Extensions/WatermelonDB+Extensions.swift create mode 100644 ios/Shared/RocketChat/ClientSSL.swift create mode 100644 ios/Shared/RocketChat/MMKV.swift create mode 100644 ios/Watch/Database/DBServer.swift create mode 100644 ios/Watch/Database/DBUser.swift create mode 100644 ios/Watch/WatchConnection.swift create mode 100644 ios/Watch/WatchMessage.swift diff --git a/.detoxrc.js b/.detoxrc.js index a899f6a35..e10173160 100644 --- a/.detoxrc.js +++ b/.detoxrc.js @@ -19,13 +19,13 @@ module.exports = { type: 'ios.app', binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/Rocket.Chat Experimental.app', build: - 'xcodebuild -workspace ios/RocketChatRN.xcworkspace -scheme RocketChatRN -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build' + 'xcodebuild -workspace ios/RocketChatRN.xcworkspace -scheme RocketChatRN -configuration Debug -destination \'generic/platform=iphonesimulator\' -derivedDataPath ios/build' }, 'ios.release': { type: 'ios.app', binaryPath: 'ios/build/Build/Products/Release-iphonesimulator/Rocket.Chat Experimental.app', build: - 'xcodebuild -workspace ios/RocketChatRN.xcworkspace -scheme RocketChatRN -configuration Release -sdk iphonesimulator -derivedDataPath ios/build' + 'xcodebuild -workspace ios/RocketChatRN.xcworkspace -scheme RocketChatRN -configuration Release -destination \'generic/platform=iphonesimulator\' -derivedDataPath ios/build' }, 'android.debug': { type: 'android.apk', diff --git a/app/lib/methods/helpers/sslPinning.ts b/app/lib/methods/helpers/sslPinning.ts index e82e659ac..abe1ecfa2 100644 --- a/app/lib/methods/helpers/sslPinning.ts +++ b/app/lib/methods/helpers/sslPinning.ts @@ -67,6 +67,7 @@ const RCSSLPinning = Platform.select({ certificate = persistCertificate(name, certificate.password); } UserPreferences.setMap(extractHostname(server), certificate); + SSLPinning?.setCertificate(server, certificate.path, certificate.password); } } }, diff --git a/ios/Experimental.xcassets/AppIcon.appiconset/1024 1.png b/ios/Experimental.xcassets/AppIcon.appiconset/1024 1.png new file mode 100644 index 0000000000000000000000000000000000000000..f551e843fde3e20dbd3e6023ab8a2d3b9e1f2e47 GIT binary patch literal 434710 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⪚NaQVF18TlIT4~XF4H@=mhPQqg5^%2cbKQrYF4cg$g#y ze|t0&e#c+iavI#5ZCsPYK^kNCrayk|dIy#C>iW(t-Fx`D5+Ll0!lP)vcx6`zhu42> z-BvSiH~YD|A5X{BVd(Ez*J^U4+GHAzH;6>(QA$lNGATHZ4`8n{q0h#^`7w9$N*3Qh z(iA@+37hBeeLEob6LFS82KV{~je6;lqFvU34lK}h+1?sN;CZ!Z8`NG5*er%*@IMCv zgT*c*Adi(WZ~?y|53s=kDW^m!Pa3{Hah)RNg@%&S??#~evuV29R4e2;4fDtOKVzu+ z-{I+)lbmg_j`C>%-L{)>IQG@XXjoN)lo42Vyp(`ijqr=p>GDgtqU=-!GfnVyd2wQY zzqZ8<+~K5Fx}(kCQUdQk9P#%JXX~K)$V`q8K8hXz*Ng&;oR|DL$JZ+(Ugm(O=Q?6R zuf24F8-H!zrwkYZ+mT?p$}d$G$+3omh9YBx;W%M>b_ge(^_gX0YzsgjlAv7vZk*%*GUo34J#8$onZY1x-Nn@CQ^wrF=P zF9=P6Vbk0YejdZdRT9hI)V7&RV_h60hqi4~AxY~UPSiZ=>rAiurPWUi7F*Euy^Yu*PX@DuTEc8%uSy39Px_KdzY2a5s}k^Fo+- zvLe*mLS!yI3ujD3XAKp0cxDTh#&e{^xlkM=G&ESb-7?HR{O`l*@#e|g3s|^<|1E+f zr5Wa|;fNJe!jNrzvpaPPP*)t9TpL&wmb8{eCQm1r=ol{hgSA#51cQnkFT<2-uDXh z6!$75@Lb;ssW@@o5otLU#-7SgDV2x9kjgj)Jhe@5f5|1J;;&1Jdxxb~Nh8sHQ5M032Be52#u_4o!ik4c^51EM zi%yXYq_EeX@THkpOqFzp&g71|{B}T7;^CNzqLZ8(Ac2^89Xa~wOZ)Br@n+Qdxtby9 z4Aol}PVA%o5BQz;KTklbYn>e_5VJ#;-%W}ys+gvBk2pdA)WsTKm*0*0i$Vip8V12v z)mfdNOQ_h(6dcKQNf-lRY2-^Pfj`r7z10qx8V%z&4Mb1TNsu8>rP^iNs0`M7u!I3D zMT!G9@P1d6B_*(#PXKt>J_WH3K%q7y;Jf&D4s|hrg3PlLyiPkDg~^?pL%l?}sNC>b zkEHcAQ?4b5fX*3ZxT=VZ?EFh88Ilz$i_+B9GLN!d=v>3Tfg?F(t%z-qaUd$Di~5NWk^(rSbK1GNS&IaJWnQDImYP{dSLn=F*+vYp` zWH!C8obWYC^M_LE7$q2`3Orw14zqW`oZTj} zXzMw77AgFPc~|;{7#cOPHmqRtLt=9DP&gCo0eM>IhuMAMz*K$lu&OnS!n-1Q&UP7c zU2L;bhMwHk@PSq6(Nw#5EDEb#(j-`J#*Gvc*|odrVDqt%zi*a95Cizp6!78Xyi|6du*u_V@?cCHke;EVd)@V%cl)PnTE0PHne&!Y_;0 zzCEBg5ZU&tOZg0N{|Y3!PaH0-^1&sL&)ZRP_37b#KV$E~wDoYrJ;UV16YyM~O+To( zBdY5pkyab7Fuhux#EPo37Jgb>t0OdrzV;H73ftY)fz@L@Ak(I4XrqLVj!Q-1O=}Y) zg`9>m3ru*coJCbZNt@FwZe3zh@YYo!=FeG*cV0J1BoVEYfV>PAYGA`cVjD2#~;#{3p3|0iZh;Fy6$B^cSbN;c!E z{t8;hY*mGeCYsF7Z**6FUZ8XSfFtnB_#?

E~_O0(-}Q=4Z`m9-t4mvHfNTzo%1T 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 z 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 z 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 P00000NkvXXu0mjfy7hgt literal 0 HcmV?d00001 diff --git a/ios/Experimental.xcassets/AppIcon.appiconset/Contents.json b/ios/Experimental.xcassets/AppIcon.appiconset/Contents.json index 4fdf88263..cdcbf4fd0 100644 --- a/ios/Experimental.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Experimental.xcassets/AppIcon.appiconset/Contents.json @@ -149,6 +149,12 @@ "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" + }, + { + "filename" : "1024 1.png", + "idiom" : "universal", + "platform" : "watchos", + "size" : "1024x1024" } ], "info" : { diff --git a/ios/Official.xcassets/AppIcon.appiconset/1024 1.png b/ios/Official.xcassets/AppIcon.appiconset/1024 1.png new file mode 100644 index 0000000000000000000000000000000000000000..e737a61ea6f4767936172c3271ff4aa0e125305c GIT binary patch literal 57100 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 Pz`sk%+DdN~%zghKA>Z() literal 0 HcmV?d00001 diff --git a/ios/Official.xcassets/AppIcon.appiconset/Contents.json b/ios/Official.xcassets/AppIcon.appiconset/Contents.json index 4fdf88263..cdcbf4fd0 100644 --- a/ios/Official.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Official.xcassets/AppIcon.appiconset/Contents.json @@ -149,6 +149,12 @@ "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" + }, + { + "filename" : "1024 1.png", + "idiom" : "universal", + "platform" : "watchos", + "size" : "1024x1024" } ], "info" : { diff --git a/ios/RocketChat Watch App/ActionHandler/ErrorActionHandler.swift b/ios/RocketChat Watch App/ActionHandler/ErrorActionHandler.swift new file mode 100644 index 000000000..5a2a7984b --- /dev/null +++ b/ios/RocketChat Watch App/ActionHandler/ErrorActionHandler.swift @@ -0,0 +1,39 @@ +import Foundation + +protocol ErrorActionHandling { + func handle(error: RocketChatError) +} + +final class ErrorActionHandler { + @Dependency private var database: Database + @Dependency private var serversDB: ServersDatabase + @Dependency private var router: AppRouting + + private let server: Server + + init(server: Server) { + self.server = server + } + + private func handleOnMain(error: RocketChatError) { + switch error { + case .server(let response): + router.present(error: response) + case .unauthorized: + router.route(to: [.loading, .serverList]) { + self.database.remove() + self.serversDB.remove(self.server) + } + case .unknown: + print("Unexpected error on Client.") + } + } +} + +extension ErrorActionHandler: ErrorActionHandling { + func handle(error: RocketChatError) { + DispatchQueue.main.async { + self.handleOnMain(error: error) + } + } +} diff --git a/ios/RocketChat Watch App/AppRouter.swift b/ios/RocketChat Watch App/AppRouter.swift new file mode 100644 index 000000000..8abf1d8e1 --- /dev/null +++ b/ios/RocketChat Watch App/AppRouter.swift @@ -0,0 +1,83 @@ +import Foundation + +protocol AppRouting { + func route(to route: Route) + func present(error: ErrorResponse) + func route(to routes: [Route], completion: (() -> Void)?) +} + +final class AppRouter: ObservableObject { + @Published var error: ErrorResponse? + + @Published var server: Server? { + didSet { + if server != oldValue, let server { + registerDependencies(in: server) + } + } + } + + @Published var room: Room? + + @Storage(.currentServer) private var currentURL: URL? + + private func registerDependencies(in server: Server) { + Store.register(Database.self, factory: server.database) + Store.register(RocketChatClientProtocol.self, factory: RocketChatClient(server: server)) + Store.register(MessageSending.self, factory: MessageSender(server: server)) + Store.register(ErrorActionHandling.self, factory: ErrorActionHandler(server: server)) + Store.register(MessagesLoading.self, factory: MessagesLoader()) + Store.register(RoomsLoader.self, factory: RoomsLoader(server: server)) + } +} + +extension AppRouter: AppRouting { + func route(to route: Route) { + switch route { + case .roomList(let selectedServer): + currentURL = selectedServer.url + room = nil + server = selectedServer + case .room(let selectedServer, let selectedRoom): + currentURL = selectedServer.url + server = selectedServer + room = selectedRoom + case .serverList: + currentURL = nil + room = nil + server = nil + case .loading: + room = nil + server = nil + } + } + + func present(error: ErrorResponse) { + guard self.error == nil else { + return + } + + self.error = error + } +} + +extension AppRouter { + func route(to routes: [Route], completion: (() -> Void)? = nil) { + guard let routeTo = routes.first else { + completion?() + return + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.route(to: routeTo) + self.route(to: Array(routes[1..Px$ElET{R9HvtmP-zTFcd{!%fiI{Fp)Tsm>`M4iNOi`0T%`}E#J^Dr6vub<9<%> zyZ5ySJQ&CW2G}n|biIerG$|ky0wFaZ^ev10AyeH*i6~C!1}R{CF5k~uSHdVxh+s}8 z16cL-Lv+g{t^wMrN|+@|zwjp#WS zy&db?_7caS#cP$=8qxh2^H4%%_t`V8|7}kXnRf1Qrctx9&ZFVN1H!9v`~d#~G%)|0 RF!ule002ovPDHLkV1lGcoVNe~ literal 0 HcmV?d00001 diff --git a/ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/Contents.json b/ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/Contents.json new file mode 100644 index 000000000..6b5b77ce3 --- /dev/null +++ b/ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "channel-public.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/channel-public.png b/ios/RocketChat Watch App/Assets.xcassets/channel-public.imageset/channel-public.png new file mode 100644 index 0000000000000000000000000000000000000000..a99eda5845063d5f6d230c31d57de3f15df47970 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dp%toLn7SY zPIKfsWFX-B|4CBs_mitiLRmzYXus6@ZWy;_@luT?E8nv4lp1c9Gnzkt=6U5eF}Ge9N`m``EgYsiFJ*?!YtGe{l$WS=I2rc-&; zn-cgGs@9|(cY9ycK1sEt^t9^Xliy=aiai~6J>6e)V1|KxvaNHegKPl%C51~G^IoXy z^*%Be<}&b}xTc5sa^}5wk-ff0CHE$&>3Di9(gPx$zez+vR9Hvtmd$R$Fbv0?@?ezr>1Ak_p-E5)vCG6ReIL39gG~9dQrAwra_EJe zN=f6N|8{H}Sb3S1?ZXRTkpkWOXA6%<3)XJIm=?om?dYF3n|}B{hv&-rH$b;PoB-fh zI~W{{0z?fEy}o6JduW<5_tfuk>wZ6G%Jjqa;-J~30wBhV2PP{-De)T}z}v?ydZaSW zK@8UmYpV*7doLYQ%7;t|7QPOUytj57e!h0qBq+aIiZw+x{0 zu~v;PsmM4{Q~=|@P<~9trvU`{Gz!#`m{lMqj*Ho;6h9R}s+@v~GJv&Pm-Pt%7A9dS z{?36J0A8C&On+;<#@L6Z70S2ZfD8bDg#%T{-f2Nl0rvqDhB*L}v6H&4>~c9E?Vx!* zP$}RJo3-Hx;tPz>`*CgvG@*qP73KgbZbH_I^FSI#d}d`s$~0E97B1ZaUpl44ne_d# zLGLjb^DE5+vI2oz-F^|O5E3qNCjd0rYTYjttf8DPx$nMp)JR9HvtmceeqFbsy1_Q6)(rx(yJph-{(!DV8Xz7O4lK}OsrB*BRt%9IPa zpo%vB;y<>3DGD!HIKFrTurttpel_BHZG=)EAe)p8{3rV#_pIlLZAUJC?9chy4JVhnHLjm02 z{pmo;6do}LA_kyf)2dqJUMd5_g?Iq4r&ns|e~t@E!_@yyCZked0JBf;Lba<6>=%>L z1F&g(!Rf6O_cBJa-~%kzXJ{}pv`<{fG5}DTT82ng(F{COda=t$$?5|T7v`CYC=Wo~ ztN+hHRv8i{lPdw0ewgY((=el#93mW;mQmL6PRJamL@OSC8XkB-(5n@0+i#C$@ zelnOdEVl!j`f1EjVKk~z{$d`H1>lvcfw9+kvghV`3T7TDW10<+cXaygH$d?W`~faj V8ZeuQI;#Kx002ovPDHLkV1ga=%Gv+` literal 0 HcmV?d00001 diff --git a/ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/Contents.json b/ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/Contents.json new file mode 100644 index 000000000..1345936f0 --- /dev/null +++ b/ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "teams-private.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/teams-private.png b/ios/RocketChat Watch App/Assets.xcassets/teams-private.imageset/teams-private.png new file mode 100644 index 0000000000000000000000000000000000000000..0374c85fa254ef925f816f4a88bf9b61883c27ba GIT binary patch literal 509 zcmVPx$w@E}nR9HvtR>5wHQV~!LeHr{!Rg4dLQqaaf~~D zGyrPMoKfuexa;$&3c%j5hw)1Gdthn_hB{$10DsSO!TmP`_X47K#sG+yQ$M||*^mtY z4Qi)g{7|7#vXV!0V5nY8d>^I23&2Z(B^3Apa%*HThOF1D00000NkvXXu0mjf`r6&< literal 0 HcmV?d00001 diff --git a/ios/RocketChat Watch App/Assets.xcassets/teams.imageset/Contents.json b/ios/RocketChat Watch App/Assets.xcassets/teams.imageset/Contents.json new file mode 100644 index 000000000..c77798bef --- /dev/null +++ b/ios/RocketChat Watch App/Assets.xcassets/teams.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "teams.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/RocketChat Watch App/Assets.xcassets/teams.imageset/teams.png b/ios/RocketChat Watch App/Assets.xcassets/teams.imageset/teams.png new file mode 100644 index 0000000000000000000000000000000000000000..6c19d984d9305527c0d3ff3fba0d75a715b224b9 GIT binary patch literal 512 zcmV+b0{{JqP)Px$x=BPqR9HvtR!wh%FbqxT4;%eITvqL}YSM~Sb(g8T@PEqw7@3^J!FE1K(IhT# zX(2IwetvmItBo(caelP}*cn)4pgWx}s%ggI`#MU&c5ff8nx;0p?qeY?6%Ws|0BmBV zK0{Jt#^LAdi1*#=`$K8nrq(^M2Ls$R#}tSX0OMcKD`Q@KvVOSVE-bk*ju{6=uFtWe z00fr=5GwFN(LGl0tD+ST_nYocXA2(w!>_!j%q%ki6(ZFL$R|(|0InlI7yD~l`3wUd zHP-;I$gOeu6(;!?4OkGMa=50ch2B%@N+Mi}t!hEdj95B`HSdTtkfhJO$ts*yCyy1x z;c(C0*!GoGM}EC5Nf&j39uxtRn)_u8bvcirqj zhm2ZKGN9D}q^QME%FhB)795+^0MN`bBYE+AprqhuHIUk042Hhs{v38wx3~zOAfBm-f9MFie9s42e31+IRk&d$$T)fxa2_q0000 URLRequest { + var request = urlRequest + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + request.addValue("application/json", forHTTPHeaderField: "Accept") + return request + } +} diff --git a/ios/RocketChat Watch App/Client/Adapters/RequestAdapter.swift b/ios/RocketChat Watch App/Client/Adapters/RequestAdapter.swift new file mode 100644 index 000000000..5ceefed87 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Adapters/RequestAdapter.swift @@ -0,0 +1,12 @@ +import Foundation + +protocol RequestAdapter { + func adapt(_ urlRequest: URLRequest) -> URLRequest + func adapt(_ url: URL) -> URL +} + +extension RequestAdapter { + func adapt(_ url: URL) -> URL { + url + } +} diff --git a/ios/RocketChat Watch App/Client/Adapters/TokenAdapter.swift b/ios/RocketChat Watch App/Client/Adapters/TokenAdapter.swift new file mode 100644 index 000000000..e96839766 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Adapters/TokenAdapter.swift @@ -0,0 +1,25 @@ +import Foundation + +struct TokenAdapter: RequestAdapter { + private let server: Server + + init(server: Server) { + self.server = server + } + + func adapt(_ url: URL) -> URL { + url.appending( + queryItems: [ + URLQueryItem(name: "rc_token", value: server.loggedUser.token), + URLQueryItem(name: "rc_uid", value: server.loggedUser.id) + ] + ) + } + + func adapt(_ urlRequest: URLRequest) -> URLRequest { + var request = urlRequest + request.addValue(server.loggedUser.id, forHTTPHeaderField: "x-user-id") + request.addValue(server.loggedUser.token, forHTTPHeaderField: "x-auth-token") + return request + } +} diff --git a/ios/RocketChat Watch App/Client/DateCodingStrategy.swift b/ios/RocketChat Watch App/Client/DateCodingStrategy.swift new file mode 100644 index 000000000..f29e2d320 --- /dev/null +++ b/ios/RocketChat Watch App/Client/DateCodingStrategy.swift @@ -0,0 +1,44 @@ +// https://stackoverflow.com/a/28016692 + +import Foundation + +extension Date.ISO8601FormatStyle { + static let iso8601withFractionalSeconds: Self = .init(includingFractionalSeconds: true) +} + +extension ParseStrategy where Self == Date.ISO8601FormatStyle { + static var iso8601withFractionalSeconds: Date.ISO8601FormatStyle { .iso8601withFractionalSeconds } +} + +extension FormatStyle where Self == Date.ISO8601FormatStyle { + static var iso8601withFractionalSeconds: Date.ISO8601FormatStyle { .iso8601withFractionalSeconds } +} + +extension Date { + init(iso8601withFractionalSeconds parseInput: ParseStrategy.ParseInput) throws { + try self.init(parseInput, strategy: .iso8601withFractionalSeconds) + } + + var iso8601withFractionalSeconds: String { + formatted(.iso8601withFractionalSeconds) + } +} + +extension String { + func iso8601withFractionalSeconds() throws -> Date { + try .init(iso8601withFractionalSeconds: self) + } +} + +extension JSONDecoder.DateDecodingStrategy { + static let iso8601withFractionalSeconds = custom { + try .init(iso8601withFractionalSeconds: $0.singleValueContainer().decode(String.self)) + } +} + +extension JSONEncoder.DateEncodingStrategy { + static let iso8601withFractionalSeconds = custom { + var container = $1.singleValueContainer() + try container.encode($0.iso8601withFractionalSeconds) + } +} diff --git a/ios/RocketChat Watch App/Client/Extensions/Data+Extensions.swift b/ios/RocketChat Watch App/Client/Extensions/Data+Extensions.swift new file mode 100644 index 000000000..517c2e63e --- /dev/null +++ b/ios/RocketChat Watch App/Client/Extensions/Data+Extensions.swift @@ -0,0 +1,9 @@ +import Foundation + +extension Data { + func decode(_ type: T.Type) throws -> T { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601withFractionalSeconds + return try decoder.decode(T.self, from: self) + } +} diff --git a/ios/RocketChat Watch App/Client/Extensions/String+Extensions.swift b/ios/RocketChat Watch App/Client/Extensions/String+Extensions.swift new file mode 100644 index 000000000..342e9edf6 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Extensions/String+Extensions.swift @@ -0,0 +1,6 @@ +extension String { + static func random(_ count: Int) -> String { + let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + return String((0.. Self { + var components = URLComponents(url: self, resolvingAgainstBaseURL: true) + + components?.queryItems = queryItems + + return components?.url ?? self + } + + func appending(path: String) -> Self { + appendingPathComponent(path) + } +} diff --git a/ios/RocketChat Watch App/Client/FailableDecodable.swift b/ios/RocketChat Watch App/Client/FailableDecodable.swift new file mode 100644 index 000000000..c2e07097b --- /dev/null +++ b/ios/RocketChat Watch App/Client/FailableDecodable.swift @@ -0,0 +1,13 @@ +struct FailableDecodable: Codable, Hashable { + let value: Value? + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + value = try? container.decode(Value.self) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(value) + } +} diff --git a/ios/RocketChat Watch App/Client/HTTP/HTTPMethod.swift b/ios/RocketChat Watch App/Client/HTTP/HTTPMethod.swift new file mode 100644 index 000000000..4a62a7c81 --- /dev/null +++ b/ios/RocketChat Watch App/Client/HTTP/HTTPMethod.swift @@ -0,0 +1,4 @@ +enum HTTPMethod: String { + case get = "GET" + case post = "POST" +} diff --git a/ios/RocketChat Watch App/Client/HTTP/Request.swift b/ios/RocketChat Watch App/Client/HTTP/Request.swift new file mode 100644 index 000000000..00e037774 --- /dev/null +++ b/ios/RocketChat Watch App/Client/HTTP/Request.swift @@ -0,0 +1,24 @@ +import Foundation + +protocol Request { + associatedtype Response: Codable + + var path: String { get } + var method: HTTPMethod { get } + var body: Data? { get } + var queryItems: [URLQueryItem] { get } +} + +extension Request { + var method: HTTPMethod { + .get + } + + var body: Data? { + nil + } + + var queryItems: [URLQueryItem] { + [] + } +} diff --git a/ios/RocketChat Watch App/Client/Requests/HistoryRequest.swift b/ios/RocketChat Watch App/Client/Requests/HistoryRequest.swift new file mode 100644 index 000000000..741904e9e --- /dev/null +++ b/ios/RocketChat Watch App/Client/Requests/HistoryRequest.swift @@ -0,0 +1,46 @@ +import Foundation + +let HISTORY_MESSAGE_COUNT = 50 + +struct HistoryRequest: Request { + typealias Response = HistoryResponse + + let path: String + let queryItems: [URLQueryItem] + + init(roomId: String, roomType: String?, latest: Date) { + path = "api/v1/\(RoomType.from(roomType).api).history" + + queryItems = [ + URLQueryItem(name: "roomId", value: roomId), + URLQueryItem(name: "count", value: String(HISTORY_MESSAGE_COUNT)), + URLQueryItem(name: "latest", value: latest.iso8601withFractionalSeconds) + ] + } +} + +fileprivate enum RoomType: String { + case direct = "d" + case group = "p" + case channel = "c" + case livechat = "l" + + static func from(_ rawValue: String?) -> Self { + guard let rawValue, let type = RoomType(rawValue: rawValue) else { + return .channel + } + + return type + } + + var api: String { + switch self { + case .direct: + return "im" + case .group: + return "groups" + case .channel, .livechat: + return "channels" + } + } +} diff --git a/ios/RocketChat Watch App/Client/Requests/MessagesRequest.swift b/ios/RocketChat Watch App/Client/Requests/MessagesRequest.swift new file mode 100644 index 000000000..b6be1b596 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Requests/MessagesRequest.swift @@ -0,0 +1,15 @@ +import Foundation + +struct MessagesRequest: Request { + typealias Response = MessagesResponse + + let path: String = "api/v1/chat.syncMessages" + let queryItems: [URLQueryItem] + + init(lastUpdate: Date?, roomId: String) { + self.queryItems = [ + URLQueryItem(name: "roomId", value: roomId), + URLQueryItem(name: "lastUpdate", value: lastUpdate?.ISO8601Format()) + ] + } +} diff --git a/ios/RocketChat Watch App/Client/Requests/ReadRequest.swift b/ios/RocketChat Watch App/Client/Requests/ReadRequest.swift new file mode 100644 index 000000000..545f985b7 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Requests/ReadRequest.swift @@ -0,0 +1,20 @@ +import Foundation + +struct ReadRequest: Request { + typealias Response = ReadResponse + + let path: String = "api/v1/subscriptions.read" + let method: HTTPMethod = .post + + var body: Data? { + try? JSONSerialization.data(withJSONObject: [ + "rid": rid + ]) + } + + let rid: String + + init(rid: String) { + self.rid = rid + } +} diff --git a/ios/RocketChat Watch App/Client/Requests/RoomsRequest.swift b/ios/RocketChat Watch App/Client/Requests/RoomsRequest.swift new file mode 100644 index 000000000..a06f1e48d --- /dev/null +++ b/ios/RocketChat Watch App/Client/Requests/RoomsRequest.swift @@ -0,0 +1,16 @@ +import Foundation + +struct RoomsRequest: Request { + typealias Response = RoomsResponse + + let path: String = "api/v1/rooms.get" + let queryItems: [URLQueryItem] + + init(updatedSince: Date?) { + if let updatedSince { + queryItems = [URLQueryItem(name: "updatedSince", value: updatedSince.iso8601withFractionalSeconds)] + } else { + queryItems = [] + } + } +} diff --git a/ios/RocketChat Watch App/Client/Requests/SendMessageRequest.swift b/ios/RocketChat Watch App/Client/Requests/SendMessageRequest.swift new file mode 100644 index 000000000..8f5502f04 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Requests/SendMessageRequest.swift @@ -0,0 +1,29 @@ +import Foundation + +struct SendMessageRequest: Request { + typealias Response = SendMessageResponse + + let path: String = "api/v1/chat.sendMessage" + let method: HTTPMethod = .post + + var body: Data? { + try? JSONSerialization.data(withJSONObject: [ + "message": [ + "_id": id, + "rid": rid, + "msg": msg, + "tshow": false + ] + ]) + } + + let id: String + let rid: String + let msg: String + + init(id: String, rid: String, msg: String) { + self.id = id + self.rid = rid + self.msg = msg + } +} diff --git a/ios/RocketChat Watch App/Client/Requests/SubscriptionsRequest.swift b/ios/RocketChat Watch App/Client/Requests/SubscriptionsRequest.swift new file mode 100644 index 000000000..0b788b30d --- /dev/null +++ b/ios/RocketChat Watch App/Client/Requests/SubscriptionsRequest.swift @@ -0,0 +1,16 @@ +import Foundation + +struct SubscriptionsRequest: Request { + typealias Response = SubscriptionsResponse + + let path: String = "api/v1/subscriptions.get" + let queryItems: [URLQueryItem] + + init(updatedSince: Date?) { + if let updatedSince { + queryItems = [URLQueryItem(name: "updatedSince", value: updatedSince.iso8601withFractionalSeconds)] + } else { + queryItems = [] + } + } +} diff --git a/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift b/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift new file mode 100644 index 000000000..6be4fe708 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/AttachmentResponse.swift @@ -0,0 +1,22 @@ +import Foundation + +struct AttachmentResponse: Codable, Hashable { + let title: String? + let imageURL: URL? + let audioURL: URL? + let description: String? + let dimensions: DimensionsResponse? + + enum CodingKeys: String, CodingKey { + case imageURL = "image_url" + case audioURL = "audio_url" + case title + case description + case dimensions = "image_dimensions" + } +} + +struct DimensionsResponse: Codable, Hashable { + let width: Double + let height: Double +} diff --git a/ios/RocketChat Watch App/Client/Responses/HistoryResponse.swift b/ios/RocketChat Watch App/Client/Responses/HistoryResponse.swift new file mode 100644 index 000000000..a4ef7211f --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/HistoryResponse.swift @@ -0,0 +1,6 @@ +import Foundation + +struct HistoryResponse: Codable { + let messages: [MessageResponse] + let success: Bool +} diff --git a/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift b/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift new file mode 100644 index 000000000..2ea253284 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/MessageResponse.swift @@ -0,0 +1,15 @@ +import Foundation + +struct MessageResponse: Codable, Hashable { + let _id: String + let rid: String + let msg: String + let u: UserResponse + let ts: Date + let attachments: [AttachmentResponse]? + let t: String? + let groupable: Bool? + let editedAt: Date? + let role: String? + let comment: String? +} diff --git a/ios/RocketChat Watch App/Client/Responses/MessagesResponse.swift b/ios/RocketChat Watch App/Client/Responses/MessagesResponse.swift new file mode 100644 index 000000000..696f360b4 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/MessagesResponse.swift @@ -0,0 +1,11 @@ +import Foundation + +struct MessagesResponse: Codable { + let result: MessagesResult + let success: Bool + + struct MessagesResult: Codable { + let updated: [MessageResponse] + let deleted: [MessageResponse] + } +} diff --git a/ios/RocketChat Watch App/Client/Responses/ReadResponse.swift b/ios/RocketChat Watch App/Client/Responses/ReadResponse.swift new file mode 100644 index 000000000..57eccc7ea --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/ReadResponse.swift @@ -0,0 +1,5 @@ +import Foundation + +struct ReadResponse: Codable { + +} diff --git a/ios/RocketChat Watch App/Client/Responses/RoomsResponse.swift b/ios/RocketChat Watch App/Client/Responses/RoomsResponse.swift new file mode 100644 index 000000000..a03692b13 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/RoomsResponse.swift @@ -0,0 +1,26 @@ +import Foundation + +struct RoomsResponse: Codable { + let update: Set + let remove: Set + let success: Bool + + struct Room: Codable, Hashable { + let _id: String + let name: String? + let fname: String? + let prid: String? + let t: String? + let ts: Date? + let ro: Bool? + let _updatedAt: Date? + let encrypted: Bool? + let usernames: [String]? + let uids: [String]? + let lastMessage: FailableDecodable? + let lm: Date? + let teamMain: Bool? + let archived: Bool? + let broadcast: Bool? + } +} diff --git a/ios/RocketChat Watch App/Client/Responses/SendMessageResponse.swift b/ios/RocketChat Watch App/Client/Responses/SendMessageResponse.swift new file mode 100644 index 000000000..5ecf7aca4 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/SendMessageResponse.swift @@ -0,0 +1,6 @@ +import Foundation + +struct SendMessageResponse: Codable { + let message: MessageResponse + let success: Bool +} diff --git a/ios/RocketChat Watch App/Client/Responses/SubscriptionsResponse.swift b/ios/RocketChat Watch App/Client/Responses/SubscriptionsResponse.swift new file mode 100644 index 000000000..e86c99448 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/SubscriptionsResponse.swift @@ -0,0 +1,29 @@ +import Foundation + +struct SubscriptionsResponse: Codable { + let update: Set + let remove: Set + let success: Bool + + struct Subscription: Codable, Hashable { + let _id: String + let rid: String + let name: String? + let fname: String? + let t: String + let unread: Int + let alert: Bool + let lr: Date? + let open: Bool? + let _updatedAt: Date? + let hideUnreadStatus: Bool? + } +} + +extension Sequence where Element == SubscriptionsResponse.Subscription { + func find(withRoomID rid: String) -> SubscriptionsResponse.Subscription? { + first { subscription in + subscription.rid == rid + } + } +} diff --git a/ios/RocketChat Watch App/Client/Responses/UserResponse.swift b/ios/RocketChat Watch App/Client/Responses/UserResponse.swift new file mode 100644 index 000000000..981ea2111 --- /dev/null +++ b/ios/RocketChat Watch App/Client/Responses/UserResponse.swift @@ -0,0 +1,7 @@ +import Foundation + +struct UserResponse: Codable, Hashable { + let _id: String + let username: String + let name: String? +} diff --git a/ios/RocketChat Watch App/Client/RocketChatClient.swift b/ios/RocketChat Watch App/Client/RocketChatClient.swift new file mode 100644 index 000000000..574c31c42 --- /dev/null +++ b/ios/RocketChat Watch App/Client/RocketChatClient.swift @@ -0,0 +1,107 @@ +import Combine +import Foundation + +protocol RocketChatClientProtocol { + var session: URLSession { get } + + func authorizedURL(url: URL) -> URL + func getRooms(updatedSince: Date?) -> AnyPublisher + func getSubscriptions(updatedSince: Date?) -> AnyPublisher + func getHistory(rid: String, t: String, latest: Date) -> AnyPublisher + func syncMessages(rid: String, updatedSince: Date) -> AnyPublisher + func sendMessage(id: String, rid: String, msg: String) -> AnyPublisher + func sendRead(rid: String) -> AnyPublisher +} + +final class RocketChatClient: NSObject { + @Dependency private var errorActionHandler: ErrorActionHandling + + private let server: Server + + init(server: Server) { + self.server = server + } + + lazy var session = URLSession( + configuration: .default, + delegate: URLSesionClientCertificateHandling( + certificate: server.certificate, + password: server.password + ), + delegateQueue: nil + ) + + private var adapters: [RequestAdapter] { + [ + TokenAdapter(server: server), + JSONAdapter() + ] + } + + private func dataTask(for request: T) -> AnyPublisher { + let url = server.url.appending(path: request.path).appending(queryItems: request.queryItems) + + var urlRequest = adapters.reduce(URLRequest(url: url), { $1.adapt($0) }) + urlRequest.httpMethod = request.method.rawValue + urlRequest.httpBody = request.body + + return session.dataTaskPublisher(for: urlRequest) + .tryMap { data, response in + if let response = response as? HTTPURLResponse, response.statusCode == 401 { + throw RocketChatError.unauthorized + } + + if let response = try? data.decode(T.Response.self) { + return response + } + + let response = try data.decode(ErrorResponse.self) + throw RocketChatError.server(response: response) + } + .mapError { [weak self] error in + guard let error = error as? RocketChatError else { + return .unknown + } + + self?.errorActionHandler.handle(error: error) + return error + } + .eraseToAnyPublisher() + } +} + +extension RocketChatClient: RocketChatClientProtocol { + func authorizedURL(url: URL) -> URL { + adapters.reduce(server.url.appending(path: url.relativePath), { $1.adapt($0) }) + } + + func getRooms(updatedSince: Date?) -> AnyPublisher { + let request = RoomsRequest(updatedSince: updatedSince) + return dataTask(for: request) + } + + func getSubscriptions(updatedSince: Date?) -> AnyPublisher { + let request = SubscriptionsRequest(updatedSince: updatedSince) + return dataTask(for: request) + } + + func getHistory(rid: String, t: String, latest: Date) -> AnyPublisher { + let request = HistoryRequest(roomId: rid, roomType: t, latest: latest) + return dataTask(for: request) + } + + func syncMessages(rid: String, updatedSince: Date) -> AnyPublisher { + let request = MessagesRequest(lastUpdate: updatedSince, roomId: rid) + return dataTask(for: request) + } + + func sendMessage(id: String, rid: String, msg: String) -> AnyPublisher { + let request = SendMessageRequest(id: id, rid: rid, msg: msg) + return dataTask(for: request) + } + + func sendRead(rid: String) -> AnyPublisher { + let request = ReadRequest(rid: rid) + return dataTask(for: request) + } +} diff --git a/ios/RocketChat Watch App/Client/RocketChatError.swift b/ios/RocketChat Watch App/Client/RocketChatError.swift new file mode 100644 index 000000000..ab47047fe --- /dev/null +++ b/ios/RocketChat Watch App/Client/RocketChatError.swift @@ -0,0 +1,15 @@ +import Foundation + +struct ErrorResponse: Codable, Identifiable { + var id: String { + error + } + + let error: String +} + +enum RocketChatError: Error { + case server(response: ErrorResponse) + case unauthorized + case unknown +} diff --git a/ios/RocketChat Watch App/Client/URLSessionCertificateHandling.swift b/ios/RocketChat Watch App/Client/URLSessionCertificateHandling.swift new file mode 100644 index 000000000..b00cc2237 --- /dev/null +++ b/ios/RocketChat Watch App/Client/URLSessionCertificateHandling.swift @@ -0,0 +1,95 @@ +// https://medium.com/@hamidptb/implementing-mtls-on-ios-using-urlsession-and-cloudflare-890b76aca66c + +import Foundation + +final class URLSesionClientCertificateHandling: NSObject, URLSessionDelegate { + private let certificate: Data? + private let password: String? + + init(certificate: Data?, password: String?) { + self.certificate = certificate + self.password = password + } + + public func urlSession( + _: URLSession, + didReceive challenge: URLAuthenticationChallenge, + completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void + ) { + guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate else { + completionHandler(.performDefaultHandling, nil) + return + } + + guard let credential = Credentials.urlCredential(certificate: certificate, password: password) else { + completionHandler(.performDefaultHandling, nil) + return + } + + challenge.sender?.use(credential, for: challenge) + completionHandler(.useCredential, credential) + } +} + +fileprivate typealias UserCertificate = (data: Data, password: String) + +fileprivate final class Credentials { + static func urlCredential(certificate: Data?, password: String?) -> URLCredential? { + guard let certificate, let password else { return nil } + + let p12Contents = PKCS12(pkcs12Data: certificate, password: password) + + guard let identity = p12Contents.identity else { + return nil + } + + return URLCredential(identity: identity, certificates: nil, persistence: .none) + } +} + +fileprivate struct PKCS12 { + let label: String? + let keyID: NSData? + let trust: SecTrust? + let certChain: [SecTrust]? + let identity: SecIdentity? + + public init(pkcs12Data: Data, password: String) { + let importPasswordOption: NSDictionary + = [kSecImportExportPassphrase as NSString: password] + var items: CFArray? + let secError: OSStatus + = SecPKCS12Import(pkcs12Data as NSData, + importPasswordOption, &items) + guard secError == errSecSuccess else { + if secError == errSecAuthFailed { + NSLog("Incorrect password?") + } + fatalError("Error trying to import PKCS12 data") + } + guard let theItemsCFArray = items else { fatalError() } + let theItemsNSArray: NSArray = theItemsCFArray as NSArray + guard let dictArray + = theItemsNSArray as? [[String: AnyObject]] + else { + fatalError() + } + + label = dictArray.element(for: kSecImportItemLabel) + keyID = dictArray.element(for: kSecImportItemKeyID) + trust = dictArray.element(for: kSecImportItemTrust) + certChain = dictArray.element(for: kSecImportItemCertChain) + identity = dictArray.element(for: kSecImportItemIdentity) + } +} + +fileprivate extension Array where Element == [String: AnyObject] { + func element(for key: CFString) -> T? { + for dictElement in self { + if let value = dictElement[key as String] as? T { + return value + } + } + return nil + } +} diff --git a/ios/RocketChat Watch App/Database/Database.swift b/ios/RocketChat Watch App/Database/Database.swift new file mode 100644 index 000000000..8d4a5b3c0 --- /dev/null +++ b/ios/RocketChat Watch App/Database/Database.swift @@ -0,0 +1,132 @@ +import CoreData +import Foundation + +protocol ServersDatabase { + var viewContext: NSManagedObjectContext { get } + + func server(url: URL) -> Server? + func user(id: String) -> LoggedUser? + func servers() -> [Server] + + func remove(_ server: Server) + + func save() + + func process(updatedServer: WatchMessage.Server) +} + +final class DefaultDatabase: ServersDatabase { + private let container: NSPersistentContainer + + var viewContext: NSManagedObjectContext { + container.viewContext + } + + private static let model: NSManagedObjectModel = { + guard let url = Bundle.main.url(forResource: "Default", withExtension: "momd"), + let managedObjectModel = NSManagedObjectModel(contentsOf: url) else { + fatalError("Can't find Core Data Model") + } + + return managedObjectModel + }() + + init() { + container = NSPersistentContainer(name: "default", managedObjectModel: Self.model) + + container.loadPersistentStores { _, error in + if let error { fatalError("Can't load persistent stores: \(error)") } + } + + container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy + } + + func save() { + guard container.viewContext.hasChanges else { + return + } + + try? container.viewContext.save() + } + + func server(url: URL) -> Server? { + let request = Server.fetchRequest() + request.predicate = NSPredicate(format: "url == %@", url.absoluteString.removeTrailingSlash()) + + return try? viewContext.fetch(request).first + } + + func user(id: String) -> LoggedUser? { + let request = LoggedUser.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + return try? viewContext.fetch(request).first + } + + func servers() -> [Server] { + let request = Server.fetchRequest() + + return (try? viewContext.fetch(request)) ?? [] + } + + func remove(_ server: Server) { + viewContext.delete(server) + + save() + } + + func process(updatedServer: WatchMessage.Server) { + if let server = server(url: updatedServer.url) { + server.url = updatedServer.url + server.name = updatedServer.name + server.iconURL = updatedServer.iconURL + server.useRealName = updatedServer.useRealName + server.loggedUser = user(from: updatedServer.loggedUser) + server.certificate = updatedServer.clientSSL?.certificate + server.password = updatedServer.clientSSL?.password + server.version = updatedServer.version + } else { + Server( + context: viewContext, + iconURL: updatedServer.iconURL, + name: updatedServer.name, + url: updatedServer.url, + useRealName: updatedServer.useRealName, + loggedUser: user(from: updatedServer.loggedUser), + certificate: updatedServer.clientSSL?.certificate, + password: updatedServer.clientSSL?.password, + version: updatedServer.version + ) + } + + save() + } + + private func user(from updatedUser: WatchMessage.Server.LoggedUser) -> LoggedUser { + if let user = user(id: updatedUser.id) { + user.name = updatedUser.name + user.username = updatedUser.username + user.token = updatedUser.token + + return user + } + + return LoggedUser( + context: viewContext, + id: updatedUser.id, + name: updatedUser.name, + token: updatedUser.token, + username: updatedUser.username + ) + } +} + +extension String { + func removeTrailingSlash() -> String { + var url = self + if (url.last == "/") { + url.removeLast() + } + return url + } +} diff --git a/ios/RocketChat Watch App/Database/Default.xcdatamodeld/Default.xcdatamodel/contents b/ios/RocketChat Watch App/Database/Default.xcdatamodeld/Default.xcdatamodel/contents new file mode 100644 index 000000000..f8d64a472 --- /dev/null +++ b/ios/RocketChat Watch App/Database/Default.xcdatamodeld/Default.xcdatamodel/contents @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/RocketChat Watch App/Database/Entity/Attachment.swift b/ios/RocketChat Watch App/Database/Entity/Attachment.swift new file mode 100644 index 000000000..5ee92b33b --- /dev/null +++ b/ios/RocketChat Watch App/Database/Entity/Attachment.swift @@ -0,0 +1,7 @@ +import CoreData + +extension Attachment { + var aspectRatio: Double { + return width / height + } +} diff --git a/ios/RocketChat Watch App/Database/Entity/LoggedUser.swift b/ios/RocketChat Watch App/Database/Entity/LoggedUser.swift new file mode 100644 index 000000000..5408276ea --- /dev/null +++ b/ios/RocketChat Watch App/Database/Entity/LoggedUser.swift @@ -0,0 +1,48 @@ +import CoreData + +@objc +public final class LoggedUser: NSManagedObject { + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + NSFetchRequest(entityName: "LoggedUser") + } + + @NSManaged public var id: String + @NSManaged public var name: String + @NSManaged public var token: String + @NSManaged public var username: String + + @available(*, unavailable) + init() { + fatalError() + } + + @available(*, unavailable) + init(context: NSManagedObjectContext) { + fatalError() + } + + public override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) { + super.init(entity: entity, insertInto: context) + } + + @discardableResult + public init( + context: NSManagedObjectContext, + id: String, + name: String, + token: String, + username: String + ) { + let entity = NSEntityDescription.entity(forEntityName: "LoggedUser", in: context)! + super.init(entity: entity, insertInto: context) + self.id = id + self.name = name + self.token = token + self.username = username + } +} + +extension LoggedUser: Identifiable { + +} diff --git a/ios/RocketChat Watch App/Database/Entity/Room.swift b/ios/RocketChat Watch App/Database/Entity/Room.swift new file mode 100644 index 000000000..9061defb5 --- /dev/null +++ b/ios/RocketChat Watch App/Database/Entity/Room.swift @@ -0,0 +1,36 @@ +import CoreData + +extension Room { + var messagesRequest: NSFetchRequest { + let request = Message.fetchRequest() + + request.predicate = NSPredicate(format: "room == %@", self) + request.sortDescriptors = [NSSortDescriptor(keyPath: \Message.ts, ascending: true)] + + return request + } + + var lastMessage: Message? { + let request = Message.fetchRequest() + + let thisRoomPredicate = NSPredicate(format: "room == %@", self) + let nonInfoMessagePredicate = NSPredicate(format: "t == nil", self) + request.predicate = NSCompoundPredicate( + andPredicateWithSubpredicates: [thisRoomPredicate, nonInfoMessagePredicate] + ) + request.sortDescriptors = [NSSortDescriptor(keyPath: \Message.ts, ascending: false)] + request.fetchLimit = 1 + + return try? managedObjectContext?.fetch(request).first + } + + var firstMessage: Message? { + let request = Message.fetchRequest() + + request.predicate = NSPredicate(format: "room == %@", self) + request.sortDescriptors = [NSSortDescriptor(keyPath: \Message.ts, ascending: true)] + request.fetchLimit = 1 + + return try? managedObjectContext?.fetch(request).first + } +} diff --git a/ios/RocketChat Watch App/Database/Entity/Server.swift b/ios/RocketChat Watch App/Database/Entity/Server.swift new file mode 100644 index 000000000..24236cdb4 --- /dev/null +++ b/ios/RocketChat Watch App/Database/Entity/Server.swift @@ -0,0 +1,78 @@ +import CoreData + +@objc +public final class Server: NSManagedObject { + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + NSFetchRequest(entityName: "Server") + } + + @NSManaged public var iconURL: URL + @NSManaged public var name: String + @NSManaged public var updatedSince: Date? + @NSManaged public var url: URL + @NSManaged public var useRealName: Bool + @NSManaged public var loggedUser: LoggedUser + @NSManaged public var certificate: Data? + @NSManaged public var password: String? + @NSManaged public var version: String + + lazy var database: Database = RocketChatDatabase(server: self) + + @available(*, unavailable) + init() { + fatalError() + } + + @available(*, unavailable) + init(context: NSManagedObjectContext) { + fatalError() + } + + public override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) { + super.init(entity: entity, insertInto: context) + } + + @discardableResult + public init( + context: NSManagedObjectContext, + iconURL: URL, + name: String, + updatedSince: Date? = nil, + url: URL, + useRealName: Bool, + loggedUser: LoggedUser, + certificate: Data? = nil, + password: String? = nil, + version: String + ) { + let entity = NSEntityDescription.entity(forEntityName: "Server", in: context)! + super.init(entity: entity, insertInto: context) + self.iconURL = iconURL + self.name = name + self.updatedSince = updatedSince + self.url = url + self.useRealName = useRealName + self.loggedUser = loggedUser + self.certificate = certificate + self.password = password + self.version = version + } +} + +extension Server: Identifiable { + +} + +extension Server { + var roomsRequest: NSFetchRequest { + let request = Room.fetchRequest() + + let nonArchived = NSPredicate(format: "archived == false") + let open = NSPredicate(format: "open == true") + request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [nonArchived, open]) + request.sortDescriptors = [NSSortDescriptor(keyPath: \Room.ts, ascending: false)] + + return request + } +} diff --git a/ios/RocketChat Watch App/Database/Model/AttachmentModel.swift b/ios/RocketChat Watch App/Database/Model/AttachmentModel.swift new file mode 100644 index 000000000..3ebbf7eee --- /dev/null +++ b/ios/RocketChat Watch App/Database/Model/AttachmentModel.swift @@ -0,0 +1,42 @@ +import CoreData + +final class AttachmentModel { + private let context: NSManagedObjectContext + + init(context: NSManagedObjectContext) { + self.context = context + } + + func upsert(_ newAttachment: MergedRoom.Message.Attachment) -> Attachment? { + let identifier = newAttachment.imageURL ?? newAttachment.audioURL + + guard let identifier = identifier?.absoluteString ?? newAttachment.title else { + return nil + } + + let attachment = attachment(id: identifier, in: context) + + attachment.imageURL = newAttachment.imageURL + attachment.msg = newAttachment.description + attachment.width = newAttachment.dimensions?.width ?? 0 + attachment.height = newAttachment.dimensions?.height ?? 0 + + return attachment + } +} + +extension AttachmentModel { + private func attachment(id: String, in context: NSManagedObjectContext) -> Attachment { + let request = Attachment.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + guard let attachment = try? context.fetch(request).first else { + let attachment = Attachment(context: context) + attachment.id = id + + return attachment + } + + return attachment + } +} diff --git a/ios/RocketChat Watch App/Database/Model/MessageModel.swift b/ios/RocketChat Watch App/Database/Model/MessageModel.swift new file mode 100644 index 000000000..a3473f023 --- /dev/null +++ b/ios/RocketChat Watch App/Database/Model/MessageModel.swift @@ -0,0 +1,62 @@ +import CoreData + +final class MessageModel { + private let context: NSManagedObjectContext + + init(context: NSManagedObjectContext) { + self.context = context + } + + func upsert(_ newMessage: MergedRoom.Message) -> Message { + let attachmentDatabase = AttachmentModel(context: context) + let userDatabase = UserModel(context: context) + + let user = userDatabase.upsert(newMessage.u) + let message = message(id: newMessage._id, in: context) + + message.status = "received" + message.id = newMessage._id + message.msg = newMessage.msg + message.ts = newMessage.ts + message.t = newMessage.t + message.groupable = newMessage.groupable ?? true + message.editedAt = newMessage.editedAt + message.role = newMessage.role + message.comment = newMessage.comment + message.user = user + + if let messageAttachments = newMessage.attachments { + for newAttachment in messageAttachments { + let attachment = attachmentDatabase.upsert(newAttachment) + + attachment?.message = message + } + } + + return message + } + + func fetch(id: String) -> Message? { + let request = Message.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + return try? context.fetch(request).first + } +} + +extension MessageModel { + private func message(id: String, in context: NSManagedObjectContext) -> Message { + let request = Message.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + guard let message = try? context.fetch(request).first else { + let message = Message(context: context) + message.id = id + message.ts = Date() + + return message + } + + return message + } +} diff --git a/ios/RocketChat Watch App/Database/Model/RoomModel.swift b/ios/RocketChat Watch App/Database/Model/RoomModel.swift new file mode 100644 index 000000000..f95145584 --- /dev/null +++ b/ios/RocketChat Watch App/Database/Model/RoomModel.swift @@ -0,0 +1,89 @@ +import CoreData + +final class RoomModel { + private let context: NSManagedObjectContext + + init(context: NSManagedObjectContext) { + self.context = context + } + + @discardableResult + func upsert(_ newRoom: MergedRoom) -> Room { + let room = room(id: newRoom.id, in: context) + + room.name = newRoom.name ?? room.name + room.fname = newRoom.fname ?? room.fname + room.t = newRoom.t + room.unread = Int32(newRoom.unread) + room.alert = newRoom.alert + room.lr = newRoom.lr ?? room.lr + room.open = newRoom.open ?? true + room.rid = newRoom.rid + room.hideUnreadStatus = newRoom.hideUnreadStatus ?? room.hideUnreadStatus + + room.updatedAt = newRoom.updatedAt ?? room.updatedAt + room.usernames = newRoom.usernames ?? room.usernames + room.uids = newRoom.uids ?? room.uids + room.prid = newRoom.prid ?? room.prid + room.isReadOnly = newRoom.isReadOnly ?? room.isReadOnly + room.encrypted = newRoom.encrypted ?? room.encrypted + room.teamMain = newRoom.teamMain ?? room.teamMain + room.archived = newRoom.archived ?? room.archived + room.broadcast = newRoom.broadcast ?? room.broadcast + room.ts = newRoom.ts ?? room.ts + + let messageDatabase = MessageModel(context: context) + + if let lastMessage = newRoom.lastMessage { + let message = messageDatabase.upsert(lastMessage) + message.room = room + } + + return room + } + + func delete(_ room: Room) { + context.delete(room) + } + + func fetch(ids: [String]) -> [Room] { + let request = Room.fetchRequest() + request.predicate = NSPredicate(format: "id IN %@", ids) + + return (try? context.fetch(request)) ?? [] + } + + func fetch(id: String) -> Room { + room(id: id, in: context) + } +} + +extension RoomModel { + private func room(id: String, in context: NSManagedObjectContext) -> Room { + let request = Room.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + guard let room = try? context.fetch(request).first else { + let room = Room(context: context) + room.id = id + + return room + } + + return room + } + + private func room(rid: String, in context: NSManagedObjectContext) -> Room { + let request = Room.fetchRequest() + request.predicate = NSPredicate(format: "rid == %@", rid) + + guard let room = try? context.fetch(request).first else { + let room = Room(context: context) + room.rid = rid + + return room + } + + return room + } +} diff --git a/ios/RocketChat Watch App/Database/Model/UserModel.swift b/ios/RocketChat Watch App/Database/Model/UserModel.swift new file mode 100644 index 000000000..1f052cfdf --- /dev/null +++ b/ios/RocketChat Watch App/Database/Model/UserModel.swift @@ -0,0 +1,37 @@ +import CoreData + +final class UserModel { + private let context: NSManagedObjectContext + + init(context: NSManagedObjectContext) { + self.context = context + } + + func upsert(_ newUser: MergedRoom.Message.User) -> User { + let user = user(id: newUser._id, in: context) + user.name = newUser.name + user.username = newUser.username + + return user + } + + func fetch(id: String) -> User { + user(id: id, in: context) + } +} + +extension UserModel { + private func user(id: String, in context: NSManagedObjectContext) -> User { + let request = User.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + guard let user = try? context.fetch(request).first else { + let user = User(context: context) + user.id = id + + return user + } + + return user + } +} diff --git a/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents b/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents new file mode 100644 index 000000000..806bb4dea --- /dev/null +++ b/ios/RocketChat Watch App/Database/RocketChat.xcdatamodeld/RocketChat.xcdatamodel/contents @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/RocketChat Watch App/Database/RocketChatDatabase.swift b/ios/RocketChat Watch App/Database/RocketChatDatabase.swift new file mode 100644 index 000000000..d41c8642b --- /dev/null +++ b/ios/RocketChat Watch App/Database/RocketChatDatabase.swift @@ -0,0 +1,316 @@ +import Combine +import CoreData + +protocol Database { + var viewContext: NSManagedObjectContext { get } + func has(context: NSManagedObjectContext) -> Bool + + func room(id: String) -> Room? + func room(rid: String) -> Room? + func remove(_ message: Message) + + func handleRoomsResponse(_ subscriptionsResponse: SubscriptionsResponse, _ roomsResponse: RoomsResponse) + func handleHistoryResponse(_ historyResponse: HistoryResponse, in roomID: String) + func handleMessagesResponse(_ messagesResponse: MessagesResponse, in roomID: String, newUpdatedSince: Date) + func handleSendMessageResponse(_ sendMessageResponse: SendMessageResponse, in roomID: String) + func handleSendMessageRequest(_ newMessage: MergedRoom.Message, in roomID: String) + func handleReadResponse(_ readResponse: ReadResponse, in roomID: String) + func handleSendMessageError(_ messageID: String) + + func remove() +} + +final class RocketChatDatabase: Database { + private let server: Server + + init(server: Server) { + self.server = server + } + + var viewContext: NSManagedObjectContext { + container.viewContext + } + + func has(context: NSManagedObjectContext) -> Bool { + context == backgroundContext + } + + private static let model: NSManagedObjectModel = { + guard let url = Bundle.main.url(forResource: "RocketChat", withExtension: "momd"), + let managedObjectModel = NSManagedObjectModel(contentsOf: url) else { + fatalError("Can't find Core Data Model") + } + + return managedObjectModel + }() + + private lazy var container: NSPersistentContainer = { + let name = server.url.host ?? "default" + + let container = NSPersistentContainer(name: name, managedObjectModel: Self.model) + + container.loadPersistentStores { _, error in + if let error { fatalError("Can't load persistent stores: \(error)") } + } + + container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy + container.viewContext.automaticallyMergesChangesFromParent = true + + return container + }() + + private lazy var backgroundContext = container.newBackgroundContext() + + func remove(_ message: Message) { + viewContext.delete(message) + + do { + try viewContext.save() + } catch { + print(error) + } + } + + func room(id: String) -> Room? { + let request = Room.fetchRequest() + request.predicate = NSPredicate(format: "id == %@", id) + + return try? viewContext.fetch(request).first + } + + func room(rid: String) -> Room? { + let request = Room.fetchRequest() + request.predicate = NSPredicate(format: "rid == %@", rid) + + return try? viewContext.fetch(request).first + } + + func remove() { + guard let url = container.persistentStoreDescriptions.first?.url else { + return + } + + do { + try container.persistentStoreCoordinator.destroyPersistentStore(at: url, type: .sqlite) + } catch { + print(error) + } + } +} + +extension RocketChatDatabase { + func handleReadResponse(_ readResponse: ReadResponse, in roomID: String) { + backgroundContext.performBackgroundTask { context in + let roomDatabase = RoomModel(context: context) + + let room = roomDatabase.fetch(id: roomID) + + room.alert = false + room.unread = 0 + + do { + try context.save() + } catch { + print(error) + } + } + } + + func handleSendMessageError(_ messageID: String) { + backgroundContext.performBackgroundTask { context in + let messageDatabase = MessageModel(context: context) + + if let message = messageDatabase.fetch(id: messageID) { + message.status = "error" + } + + do { + try context.save() + } catch { + print(error) + } + } + } + + func handleSendMessageRequest(_ newMessage: MergedRoom.Message, in roomID: String) { + backgroundContext.performBackgroundTask { context in + let roomDatabase = RoomModel(context: context) + let messageDatabase = MessageModel(context: context) + + let room = roomDatabase.fetch(id: roomID) + + let message = messageDatabase.upsert(newMessage) + + message.status = "temp" + message.room = room + + do { + try context.save() + } catch { + print(error) + } + } + } + + func handleSendMessageResponse(_ sendMessageResponse: SendMessageResponse, in roomID: String) { + let message = sendMessageResponse.message + + backgroundContext.performBackgroundTask { context in + let messageDatabase = MessageModel(context: context) + let roomDatabase = RoomModel(context: context) + + let room = roomDatabase.fetch(id: roomID) + + if let newMessage = MergedRoom.Message(from: message) { + let message = messageDatabase.upsert(newMessage) + + message.room = room + } + + do { + try context.save() + } catch { + print(error) + } + } + } + + func handleMessagesResponse(_ messagesResponse: MessagesResponse, in roomID: String, newUpdatedSince: Date) { + let messages = messagesResponse.result.updated + + backgroundContext.performBackgroundTask { context in + let messageDatabase = MessageModel(context: context) + let roomDatabase = RoomModel(context: context) + + let room = roomDatabase.fetch(id: roomID) + + for message in messages { + if let newMessage = MergedRoom.Message(from: message) { + let message = messageDatabase.upsert(newMessage) + + message.room = room + } + } + + room.updatedSince = newUpdatedSince + + do { + try context.save() + } catch { + print(error) + } + } + } + + func handleHistoryResponse(_ historyResponse: HistoryResponse, in roomID: String) { + let messages = historyResponse.messages + + backgroundContext.performBackgroundTask { context in + let messageDatabase = MessageModel(context: context) + let roomDatabase = RoomModel(context: context) + + let room = roomDatabase.fetch(id: roomID) + + room.hasMoreMessages = messages.count == HISTORY_MESSAGE_COUNT + room.synced = true + + for message in historyResponse.messages { + if let newMessage = MergedRoom.Message(from: message) { + let message = messageDatabase.upsert(newMessage) + + message.room = room + } + } + + do { + try context.save() + } catch { + print(error) + } + } + } + + func handleRoomsResponse(_ subscriptionsResponse: SubscriptionsResponse, _ roomsResponse: RoomsResponse) { + let rooms = roomsResponse.update + let subscriptions = subscriptionsResponse.update + + backgroundContext.performBackgroundTask { context in + let roomDatabase = RoomModel(context: context) + + let roomIds = rooms.filter { room in !subscriptions.contains { room._id == $0.rid } }.map { $0._id } + + let existingSubs = roomDatabase.fetch(ids: roomIds) + let mappedExistingSubs = subscriptions + existingSubs.compactMap { $0.response } + + let mergedSubscriptions = mappedExistingSubs.compactMap { subscription in + let index = rooms.firstIndex { $0._id == subscription.rid } + + guard let index else { + return MergedRoom(subscription, nil) + } + + let room = rooms[index] + return MergedRoom(subscription, room) + } + + let subsIds = mergedSubscriptions.compactMap { $0.id } + subscriptionsResponse.remove.compactMap { $0._id } + + if subsIds.count > 0 { + let existingSubscriptions = roomDatabase.fetch(ids: subsIds) + let subsToUpdate = existingSubscriptions.filter { subscription in mergedSubscriptions.contains { subscription.id == $0.id } } + let subsToCreate = mergedSubscriptions.filter { subscription in !existingSubscriptions.contains { subscription.id == $0.id } } + let subsToDelete = existingSubscriptions.filter { subscription in !mergedSubscriptions.contains { subscription.id == $0.id } } + + subsToCreate.forEach { subscription in + roomDatabase.upsert(subscription) + } + + subsToUpdate.forEach { subscription in + if let newRoom = mergedSubscriptions.first(where: { $0.id == subscription.id }) { + roomDatabase.upsert(newRoom) + } + } + + subsToDelete.forEach { subscription in + roomDatabase.delete(subscription) + } + + do { + try context.save() + } catch { + print(error) + } + } + } + } +} + +private extension Room { + var response: SubscriptionsResponse.Subscription? { + guard let id, let fname, let t, let rid else { + return nil + } + + return .init( + _id: id, + rid: rid, + name: name, + fname: fname, + t: t, + unread: Int(unread), + alert: alert, + lr: lr, + open: open, + _updatedAt: ts, + hideUnreadStatus: hideUnreadStatus + ) + } +} + +extension NSManagedObjectContext { + func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) { + perform { + block(self) + } + } +} diff --git a/ios/RocketChat Watch App/DependencyInjection/Dependency.swift b/ios/RocketChat Watch App/DependencyInjection/Dependency.swift new file mode 100644 index 000000000..eff7adc90 --- /dev/null +++ b/ios/RocketChat Watch App/DependencyInjection/Dependency.swift @@ -0,0 +1,21 @@ +@propertyWrapper +struct Dependency { + private var dependency: T + + init() { + guard let dependency = Store.resolve(T.self) else { + fatalError("No service of type \(T.self) registered!") + } + + self.dependency = dependency + } + + var wrappedValue: T { + get { + dependency + } + mutating set { + dependency = newValue + } + } +} diff --git a/ios/RocketChat Watch App/DependencyInjection/Store.swift b/ios/RocketChat Watch App/DependencyInjection/Store.swift new file mode 100644 index 000000000..eb9d67e89 --- /dev/null +++ b/ios/RocketChat Watch App/DependencyInjection/Store.swift @@ -0,0 +1,41 @@ +import Foundation + +protocol StoreInterface { + static func register(_ type: T.Type, factory: @autoclosure @escaping () -> T) + static func resolve(_ type: T.Type) -> T? +} + +final class Store: StoreInterface { + private static var factories: [ObjectIdentifier: () -> Any] = [:] + private static var cache: [ObjectIdentifier: WeakRef] = [:] + + static func register(_ type: T.Type, factory: @autoclosure @escaping () -> T) { + let identifier = ObjectIdentifier(type) + factories[identifier] = factory + cache[identifier] = nil + } + + static func resolve(_ type: T.Type) -> T? { + let identifier = ObjectIdentifier(type) + + if let dependency = cache[identifier]?.value { + return dependency as? T + } else { + let dependency = factories[identifier]?() as? T + + if let dependency { + cache[identifier] = WeakRef(value: dependency as AnyObject) + } + + return dependency + } + } +} + +private final class WeakRef { + private(set) weak var value: T? + + init(value: T) { + self.value = value + } +} diff --git a/ios/RocketChat Watch App/ExtensionDelegate.swift b/ios/RocketChat Watch App/ExtensionDelegate.swift new file mode 100644 index 000000000..609fcfa69 --- /dev/null +++ b/ios/RocketChat Watch App/ExtensionDelegate.swift @@ -0,0 +1,43 @@ +import WatchKit +import UserNotifications + +final class ExtensionDelegate: NSObject, WKApplicationDelegate { + let router = AppRouter() + let database = DefaultDatabase() + + func applicationDidFinishLaunching() { + UNUserNotificationCenter.current().delegate = self + } +} + +extension ExtensionDelegate: UNUserNotificationCenterDelegate { + func userNotificationCenter( + _ center: UNUserNotificationCenter, + didReceive response: UNNotificationResponse, + withCompletionHandler completionHandler: @escaping () -> Void + ) { + let userInfo = response.notification.request.content.userInfo + let ejson = userInfo["ejson"] as? String + let data = ejson?.data(using: .utf8) + + guard let response = try? data?.decode(NotificationResponse.self) else { return } + + deeplink(from: response) + + completionHandler() + } +} + +extension ExtensionDelegate { + private func deeplink(from response: NotificationResponse) { + guard let server = database.server(url: response.host) else { return } + guard let room = server.database.room(rid: response.rid) else { return } + + router.route(to: [.loading, .roomList(server), .room(server, room)]) + } +} + +struct NotificationResponse: Codable, Hashable { + let host: URL + let rid: String +} diff --git a/ios/RocketChat Watch App/Extensions/Binding+Extensions.swift b/ios/RocketChat Watch App/Extensions/Binding+Extensions.swift new file mode 100644 index 000000000..7116086ca --- /dev/null +++ b/ios/RocketChat Watch App/Extensions/Binding+Extensions.swift @@ -0,0 +1,24 @@ +import SwiftUI + +extension Binding where Value == Bool { + init(bindingOptional: Binding) { + self.init( + get: { + bindingOptional.wrappedValue != nil + }, + set: { newValue in + guard newValue == false else { return } + + /// We only handle `false` booleans to set our optional to `nil` + /// as we can't handle `true` for restoring the previous value. + bindingOptional.wrappedValue = nil + } + ) + } +} + +extension Binding { + func mappedToBool() -> Binding where Value == Wrapped? { + Binding(bindingOptional: self) + } +} diff --git a/ios/RocketChat Watch App/Extensions/Color+Extensions.swift b/ios/RocketChat Watch App/Extensions/Color+Extensions.swift new file mode 100644 index 000000000..95bc5c918 --- /dev/null +++ b/ios/RocketChat Watch App/Extensions/Color+Extensions.swift @@ -0,0 +1,27 @@ +import SwiftUI + +extension Color { + static var titleLabels: Color { + Color(hex: 0xF2F3F5) + } + + static var `default`: Color { + Color(hex: 0xE4E7EA) + } + + static var secondaryInfo: Color { + Color(hex: 0x9EA2A8) + } +} + +private extension Color { + init(hex: UInt, alpha: Double = 1) { + self.init( + .sRGB, + red: Double((hex >> 16) & 0xff) / 255, + green: Double((hex >> 08) & 0xff) / 255, + blue: Double((hex >> 00) & 0xff) / 255, + opacity: alpha + ) + } +} diff --git a/ios/RocketChat Watch App/Extensions/Date+Extensions.swift b/ios/RocketChat Watch App/Extensions/Date+Extensions.swift new file mode 100644 index 000000000..3d0d95ffd --- /dev/null +++ b/ios/RocketChat Watch App/Extensions/Date+Extensions.swift @@ -0,0 +1,7 @@ +import Foundation + +extension Date { + static func - (lhs: Date, rhs: Date) -> TimeInterval { + return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate + } +} diff --git a/ios/RocketChat Watch App/Extensions/ToolbarItemPlacement+Extensions.swift b/ios/RocketChat Watch App/Extensions/ToolbarItemPlacement+Extensions.swift new file mode 100644 index 000000000..359bea7d6 --- /dev/null +++ b/ios/RocketChat Watch App/Extensions/ToolbarItemPlacement+Extensions.swift @@ -0,0 +1,11 @@ +import SwiftUI + +extension ToolbarItemPlacement { + static var `default`: Self { + if #available(watchOS 10.0, *) { + return .topBarLeading + } else { + return .automatic + } + } +} diff --git a/ios/RocketChat Watch App/Formatters/Mapper/MessageInfoMapper.swift b/ios/RocketChat Watch App/Formatters/Mapper/MessageInfoMapper.swift new file mode 100644 index 000000000..59518c8a9 --- /dev/null +++ b/ios/RocketChat Watch App/Formatters/Mapper/MessageInfoMapper.swift @@ -0,0 +1,165 @@ +import SwiftUI + +struct InfoMessage { + let msg: String + let username: String + let type: String + let role: String + let comment: String +} + +func getInfoMessage(_ infoMessage: InfoMessage) -> LocalizedStringKey { + switch infoMessage.type { + case "rm": + return "message removed" + case "uj": + return "joined the channel" + case "ujt": + return "joined this team" + case "ut": + return "joined the conversation" + case "r": + return "changed room name to: \(infoMessage.msg)" + case "ru": + return "removed \(infoMessage.msg)" + case "au": + return "added \(infoMessage.msg)" + case "user-muted": + return "muted \(infoMessage.msg)" + case "room_changed_description": + return "changed room description to: \(infoMessage.msg)" + case "room_changed_announcement": + return "changed room announcement to: \(infoMessage.msg)" + case "room_changed_topic": + return "changed room topic to: \(infoMessage.msg)" + case "room_changed_privacy": + return "changed room to \(infoMessage.msg)" + case "room_changed_avatar": + return "changed room avatar" + case "message_snippeted": + return "created a snippet" + case "room_e2e_disabled": + return "disabled E2E encryption for this room" + case "room_e2e_enabled": + return "enabled E2E encryption for this room" + case "removed-user-from-team": + return "removed @\(infoMessage.msg) from this team" + case "added-user-to-team": + return "added @\(infoMessage.msg) to this team" + case "user-added-room-to-team": + return "added #\(infoMessage.msg) to this team" + case "user-converted-to-team": + return "converted #\(infoMessage.msg) to a team" + case "user-converted-to-channel": + return "converted #\(infoMessage.msg) to channel" + case "user-deleted-room-from-team": + return "deleted #\(infoMessage.msg)" + case "user-removed-room-from-team": + return "removed #\(infoMessage.msg) from this team" + case "room-disallowed-reacting": + return "disallowed reactions" + case "room-allowed-reacting": + return "allowed reactions" + case "room-set-read-only": + return "set room to read only" + case "room-removed-read-only": + return "removed read only permission" + case "user-unmuted": + return "unmuted \(infoMessage.msg)" + case "room-archived": + return "archived room" + case "room-unarchived": + return "unarchived room" + case "subscription-role-added": + return "defined \(infoMessage.msg) as \(infoMessage.role)" + case "subscription-role-removed": + return "removed \(infoMessage.msg) as \(infoMessage.role)" + case "message_pinned": + return "Pinned a message:" + case "ul": + return "left the channel" + case "ult": + return "has left the team" + case "jitsi_call_started": + return "Call started by \(infoMessage.username)" + case "omnichannel_placed_chat_on_hold": + return "Chat on hold: \(infoMessage.comment)" + case "omnichannel_on_hold_chat_resumed": + return "On hold chat resumed: \(infoMessage.comment)" + case "command": + return "returned the chat to the queue" + case "livechat-started": + return "Chat started" + case "livechat-close": + return "Conversation closed" + case "livechat_transfer_history": + return "New chat transfer: \(infoMessage.username) returned the chat to the queue" + default: + return "Unsupported system message" + } +} + +func messageHaveAuthorName(_ messageType: String) -> Bool { + messagesWithAuthorName.contains(messageType) +} + +extension InfoMessage { + init(from message: Message) { + self.init( + msg: message.msg ?? "", + username: message.user?.username ?? "", + type: message.t ?? "", + role: message.role ?? "", + comment: message.comment ?? "" + ) + } +} + +private let messagesWithAuthorName: Set = [ + "r", + "ru", + "au", + "rm", + "uj", + "ujt", + "ut", + "ul", + "ult", + "message_pinned", + "message_snippeted", + "removed-user-from-team", + "added-user-to-team", + "user-added-room-to-team", + "user-converted-to-team", + "user-converted-to-channel", + "user-deleted-room-from-team", + "user-removed-room-from-team", + "omnichannel_placed_chat_on_hold", + "omnichannel_on_hold_chat_resumed", + "livechat_navigation_history", + "livechat_transcript_history", + "command", + "livechat-started", + "livechat-close", + "livechat_video_call", + "livechat_webrtc_video_call", + "livechat_transfer_history", + "room-archived", + "room-unarchived", + "user-muted", + "room_changed_description", + "room_changed_announcement", + "room_changed_topic", + "room_changed_privacy", + "room_changed_avatar", + "room_e2e_disabled", + "room_e2e_enabled", + "room-allowed-reacting", + "room-disallowed-reacting", + "room-set-read-only", + "room-removed-read-only", + "user-unmuted", + "room-unarchived", + "subscription-role-added", + "subscription-role-removed" +] diff --git a/ios/RocketChat Watch App/Formatters/MessageFormatter.swift b/ios/RocketChat Watch App/Formatters/MessageFormatter.swift new file mode 100644 index 000000000..a992043ee --- /dev/null +++ b/ios/RocketChat Watch App/Formatters/MessageFormatter.swift @@ -0,0 +1,88 @@ +import SwiftUI + +final class MessageFormatter { + private let message: Message + private let previousMessage: Message? + private let lastOpen: Date? + + init(message: Message, previousMessage: Message?, lastOpen: Date?) { + self.message = message + self.previousMessage = previousMessage + self.lastOpen = lastOpen + } + + func hasDateSeparator() -> Bool { + if let previousMessage, + let previousMessageTS = previousMessage.ts, + let messageTS = message.ts, + Calendar.current.isDate(previousMessageTS, inSameDayAs: messageTS) { + return false + } + return true + } + + func hasUnreadSeparator() -> Bool { + guard let messageTS = message.ts, let lastOpen else { + return false + } + + if previousMessage == nil { + return messageTS > lastOpen + } else if let previousMessage, let previousMessageTS = previousMessage.ts { + return messageTS >= lastOpen && previousMessageTS < lastOpen + } else { + return false + } + } + + func isHeader() -> Bool { + if let previousMessage, + let previousMessageTS = previousMessage.ts, + let messageTS = message.ts, + Calendar.current.isDate(previousMessageTS, inSameDayAs: messageTS), + previousMessage.user?.username == message.user?.username, + !(previousMessage.groupable == false || message.groupable == false || message.room?.broadcast == true), + messageTS - previousMessageTS < 300, + message.t != "rm", + previousMessage.t != "rm" { + return false + } + + return true + } + + func info() -> LocalizedStringKey? { + switch message.t { + case .some: + return getInfoMessage(.init(from: message)) + case .none: + return nil + } + } + + func date() -> String? { + guard let ts = message.ts else { return nil } + + let dateFormatter = DateFormatter() + + dateFormatter.locale = Locale.current + dateFormatter.timeZone = TimeZone.current + dateFormatter.timeStyle = .none + dateFormatter.dateStyle = .long + + return dateFormatter.string(from: ts) + } + + func time() -> String? { + guard let ts = message.ts else { return nil } + + let dateFormatter = DateFormatter() + + dateFormatter.locale = Locale.current + dateFormatter.timeZone = TimeZone.current + dateFormatter.timeStyle = .short + dateFormatter.dateStyle = .none + + return dateFormatter.string(from: ts) + } +} diff --git a/ios/RocketChat Watch App/Formatters/RoomFormatter.swift b/ios/RocketChat Watch App/Formatters/RoomFormatter.swift new file mode 100644 index 000000000..12c27321a --- /dev/null +++ b/ios/RocketChat Watch App/Formatters/RoomFormatter.swift @@ -0,0 +1,42 @@ +import Foundation + +final class RoomFormatter { + private let room: Room + private let server: Server + + init(room: Room, server: Server) { + self.room = room + self.server = server + } + + var title: String? { + if isGroupChat, !(room.name != nil && room.name?.isEmpty == false), let usernames = room.usernames { + return usernames + .filter { $0 == server.loggedUser.username } + .sorted() + .joined(separator: ", ") + } + + if room.t != "d" { + return room.fname ?? room.name + } + + if room.prid != nil || server.useRealName { + return room.fname ?? room.name + } + + return room.name + } + + var isGroupChat: Bool { + if let uids = room.uids, uids.count > 2 { + return true + } + + if let usernames = room.usernames, usernames.count > 2 { + return true + } + + return false + } +} diff --git a/ios/RocketChat Watch App/Loaders/CancelBag.swift b/ios/RocketChat Watch App/Loaders/CancelBag.swift new file mode 100644 index 000000000..4461ea559 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/CancelBag.swift @@ -0,0 +1,10 @@ +import Combine + +typealias CancelBag = Set + +extension CancelBag { + mutating func cancelAll() { + forEach { $0.cancel() } + removeAll() + } +} diff --git a/ios/RocketChat Watch App/Loaders/ImageLoader.swift b/ios/RocketChat Watch App/Loaders/ImageLoader.swift new file mode 100644 index 000000000..d481f6eff --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/ImageLoader.swift @@ -0,0 +1,33 @@ +import Combine +import Foundation +import UIKit + +final class ImageLoader: ObservableObject { + @Dependency private var client: RocketChatClientProtocol + + @Published private(set) var image: UIImage? + + private var cancellable: AnyCancellable? + + private let url: URL + + init(url: URL) { + self.url = url + } + + deinit { + cancel() + } + + func load() { + cancellable = client.session.dataTaskPublisher(for: url) + .map { UIImage(data: $0.data) } + .replaceError(with: nil) + .receive(on: DispatchQueue.main) + .sink { [weak self] in self?.image = $0 } + } + + func cancel() { + cancellable?.cancel() + } +} diff --git a/ios/RocketChat Watch App/Loaders/Merge/MergedRoom.swift b/ios/RocketChat Watch App/Loaders/Merge/MergedRoom.swift new file mode 100644 index 000000000..af57f3be5 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/Merge/MergedRoom.swift @@ -0,0 +1,60 @@ +import Foundation + +struct MergedRoom { + let id: String + let name: String? + let fname: String? + let t: String + let unread: Int + let alert: Bool + let lr: Date? + let open: Bool? + let rid: String + let hideUnreadStatus: Bool? + + let archived: Bool? + let broadcast: Bool? + let encrypted: Bool? + let isReadOnly: Bool? + let prid: String? + let teamMain: Bool? + let ts: Date? + let uids: [String]? + let updatedAt: Date? + let usernames: [String]? + let lastMessage: Message? + let lm: Date? + + struct Message { + let _id: String + let rid: String + let msg: String + let u: User + let ts: Date + let attachments: [Attachment]? + let t: String? + let groupable: Bool? + let editedAt: Date? + let role: String? + let comment: String? + + struct User { + let _id: String + let username: String? + let name: String? + } + + struct Attachment { + let title: String? + let imageURL: URL? + let audioURL: URL? + let description: String? + let dimensions: Dimensions? + + struct Dimensions { + let width: Double + let height: Double + } + } + } +} diff --git a/ios/RocketChat Watch App/Loaders/Merge/MergedRoomMapper.swift b/ios/RocketChat Watch App/Loaders/Merge/MergedRoomMapper.swift new file mode 100644 index 000000000..da47d2412 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/Merge/MergedRoomMapper.swift @@ -0,0 +1,58 @@ +extension MergedRoom { + init(_ subscription: SubscriptionsResponse.Subscription, _ room: RoomsResponse.Room?) { + id = subscription._id + name = subscription.name ?? room?.fname + fname = subscription.fname + t = subscription.t + unread = subscription.unread + alert = subscription.alert + lr = subscription.lr + open = subscription.open + rid = subscription.rid + hideUnreadStatus = subscription.hideUnreadStatus + + if let room { + if room._updatedAt != nil { + updatedAt = room._updatedAt + lastMessage = .init(from: room.lastMessage?.value) + archived = room.archived ?? false + usernames = room.usernames + uids = room.uids + } else { + updatedAt = nil + lastMessage = nil + archived = nil + usernames = nil + uids = nil + } + + let lastRoomUpdate = room.lm ?? room.ts ?? subscription._updatedAt + + if let lr = subscription.lr, let lastRoomUpdate { + ts = max(lr, lastRoomUpdate) + } else { + ts = lastRoomUpdate + } + + isReadOnly = room.ro ?? false + broadcast = room.broadcast + encrypted = room.encrypted + teamMain = room.teamMain + prid = room.prid + lm = room.lm + } else { + updatedAt = nil + lastMessage = nil + archived = nil + usernames = nil + uids = nil + ts = nil + isReadOnly = nil + broadcast = nil + encrypted = nil + teamMain = nil + prid = nil + lm = nil + } + } +} diff --git a/ios/RocketChat Watch App/Loaders/Merge/MessageMapper.swift b/ios/RocketChat Watch App/Loaders/Merge/MessageMapper.swift new file mode 100644 index 000000000..63226a362 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/Merge/MessageMapper.swift @@ -0,0 +1,48 @@ +extension MergedRoom.Message { + init?(from newMessage: MessageResponse?) { + guard let newMessage else { + return nil + } + + _id = newMessage._id + rid = newMessage.rid + msg = newMessage.msg + u = .init(from: newMessage.u) + ts = newMessage.ts + attachments = newMessage.attachments?.map { .init(from: $0) } + t = newMessage.t + groupable = newMessage.groupable + editedAt = newMessage.editedAt + role = newMessage.role + comment = newMessage.comment + } +} + +extension MergedRoom.Message.User { + init(from user: UserResponse) { + _id = user._id + username = user.username + name = user.name + } +} + +extension MergedRoom.Message.Attachment { + init(from attachment: AttachmentResponse) { + title = attachment.title + imageURL = attachment.imageURL + audioURL = attachment.audioURL + description = attachment.description + dimensions = .init(from: attachment.dimensions) + } +} + +extension MergedRoom.Message.Attachment.Dimensions { + init?(from dimensions: DimensionsResponse?) { + guard let dimensions else { + return nil + } + + width = dimensions.width + height = dimensions.height + } +} diff --git a/ios/RocketChat Watch App/Loaders/MessageSender.swift b/ios/RocketChat Watch App/Loaders/MessageSender.swift new file mode 100644 index 000000000..d9d56e4b2 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/MessageSender.swift @@ -0,0 +1,88 @@ +import Combine +import Foundation + +protocol MessageSending { + func sendMessage(_ msg: String, in room: Room) + func resendMessage(message: Message, in room: Room) +} + +final class MessageSender { + @Dependency private var client: RocketChatClientProtocol + @Dependency private var database: Database + + private let server: Server + + init(server: Server) { + self.server = server + } + + private func sendMessageCall(_ message: MergedRoom.Message, in roomID: String) { + database.handleSendMessageRequest(message, in: roomID) + + client.sendMessage(id: message._id, rid: message.rid, msg: message.msg) + .receive(on: DispatchQueue.main) + .subscribe(Subscribers.Sink { [weak self] completion in + if case .failure = completion { + self?.database.handleSendMessageError(message._id) + } + } receiveValue: { [weak self] messageResponse in + self?.database.handleSendMessageResponse(messageResponse, in: roomID) + }) + } +} + +extension MessageSender: MessageSending { + func sendMessage(_ msg: String, in room: Room) { + guard let rid = room.rid, let roomID = room.id else { return } + + let messageID = String.random(17) + let loggedUser = server.loggedUser + + let newMessage = MergedRoom.Message( + _id: messageID, + rid: rid, + msg: msg, + u: .init( + _id: loggedUser.id, + username: loggedUser.username, + name: loggedUser.name + ), + ts: Date(), + attachments: nil, + t: nil, + groupable: true, + editedAt: nil, + role: nil, + comment: nil + ) + + sendMessageCall(newMessage, in: roomID) + } + + func resendMessage(message: Message, in room: Room) { + guard let rid = room.rid, let roomID = room.id else { return } + + guard let id = message.id, let msg = message.msg, let user = message.user, let userID = user.id else { return } + + let newMessage = MergedRoom.Message( + _id: id, + rid: rid, + msg: msg, + u: MergedRoom.Message.User( + _id: userID, + username: user.username, + name: user.name + ), + ts: Date(), + attachments: nil, + t: nil, + groupable: true, + editedAt: nil, + role: nil, + comment: nil + ) + + sendMessageCall(newMessage, in: roomID) + } +} + diff --git a/ios/RocketChat Watch App/Loaders/MessagesLoader.swift b/ios/RocketChat Watch App/Loaders/MessagesLoader.swift new file mode 100644 index 000000000..e5ac3784d --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/MessagesLoader.swift @@ -0,0 +1,109 @@ +import CoreData +import Combine +import Foundation + +protocol MessagesLoading { + func start(on roomID: String) + func loadMore(from date: Date) + + func stop() +} + +final class MessagesLoader { + private var timer: Timer? + private var cancellable = CancelBag() + + @Dependency private var client: RocketChatClientProtocol + @Dependency private var database: Database + @Dependency private var serversDB: ServersDatabase + + private var roomID: String? + + private func scheduledSyncMessages(in room: Room, from date: Date) { + timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { [weak self] _ in + self?.syncMessages(in: room, from: date) + } + } + + private func syncMessages(in room: Room, from date: Date) { + guard let rid = room.rid, let roomID = room.id else { return } + + let newUpdatedSince = Date() + + client.syncMessages(rid: rid, updatedSince: date) + .receive(on: DispatchQueue.main) + .sink { [weak self] completion in + if case .failure = completion { + self?.scheduledSyncMessages(in: room, from: newUpdatedSince) + } + } receiveValue: { [weak self] messagesResponse in + self?.database.handleMessagesResponse(messagesResponse, in: roomID, newUpdatedSince: newUpdatedSince) + + self?.scheduledSyncMessages(in: room, from: newUpdatedSince) + + self?.markAsRead(in: room) + } + .store(in: &cancellable) + } + + private func loadMessages(in room: Room, from date: Date) { + guard let rid = room.rid, let roomID = room.id else { return } + + client.getHistory(rid: rid, t: room.t ?? "", latest: date) + .receive(on: DispatchQueue.main) + .sink { completion in + if case .failure(let error) = completion { + print(error) + } + } receiveValue: { [weak self] messagesResponse in + self?.database.handleHistoryResponse(messagesResponse, in: roomID) + } + .store(in: &cancellable) + } + + private func markAsRead(in room: Room) { + guard (room.unread > 0 || room.alert), let rid = room.rid, let roomID = room.id else { + return + } + + client.sendRead(rid: rid) + .receive(on: DispatchQueue.main) + .sink { completion in + if case .failure(let error) = completion { + print(error) + } + } receiveValue: { [weak self] readResponse in + self?.database.handleReadResponse(readResponse, in: roomID) + } + .store(in: &cancellable) + } +} + +extension MessagesLoader: MessagesLoading { + func start(on roomID: String) { + stop() + + self.roomID = roomID + + guard let room = database.room(id: roomID) else { return } + + if let updatedSince = room.updatedSince { + loadMessages(in: room, from: updatedSince) + syncMessages(in: room, from: updatedSince) + } else { + loadMessages(in: room, from: .now) + syncMessages(in: room, from: .now) + } + } + + func loadMore(from date: Date) { + guard let roomID, let room = database.room(id: roomID) else { return } + + loadMessages(in: room, from: date) + } + + func stop() { + timer?.invalidate() + cancellable.cancelAll() + } +} diff --git a/ios/RocketChat Watch App/Loaders/RoomsLoader.swift b/ios/RocketChat Watch App/Loaders/RoomsLoader.swift new file mode 100644 index 000000000..a40e5f439 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/RoomsLoader.swift @@ -0,0 +1,118 @@ +import CoreData +import Combine +import Foundation + +protocol RoomsLoading { + func start() + func stop() +} + +final class RoomsLoader: ObservableObject { + @Dependency private var client: RocketChatClientProtocol + @Dependency private var database: Database + @Dependency private var serversDB: ServersDatabase + + @Published private(set) var state: State + + private var timer: Timer? + private var cancellable = CancelBag() + + private let server: Server + + private var shouldUpdatedDateOnce: Bool + + init(server: Server) { + self.server = server + self.state = server.updatedSince == nil ? .loading : .loaded + + shouldUpdatedDateOnce = !(server.version >= "4") + } + + private func scheduledLoadRooms() { + timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { [weak self] _ in + self?.loadRooms() + } + } + + private func loadRooms() { + let newUpdatedSince = Date() + + let updatedSince = server.updatedSince + + Publishers.Zip( + client.getRooms(updatedSince: updatedSince), + client.getSubscriptions(updatedSince: updatedSince) + ) + .receive(on: DispatchQueue.main) + .sink { [weak self] completion in + if case .failure = completion { + if self?.state == .loading { self?.state = .error } + self?.scheduledLoadRooms() + } + } receiveValue: { roomsResponse, subscriptionsResponse in + self.database.handleRoomsResponse(subscriptionsResponse, roomsResponse) + self.updateServer(to: newUpdatedSince) + self.scheduledLoadRooms() + } + .store(in: &cancellable) + } + + /// This method updates the updateSince timestamp only once in servers with versions below 4. + /// + /// It is required due to missing events in the rooms and subscriptions + /// requests in those old versions. We get extra information + /// by passing a date that is older than the real updatedSince last timestamp. + private func updateServer(to newUpdatedSince: Date) { + if !(server.version >= "4") { + if shouldUpdatedDateOnce { + server.updatedSince = newUpdatedSince + serversDB.save() + shouldUpdatedDateOnce = false + } + } else { + server.updatedSince = newUpdatedSince + serversDB.save() + } + } + + private func observeContext() { + NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave) + .receive(on: DispatchQueue.main) + .sink { [database] notification in + if let context = notification.object as? NSManagedObjectContext { + if database.has(context: context) { + self.state = .loaded + } + } + } + .store(in: &cancellable) + } +} + +extension RoomsLoader: RoomsLoading { + func start() { + stop() + + loadRooms() + observeContext() + } + + func stop() { + timer?.invalidate() + cancellable.cancelAll() + } +} + +extension RoomsLoader { + enum State { + case loaded + case loading + case error + } +} + +private extension String { + static func >=(lhs: String, rhs: String) -> Bool { + lhs.compare(rhs, options: .numeric) == .orderedDescending || lhs.compare(rhs, options: .numeric) == .orderedSame + } +} diff --git a/ios/RocketChat Watch App/Loaders/ServersLoader.swift b/ios/RocketChat Watch App/Loaders/ServersLoader.swift new file mode 100644 index 000000000..fb6708aba --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/ServersLoader.swift @@ -0,0 +1,58 @@ +import Combine +import Foundation +import WatchConnectivity + +enum ServersLoadingError: Error, Equatable { + case unactive + case unreachable + case locked + case undecodable(Error) + + static func == (lhs: ServersLoadingError, rhs: ServersLoadingError) -> Bool { + switch (lhs, rhs) { + case (.unactive, .unactive), (.unreachable, .unreachable), (.locked, .locked), (.undecodable, .undecodable): + return true + default: + return false + } + } +} + +protocol ServersLoading { + func loadServers() -> AnyPublisher +} + +final class ServersLoader: NSObject { + @Dependency private var database: ServersDatabase + + private let session: WatchSessionProtocol + + init(session: WatchSessionProtocol = RetriableWatchSession()) { + self.session = session + super.init() + } +} + +// MARK: - ServersLoading + +extension ServersLoader: ServersLoading { + func loadServers() -> AnyPublisher { + Future { [self] promise in + session.sendMessage { result in + switch result { + case .success(let message): + for server in message.servers { + DispatchQueue.main.async { + self.database.process(updatedServer: server) + } + } + + promise(.success(())) + case .failure(let error): + promise(.failure(error)) + } + } + } + .eraseToAnyPublisher() + } +} diff --git a/ios/RocketChat Watch App/Loaders/WatchSession.swift b/ios/RocketChat Watch App/Loaders/WatchSession.swift new file mode 100644 index 000000000..4989b7fa8 --- /dev/null +++ b/ios/RocketChat Watch App/Loaders/WatchSession.swift @@ -0,0 +1,98 @@ +import WatchConnectivity + +protocol WatchSessionProtocol { + func sendMessage(completionHandler: @escaping (Result) -> Void) +} + +/// Default WatchSession protocol implementation. +final class WatchSession: NSObject, WatchSessionProtocol, WCSessionDelegate { + private let session: WCSession + + init(session: WCSession) { + self.session = session + super.init() + session.delegate = self + session.activate() + } + + func sendMessage(completionHandler: @escaping (Result) -> Void) { + guard session.activationState == .activated else { + completionHandler(.failure(.unactive)) + return + } + + guard !session.iOSDeviceNeedsUnlockAfterRebootForReachability else { + completionHandler(.failure(.locked)) + return + } + + guard session.isReachable else { + completionHandler(.failure(.unreachable)) + return + } + + session.sendMessage([:]) { dictionary in + do { + let data = try JSONSerialization.data(withJSONObject: dictionary) + let message = try JSONDecoder().decode(WatchMessage.self, from: data) + + completionHandler(.success(message)) + } catch { + completionHandler(.failure(.undecodable(error))) + } + } + } + + func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { + + } +} + +/// Retry decorator for WatchSession protocol. +final class RetriableWatchSession: WatchSessionProtocol { + private let session: WatchSessionProtocol + private let retries: Int + + init(session: WatchSessionProtocol = DelayableWatchSession(session: WatchSession(session: .default)), retries: Int = 3) { + self.session = session + self.retries = retries + } + + func sendMessage(completionHandler: @escaping (Result) -> Void) { + session.sendMessage { [weak self] result in + guard let self else { + return + } + + switch result { + case .success(let message): + completionHandler(.success(message)) + case .failure where self.retries > 0: + self.session.sendMessage(completionHandler: completionHandler) + case .failure(let error): + completionHandler(.failure(error)) + } + } + } +} + +/// Delay decorator for WatchSession protocol. +final class DelayableWatchSession: WatchSessionProtocol { + private let delay: TimeInterval + private let session: WatchSessionProtocol + + init(delay: TimeInterval = 1, session: WatchSessionProtocol) { + self.delay = delay + self.session = session + } + + func sendMessage(completionHandler: @escaping (Result) -> Void) { + Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { [weak self] _ in + guard let self else { + return + } + + self.session.sendMessage(completionHandler: completionHandler) + } + } +} diff --git a/ios/RocketChat Watch App/Localizable.xcstrings b/ios/RocketChat Watch App/Localizable.xcstrings new file mode 100644 index 000000000..ab84156cb --- /dev/null +++ b/ios/RocketChat Watch App/Localizable.xcstrings @@ -0,0 +1,1126 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "%@ " : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + } + } + }, + "%@ sent an attachment" : { + "extractionState" : "manual", + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ が添付ファイルを送信しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ enviou um anexo" + } + } + } + }, + "added @%@ to this team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このチームに @%@ を追加しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "adicionou @%@ a este time" + } + } + } + }, + "added #%@ to this team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このチームに #%@ を追加しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "adicionou #%@ a este time" + } + } + } + }, + "added %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ を追加しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "adicionou o usuário %@" + } + } + } + }, + "allowed reactions" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "許可されたリアクション" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "adicionou permissão de reagir" + } + } + } + }, + "archived room" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アーカイブされたルーム" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "arquivou a sala" + } + } + } + }, + "Attachment not supported." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "添付ファイルはサポートされていません。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anexo não suportado." + } + } + } + }, + "Call started" : { + "extractionState" : "manual", + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通話が開始されました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chamada iniciada" + } + } + } + }, + "Call started by %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通話開始者 %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chamada iniciada por %@" + } + } + } + }, + "Call started by: %@" : { + "extractionState" : "manual", + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通話開始者: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chamada iniciada por: %@" + } + } + } + }, + "changed room announcement to: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がルームアナウンスを次のように変更しました: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "alterou o anúncio da sala para: %@" + } + } + } + }, + "changed room avatar" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ルームのアバターを変更しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "alterou avatar da sala" + } + } + } + }, + "changed room description to: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "が部屋の説明を次のように変更しました: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "alterou a descrição da sala para: %@" + } + } + } + }, + "changed room name to: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がルーム名を %@ に変更しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "alterou o nome da sala para: %@" + } + } + } + }, + "changed room to %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "が部屋を %@ に変更しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mudou sala para %@" + } + } + } + }, + "changed room topic to: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がルームのトピックを次のように変更しました: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mudou tópico da sala para: %@" + } + } + } + }, + "Chat on hold: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "チャット保留中: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conversa em espera: %@" + } + } + } + }, + "Chat started" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "チャットが始まりました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conversa iniciada" + } + } + } + }, + "Conversation closed" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "会話は終了しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conversa encerrada" + } + } + } + }, + "converted #%@ to a team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "が #%@ をチームに変換しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "converteu #%@ em time" + } + } + } + }, + "converted #%@ to channel" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "が #%@ をチャネルに変換しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "converteu #%@ em canal" + } + } + } + }, + "Could not connect to your iPhone." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "iPhone に接続できませんでした。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível conectar ao seu iPhone." + } + } + } + }, + "Could not load rooms." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "部屋を読み込めませんでした。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível carregar as salas." + } + } + } + }, + "Could not reach your iPhone." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "iPhone にアクセスできませんでした。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível acessar seu iPhone." + } + } + } + }, + "Could not read workspaces from iPhone." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "iPhone からワークスペースを読み取ることができませんでした。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível ler os workspaces do iPhone." + } + } + } + }, + "created a snippet" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ がスニペットを作成しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "criou um snippet" + } + } + } + }, + "defined %@ as %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "defined %1$@ as %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "は %1$@ を %2$@ として定義しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "definiu %1$@ como %2$@" + } + } + } + }, + "Delete" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "消去" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Excluir" + } + } + } + }, + "deleted #%@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ を削除しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "#%@ apagada" + } + } + } + }, + "disabled E2E encryption for this room" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このルームの E2E 暗号化が無効になりました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "desabilitou criptografia para essa sala" + } + } + } + }, + "disallowed reactions" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 許可されていないリアクション" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removeu a permissão de reagir" + } + } + } + }, + "enabled E2E encryption for this room" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このルームの E2E 暗号化が有効になりました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "habilitou criptografia para essa sala" + } + } + } + }, + "Encrypted message" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "暗号化されたメッセージ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mensagem criptografada" + } + } + } + }, + "has left the team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "はチームを離れました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "saiu do time" + } + } + } + }, + "joined the channel" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がチャンネルに参加しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "entrou no canal" + } + } + } + }, + "joined the conversation" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "さんが会話に参加しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "entrou na conversa" + } + } + } + }, + "joined this team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がこのチームに参加しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "entrou no time" + } + } + } + }, + "left the channel" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がチャンネルを離れました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "saiu da conversa" + } + } + } + }, + "Load more..." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "もっと読み込む..." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carregar mais..." + } + } + } + }, + "Message" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mensagem" + } + } + } + }, + "message removed" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージが削除されました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "mensagem removida" + } + } + } + }, + "muted %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "をミュートしました %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "silenciou o usuário %@" + } + } + } + }, + "New chat transfer: %@ returned the chat to the queue" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "新しいチャット転送: %@ がチャットをキューに戻しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nova transferência de conversa: %@ retornou conversa para a fila" + } + } + } + }, + "No connected workspaces." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "接続されたワークスペースがありません。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sem workspaces." + } + } + } + }, + "No message" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージなし" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nenhuma mensagem" + } + } + } + }, + "No messages" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージはありません" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sem mensagens" + } + } + } + }, + "On hold chat resumed: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "保留中のチャットが再開されました: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conversa em espera retomada: %@" + } + } + } + }, + "Pinned a message:" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージを固定しました:" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fixou uma mensagem:" + } + } + } + }, + "Please unlock your iPhone." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "iPhoneのロックを解除してください。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por favor, desbloqueie seu iPhone." + } + } + } + }, + "Refresh" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "リフレッシュ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atualizar" + } + } + } + }, + "removed @%@ from this team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がこのチームから @%@ を削除しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removeu @%@ deste time" + } + } + } + }, + "removed #%@ from this team" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "がこのチームから #%@ を削除しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removeu #%@ deste time" + } + } + } + }, + "removed %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "が削除されました %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removeu %@" + } + } + } + }, + "removed %@ as %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "removed %1$@ as %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ を %2$@ として削除しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removeu %1$@ como %2$@" + } + } + } + }, + "removed read only permission" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "は読み取り専用権限を削除しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "removeu permissão de escrita da sala" + } + } + } + }, + "Resend" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "再送信" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reenviar" + } + } + } + }, + "returned the chat to the queue" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "はチャットをキューに戻しました" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "retornou conversa para a fila" + } + } + } + }, + "Rooms" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "部屋" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Salas" + } + } + } + }, + "set room to read only" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ルームを読み取り専用に設定します" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "adicionou permissão de escrita à sala" + } + } + } + }, + "This room is read only" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "この部屋は読み取り専用です" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esta sala é somente leitura" + } + } + } + }, + "Try again" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "もう一度やり直してください" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tentar novamente" + } + } + } + }, + "unarchived room" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "未アーカイブルーム" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "desarquivou a sala" + } + } + } + }, + "Unexpected error." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "予期しないエラー。" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro inesperado." + } + } + } + }, + "unmuted %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ミュート解除 %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "permitiu que %@ fale na sala" + } + } + } + }, + "Unread messages" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "未読メッセージ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mensagens não lidas" + } + } + } + }, + "Unsupported system message" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サポートされていないシステム メッセージ" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mensagem de sistema não suportada" + } + } + } + }, + "Workspaces" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ワークスペース" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Workspaces" + } + } + } + }, + "You" : { + "extractionState" : "manual", + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "あなた" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Você" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/ios/RocketChat Watch App/Preview Content/Preview Assets.xcassets/Contents.json b/ios/RocketChat Watch App/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/ios/RocketChat Watch App/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/RocketChat Watch App/RocketChatApp.swift b/ios/RocketChat Watch App/RocketChatApp.swift new file mode 100644 index 000000000..274417e7e --- /dev/null +++ b/ios/RocketChat Watch App/RocketChatApp.swift @@ -0,0 +1,23 @@ +import SwiftUI +import WatchKit + +@main +struct RocketChat_Watch_AppApp: App { + @WKApplicationDelegateAdaptor var delegate: ExtensionDelegate + + init() { + registerDependencies() + } + + private func registerDependencies() { + Store.register(AppRouting.self, factory: delegate.router) + Store.register(ServersDatabase.self, factory: delegate.database) + Store.register(ServersLoading.self, factory: ServersLoader()) + } + + var body: some Scene { + WindowGroup { + AppView(router: delegate.router) + } + } +} diff --git a/ios/RocketChat Watch App/Storage.swift b/ios/RocketChat Watch App/Storage.swift new file mode 100644 index 000000000..e79a0277b --- /dev/null +++ b/ios/RocketChat Watch App/Storage.swift @@ -0,0 +1,32 @@ +import Foundation + +enum StorageKey: String { + case currentServer = "current_server" +} + +@propertyWrapper +struct Storage { + private let key: StorageKey + private let defaultValue: T? + + init(_ key: StorageKey, defaultValue: T? = nil) { + self.key = key + self.defaultValue = defaultValue + } + + var wrappedValue: T? { + get { + guard let data = UserDefaults.standard.object(forKey: key.rawValue) as? Data else { + return defaultValue + } + + let value = try? JSONDecoder().decode(T.self, from: data) + return value ?? defaultValue + } + set { + let data = try? JSONEncoder().encode(newValue) + + UserDefaults.standard.set(data, forKey: key.rawValue) + } + } +} diff --git a/ios/RocketChat Watch App/ViewModels/MessageViewModel.swift b/ios/RocketChat Watch App/ViewModels/MessageViewModel.swift new file mode 100644 index 000000000..be521dc7c --- /dev/null +++ b/ios/RocketChat Watch App/ViewModels/MessageViewModel.swift @@ -0,0 +1,49 @@ +import SwiftUI + +final class MessageViewModel: ObservableObject { + @Published private(set) var server: Server? + @Published private(set) var message: Message + @Published private(set) var previousMessage: Message? + + private let messageFormatter: MessageFormatter + + init(message: Message, previousMessage: Message? = nil, server: Server?, lastOpen: Date?) { + self.message = message + self.previousMessage = previousMessage + self.messageFormatter = MessageFormatter( + message: message, + previousMessage: previousMessage, + lastOpen: lastOpen + ) + self.server = server + } + + var sender: String? { + server?.useRealName == true ? message.user?.name : message.user?.username + } + + var date: String? { + messageFormatter.date() + } + + var time: String? { + messageFormatter.time() + } + + var info: LocalizedStringKey? { + messageFormatter.info() + } + + var hasDateSeparator: Bool { + messageFormatter.hasDateSeparator() + } + + var hasUnreadSeparator: Bool { + messageFormatter.hasUnreadSeparator() + } + + var isHeader: Bool { + messageFormatter.isHeader() && !messageHaveAuthorName(message.t ?? "") + } + +} diff --git a/ios/RocketChat Watch App/ViewModels/RoomViewModel.swift b/ios/RocketChat Watch App/ViewModels/RoomViewModel.swift new file mode 100644 index 000000000..747c28eb3 --- /dev/null +++ b/ios/RocketChat Watch App/ViewModels/RoomViewModel.swift @@ -0,0 +1,114 @@ +import SwiftUI + +final class RoomViewModel: ObservableObject { + @Published var room: Room + @Published var server: Server + + private let formatter: RoomFormatter + + init(room: Room, server: Server) { + self.room = room + self.server = server + self.formatter = RoomFormatter(room: room, server: server) + } + + var title: String? { + formatter.title + } + + var iconName: String? { + if room.prid != nil { + return "discussions" + } else if room.teamMain == true, room.t == "p" { + return "teams-private" + } else if room.teamMain == true { + return "teams" + } else if room.t == "p" { + return "channel-private" + } else if room.t == "c" { + return "channel-public" + } else if room.t == "d", formatter.isGroupChat { + return "message" + } + + return nil + } + + var lastMessage: String { + guard let user = room.lastMessage?.user else { + return String(localized: "No message") + } + + let isLastMessageSentByMe = user.username == server.loggedUser.username + let username = isLastMessageSentByMe ? String(localized: "You") : ((server.useRealName ? user.name : user.username) ?? "") + let message = room.lastMessage?.msg ?? String(localized: "No message") + + if room.lastMessage?.t == "jitsi_call_started" { + return String(localized: "Call started by: \(username)") + } + + if room.lastMessage?.attachments?.allObjects.isEmpty == false { + return String(localized: "\(username) sent an attachment") + } + + if room.lastMessage?.t == "e2e" { + return String(localized: "Encrypted message") + } + + if room.lastMessage?.t == "videoconf" { + return String(localized: "Call started") + } + + if room.t == "d", !isLastMessageSentByMe { + return message + } + + return "\(username): \(message)" + } + + var updatedAt: String? { + guard let ts = room.ts else { + return nil + } + + let calendar = Calendar.current + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale.current + dateFormatter.timeZone = TimeZone.current + + if calendar.isDateInYesterday(ts) { + return "Yesterday" + } + + if calendar.isDateInToday(ts) { + dateFormatter.timeStyle = .short + dateFormatter.dateStyle = .none + + return dateFormatter.string(from: ts) + } + + if isDateFromLastWeek(ts) { + dateFormatter.dateFormat = "EEEE" + + return dateFormatter.string(from: ts) + } + + dateFormatter.timeStyle = .none + dateFormatter.dateStyle = .short + + return dateFormatter.string(from: ts) + } + + private func isDateFromLastWeek(_ date: Date) -> Bool { + let calendar = Calendar.current + let now = Date() + + let startOfCurrentWeek = calendar.date(from: calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: now))! + + guard let startOfLastWeek = calendar.date(byAdding: .day, value: -7, to: startOfCurrentWeek) else { + return false + } + + return calendar.isDate(date, inSameDayAs: startOfLastWeek) || date > startOfLastWeek + } +} diff --git a/ios/RocketChat Watch App/Views/AttachmentView.swift b/ios/RocketChat Watch App/Views/AttachmentView.swift new file mode 100644 index 000000000..03e83f0a7 --- /dev/null +++ b/ios/RocketChat Watch App/Views/AttachmentView.swift @@ -0,0 +1,33 @@ +import SwiftUI + +struct AttachmentView: View { + @Dependency private var client: RocketChatClientProtocol + + private let attachment: Attachment + + init(attachment: Attachment) { + self.attachment = attachment + } + + var body: some View { + VStack(alignment: .leading) { + if let msg = attachment.msg { + Text(msg) + .font(.caption) + .foregroundStyle(.white) + } + if let rawURL = attachment.imageURL { + RemoteImage(url: client.authorizedURL(url: rawURL)) { + ProgressView() + } + .foregroundStyle(.secondary) + .aspectRatio(attachment.aspectRatio, contentMode: .fit) + .cornerRadius(4) + } else { + Text("Attachment not supported.") + .font(.caption.italic()) + .foregroundStyle(Color.secondaryInfo) + } + } + } +} diff --git a/ios/RocketChat Watch App/Views/ChatScrollView.swift b/ios/RocketChat Watch App/Views/ChatScrollView.swift new file mode 100644 index 000000000..7e2baf745 --- /dev/null +++ b/ios/RocketChat Watch App/Views/ChatScrollView.swift @@ -0,0 +1,28 @@ +import SwiftUI + +/// We need to reverse the scroll view to make it look like a Chat list. +/// Since we want to support older WatchOS versions, we made this wrapper to rotate the scroll view, when we can't use defaultScrollAnchor modifier. +/// It should do the trick for older WatchOS versions and have the native implementation for newer ones. +/// We hide the indicators for the flipped scroll view, since they appear reversed. +struct ChatScrollView: View { + private let content: () -> Content + + init(@ViewBuilder content: @escaping () -> Content) { + self.content = content + } + + var body: some View { + if #available(watchOS 10.0, *) { + ScrollView { + content() + } + .defaultScrollAnchor(.bottom) + } else { + ScrollView(showsIndicators: false) { + content() + .rotationEffect(.degrees(180)) + } + .rotationEffect(.degrees(180)) + } + } +} diff --git a/ios/RocketChat Watch App/Views/LazyView.swift b/ios/RocketChat Watch App/Views/LazyView.swift new file mode 100644 index 000000000..ecd6fac0b --- /dev/null +++ b/ios/RocketChat Watch App/Views/LazyView.swift @@ -0,0 +1,13 @@ +import SwiftUI + +struct LazyView: View { + private let build: () -> Content + + init(_ build: @autoclosure @escaping () -> Content) { + self.build = build + } + + var body: Content { + build() + } +} diff --git a/ios/RocketChat Watch App/Views/LoggedInView.swift b/ios/RocketChat Watch App/Views/LoggedInView.swift new file mode 100644 index 000000000..6d507a1be --- /dev/null +++ b/ios/RocketChat Watch App/Views/LoggedInView.swift @@ -0,0 +1,20 @@ +import SwiftUI + +struct LoggedInView: View { + @Dependency private var database: Database + @Dependency private var roomsLoader: RoomsLoader + + @EnvironmentObject private var router: AppRouter + + private let server: Server + + init(server: Server) { + self.server = server + } + + var body: some View { + RoomListView(server: server, roomsLoader: roomsLoader) + .environmentObject(router) + .environment(\.managedObjectContext, database.viewContext) + } +} diff --git a/ios/RocketChat Watch App/Views/MessageActionView.swift b/ios/RocketChat Watch App/Views/MessageActionView.swift new file mode 100644 index 000000000..b63e2070d --- /dev/null +++ b/ios/RocketChat Watch App/Views/MessageActionView.swift @@ -0,0 +1,34 @@ +import SwiftUI + +struct MessageActionView: View { + @Environment(\.dismiss) private var dismiss + + private let action: (MessageAction) -> Void + private let message: Message + + init(message: Message, action: @escaping (MessageAction) -> Void) { + self.action = action + self.message = message + } + + var body: some View { + VStack { + Button(action: { + dismiss() + + action(.resend(message)) + }, label: { + Text("Resend") + }) + Button(action: { + dismiss() + + action(.delete(message)) + }, label: { + Text("Delete") + .foregroundStyle(.red) + }) + } + .padding() + } +} diff --git a/ios/RocketChat Watch App/Views/MessageComposerView.swift b/ios/RocketChat Watch App/Views/MessageComposerView.swift new file mode 100644 index 000000000..f57aeeb02 --- /dev/null +++ b/ios/RocketChat Watch App/Views/MessageComposerView.swift @@ -0,0 +1,34 @@ +import SwiftUI + +struct MessageComposerView: View { + @State private var message = "" + + let room: Room + let onSend: (String) -> Void + + var body: some View { + if room.isReadOnly { + HStack { + Spacer() + Text("This room is read only") + .font(.caption.bold()) + .foregroundStyle(.white) + .multilineTextAlignment(.center) + Spacer() + } + } else { + TextField("Message", text: $message) + .submitLabel(.send) + .onSubmit(send) + } + } + + func send() { + guard !message.isEmpty else { + return + } + + onSend(message) + message = "" + } +} diff --git a/ios/RocketChat Watch App/Views/MessageListView.swift b/ios/RocketChat Watch App/Views/MessageListView.swift new file mode 100644 index 000000000..9884a9345 --- /dev/null +++ b/ios/RocketChat Watch App/Views/MessageListView.swift @@ -0,0 +1,125 @@ +import SwiftUI + +struct MessageListView: View { + private let messageComposer = "MESSAGE_COMPOSER_ID" + + @Dependency private var database: Database + @Dependency private var messagesLoader: MessagesLoading + @Dependency private var messageSender: MessageSending + + private let formatter: RoomFormatter + private let server: Server + + @ObservedObject private var room: Room + + @State private var lastOpen: Date? + @State private var info: Room? + + @Environment(\.scenePhase) private var scenePhase + + @FetchRequest private var messages: FetchedResults + + init(room: Room, server: Server) { + self.formatter = RoomFormatter(room: room, server: server) + self.room = room + self.server = server + _messages = FetchRequest(fetchRequest: room.messagesRequest, animation: .none) + _lastOpen = State(wrappedValue: room.updatedSince) + } + + var body: some View { + Group { + if messages.count == 0 { + HStack(alignment: .bottom) { + Spacer() + VStack { + Text("No messages") + .font(.caption.italic()) + .foregroundStyle(Color.secondaryInfo) + .frame(maxHeight: .infinity) + } + Spacer() + } + } + ChatScrollView { + VStack(spacing: 0) { + if room.hasMoreMessages { + Button("Load more...") { + guard let oldestMessage = room.firstMessage?.ts else { return } + + messagesLoader.loadMore(from: oldestMessage) + } + .padding(.bottom, 8) + } + + ForEach(messages.indices, id: \.self) { index in + let message = messages[index] + let previousMessage = messages.indices.contains(index - 1) ? messages[index - 1] : nil + + MessageView( + viewModel: .init( + message: message, + previousMessage: previousMessage, + server: server, + lastOpen: lastOpen + ) + ) { action in + switch action { + case .resend(let message): + messageSender.resendMessage(message: message, in: room) + + lastOpen = nil + case .delete(let message): + database.remove(message) + } + } + } + + MessageComposerView(room: room) { + messageSender.sendMessage($0, in: room) + + lastOpen = nil + } + .id(messageComposer) + .padding(.top, 8) + } + } + } + .padding([.leading, .trailing]) + .navigationDestination(for: $info) { room in + RoomInfoView(room: room) + .environment(\.managedObjectContext, database.viewContext) + } + .navigationTitle { + Text(formatter.title ?? "") + .foregroundStyle(Color.titleLabels) + .onTapGesture { + if room.t == "d" { + info = room + } + } + } + .navigationBarTitleDisplayMode(.inline) + .disabled(!room.synced) + .onAppear { + guard let roomID = room.id else { return } + + messagesLoader.start(on: roomID) + } + .onDisappear { + messagesLoader.stop() + } + .onChange(of: scenePhase) { phase in + switch phase { + case .active: + guard let roomID = room.id else { return } + + messagesLoader.start(on: roomID) + case .background, .inactive: + messagesLoader.stop() + @unknown default: + break + } + } + } +} diff --git a/ios/RocketChat Watch App/Views/MessageView.swift b/ios/RocketChat Watch App/Views/MessageView.swift new file mode 100644 index 000000000..77dafae86 --- /dev/null +++ b/ios/RocketChat Watch App/Views/MessageView.swift @@ -0,0 +1,139 @@ +import SwiftUI + +enum MessageAction { + case resend(Message) + case delete(Message) +} + +struct MessageView: View { + @Dependency private var client: RocketChatClientProtocol + + @ObservedObject private var viewModel: MessageViewModel + + @State private var message: Message? + + private let action: (MessageAction) -> Void + + init(viewModel: MessageViewModel, action: @escaping (MessageAction) -> Void) { + self.action = action + self.viewModel = viewModel + } + + @ViewBuilder + private var unreadSeparator: some View { + HStack(alignment: .center) { + Text("Unread messages") + .lineLimit(1) + .font(.footnote) + .foregroundStyle(.red) + .layoutPriority(1) + VStack(alignment: .center) { + Divider() + .overlay(.red) + } + } + } + + @ViewBuilder + private var dateSeparator: some View { + HStack(alignment: .center) { + VStack(alignment: .center) { + Divider() + .overlay(.secondary) + } + Text(viewModel.date ?? "") + .lineLimit(1) + .font(.footnote) + .foregroundStyle(.secondary) + .layoutPriority(1) + VStack(alignment: .center) { + Divider() + .overlay(.secondary) + } + } + } + + var body: some View { + HStack { + VStack(alignment: .leading, spacing: 0) { + if viewModel.hasDateSeparator { + dateSeparator + } else if viewModel.hasUnreadSeparator { + unreadSeparator + } + if viewModel.isHeader { + HStack(alignment: .center) { + Text(viewModel.sender ?? "") + .lineLimit(1) + .font(.caption.bold()) + .foregroundStyle(Color.default) + Text(viewModel.time ?? "") + .lineLimit(1) + .font(.footnote) + .foregroundStyle(.secondary) + if viewModel.message.editedAt != nil { + Image(systemName: "pencil") + .font(.caption) + .foregroundStyle(.secondary) + } + } + .padding(.bottom, 2) + .padding(.top, 6) + } + if let text = viewModel.info { + (Text("\(viewModel.sender ?? "") ").font(.caption.bold().italic()) + Text(text).font(.caption.italic())) + .foregroundStyle(Color.default) + } else if let text = viewModel.message.msg { + HStack(alignment: .top) { + Text(text) + .font(.caption) + .foregroundStyle(viewModel.message.foregroundColor) + + if viewModel.message.status == "error" { + Button( + action: { + message = viewModel.message + }, + label: { + Image(systemName: "exclamationmark.circle") + .font(.caption) + .foregroundStyle(.red) + } + ) + .buttonStyle(PlainButtonStyle()) + } + + if viewModel.message.editedAt != nil && !viewModel.isHeader { + Image(systemName: "pencil") + .font(.caption) + .foregroundStyle(.secondary) + } + } + } + if let attachments = viewModel.message.attachments?.allObjects as? Array { + ForEach(attachments) { attachment in + AttachmentView(attachment: attachment) + } + } + } + Spacer() + } + .padding(.bottom, 2) + .sheet(item: $message) { message in + MessageActionView( + message: message, + action: action + ) + } + } +} + +private extension Message { + var foregroundColor: Color { + if status == "temp" || status == "error" { + return Color.secondaryInfo + } + + return Color.default + } +} diff --git a/ios/RocketChat Watch App/Views/NavigationStackModifier.swift b/ios/RocketChat Watch App/Views/NavigationStackModifier.swift new file mode 100644 index 000000000..a6dbecfe5 --- /dev/null +++ b/ios/RocketChat Watch App/Views/NavigationStackModifier.swift @@ -0,0 +1,30 @@ +import SwiftUI + +struct NavigationStackModifier: ViewModifier { + let item: Binding + let destination: (Item) -> Destination + + func body(content: Content) -> some View { + content.background { + NavigationLink(isActive: item.mappedToBool()) { + if let item = item.wrappedValue { + destination(item) + } else { + EmptyView() + } + } label: { + EmptyView() + } + .opacity(0) + } + } +} + +public extension View { + func navigationDestination( + for binding: Binding, + @ViewBuilder destination: @escaping (Item) -> Destination + ) -> some View { + self.modifier(NavigationStackModifier(item: binding, destination: destination)) + } +} diff --git a/ios/RocketChat Watch App/Views/RemoteImage.swift b/ios/RocketChat Watch App/Views/RemoteImage.swift new file mode 100644 index 000000000..697f2ef5a --- /dev/null +++ b/ios/RocketChat Watch App/Views/RemoteImage.swift @@ -0,0 +1,27 @@ +import SwiftUI + +struct RemoteImage: View { + @StateObject private var loader: ImageLoader + private let placeholder: Placeholder + + init(url: URL, @ViewBuilder placeholder: () -> Placeholder) { + self.placeholder = placeholder() + _loader = StateObject(wrappedValue: ImageLoader(url: url)) + } + + var body: some View { + content + .onAppear(perform: loader.load) + } + + private var content: some View { + Group { + if loader.image != nil { + Image(uiImage: loader.image!) + .resizable() + } else { + placeholder + } + } + } +} diff --git a/ios/RocketChat Watch App/Views/RetryView.swift b/ios/RocketChat Watch App/Views/RetryView.swift new file mode 100644 index 000000000..b63d9a74a --- /dev/null +++ b/ios/RocketChat Watch App/Views/RetryView.swift @@ -0,0 +1,20 @@ +import SwiftUI + +struct RetryView: View { + private let label: LocalizedStringKey + private let action: () -> Void + + init(_ label: LocalizedStringKey, action: @escaping () -> Void) { + self.label = label + self.action = action + } + + var body: some View { + VStack { + Text(label) + .multilineTextAlignment(.center) + Button("Try again", action: action) + } + .padding() + } +} diff --git a/ios/RocketChat Watch App/Views/RoomInfoView.swift b/ios/RocketChat Watch App/Views/RoomInfoView.swift new file mode 100644 index 000000000..54bb690ef --- /dev/null +++ b/ios/RocketChat Watch App/Views/RoomInfoView.swift @@ -0,0 +1,25 @@ +import SwiftUI + +struct RoomInfoView: View { + @ObservedObject private var room: Room + + init(room: Room) { + self.room = room + } + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: 8) { + Text(room.fname ?? "") + .font(.caption) + .fontWeight(.medium) + .foregroundStyle(Color.titleLabels) + Text(room.name ?? "") + .font(.caption2) + .fontWeight(.regular) + .foregroundStyle(Color.secondaryInfo) + Spacer() + } + } + } +} diff --git a/ios/RocketChat Watch App/Views/RoomListView.swift b/ios/RocketChat Watch App/Views/RoomListView.swift new file mode 100644 index 000000000..a8ceff4bd --- /dev/null +++ b/ios/RocketChat Watch App/Views/RoomListView.swift @@ -0,0 +1,63 @@ +import SwiftUI + +struct RoomListView: View { + @Dependency private var database: Database + + @EnvironmentObject private var router: AppRouter + + @ObservedObject private var server: Server + + @StateObject private var roomsLoader: RoomsLoader + + @Environment(\.scenePhase) private var scenePhase + + @FetchRequest private var rooms: FetchedResults + + init(server: Server, roomsLoader: RoomsLoader) { + self.server = server + _roomsLoader = StateObject(wrappedValue: roomsLoader) + _rooms = FetchRequest(fetchRequest: server.roomsRequest) + } + + var body: some View { + List(rooms, id: \.id) { room in + RoomView(viewModel: .init(room: room, server: server)) + .onTapGesture { + router.route(to: .room(server, room)) + } + } + .navigationDestination(for: $router.room) { room in + MessageListView(room: room, server: server) + .environment(\.managedObjectContext, database.viewContext) + } + .onAppear { + roomsLoader.start() + } + .onDisappear { + roomsLoader.stop() + } + .onChange(of: scenePhase) { phase in + switch phase { + case .active: + roomsLoader.start() + case .background, .inactive: + roomsLoader.stop() + @unknown default: + break + } + } + .navigationTitle("Rooms") + .navigationBarTitleDisplayMode(.inline) + .overlay { + switch roomsLoader.state { + case .loaded: + EmptyView() + case .loading: + ProgressView() + case .error: + Text("Could not load rooms.") + .multilineTextAlignment(.center) + } + } + } +} diff --git a/ios/RocketChat Watch App/Views/RoomView.swift b/ios/RocketChat Watch App/Views/RoomView.swift new file mode 100644 index 000000000..c1e46cd8e --- /dev/null +++ b/ios/RocketChat Watch App/Views/RoomView.swift @@ -0,0 +1,48 @@ +import SwiftUI + +struct RoomView: View { + @ObservedObject var viewModel: RoomViewModel + + private var isUnread: Bool { + (viewModel.room.unread > 0 || viewModel.room.alert) && viewModel.room.hideUnreadStatus != true + } + + var body: some View { + VStack(alignment: .leading) { + HStack { + if let iconName = viewModel.iconName { + Image(iconName) + .resizable() + .frame(width: 16, height: 16) + .scaledToFit() + } + Text(viewModel.title ?? "") + .lineLimit(1) + .font(.caption.weight(isUnread ? .bold : .medium)) + .foregroundStyle(Color.default) + Spacer() + Text(viewModel.updatedAt ?? "") + .lineLimit(1) + .font(.footnote.weight(isUnread ? .bold : .regular)) + .foregroundStyle(isUnread ? .blue : Color.default) + } + HStack(alignment: .top) { + Text(viewModel.lastMessage) + .lineLimit(2) + .font(.caption2) + .foregroundStyle(isUnread ? Color.titleLabels : Color.default) + Spacer() + if isUnread, viewModel.room.unread > 0 { + Text(String(viewModel.room.unread)) + .font(.footnote.bold()) + .padding(6) + .background( + Circle() + .fill(.blue) + ) + .foregroundColor(Color.default) + } + } + } + } +} diff --git a/ios/RocketChat Watch App/Views/ServerListView.swift b/ios/RocketChat Watch App/Views/ServerListView.swift new file mode 100644 index 000000000..2ba161e9c --- /dev/null +++ b/ios/RocketChat Watch App/Views/ServerListView.swift @@ -0,0 +1,116 @@ +import Combine +import CoreData +import SwiftUI + +struct ServerListView: View { + @EnvironmentObject private var router: AppRouter + + @Dependency private var serversLoader: ServersLoading + + @State private var state: ViewState = .loading + + @FetchRequest private var servers: FetchedResults + + init() { + let fetchRequest = Server.fetchRequest() + fetchRequest.sortDescriptors = [] + + _servers = FetchRequest(fetchRequest: fetchRequest) + } + + @ViewBuilder + private var serverList: some View { + List(servers.sort()) { server in + ServerView(server: server) + .onTapGesture { + router.route(to: .roomList(server)) + } + } + } + + @ViewBuilder + private var refreshLabel: some View { + if #available(watchOS 10.0, *) { + Image(systemName: "gobackward") + } else { + Text("Refresh") + } + } + + var body: some View { + VStack { + switch state { + case .loading: + ProgressView() + case .loaded where servers.isEmpty: + RetryView("No connected workspaces.", action: loadServers) + case .loaded: + serverList + case .error(let error) where error == .locked: + RetryView("Please unlock your iPhone.", action: loadServers) + case .error(let error) where error == .unactive: + RetryView("Could not connect to your iPhone.", action: loadServers) + case .error(let error) where error == .unreachable: + RetryView("Could not reach your iPhone.", action: loadServers) + case .error(let error) where error == .undecodable(error): + RetryView("Could not read workspaces from iPhone.", action: loadServers) + default: + RetryView("Unexpected error.", action: loadServers) + } + } + .navigationTitle { + Text("Workspaces").foregroundColor(.red) + } + .navigationBarTitleDisplayMode(.inline) + .navigationDestination(for: $router.server) { server in + LoggedInView(server: server) + .environmentObject(router) + } + .toolbar { + ToolbarItem(placement: .default) { + Button { + loadServers() + } label: { + refreshLabel + } + } + } + .onAppear { + loadServers() + } + } + + private func loadServers() { + state = .loading + + serversLoader.loadServers() + .receive(on: DispatchQueue.main) + .subscribe(Subscribers.Sink { completion in + if case .failure(let error) = completion { + state = .error(error) + } + } receiveValue: { _ in + state = .loaded + }) + } +} + +extension ServerListView { + enum ViewState { + case loading + case loaded + case error(ServersLoadingError) + } +} + +private extension Collection where Element == Server { + func sort() -> [Element] { + sorted { $0.host < $1.host } + } +} + +private extension Server { + var host: String { + url.host ?? "" + } +} diff --git a/ios/RocketChat Watch App/Views/ServerView.swift b/ios/RocketChat Watch App/Views/ServerView.swift new file mode 100644 index 000000000..274bab1f5 --- /dev/null +++ b/ios/RocketChat Watch App/Views/ServerView.swift @@ -0,0 +1,16 @@ +import SwiftUI + +struct ServerView: View { + @ObservedObject var server: Server + + var body: some View { + VStack(alignment: .leading) { + Text(server.name) + .font(.caption.bold()) + .foregroundStyle(Color.titleLabels) + Text(server.url.host ?? "") + .font(.caption) + .foregroundStyle(Color.default) + } + } +} diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index f24cb9212..e6ef83461 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -19,6 +19,10 @@ 1E01C82D2511337700FEF824 /* RoomKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E01C82C2511337700FEF824 /* RoomKey.swift */; }; 1E0426E6251A5467008F022C /* RoomType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E0426E5251A5467008F022C /* RoomType.swift */; }; 1E0426E7251A54B4008F022C /* RoomType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E0426E5251A5467008F022C /* RoomType.swift */; }; + 1E044F992B92798E00BCA2FD /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1E044F982B92798E00BCA2FD /* Localizable.xcstrings */; }; + 1E044F9A2B92798E00BCA2FD /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 1E044F982B92798E00BCA2FD /* Localizable.xcstrings */; }; + 1E06561B2B7E91FB0081B01F /* ErrorActionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E06561A2B7E91FB0081B01F /* ErrorActionHandler.swift */; }; + 1E06561D2B7E9C1C0081B01F /* MessageActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E06561C2B7E9C1C0081B01F /* MessageActionView.swift */; }; 1E068CFE24FD2DC700A0FFC1 /* AppGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E068CFD24FD2DC700A0FFC1 /* AppGroup.swift */; }; 1E068CFF24FD2DC700A0FFC1 /* AppGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E068CFD24FD2DC700A0FFC1 /* AppGroup.swift */; }; 1E068D0124FD2E0500A0FFC1 /* AppGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E068D0024FD2E0500A0FFC1 /* AppGroup.m */; }; @@ -34,18 +38,86 @@ 1E1EA8182326CD4B00E22452 /* libc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E1EA8172326CD4B00E22452 /* libc.tbd */; }; 1E1EA81A2326CD5100E22452 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E1EA8192326CD5100E22452 /* libsqlite3.tbd */; }; 1E25743422CBA2CF005A877F /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */; }; + 1E29A2CC2B5857F50093C03C /* RoomListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2CB2B5857F50093C03C /* RoomListView.swift */; }; + 1E29A2D02B58582F0093C03C /* RoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2CF2B58582F0093C03C /* RoomView.swift */; }; + 1E29A2EF2B585B070093C03C /* RocketChatClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D22B585B070093C03C /* RocketChatClient.swift */; }; + 1E29A2F02B585B070093C03C /* AttachmentResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D42B585B070093C03C /* AttachmentResponse.swift */; }; + 1E29A2F12B585B070093C03C /* SendMessageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D52B585B070093C03C /* SendMessageResponse.swift */; }; + 1E29A2F22B585B070093C03C /* HistoryResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D62B585B070093C03C /* HistoryResponse.swift */; }; + 1E29A2F32B585B070093C03C /* MessagesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D72B585B070093C03C /* MessagesResponse.swift */; }; + 1E29A2F42B585B070093C03C /* SubscriptionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D82B585B070093C03C /* SubscriptionsResponse.swift */; }; + 1E29A2F52B585B070093C03C /* RoomsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D92B585B070093C03C /* RoomsResponse.swift */; }; + 1E29A2F62B585B070093C03C /* UserResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DA2B585B070093C03C /* UserResponse.swift */; }; + 1E29A2F72B585B070093C03C /* ReadResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DB2B585B070093C03C /* ReadResponse.swift */; }; + 1E29A2F82B585B070093C03C /* MessageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DC2B585B070093C03C /* MessageResponse.swift */; }; + 1E29A2F92B585B070093C03C /* SubscriptionsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DE2B585B070093C03C /* SubscriptionsRequest.swift */; }; + 1E29A2FA2B585B070093C03C /* HistoryRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DF2B585B070093C03C /* HistoryRequest.swift */; }; + 1E29A2FB2B585B070093C03C /* MessagesRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E02B585B070093C03C /* MessagesRequest.swift */; }; + 1E29A2FC2B585B070093C03C /* SendMessageRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E12B585B070093C03C /* SendMessageRequest.swift */; }; + 1E29A2FD2B585B070093C03C /* RoomsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E22B585B070093C03C /* RoomsRequest.swift */; }; + 1E29A2FE2B585B070093C03C /* ReadRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E32B585B070093C03C /* ReadRequest.swift */; }; + 1E29A2FF2B585B070093C03C /* TokenAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E52B585B070093C03C /* TokenAdapter.swift */; }; + 1E29A3002B585B070093C03C /* JSONAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E62B585B070093C03C /* JSONAdapter.swift */; }; + 1E29A3012B585B070093C03C /* RequestAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E72B585B070093C03C /* RequestAdapter.swift */; }; + 1E29A3022B585B070093C03C /* DateCodingStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E82B585B070093C03C /* DateCodingStrategy.swift */; }; + 1E29A3032B585B070093C03C /* FailableDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E92B585B070093C03C /* FailableDecodable.swift */; }; + 1E29A3042B585B070093C03C /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2EB2B585B070093C03C /* HTTPMethod.swift */; }; + 1E29A3052B585B070093C03C /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2EC2B585B070093C03C /* Request.swift */; }; + 1E29A3072B585B070093C03C /* RocketChatError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2EE2B585B070093C03C /* RocketChatError.swift */; }; + 1E29A30A2B585B370093C03C /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3092B585B370093C03C /* Data+Extensions.swift */; }; + 1E29A30C2B585D1D0093C03C /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A30B2B585D1D0093C03C /* String+Extensions.swift */; }; + 1E29A30E2B58608C0093C03C /* LoggedUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A30D2B58608C0093C03C /* LoggedUser.swift */; }; + 1E29A3102B5865B80093C03C /* RoomViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A30F2B5865B80093C03C /* RoomViewModel.swift */; }; + 1E29A3122B5866090093C03C /* Room.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3112B5866090093C03C /* Room.swift */; }; + 1E29A3162B5868DF0093C03C /* MessageListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3152B5868DF0093C03C /* MessageListView.swift */; }; + 1E29A3182B5868E50093C03C /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3172B5868E50093C03C /* MessageView.swift */; }; + 1E29A31A2B5868EE0093C03C /* MessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3192B5868EE0093C03C /* MessageViewModel.swift */; }; + 1E29A31D2B5871B60093C03C /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A31C2B5871B60093C03C /* Date+Extensions.swift */; }; + 1E29A3202B5871C80093C03C /* RoomFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A31F2B5871C80093C03C /* RoomFormatter.swift */; }; + 1E29A3222B5871CE0093C03C /* MessageFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3212B5871CE0093C03C /* MessageFormatter.swift */; }; + 1E29A3242B5874FF0093C03C /* MessageComposerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3232B5874FF0093C03C /* MessageComposerView.swift */; }; 1E2F615B25128F9A00871711 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E2F615A25128F9A00871711 /* API.swift */; }; 1E2F615D25128FA300871711 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E2F615C25128FA300871711 /* Response.swift */; }; 1E2F61642512955D00871711 /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E2F61632512955D00871711 /* HTTPMethod.swift */; }; 1E2F61662512958900871711 /* Push.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E2F61652512958900871711 /* Push.swift */; }; + 1E388ABE2B934C64006FBDB0 /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E388ABD2B934C64006FBDB0 /* ImageLoader.swift */; }; + 1E388ABF2B934C64006FBDB0 /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E388ABD2B934C64006FBDB0 /* ImageLoader.swift */; }; + 1E388AC12B934CD4006FBDB0 /* RemoteImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E388AC02B934CD4006FBDB0 /* RemoteImage.swift */; }; + 1E388AC22B934CD4006FBDB0 /* RemoteImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E388AC02B934CD4006FBDB0 /* RemoteImage.swift */; }; 1E470E832513A71E00E3DD1D /* RocketChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E470E822513A71E00E3DD1D /* RocketChat.swift */; }; + 1E4AFC152B5AF09800E2AA7D /* Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC142B5AF09800E2AA7D /* Dependency.swift */; }; + 1E4AFC172B5AF09C00E2AA7D /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC162B5AF09C00E2AA7D /* Store.swift */; }; + 1E4AFC212B5B1AA000E2AA7D /* AppView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC202B5B1AA000E2AA7D /* AppView.swift */; }; + 1E4AFC272B5B23C600E2AA7D /* RetryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC262B5B23C600E2AA7D /* RetryView.swift */; }; + 1E5141182B856673007BE94A /* SSLPinning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E5141172B856673007BE94A /* SSLPinning.swift */; }; + 1E5141192B856673007BE94A /* SSLPinning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E5141172B856673007BE94A /* SSLPinning.swift */; }; + 1E51411C2B85683C007BE94A /* SSLPinning.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E51411B2B85683C007BE94A /* SSLPinning.m */; }; + 1E51411D2B85683C007BE94A /* SSLPinning.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E51411B2B85683C007BE94A /* SSLPinning.m */; }; 1E51D962251263CD00DC95DE /* MessageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E51D961251263CD00DC95DE /* MessageType.swift */; }; 1E51D965251263D600DC95DE /* NotificationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E51D964251263D600DC95DE /* NotificationType.swift */; }; + 1E54BA1A2BC9E7100073903D /* MergedRoom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E54BA182BC9E6D60073903D /* MergedRoom.swift */; }; + 1E54BA1B2BC9E7110073903D /* MergedRoom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E54BA182BC9E6D60073903D /* MergedRoom.swift */; }; + 1E54BA1D2BC9E8030073903D /* MessageMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E54BA1C2BC9E8030073903D /* MessageMapper.swift */; }; + 1E54BA1E2BC9E8030073903D /* MessageMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E54BA1C2BC9E8030073903D /* MessageMapper.swift */; }; + 1E54BA202BC9E9B60073903D /* MergedRoomMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E54BA1F2BC9E9B60073903D /* MergedRoomMapper.swift */; }; + 1E54BA212BC9E9B60073903D /* MergedRoomMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E54BA1F2BC9E9B60073903D /* MergedRoomMapper.swift */; }; 1E598AE42515057D002BDFBD /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E598AE32515057D002BDFBD /* Date+Extensions.swift */; }; 1E598AE725150660002BDFBD /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E598AE625150660002BDFBD /* Data+Extensions.swift */; }; 1E598AE925151A63002BDFBD /* SendMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E598AE825151A63002BDFBD /* SendMessage.swift */; }; + 1E638E992B5F0A2900E645E4 /* ChatScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E638E982B5F0A2900E645E4 /* ChatScrollView.swift */; }; + 1E638E9E2B5F0F5800E645E4 /* URL+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E638E9D2B5F0F5800E645E4 /* URL+Extensions.swift */; }; 1E67380424DC529B0009E081 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E67380324DC529B0009E081 /* String+Extensions.swift */; }; + 1E675B722BAC49B000438590 /* Color+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E675B712BAC49B000438590 /* Color+Extensions.swift */; }; + 1E675B732BAC49B000438590 /* Color+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E675B712BAC49B000438590 /* Color+Extensions.swift */; }; 1E680ED92512990700C9257A /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E680ED82512990700C9257A /* Request.swift */; }; + 1E6BA5C62BD13DEA00B16A18 /* RoomModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C22BD13DEA00B16A18 /* RoomModel.swift */; }; + 1E6BA5C72BD13DEA00B16A18 /* RoomModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C22BD13DEA00B16A18 /* RoomModel.swift */; }; + 1E6BA5C82BD13DEA00B16A18 /* MessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C32BD13DEA00B16A18 /* MessageModel.swift */; }; + 1E6BA5C92BD13DEA00B16A18 /* MessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C32BD13DEA00B16A18 /* MessageModel.swift */; }; + 1E6BA5CA2BD13DEA00B16A18 /* AttachmentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C42BD13DEA00B16A18 /* AttachmentModel.swift */; }; + 1E6BA5CB2BD13DEA00B16A18 /* AttachmentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C42BD13DEA00B16A18 /* AttachmentModel.swift */; }; + 1E6BA5CC2BD13DEA00B16A18 /* UserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C52BD13DEA00B16A18 /* UserModel.swift */; }; + 1E6BA5CD2BD13DEA00B16A18 /* UserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6BA5C52BD13DEA00B16A18 /* UserModel.swift */; }; 1E6CC61F2513DBF400965591 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A006F13229C83B600803143 /* GoogleService-Info.plist */; }; 1E76CBC2251529560067298C /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB8EF712510F1EE00F352B7 /* Storage.swift */; }; 1E76CBC325152A460067298C /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E67380324DC529B0009E081 /* String+Extensions.swift */; }; @@ -69,12 +141,144 @@ 1E76CBD825152C870067298C /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E680ED82512990700C9257A /* Request.swift */; }; 1E76CBD925152C8C0067298C /* Push.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E2F61652512958900871711 /* Push.swift */; }; 1E76CBDA25152C8E0067298C /* SendMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E598AE825151A63002BDFBD /* SendMessage.swift */; }; + 1E8979472B6063FC001D99F0 /* WatchSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8979462B6063FC001D99F0 /* WatchSession.swift */; }; + 1E9A71692B59B6E100477BA2 /* MessageSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71682B59B6E100477BA2 /* MessageSender.swift */; }; + 1E9A716F2B59CBCA00477BA2 /* AttachmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A716E2B59CBCA00477BA2 /* AttachmentView.swift */; }; + 1E9A71712B59CC1300477BA2 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71702B59CC1300477BA2 /* Attachment.swift */; }; + 1E9A71742B59F36E00477BA2 /* ClientSSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71722B59F34E00477BA2 /* ClientSSL.swift */; }; + 1E9A71752B59F36E00477BA2 /* ClientSSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71722B59F34E00477BA2 /* ClientSSL.swift */; }; + 1E9A71772B59FCA900477BA2 /* URLSessionCertificateHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71762B59FCA900477BA2 /* URLSessionCertificateHandling.swift */; }; + 1EB375892B55DBFB00AEC3D7 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB375882B55DBFB00AEC3D7 /* Server.swift */; }; 1EB8EF722510F1EE00F352B7 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB8EF712510F1EE00F352B7 /* Storage.swift */; }; + 1EC687BA2BA0FF0D00C7BAAD /* MessageInfoMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EC687B82BA0FECC00C7BAAD /* MessageInfoMapper.swift */; }; + 1EC687BB2BA0FF0D00C7BAAD /* MessageInfoMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EC687B82BA0FECC00C7BAAD /* MessageInfoMapper.swift */; }; 1EC6ACB722CB9FC300A41C61 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1EC6ACB522CB9FC300A41C61 /* MainInterface.storyboard */; }; 1EC6ACBB22CB9FC300A41C61 /* ShareRocketChatRN.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 1EC6ACF622CBA01500A41C61 /* ShareRocketChatRN.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EC6ACF522CBA01500A41C61 /* ShareRocketChatRN.m */; }; 1ED00BB12513E04400A1331F /* ReplyNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED00BB02513E04400A1331F /* ReplyNotification.swift */; }; + 1ED033AE2B55B1CC004F4930 /* Default.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033AC2B55B1CC004F4930 /* Default.xcdatamodeld */; }; + 1ED033B02B55B25A004F4930 /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033AF2B55B25A004F4930 /* Database.swift */; }; + 1ED033B62B55B4A5004F4930 /* ServerListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033B52B55B4A5004F4930 /* ServerListView.swift */; }; + 1ED033BA2B55B5F6004F4930 /* ServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033B92B55B5F6004F4930 /* ServerView.swift */; }; + 1ED033BF2B55BF94004F4930 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033BE2B55BF94004F4930 /* Storage.swift */; }; + 1ED033C42B55C65C004F4930 /* AppRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033C32B55C65C004F4930 /* AppRouter.swift */; }; + 1ED033CB2B55D4F0004F4930 /* RocketChat.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033C92B55D4F0004F4930 /* RocketChat.xcdatamodeld */; }; + 1ED033CD2B55D671004F4930 /* RocketChatDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033CC2B55D671004F4930 /* RocketChatDatabase.swift */; }; + 1ED038912B507B4C00C007D4 /* RocketChatApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038902B507B4C00C007D4 /* RocketChatApp.swift */; }; + 1ED038952B507B4D00C007D4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1ED038942B507B4D00C007D4 /* Assets.xcassets */; }; + 1ED038982B507B4D00C007D4 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1ED038972B507B4D00C007D4 /* Preview Assets.xcassets */; }; + 1ED038A12B508FE700C007D4 /* FileManager+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */; }; + 1ED038A22B508FE700C007D4 /* FileManager+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */; }; + 1ED038A32B508FE700C007D4 /* FileManager+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */; }; + 1ED038A52B50900800C007D4 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */; }; + 1ED038A62B50900800C007D4 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */; }; + 1ED038A72B50900800C007D4 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */; }; + 1ED038A92B5090AD00C007D4 /* MMKV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A82B5090AD00C007D4 /* MMKV.swift */; }; + 1ED038AA2B5090AD00C007D4 /* MMKV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A82B5090AD00C007D4 /* MMKV.swift */; }; + 1ED038AB2B5090AD00C007D4 /* MMKV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038A82B5090AD00C007D4 /* MMKV.swift */; }; + 1ED038AD2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */; }; + 1ED038AE2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */; }; + 1ED038AF2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */; }; + 1ED038BA2B50A1B800C007D4 /* WatchConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */; }; + 1ED038BB2B50A1B800C007D4 /* WatchConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */; }; + 1ED038BE2B50A1D400C007D4 /* DBServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038BD2B50A1D400C007D4 /* DBServer.swift */; }; + 1ED038BF2B50A1D400C007D4 /* DBServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038BD2B50A1D400C007D4 /* DBServer.swift */; }; + 1ED038C12B50A1E400C007D4 /* DBUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C02B50A1E400C007D4 /* DBUser.swift */; }; + 1ED038C22B50A1E400C007D4 /* DBUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C02B50A1E400C007D4 /* DBUser.swift */; }; + 1ED038C42B50A1F500C007D4 /* WatchMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C32B50A1F500C007D4 /* WatchMessage.swift */; }; + 1ED038C52B50A1F500C007D4 /* WatchMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C32B50A1F500C007D4 /* WatchMessage.swift */; }; + 1ED038C62B50A21800C007D4 /* WatchMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C32B50A1F500C007D4 /* WatchMessage.swift */; }; + 1ED038CA2B50A58400C007D4 /* ServersLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C92B50A58400C007D4 /* ServersLoader.swift */; }; + 1ED1EC892B867E2400F6620C /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED1EC882B867E2400F6620C /* ExtensionDelegate.swift */; }; + 1ED1EC902B86997F00F6620C /* MessageComposerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3232B5874FF0093C03C /* MessageComposerView.swift */; }; + 1ED1EC912B86997F00F6620C /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB375882B55DBFB00AEC3D7 /* Server.swift */; }; + 1ED1EC922B86997F00F6620C /* MessageActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E06561C2B7E9C1C0081B01F /* MessageActionView.swift */; }; + 1ED1EC932B86997F00F6620C /* MessageListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3152B5868DF0093C03C /* MessageListView.swift */; }; + 1ED1EC942B86997F00F6620C /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC162B5AF09C00E2AA7D /* Store.swift */; }; + 1ED1EC962B86997F00F6620C /* SubscriptionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D82B585B070093C03C /* SubscriptionsResponse.swift */; }; + 1ED1EC972B86997F00F6620C /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED1EC882B867E2400F6620C /* ExtensionDelegate.swift */; }; + 1ED1EC982B86997F00F6620C /* SubscriptionsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DE2B585B070093C03C /* SubscriptionsRequest.swift */; }; + 1ED1EC992B86997F00F6620C /* HistoryResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D62B585B070093C03C /* HistoryResponse.swift */; }; + 1ED1EC9A2B86997F00F6620C /* Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC142B5AF09800E2AA7D /* Dependency.swift */; }; + 1ED1EC9B2B86997F00F6620C /* ServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033B92B55B5F6004F4930 /* ServerView.swift */; }; + 1ED1EC9C2B86997F00F6620C /* RoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2CF2B58582F0093C03C /* RoomView.swift */; }; + 1ED1EC9D2B86997F00F6620C /* RoomsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E22B585B070093C03C /* RoomsRequest.swift */; }; + 1ED1EC9E2B86997F00F6620C /* ServersLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C92B50A58400C007D4 /* ServersLoader.swift */; }; + 1ED1EC9F2B86997F00F6620C /* MessageFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3212B5871CE0093C03C /* MessageFormatter.swift */; }; + 1ED1ECA02B86997F00F6620C /* AttachmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A716E2B59CBCA00477BA2 /* AttachmentView.swift */; }; + 1ED1ECA12B86997F00F6620C /* JSONAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E62B585B070093C03C /* JSONAdapter.swift */; }; + 1ED1ECA22B86997F00F6620C /* DateCodingStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E82B585B070093C03C /* DateCodingStrategy.swift */; }; + 1ED1ECA32B86997F00F6620C /* RetryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC262B5B23C600E2AA7D /* RetryView.swift */; }; + 1ED1ECA42B86997F00F6620C /* ServerListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033B52B55B4A5004F4930 /* ServerListView.swift */; }; + 1ED1ECA52B86997F00F6620C /* RoomFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A31F2B5871C80093C03C /* RoomFormatter.swift */; }; + 1ED1ECA62B86997F00F6620C /* MessagesLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDFD0F92B589B8F002FEE5F /* MessagesLoader.swift */; }; + 1ED1ECA72B86997F00F6620C /* RoomViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A30F2B5865B80093C03C /* RoomViewModel.swift */; }; + 1ED1ECA82B86997F00F6620C /* ErrorActionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E06561A2B7E91FB0081B01F /* ErrorActionHandler.swift */; }; + 1ED1ECA92B86997F00F6620C /* SendMessageRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E12B585B070093C03C /* SendMessageRequest.swift */; }; + 1ED1ECAA2B86997F00F6620C /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A30B2B585D1D0093C03C /* String+Extensions.swift */; }; + 1ED1ECAB2B86997F00F6620C /* RocketChatDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033CC2B55D671004F4930 /* RocketChatDatabase.swift */; }; + 1ED1ECAC2B86997F00F6620C /* Room.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3112B5866090093C03C /* Room.swift */; }; + 1ED1ECAD2B86997F00F6620C /* FailableDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E92B585B070093C03C /* FailableDecodable.swift */; }; + 1ED1ECAE2B86997F00F6620C /* WatchSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8979462B6063FC001D99F0 /* WatchSession.swift */; }; + 1ED1ECAF2B86997F00F6620C /* ReadRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E32B585B070093C03C /* ReadRequest.swift */; }; + 1ED1ECB02B86997F00F6620C /* MessageSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71682B59B6E100477BA2 /* MessageSender.swift */; }; + 1ED1ECB12B86997F00F6620C /* RocketChatError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2EE2B585B070093C03C /* RocketChatError.swift */; }; + 1ED1ECB22B86997F00F6620C /* RoomsLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDFD1072B58AA77002FEE5F /* RoomsLoader.swift */; }; + 1ED1ECB32B86997F00F6620C /* SendMessageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D52B585B070093C03C /* SendMessageResponse.swift */; }; + 1ED1ECB42B86997F00F6620C /* LoggedUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A30D2B58608C0093C03C /* LoggedUser.swift */; }; + 1ED1ECB52B86997F00F6620C /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3172B5868E50093C03C /* MessageView.swift */; }; + 1ED1ECB62B86997F00F6620C /* CancelBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDFD1052B58A66E002FEE5F /* CancelBag.swift */; }; + 1ED1ECB72B86997F00F6620C /* TokenAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E52B585B070093C03C /* TokenAdapter.swift */; }; + 1ED1ECB82B86997F00F6620C /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2EC2B585B070093C03C /* Request.swift */; }; + 1ED1ECB92B86997F00F6620C /* URLSessionCertificateHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71762B59FCA900477BA2 /* URLSessionCertificateHandling.swift */; }; + 1ED1ECBA2B86997F00F6620C /* RocketChatClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D22B585B070093C03C /* RocketChatClient.swift */; }; + 1ED1ECBB2B86997F00F6620C /* AppView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4AFC202B5B1AA000E2AA7D /* AppView.swift */; }; + 1ED1ECBC2B86997F00F6620C /* MessagesRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E02B585B070093C03C /* MessagesRequest.swift */; }; + 1ED1ECBD2B86997F00F6620C /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A31C2B5871B60093C03C /* Date+Extensions.swift */; }; + 1ED1ECBE2B86997F00F6620C /* UserResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DA2B585B070093C03C /* UserResponse.swift */; }; + 1ED1ECBF2B86997F00F6620C /* Default.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033AC2B55B1CC004F4930 /* Default.xcdatamodeld */; }; + 1ED1ECC02B86997F00F6620C /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033BE2B55BF94004F4930 /* Storage.swift */; }; + 1ED1ECC12B86997F00F6620C /* MessageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DC2B585B070093C03C /* MessageResponse.swift */; }; + 1ED1ECC22B86997F00F6620C /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2EB2B585B070093C03C /* HTTPMethod.swift */; }; + 1ED1ECC32B86997F00F6620C /* RequestAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2E72B585B070093C03C /* RequestAdapter.swift */; }; + 1ED1ECC42B86997F00F6620C /* RoomsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D92B585B070093C03C /* RoomsResponse.swift */; }; + 1ED1ECC52B86997F00F6620C /* LoggedInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDB30F12B5B453A00532C7E /* LoggedInView.swift */; }; + 1ED1ECC62B86997F00F6620C /* MessagesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D72B585B070093C03C /* MessagesResponse.swift */; }; + 1ED1ECC72B86997F00F6620C /* HistoryRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DF2B585B070093C03C /* HistoryRequest.swift */; }; + 1ED1ECC82B86997F00F6620C /* WatchMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038C32B50A1F500C007D4 /* WatchMessage.swift */; }; + 1ED1ECC92B86997F00F6620C /* AttachmentResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2D42B585B070093C03C /* AttachmentResponse.swift */; }; + 1ED1ECCA2B86997F00F6620C /* URL+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E638E9D2B5F0F5800E645E4 /* URL+Extensions.swift */; }; + 1ED1ECCB2B86997F00F6620C /* RocketChatApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED038902B507B4C00C007D4 /* RocketChatApp.swift */; }; + 1ED1ECCC2B86997F00F6620C /* RoomListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2CB2B5857F50093C03C /* RoomListView.swift */; }; + 1ED1ECCD2B86997F00F6620C /* MessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3192B5868EE0093C03C /* MessageViewModel.swift */; }; + 1ED1ECCE2B86997F00F6620C /* ChatScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E638E982B5F0A2900E645E4 /* ChatScrollView.swift */; }; + 1ED1ECCF2B86997F00F6620C /* AppRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033C32B55C65C004F4930 /* AppRouter.swift */; }; + 1ED1ECD02B86997F00F6620C /* Database.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033AF2B55B25A004F4930 /* Database.swift */; }; + 1ED1ECD12B86997F00F6620C /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9A71702B59CC1300477BA2 /* Attachment.swift */; }; + 1ED1ECD22B86997F00F6620C /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A3092B585B370093C03C /* Data+Extensions.swift */; }; + 1ED1ECD32B86997F00F6620C /* ReadResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E29A2DB2B585B070093C03C /* ReadResponse.swift */; }; + 1ED1ECD42B86997F00F6620C /* RocketChat.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1ED033C92B55D4F0004F4930 /* RocketChat.xcdatamodeld */; }; + 1ED1ECD72B86997F00F6620C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1ED038972B507B4D00C007D4 /* Preview Assets.xcassets */; }; + 1ED1ECD82B86997F00F6620C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1ED038942B507B4D00C007D4 /* Assets.xcassets */; }; + 1ED1ECE42B8699E900F6620C /* Rocket.Chat Watch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 1ED0388E2B507B4B00C007D4 /* Rocket.Chat Watch.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 1ED1ECE72B8699ED00F6620C /* Rocket.Chat Experimental Watch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 1ED1ECDD2B86997F00F6620C /* Rocket.Chat Experimental Watch.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 1ED1ECEA2B869A4A00F6620C /* Official.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A14FCF3257FEB59005BDCD4 /* Official.xcassets */; }; + 1ED1ECEC2B869B1300F6620C /* Experimental.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A14FCEC257FEB3A005BDCD4 /* Experimental.xcassets */; }; 1ED59D4C22CBA77D00C54289 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1ED59D4B22CBA77D00C54289 /* GoogleService-Info.plist */; }; + 1EDB30F22B5B453A00532C7E /* LoggedInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDB30F12B5B453A00532C7E /* LoggedInView.swift */; }; + 1EDFD0FA2B589B8F002FEE5F /* MessagesLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDFD0F92B589B8F002FEE5F /* MessagesLoader.swift */; }; + 1EDFD1062B58A66E002FEE5F /* CancelBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDFD1052B58A66E002FEE5F /* CancelBag.swift */; }; + 1EDFD1082B58AA77002FEE5F /* RoomsLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDFD1072B58AA77002FEE5F /* RoomsLoader.swift */; }; + 1EE096FA2BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE096F92BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift */; }; + 1EE096FB2BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE096F92BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift */; }; + 1EE096FD2BACD58300780078 /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE096FC2BACD58300780078 /* LazyView.swift */; }; + 1EE096FE2BACD58300780078 /* LazyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE096FC2BACD58300780078 /* LazyView.swift */; }; + 1EE097002BACD64C00780078 /* Binding+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE096FF2BACD64C00780078 /* Binding+Extensions.swift */; }; + 1EE097012BACD64C00780078 /* Binding+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE096FF2BACD64C00780078 /* Binding+Extensions.swift */; }; + 1EE097032BACD66900780078 /* NavigationStackModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE097022BACD66900780078 /* NavigationStackModifier.swift */; }; + 1EE097042BACD66900780078 /* NavigationStackModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE097022BACD66900780078 /* NavigationStackModifier.swift */; }; + 1EED2D332BC1E09500832666 /* RoomInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EED2D322BC1E09500832666 /* RoomInfoView.swift */; }; + 1EED2D342BC1E09500832666 /* RoomInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EED2D322BC1E09500832666 /* RoomInfoView.swift */; }; 1EF5FBD1250C109E00614FEA /* Encryption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EF5FBD0250C109E00614FEA /* Encryption.swift */; }; 1EFEB5982493B6640072EDC0 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFEB5972493B6640072EDC0 /* NotificationService.swift */; }; 1EFEB59C2493B6640072EDC0 /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EFEB5952493B6640072EDC0 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -159,6 +363,20 @@ remoteGlobalIDString = 1EC6ACAF22CB9FC300A41C61; remoteInfo = ShareRocketChatRN; }; + 1ED1ECE52B8699E900F6620C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1ED0388D2B507B4B00C007D4; + remoteInfo = Rocket.Chat.Watch; + }; + 1EE79C542B8912F600CF1863 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1ED1EC8E2B86997F00F6620C; + remoteInfo = "RocketChatRN Watch"; + }; 1EFEB59A2493B6640072EDC0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; @@ -195,6 +413,28 @@ name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; + 1ED0389C2B507B4F00C007D4 /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 1ED1ECE72B8699ED00F6620C /* Rocket.Chat Experimental Watch.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1ED1ECE32B8699DD00F6620C /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 1ED1ECE42B8699E900F6620C /* Rocket.Chat Watch.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; 7AAB3E48257E6A6E00707CF6 /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -227,6 +467,9 @@ 1E01C82A2511335A00FEF824 /* Message.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = ""; }; 1E01C82C2511337700FEF824 /* RoomKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomKey.swift; sourceTree = ""; }; 1E0426E5251A5467008F022C /* RoomType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomType.swift; sourceTree = ""; }; + 1E044F982B92798E00BCA2FD /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 1E06561A2B7E91FB0081B01F /* ErrorActionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorActionHandler.swift; sourceTree = ""; }; + 1E06561C2B7E9C1C0081B01F /* MessageActionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActionView.swift; sourceTree = ""; }; 1E068CFD24FD2DC700A0FFC1 /* AppGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppGroup.swift; sourceTree = ""; }; 1E068D0024FD2E0500A0FFC1 /* AppGroup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppGroup.m; sourceTree = ""; }; 1E1C2F7F250FCB69005DCE7D /* Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = ""; }; @@ -239,27 +482,123 @@ 1E1EA8152326CD4500E22452 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; 1E1EA8172326CD4B00E22452 /* libc.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libc.tbd; path = usr/lib/libc.tbd; sourceTree = SDKROOT; }; 1E1EA8192326CD5100E22452 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 1E29A2CB2B5857F50093C03C /* RoomListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomListView.swift; sourceTree = ""; }; + 1E29A2CF2B58582F0093C03C /* RoomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomView.swift; sourceTree = ""; }; + 1E29A2D22B585B070093C03C /* RocketChatClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RocketChatClient.swift; sourceTree = ""; }; + 1E29A2D42B585B070093C03C /* AttachmentResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttachmentResponse.swift; sourceTree = ""; }; + 1E29A2D52B585B070093C03C /* SendMessageResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMessageResponse.swift; sourceTree = ""; }; + 1E29A2D62B585B070093C03C /* HistoryResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HistoryResponse.swift; sourceTree = ""; }; + 1E29A2D72B585B070093C03C /* MessagesResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesResponse.swift; sourceTree = ""; }; + 1E29A2D82B585B070093C03C /* SubscriptionsResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscriptionsResponse.swift; sourceTree = ""; }; + 1E29A2D92B585B070093C03C /* RoomsResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsResponse.swift; sourceTree = ""; }; + 1E29A2DA2B585B070093C03C /* UserResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserResponse.swift; sourceTree = ""; }; + 1E29A2DB2B585B070093C03C /* ReadResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadResponse.swift; sourceTree = ""; }; + 1E29A2DC2B585B070093C03C /* MessageResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageResponse.swift; sourceTree = ""; }; + 1E29A2DE2B585B070093C03C /* SubscriptionsRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscriptionsRequest.swift; sourceTree = ""; }; + 1E29A2DF2B585B070093C03C /* HistoryRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HistoryRequest.swift; sourceTree = ""; }; + 1E29A2E02B585B070093C03C /* MessagesRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagesRequest.swift; sourceTree = ""; }; + 1E29A2E12B585B070093C03C /* SendMessageRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMessageRequest.swift; sourceTree = ""; }; + 1E29A2E22B585B070093C03C /* RoomsRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomsRequest.swift; sourceTree = ""; }; + 1E29A2E32B585B070093C03C /* ReadRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadRequest.swift; sourceTree = ""; }; + 1E29A2E52B585B070093C03C /* TokenAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenAdapter.swift; sourceTree = ""; }; + 1E29A2E62B585B070093C03C /* JSONAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONAdapter.swift; sourceTree = ""; }; + 1E29A2E72B585B070093C03C /* RequestAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestAdapter.swift; sourceTree = ""; }; + 1E29A2E82B585B070093C03C /* DateCodingStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateCodingStrategy.swift; sourceTree = ""; }; + 1E29A2E92B585B070093C03C /* FailableDecodable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailableDecodable.swift; sourceTree = ""; }; + 1E29A2EB2B585B070093C03C /* HTTPMethod.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPMethod.swift; sourceTree = ""; }; + 1E29A2EC2B585B070093C03C /* Request.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = ""; }; + 1E29A2EE2B585B070093C03C /* RocketChatError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RocketChatError.swift; sourceTree = ""; }; + 1E29A3092B585B370093C03C /* Data+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = ""; }; + 1E29A30B2B585D1D0093C03C /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; + 1E29A30D2B58608C0093C03C /* LoggedUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedUser.swift; sourceTree = ""; }; + 1E29A30F2B5865B80093C03C /* RoomViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomViewModel.swift; sourceTree = ""; }; + 1E29A3112B5866090093C03C /* Room.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Room.swift; sourceTree = ""; }; + 1E29A3152B5868DF0093C03C /* MessageListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageListView.swift; sourceTree = ""; }; + 1E29A3172B5868E50093C03C /* MessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageView.swift; sourceTree = ""; }; + 1E29A3192B5868EE0093C03C /* MessageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewModel.swift; sourceTree = ""; }; + 1E29A31C2B5871B60093C03C /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; }; + 1E29A31F2B5871C80093C03C /* RoomFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomFormatter.swift; sourceTree = ""; }; + 1E29A3212B5871CE0093C03C /* MessageFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageFormatter.swift; sourceTree = ""; }; + 1E29A3232B5874FF0093C03C /* MessageComposerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageComposerView.swift; sourceTree = ""; }; 1E2F615A25128F9A00871711 /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 1E2F615C25128FA300871711 /* Response.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Response.swift; sourceTree = ""; }; 1E2F61632512955D00871711 /* HTTPMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPMethod.swift; sourceTree = ""; }; 1E2F61652512958900871711 /* Push.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Push.swift; sourceTree = ""; }; + 1E388ABD2B934C64006FBDB0 /* ImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageLoader.swift; sourceTree = ""; }; + 1E388AC02B934CD4006FBDB0 /* RemoteImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImage.swift; sourceTree = ""; }; 1E470E822513A71E00E3DD1D /* RocketChat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RocketChat.swift; sourceTree = ""; }; + 1E4AFC142B5AF09800E2AA7D /* Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dependency.swift; sourceTree = ""; }; + 1E4AFC162B5AF09C00E2AA7D /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; }; + 1E4AFC202B5B1AA000E2AA7D /* AppView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppView.swift; sourceTree = ""; }; + 1E4AFC262B5B23C600E2AA7D /* RetryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryView.swift; sourceTree = ""; }; + 1E5141172B856673007BE94A /* SSLPinning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSLPinning.swift; sourceTree = ""; }; + 1E51411B2B85683C007BE94A /* SSLPinning.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SSLPinning.m; sourceTree = ""; }; 1E51D961251263CD00DC95DE /* MessageType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageType.swift; sourceTree = ""; }; 1E51D964251263D600DC95DE /* NotificationType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationType.swift; sourceTree = ""; }; + 1E54BA182BC9E6D60073903D /* MergedRoom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MergedRoom.swift; sourceTree = ""; }; + 1E54BA1C2BC9E8030073903D /* MessageMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageMapper.swift; sourceTree = ""; }; + 1E54BA1F2BC9E9B60073903D /* MergedRoomMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MergedRoomMapper.swift; sourceTree = ""; }; 1E598AE32515057D002BDFBD /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; }; 1E598AE625150660002BDFBD /* Data+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = ""; }; 1E598AE825151A63002BDFBD /* SendMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendMessage.swift; sourceTree = ""; }; + 1E638E982B5F0A2900E645E4 /* ChatScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatScrollView.swift; sourceTree = ""; }; + 1E638E9D2B5F0F5800E645E4 /* URL+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Extensions.swift"; sourceTree = ""; }; 1E6737FF24DC52660009E081 /* NotificationService-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NotificationService-Bridging-Header.h"; sourceTree = ""; }; 1E67380324DC529B0009E081 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; + 1E675B712BAC49B000438590 /* Color+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extensions.swift"; sourceTree = ""; }; 1E680ED82512990700C9257A /* Request.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = ""; }; + 1E6BA5C22BD13DEA00B16A18 /* RoomModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomModel.swift; sourceTree = ""; }; + 1E6BA5C32BD13DEA00B16A18 /* MessageModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageModel.swift; sourceTree = ""; }; + 1E6BA5C42BD13DEA00B16A18 /* AttachmentModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttachmentModel.swift; sourceTree = ""; }; + 1E6BA5C52BD13DEA00B16A18 /* UserModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserModel.swift; sourceTree = ""; }; + 1E8979462B6063FC001D99F0 /* WatchSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchSession.swift; sourceTree = ""; }; + 1E9A71682B59B6E100477BA2 /* MessageSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageSender.swift; sourceTree = ""; }; + 1E9A716E2B59CBCA00477BA2 /* AttachmentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentView.swift; sourceTree = ""; }; + 1E9A71702B59CC1300477BA2 /* Attachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Attachment.swift; sourceTree = ""; }; + 1E9A71722B59F34E00477BA2 /* ClientSSL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientSSL.swift; sourceTree = ""; }; + 1E9A71762B59FCA900477BA2 /* URLSessionCertificateHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionCertificateHandling.swift; sourceTree = ""; }; + 1EB375882B55DBFB00AEC3D7 /* Server.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Server.swift; sourceTree = ""; }; 1EB8EF712510F1EE00F352B7 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; + 1EC687B82BA0FECC00C7BAAD /* MessageInfoMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageInfoMapper.swift; sourceTree = ""; }; 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ShareRocketChatRN.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 1EC6ACB622CB9FC300A41C61 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; 1EC6ACB822CB9FC300A41C61 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1EC6ACF522CBA01500A41C61 /* ShareRocketChatRN.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShareRocketChatRN.m; sourceTree = ""; }; 1EC6AD6022CBA20C00A41C61 /* ShareRocketChatRN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShareRocketChatRN.entitlements; sourceTree = ""; }; 1ED00BB02513E04400A1331F /* ReplyNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyNotification.swift; sourceTree = ""; }; + 1ED033AD2B55B1CC004F4930 /* Default.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Default.xcdatamodel; sourceTree = ""; }; + 1ED033AF2B55B25A004F4930 /* Database.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Database.swift; sourceTree = ""; }; + 1ED033B52B55B4A5004F4930 /* ServerListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerListView.swift; sourceTree = ""; }; + 1ED033B92B55B5F6004F4930 /* ServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerView.swift; sourceTree = ""; }; + 1ED033BE2B55BF94004F4930 /* Storage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = ""; }; + 1ED033C32B55C65C004F4930 /* AppRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRouter.swift; sourceTree = ""; }; + 1ED033CA2B55D4F0004F4930 /* RocketChat.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = RocketChat.xcdatamodel; sourceTree = ""; }; + 1ED033CC2B55D671004F4930 /* RocketChatDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RocketChatDatabase.swift; sourceTree = ""; }; + 1ED0388E2B507B4B00C007D4 /* Rocket.Chat Watch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Rocket.Chat Watch.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1ED038902B507B4C00C007D4 /* RocketChatApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RocketChatApp.swift; sourceTree = ""; }; + 1ED038942B507B4D00C007D4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1ED038972B507B4D00C007D4 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileManager+Extensions.swift"; sourceTree = ""; }; + 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Extensions.swift"; sourceTree = ""; }; + 1ED038A82B5090AD00C007D4 /* MMKV.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MMKV.swift; sourceTree = ""; }; + 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WatermelonDB+Extensions.swift"; sourceTree = ""; }; + 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchConnection.swift; sourceTree = ""; }; + 1ED038BD2B50A1D400C007D4 /* DBServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DBServer.swift; sourceTree = ""; }; + 1ED038C02B50A1E400C007D4 /* DBUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DBUser.swift; sourceTree = ""; }; + 1ED038C32B50A1F500C007D4 /* WatchMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchMessage.swift; sourceTree = ""; }; + 1ED038C92B50A58400C007D4 /* ServersLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServersLoader.swift; sourceTree = ""; }; + 1ED1EC882B867E2400F6620C /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; + 1ED1ECDD2B86997F00F6620C /* Rocket.Chat Experimental Watch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Rocket.Chat Experimental Watch.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 1ED59D4B22CBA77D00C54289 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; }; + 1EDB30F12B5B453A00532C7E /* LoggedInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedInView.swift; sourceTree = ""; }; + 1EDFD0F92B589B8F002FEE5F /* MessagesLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesLoader.swift; sourceTree = ""; }; + 1EDFD1052B58A66E002FEE5F /* CancelBag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancelBag.swift; sourceTree = ""; }; + 1EDFD1072B58AA77002FEE5F /* RoomsLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomsLoader.swift; sourceTree = ""; }; + 1EE096F92BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ToolbarItemPlacement+Extensions.swift"; sourceTree = ""; }; + 1EE096FC2BACD58300780078 /* LazyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyView.swift; sourceTree = ""; }; + 1EE096FF2BACD64C00780078 /* Binding+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Binding+Extensions.swift"; sourceTree = ""; }; + 1EE097022BACD66900780078 /* NavigationStackModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationStackModifier.swift; sourceTree = ""; }; + 1EED2D322BC1E09500832666 /* RoomInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomInfoView.swift; sourceTree = ""; }; 1EF5FBD0250C109E00614FEA /* Encryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Encryption.swift; sourceTree = ""; }; 1EFEB5952493B6640072EDC0 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 1EFEB5972493B6640072EDC0 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; @@ -326,6 +665,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1ED0388B2B507B4B00C007D4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1ED1ECD52B86997F00F6620C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1EFEB5922493B6640072EDC0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -379,6 +732,14 @@ name = RocketChatRN; sourceTree = ""; }; + 1E0656192B7E91F00081B01F /* ActionHandler */ = { + isa = PBXGroup; + children = ( + 1E06561A2B7E91FB0081B01F /* ErrorActionHandler.swift */, + ); + path = ActionHandler; + sourceTree = ""; + }; 1E068CFB24FD2DAF00A0FFC1 /* AppGroup */ = { isa = PBXGroup; children = ( @@ -400,6 +761,102 @@ path = API; sourceTree = ""; }; + 1E29A2D12B585B070093C03C /* Client */ = { + isa = PBXGroup; + children = ( + 1E29A3082B585B2F0093C03C /* Extensions */, + 1E29A2D22B585B070093C03C /* RocketChatClient.swift */, + 1E29A2D32B585B070093C03C /* Responses */, + 1E29A2DD2B585B070093C03C /* Requests */, + 1E29A2E42B585B070093C03C /* Adapters */, + 1E29A2E82B585B070093C03C /* DateCodingStrategy.swift */, + 1E29A2E92B585B070093C03C /* FailableDecodable.swift */, + 1E29A2EA2B585B070093C03C /* HTTP */, + 1E29A2EE2B585B070093C03C /* RocketChatError.swift */, + 1E9A71762B59FCA900477BA2 /* URLSessionCertificateHandling.swift */, + ); + path = Client; + sourceTree = ""; + }; + 1E29A2D32B585B070093C03C /* Responses */ = { + isa = PBXGroup; + children = ( + 1E29A2D42B585B070093C03C /* AttachmentResponse.swift */, + 1E29A2D52B585B070093C03C /* SendMessageResponse.swift */, + 1E29A2D62B585B070093C03C /* HistoryResponse.swift */, + 1E29A2D72B585B070093C03C /* MessagesResponse.swift */, + 1E29A2D82B585B070093C03C /* SubscriptionsResponse.swift */, + 1E29A2D92B585B070093C03C /* RoomsResponse.swift */, + 1E29A2DA2B585B070093C03C /* UserResponse.swift */, + 1E29A2DB2B585B070093C03C /* ReadResponse.swift */, + 1E29A2DC2B585B070093C03C /* MessageResponse.swift */, + ); + path = Responses; + sourceTree = ""; + }; + 1E29A2DD2B585B070093C03C /* Requests */ = { + isa = PBXGroup; + children = ( + 1E29A2DE2B585B070093C03C /* SubscriptionsRequest.swift */, + 1E29A2DF2B585B070093C03C /* HistoryRequest.swift */, + 1E29A2E02B585B070093C03C /* MessagesRequest.swift */, + 1E29A2E12B585B070093C03C /* SendMessageRequest.swift */, + 1E29A2E22B585B070093C03C /* RoomsRequest.swift */, + 1E29A2E32B585B070093C03C /* ReadRequest.swift */, + ); + path = Requests; + sourceTree = ""; + }; + 1E29A2E42B585B070093C03C /* Adapters */ = { + isa = PBXGroup; + children = ( + 1E29A2E52B585B070093C03C /* TokenAdapter.swift */, + 1E29A2E62B585B070093C03C /* JSONAdapter.swift */, + 1E29A2E72B585B070093C03C /* RequestAdapter.swift */, + ); + path = Adapters; + sourceTree = ""; + }; + 1E29A2EA2B585B070093C03C /* HTTP */ = { + isa = PBXGroup; + children = ( + 1E29A2EB2B585B070093C03C /* HTTPMethod.swift */, + 1E29A2EC2B585B070093C03C /* Request.swift */, + ); + path = HTTP; + sourceTree = ""; + }; + 1E29A3082B585B2F0093C03C /* Extensions */ = { + isa = PBXGroup; + children = ( + 1E29A3092B585B370093C03C /* Data+Extensions.swift */, + 1E29A30B2B585D1D0093C03C /* String+Extensions.swift */, + 1E638E9D2B5F0F5800E645E4 /* URL+Extensions.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 1E29A31B2B5871AC0093C03C /* Extensions */ = { + isa = PBXGroup; + children = ( + 1E29A31C2B5871B60093C03C /* Date+Extensions.swift */, + 1E675B712BAC49B000438590 /* Color+Extensions.swift */, + 1EE096F92BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift */, + 1EE096FF2BACD64C00780078 /* Binding+Extensions.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + 1E29A31E2B5871BE0093C03C /* Formatters */ = { + isa = PBXGroup; + children = ( + 1EC687B72BA0FEBB00C7BAAD /* Mapper */, + 1E29A31F2B5871C80093C03C /* RoomFormatter.swift */, + 1E29A3212B5871CE0093C03C /* MessageFormatter.swift */, + ); + path = Formatters; + sourceTree = ""; + }; 1E2F61622512954500871711 /* Requests */ = { isa = PBXGroup; children = ( @@ -409,6 +866,36 @@ path = Requests; sourceTree = ""; }; + 1E51411A2B856820007BE94A /* SSLPinning */ = { + isa = PBXGroup; + children = ( + 1E5141172B856673007BE94A /* SSLPinning.swift */, + 1E51411B2B85683C007BE94A /* SSLPinning.m */, + ); + path = SSLPinning; + sourceTree = ""; + }; + 1E54BA132BC9E6670073903D /* Merge */ = { + isa = PBXGroup; + children = ( + 1E54BA182BC9E6D60073903D /* MergedRoom.swift */, + 1E54BA1C2BC9E8030073903D /* MessageMapper.swift */, + 1E54BA1F2BC9E9B60073903D /* MergedRoomMapper.swift */, + ); + path = Merge; + sourceTree = ""; + }; + 1E6BA5CE2BD14ABA00B16A18 /* Model */ = { + isa = PBXGroup; + children = ( + 1E6BA5C42BD13DEA00B16A18 /* AttachmentModel.swift */, + 1E6BA5C32BD13DEA00B16A18 /* MessageModel.swift */, + 1E6BA5C22BD13DEA00B16A18 /* RoomModel.swift */, + 1E6BA5C52BD13DEA00B16A18 /* UserModel.swift */, + ); + path = Model; + sourceTree = ""; + }; 1E76CBC425152A7F0067298C /* Shared */ = { isa = PBXGroup; children = ( @@ -427,6 +914,8 @@ 1E1C2F7F250FCB69005DCE7D /* Database.swift */, 1E470E822513A71E00E3DD1D /* RocketChat.swift */, 1EB8EF712510F1EE00F352B7 /* Storage.swift */, + 1ED038A82B5090AD00C007D4 /* MMKV.swift */, + 1E9A71722B59F34E00477BA2 /* ClientSSL.swift */, ); path = RocketChat; sourceTree = ""; @@ -438,6 +927,9 @@ 1E598AE32515057D002BDFBD /* Date+Extensions.swift */, 1E598AE625150660002BDFBD /* Data+Extensions.swift */, 1E67380324DC529B0009E081 /* String+Extensions.swift */, + 1ED038A02B508FE700C007D4 /* FileManager+Extensions.swift */, + 1ED038A42B50900800C007D4 /* Bundle+Extensions.swift */, + 1ED038AC2B50927B00C007D4 /* WatermelonDB+Extensions.swift */, ); path = Extensions; sourceTree = ""; @@ -458,6 +950,25 @@ path = Models; sourceTree = ""; }; + 1EB375872B55DBF400AEC3D7 /* Entity */ = { + isa = PBXGroup; + children = ( + 1EB375882B55DBFB00AEC3D7 /* Server.swift */, + 1E29A30D2B58608C0093C03C /* LoggedUser.swift */, + 1E29A3112B5866090093C03C /* Room.swift */, + 1E9A71702B59CC1300477BA2 /* Attachment.swift */, + ); + path = Entity; + sourceTree = ""; + }; + 1EC687B72BA0FEBB00C7BAAD /* Mapper */ = { + isa = PBXGroup; + children = ( + 1EC687B82BA0FECC00C7BAAD /* MessageInfoMapper.swift */, + ); + path = Mapper; + sourceTree = ""; + }; 1EC6ACB122CB9FC300A41C61 /* ShareRocketChatRN */ = { isa = PBXGroup; children = ( @@ -470,6 +981,126 @@ path = ShareRocketChatRN; sourceTree = ""; }; + 1ED033AB2B55B1C2004F4930 /* Database */ = { + isa = PBXGroup; + children = ( + 1E6BA5CE2BD14ABA00B16A18 /* Model */, + 1EB375872B55DBF400AEC3D7 /* Entity */, + 1ED033AC2B55B1CC004F4930 /* Default.xcdatamodeld */, + 1ED033AF2B55B25A004F4930 /* Database.swift */, + 1ED033C92B55D4F0004F4930 /* RocketChat.xcdatamodeld */, + 1ED033CC2B55D671004F4930 /* RocketChatDatabase.swift */, + ); + path = Database; + sourceTree = ""; + }; + 1ED033B12B55B47F004F4930 /* Views */ = { + isa = PBXGroup; + children = ( + 1ED033B52B55B4A5004F4930 /* ServerListView.swift */, + 1ED033B92B55B5F6004F4930 /* ServerView.swift */, + 1E29A2CB2B5857F50093C03C /* RoomListView.swift */, + 1E29A2CF2B58582F0093C03C /* RoomView.swift */, + 1E29A3152B5868DF0093C03C /* MessageListView.swift */, + 1E29A3172B5868E50093C03C /* MessageView.swift */, + 1E29A3232B5874FF0093C03C /* MessageComposerView.swift */, + 1E9A716E2B59CBCA00477BA2 /* AttachmentView.swift */, + 1E4AFC262B5B23C600E2AA7D /* RetryView.swift */, + 1EDB30F12B5B453A00532C7E /* LoggedInView.swift */, + 1E638E982B5F0A2900E645E4 /* ChatScrollView.swift */, + 1E06561C2B7E9C1C0081B01F /* MessageActionView.swift */, + 1E388AC02B934CD4006FBDB0 /* RemoteImage.swift */, + 1EE096FC2BACD58300780078 /* LazyView.swift */, + 1EE097022BACD66900780078 /* NavigationStackModifier.swift */, + 1EED2D322BC1E09500832666 /* RoomInfoView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 1ED033B42B55B495004F4930 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 1E29A30F2B5865B80093C03C /* RoomViewModel.swift */, + 1E29A3192B5868EE0093C03C /* MessageViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 1ED0388F2B507B4C00C007D4 /* RocketChat Watch App */ = { + isa = PBXGroup; + children = ( + 1E0656192B7E91F00081B01F /* ActionHandler */, + 1EDFD0FB2B589FC4002FEE5F /* DependencyInjection */, + 1EDFD0F82B589B82002FEE5F /* Loaders */, + 1E29A31E2B5871BE0093C03C /* Formatters */, + 1ED033B42B55B495004F4930 /* ViewModels */, + 1E29A31B2B5871AC0093C03C /* Extensions */, + 1E29A2D12B585B070093C03C /* Client */, + 1ED033B12B55B47F004F4930 /* Views */, + 1ED033AB2B55B1C2004F4930 /* Database */, + 1ED038902B507B4C00C007D4 /* RocketChatApp.swift */, + 1ED033C32B55C65C004F4930 /* AppRouter.swift */, + 1E4AFC202B5B1AA000E2AA7D /* AppView.swift */, + 1ED033BE2B55BF94004F4930 /* Storage.swift */, + 1ED038942B507B4D00C007D4 /* Assets.xcassets */, + 1ED038962B507B4D00C007D4 /* Preview Content */, + 1ED1EC882B867E2400F6620C /* ExtensionDelegate.swift */, + 1E044F982B92798E00BCA2FD /* Localizable.xcstrings */, + ); + path = "RocketChat Watch App"; + sourceTree = ""; + }; + 1ED038962B507B4D00C007D4 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 1ED038972B507B4D00C007D4 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 1ED038B82B50A1A500C007D4 /* Watch */ = { + isa = PBXGroup; + children = ( + 1ED038BC2B50A1C700C007D4 /* Database */, + 1ED038B92B50A1B800C007D4 /* WatchConnection.swift */, + 1ED038C32B50A1F500C007D4 /* WatchMessage.swift */, + ); + path = Watch; + sourceTree = ""; + }; + 1ED038BC2B50A1C700C007D4 /* Database */ = { + isa = PBXGroup; + children = ( + 1ED038BD2B50A1D400C007D4 /* DBServer.swift */, + 1ED038C02B50A1E400C007D4 /* DBUser.swift */, + ); + path = Database; + sourceTree = ""; + }; + 1EDFD0F82B589B82002FEE5F /* Loaders */ = { + isa = PBXGroup; + children = ( + 1E54BA132BC9E6670073903D /* Merge */, + 1ED038C92B50A58400C007D4 /* ServersLoader.swift */, + 1EDFD0F92B589B8F002FEE5F /* MessagesLoader.swift */, + 1EDFD1052B58A66E002FEE5F /* CancelBag.swift */, + 1EDFD1072B58AA77002FEE5F /* RoomsLoader.swift */, + 1E9A71682B59B6E100477BA2 /* MessageSender.swift */, + 1E8979462B6063FC001D99F0 /* WatchSession.swift */, + 1E388ABD2B934C64006FBDB0 /* ImageLoader.swift */, + ); + path = Loaders; + sourceTree = ""; + }; + 1EDFD0FB2B589FC4002FEE5F /* DependencyInjection */ = { + isa = PBXGroup; + children = ( + 1E4AFC142B5AF09800E2AA7D /* Dependency.swift */, + 1E4AFC162B5AF09C00E2AA7D /* Store.swift */, + ); + path = DependencyInjection; + sourceTree = ""; + }; 1EFEB5962493B6640072EDC0 /* NotificationService */ = { isa = PBXGroup; children = ( @@ -525,12 +1156,15 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 1E51411A2B856820007BE94A /* SSLPinning */, + 1ED038B82B50A1A500C007D4 /* Watch */, 1E76CBC425152A7F0067298C /* Shared */, 1E068CFB24FD2DAF00A0FFC1 /* AppGroup */, 13B07FAE1A68108700A75B9A /* RocketChatRN */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 1EC6ACB122CB9FC300A41C61 /* ShareRocketChatRN */, 1EFEB5962493B6640072EDC0 /* NotificationService */, + 1ED0388F2B507B4C00C007D4 /* RocketChat Watch App */, 83CBBA001A601CBA00E9B192 /* Products */, BB4B591B5FC44CD9986DB2A6 /* Frameworks */, AF5E16F0398347E6A80C8CBE /* Resources */, @@ -538,9 +1172,9 @@ 7AC2B09613AA7C3FEBAC9F57 /* Pods */, 7890E71355E6C0A3288089E7 /* ExpoModulesProviders */, ); - indentWidth = 2; + indentWidth = 4; sourceTree = ""; - tabWidth = 2; + tabWidth = 4; }; 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; @@ -549,6 +1183,8 @@ 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */, 1EFEB5952493B6640072EDC0 /* NotificationService.appex */, 7AAB3E52257E6A6E00707CF6 /* Rocket.Chat.app */, + 1ED0388E2B507B4B00C007D4 /* Rocket.Chat Watch.app */, + 1ED1ECDD2B86997F00F6620C /* Rocket.Chat Experimental Watch.app */, ); name = Products; sourceTree = ""; @@ -632,15 +1268,17 @@ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 1EC6ACF422CB9FC300A41C61 /* Embed App Extensions */, 1E1EA8082326CCE300E22452 /* ShellScript */, - 7AAE9EB32891A0D20024F559 /* Upload source maps to Bugsnag */, 7F13D807CA5B7E43CE899DB3 /* [CP] Embed Pods Frameworks */, A1315A8FDA7B970DFBDB34C7 /* [CP] Copy Pods Resources */, + 1ED0389C2B507B4F00C007D4 /* Embed Watch Content */, + 7AAE9EB32891A0D20024F559 /* Upload source maps to Bugsnag */, ); buildRules = ( ); dependencies = ( 1EC6ACBA22CB9FC300A41C61 /* PBXTargetDependency */, 1EFEB59B2493B6640072EDC0 /* PBXTargetDependency */, + 1EE79C552B8912F600CF1863 /* PBXTargetDependency */, ); name = RocketChatRN; productName = "Hello World"; @@ -667,6 +1305,40 @@ productReference = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */; productType = "com.apple.product-type.app-extension"; }; + 1ED0388D2B507B4B00C007D4 /* Rocket.Chat.Watch */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1ED0389F2B507B4F00C007D4 /* Build configuration list for PBXNativeTarget "Rocket.Chat.Watch" */; + buildPhases = ( + 1ED0388A2B507B4B00C007D4 /* Sources */, + 1ED0388B2B507B4B00C007D4 /* Frameworks */, + 1ED0388C2B507B4B00C007D4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Rocket.Chat.Watch; + productName = "RocketChat Watch App"; + productReference = 1ED0388E2B507B4B00C007D4 /* Rocket.Chat Watch.app */; + productType = "com.apple.product-type.application"; + }; + 1ED1EC8E2B86997F00F6620C /* RocketChatRN Watch */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1ED1ECDA2B86997F00F6620C /* Build configuration list for PBXNativeTarget "RocketChatRN Watch" */; + buildPhases = ( + 1ED1EC8F2B86997F00F6620C /* Sources */, + 1ED1ECD52B86997F00F6620C /* Frameworks */, + 1ED1ECD62B86997F00F6620C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "RocketChatRN Watch"; + productName = "RocketChat Watch App"; + productReference = 1ED1ECDD2B86997F00F6620C /* Rocket.Chat Experimental Watch.app */; + productType = "com.apple.product-type.application"; + }; 1EFEB5942493B6640072EDC0 /* NotificationService */ = { isa = PBXNativeTarget; buildConfigurationList = 1EFEB5A02493B6640072EDC0 /* Build configuration list for PBXNativeTarget "NotificationService" */; @@ -698,15 +1370,17 @@ 7AAB3E46257E6A6E00707CF6 /* Bundle React Native code and images */, 7AAB3E48257E6A6E00707CF6 /* Embed App Extensions */, 7AAB3E4B257E6A6E00707CF6 /* ShellScript */, - 7A10288726B1D15200E47EF8 /* Upload source maps to Bugsnag */, 4CC99291A49CC4B7F5883239 /* [CP] Embed Pods Frameworks */, B237EE54305A08A30FCABFA0 /* [CP] Copy Pods Resources */, + 1ED1ECE32B8699DD00F6620C /* Embed Watch Content */, + 7A10288726B1D15200E47EF8 /* Upload source maps to Bugsnag */, ); buildRules = ( ); dependencies = ( 7AAB3E0E257E6A6E00707CF6 /* PBXTargetDependency */, 7AAB3E10257E6A6E00707CF6 /* PBXTargetDependency */, + 1ED1ECE62B8699E900F6620C /* PBXTargetDependency */, ); name = Rocket.Chat; productName = "Hello World"; @@ -720,7 +1394,7 @@ isa = PBXProject; attributes = { DefaultBuildSystemTypeForWorkspace = Original; - LastSwiftUpdateCheck = 1150; + LastSwiftUpdateCheck = 1500; LastUpgradeCheck = 1130; ORGANIZATIONNAME = Facebook; TargetAttributes = { @@ -753,6 +1427,15 @@ }; }; }; + 1ED0388D2B507B4B00C007D4 = { + CreatedOnToolsVersion = 15.0; + DevelopmentTeam = S6UPZG7ZR3; + ProvisioningStyle = Manual; + }; + 1ED1EC8E2B86997F00F6620C = { + DevelopmentTeam = S6UPZG7ZR3; + ProvisioningStyle = Manual; + }; 1EFEB5942493B6640072EDC0 = { CreatedOnToolsVersion = 11.5; DevelopmentTeam = S6UPZG7ZR3; @@ -772,6 +1455,8 @@ English, en, Base, + "pt-BR", + ja, ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; @@ -782,6 +1467,8 @@ 1EC6ACAF22CB9FC300A41C61 /* ShareRocketChatRN */, 1EFEB5942493B6640072EDC0 /* NotificationService */, 7AAB3E0D257E6A6E00707CF6 /* Rocket.Chat */, + 1ED0388D2B507B4B00C007D4 /* Rocket.Chat.Watch */, + 1ED1EC8E2B86997F00F6620C /* RocketChatRN Watch */, ); }; /* End PBXProject section */ @@ -812,6 +1499,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1ED0388C2B507B4B00C007D4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1ED1ECEA2B869A4A00F6620C /* Official.xcassets in Resources */, + 1ED038982B507B4D00C007D4 /* Preview Assets.xcassets in Resources */, + 1E044F992B92798E00BCA2FD /* Localizable.xcstrings in Resources */, + 1ED038952B507B4D00C007D4 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1ED1ECD62B86997F00F6620C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1ED1ECD72B86997F00F6620C /* Preview Assets.xcassets in Resources */, + 1ED1ECD82B86997F00F6620C /* Assets.xcassets in Resources */, + 1E044F9A2B92798E00BCA2FD /* Localizable.xcstrings in Resources */, + 1ED1ECEC2B869B1300F6620C /* Experimental.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1EFEB5932493B6640072EDC0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1036,6 +1745,7 @@ inputFileListPaths = ( ); inputPaths = ( + "$TARGET_BUILD_DIR/$INFOPLIST_PATH", ); name = "Upload source maps to Bugsnag"; outputFileListPaths = ( @@ -1121,6 +1831,7 @@ inputFileListPaths = ( ); inputPaths = ( + "$TARGET_BUILD_DIR/$INFOPLIST_PATH", ); name = "Upload source maps to Bugsnag"; outputFileListPaths = ( @@ -1348,8 +2059,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1ED038A92B5090AD00C007D4 /* MMKV.swift in Sources */, 1E76CBCB25152C250067298C /* Sender.swift in Sources */, + 1E5141182B856673007BE94A /* SSLPinning.swift in Sources */, 1E76CBD825152C870067298C /* Request.swift in Sources */, + 1E51411C2B85683C007BE94A /* SSLPinning.m in Sources */, 1ED00BB12513E04400A1331F /* ReplyNotification.swift in Sources */, 1E76CBC2251529560067298C /* Storage.swift in Sources */, 1E76CBD925152C8C0067298C /* Push.swift in Sources */, @@ -1364,11 +2078,19 @@ 1E76CBD225152C730067298C /* Data+Extensions.swift in Sources */, 1E76CBD125152C710067298C /* Date+Extensions.swift in Sources */, 1E76CBD425152C790067298C /* Database.swift in Sources */, + 1E9A71742B59F36E00477BA2 /* ClientSSL.swift in Sources */, + 1ED038AD2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */, + 1ED038A52B50900800C007D4 /* Bundle+Extensions.swift in Sources */, 1E76CBC325152A460067298C /* String+Extensions.swift in Sources */, + 1ED038BA2B50A1B800C007D4 /* WatchConnection.swift in Sources */, + 1ED038A12B508FE700C007D4 /* FileManager+Extensions.swift in Sources */, 1E76CBCA25152C220067298C /* Notification.swift in Sources */, + 1ED038C12B50A1E400C007D4 /* DBUser.swift in Sources */, 1E76CBD525152C7F0067298C /* API.swift in Sources */, 1E76CBD625152C820067298C /* Response.swift in Sources */, + 1ED038BE2B50A1D400C007D4 /* DBServer.swift in Sources */, 1E068D0124FD2E0500A0FFC1 /* AppGroup.m in Sources */, + 1ED038C42B50A1F500C007D4 /* WatchMessage.swift in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, 1E76CBD025152C6E0067298C /* URL+Extensions.swift in Sources */, 1E068CFE24FD2DC700A0FFC1 /* AppGroup.swift in Sources */, @@ -1391,6 +2113,188 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1ED0388A2B507B4B00C007D4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1E54BA1D2BC9E8030073903D /* MessageMapper.swift in Sources */, + 1EE096FD2BACD58300780078 /* LazyView.swift in Sources */, + 1E29A3242B5874FF0093C03C /* MessageComposerView.swift in Sources */, + 1EB375892B55DBFB00AEC3D7 /* Server.swift in Sources */, + 1E06561D2B7E9C1C0081B01F /* MessageActionView.swift in Sources */, + 1E6BA5CC2BD13DEA00B16A18 /* UserModel.swift in Sources */, + 1EE096FA2BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift in Sources */, + 1E29A3162B5868DF0093C03C /* MessageListView.swift in Sources */, + 1E4AFC172B5AF09C00E2AA7D /* Store.swift in Sources */, + 1E29A2F42B585B070093C03C /* SubscriptionsResponse.swift in Sources */, + 1EE097002BACD64C00780078 /* Binding+Extensions.swift in Sources */, + 1ED1EC892B867E2400F6620C /* ExtensionDelegate.swift in Sources */, + 1E29A2F92B585B070093C03C /* SubscriptionsRequest.swift in Sources */, + 1E29A2F22B585B070093C03C /* HistoryResponse.swift in Sources */, + 1E4AFC152B5AF09800E2AA7D /* Dependency.swift in Sources */, + 1ED033BA2B55B5F6004F4930 /* ServerView.swift in Sources */, + 1E29A2D02B58582F0093C03C /* RoomView.swift in Sources */, + 1E29A2FD2B585B070093C03C /* RoomsRequest.swift in Sources */, + 1ED038CA2B50A58400C007D4 /* ServersLoader.swift in Sources */, + 1E29A3222B5871CE0093C03C /* MessageFormatter.swift in Sources */, + 1E9A716F2B59CBCA00477BA2 /* AttachmentView.swift in Sources */, + 1E29A3002B585B070093C03C /* JSONAdapter.swift in Sources */, + 1E29A3022B585B070093C03C /* DateCodingStrategy.swift in Sources */, + 1E4AFC272B5B23C600E2AA7D /* RetryView.swift in Sources */, + 1ED033B62B55B4A5004F4930 /* ServerListView.swift in Sources */, + 1E29A3202B5871C80093C03C /* RoomFormatter.swift in Sources */, + 1EDFD0FA2B589B8F002FEE5F /* MessagesLoader.swift in Sources */, + 1E29A3102B5865B80093C03C /* RoomViewModel.swift in Sources */, + 1E06561B2B7E91FB0081B01F /* ErrorActionHandler.swift in Sources */, + 1E29A2FC2B585B070093C03C /* SendMessageRequest.swift in Sources */, + 1E29A30C2B585D1D0093C03C /* String+Extensions.swift in Sources */, + 1EE097032BACD66900780078 /* NavigationStackModifier.swift in Sources */, + 1ED033CD2B55D671004F4930 /* RocketChatDatabase.swift in Sources */, + 1E29A3122B5866090093C03C /* Room.swift in Sources */, + 1E29A3032B585B070093C03C /* FailableDecodable.swift in Sources */, + 1E8979472B6063FC001D99F0 /* WatchSession.swift in Sources */, + 1E29A2FE2B585B070093C03C /* ReadRequest.swift in Sources */, + 1E9A71692B59B6E100477BA2 /* MessageSender.swift in Sources */, + 1E29A3072B585B070093C03C /* RocketChatError.swift in Sources */, + 1EED2D332BC1E09500832666 /* RoomInfoView.swift in Sources */, + 1EDFD1082B58AA77002FEE5F /* RoomsLoader.swift in Sources */, + 1E29A2F12B585B070093C03C /* SendMessageResponse.swift in Sources */, + 1E29A30E2B58608C0093C03C /* LoggedUser.swift in Sources */, + 1E29A3182B5868E50093C03C /* MessageView.swift in Sources */, + 1EDFD1062B58A66E002FEE5F /* CancelBag.swift in Sources */, + 1E29A2FF2B585B070093C03C /* TokenAdapter.swift in Sources */, + 1E29A3052B585B070093C03C /* Request.swift in Sources */, + 1E675B722BAC49B000438590 /* Color+Extensions.swift in Sources */, + 1E9A71772B59FCA900477BA2 /* URLSessionCertificateHandling.swift in Sources */, + 1E388AC12B934CD4006FBDB0 /* RemoteImage.swift in Sources */, + 1E388ABE2B934C64006FBDB0 /* ImageLoader.swift in Sources */, + 1E29A2EF2B585B070093C03C /* RocketChatClient.swift in Sources */, + 1E54BA202BC9E9B60073903D /* MergedRoomMapper.swift in Sources */, + 1E4AFC212B5B1AA000E2AA7D /* AppView.swift in Sources */, + 1E29A2FB2B585B070093C03C /* MessagesRequest.swift in Sources */, + 1E29A31D2B5871B60093C03C /* Date+Extensions.swift in Sources */, + 1EC687BB2BA0FF0D00C7BAAD /* MessageInfoMapper.swift in Sources */, + 1E29A2F62B585B070093C03C /* UserResponse.swift in Sources */, + 1ED033AE2B55B1CC004F4930 /* Default.xcdatamodeld in Sources */, + 1E6BA5CA2BD13DEA00B16A18 /* AttachmentModel.swift in Sources */, + 1ED033BF2B55BF94004F4930 /* Storage.swift in Sources */, + 1E29A2F82B585B070093C03C /* MessageResponse.swift in Sources */, + 1E29A3042B585B070093C03C /* HTTPMethod.swift in Sources */, + 1E29A3012B585B070093C03C /* RequestAdapter.swift in Sources */, + 1E6BA5C82BD13DEA00B16A18 /* MessageModel.swift in Sources */, + 1E29A2F52B585B070093C03C /* RoomsResponse.swift in Sources */, + 1EDB30F22B5B453A00532C7E /* LoggedInView.swift in Sources */, + 1E54BA1B2BC9E7110073903D /* MergedRoom.swift in Sources */, + 1E29A2F32B585B070093C03C /* MessagesResponse.swift in Sources */, + 1E29A2FA2B585B070093C03C /* HistoryRequest.swift in Sources */, + 1ED038C62B50A21800C007D4 /* WatchMessage.swift in Sources */, + 1E29A2F02B585B070093C03C /* AttachmentResponse.swift in Sources */, + 1E638E9E2B5F0F5800E645E4 /* URL+Extensions.swift in Sources */, + 1E6BA5C62BD13DEA00B16A18 /* RoomModel.swift in Sources */, + 1ED038912B507B4C00C007D4 /* RocketChatApp.swift in Sources */, + 1E29A2CC2B5857F50093C03C /* RoomListView.swift in Sources */, + 1E29A31A2B5868EE0093C03C /* MessageViewModel.swift in Sources */, + 1E638E992B5F0A2900E645E4 /* ChatScrollView.swift in Sources */, + 1ED033C42B55C65C004F4930 /* AppRouter.swift in Sources */, + 1ED033B02B55B25A004F4930 /* Database.swift in Sources */, + 1E9A71712B59CC1300477BA2 /* Attachment.swift in Sources */, + 1E29A30A2B585B370093C03C /* Data+Extensions.swift in Sources */, + 1E29A2F72B585B070093C03C /* ReadResponse.swift in Sources */, + 1ED033CB2B55D4F0004F4930 /* RocketChat.xcdatamodeld in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1ED1EC8F2B86997F00F6620C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1E54BA1E2BC9E8030073903D /* MessageMapper.swift in Sources */, + 1EE096FE2BACD58300780078 /* LazyView.swift in Sources */, + 1ED1EC902B86997F00F6620C /* MessageComposerView.swift in Sources */, + 1ED1EC912B86997F00F6620C /* Server.swift in Sources */, + 1ED1EC922B86997F00F6620C /* MessageActionView.swift in Sources */, + 1E6BA5CD2BD13DEA00B16A18 /* UserModel.swift in Sources */, + 1EE096FB2BACD1F200780078 /* ToolbarItemPlacement+Extensions.swift in Sources */, + 1ED1EC932B86997F00F6620C /* MessageListView.swift in Sources */, + 1ED1EC942B86997F00F6620C /* Store.swift in Sources */, + 1ED1EC962B86997F00F6620C /* SubscriptionsResponse.swift in Sources */, + 1EE097012BACD64C00780078 /* Binding+Extensions.swift in Sources */, + 1ED1EC972B86997F00F6620C /* ExtensionDelegate.swift in Sources */, + 1ED1EC982B86997F00F6620C /* SubscriptionsRequest.swift in Sources */, + 1ED1EC992B86997F00F6620C /* HistoryResponse.swift in Sources */, + 1ED1EC9A2B86997F00F6620C /* Dependency.swift in Sources */, + 1ED1EC9B2B86997F00F6620C /* ServerView.swift in Sources */, + 1ED1EC9C2B86997F00F6620C /* RoomView.swift in Sources */, + 1ED1EC9D2B86997F00F6620C /* RoomsRequest.swift in Sources */, + 1ED1EC9E2B86997F00F6620C /* ServersLoader.swift in Sources */, + 1ED1EC9F2B86997F00F6620C /* MessageFormatter.swift in Sources */, + 1ED1ECA02B86997F00F6620C /* AttachmentView.swift in Sources */, + 1ED1ECA12B86997F00F6620C /* JSONAdapter.swift in Sources */, + 1ED1ECA22B86997F00F6620C /* DateCodingStrategy.swift in Sources */, + 1ED1ECA32B86997F00F6620C /* RetryView.swift in Sources */, + 1ED1ECA42B86997F00F6620C /* ServerListView.swift in Sources */, + 1ED1ECA52B86997F00F6620C /* RoomFormatter.swift in Sources */, + 1ED1ECA62B86997F00F6620C /* MessagesLoader.swift in Sources */, + 1ED1ECA72B86997F00F6620C /* RoomViewModel.swift in Sources */, + 1ED1ECA82B86997F00F6620C /* ErrorActionHandler.swift in Sources */, + 1ED1ECA92B86997F00F6620C /* SendMessageRequest.swift in Sources */, + 1ED1ECAA2B86997F00F6620C /* String+Extensions.swift in Sources */, + 1EE097042BACD66900780078 /* NavigationStackModifier.swift in Sources */, + 1ED1ECAB2B86997F00F6620C /* RocketChatDatabase.swift in Sources */, + 1ED1ECAC2B86997F00F6620C /* Room.swift in Sources */, + 1ED1ECAD2B86997F00F6620C /* FailableDecodable.swift in Sources */, + 1ED1ECAE2B86997F00F6620C /* WatchSession.swift in Sources */, + 1ED1ECAF2B86997F00F6620C /* ReadRequest.swift in Sources */, + 1ED1ECB02B86997F00F6620C /* MessageSender.swift in Sources */, + 1ED1ECB12B86997F00F6620C /* RocketChatError.swift in Sources */, + 1EED2D342BC1E09500832666 /* RoomInfoView.swift in Sources */, + 1ED1ECB22B86997F00F6620C /* RoomsLoader.swift in Sources */, + 1ED1ECB32B86997F00F6620C /* SendMessageResponse.swift in Sources */, + 1ED1ECB42B86997F00F6620C /* LoggedUser.swift in Sources */, + 1ED1ECB52B86997F00F6620C /* MessageView.swift in Sources */, + 1ED1ECB62B86997F00F6620C /* CancelBag.swift in Sources */, + 1ED1ECB72B86997F00F6620C /* TokenAdapter.swift in Sources */, + 1ED1ECB82B86997F00F6620C /* Request.swift in Sources */, + 1E675B732BAC49B000438590 /* Color+Extensions.swift in Sources */, + 1ED1ECB92B86997F00F6620C /* URLSessionCertificateHandling.swift in Sources */, + 1E388AC22B934CD4006FBDB0 /* RemoteImage.swift in Sources */, + 1E388ABF2B934C64006FBDB0 /* ImageLoader.swift in Sources */, + 1ED1ECBA2B86997F00F6620C /* RocketChatClient.swift in Sources */, + 1E54BA212BC9E9B60073903D /* MergedRoomMapper.swift in Sources */, + 1ED1ECBB2B86997F00F6620C /* AppView.swift in Sources */, + 1ED1ECBC2B86997F00F6620C /* MessagesRequest.swift in Sources */, + 1ED1ECBD2B86997F00F6620C /* Date+Extensions.swift in Sources */, + 1EC687BA2BA0FF0D00C7BAAD /* MessageInfoMapper.swift in Sources */, + 1ED1ECBE2B86997F00F6620C /* UserResponse.swift in Sources */, + 1ED1ECBF2B86997F00F6620C /* Default.xcdatamodeld in Sources */, + 1E6BA5CB2BD13DEA00B16A18 /* AttachmentModel.swift in Sources */, + 1ED1ECC02B86997F00F6620C /* Storage.swift in Sources */, + 1ED1ECC12B86997F00F6620C /* MessageResponse.swift in Sources */, + 1ED1ECC22B86997F00F6620C /* HTTPMethod.swift in Sources */, + 1ED1ECC32B86997F00F6620C /* RequestAdapter.swift in Sources */, + 1E6BA5C92BD13DEA00B16A18 /* MessageModel.swift in Sources */, + 1ED1ECC42B86997F00F6620C /* RoomsResponse.swift in Sources */, + 1ED1ECC52B86997F00F6620C /* LoggedInView.swift in Sources */, + 1E54BA1A2BC9E7100073903D /* MergedRoom.swift in Sources */, + 1ED1ECC62B86997F00F6620C /* MessagesResponse.swift in Sources */, + 1ED1ECC72B86997F00F6620C /* HistoryRequest.swift in Sources */, + 1ED1ECC82B86997F00F6620C /* WatchMessage.swift in Sources */, + 1ED1ECC92B86997F00F6620C /* AttachmentResponse.swift in Sources */, + 1ED1ECCA2B86997F00F6620C /* URL+Extensions.swift in Sources */, + 1E6BA5C72BD13DEA00B16A18 /* RoomModel.swift in Sources */, + 1ED1ECCB2B86997F00F6620C /* RocketChatApp.swift in Sources */, + 1ED1ECCC2B86997F00F6620C /* RoomListView.swift in Sources */, + 1ED1ECCD2B86997F00F6620C /* MessageViewModel.swift in Sources */, + 1ED1ECCE2B86997F00F6620C /* ChatScrollView.swift in Sources */, + 1ED1ECCF2B86997F00F6620C /* AppRouter.swift in Sources */, + 1ED1ECD02B86997F00F6620C /* Database.swift in Sources */, + 1ED1ECD12B86997F00F6620C /* Attachment.swift in Sources */, + 1ED1ECD22B86997F00F6620C /* Data+Extensions.swift in Sources */, + 1ED1ECD32B86997F00F6620C /* ReadResponse.swift in Sources */, + 1ED1ECD42B86997F00F6620C /* RocketChat.xcdatamodeld in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1EFEB5912493B6640072EDC0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1398,6 +2302,8 @@ 1E51D965251263D600DC95DE /* NotificationType.swift in Sources */, 1EF5FBD1250C109E00614FEA /* Encryption.swift in Sources */, 1E598AE42515057D002BDFBD /* Date+Extensions.swift in Sources */, + 1ED038A22B508FE700C007D4 /* FileManager+Extensions.swift in Sources */, + 1ED038AA2B5090AD00C007D4 /* MMKV.swift in Sources */, 1E01C81C2511208400FEF824 /* URL+Extensions.swift in Sources */, 1E470E832513A71E00E3DD1D /* RocketChat.swift in Sources */, 1E2F615D25128FA300871711 /* Response.swift in Sources */, @@ -1406,6 +2312,8 @@ 1E0426E7251A54B4008F022C /* RoomType.swift in Sources */, 1E1C2F80250FCB69005DCE7D /* Database.swift in Sources */, 1E67380424DC529B0009E081 /* String+Extensions.swift in Sources */, + 1ED038AE2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */, + 1ED038A62B50900800C007D4 /* Bundle+Extensions.swift in Sources */, 1E01C8292511304100FEF824 /* Sender.swift in Sources */, 1E51D962251263CD00DC95DE /* MessageType.swift in Sources */, 1E01C82B2511335A00FEF824 /* Message.swift in Sources */, @@ -1427,8 +2335,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1ED038AB2B5090AD00C007D4 /* MMKV.swift in Sources */, 7AAB3E15257E6A6E00707CF6 /* Sender.swift in Sources */, + 1E5141192B856673007BE94A /* SSLPinning.swift in Sources */, 7AAB3E16257E6A6E00707CF6 /* Request.swift in Sources */, + 1E51411D2B85683C007BE94A /* SSLPinning.m in Sources */, 7AAB3E17257E6A6E00707CF6 /* ReplyNotification.swift in Sources */, 7AAB3E18257E6A6E00707CF6 /* Storage.swift in Sources */, 7AAB3E19257E6A6E00707CF6 /* Push.swift in Sources */, @@ -1443,11 +2354,19 @@ 7AAB3E23257E6A6E00707CF6 /* Data+Extensions.swift in Sources */, 7AAB3E24257E6A6E00707CF6 /* Date+Extensions.swift in Sources */, 7AAB3E25257E6A6E00707CF6 /* Database.swift in Sources */, + 1E9A71752B59F36E00477BA2 /* ClientSSL.swift in Sources */, + 1ED038AF2B50927B00C007D4 /* WatermelonDB+Extensions.swift in Sources */, + 1ED038A72B50900800C007D4 /* Bundle+Extensions.swift in Sources */, 7AAB3E26257E6A6E00707CF6 /* String+Extensions.swift in Sources */, + 1ED038BB2B50A1B800C007D4 /* WatchConnection.swift in Sources */, + 1ED038A32B508FE700C007D4 /* FileManager+Extensions.swift in Sources */, 7AAB3E27257E6A6E00707CF6 /* Notification.swift in Sources */, + 1ED038C22B50A1E400C007D4 /* DBUser.swift in Sources */, 7AAB3E28257E6A6E00707CF6 /* API.swift in Sources */, 7AAB3E29257E6A6E00707CF6 /* Response.swift in Sources */, + 1ED038BF2B50A1D400C007D4 /* DBServer.swift in Sources */, 7AAB3E2A257E6A6E00707CF6 /* AppGroup.m in Sources */, + 1ED038C52B50A1F500C007D4 /* WatchMessage.swift in Sources */, 7AAB3E2B257E6A6E00707CF6 /* main.m in Sources */, 7AAB3E2C257E6A6E00707CF6 /* URL+Extensions.swift in Sources */, 7AAB3E2D257E6A6E00707CF6 /* AppGroup.swift in Sources */, @@ -1467,6 +2386,16 @@ target = 1EC6ACAF22CB9FC300A41C61 /* ShareRocketChatRN */; targetProxy = 1EC6ACB922CB9FC300A41C61 /* PBXContainerItemProxy */; }; + 1ED1ECE62B8699E900F6620C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1ED0388D2B507B4B00C007D4 /* Rocket.Chat.Watch */; + targetProxy = 1ED1ECE52B8699E900F6620C /* PBXContainerItemProxy */; + }; + 1EE79C552B8912F600CF1863 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1ED1EC8E2B86997F00F6620C /* RocketChatRN Watch */; + targetProxy = 1EE79C542B8912F600CF1863 /* PBXContainerItemProxy */; + }; 1EFEB59B2493B6640072EDC0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 1EFEB5942493B6640072EDC0 /* NotificationService */; @@ -1513,6 +2442,7 @@ DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1569,6 +2499,7 @@ DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1638,6 +2569,7 @@ DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1706,6 +2638,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1744,6 +2677,202 @@ }; name = Release; }; + 1ED0389D2B507B4F00C007D4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_ASSET_PATHS = "\"RocketChat Watch App/Preview Content\""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=watchos*]" = S6UPZG7ZR3; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = Rocket.Chat; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = chat.rocket.ios; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.ios.watchkitapp; + PRODUCT_NAME = "Rocket.Chat Watch"; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore chat.rocket.ios.watchkitapp"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match AppStore chat.rocket.ios.watchkitapp"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.0; + }; + name = Debug; + }; + 1ED0389E2B507B4F00C007D4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_ASSET_PATHS = "\"RocketChat Watch App/Preview Content\""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=watchos*]" = S6UPZG7ZR3; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = Rocket.Chat; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = chat.rocket.ios; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; + PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.ios.watchkitapp; + PRODUCT_NAME = "Rocket.Chat Watch"; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore chat.rocket.ios.watchkitapp"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match AppStore chat.rocket.ios.watchkitapp"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.0; + }; + name = Release; + }; + 1ED1ECDB2B86997F00F6620C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_ASSET_PATHS = "\"RocketChat Watch App/Preview Content\""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=watchos*]" = S6UPZG7ZR3; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Rocket.Chat Experimental"; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = chat.rocket.reactnative; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.watchkitapp; + PRODUCT_NAME = "Rocket.Chat Experimental Watch"; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore chat.rocket.reactnative.watchkitapp"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match AppStore chat.rocket.reactnative.watchkitapp"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.0; + }; + name = Debug; + }; + 1ED1ECDC2B86997F00F6620C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_ASSET_PATHS = "\"RocketChat Watch App/Preview Content\""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=watchos*]" = S6UPZG7ZR3; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Rocket.Chat Experimental"; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = chat.rocket.reactnative; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; + PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.watchkitapp; + PRODUCT_NAME = "Rocket.Chat Experimental Watch"; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore chat.rocket.reactnative.watchkitapp"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match AppStore chat.rocket.reactnative.watchkitapp"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.0; + }; + name = Release; + }; 1EFEB59D2493B6640072EDC0 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 8D9DA7CD79909E251F469FD5 /* Pods-defaults-NotificationService.debug.xcconfig */; @@ -1761,6 +2890,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = NotificationService/Info.plist; @@ -1800,6 +2930,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = NotificationService/Info.plist; @@ -1834,6 +2965,7 @@ DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -1889,6 +3021,7 @@ DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", @@ -2051,6 +3184,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 1ED0389F2B507B4F00C007D4 /* Build configuration list for PBXNativeTarget "Rocket.Chat.Watch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1ED0389D2B507B4F00C007D4 /* Debug */, + 1ED0389E2B507B4F00C007D4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1ED1ECDA2B86997F00F6620C /* Build configuration list for PBXNativeTarget "RocketChatRN Watch" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1ED1ECDB2B86997F00F6620C /* Debug */, + 1ED1ECDC2B86997F00F6620C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 1EFEB5A02493B6640072EDC0 /* Build configuration list for PBXNativeTarget "NotificationService" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2079,6 +3230,29 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 1ED033AC2B55B1CC004F4930 /* Default.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 1ED033AD2B55B1CC004F4930 /* Default.xcdatamodel */, + ); + currentVersion = 1ED033AD2B55B1CC004F4930 /* Default.xcdatamodel */; + path = Default.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; + 1ED033C92B55D4F0004F4930 /* RocketChat.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 1ED033CA2B55D4F0004F4930 /* RocketChat.xcdatamodel */, + ); + currentVersion = 1ED033CA2B55D4F0004F4930 /* RocketChat.xcdatamodel */; + path = RocketChat.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ }; rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; } diff --git a/ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChat Watch.xcscheme b/ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChat Watch.xcscheme new file mode 100644 index 000000000..e9306a238 --- /dev/null +++ b/ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChat Watch.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChatRN Watch.xcscheme b/ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChatRN Watch.xcscheme new file mode 100644 index 000000000..6ba012562 --- /dev/null +++ b/ios/RocketChatRN.xcodeproj/xcshareddata/xcschemes/RocketChatRN Watch.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/RocketChatRN/AppDelegate.h b/ios/RocketChatRN/AppDelegate.h index 8d328571a..7ba85e39b 100644 --- a/ios/RocketChatRN/AppDelegate.h +++ b/ios/RocketChatRN/AppDelegate.h @@ -10,6 +10,7 @@ #import #import #import +#import // https://github.com/expo/expo/issues/17705#issuecomment-1196251146 #import "ExpoModulesCore-Swift.h" #import "RocketChatRN-Swift.h" @@ -17,5 +18,6 @@ @interface AppDelegate : EXAppDelegateWrapper @property (nonatomic, strong) UIWindow *window; +@property (nonatomic, strong) WatchConnection *watchConnection; @end diff --git a/ios/RocketChatRN/AppDelegate.mm b/ios/RocketChatRN/AppDelegate.mm index 4418704fe..ffbc15003 100644 --- a/ios/RocketChatRN/AppDelegate.mm +++ b/ios/RocketChatRN/AppDelegate.mm @@ -69,6 +69,10 @@ [MMKV initializeMMKV:nil groupDir:groupDir logLevel:MMKVLogInfo]; [RNBootSplash initWithStoryboard:@"LaunchScreen" rootView:rootView]; + + [[[SSLPinning alloc] init] migrate]; + + self.watchConnection = [[WatchConnection alloc] initWithSession:[WCSession defaultSession]]; return YES; } diff --git a/ios/SSLPinning/SSLPinning.m b/ios/SSLPinning/SSLPinning.m new file mode 100644 index 000000000..570f9e7be --- /dev/null +++ b/ios/SSLPinning/SSLPinning.m @@ -0,0 +1,3 @@ +#import "React/RCTBridgeModule.h" +@interface RCT_EXTERN_MODULE(SSLPinning, NSObject) +@end diff --git a/ios/SSLPinning/SSLPinning.swift b/ios/SSLPinning/SSLPinning.swift new file mode 100644 index 000000000..c14a26fb3 --- /dev/null +++ b/ios/SSLPinning/SSLPinning.swift @@ -0,0 +1,53 @@ +import WatermelonDB + +@objc(SSLPinning) +final class SSLPinning: NSObject { + private struct Constants { + static let certificateKey = "ssl_pinning_certificate" + static let passwordKey = "ssl_pinning_password" + } + + private let database = WatermelonDB.Database(name: "default") + private let mmkv = MMKV.build() + + @objc func setCertificate(_ server: String, _ path: String, _ password: String) { + guard FileManager.default.fileExists(atPath: path) else { + return + } + + guard let certificate = NSData(contentsOfFile: path) else { + return + } + + mmkv.set(Data(referencing: certificate), forKey: Constants.certificateKey.appending(server)) + mmkv.set(password, forKey: Constants.passwordKey.appending(server)) + } + + @objc func migrate() { + let serversQuery = database.query(raw: "select * from servers") as [DBServer] + + serversQuery.forEach { server in + guard let clientSSL = mmkv.clientSSL(for: server.url) else { + return + } + + setCertificate( + server.url.absoluteString.removeTrailingSlash(), + clientSSL.path, + clientSSL.password + ) + } + } + + func getCertificate(server: String) -> (certificate: Data, password: String)? { + guard let certificate = mmkv.data(forKey: Constants.certificateKey.appending(server)) else { + return nil + } + + guard let password = mmkv.string(forKey: Constants.passwordKey.appending(server)) else { + return nil + } + + return (certificate, password) + } +} diff --git a/ios/Shared/Extensions/Bundle+Extensions.swift b/ios/Shared/Extensions/Bundle+Extensions.swift new file mode 100644 index 000000000..8873e7b2c --- /dev/null +++ b/ios/Shared/Extensions/Bundle+Extensions.swift @@ -0,0 +1,15 @@ +import Foundation + +extension Bundle { + func bool(forKey key: String) -> Bool { + object(forInfoDictionaryKey: key) as? Bool ?? false + } + + func string(forKey key: String) -> String { + guard let string = object(forInfoDictionaryKey: key) as? String else { + fatalError("Could not locate string for key \(key).") + } + + return string + } +} diff --git a/ios/Shared/Extensions/FileManager+Extensions.swift b/ios/Shared/Extensions/FileManager+Extensions.swift new file mode 100644 index 000000000..92f60c92c --- /dev/null +++ b/ios/Shared/Extensions/FileManager+Extensions.swift @@ -0,0 +1,13 @@ +import Foundation + +extension FileManager { + func groupDir() -> String { + let applicationGroupIdentifier = Bundle.main.string(forKey: "AppGroup") + + guard let path = containerURL(forSecurityApplicationGroupIdentifier: applicationGroupIdentifier)?.path else { + return "" + } + + return path + } +} diff --git a/ios/Shared/Extensions/WatermelonDB+Extensions.swift b/ios/Shared/Extensions/WatermelonDB+Extensions.swift new file mode 100644 index 000000000..846b8991b --- /dev/null +++ b/ios/Shared/Extensions/WatermelonDB+Extensions.swift @@ -0,0 +1,33 @@ +import WatermelonDB + +extension WatermelonDB.Database { + convenience init(name: String) { + let isOfficial = Bundle.main.bool(forKey: "IS_OFFICIAL") + let groupDir = FileManager.default.groupDir() + let path = "\(groupDir)/\(name)\(isOfficial ? "" : "-experimental").db" + + self.init(path: path) + } + + func query(raw: SQL, _ args: QueryArgs = []) -> [T] { + guard let results = try? queryRaw(raw, args) else { + return [] + } + + return results.compactMap { result in + guard let dictionary = result.resultDictionary else { + return nil + } + + guard let data = try? JSONSerialization.data(withJSONObject: dictionary) else { + return nil + } + + guard let item = try? JSONDecoder().decode(T.self, from: data) else { + return nil + } + + return item + } + } +} diff --git a/ios/Shared/RocketChat/ClientSSL.swift b/ios/Shared/RocketChat/ClientSSL.swift new file mode 100644 index 000000000..52d9f842d --- /dev/null +++ b/ios/Shared/RocketChat/ClientSSL.swift @@ -0,0 +1,29 @@ +import Foundation + +struct ClientSSL: Codable { + let path: String + let password: String +} + +extension MMKV { + func clientSSL(for url: URL) -> ClientSSL? { + let server = url.absoluteString.removeTrailingSlash() + let host = url.host ?? "" + + guard let name = string(forKey: "RC_CERTIFICATE_KEY-\(server)") else { + return nil + } + + guard let data = data(forKey: host), let certificate = try? JSONDecoder().decode(ClientSSL.self, from: data) else { + return nil + } + + return .init(path: getFilePath(forName: name), password: certificate.password) + } + + private func getFilePath(forName name: String) -> String { + let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) + let documentsDirectory = paths[0] + return documentsDirectory.path + "/" + name + } +} diff --git a/ios/Shared/RocketChat/Database.swift b/ios/Shared/RocketChat/Database.swift index 7e7928506..db493fa8a 100644 --- a/ios/Shared/RocketChat/Database.swift +++ b/ios/Shared/RocketChat/Database.swift @@ -10,60 +10,42 @@ import Foundation import WatermelonDB final class Database { - private final var database: WatermelonDB.Database? = nil - - private var directory: String? { - if let suiteName = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as? String { - if let directory = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: suiteName) { - return directory.path - } - } - - return nil - } - - init(server: String) { - if let url = URL(string: server) { - if let domain = url.domain, let directory = directory { - let isOfficial = Bundle.main.object(forInfoDictionaryKey: "IS_OFFICIAL") as? Bool ?? false - self.database = WatermelonDB.Database(path: "\(directory)/\(domain)\(isOfficial ? "" : "-experimental").db") - } - } - } - - func readRoomEncryptionKey(rid: String) -> String? { - if let database = database { - if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) { - guard let record = results.next() else { - return nil - } - - if let room = record.resultDictionary as? [String: Any] { - if let e2eKey = room["e2e_key"] as? String { - return e2eKey - } - } - } - } - - return nil - } - - func readRoomEncrypted(rid: String) -> Bool { - if let database = database { - if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) { - guard let record = results.next() else { - return false - } - - if let room = record.resultDictionary as? [String: Any] { - if let encrypted = room["encrypted"] as? Bool { - return encrypted - } - } - } - } - - return false - } + private let database: WatermelonDB.Database + + init(server: String) { + let domain = URL(string: server)?.domain ?? "" + database = .init(name: domain) + } + + func readRoomEncryptionKey(rid: String) -> String? { + if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) { + guard let record = results.next() else { + return nil + } + + if let room = record.resultDictionary as? [String: Any] { + if let e2eKey = room["e2e_key"] as? String { + return e2eKey + } + } + } + + return nil + } + + func readRoomEncrypted(rid: String) -> Bool { + if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) { + guard let record = results.next() else { + return false + } + + if let room = record.resultDictionary as? [String: Any] { + if let encrypted = room["encrypted"] as? Bool { + return encrypted + } + } + } + + return false + } } diff --git a/ios/Shared/RocketChat/MMKV.swift b/ios/Shared/RocketChat/MMKV.swift new file mode 100644 index 000000000..69a1eb669 --- /dev/null +++ b/ios/Shared/RocketChat/MMKV.swift @@ -0,0 +1,40 @@ +import Foundation + +extension MMKV { + static func build() -> MMKV { + let password = SecureStorage().getSecureKey("com.MMKV.default".toHex()) + let groupDir = FileManager.default.groupDir() + + MMKV.initialize(rootDir: nil, groupDir: groupDir, logLevel: MMKVLogLevel.none) + + guard let mmkv = MMKV(mmapID: "default", cryptKey: password?.data(using: .utf8), mode: MMKVMode.multiProcess) else { + fatalError("Could not initialize MMKV instance.") + } + + return mmkv + } + + func userToken(for userId: String) -> String? { + guard let userToken = string(forKey: "reactnativemeteor_usertoken-\(userId)") else { + return nil + } + + return userToken + } + + func userId(for server: String) -> String? { + guard let userId = string(forKey: "reactnativemeteor_usertoken-\(server)") else { + return nil + } + + return userId + } + + func privateKey(for server: String) -> String? { + guard let privateKey = string(forKey: "\(server)-RC_E2E_PRIVATE_KEY") else { + return nil + } + + return privateKey + } +} diff --git a/ios/Shared/RocketChat/Storage.swift b/ios/Shared/RocketChat/Storage.swift index 7f2496897..019c56419 100644 --- a/ios/Shared/RocketChat/Storage.swift +++ b/ios/Shared/RocketChat/Storage.swift @@ -1,60 +1,24 @@ -// -// Storage.swift -// NotificationService -// -// Created by Djorkaeff Alexandre Vilela Pereira on 9/15/20. -// Copyright © 2020 Rocket.Chat. All rights reserved. -// - import Foundation struct Credentials { - let userId: String - let userToken: String + let userId: String + let userToken: String } -class Storage { - static let shared = Storage() - - final var mmkv: MMKV? = nil - - init() { - let mmapID = "default" - let instanceID = "com.MMKV.\(mmapID)" - let secureStorage = SecureStorage() - - // get mmkv instance password from keychain - var key: Data? - if let password: String = secureStorage.getSecureKey(instanceID.toHex()) { - key = password.data(using: .utf8) - } - - guard let cryptKey = key else { - return - } - - // Get App Group directory - let suiteName = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as! String - guard let directory = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: suiteName) else { - return - } - - // Set App Group dir - MMKV.initialize(rootDir: nil, groupDir: directory.path, logLevel: MMKVLogLevel.none) - self.mmkv = MMKV(mmapID: mmapID, cryptKey: cryptKey, mode: MMKVMode.multiProcess) - } - - func getCredentials(server: String) -> Credentials? { - if let userId = self.mmkv?.string(forKey: "reactnativemeteor_usertoken-\(server)") { - if let userToken = self.mmkv?.string(forKey: "reactnativemeteor_usertoken-\(userId)") { - return Credentials(userId: userId, userToken: userToken) - } - } - - return nil - } - - func getPrivateKey(server: String) -> String? { - return self.mmkv?.string(forKey: "\(server)-RC_E2E_PRIVATE_KEY") - } +final class Storage { + static let shared = Storage() + + private let mmkv = MMKV.build() + + func getCredentials(server: String) -> Credentials? { + guard let userId = mmkv.userId(for: server), let userToken = mmkv.userToken(for: userId) else { + return nil + } + + return .init(userId: userId, userToken: userToken) + } + + func getPrivateKey(server: String) -> String? { + mmkv.privateKey(for: server) + } } diff --git a/ios/Watch/Database/DBServer.swift b/ios/Watch/Database/DBServer.swift new file mode 100644 index 000000000..245e7361a --- /dev/null +++ b/ios/Watch/Database/DBServer.swift @@ -0,0 +1,21 @@ +import Foundation + +struct DBServer: Codable { + let url: URL + let name: String + let useRealName: Int + let iconURL: URL + let version: String + + var identifier: String { + url.absoluteString.removeTrailingSlash() + } + + enum CodingKeys: String, CodingKey { + case url = "id" + case name + case useRealName = "use_real_name" + case iconURL = "icon_url" + case version + } +} diff --git a/ios/Watch/Database/DBUser.swift b/ios/Watch/Database/DBUser.swift new file mode 100644 index 000000000..4641ffebe --- /dev/null +++ b/ios/Watch/Database/DBUser.swift @@ -0,0 +1,6 @@ +import Foundation + +struct DBUser: Codable { + let name: String + let username: String +} diff --git a/ios/Watch/WatchConnection.swift b/ios/Watch/WatchConnection.swift new file mode 100644 index 000000000..defa29527 --- /dev/null +++ b/ios/Watch/WatchConnection.swift @@ -0,0 +1,92 @@ +import Foundation +import WatermelonDB +import WatchConnectivity + +@objc +final class WatchConnection: NSObject { + private let database = WatermelonDB.Database(name: "default") + private let mmkv = MMKV.build() + private let session: WCSession + + @objc init(session: WCSession) { + self.session = session + super.init() + + if WCSession.isSupported() { + session.delegate = self + session.activate() + } + } + + private func getMessage() -> WatchMessage { + let serversQuery = database.query(raw: "select * from servers") as [DBServer] + + let servers = serversQuery.compactMap { item -> WatchMessage.Server? in + guard let userId = mmkv.userId(for: item.identifier), let userToken = mmkv.userToken(for: userId) else { + return nil + } + + let clientSSL = SSLPinning().getCertificate(server: item.url.absoluteString.removeTrailingSlash()) + + let usersQuery = database.query(raw: "select * from users where token == ? limit 1", [userToken]) as [DBUser] + + guard let user = usersQuery.first else { + return nil + } + + return WatchMessage.Server( + url: item.url, + name: item.name, + iconURL: item.iconURL, + useRealName: item.useRealName == 1 ? true : false, + loggedUser: .init( + id: userId, + token: userToken, + name: user.name, + username: user.username + ), + clientSSL: clientSSL.map { + .init( + certificate: $0.certificate, + password: $0.password + ) + }, + version: item.version + ) + } + + return WatchMessage(servers: servers) + } + + private func encodedMessage() -> [String: Any] { + do { + let data = try JSONEncoder().encode(getMessage()) + + guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else { + fatalError("Could not serialize message: \(getMessage())") + } + + return dictionary + } catch { + fatalError("Could not encode message: \(getMessage())") + } + } +} + +extension WatchConnection: WCSessionDelegate { + func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { + + } + + func sessionDidBecomeInactive(_ session: WCSession) { + session.activate() + } + + func sessionDidDeactivate(_ session: WCSession) { + session.activate() + } + + func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) { + replyHandler(encodedMessage()) + } +} diff --git a/ios/Watch/WatchMessage.swift b/ios/Watch/WatchMessage.swift new file mode 100644 index 000000000..d86d9af24 --- /dev/null +++ b/ios/Watch/WatchMessage.swift @@ -0,0 +1,27 @@ +import Foundation + +struct WatchMessage: Codable { + let servers: [Server] + + struct Server: Codable { + let url: URL + let name: String + let iconURL: URL + let useRealName: Bool + let loggedUser: LoggedUser + let clientSSL: ClientSSL? + let version: String + + struct LoggedUser: Codable { + let id: String + let token: String + let name: String + let username: String + } + + struct ClientSSL: Codable { + let certificate: Data + let password: String + } + } +} diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index 2a313d2cb..949428ed4 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -57,6 +57,7 @@ platform :ios do match(type: "appstore") get_provisioning_profile(app_identifier: "chat.rocket.reactnative.ShareExtension") get_provisioning_profile(app_identifier: "chat.rocket.reactnative.NotificationService") + get_provisioning_profile(app_identifier: "chat.rocket.reactnative.watchkitapp") # pem(api_key: api_key) # still uses Spaceship http://docs.fastlane.tools/actions/pem/#how-does-it-work gym( scheme: "RocketChatRN", @@ -71,7 +72,7 @@ platform :ios do match( type: "appstore", - app_identifier: ["chat.rocket.ios", "chat.rocket.ios.NotificationService", "chat.rocket.ios.Rocket-Chat-ShareExtension"], + app_identifier: ["chat.rocket.ios", "chat.rocket.ios.NotificationService", "chat.rocket.ios.Rocket-Chat-ShareExtension", "chat.rocket.ios.watchkitapp"], readonly: true, output_path: './' ) @@ -90,6 +91,13 @@ platform :ios do targets: "ShareRocketChatRN", ) + update_code_signing_settings( + profile_name: "match AppStore chat.rocket.ios.watchkitapp", + build_configurations: "Release", + code_sign_identity: "iPhone Distribution", + targets: "Rocket.Chat.Watch", + ) + gym( scheme: "RocketChat", workspace: "RocketChatRN.xcworkspace", diff --git a/patches/@nozbe+watermelondb+0.23.0.patch b/patches/@nozbe+watermelondb+0.23.0.patch index da8f8509c..098217c19 100644 --- a/patches/@nozbe+watermelondb+0.23.0.patch +++ b/patches/@nozbe+watermelondb+0.23.0.patch @@ -54,3 +54,15 @@ index b4d7151..429e318 100644 let resultSet = try fmdb.executeQuery(query, values: args) return AnyIterator { +diff --git a/node_modules/@nozbe/watermelondb/native/shared/DatabasePlatform.h b/node_modules/@nozbe/watermelondb/native/shared/DatabasePlatform.h +index 6814d5f..fecded8 100644 +--- a/node_modules/@nozbe/watermelondb/native/shared/DatabasePlatform.h ++++ b/node_modules/@nozbe/watermelondb/native/shared/DatabasePlatform.h +@@ -1,6 +1,7 @@ + #pragma once + + #include ++#include + + namespace watermelondb { + namespace platform { From 7cacd11e61ac342b7ff9c2c828b6fc8264e950e1 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 30 Apr 2024 13:32:43 -0300 Subject: [PATCH 3/8] chore: Revert encrypted file description (#5668) --- .../components/RecordAudio/RecordAudio.tsx | 17 ++++----- app/containers/message/Attachments.tsx | 4 +-- app/containers/message/index.tsx | 3 +- app/definitions/IUpload.ts | 6 +--- app/lib/encryption/encryption.ts | 26 +++----------- app/lib/encryption/room.ts | 36 +------------------ app/lib/methods/sendFileMessage.ts | 20 +---------- .../RoomSettings/SwitchItemEncrypted.test.tsx | 6 ++-- app/views/ShareView/index.tsx | 4 +-- 9 files changed, 21 insertions(+), 101 deletions(-) diff --git a/app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx b/app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx index f93a3208d..0ec27650e 100644 --- a/app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx +++ b/app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx @@ -95,21 +95,16 @@ export const RecordAudio = (): ReactElement | null => { try { if (!rid) return; setRecordingAudio(false); - const fileURI = recordingRef.current?.getURI() as string; - const fileData = await getInfoAsync(fileURI); - - if (!fileData.exists) { - return; - } - - const fileInfo: IUpload = { - rid, + const fileURI = recordingRef.current?.getURI(); + const fileData = await getInfoAsync(fileURI as string); + const fileInfo = { name: `${Date.now()}${RECORDING_EXTENSION}`, + mime: 'audio/aac', type: 'audio/aac', store: 'Uploads', path: fileURI, - size: fileData.size - }; + size: fileData.exists ? fileData.size : null + } as IUpload; if (fileInfo) { if (permissionToUpload) { diff --git a/app/containers/message/Attachments.tsx b/app/containers/message/Attachments.tsx index d9cfcfa42..1e96dbaac 100644 --- a/app/containers/message/Attachments.tsx +++ b/app/containers/message/Attachments.tsx @@ -55,14 +55,14 @@ const AttachedActions = ({ attachment, getCustomEmoji }: { attachment: IAttachme const Attachments: React.FC = React.memo( ({ attachments, timeFormat, showAttachment, style, getCustomEmoji, isReply, author }: IMessageAttachments) => { - const { translateLanguage, isEncrypted } = useContext(MessageContext); + const { translateLanguage } = useContext(MessageContext); if (!attachments || attachments.length === 0) { return null; } const attachmentsElements = attachments.map((file: IAttachment, index: number) => { - const msg = isEncrypted ? '' : getMessageFromAttachment(file, translateLanguage); + const msg = getMessageFromAttachment(file, translateLanguage); if (file && file.image_url) { return ( {/* @ts-ignore*/} diff --git a/app/definitions/IUpload.ts b/app/definitions/IUpload.ts index 187e34881..a2935575b 100644 --- a/app/definitions/IUpload.ts +++ b/app/definitions/IUpload.ts @@ -1,10 +1,8 @@ import Model from '@nozbe/watermelondb/Model'; -import { E2EType, MessageType } from './IMessage'; - export interface IUpload { id?: string; - rid: string; + rid?: string; path: string; name?: string; tmid?: string; @@ -16,8 +14,6 @@ export interface IUpload { error?: boolean; subscription?: { id: string }; msg?: string; - t?: MessageType; - e2e?: E2EType; } export type TUploadModel = IUpload & Model; diff --git a/app/lib/encryption/encryption.ts b/app/lib/encryption/encryption.ts index 912465f46..05071d074 100644 --- a/app/lib/encryption/encryption.ts +++ b/app/lib/encryption/encryption.ts @@ -11,15 +11,7 @@ import log from '../methods/helpers/log'; import { store } from '../store/auxStore'; import { joinVectorData, randomPassword, splitVectorData, toString, utf8ToBuffer } from './utils'; import { EncryptionRoom } from './index'; -import { - IMessage, - ISubscription, - IUpload, - TMessageModel, - TSubscriptionModel, - TThreadMessageModel, - TThreadModel -} from '../../definitions'; +import { IMessage, ISubscription, TMessageModel, TSubscriptionModel, TThreadMessageModel, TThreadModel } from '../../definitions'; import { E2E_BANNER_TYPE, E2E_MESSAGE_TYPE, @@ -29,7 +21,6 @@ import { E2E_STATUS } from '../constants'; import { Services } from '../services'; -import { compareServerVersion } from '../methods/helpers'; class Encryption { ready: boolean; @@ -43,7 +34,6 @@ class Encryption { handshake: Function; decrypt: Function; encrypt: Function; - encryptUpload: Function; importRoomKey: Function; }; }; @@ -285,7 +275,7 @@ class Encryption { ]; toDecrypt = (await Promise.all( toDecrypt.map(async message => { - const { t, msg, tmsg, attachments } = message; + const { t, msg, tmsg } = message; let newMessage: TMessageModel = {} as TMessageModel; if (message.subscription) { const { id: rid } = message.subscription; @@ -294,8 +284,7 @@ class Encryption { t, rid, msg: msg as string, - tmsg, - attachments + tmsg }); } @@ -445,7 +434,7 @@ class Encryption { }; // Encrypt a message - encryptMessage = async (message: IMessage | IUpload) => { + encryptMessage = async (message: IMessage) => { const { rid } = message; const db = database.active; const subCollection = db.get('subscriptions'); @@ -467,11 +456,6 @@ class Encryption { } const roomE2E = await this.getRoomInstance(rid); - - const { version: serverVersion } = store.getState().server; - if ('path' in message && compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.8.0')) { - return roomE2E.encryptUpload(message); - } return roomE2E.encrypt(message); } catch { // Subscription not found @@ -483,7 +467,7 @@ class Encryption { }; // Decrypt a message - decryptMessage = async (message: Pick) => { + decryptMessage = async (message: Pick) => { const { t, e2e } = message; // Prevent create a new instance if this room was encrypted sometime ago diff --git a/app/lib/encryption/room.ts b/app/lib/encryption/room.ts index 55f90e349..090582a81 100644 --- a/app/lib/encryption/room.ts +++ b/app/lib/encryption/room.ts @@ -5,7 +5,7 @@ import ByteBuffer from 'bytebuffer'; import parse from 'url-parse'; import getSingleMessage from '../methods/getSingleMessage'; -import { IMessage, IUpload, IUser } from '../../definitions'; +import { IMessage, IUser } from '../../definitions'; import Deferred from './helpers/deferred'; import { debounce } from '../methods/helpers'; import database from '../database'; @@ -243,38 +243,8 @@ export default class EncryptionRoom { return message; }; - // Encrypt upload - encryptUpload = async (message: IUpload) => { - if (!this.ready) { - return message; - } - - try { - let description = ''; - - if (message.description) { - description = await this.encryptText(EJSON.stringify({ text: message.description })); - } - - return { - ...message, - t: E2E_MESSAGE_TYPE, - e2e: E2E_STATUS.PENDING, - description - }; - } catch { - // Do nothing - } - - return message; - }; - // Decrypt text decryptText = async (msg: string | ArrayBuffer) => { - if (!msg) { - return null; - } - msg = b64ToBuffer(msg.slice(12) as string); const [vector, cipherText] = splitVectorData(msg); @@ -305,10 +275,6 @@ export default class EncryptionRoom { tmsg = await this.decryptText(tmsg); } - if (message.attachments?.length) { - message.attachments[0].description = await this.decryptText(message.attachments[0].description as string); - } - const decryptedMessage: IMessage = { ...message, tmsg, diff --git a/app/lib/methods/sendFileMessage.ts b/app/lib/methods/sendFileMessage.ts index 0a9fd9d0c..8886f6064 100644 --- a/app/lib/methods/sendFileMessage.ts +++ b/app/lib/methods/sendFileMessage.ts @@ -4,16 +4,12 @@ import isEmpty from 'lodash/isEmpty'; import { FetchBlobResponse, StatefulPromise } from 'rn-fetch-blob'; import { Alert } from 'react-native'; -import { Encryption } from '../encryption'; import { IUpload, IUser, TUploadModel } from '../../definitions'; import i18n from '../../i18n'; import database from '../database'; import FileUpload from './helpers/fileUpload'; import { IFileUpload } from './helpers/fileUpload/interfaces'; import log from './helpers/log'; -import { E2E_MESSAGE_TYPE } from '../constants'; -import { store } from '../store/auxStore'; -import { compareServerVersion } from './helpers'; const uploadQueue: { [index: string]: StatefulPromise } = {}; @@ -89,8 +85,6 @@ export function sendFileMessage( } } - const encryptedFileInfo = await Encryption.encryptMessage(fileInfo); - const formData: IFileUpload[] = []; formData.push({ name: 'file', @@ -102,7 +96,7 @@ export function sendFileMessage( if (fileInfo.description) { formData.push({ name: 'description', - data: encryptedFileInfo.description + data: fileInfo.description }); } @@ -120,18 +114,6 @@ export function sendFileMessage( }); } - const { version: serverVersion } = store.getState().server; - if (encryptedFileInfo.t === E2E_MESSAGE_TYPE && compareServerVersion(serverVersion, 'greaterThanOrEqualTo', '6.8.0')) { - formData.push({ - name: 't', - data: encryptedFileInfo.t - }); - formData.push({ - name: 'e2e', - data: encryptedFileInfo.e2e - }); - } - const headers = { ...RocketChatSettings.customHeaders, 'Content-Type': 'multipart/form-data', diff --git a/app/views/CreateChannelView/RoomSettings/SwitchItemEncrypted.test.tsx b/app/views/CreateChannelView/RoomSettings/SwitchItemEncrypted.test.tsx index 1f18b44a6..a5f536d5a 100644 --- a/app/views/CreateChannelView/RoomSettings/SwitchItemEncrypted.test.tsx +++ b/app/views/CreateChannelView/RoomSettings/SwitchItemEncrypted.test.tsx @@ -45,7 +45,7 @@ describe('SwitchItemEncrypted', () => { const component = screen.queryByTestId(testEncrypted.testSwitchID); expect(component).toBeTruthy(); }); - + it('should change value of switch', () => { render( { expect(onPressMock).toHaveReturnedWith({ value: !testEncrypted.encrypted }); } }); - + it('label when encrypted and isTeam are false and is a public channel', () => { render( { const component = screen.queryByTestId(testEncrypted.testLabelID); expect(component?.props.children).toBe(i18n.t('Channel_hint_encrypted_not_available')); }); - + it('label when encrypted and isTeam are true and is a private team', () => { testEncrypted.isTeam = true; testEncrypted.type = true; diff --git a/app/views/ShareView/index.tsx b/app/views/ShareView/index.tsx index 6212ddd02..c1df448aa 100644 --- a/app/views/ShareView/index.tsx +++ b/app/views/ShareView/index.tsx @@ -257,7 +257,6 @@ class ShareView extends Component { return sendFileMessage( room.rid, { - rid: room.rid, name, description, size, @@ -351,8 +350,7 @@ class ShareView extends Component { selectedMessages, onSendMessage: this.send, onRemoveQuoteMessage: this.onRemoveQuoteMessage - }} - > + }}> Date: Tue, 30 Apr 2024 13:53:10 -0300 Subject: [PATCH 4/8] chore: Bump version to 4.49.0 (#5673) --- android/app/build.gradle | 2 +- ios/RocketChatRN.xcodeproj/project.pbxproj | 4 ++-- ios/RocketChatRN/Info.plist | 2 +- ios/ShareRocketChatRN/Info.plist | 2 +- package.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5c9807252..cd6013525 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -147,7 +147,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode VERSIONCODE as Integer - versionName "4.48.0" + versionName "4.49.0" vectorDrawables.useSupportLibrary = true if (!isFoss) { manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index e6ef83461..0a6214efa 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -2896,7 +2896,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.48.0; + MARKETING_VERSION = 4.49.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2936,7 +2936,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.48.0; + MARKETING_VERSION = 4.49.0; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist index 6a9f66567..e23b4bb69 100644 --- a/ios/RocketChatRN/Info.plist +++ b/ios/RocketChatRN/Info.plist @@ -26,7 +26,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.48.0 + 4.49.0 CFBundleSignature ???? CFBundleURLTypes diff --git a/ios/ShareRocketChatRN/Info.plist b/ios/ShareRocketChatRN/Info.plist index b84970bef..776ca2a07 100644 --- a/ios/ShareRocketChatRN/Info.plist +++ b/ios/ShareRocketChatRN/Info.plist @@ -26,7 +26,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.48.0 + 4.49.0 CFBundleVersion 1 KeychainGroup diff --git a/package.json b/package.json index 7182e4830..4780969c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket-chat-reactnative", - "version": "4.48.0", + "version": "4.49.0", "private": true, "scripts": { "start": "react-native start", From c42d196b15e47bc35239282038f295985a9fe44f Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Mon, 20 May 2024 14:41:11 -0400 Subject: [PATCH 5/8] feat: add message pinned icon (#5598) * feat: add message pinned icon * fix: add pinned to user * test: add e2e * test: updates tests * test: update storyshot * update tests * update snapshot * fix: update color --------- Co-authored-by: Diego Mello --- .../__snapshots__/Message.stories.storyshot | 2 ++ .../message/Components/RightIcons/Pinned.tsx | 11 +++++++++++ .../message/Components/RightIcons/index.tsx | 18 +++++++++++++++--- app/containers/message/Message.stories.tsx | 7 +++++++ app/containers/message/Message.tsx | 1 + app/containers/message/User.tsx | 2 ++ app/containers/message/index.tsx | 4 +++- app/containers/message/interfaces.ts | 1 + e2e/tests/room/03-roomactions.spec.ts | 9 ++++++++- 9 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 app/containers/message/Components/RightIcons/Pinned.tsx diff --git a/__tests__/containers/message/__snapshots__/Message.stories.storyshot b/__tests__/containers/message/__snapshots__/Message.stories.storyshot index 153f8c81a..444468a9b 100644 --- a/__tests__/containers/message/__snapshots__/Message.stories.storyshot +++ b/__tests__/containers/message/__snapshots__/Message.stories.storyshot @@ -48,6 +48,8 @@ exports[`Storyshots Message Message With Reply 1`] = `"{\\"type\\":\\"RCTScrollV exports[`Storyshots Message Message With Thread 1`] = `"{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"style\\":{\\"backgroundColor\\":\\"#FFFFFF\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4},{\\"marginTop\\":4}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=72\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"space-between\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"username-header-diego.mello\\",\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"flexShrink\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"flexShrink\\":1,\\"fontSize\\":16,\\"lineHeight\\":22,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1F2329\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"diego.mello\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":13,\\"marginLeft\\":8,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"10:00 AM\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"How are you?\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},[{},{\\"marginTop\\":0,\\"marginBottom\\":0,\\"flexWrap\\":\\"wrap\\",\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"flex-start\\",\\"justifyContent\\":\\"flex-start\\"}]]},\\"children\\":[\\"How are you?\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginTop\\":8,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingHorizontal\\":12,\\"paddingVertical\\":8,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\",\\"borderRadius\\":4},{\\"backgroundColor\\":\\"#1D74F5\\"}],\\"testID\\":\\"message-thread-button-How are you?\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":12,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#FFFFFF\\"}]},\\"children\\":[\\"Reply\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"},{\\"flex\\":1,\\"marginLeft\\":12}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginRight\\":8}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":24,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":24},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"testID\\":\\"thread-count-1\\",\\"style\\":[{\\"fontSize\\":10,\\"marginLeft\\":2,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"1\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginRight\\":8}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":24,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":24},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":10,\\"marginLeft\\":2,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"0\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":8,\\"height\\":8,\\"borderRadius\\":4,\\"marginRight\\":8},{\\"backgroundColor\\":\\"#095AD2\\"}]},\\"children\\":null},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":24,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":24},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]}]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginTop\\":6,\\"marginBottom\\":12},\\"testID\\":\\"message-thread-replied-on-How are you?\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":20},{\\"marginRight\\":10,\\"marginLeft\\":16}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"How are you?\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"},{\\"fontSize\\":16,\\"flex\\":1,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#1D74F5\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-How are you?\\"},\\"children\\":[\\"How are you?\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginLeft\\":4,\\"marginRight\\":4,\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#6C727A\\"},[{\\"lineHeight\\":20},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"I'm fine!\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-I'm fine!\\"},\\"children\\":[\\"I'm fine!\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginTop\\":6,\\"marginBottom\\":12},\\"testID\\":\\"message-thread-replied-on-Thread with emoji :) :joy:\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":20},{\\"marginRight\\":10,\\"marginLeft\\":16}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Thread with emoji🙂 😂\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"},{\\"fontSize\\":16,\\"flex\\":1,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#1D74F5\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Thread with emoji🙂 😂\\"},\\"children\\":[\\"Thread with emoji🙂 😂\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginLeft\\":4,\\"marginRight\\":4,\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#6C727A\\"},[{\\"lineHeight\\":20},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"I'm fine!\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-I'm fine!\\"},\\"children\\":[\\"I'm fine!\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginTop\\":6,\\"marginBottom\\":12},\\"testID\\":\\"message-thread-replied-on-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":20},{\\"marginRight\\":10,\\"marginLeft\\":16}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"},{\\"fontSize\\":16,\\"flex\\":1,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#1D74F5\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginLeft\\":4,\\"marginRight\\":4,\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#6C727A\\"},[{\\"lineHeight\\":20},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"I'm fine!\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-I'm fine!\\"},\\"children\\":[\\"I'm fine!\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginTop\\":6,\\"marginBottom\\":12},\\"testID\\":\\"message-thread-replied-on-How are you?\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":20},{\\"marginRight\\":10,\\"marginLeft\\":16}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"How are you?\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"},{\\"fontSize\\":16,\\"flex\\":1,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#1D74F5\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-How are you?\\"},\\"children\\":[\\"How are you?\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginLeft\\":4,\\"marginRight\\":4,\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#6C727A\\"},[{\\"lineHeight\\":20},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginTop\\":6,\\"marginBottom\\":12},\\"testID\\":\\"message-thread-replied-on-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":20},{\\"marginRight\\":10,\\"marginLeft\\":16}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"},{\\"fontSize\\":16,\\"flex\\":1,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#1D74F5\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginLeft\\":4,\\"marginRight\\":4,\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#6C727A\\"},[{\\"lineHeight\\":20},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginTop\\":6,\\"marginBottom\\":12},\\"testID\\":\\"message-thread-replied-on-Thread with attachment\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":20},{\\"marginRight\\":10,\\"marginLeft\\":16}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Thread with attachment\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"},{\\"fontSize\\":16,\\"flex\\":1,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#1D74F5\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Thread with attachment\\"},\\"children\\":[\\"Thread with attachment\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginLeft\\":4,\\"marginRight\\":4,\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":20,\\"color\\":\\"#6C727A\\"},[{\\"lineHeight\\":20},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":null}]}]}]}]}]}]}]}"`; +exports[`Storyshots Message Pinned 1`] = `"{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"style\\":{\\"backgroundColor\\":\\"#FFFFFF\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4},{\\"marginTop\\":4}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=72\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"space-between\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"username-header-diego.mello\\",\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"flexShrink\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"flexShrink\\":1,\\"fontSize\\":16,\\"lineHeight\\":22,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1F2329\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"diego.mello\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":13,\\"marginLeft\\":8,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"10:00 AM\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"testID\\":\\"undefined-pinned\\",\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":16,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":16},{\\"paddingLeft\\":5}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Message header\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},[{},{\\"marginTop\\":0,\\"marginBottom\\":0,\\"flexWrap\\":\\"wrap\\",\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"flex-start\\",\\"justifyContent\\":\\"flex-start\\"}]]},\\"children\\":[\\"Message header\\"]}]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},false]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Message without header\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},[{},{\\"marginTop\\":0,\\"marginBottom\\":0,\\"flexWrap\\":\\"wrap\\",\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"flex-start\\",\\"justifyContent\\":\\"flex-start\\"}]]},\\"children\\":[\\"Message without header\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"testID\\":\\"Message without header-pinned\\",\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":16,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":16},{\\"paddingLeft\\":5}],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]}]}]}]}]}]}"`; + exports[`Storyshots Message Reactions 1`] = `"{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"style\\":{\\"backgroundColor\\":\\"#FFFFFF\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4},{\\"marginTop\\":4}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=72\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"space-between\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"username-header-diego.mello\\",\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"flexShrink\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"flexShrink\\":1,\\"fontSize\\":16,\\"lineHeight\\":22,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1F2329\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"diego.mello\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":13,\\"marginLeft\\":8,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"10:00 AM\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Reactions\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},[{},{\\"marginTop\\":0,\\"marginBottom\\":0,\\"flexWrap\\":\\"wrap\\",\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"flex-start\\",\\"justifyContent\\":\\"flex-start\\"}]]},\\"children\\":[\\"Reactions\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"flexWrap\\":\\"wrap\\",\\"marginTop\\":8}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:joy:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"😂\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:marioparty:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#FFFFFF\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#CBCED1\\"}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":19,\\"height\\":19,\\"marginLeft\\":7}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/emoji-custom/marioparty.gif\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"99\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:thinking:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#FFFFFF\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#CBCED1\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"🤔\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"999\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:thinking:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#FFFFFF\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#CBCED1\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"🤔\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"9999\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-add-reaction\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#FFFFFF\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#CBCED1\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":21,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":21},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4},{\\"marginTop\\":4}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=72\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"space-between\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"username-header-diego.mello\\",\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"flexShrink\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"flexShrink\\":1,\\"fontSize\\":16,\\"lineHeight\\":22,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1F2329\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"diego.mello\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":13,\\"marginLeft\\":8,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"10:00 AM\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Multiple Reactions\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},[{},{\\"marginTop\\":0,\\"marginBottom\\":0,\\"flexWrap\\":\\"wrap\\",\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"flex-start\\",\\"justifyContent\\":\\"flex-start\\"}]]},\\"children\\":[\\"Multiple Reactions\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"flexWrap\\":\\"wrap\\",\\"marginTop\\":8}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:marioparty:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":19,\\"height\\":19,\\"marginLeft\\":7}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/emoji-custom/marioparty.gif\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:react_rocket:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":19,\\"height\\":19,\\"marginLeft\\":7}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/emoji-custom/react_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:nyan_rocket:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":19,\\"height\\":19,\\"marginLeft\\":7}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/emoji-custom/nyan_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:heart:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"❤️\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:dog:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"🐶\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:grinning:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"😀\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:grimacing:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"😬\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-reaction-:grin:\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#E4E7EA\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#1D74F5\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":13,\\"marginLeft\\":7,\\"color\\":\\"#ffffff\\"}},\\"children\\":[\\"😁\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"marginLeft\\":3,\\"marginRight\\":8.5,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1D74F5\\"}]},\\"children\\":[\\"1\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"message-add-reaction\\",\\"hitSlop\\":{\\"top\\":4,\\"right\\":4,\\"bottom\\":4,\\"left\\":4},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"marginRight\\":8,\\"marginBottom\\":8,\\"borderRadius\\":4,\\"backgroundColor\\":\\"#FFFFFF\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"borderRadius\\":4,\\"borderWidth\\":1,\\"height\\":28,\\"minWidth\\":46.3},{\\"borderColor\\":\\"#CBCED1\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":21,\\"color\\":\\"#1D74F5\\"},[{\\"lineHeight\\":21},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]}]}]}]}]}]}]}]}]}"`; exports[`Storyshots Message Sequential Thread Messages Following Thread Button 1`] = `"{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"style\\":{\\"backgroundColor\\":\\"#FFFFFF\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4},{\\"marginTop\\":4}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=72\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"justifyContent\\":\\"space-between\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"testID\\":\\"username-header-diego.mello\\",\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"flexShrink\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"flexShrink\\":1,\\"fontSize\\":16,\\"lineHeight\\":22,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#1F2329\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"diego.mello\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":13,\\"marginLeft\\":8,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"10:00 AM\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}]},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"How are you?\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},[{},{\\"marginTop\\":0,\\"marginBottom\\":0,\\"flexWrap\\":\\"wrap\\",\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"flex-start\\",\\"justifyContent\\":\\"flex-start\\"}]]},\\"children\\":[\\"How are you?\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginTop\\":8,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingHorizontal\\":12,\\"paddingVertical\\":8,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"justifyContent\\":\\"center\\",\\"borderRadius\\":4},{\\"backgroundColor\\":\\"#1D74F5\\"}],\\"testID\\":\\"message-thread-button-How are you?\\"},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":12,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#FFFFFF\\"}]},\\"children\\":[\\"Reply\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"},{\\"flex\\":1,\\"marginLeft\\":12}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginRight\\":8}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":24,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":24},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"testID\\":\\"thread-count-1\\",\\"style\\":[{\\"fontSize\\":10,\\"marginLeft\\":2,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"1\\"]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\",\\"marginRight\\":8}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":24,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":24},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":10,\\"marginLeft\\":2,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}],\\"numberOfLines\\":1},\\"children\\":[\\"0\\"]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":8,\\"height\\":8,\\"borderRadius\\":4,\\"marginRight\\":8},{\\"backgroundColor\\":\\"#095AD2\\"}]},\\"children\\":null},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"selectable\\":false,\\"allowFontScaling\\":false,\\"style\\":[{\\"fontSize\\":24,\\"color\\":\\"#2F343D\\"},[{\\"lineHeight\\":24},null],{\\"fontFamily\\":\\"custom\\",\\"fontWeight\\":\\"normal\\",\\"fontStyle\\":\\"normal\\"},{}]},\\"children\\":[\\"\\"]}]}]}]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"I'm fine!\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-I'm fine!\\"},\\"children\\":[\\"I'm fine!\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"accessibilityLabel\\":\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\",\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#2F343D\\"}],\\"numberOfLines\\":1,\\"testID\\":\\"markdown-preview-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"},\\"children\\":[\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\\"]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"accessibilityState\\":{\\"disabled\\":false},\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"paddingVertical\\":4,\\"width\\":\\"100%\\",\\"paddingHorizontal\\":14,\\"flexDirection\\":\\"column\\"},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4},{\\"marginLeft\\":16}],\\"testID\\":\\"avatar\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"accessible\\":true,\\"focusable\\":true,\\"collapsable\\":false,\\"style\\":{\\"opacity\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":20,\\"height\\":20,\\"borderRadius\\":4}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"https://open.rocket.chat/avatar/diego.mello?format=png&size=40\\",\\"headers\\":{\\"User-Agent\\":\\"RC Mobile; ios unknown; vunknown (unknown)\\"},\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"cover\\"},\\"children\\":null}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1,\\"marginLeft\\":46},{\\"marginLeft\\":10}]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":null}]}]}]}]}]}]}]}"`; diff --git a/app/containers/message/Components/RightIcons/Pinned.tsx b/app/containers/message/Components/RightIcons/Pinned.tsx new file mode 100644 index 000000000..5c2f87150 --- /dev/null +++ b/app/containers/message/Components/RightIcons/Pinned.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +import { CustomIcon } from '../../../CustomIcon'; +import styles from '../../styles'; + +const Pinned = ({ pinned, testID }: { pinned?: boolean; testID?: string }): React.ReactElement | null => { + if (pinned) return ; + return null; +}; + +export default Pinned; diff --git a/app/containers/message/Components/RightIcons/index.tsx b/app/containers/message/Components/RightIcons/index.tsx index 84f6a95c4..94a7b1efd 100644 --- a/app/containers/message/Components/RightIcons/index.tsx +++ b/app/containers/message/Components/RightIcons/index.tsx @@ -1,12 +1,13 @@ import React from 'react'; import { StyleSheet, View } from 'react-native'; -import Encrypted from './Encrypted'; +import { MessageType } from '../../../../definitions'; import Edited from './Edited'; +import Encrypted from './Encrypted'; import MessageError from './MessageError'; +import Pinned from './Pinned'; import ReadReceipt from './ReadReceipt'; import Translated from './Translated'; -import { MessageType } from '../../../../definitions'; const styles = StyleSheet.create({ actionIcons: { @@ -22,10 +23,21 @@ interface IRightIcons { unread?: boolean; hasError: boolean; isTranslated: boolean; + pinned?: boolean; } -const RightIcons = ({ type, msg, isEdited, hasError, isReadReceiptEnabled, unread, isTranslated }: IRightIcons) => ( +const RightIcons = ({ + type, + msg, + isEdited, + hasError, + isReadReceiptEnabled, + unread, + isTranslated, + pinned +}: IRightIcons): React.ReactElement => ( + diff --git a/app/containers/message/Message.stories.tsx b/app/containers/message/Message.stories.tsx index 477e89fea..ecb05a95f 100644 --- a/app/containers/message/Message.stories.tsx +++ b/app/containers/message/Message.stories.tsx @@ -127,6 +127,13 @@ export const Edited = () => ( ); +export const Pinned = () => ( + <> + + + +); + export const Translated = () => ( <> diff --git a/app/containers/message/Message.tsx b/app/containers/message/Message.tsx index e1f67233e..61040dfc0 100644 --- a/app/containers/message/Message.tsx +++ b/app/containers/message/Message.tsx @@ -117,6 +117,7 @@ const Message = React.memo((props: IMessage) => { hasError={props.hasError} isReadReceiptEnabled={props.isReadReceiptEnabled} unread={props.unread} + pinned={props.pinned} isTranslated={props.isTranslated} /> ) : null} diff --git a/app/containers/message/User.tsx b/app/containers/message/User.tsx index 3c4cb5f47..90094df0e 100644 --- a/app/containers/message/User.tsx +++ b/app/containers/message/User.tsx @@ -60,6 +60,7 @@ interface IMessageUser { isEdited: boolean; isReadReceiptEnabled?: boolean; unread?: boolean; + pinned?: boolean; isTranslated: boolean; } @@ -124,6 +125,7 @@ const User = React.memo( hasError={hasError} isReadReceiptEnabled={props.isReadReceiptEnabled} unread={props.unread} + pinned={props.pinned} isTranslated={isTranslated} /> diff --git a/app/containers/message/index.tsx b/app/containers/message/index.tsx index a0572d8d8..0024abebc 100644 --- a/app/containers/message/index.tsx +++ b/app/containers/message/index.tsx @@ -390,7 +390,8 @@ class MessageContainer extends React.Component ); diff --git a/app/containers/message/interfaces.ts b/app/containers/message/interfaces.ts index c357b2eab..d536ef00d 100644 --- a/app/containers/message/interfaces.ts +++ b/app/containers/message/interfaces.ts @@ -64,6 +64,7 @@ export interface IMessageContent { hasError: boolean; isHeader: boolean; isTranslated: boolean; + pinned?: boolean; } export interface IMessageEmoji { diff --git a/e2e/tests/room/03-roomactions.spec.ts b/e2e/tests/room/03-roomactions.spec.ts index bbde45afb..b0a84a6e7 100644 --- a/e2e/tests/room/03-roomactions.spec.ts +++ b/e2e/tests/room/03-roomactions.spec.ts @@ -194,7 +194,10 @@ describe('Room actions screen', () => { // Pin the message await pinMessage(messageToPin); - + // verify pin icon + await waitFor(element(by.id(`${messageToPin}-pinned`))) + .toExist() + .withTimeout(6000); // Back into Room Actions await element(by.id('room-header')).tap(); await waitFor(element(by.id('room-actions-view'))) @@ -220,6 +223,10 @@ describe('Room actions screen', () => { await waitFor(element(by[textMatcher](messageToPin).withAncestor(by.id('pinned-messages-view')))) .not.toExist() .withTimeout(6000); + // verify pin icon + await waitFor(element(by.id(`${messageToPin}-pinned`))) + .not.toExist() + .withTimeout(6000); await backToActions(); }); }); From 0ffa528e2aa914a55dd4dfc89a128f42583dc074 Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Mon, 20 May 2024 15:01:45 -0400 Subject: [PATCH 6/8] fix: fixes sending files to start a thread (#5670) Co-authored-by: Diego Mello --- .../MessageComposer/hooks/useChooseMedia.ts | 2 +- app/stacks/types.ts | 2 +- app/views/ShareView/Header.tsx | 36 ++++++++++++++----- app/views/ShareView/index.tsx | 13 ++++--- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/app/containers/MessageComposer/hooks/useChooseMedia.ts b/app/containers/MessageComposer/hooks/useChooseMedia.ts index 2a43ba5a7..a99d9a148 100644 --- a/app/containers/MessageComposer/hooks/useChooseMedia.ts +++ b/app/containers/MessageComposer/hooks/useChooseMedia.ts @@ -136,7 +136,7 @@ export const useChooseMedia = ({ // FIXME: use useNavigation Navigation.navigate('ShareView', { room, - thread, + thread: thread || tmid, attachments, action, finishShareView, diff --git a/app/stacks/types.ts b/app/stacks/types.ts index 0356c01c6..da4af0599 100644 --- a/app/stacks/types.ts +++ b/app/stacks/types.ts @@ -276,7 +276,7 @@ export type InsideStackParamList = { serverInfo: IServer; text: string; room: TSubscriptionModel; - thread: TThreadModel; + thread: TThreadModel | string; action: TMessageAction; finishShareView: (text?: string, selectedMessages?: string[]) => void | undefined; startShareView: () => { text: string; selectedMessages: string[] }; diff --git a/app/views/ShareView/Header.tsx b/app/views/ShareView/Header.tsx index 0e8113305..63cf0cb43 100644 --- a/app/views/ShareView/Header.tsx +++ b/app/views/ShareView/Header.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { StyleSheet, Text, View } from 'react-native'; import I18n from '../../i18n'; @@ -9,6 +9,7 @@ import sharedStyles from '../Styles'; import { makeThreadName } from '../../lib/methods/helpers/room'; import { ISubscription, TThreadModel } from '../../definitions'; import { getRoomTitle, isGroupChat, isAndroid, isTablet } from '../../lib/methods/helpers'; +import { getMessageById } from '../../lib/database/services/Message'; const androidMarginLeft = isTablet ? 0 : 4; @@ -36,13 +37,14 @@ const styles = StyleSheet.create({ interface IHeader { room: ISubscription; - thread: TThreadModel; + thread: TThreadModel | string; } const Header = React.memo(({ room, thread }: IHeader) => { + const [title, setTitle] = useState(''); const { theme } = useTheme(); let type; - if (thread?.id) { + if ((thread as TThreadModel)?.id || typeof thread === 'string') { type = 'thread'; } else if (room?.prid) { type = 'discussion'; @@ -70,12 +72,28 @@ const Header = React.memo(({ room, thread }: IHeader) => { const textColor = themes[theme].fontDefault; - let title; - if (thread?.id) { - title = makeThreadName(thread); - } else { - title = getRoomTitle(room); - } + useEffect(() => { + (async () => { + if ((thread as TThreadModel)?.id) { + const name = makeThreadName(thread as TThreadModel); + if (name) { + setTitle(name); + return; + } + } + if (typeof thread === 'string') { + // only occurs when sending images and there is no message in the thread + const data = await getMessageById(thread); + const msg = data?.asPlain()?.msg; + if (msg) { + setTitle(msg); + return; + } + } + const name = getRoomTitle(room); + setTitle(name); + })(); + }, []); return ( diff --git a/app/views/ShareView/index.tsx b/app/views/ShareView/index.tsx index c1df448aa..bbe8c3e9f 100644 --- a/app/views/ShareView/index.tsx +++ b/app/views/ShareView/index.tsx @@ -43,7 +43,7 @@ interface IShareViewState { attachments: IShareAttachment[]; text: string; room: TSubscriptionModel; - thread: TThreadModel; + thread: TThreadModel | string; maxFileSize?: number; mediaAllowList?: string; selectedMessages: string[]; @@ -88,7 +88,7 @@ class ShareView extends Component { attachments: [], text: props.route.params?.text ?? '', room: props.route.params?.room ?? {}, - thread: props.route.params?.thread ?? {}, + thread: props.route.params?.thread ?? '', maxFileSize: this.isShareExtension ? this.serverInfo?.FileUpload_MaxFileSize : props.FileUpload_MaxFileSize, mediaAllowList: this.isShareExtension ? this.serverInfo?.FileUpload_MediaTypeWhiteList @@ -265,7 +265,7 @@ class ShareView extends Component { store: 'Uploads', msg }, - thread?.id, + (thread as TThreadModel)?.id || (thread as string), server, { id: user.id, token: user.token } ); @@ -276,7 +276,10 @@ class ShareView extends Component { // Send text message } else if (text.length) { - await sendMessage(room.rid, text, thread?.id, { id: user.id, token: user.token } as IUser); + await sendMessage(room.rid, text, (thread as TThreadModel)?.id || (thread as string), { + id: user.id, + token: user.token + } as IUser); } } catch { if (!this.isShareExtension) { @@ -344,7 +347,7 @@ class ShareView extends Component { value={{ rid: room.rid, t: room.t, - tmid: thread.id, + tmid: (thread as TThreadModel)?.id || (thread as string), sharing: true, action: route.params?.action, selectedMessages, From 02b3afda3c9149a636404656a06fb58178df64d7 Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Mon, 20 May 2024 15:21:31 -0400 Subject: [PATCH 7/8] feat: remove rn-fetch-blob (#5669) * feat: remove rn-fetch-blob * fix types * jest --- .../networking/SSLPinningModule.java | 4 - app/containers/Toast.tsx | 5 +- app/containers/message/Reply.tsx | 24 +-- app/containers/message/Video.tsx | 3 +- .../message/helpers/fileDownload/index.ts | 53 ------ app/lib/constants/index.ts | 1 - app/lib/constants/localPath.ts | 4 - app/lib/methods/getServerInfo.ts | 17 +- app/lib/methods/helpers/fileDownload.ts | 33 ++++ app/lib/methods/helpers/fileUpload.ts | 66 ++++++++ .../methods/helpers/fileUpload/index.ios.ts | 60 ------- app/lib/methods/helpers/fileUpload/index.ts | 25 --- .../methods/helpers/fileUpload/interfaces.ts | 7 - app/lib/methods/helpers/index.ts | 1 + app/lib/methods/sendFileMessage.ts | 12 +- app/lib/services/getServerTimeSync.ts | 12 +- app/views/AttachmentView.tsx | 12 +- ios/Podfile.lock | 6 - jest.setup.js | 12 -- package.json | 1 - patches/rn-fetch-blob+0.12.0.patch | 153 ------------------ yarn.lock | 28 +--- 22 files changed, 140 insertions(+), 399 deletions(-) delete mode 100644 app/containers/message/helpers/fileDownload/index.ts delete mode 100644 app/lib/constants/localPath.ts create mode 100644 app/lib/methods/helpers/fileDownload.ts create mode 100644 app/lib/methods/helpers/fileUpload.ts delete mode 100644 app/lib/methods/helpers/fileUpload/index.ios.ts delete mode 100644 app/lib/methods/helpers/fileUpload/index.ts delete mode 100644 app/lib/methods/helpers/fileUpload/interfaces.ts delete mode 100644 patches/rn-fetch-blob+0.12.0.patch diff --git a/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningModule.java b/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningModule.java index aad807859..b4224bf88 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningModule.java +++ b/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningModule.java @@ -32,8 +32,6 @@ import android.security.KeyChainAliasCallback; import java.util.Arrays; import java.util.concurrent.TimeUnit; -import com.RNFetchBlob.RNFetchBlob; - import com.reactnativecommunity.webview.RNCWebViewManager; import com.dylanvann.fastimage.FastImageOkHttpUrlLoader; @@ -104,8 +102,6 @@ public class SSLPinningModule extends ReactContextBaseJavaModule implements KeyC WebSocketModule.setCustomClientBuilder(new CustomClient()); // Image networking react-native layer ReactOkHttpNetworkFetcher.setOkHttpClient(getOkHttpClient()); - // RNFetchBlob networking layer - RNFetchBlob.applyCustomOkHttpClient(getOkHttpClient()); // RNCWebView onReceivedClientCertRequest RNCWebViewManager.setCertificateAlias(data); // FastImage Glide network layer diff --git a/app/containers/Toast.tsx b/app/containers/Toast.tsx index 781ad5b59..cd538734c 100644 --- a/app/containers/Toast.tsx +++ b/app/containers/Toast.tsx @@ -13,8 +13,9 @@ const styles = StyleSheet.create({ }, text: { fontSize: 14, - ...sharedStyles.textRegular, - ...sharedStyles.textAlignCenter + // jest error: TypeError: Cannot read property 'textRegular' of undefined + ...sharedStyles?.textRegular, + ...sharedStyles?.textAlignCenter } }); diff --git a/app/containers/message/Reply.tsx b/app/containers/message/Reply.tsx index bfcd85cbf..f45985bcb 100644 --- a/app/containers/message/Reply.tsx +++ b/app/containers/message/Reply.tsx @@ -1,21 +1,21 @@ +import { dequal } from 'dequal'; +import moment from 'moment'; import React, { useContext, useState } from 'react'; import { StyleSheet, Text, View } from 'react-native'; -import moment from 'moment'; -import { dequal } from 'dequal'; import FastImage from 'react-native-fast-image'; -import Touchable from './Touchable'; -import Markdown from '../markdown'; -import openLink from '../../lib/methods/helpers/openLink'; -import sharedStyles from '../../views/Styles'; -import { themes } from '../../lib/constants'; -import MessageContext from './Context'; -import { fileDownloadAndPreview } from './helpers/fileDownload'; import { IAttachment, TGetCustomEmoji } from '../../definitions'; -import RCActivityIndicator from '../ActivityIndicator'; -import Attachments from './Attachments'; -import { TSupportedThemes, useTheme } from '../../theme'; +import { themes } from '../../lib/constants'; +import { fileDownloadAndPreview } from '../../lib/methods/helpers'; import { formatAttachmentUrl } from '../../lib/methods/helpers/formatAttachmentUrl'; +import openLink from '../../lib/methods/helpers/openLink'; +import { TSupportedThemes, useTheme } from '../../theme'; +import sharedStyles from '../../views/Styles'; +import RCActivityIndicator from '../ActivityIndicator'; +import Markdown from '../markdown'; +import Attachments from './Attachments'; +import MessageContext from './Context'; +import Touchable from './Touchable'; import messageStyles from './styles'; const styles = StyleSheet.create({ diff --git a/app/containers/message/Video.tsx b/app/containers/message/Video.tsx index 54a8bee4a..ff4d52eed 100644 --- a/app/containers/message/Video.tsx +++ b/app/containers/message/Video.tsx @@ -14,7 +14,7 @@ import { isDownloadActive, resumeMediaFile } from '../../lib/methods/handleMediaDownload'; -import { isIOS } from '../../lib/methods/helpers'; +import { fileDownload, isIOS } from '../../lib/methods/helpers'; import EventEmitter from '../../lib/methods/helpers/events'; import { formatAttachmentUrl } from '../../lib/methods/helpers/formatAttachmentUrl'; import { useTheme } from '../../theme'; @@ -24,7 +24,6 @@ import Markdown from '../markdown'; import BlurComponent from './Components/OverlayComponent'; import MessageContext from './Context'; import Touchable from './Touchable'; -import { fileDownload } from './helpers/fileDownload'; import { DEFAULT_MESSAGE_HEIGHT } from './utils'; const SUPPORTED_TYPES = ['video/quicktime', 'video/mp4', ...(isIOS ? [] : ['video/3gp', 'video/mkv'])]; diff --git a/app/containers/message/helpers/fileDownload/index.ts b/app/containers/message/helpers/fileDownload/index.ts deleted file mode 100644 index 73c7faa82..000000000 --- a/app/containers/message/helpers/fileDownload/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import RNFetchBlob, { FetchBlobResponse } from 'rn-fetch-blob'; -import FileViewer from 'react-native-file-viewer'; - -import EventEmitter from '../../../../lib/methods/helpers/events'; -import { LISTENER } from '../../../Toast'; -import I18n from '../../../../i18n'; -import { DOCUMENTS_PATH, DOWNLOAD_PATH } from '../../../../lib/constants'; -import { IAttachment } from '../../../../definitions'; - -export const getLocalFilePathFromFile = (localPath: string, attachment: IAttachment): string => `${localPath}${attachment.title}`; - -export const fileDownload = (url: string, attachment: IAttachment): Promise => { - const path = getLocalFilePathFromFile(DOWNLOAD_PATH, attachment); - - const options = { - path, - timeout: 10000, - indicator: true, - overwrite: true, - addAndroidDownloads: { - path, - notification: true, - useDownloadManager: true - } - }; - - return RNFetchBlob.config(options).fetch('GET', url); -}; - -export const fileDownloadAndPreview = async (url: string, attachment: IAttachment): Promise => { - try { - const path = getLocalFilePathFromFile(DOCUMENTS_PATH, attachment); - const file = await RNFetchBlob.config({ - timeout: 10000, - indicator: true, - path - }).fetch('GET', url); - - FileViewer.open(file.data, { - showOpenWithDialog: true, - showAppsSuggestions: true - }) - .then(res => res) - .catch(async () => { - const file = await fileDownload(url, attachment); - file - ? EventEmitter.emit(LISTENER, { message: I18n.t('Downloaded_file') }) - : EventEmitter.emit(LISTENER, { message: I18n.t('Error_Download_file') }); - }); - } catch (e) { - EventEmitter.emit(LISTENER, { message: I18n.t('Error_Download_file') }); - } -}; diff --git a/app/lib/constants/index.ts b/app/lib/constants/index.ts index 442c06d6a..5be7d6ec1 100644 --- a/app/lib/constants/index.ts +++ b/app/lib/constants/index.ts @@ -6,7 +6,6 @@ export * from './environment'; export * from './keys'; export * from './links'; export * from './localAuthentication'; -export * from './localPath'; export * from './messagesStatus'; export * from './messageTypeLoad'; export * from './notifications'; diff --git a/app/lib/constants/localPath.ts b/app/lib/constants/localPath.ts deleted file mode 100644 index 704e2b6b6..000000000 --- a/app/lib/constants/localPath.ts +++ /dev/null @@ -1,4 +0,0 @@ -import RNFetchBlob from 'rn-fetch-blob'; - -export const DOCUMENTS_PATH = `${RNFetchBlob.fs.dirs.DocumentDir}/`; -export const DOWNLOAD_PATH = `${RNFetchBlob.fs.dirs.DownloadDir}/`; diff --git a/app/lib/methods/getServerInfo.ts b/app/lib/methods/getServerInfo.ts index c05d4e8f8..7b790c7f6 100644 --- a/app/lib/methods/getServerInfo.ts +++ b/app/lib/methods/getServerInfo.ts @@ -1,4 +1,3 @@ -import RNFetchBlob from 'rn-fetch-blob'; import { settings as RocketChatSettings } from '@rocket.chat/sdk'; import { KJUR } from 'jsrsasign'; import moment from 'moment'; @@ -45,12 +44,12 @@ const verifyJWT = (jwt?: string): ISupportedVersionsData | null => { export async function getServerInfo(server: string): Promise { try { - const response = await RNFetchBlob.fetch('GET', `${server}/api/info`, { + const response = await fetch(`${server}/api/info`, { ...RocketChatSettings.customHeaders }); try { - const jsonRes: IApiServerInfo = response.json(); - if (!jsonRes?.success) { + const serverInfo: IApiServerInfo = await response.json(); + if (!serverInfo?.success) { return { success: false, message: I18n.t('Not_RC_Server', { contact: I18n.t('Contact_your_server_admin') }) @@ -58,7 +57,7 @@ export async function getServerInfo(server: string): Promise } // Makes use of signed JWT to get supported versions - const supportedVersions = verifyJWT(jsonRes.supportedVersions?.signed); + const supportedVersions = verifyJWT(serverInfo.supportedVersions?.signed); // if backend doesn't have supported versions or JWT is invalid, request from cloud if (!supportedVersions) { @@ -69,7 +68,7 @@ export async function getServerInfo(server: string): Promise moment(new Date()).diff(serverRecord?.supportedVersionsUpdatedAt, 'hours') <= SV_CLOUD_UPDATE_INTERVAL ) { return { - ...jsonRes, + ...serverInfo, success: true }; } @@ -79,7 +78,7 @@ export async function getServerInfo(server: string): Promise // Allows airgapped servers to use the app until enforcementStartDate if (!cloudInfo) { return { - ...jsonRes, + ...serverInfo, success: true }; } @@ -88,14 +87,14 @@ export async function getServerInfo(server: string): Promise const supportedVersionsCloud = verifyJWT(cloudInfo?.signed); return { - ...jsonRes, + ...serverInfo, success: true, supportedVersions: supportedVersionsCloud }; } return { - ...jsonRes, + ...serverInfo, success: true, supportedVersions }; diff --git a/app/lib/methods/helpers/fileDownload.ts b/app/lib/methods/helpers/fileDownload.ts new file mode 100644 index 000000000..af255452d --- /dev/null +++ b/app/lib/methods/helpers/fileDownload.ts @@ -0,0 +1,33 @@ +import * as FileSystem from 'expo-file-system'; +import FileViewer from 'react-native-file-viewer'; + +import { LISTENER } from '../../../containers/Toast'; +import { IAttachment } from '../../../definitions'; +import i18n from '../../../i18n'; +import EventEmitter from './events'; + +export const getLocalFilePathFromFile = (localPath: string, attachment: IAttachment): string => `${localPath}${attachment.title}`; + +export const fileDownload = async (url: string, attachment?: IAttachment, fileName?: string): Promise => { + let path = `${FileSystem.documentDirectory}`; + if (fileName) { + path = `${path}${fileName}`; + } + if (attachment) { + path = `${path}${attachment.title}`; + } + const file = await FileSystem.downloadAsync(url, path); + return file.uri; +}; + +export const fileDownloadAndPreview = async (url: string, attachment: IAttachment): Promise => { + try { + const file = await fileDownload(url, attachment); + FileViewer.open(file, { + showOpenWithDialog: true, + showAppsSuggestions: true + }); + } catch (e) { + EventEmitter.emit(LISTENER, { message: i18n.t('Error_Download_file') }); + } +}; diff --git a/app/lib/methods/helpers/fileUpload.ts b/app/lib/methods/helpers/fileUpload.ts new file mode 100644 index 000000000..d711d095b --- /dev/null +++ b/app/lib/methods/helpers/fileUpload.ts @@ -0,0 +1,66 @@ +export interface IFileUpload { + name: string; + uri?: string; + type?: string; + filename?: string; + data?: any; +} + +export class Upload { + public xhr: XMLHttpRequest; + public formData: FormData; + + constructor() { + this.xhr = new XMLHttpRequest(); + this.formData = new FormData(); + } + + public setupRequest(url: string, headers: { [key: string]: string }): void { + this.xhr.open('POST', url); + Object.keys(headers).forEach(key => { + this.xhr.setRequestHeader(key, headers[key]); + }); + } + + public appendFile(item: IFileUpload): void { + if (item.uri) { + this.formData.append(item.name, { + uri: item.uri, + type: item.type, + name: item.filename + } as any); + } else { + this.formData.append(item.name, item.data); + } + } + + public then(callback: (param: { respInfo: XMLHttpRequest }) => void): void { + this.xhr.onload = () => callback({ respInfo: this.xhr }); + this.xhr.send(this.formData); + } + + public catch(callback: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null): void { + this.xhr.onerror = callback; + } + + public uploadProgress(callback: (param: number, arg1: number) => any): void { + this.xhr.upload.onprogress = ({ total, loaded }) => callback(loaded, total); + } + + public cancel(): Promise { + this.xhr.abort(); + return Promise.resolve(); + } +} + +class FileUpload { + public uploadFile(url: string, headers: { [x: string]: string }, data: IFileUpload[]) { + const upload = new Upload(); + upload.setupRequest(url, headers); + data.forEach(item => upload.appendFile(item)); + return upload; + } +} + +const fileUpload = new FileUpload(); +export default fileUpload; diff --git a/app/lib/methods/helpers/fileUpload/index.ios.ts b/app/lib/methods/helpers/fileUpload/index.ios.ts deleted file mode 100644 index 96c2ae355..000000000 --- a/app/lib/methods/helpers/fileUpload/index.ios.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { IFileUpload } from './interfaces'; - -class Upload { - public xhr: XMLHttpRequest; - - public formData: FormData; - - constructor() { - this.xhr = new XMLHttpRequest(); - this.formData = new FormData(); - } - - then = (callback: (param: { respInfo: XMLHttpRequest }) => XMLHttpRequest) => { - this.xhr.onload = () => callback({ respInfo: this.xhr }); - this.xhr.send(this.formData); - }; - - catch = (callback: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null) => { - this.xhr.onerror = callback; - }; - - uploadProgress = (callback: (param: number, arg1: number) => any) => { - this.xhr.upload.onprogress = ({ total, loaded }) => callback(loaded, total); - }; - - cancel = () => { - this.xhr.abort(); - return Promise.resolve(); - }; -} - -class FileUpload { - fetch = (method: string, url: string, headers: { [x: string]: string }, data: IFileUpload[]) => { - const upload = new Upload(); - upload.xhr.open(method, url); - - Object.keys(headers).forEach(key => { - upload.xhr.setRequestHeader(key, headers[key]); - }); - - data.forEach(item => { - if (item.uri) { - upload.formData.append(item.name, { - // @ts-ignore - uri: item.uri, - // @ts-ignore - type: item.type, - name: item.filename - }); - } else { - upload.formData.append(item.name, item.data); - } - }); - - return upload; - }; -} - -const fileUpload = new FileUpload(); -export default fileUpload; diff --git a/app/lib/methods/helpers/fileUpload/index.ts b/app/lib/methods/helpers/fileUpload/index.ts deleted file mode 100644 index bf23212c4..000000000 --- a/app/lib/methods/helpers/fileUpload/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import RNFetchBlob from 'rn-fetch-blob'; - -import { TMethods } from '../fetch'; -import { IFileUpload } from './interfaces'; - -class FileUpload { - fetch = (method: TMethods, url: string, headers: { [key: string]: string }, data: IFileUpload[]) => { - const formData = data.map(item => { - if (item.uri) { - return { - name: item.name, - type: item.type, - filename: item.filename, - data: RNFetchBlob.wrap(decodeURI(item.uri)) - }; - } - return item; - }); - - return RNFetchBlob.fetch(method, url, headers, formData); - }; -} - -const fileUpload = new FileUpload(); -export default fileUpload; diff --git a/app/lib/methods/helpers/fileUpload/interfaces.ts b/app/lib/methods/helpers/fileUpload/interfaces.ts deleted file mode 100644 index 91b0d7d46..000000000 --- a/app/lib/methods/helpers/fileUpload/interfaces.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface IFileUpload { - name: string; - uri?: string; - type?: string; - filename?: string; - data?: any; -} diff --git a/app/lib/methods/helpers/index.ts b/app/lib/methods/helpers/index.ts index 65ae74993..58dfa6fef 100644 --- a/app/lib/methods/helpers/index.ts +++ b/app/lib/methods/helpers/index.ts @@ -18,3 +18,4 @@ export * from './image'; export * from './askAndroidMediaPermissions'; export * from './emitter'; export * from './parseJson'; +export * from './fileDownload'; diff --git a/app/lib/methods/sendFileMessage.ts b/app/lib/methods/sendFileMessage.ts index 8886f6064..43a2aa6cf 100644 --- a/app/lib/methods/sendFileMessage.ts +++ b/app/lib/methods/sendFileMessage.ts @@ -1,17 +1,16 @@ import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import { settings as RocketChatSettings } from '@rocket.chat/sdk'; import isEmpty from 'lodash/isEmpty'; -import { FetchBlobResponse, StatefulPromise } from 'rn-fetch-blob'; import { Alert } from 'react-native'; import { IUpload, IUser, TUploadModel } from '../../definitions'; import i18n from '../../i18n'; import database from '../database'; +import type { IFileUpload, Upload } from './helpers/fileUpload'; import FileUpload from './helpers/fileUpload'; -import { IFileUpload } from './helpers/fileUpload/interfaces'; import log from './helpers/log'; -const uploadQueue: { [index: string]: StatefulPromise } = {}; +const uploadQueue: { [index: string]: Upload } = {}; const getUploadPath = (path: string, rid: string) => `${path}-${rid}`; @@ -48,7 +47,7 @@ export function sendFileMessage( server: string, user: Partial>, isForceTryAgain?: boolean -): Promise { +): Promise { return new Promise(async (resolve, reject) => { try { const { id, token } = user; @@ -121,7 +120,7 @@ export function sendFileMessage( 'X-User-Id': id }; - uploadQueue[uploadPath] = FileUpload.fetch('POST', uploadUrl, headers, formData); + uploadQueue[uploadPath] = FileUpload.uploadFile(uploadUrl, headers, formData); uploadQueue[uploadPath].uploadProgress(async (loaded: number, total: number) => { try { @@ -137,12 +136,11 @@ export function sendFileMessage( uploadQueue[uploadPath].then(async response => { if (response.respInfo.status >= 200 && response.respInfo.status < 400) { - // If response is all good... try { await db.write(async () => { await uploadRecord.destroyPermanently(); }); - resolve(response); + resolve(); } catch (e) { log(e); } diff --git a/app/lib/services/getServerTimeSync.ts b/app/lib/services/getServerTimeSync.ts index da50c07ed..9bce93451 100644 --- a/app/lib/services/getServerTimeSync.ts +++ b/app/lib/services/getServerTimeSync.ts @@ -1,13 +1,9 @@ -import RNFetchBlob from 'rn-fetch-blob'; - export const getServerTimeSync = async (server: string) => { try { - const response = await Promise.race([ - RNFetchBlob.fetch('GET', `${server}/_timesync`), - new Promise(res => setTimeout(res, 2000)) - ]); - if (response?.data) { - return parseInt(response.data); + const response = await Promise.race([fetch(`${server}/_timesync`), new Promise(res => setTimeout(res, 2000))]); + const data = await response?.json(); + if (data?.data) { + return parseInt(data.data); } return null; } catch { diff --git a/app/views/AttachmentView.tsx b/app/views/AttachmentView.tsx index 28d375d83..ffec75a11 100644 --- a/app/views/AttachmentView.tsx +++ b/app/views/AttachmentView.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { PermissionsAndroid, useWindowDimensions, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { shallowEqual } from 'react-redux'; -import RNFetchBlob from 'rn-fetch-blob'; +import * as FileSystem from 'expo-file-system'; import { isImageBase64 } from '../lib/methods'; import RCActivityIndicator from '../containers/ActivityIndicator'; @@ -18,7 +18,7 @@ import { IAttachment } from '../definitions'; import I18n from '../i18n'; import { useAppSelector } from '../lib/hooks'; import { useAppNavigation, useAppRoute } from '../lib/hooks/navigation'; -import { formatAttachmentUrl, isAndroid } from '../lib/methods/helpers'; +import { formatAttachmentUrl, isAndroid, fileDownload } from '../lib/methods/helpers'; import EventEmitter from '../lib/methods/helpers/events'; import { getUserSelector } from '../selectors/login'; import { TNavigation } from '../stacks/stackType'; @@ -177,11 +177,9 @@ const AttachmentView = (): React.ReactElement => { } else { filename = getFilename({ title: attachment.title, type: 'video', mimeType: video_type, url }); } - const documentDir = `${RNFetchBlob.fs.dirs.DocumentDir}/`; - const path = `${documentDir + filename}`; - const file = await RNFetchBlob.config({ path }).fetch('GET', mediaAttachment); - await CameraRoll.save(path, { album: 'Rocket.Chat' }); - file.flush(); + const file = await fileDownload(mediaAttachment, {}, filename); + await CameraRoll.save(file, { album: 'Rocket.Chat' }); + FileSystem.deleteAsync(file, { idempotent: true }); } EventEmitter.emit(LISTENER, { message: I18n.t('saved_to_gallery') }); } catch (e) { diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d67fe6338..7b9eabf1a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -484,8 +484,6 @@ PODS: - React - rn-extensions-share (2.4.1): - React - - rn-fetch-blob (0.12.0): - - React-Core - RNBootSplash (4.3.3): - React-Core - RNCAsyncStorage (1.17.11): @@ -653,7 +651,6 @@ DEPENDENCIES: - "ReactNativeART (from `../node_modules/@react-native-community/art`)" - ReactNativeUiLib (from `../node_modules/react-native-ui-lib`) - rn-extensions-share (from `../node_modules/rn-extensions-share`) - - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - RNBootSplash (from `../node_modules/react-native-bootsplash`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" @@ -827,8 +824,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-ui-lib" rn-extensions-share: :path: "../node_modules/rn-extensions-share" - rn-fetch-blob: - :path: "../node_modules/rn-fetch-blob" RNBootSplash: :path: "../node_modules/react-native-bootsplash" RNCAsyncStorage: @@ -962,7 +957,6 @@ SPEC CHECKSUMS: ReactNativeART: 78edc68dd4a1e675338cd0cd113319cf3a65f2ab ReactNativeUiLib: 33521c0747ea376d292b62b6415e0f1d75bd3c10 rn-extensions-share: 5fd84a80e6594706f0dfa1884f2d6d591b382cf5 - rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba RNBootSplash: 7e91ea56c7010aae487489789dbe212e8c905a0c RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 RNCClipboard: cc054ad1e8a33d2a74cd13e565588b4ca928d8fd diff --git a/jest.setup.js b/jest.setup.js index e8e2bcfcd..12204dbb8 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -29,18 +29,6 @@ jest.mock('react-native-reanimated', () => require('react-native-reanimated/mock jest.mock('@react-native-clipboard/clipboard', () => mockClipboard); -jest.mock('rn-fetch-blob', () => ({ - fs: { - dirs: { - DocumentDir: '/data/com.rocket.chat/documents', - DownloadDir: '/data/com.rocket.chat/downloads' - }, - exists: jest.fn(() => null) - }, - fetch: jest.fn(() => null), - config: jest.fn(() => null) -})); - jest.mock('react-native-file-viewer', () => ({ open: jest.fn(() => null) })); diff --git a/package.json b/package.json index 4780969c7..ae0d66ebf 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,6 @@ "remove-markdown": "^0.3.0", "reselect": "4.0.0", "rn-extensions-share": "RocketChat/rn-extensions-share", - "rn-fetch-blob": "^0.12.0", "rn-root-view": "RocketChat/rn-root-view", "semver": "7.3.8", "transliteration": "^2.3.5", diff --git a/patches/rn-fetch-blob+0.12.0.patch b/patches/rn-fetch-blob+0.12.0.patch deleted file mode 100644 index 1269040fb..000000000 --- a/patches/rn-fetch-blob+0.12.0.patch +++ /dev/null @@ -1,153 +0,0 @@ -diff --git a/node_modules/rn-fetch-blob/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java b/node_modules/rn-fetch-blob/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java -index 602d51d..920d975 100644 ---- a/node_modules/rn-fetch-blob/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java -+++ b/node_modules/rn-fetch-blob/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java -@@ -38,7 +38,7 @@ import static com.RNFetchBlob.RNFetchBlobConst.GET_CONTENT_INTENT; - - public class RNFetchBlob extends ReactContextBaseJavaModule { - -- private final OkHttpClient mClient; -+ static private OkHttpClient mClient; - - static ReactApplicationContext RCTContext; - private static LinkedBlockingQueue taskQueue = new LinkedBlockingQueue<>(); -@@ -75,6 +75,10 @@ public class RNFetchBlob extends ReactContextBaseJavaModule { - }); - } - -+ public static void applyCustomOkHttpClient(OkHttpClient client) { -+ mClient = client; -+ } -+ - @Override - public String getName() { - return "RNFetchBlob"; -diff --git a/node_modules/rn-fetch-blob/ios/RNFetchBlobRequest.m b/node_modules/rn-fetch-blob/ios/RNFetchBlobRequest.m -index cdbe6b1..04e5e7b 100644 ---- a/node_modules/rn-fetch-blob/ios/RNFetchBlobRequest.m -+++ b/node_modules/rn-fetch-blob/ios/RNFetchBlobRequest.m -@@ -15,6 +15,9 @@ - #import "IOS7Polyfill.h" - #import - -+#import "SecureStorage.h" -+#import -+ - - typedef NS_ENUM(NSUInteger, ResponseFormat) { - UTF8, -@@ -450,16 +453,108 @@ - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSen - } - } - -- --- (void) URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable credantial))completionHandler -+-(NSURLCredential *)getUrlCredential:(NSURLAuthenticationChallenge *)challenge path:(NSString *)path password:(NSString *)password - { -- if ([[options valueForKey:CONFIG_TRUSTY] boolValue]) { -- completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); -- } else { -- completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); -+ NSString *authMethod = [[challenge protectionSpace] authenticationMethod]; -+ SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; -+ -+ if ([authMethod isEqualToString:NSURLAuthenticationMethodServerTrust] || path == nil || password == nil) { -+ return [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; -+ } else if (path && password) { -+ NSMutableArray *policies = [NSMutableArray array]; -+ [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)challenge.protectionSpace.host)]; -+ SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); -+ -+ SecTrustResultType result; -+ SecTrustEvaluate(serverTrust, &result); -+ -+ if (![[NSFileManager defaultManager] fileExistsAtPath:path]) -+ { -+ return [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; -+ } -+ -+ NSData *p12data = [NSData dataWithContentsOfFile:path]; -+ NSDictionary* options = @{ (id)kSecImportExportPassphrase:password }; -+ CFArrayRef rawItems = NULL; -+ OSStatus status = SecPKCS12Import((__bridge CFDataRef)p12data, -+ (__bridge CFDictionaryRef)options, -+ &rawItems); -+ -+ if (status != noErr) { -+ return [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; -+ } -+ -+ NSArray* items = (NSArray*)CFBridgingRelease(rawItems); -+ NSDictionary* firstItem = nil; -+ if ((status == errSecSuccess) && ([items count]>0)) { -+ firstItem = items[0]; - } -+ -+ SecIdentityRef identity = (SecIdentityRef)CFBridgingRetain(firstItem[(id)kSecImportItemIdentity]); -+ SecCertificateRef certificate = NULL; -+ if (identity) { -+ SecIdentityCopyCertificate(identity, &certificate); -+ if (certificate) { CFRelease(certificate); } -+ } -+ -+ NSMutableArray *certificates = [[NSMutableArray alloc] init]; -+ [certificates addObject:CFBridgingRelease(certificate)]; -+ -+ return [NSURLCredential credentialWithIdentity:identity certificates:certificates persistence:NSURLCredentialPersistenceNone]; -+ } -+ -+ return [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; -+} -+ -+- (NSString *)stringToHex:(NSString *)string -+{ -+ char *utf8 = (char *)[string UTF8String]; -+ NSMutableString *hex = [NSMutableString string]; -+ while (*utf8) [hex appendFormat:@"%02X", *utf8++ & 0x00FF]; -+ -+ return [[NSString stringWithFormat:@"%@", hex] lowercaseString]; - } - -+-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler -+{ -+ NSString *host = challenge.protectionSpace.host; -+ -+ // Read the clientSSL info from MMKV -+ __block NSString *clientSSL; -+ SecureStorage *secureStorage = [[SecureStorage alloc] init]; -+ -+ // https://github.com/ammarahm-ed/react-native-mmkv-storage/blob/master/src/loader.js#L31 -+ NSString *key = [secureStorage getSecureKey:[self stringToHex:@"com.MMKV.default"]]; -+ NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; -+ -+ if (key == NULL) { -+ return completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, credential); -+ } -+ -+ NSData *cryptKey = [key dataUsingEncoding:NSUTF8StringEncoding]; -+ MMKV *mmkv = [MMKV mmkvWithID:@"default" cryptKey:cryptKey mode:MMKVMultiProcess]; -+ clientSSL = [mmkv getStringForKey:host]; -+ -+ if ([clientSSL length] != 0) { -+ NSData *data = [clientSSL dataUsingEncoding:NSUTF8StringEncoding]; -+ id dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; -+ NSString *path = [dict objectForKey:@"path"]; -+ NSString *password = [dict objectForKey:@"password"]; -+ credential = [self getUrlCredential:challenge path:path password:password]; -+ } -+ -+ completionHandler(NSURLSessionAuthChallengeUseCredential, credential); -+} -+ -+// - (void) URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable credantial))completionHandler -+// { -+// if ([[options valueForKey:CONFIG_TRUSTY] boolValue]) { -+// completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); -+// } else { -+// completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); -+// } -+// } -+ - - - (void) URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session - { diff --git a/yarn.lock b/yarn.lock index be7c8518f..7f74a6779 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8171,11 +8171,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base-64@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== - base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -8619,7 +8614,6 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== - bunyamin@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/bunyamin/-/bunyamin-1.5.2.tgz#681db204c0b16531369d5c1f6c89dc8d760b7558" @@ -12208,18 +12202,6 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - integrity sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -18798,14 +18780,6 @@ rn-extensions-share@RocketChat/rn-extensions-share: version "2.4.1" resolved "https://codeload.github.com/RocketChat/rn-extensions-share/tar.gz/4d7c0e4c2f300e4fb116af7b7cc0dbbc8169150c" -rn-fetch-blob@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/rn-fetch-blob/-/rn-fetch-blob-0.12.0.tgz#ec610d2f9b3f1065556b58ab9c106eeb256f3cba" - integrity sha512-+QnR7AsJ14zqpVVUbzbtAjq0iI8c9tCg49tIoKO2ezjzRunN7YL6zFSFSWZm6d+mE/l9r+OeDM3jmb2tBb2WbA== - dependencies: - base-64 "0.1.0" - glob "7.0.6" - rn-host-detect@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.2.0.tgz#8b0396fc05631ec60c1cb8789e5070cdb04d0da0" @@ -19677,6 +19651,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: strip-ansi "^6.0.0" string-width@^4.2.3: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -19840,6 +19815,7 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: ansi-regex "^4.1.0" strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== From b0c9e1650740f8bc8369ce3b376e95290fd139fa Mon Sep 17 00:00:00 2001 From: Gleidson Daniel Silva Date: Tue, 21 May 2024 09:30:45 -0400 Subject: [PATCH 8/8] feat: add ios privacy info (#5680) --- ios/PrivacyInfo.xcprivacy | 41 ++++++++++++++++++++++ ios/RocketChatRN.xcodeproj/project.pbxproj | 22 +++++++++--- 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 ios/PrivacyInfo.xcprivacy diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..84b600ea9 --- /dev/null +++ b/ios/PrivacyInfo.xcprivacy @@ -0,0 +1,41 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPITypeReasons + + 1C8F.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + + + NSPrivacyAccessedAPITypeReasons + + E174.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + + + NSPrivacyAccessedAPITypeReasons + + 3B52.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + + + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + + + + diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index 0a6214efa..bb3e5f835 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -285,6 +285,12 @@ 24A2AEF2383D44B586D31C01 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 06BB44DD4855498082A744AD /* libz.tbd */; }; 40F02A25DF4A436C69D57156 /* libPods-defaults-RocketChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CC656AF598B9611936E5F1BD /* libPods-defaults-RocketChatRN.a */; }; 4C4C8603EF082F0A33A95522 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45D5C142B655F8EFD006792C /* ExpoModulesProvider.swift */; }; + 65AD38372BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */; }; + 65AD38382BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */; }; + 65AD38392BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */; }; + 65AD383A2BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */; }; + 65AD383B2BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */; }; + 65AD383C2BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */; }; 65B9A71A2AFC24190088956F /* ringtone.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 65B9A7192AFC24190088956F /* ringtone.mp3 */; }; 65B9A71B2AFC24190088956F /* ringtone.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 65B9A7192AFC24190088956F /* ringtone.mp3 */; }; 7A006F14229C83B600803143 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A006F13229C83B600803143 /* GoogleService-Info.plist */; }; @@ -612,6 +618,7 @@ 5B8F57A5EB0BBDB9A402C25F /* Pods-defaults-ShareRocketChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-ShareRocketChatRN.release.xcconfig"; path = "Target Support Files/Pods-defaults-ShareRocketChatRN/Pods-defaults-ShareRocketChatRN.release.xcconfig"; sourceTree = ""; }; 5F43124ACB5EC56A936B2725 /* Pods-defaults-ShareRocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-ShareRocketChatRN.debug.xcconfig"; path = "Target Support Files/Pods-defaults-ShareRocketChatRN/Pods-defaults-ShareRocketChatRN.debug.xcconfig"; sourceTree = ""; }; 60B2A6A31FC4588700BD58E5 /* RocketChatRN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RocketChatRN.entitlements; path = RocketChatRN/RocketChatRN.entitlements; sourceTree = ""; }; + 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; 65B9A7192AFC24190088956F /* ringtone.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = ringtone.mp3; sourceTree = ""; }; 6F7E7AAF900DB63FA0643F09 /* libPods-defaults-ShareRocketChatRN.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-defaults-ShareRocketChatRN.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 7A006F13229C83B600803143 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; @@ -728,6 +735,7 @@ 7AAA749C23043B1D00F1ADE9 /* RocketChatRN-Bridging-Header.h */, 7A0D62D1242AB187006D5C06 /* LaunchScreen.storyboard */, 1ED00BB02513E04400A1331F /* ReplyNotification.swift */, + 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */, ); name = RocketChatRN; sourceTree = ""; @@ -1484,6 +1492,7 @@ 7A14FCED257FEB3A005BDCD4 /* Experimental.xcassets in Resources */, 7AE10C0628A59530003593CB /* Inter.ttf in Resources */, 7A006F14229C83B600803143 /* GoogleService-Info.plist in Resources */, + 65AD38372BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */, 7A0D62D2242AB187006D5C06 /* LaunchScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1495,6 +1504,7 @@ 7A610CD327ECE38100B8ABDD /* custom.ttf in Resources */, 1EC6ACB722CB9FC300A41C61 /* MainInterface.storyboard in Resources */, 1ED59D4C22CBA77D00C54289 /* GoogleService-Info.plist in Resources */, + 65AD38382BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */, 7AE10C0728A59530003593CB /* Inter.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1506,6 +1516,7 @@ 1ED1ECEA2B869A4A00F6620C /* Official.xcassets in Resources */, 1ED038982B507B4D00C007D4 /* Preview Assets.xcassets in Resources */, 1E044F992B92798E00BCA2FD /* Localizable.xcstrings in Resources */, + 65AD383B2BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */, 1ED038952B507B4D00C007D4 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1517,6 +1528,7 @@ 1ED1ECD72B86997F00F6620C /* Preview Assets.xcassets in Resources */, 1ED1ECD82B86997F00F6620C /* Assets.xcassets in Resources */, 1E044F9A2B92798E00BCA2FD /* Localizable.xcstrings in Resources */, + 65AD383C2BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */, 1ED1ECEC2B869B1300F6620C /* Experimental.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1525,6 +1537,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 65AD38392BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */, 1E6CC61F2513DBF400965591 /* GoogleService-Info.plist in Resources */, 7A610CD427ECE38100B8ABDD /* custom.ttf in Resources */, ); @@ -1540,6 +1553,7 @@ 7AAB3E42257E6A6E00707CF6 /* Images.xcassets in Resources */, 7AE10C0828A59530003593CB /* Inter.ttf in Resources */, 7AAB3E44257E6A6E00707CF6 /* GoogleService-Info.plist in Resources */, + 65AD383A2BFBDF4A00271B39 /* PrivacyInfo.xcprivacy in Resources */, 7AAB3E45257E6A6E00707CF6 /* LaunchScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1745,7 +1759,7 @@ inputFileListPaths = ( ); inputPaths = ( - "$TARGET_BUILD_DIR/$INFOPLIST_PATH", + $TARGET_BUILD_DIR/$INFOPLIST_PATH, ); name = "Upload source maps to Bugsnag"; outputFileListPaths = ( @@ -1831,7 +1845,7 @@ inputFileListPaths = ( ); inputPaths = ( - "$TARGET_BUILD_DIR/$INFOPLIST_PATH", + $TARGET_BUILD_DIR/$INFOPLIST_PATH, ); name = "Upload source maps to Bugsnag"; outputFileListPaths = ( @@ -2584,7 +2598,7 @@ "$(inherited)", "$(SRCROOT)/../node_modules/rn-extensions-share/ios/**", "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", - "$PODS_CONFIGURATION_BUILD_DIR/Firebase", + $PODS_CONFIGURATION_BUILD_DIR/Firebase, ); INFOPLIST_FILE = ShareRocketChatRN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; @@ -2653,7 +2667,7 @@ "$(inherited)", "$(SRCROOT)/../node_modules/rn-extensions-share/ios/**", "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", - "$PODS_CONFIGURATION_BUILD_DIR/Firebase", + $PODS_CONFIGURATION_BUILD_DIR/Firebase, ); INFOPLIST_FILE = ShareRocketChatRN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0;