From ace4b5a1618ec40783f4a841ce85953e1015b191 Mon Sep 17 00:00:00 2001 From: Volodymyr Kozieiev Date: Tue, 1 Oct 2019 20:52:20 +0300 Subject: [PATCH] Desktop works with react-navigation v3 Signed-off-by: Volodymyr Kozieiev --- .env | 2 +- .env.e2e | 2 +- .env.jenkins | 2 +- .env.nightly | 2 +- .env.release | 2 +- ci/Jenkinsfile.combined | 2 +- clj-rn.conf.edn | 3 +- .../src/status_im/ui/components/react.cljs | 5 +- deployment/windows/nsis/setup.nsi | 157 ++-- desktop/build.bat | 3 +- desktop/build.sh | 6 + desktop/js_files/package.json | 125 ++- desktop/js_files/yarn.lock | 166 ++-- desktop/resources/add.png | Bin 0 -> 132 bytes desktop/resources/add_contact.png | Bin 0 -> 317 bytes desktop/resources/address.png | Bin 0 -> 142 bytes desktop/resources/arrow_left.png | Bin 0 -> 155 bytes desktop/resources/arrow_right.png | Bin 0 -> 145 bytes desktop/resources/arrow_up.png | Bin 0 -> 167 bytes desktop/resources/back.png | Bin 0 -> 127 bytes desktop/resources/backspace.png | Bin 0 -> 308 bytes desktop/resources/bell.png | Bin 0 -> 1802 bytes desktop/resources/browser.png | Bin 0 -> 431 bytes desktop/resources/camera.png | Bin 0 -> 350 bytes desktop/resources/cancel.png | Bin 0 -> 386 bytes desktop/resources/change.png | Bin 0 -> 281 bytes desktop/resources/check.png | Bin 0 -> 141 bytes desktop/resources/close.png | Bin 0 -> 190 bytes desktop/resources/commands.png | Bin 0 -> 260 bytes desktop/resources/copy.png | Bin 0 -> 229 bytes desktop/resources/corner_left_bottom.png | Bin 0 -> 526 bytes desktop/resources/corner_left_top.png | Bin 0 -> 614 bytes desktop/resources/corner_right_bottom.png | Bin 0 -> 613 bytes desktop/resources/corner_right_top.png | Bin 0 -> 537 bytes desktop/resources/dapp.png | Bin 0 -> 274 bytes desktop/resources/delete.png | Bin 0 -> 307 bytes desktop/resources/desktop.png | Bin 0 -> 176 bytes desktop/resources/download.png | Bin 0 -> 208 bytes desktop/resources/dropdown.png | Bin 0 -> 150 bytes desktop/resources/dropdown_up.png | Bin 0 -> 139 bytes desktop/resources/edit.png | Bin 0 -> 296 bytes desktop/resources/filter.png | Bin 0 -> 132 bytes desktop/resources/fingerprint.png | Bin 0 -> 5130 bytes desktop/resources/flash.png | Bin 0 -> 325 bytes desktop/resources/flash_active.png | Bin 0 -> 272 bytes desktop/resources/group_chat.png | Bin 0 -> 386 bytes desktop/resources/help.png | Bin 0 -> 436 bytes desktop/resources/history.png | Bin 0 -> 206 bytes desktop/resources/home.png | Bin 0 -> 414 bytes desktop/resources/home_1.png | Bin 0 -> 302 bytes desktop/resources/ic_background.png | Bin 0 -> 98 bytes desktop/resources/ic_foreground.png | Bin 0 -> 730 bytes .../resources/ic_stat_status_notification.png | Bin 0 -> 648 bytes desktop/resources/icon_action_back.png | Bin 0 -> 576 bytes desktop/resources/icon_action_forward.png | Bin 0 -> 544 bytes .../icon_action_fullscreen_collapse.png | Bin 0 -> 398 bytes .../icon_action_fullscreen_expand.png | Bin 0 -> 351 bytes desktop/resources/icon_arrow_top.png | Bin 0 -> 816 bytes desktop/resources/icon_avatar.png | Bin 0 -> 2282 bytes desktop/resources/icon_check_on.png | Bin 0 -> 316 bytes desktop/resources/icon_close_light_gray.png | Bin 0 -> 464 bytes desktop/resources/icon_forward_gray.png | Bin 0 -> 426 bytes desktop/resources/icon_lock_gray.png | Bin 0 -> 430 bytes desktop/resources/icon_lock_white.png | Bin 0 -> 314 bytes desktop/resources/icon_menu_group.png | Bin 0 -> 1597 bytes desktop/resources/icon_money_white.png | Bin 0 -> 473 bytes desktop/resources/icon_muted.png | Bin 0 -> 1184 bytes desktop/resources/icon_notifications_on.png | Bin 0 -> 823 bytes desktop/resources/icon_phone_white.png | Bin 0 -> 396 bytes desktop/resources/in_contacts.png | Bin 0 -> 329 bytes desktop/resources/info.png | Bin 0 -> 384 bytes desktop/resources/keycard.png | Bin 0 -> 188 bytes desktop/resources/keycard_logo.png | Bin 0 -> 675 bytes desktop/resources/language.png | Bin 0 -> 438 bytes desktop/resources/launch_logo.png | Bin 0 -> 3801 bytes desktop/resources/link.png | Bin 0 -> 329 bytes desktop/resources/log_out.png | Bin 0 -> 324 bytes desktop/resources/logo.png | Bin 0 -> 1850 bytes desktop/resources/mailserver.png | Bin 0 -> 258 bytes desktop/resources/make_admin.png | Bin 0 -> 354 bytes desktop/resources/max.png | Bin 0 -> 185 bytes desktop/resources/message.png | Bin 0 -> 314 bytes desktop/resources/mobile.png | Bin 0 -> 199 bytes desktop/resources/more.png | Bin 0 -> 127 bytes desktop/resources/network.png | Bin 0 -> 387 bytes desktop/resources/next.png | Bin 0 -> 133 bytes desktop/resources/notification.png | Bin 0 -> 235 bytes desktop/resources/one_on_one_chat.png | Bin 0 -> 347 bytes desktop/resources/password.png | Bin 0 -> 244 bytes desktop/resources/paste.png | Bin 0 -> 225 bytes desktop/resources/photo.png | Bin 0 -> 366 bytes desktop/resources/profile.png | Bin 0 -> 301 bytes desktop/resources/public_chat.png | Bin 0 -> 345 bytes desktop/resources/qr.png | Bin 0 -> 210 bytes desktop/resources/receive.png | Bin 0 -> 149 bytes desktop/resources/refresh.png | Bin 0 -> 307 bytes desktop/resources/remove_contact.png | Bin 0 -> 304 bytes desktop/resources/reply.png | Bin 0 -> 234 bytes desktop/resources/rotate_camera.png | Bin 0 -> 396 bytes desktop/resources/search.png | Bin 0 -> 276 bytes desktop/resources/security.png | Bin 0 -> 270 bytes desktop/resources/send.png | Bin 0 -> 144 bytes desktop/resources/settings.png | Bin 0 -> 441 bytes desktop/resources/settings_advanced.png | Bin 0 -> 242 bytes desktop/resources/share.png | Bin 0 -> 202 bytes desktop/resources/stickers.png | Bin 0 -> 375 bytes desktop/resources/text.png | Bin 0 -> 132 bytes desktop/resources/tiny_arrow_down.png | Bin 0 -> 179 bytes desktop/resources/tiny_check.png | Bin 0 -> 168 bytes desktop/resources/tiny_clear.png | Bin 0 -> 247 bytes desktop/resources/tiny_edit.png | Bin 0 -> 168 bytes desktop/resources/tiny_external.png | Bin 0 -> 222 bytes desktop/resources/tiny_group.png | Bin 0 -> 231 bytes desktop/resources/tiny_lock.png | Bin 0 -> 179 bytes desktop/resources/tiny_lock_broken.png | Bin 0 -> 175 bytes desktop/resources/tiny_new_contact.png | Bin 0 -> 164 bytes desktop/resources/tiny_pending.png | Bin 0 -> 181 bytes desktop/resources/tiny_public.png | Bin 0 -> 212 bytes desktop/resources/tiny_reply.png | Bin 0 -> 187 bytes desktop/resources/tiny_settings.png | Bin 0 -> 199 bytes desktop/resources/tiny_tribute_to_talk.png | Bin 0 -> 249 bytes desktop/resources/tribute_to_talk.png | Bin 0 -> 404 bytes desktop/resources/two_arrows.png | Bin 0 -> 157 bytes desktop/resources/user_profile.png | Bin 0 -> 395 bytes desktop/resources/user_profile_1.png | Bin 0 -> 395 bytes desktop/resources/username.png | Bin 0 -> 454 bytes desktop/resources/wallet.png | Bin 0 -> 200 bytes desktop/resources/warning.png | Bin 0 -> 381 bytes .../desktop/CMakeLists.txt | 0 .../desktop/CMakeLists.txt | 9 + .../desktop/gesturehandlermodule.cpp | 71 ++ .../desktop/gesturehandlermodule.h | 47 + .../index.js | 5 + .../package.json | 13 + .../desktop/CMakeLists.txt | 0 .../desktop/CMakeLists.txt | 0 .../desktop/CMakeLists.txt | 0 .../desktop/CMakeLists.txt | 0 .../react-native-status/desktop/rctstatus.cpp | 818 +++++++++++------- .../react-native-status/desktop/rctstatus.h | 122 +-- nix/desktop/base-image/default.nix | 58 ++ nix/desktop/default.nix | 7 +- nix/desktop/linux/base-image/default.nix | 37 - nix/desktop/linux/default.nix | 5 +- nix/desktop/macos/base-image/default.nix | 37 - nix/desktop/macos/default.nix | 4 +- nix/desktop/windows/base-image/default.nix | 39 - nix/desktop/windows/default.nix | 4 +- .../android/maven-and-npm-deps/default.nix | 2 +- .../react_native/js_dependencies.cljs | 5 +- scripts/build-desktop.sh | 6 +- src/status_im/ui/components/camera.cljs | 15 +- .../ui/components/icons/vector_icons.cljs | 15 +- src/status_im/ui/components/tabbar/core.cljs | 24 +- .../ui/components/tabbar/styles.cljs | 7 +- .../ui/screens/chat/input/input.cljs | 1 - .../ui/screens/chat/styles/main.cljs | 3 + src/status_im/ui/screens/chat/views.cljs | 4 +- .../ui/screens/desktop/main/chat/views.cljs | 6 +- src/status_im/ui/screens/home/styles.cljs | 5 +- src/status_im/ui/screens/home/views.cljs | 2 +- 161 files changed, 1140 insertions(+), 708 deletions(-) create mode 100644 desktop/resources/add.png create mode 100644 desktop/resources/add_contact.png create mode 100644 desktop/resources/address.png create mode 100644 desktop/resources/arrow_left.png create mode 100644 desktop/resources/arrow_right.png create mode 100644 desktop/resources/arrow_up.png create mode 100644 desktop/resources/back.png create mode 100644 desktop/resources/backspace.png create mode 100644 desktop/resources/bell.png create mode 100644 desktop/resources/browser.png create mode 100644 desktop/resources/camera.png create mode 100644 desktop/resources/cancel.png create mode 100644 desktop/resources/change.png create mode 100644 desktop/resources/check.png create mode 100644 desktop/resources/close.png create mode 100644 desktop/resources/commands.png create mode 100644 desktop/resources/copy.png create mode 100644 desktop/resources/corner_left_bottom.png create mode 100644 desktop/resources/corner_left_top.png create mode 100644 desktop/resources/corner_right_bottom.png create mode 100644 desktop/resources/corner_right_top.png create mode 100644 desktop/resources/dapp.png create mode 100644 desktop/resources/delete.png create mode 100644 desktop/resources/desktop.png create mode 100644 desktop/resources/download.png create mode 100644 desktop/resources/dropdown.png create mode 100644 desktop/resources/dropdown_up.png create mode 100644 desktop/resources/edit.png create mode 100644 desktop/resources/filter.png create mode 100644 desktop/resources/fingerprint.png create mode 100644 desktop/resources/flash.png create mode 100644 desktop/resources/flash_active.png create mode 100644 desktop/resources/group_chat.png create mode 100644 desktop/resources/help.png create mode 100644 desktop/resources/history.png create mode 100644 desktop/resources/home.png create mode 100644 desktop/resources/home_1.png create mode 100644 desktop/resources/ic_background.png create mode 100644 desktop/resources/ic_foreground.png create mode 100755 desktop/resources/ic_stat_status_notification.png create mode 100644 desktop/resources/icon_action_back.png create mode 100644 desktop/resources/icon_action_forward.png create mode 100644 desktop/resources/icon_action_fullscreen_collapse.png create mode 100644 desktop/resources/icon_action_fullscreen_expand.png create mode 100644 desktop/resources/icon_arrow_top.png create mode 100644 desktop/resources/icon_avatar.png create mode 100644 desktop/resources/icon_check_on.png create mode 100644 desktop/resources/icon_close_light_gray.png create mode 100644 desktop/resources/icon_forward_gray.png create mode 100644 desktop/resources/icon_lock_gray.png create mode 100644 desktop/resources/icon_lock_white.png create mode 100644 desktop/resources/icon_menu_group.png create mode 100755 desktop/resources/icon_money_white.png create mode 100644 desktop/resources/icon_muted.png create mode 100644 desktop/resources/icon_notifications_on.png create mode 100755 desktop/resources/icon_phone_white.png create mode 100644 desktop/resources/in_contacts.png create mode 100644 desktop/resources/info.png create mode 100644 desktop/resources/keycard.png create mode 100644 desktop/resources/keycard_logo.png create mode 100644 desktop/resources/language.png create mode 100644 desktop/resources/launch_logo.png create mode 100644 desktop/resources/link.png create mode 100644 desktop/resources/log_out.png create mode 100644 desktop/resources/logo.png create mode 100644 desktop/resources/mailserver.png create mode 100644 desktop/resources/make_admin.png create mode 100644 desktop/resources/max.png create mode 100644 desktop/resources/message.png create mode 100644 desktop/resources/mobile.png create mode 100644 desktop/resources/more.png create mode 100644 desktop/resources/network.png create mode 100644 desktop/resources/next.png create mode 100644 desktop/resources/notification.png create mode 100644 desktop/resources/one_on_one_chat.png create mode 100644 desktop/resources/password.png create mode 100644 desktop/resources/paste.png create mode 100644 desktop/resources/photo.png create mode 100644 desktop/resources/profile.png create mode 100644 desktop/resources/public_chat.png create mode 100644 desktop/resources/qr.png create mode 100644 desktop/resources/receive.png create mode 100644 desktop/resources/refresh.png create mode 100644 desktop/resources/remove_contact.png create mode 100644 desktop/resources/reply.png create mode 100644 desktop/resources/rotate_camera.png create mode 100644 desktop/resources/search.png create mode 100644 desktop/resources/security.png create mode 100644 desktop/resources/send.png create mode 100644 desktop/resources/settings.png create mode 100644 desktop/resources/settings_advanced.png create mode 100644 desktop/resources/share.png create mode 100644 desktop/resources/stickers.png create mode 100644 desktop/resources/text.png create mode 100644 desktop/resources/tiny_arrow_down.png create mode 100644 desktop/resources/tiny_check.png create mode 100644 desktop/resources/tiny_clear.png create mode 100644 desktop/resources/tiny_edit.png create mode 100644 desktop/resources/tiny_external.png create mode 100644 desktop/resources/tiny_group.png create mode 100644 desktop/resources/tiny_lock.png create mode 100644 desktop/resources/tiny_lock_broken.png create mode 100644 desktop/resources/tiny_new_contact.png create mode 100644 desktop/resources/tiny_pending.png create mode 100644 desktop/resources/tiny_public.png create mode 100644 desktop/resources/tiny_reply.png create mode 100644 desktop/resources/tiny_settings.png create mode 100644 desktop/resources/tiny_tribute_to_talk.png create mode 100644 desktop/resources/tribute_to_talk.png create mode 100644 desktop/resources/two_arrows.png create mode 100644 desktop/resources/user_profile.png create mode 100644 desktop/resources/user_profile_1.png create mode 100644 desktop/resources/username.png create mode 100644 desktop/resources/wallet.png create mode 100644 desktop/resources/warning.png mode change 100755 => 100644 modules/react-native-desktop-config/desktop/CMakeLists.txt create mode 100644 modules/react-native-desktop-gesture-handler/desktop/CMakeLists.txt create mode 100644 modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.cpp create mode 100644 modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.h create mode 100644 modules/react-native-desktop-gesture-handler/index.js create mode 100644 modules/react-native-desktop-gesture-handler/package.json mode change 100755 => 100644 modules/react-native-desktop-linking/desktop/CMakeLists.txt mode change 100755 => 100644 modules/react-native-desktop-menu/desktop/CMakeLists.txt mode change 100755 => 100644 modules/react-native-desktop-notification/desktop/CMakeLists.txt mode change 100755 => 100644 modules/react-native-desktop-shortcuts/desktop/CMakeLists.txt create mode 100644 nix/desktop/base-image/default.nix delete mode 100644 nix/desktop/linux/base-image/default.nix delete mode 100644 nix/desktop/macos/base-image/default.nix delete mode 100644 nix/desktop/windows/base-image/default.nix diff --git a/.env b/.env index 9aef94b941..51ab72746f 100644 --- a/.env +++ b/.env @@ -19,5 +19,5 @@ SNOOPY=0 RPC_NETWORKS_ONLY=0 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=0 +MOBILE_UI_FOR_DESKTOP=1 STATUS_GO_PROTOCOL=0 diff --git a/.env.e2e b/.env.e2e index ce482a3a43..2b74d4f43d 100644 --- a/.env.e2e +++ b/.env.e2e @@ -17,4 +17,4 @@ SNOOPY=0 STICKERS_ENABLED=1 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=0 +MOBILE_UI_FOR_DESKTOP=1 diff --git a/.env.jenkins b/.env.jenkins index b4aded76cd..268c347ee2 100644 --- a/.env.jenkins +++ b/.env.jenkins @@ -19,4 +19,4 @@ SNOOPY=0 RPC_NETWORKS_ONLY=0 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=0 +MOBILE_UI_FOR_DESKTOP=1 diff --git a/.env.nightly b/.env.nightly index 46e7b09693..db729ee5a7 100644 --- a/.env.nightly +++ b/.env.nightly @@ -17,5 +17,5 @@ SNOOPY=0 RPC_NETWORKS_ONLY=0 PARTITIONED_TOPIC=0 CONTRACT_NODES=1 -MOBILE_UI_FOR_DESKTOP=0 +MOBILE_UI_FOR_DESKTOP=1 HARDWALLET_ENABLED=1 diff --git a/.env.release b/.env.release index c45cd585df..6c75e99bcb 100644 --- a/.env.release +++ b/.env.release @@ -16,4 +16,4 @@ POW_TIME=1 SNOOPY=0 RPC_NETWORKS_ONLY=1 PARTITIONED_TOPIC=0 -MOBILE_UI_FOR_DESKTOP=0 +MOBILE_UI_FOR_DESKTOP=1 diff --git a/ci/Jenkinsfile.combined b/ci/Jenkinsfile.combined index 53b8672968..02bbc28771 100644 --- a/ci/Jenkinsfile.combined +++ b/ci/Jenkinsfile.combined @@ -22,7 +22,7 @@ pipeline { cmn = load('ci/common.groovy') gh = load('ci/github.groovy') /* just for a shorter access */ - btype = cmn.utils.getBuildType() + btype = cmn.utils.getBuildType() } } } stage('Build') { diff --git a/clj-rn.conf.edn b/clj-rn.conf.edn index 1db1c691a7..362d5236e5 100644 --- a/clj-rn.conf.edn +++ b/clj-rn.conf.edn @@ -72,6 +72,7 @@ "react-native-desktop-config" "react-native-desktop-shortcuts" "react-native-desktop-notification" + "react-native-desktop-gesture-handler" "web3-utils" "react-navigation" "react-native-navigation-twopane" @@ -79,7 +80,7 @@ ;; Resoures :resource-dirs ["resources/images" - "resources/icons"] + "desktop/resources"] :figwheel-options {:nrepl-port 7888 :nrepl-middleware ["cider.nrepl/cider-middleware" diff --git a/components/src/status_im/ui/components/react.cljs b/components/src/status_im/ui/components/react.cljs index 00451fcc2e..9680206353 100644 --- a/components/src/status_im/ui/components/react.cljs +++ b/components/src/status_im/ui/components/react.cljs @@ -224,8 +224,9 @@ (.catch show-access-error))))) ;; Net info - -(def net-info (.-default js-dependencies/net-info)) +(def net-info (if platform/desktop? + (get-react-property "NetInfo") + (.-default js-dependencies/net-info))) ;; Clipboard diff --git a/deployment/windows/nsis/setup.nsi b/deployment/windows/nsis/setup.nsi index c61ed0f3eb..d7ff5e72be 100644 --- a/deployment/windows/nsis/setup.nsi +++ b/deployment/windows/nsis/setup.nsi @@ -1,7 +1,7 @@ ;-------------------------------- ; Build environment ;-------------------------------- - + ;Unicode true ;!define top_srcdir @top_srcdir@ ;!define base_image_dir "" @@ -23,15 +23,15 @@ !define UninstallRegKeyPath "Software\Microsoft\Windows\CurrentVersion\Uninstall\Status Desktop" !addplugindir plugins/x86-ansi - + ;-------------------------------- ;General ;-------------------------------- - + ;Name and file Name "Status Desktop ${VERSION}" OutFile "${top_srcdir}/${SetupExeFileName}" - + SetCompressor /FINAL ${COMPRESSION_TYPE} ${COMPRESSION_ALGO} ; Default installation folder @@ -86,7 +86,7 @@ ;-------------------------------- ;Variables ;-------------------------------- - + Var MUI_TEMP Var STARTMENU_FOLDER Var PREVIOUS_INSTALLDIR @@ -108,16 +108,16 @@ ;-------------------------------- ;Interface Settings ;-------------------------------- - + !define MUI_ICON "${top_srcdir}/deployment/windows/status.ico" ;!define MUI_UNICON "${srcdir}/uninstall.ico" - + !define MUI_ABORTWARNING ;-------------------------------- ;Memento settings ;-------------------------------- - + ;!define MEMENTO_REGISTRY_ROOT SHELL_CONTEXT ;!define MEMENTO_REGISTRY_KEY "${AppRegistryKeyPath}" @@ -159,11 +159,11 @@ Function GetUserInfo ${Else} StrCpy $IS_ADMIN 0 ${EndIf} - + FunctionEnd Function UpdateShellVarContext - + ${If} $ALL_USERS == 1 SetShellVarContext all DetailPrint "Installing for all users" @@ -262,31 +262,31 @@ Function ReadPreviousVersion FunctionEnd Function LoadPreviousSettings - + ; Component selection ;${MementoSectionRestore} - + ; Startmenu !define ID "Application" - + !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME - + ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}" - + ${if} $mui.StartMenuPage.RegistryLocation != "" StrCpy "$STARTMENU_FOLDER" $mui.StartMenuPage.RegistryLocation ${else} StrCpy "$STARTMENU_FOLDER" "" ${endif} - + !undef ID - + !endif - + ${If} $PREVIOUS_INSTALLDIR != "" StrCpy $INSTDIR $PREVIOUS_INSTALLDIR ${EndIf} - + FunctionEnd Function ReadUpdateCommandline @@ -339,7 +339,7 @@ Function ReadQuiet FunctionEnd Function .onInit - + Pop $OldRunDir ; Store command line @@ -382,14 +382,14 @@ uac_tryagain: ; The UAC plugin changes the error level even in the inner process, reset it. SetErrorLevel -1 ${EndIf} - + ; /update argument Call ReadUpdateCommandline Call ReadSkipLicense Call GetUserInfo - + ; Initialize $ALL_USERS with default value ${If} $IS_ADMIN == 1 StrCpy $ALL_USERS 1 @@ -397,11 +397,11 @@ uac_tryagain: StrCpy $ALL_USERS 0 ${EndIf} Call UpdateShellVarContext - + ; See if previous version exists ; This can change ALL_USERS Call ReadPreviousVersion - + ${If} $PREVIOUS_VERSION != "" StrCpy $REINSTALL_UNINSTALL 1 ${EndIf} @@ -444,29 +444,29 @@ uac_tryagain: ${EndIf} StrCpy $ALL_USERS_DEFAULT $ALL_USERS - + FunctionEnd Function StatusVersionCompare - + Exch $1 Exch Exch $0 - + Push $2 Push $3 Push $4 - + versioncomparebegin: ${If} $0 == "" ${AndIf} $1 == "" StrCpy $PREVIOUS_VERSION_STATE "same" goto versioncomparedone ${EndIf} - + StrCpy $2 0 StrCpy $3 0 - + ; Parse rc / beta suffixes for segments StrCpy $4 $0 2 ${If} $4 == "rc" @@ -480,7 +480,7 @@ versioncomparebegin: StrCpy $2 10000 ${EndIf} ${EndIf} - + StrCpy $4 $1 2 ${If} $4 == "rc" StrCpy $3 100 @@ -493,9 +493,9 @@ versioncomparebegin: StrCpy $3 10000 ${EndIf} ${EndIf} - + split1loop: - + StrCmp $0 "" split1loopdone StrCpy $4 $0 1 StrCpy $0 $0 "" 1 @@ -504,9 +504,9 @@ split1loop: StrCpy $2 $2$4 goto split1loop split1loopdone: - + split2loop: - + StrCmp $1 "" split2loopdone StrCpy $4 $1 1 StrCpy $1 $1 "" 1 @@ -515,7 +515,7 @@ split2loop: StrCpy $3 $3$4 goto split2loop split2loopdone: - + ${If} $2 > $3 StrCpy $PREVIOUS_VERSION_STATE "newer" ${ElseIf} $3 > $2 @@ -523,16 +523,16 @@ split2loopdone: ${Else} goto versioncomparebegin ${EndIf} - - + + versioncomparedone: - + Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 - + FunctionEnd Function PageDirectoryPre @@ -573,11 +573,11 @@ FunctionEnd Function .OnInstFailed FunctionEnd - + Function .onInstSuccess - + ;${MementoSectionSave} - + ; Detect multiple install directories ${If} $OldRunDir != '' @@ -615,10 +615,10 @@ Section "Status Desktop" SecMain DetailPrint "${NodeJsServerExeName} is running. Closing it down" ${nsProcess::CloseProcess} "${NodeJsServerExeName}" $R0 DetailPrint "Waiting for ${NodeJsServerExeName} to close" - Sleep 2000 + Sleep 2000 ${Else} - DetailPrint "${NodeJsServerExeName} was not found to be running" - ${EndIf} + DetailPrint "${NodeJsServerExeName} was not found to be running" + ${EndIf} ${nsProcess::Unload} @@ -635,6 +635,9 @@ Section "Status Desktop" SecMain SetOutPath "$INSTDIR\assets\resources\fonts" File /r "${top_srcdir}\resources\fonts\" + SetOutPath "$INSTDIR\assets\desktop\resources" + File /r "${top_srcdir}\desktop\resources\" + SetOutPath "$INSTDIR\assets\resources\images" File /r "${top_srcdir}\resources\images\" @@ -713,7 +716,7 @@ Section "Status Desktop" SecMain WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" "Path" "$INSTDIR" SectionEnd - + ;-------------------------------- ; Functions ;-------------------------------- @@ -765,14 +768,14 @@ FunctionEnd ;-------------------------------- ; Uninstaller Variables ;-------------------------------- - + Var un.REMOVE_ALL_USERS Var un.REMOVE_CURRENT_USER - + ;-------------------------------- ;Uninstaller Functions ;-------------------------------- - + Function un.GetUserInfo ClearErrors UserInfo::GetName @@ -787,13 +790,13 @@ Function un.GetUserInfo ${Else} StrCpy $IS_ADMIN 0 ${EndIf} - + FunctionEnd - + Function un.ReadPreviousVersion - + ReadRegStr $R0 HKLM "${AppRegistryKeyPath}" "" - + ${If} $R0 != "" ;Detect version ReadRegStr $R2 HKLM "${AppRegistryKeyPath}" "Version" @@ -801,9 +804,9 @@ Function un.ReadPreviousVersion StrCpy $R0 "" ${EndIf} ${EndIf} - + ReadRegStr $R1 HKCU "${AppRegistryKeyPath}" "" - + ${If} $R1 != "" ;Detect version ReadRegStr $R2 HKCU "${AppRegistryKeyPath}" "Version" @@ -811,7 +814,7 @@ Function un.ReadPreviousVersion StrCpy $R1 "" ${EndIf} ${EndIf} - + ${If} $R1 == $INSTDIR Strcpy $un.REMOVE_CURRENT_USER 1 ${EndIf} @@ -829,11 +832,11 @@ Function un.ReadPreviousVersion StrCpy $un.REMOVE_ALL_USERS = 1 ${EndIf} ${EndIf} - + FunctionEnd - + Function un.onInit - + ${un.GetParameters} $CommandLine ${un.GetOptions} $CommandLine "/quiet" $R1 @@ -846,7 +849,7 @@ Function un.onInit Call un.GetUserInfo Call un.ReadPreviousVersion - + ${If} $un.REMOVE_ALL_USERS == 1 ${AndIf} $IS_ADMIN == 0 uac_tryagain: @@ -869,16 +872,16 @@ uac_tryagain: ; The UAC plugin changes the error level even in the inner process, reset it. SetErrorLevel -1 ${EndIf} - + FunctionEnd - + Function un.RemoveStartmenu - + !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP - + Delete "$SMPROGRAMS\$MUI_TEMP\${UninstallLinkName}" Delete "$SMPROGRAMS\$MUI_TEMP\${AppLinkFileName}" - + ${un.GetOptions} $CommandLine "/keepstartmenudir" $R1 ${If} ${Errors} @@ -922,7 +925,7 @@ FunctionEnd ;-------------------------------- Section "Uninstall" - + SetShellVarContext all SetDetailsPrint lastused @@ -933,10 +936,10 @@ Section "Uninstall" DetailPrint "${AppExeName} is running. Closing it down" ${nsProcess::CloseProcess} "${AppExeName}" $R0 DetailPrint "Waiting for ${AppExeName} to close" - Sleep 2000 + Sleep 2000 ${Else} - DetailPrint "${AppExeName} was not found to be running" - ${EndIf} + DetailPrint "${AppExeName} was not found to be running" + ${EndIf} ${nsProcess::FindProcess} "${NodeJsServerExeName}" $R0 @@ -944,10 +947,10 @@ Section "Uninstall" DetailPrint "${NodeJsServerExeName} is running. Closing it down" ${nsProcess::CloseProcess} "${NodeJsServerExeName}" $R0 DetailPrint "Waiting for ${NodeJsServerExeName} to close" - Sleep 2000 + Sleep 2000 ${Else} - DetailPrint "${NodeJsServerExeName} was not found to be running" - ${EndIf} + DetailPrint "${NodeJsServerExeName} was not found to be running" + ${EndIf} ${nsProcess::Unload} @@ -984,7 +987,7 @@ Section "Uninstall" RMDir "$INSTDIR\translations" Delete "$INSTDIR" - + ${un.GetOptions} $CommandLine "/frominstall" $R1 ${If} ${Errors} RMDir /r /REBOOTOK "$INSTDIR" @@ -997,11 +1000,11 @@ Section "Uninstall" ${If} $un.REMOVE_ALL_USERS == 1 SetShellVarContext all Call un.RemoveStartmenu - + DeleteRegKey /ifempty HKLM "${AppRegistryKeyPath}" DeleteRegKey /ifempty HKLM "${OrgRegistryKeyPath}" DeleteRegKey HKLM "${UninstallRegKeyPath}" - + Delete "$DESKTOP\${AppLinkFileName}" ; Remove dump key @@ -1025,7 +1028,7 @@ Section "Uninstall" Delete "$DESKTOP\${AppLinkFileName}" ${EndIf} - + DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\App Paths\${AppExeName}" SectionEnd diff --git a/desktop/build.bat b/desktop/build.bat index b053643061..9158b84b08 100644 --- a/desktop/build.bat +++ b/desktop/build.bat @@ -25,6 +25,7 @@ SET option echo "build.bat external modules paths: "%option-e% echo "build.bat JS bundle path: "%option-j% echo "build.bat desktop fonts: "%option-f% +echo "build.bat desktop images: "%option-i% echo "build.bat cmake generator: "%option-g% @rem Workaround @@ -32,4 +33,4 @@ echo "build.bat cmake generator: "%option-g% @rem Build project echo %CD% -cmake -DCMAKE_BUILD_TYPE=Debug -G %option-g% -DEXTERNAL_MODULES_DIR=%option-e% -DJS_BUNDLE_PATH=%option-j% -DDESKTOP_FONTS=%option-f% . && cmake --build . +cmake -DCMAKE_BUILD_TYPE=Debug -G %option-g% -DEXTERNAL_MODULES_DIR=%option-e% -DJS_BUNDLE_PATH=%option-j% -DDESKTOP_FONTS=%option-f% -DDESKTOP_IMAGES=%option-i% . && cmake --build . diff --git a/desktop/build.sh b/desktop/build.sh index 60082c3c31..0767e2cc66 100755 --- a/desktop/build.sh +++ b/desktop/build.sh @@ -23,12 +23,17 @@ if [[ $1 == "-f" ]]; then shift desktopFonts="$1" fi +if [[ $1 == "-i" ]]; then + shift + desktopImages="$1" +fi shift done echo "build.sh external modules paths: "$ExternalModulesPaths echo "build.sh JS bundle path: "$JsBundlePath echo "build.sh desktop fonts: "$desktopFonts +echo "build.sh desktop images: "$desktopImages # Workaround rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile @@ -38,6 +43,7 @@ cmake -DCMAKE_BUILD_TYPE=Debug \ -DEXTERNAL_MODULES_DIR="$ExternalModulesPaths" \ -DJS_BUNDLE_PATH="$JsBundlePath" \ -DDESKTOP_FONTS="$desktopFonts" \ + -DDESKTOP_IMAGES="$desktopImages" \ -DCMAKE_INSTALL_COMPONENT='' \ . && \ make diff --git a/desktop/js_files/package.json b/desktop/js_files/package.json index f5f5ec57f2..8c23f2d551 100644 --- a/desktop/js_files/package.json +++ b/desktop/js_files/package.json @@ -18,6 +18,7 @@ "modules/react-native-desktop-config/desktop", "modules/react-native-desktop-shortcuts/desktop", "modules/react-native-desktop-notification/desktop", + "modules/react-native-desktop-gesture-handler/desktop", "node_modules/google-breakpad" ], "desktopFonts": [ @@ -60,13 +61,14 @@ "qrcode": "^1.4.1", "react": "16.6.1", "react-dom": "16.4.2", - "react-native": "git+https://github.com/status-im/react-native-desktop.git#v0.57.8_10", + "react-native": "git+https://github.com/status-im/react-native-desktop.git#v0.57.8_11", "react-native-background-timer": "2.0.0", "react-native-camera": "0.10.0", "react-native-config": "git+https://github.com/status-im/react-native-config.git#v0.11.2-status", "react-native-dialogs": "0.0.20", "react-native-fetch-polyfill": "1.1.2", "react-native-fs": "git+https://github.com/status-im/react-native-fs.git#v2.9.7-status", + "react-native-gesture-handler": "^1.3.0", "react-native-image-crop-picker": "0.18.1", "react-native-image-resizer": "1.0.0", "react-native-keychain": "git+https://github.com/status-im/react-native-keychain.git#v.3.0.0-4-status", @@ -75,7 +77,7 @@ "react-native-os": "1.1.0", "react-native-splash-screen": "3.0.6", "react-native-webview-bridge": "git+https://github.com/status-im/react-native-webview-bridge.git#0.33.16-status-rn049-desktop", - "react-navigation": "^2.12.1", + "react-navigation": "^3.11.0", "status-conan": "git+https://github.com/status-im/status-conan.git#v1.0.0", "web3-utils": "1.0.0-beta.36" }, @@ -93,5 +95,122 @@ }, "optionalDependencies": { "appdmg": "^0.5.2" - } + }, + "desktopImages": [ + "../../../../../desktop/resources/add.png", + "../../../../../desktop/resources/address.png", + "../../../../../desktop/resources/add_contact.png", + "../../../../../desktop/resources/arrow_left.png", + "../../../../../desktop/resources/arrow_right.png", + "../../../../../desktop/resources/arrow_up.png", + "../../../../../desktop/resources/back.png", + "../../../../../desktop/resources/backspace.png", + "../../../../../desktop/resources/bell.png", + "../../../../../desktop/resources/browser.png", + "../../../../../desktop/resources/camera.png", + "../../../../../desktop/resources/cancel.png", + "../../../../../desktop/resources/change.png", + "../../../../../desktop/resources/check.png", + "../../../../../desktop/resources/close.png", + "../../../../../desktop/resources/commands.png", + "../../../../../desktop/resources/copy.png", + "../../../../../desktop/resources/corner_left_bottom.png", + "../../../../../desktop/resources/corner_left_top.png", + "../../../../../desktop/resources/corner_right_bottom.png", + "../../../../../desktop/resources/corner_right_top.png", + "../../../../../desktop/resources/dapp.png", + "../../../../../desktop/resources/delete.png", + "../../../../../desktop/resources/desktop.png", + "../../../../../desktop/resources/download.png", + "../../../../../desktop/resources/dropdown.png", + "../../../../../desktop/resources/dropdown_up.png", + "../../../../../desktop/resources/edit.png", + "../../../../../desktop/resources/filter.png", + "../../../../../desktop/resources/fingerprint.png", + "../../../../../desktop/resources/flash.png", + "../../../../../desktop/resources/flash_active.png", + "../../../../../desktop/resources/group_chat.png", + "../../../../../desktop/resources/help.png", + "../../../../../desktop/resources/history.png", + "../../../../../desktop/resources/home.png", + "../../../../../desktop/resources/home_1.png", + "../../../../../desktop/resources/icon_action_back.png", + "../../../../../desktop/resources/icon_action_forward.png", + "../../../../../desktop/resources/icon_action_fullscreen_collapse.png", + "../../../../../desktop/resources/icon_action_fullscreen_expand.png", + "../../../../../desktop/resources/icon_arrow_top.png", + "../../../../../desktop/resources/icon_avatar.png", + "../../../../../desktop/resources/icon_check_on.png", + "../../../../../desktop/resources/icon_close_light_gray.png", + "../../../../../desktop/resources/icon_forward_gray.png", + "../../../../../desktop/resources/icon_lock_gray.png", + "../../../../../desktop/resources/icon_lock_white.png", + "../../../../../desktop/resources/icon_menu_group.png", + "../../../../../desktop/resources/icon_money_white.png", + "../../../../../desktop/resources/icon_muted.png", + "../../../../../desktop/resources/icon_notifications_on.png", + "../../../../../desktop/resources/icon_phone_white.png", + "../../../../../desktop/resources/ic_background.png", + "../../../../../desktop/resources/ic_foreground.png", + "../../../../../desktop/resources/ic_stat_status_notification.png", + "../../../../../desktop/resources/info.png", + "../../../../../desktop/resources/in_contacts.png", + "../../../../../desktop/resources/keycard.png", + "../../../../../desktop/resources/keycard_logo.png", + "../../../../../desktop/resources/language.png", + "../../../../../desktop/resources/launch_logo.png", + "../../../../../desktop/resources/link.png", + "../../../../../desktop/resources/logo.png", + "../../../../../desktop/resources/log_out.png", + "../../../../../desktop/resources/mailserver.png", + "../../../../../desktop/resources/make_admin.png", + "../../../../../desktop/resources/max.png", + "../../../../../desktop/resources/message.png", + "../../../../../desktop/resources/mobile.png", + "../../../../../desktop/resources/more.png", + "../../../../../desktop/resources/network.png", + "../../../../../desktop/resources/next.png", + "../../../../../desktop/resources/notification.png", + "../../../../../desktop/resources/one_on_one_chat.png", + "../../../../../desktop/resources/password.png", + "../../../../../desktop/resources/paste.png", + "../../../../../desktop/resources/photo.png", + "../../../../../desktop/resources/profile.png", + "../../../../../desktop/resources/public_chat.png", + "../../../../../desktop/resources/qr.png", + "../../../../../desktop/resources/receive.png", + "../../../../../desktop/resources/refresh.png", + "../../../../../desktop/resources/remove_contact.png", + "../../../../../desktop/resources/reply.png", + "../../../../../desktop/resources/rotate_camera.png", + "../../../../../desktop/resources/search.png", + "../../../../../desktop/resources/security.png", + "../../../../../desktop/resources/send.png", + "../../../../../desktop/resources/settings.png", + "../../../../../desktop/resources/settings_advanced.png", + "../../../../../desktop/resources/share.png", + "../../../../../desktop/resources/stickers.png", + "../../../../../desktop/resources/text.png", + "../../../../../desktop/resources/tiny_arrow_down.png", + "../../../../../desktop/resources/tiny_check.png", + "../../../../../desktop/resources/tiny_clear.png", + "../../../../../desktop/resources/tiny_edit.png", + "../../../../../desktop/resources/tiny_external.png", + "../../../../../desktop/resources/tiny_group.png", + "../../../../../desktop/resources/tiny_lock.png", + "../../../../../desktop/resources/tiny_lock_broken.png", + "../../../../../desktop/resources/tiny_new_contact.png", + "../../../../../desktop/resources/tiny_pending.png", + "../../../../../desktop/resources/tiny_public.png", + "../../../../../desktop/resources/tiny_reply.png", + "../../../../../desktop/resources/tiny_settings.png", + "../../../../../desktop/resources/tiny_tribute_to_talk.png", + "../../../../../desktop/resources/tribute_to_talk.png", + "../../../../../desktop/resources/two_arrows.png", + "../../../../../desktop/resources/username.png", + "../../../../../desktop/resources/user_profile.png", + "../../../../../desktop/resources/user_profile_1.png", + "../../../../../desktop/resources/wallet.png", + "../../../../../desktop/resources/warning.png" + ] } diff --git a/desktop/js_files/yarn.lock b/desktop/js_files/yarn.lock index 50af5fdfee..6d738d4bf7 100644 --- a/desktop/js_files/yarn.lock +++ b/desktop/js_files/yarn.lock @@ -1307,6 +1307,25 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@react-navigation/core@~3.4.1": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-3.4.2.tgz#bec563e94fde40fbab3730cdc97f22afbb2a1498" + integrity sha512-7G+iDzLSTeOUU4vVZeRZKJ+Bd7ds7ZxYNqZcB8i0KlBeQEQfR74Ounfu/p0KIEq2RiNnaE3QT7WVP3C87sebzw== + dependencies: + hoist-non-react-statics "^3.3.0" + path-to-regexp "^1.7.0" + query-string "^6.4.2" + react-is "^16.8.6" + +"@react-navigation/native@~3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-3.5.0.tgz#f5d16e0845ac26d1147d1caa481f18a00740e7ae" + integrity sha512-TmGOis++ejEXG3sqNJhCSKqB0/qLu3FQgDtO959qpqif36R/diR8SQwJqeSdofoEiK3CepdhFlTCeHdS1/+MsQ== + dependencies: + hoist-non-react-statics "^3.0.1" + react-native-safe-area-view "^0.14.1" + react-native-screens "^1.0.0 || ^1.0.0-alpha" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -2120,11 +2139,6 @@ ci-info@^1.5.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== -clamp@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" - integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -2468,14 +2482,6 @@ create-react-class@^15.6.3: loose-envify "^1.3.1" object-assign "^4.1.1" -create-react-context@0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" - integrity sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A== - dependencies: - fbjs "^0.8.0" - gud "^1.0.0" - cross-spawn-async@^2.1.1: version "2.2.5" resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" @@ -3159,7 +3165,7 @@ fbjs-scripts@^1.0.0: semver "^5.1.0" through2 "^2.0.0" -fbjs@^0.8.0, fbjs@^0.8.16, fbjs@^0.8.9: +fbjs@^0.8.16, fbjs@^0.8.9: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -3619,11 +3625,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - handlebars@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" @@ -3749,11 +3750,18 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.2.0, hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0: +hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== +hoist-non-react-statics@^3.0.1, hoist-non-react-statics@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" + home-or-tmp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" @@ -6064,7 +6072,7 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -query-string@^6.1.0: +query-string@^6.4.2: version "6.8.3" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.3.tgz#fd9fb7ffb068b79062b43383685611ee47777d4b" integrity sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ== @@ -6148,12 +6156,12 @@ react-dom@16.4.2: object-assign "^4.1.1" prop-types "^15.6.0" -react-is@^16.5.2, react-is@^16.8.1: +react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: version "16.9.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== -react-lifecycles-compat@^3, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -6179,25 +6187,6 @@ react-native-dialogs@0.0.20: resolved "https://registry.yarnpkg.com/react-native-dialogs/-/react-native-dialogs-0.0.20.tgz#f3fb48eadba9d83fb9d4e6d7eca573494a8cefaa" integrity sha512-HeoU9d7wWUUAtxjcIJLaeIs/eYS2ZHTNh3kboeCKngLvfvgptd/7vZXwXdQ+xeOEek+cm95kDfMJQd2xnb+4wA== -react-native-dismiss-keyboard@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/react-native-dismiss-keyboard/-/react-native-dismiss-keyboard-1.0.0.tgz#32886242b3f2317e121f3aeb9b0a585e2b879b49" - integrity sha1-MohiQrPyMX4SHzrrmwpYXiuHm0k= - -react-native-drawer-layout-polyfill@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/react-native-drawer-layout-polyfill/-/react-native-drawer-layout-polyfill-1.3.2.tgz#192c84d7a5a6b8a6d2be2c7daa5e4164518d0cc7" - integrity sha512-XzPhfLDJrYHru+e8+dFwhf0FtTeAp7JXPpFYezYV6P1nTeA1Tia/kDpFT+O2DWTrBKBEI8FGhZnThrroZmHIxg== - dependencies: - react-native-drawer-layout "1.3.2" - -react-native-drawer-layout@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-1.3.2.tgz#b9740d7663a1dc4f88a61b9c6d93d2d948ea426e" - integrity sha512-fjO0scqbJUfNu2wuEpvywL7DYLXuCXJ2W/zYhWz986rdLytidbys1QGVvkaszHrb4Y7OqO96mTkgpOcP8KWevw== - dependencies: - react-native-dismiss-keyboard "1.0.0" - react-native-fetch-polyfill@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/react-native-fetch-polyfill/-/react-native-fetch-polyfill-1.1.2.tgz#256b5a0abd78cc4992f7a7cf82543da2f2124a73" @@ -6210,6 +6199,15 @@ react-native-fetch-polyfill@1.1.2: base-64 "^0.1.0" utf8 "^2.1.1" +react-native-gesture-handler@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-1.3.0.tgz#d0386f565928ccc1849537f03f2e37fd5f6ad43f" + integrity sha512-ASRFIXBuKRvqlmwkWJhV8yP2dTpvcqVrLNpd7FKVBFHYWr6SAxjGyO9Ik8w1lAxDhMlRP2IcJ9p9eq5X2WWeLQ== + dependencies: + hoist-non-react-statics "^2.3.1" + invariant "^2.2.2" + prop-types "^15.5.10" + react-native-image-crop-picker@0.18.1: version "0.18.1" resolved "https://registry.yarnpkg.com/react-native-image-crop-picker/-/react-native-image-crop-picker-0.18.1.tgz#ebdbe72def5afb6c69aa6e2ad72fd3a7de8ee408" @@ -6237,14 +6235,14 @@ react-native-os@1.1.0: resolved "https://registry.yarnpkg.com/react-native-os/-/react-native-os-1.1.0.tgz#bfbe1c44d8a5b14a6f3a3a405d8ada6f547a516e" integrity sha1-v74cRNilsUpvOjpAXYrab1R6UW4= -react-native-safe-area-view@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.11.0.tgz#4f3dda43c2bace37965e7c6aef5fc83d4f19d174" - integrity sha512-N3nElaahu1Me2ltnfc9acpgt1znm6pi8DSadKy79kvdzKwvVIzw0IXueA/Hjr51eCW1BsfNw7D1SgBT9U6qEkA== +react-native-safe-area-view@^0.14.1: + version "0.14.6" + resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.6.tgz#9a9d37d9f8f3887d60c4076eae7b5d2319539446" + integrity sha512-dbzuvaeHFV1VBpyMaC0gtJ2BqFt6ls/405A0t78YN1sXiTrVr3ki86Ysct8mzifWqLdvWzcWagE5wfMtdxnqoA== dependencies: hoist-non-react-statics "^2.3.1" -react-native-screens@^1.0.0-alpha.11: +"react-native-screens@^1.0.0 || ^1.0.0-alpha": version "1.0.0-alpha.23" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-1.0.0-alpha.23.tgz#25d7ea4d11bda4fcde2d1da7ae50271c6aa636e0" integrity sha512-tOxHGQUN83MTmQB4ghoQkibqOdGiX4JQEmeyEv96MKWO/x8T2PJv84ECUos9hD3blPRQwVwSpAid1PPPhrVEaw== @@ -6256,14 +6254,7 @@ react-native-splash-screen@3.0.6: resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.0.6.tgz#c0bbf2c8ae40a313c4c7044f55e569414ff68332" integrity sha512-yaTnGAHRyhduLSfD85gP3Vsf0BRePHW3aNNtDXbkbUhwIIeafu2cJH86U/qKFuKLMYLnFOXteOkP80gaYVGAYg== -react-native-tab-view@^0.0.77: - version "0.0.77" - resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-0.0.77.tgz#11ceb8e7c23100d07e628dc151b57797524d00d4" - integrity sha512-9vjD4Ly1Zlum1Y4g23ODpi/F3gYIUIsKWrsZO/Oh5cuX1eiB1DRVn11nY1z+j/hsQfhfyW6nDlmySyDvYQvYCA== - dependencies: - prop-types "^15.6.0" - -react-native-tab-view@^1.0.0: +react-native-tab-view@^1.2.0, react-native-tab-view@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/react-native-tab-view/-/react-native-tab-view-1.4.1.tgz#f113cd87485808f0c991abec937f70fa380478b9" integrity sha512-Bke8KkDcDhvB/z0AS7MnQKMD2p6Kwfc1rSKlMOvg9CC5CnClQ2QEnhPSbwegKDYhUkBI92iH/BYy7hNSm5kbUQ== @@ -6277,9 +6268,9 @@ react-native-tab-view@^1.0.0: invariant "2.2.0" keymirror "0.1.1" -"react-native@git+https://github.com/status-im/react-native-desktop.git#v0.57.8_10": +"react-native@git+https://github.com/status-im/react-native-desktop.git#v0.57.8_11": version "0.57.8" - resolved "git+https://github.com/status-im/react-native-desktop.git#af9f72e6300d08918685f57e249141646400bac0" + resolved "git+https://github.com/status-im/react-native-desktop.git#6cf317a82ef82ad1102e292110928929c3b68aec" dependencies: "@babel/runtime" "^7.0.0" absolute-path "^0.0.0" @@ -6336,53 +6327,38 @@ react-native-tab-view@^1.0.0: yeoman-environment "^2.3.4" yeoman-generator "^3.2.0" -react-navigation-deprecated-tab-navigator@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/react-navigation-deprecated-tab-navigator/-/react-navigation-deprecated-tab-navigator-1.3.0.tgz#015dcae1e977b984ca7e99245261c15439026bb7" - integrity sha512-Cm+qYOPFWbvvcuv0YYX0ioYwLGgw7XAqdhAfpo3sIr3trxRW8871ePmfFOPezjQtz4v6ItjZt6LPgtBAVZoroQ== +react-navigation-drawer@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-1.2.1.tgz#7bd5efeee7d2f611d3ebb0933e0c8e8eb7cafe52" + integrity sha512-T2kaBjY2c4/3I6noWFnaf/c18ntNH5DsST38i+pdc2NPxn5Yi5lkK+ZZTeKuHSFD4a7G0jWY9OGf1iRkHWLMAQ== dependencies: - react-native-tab-view "^0.0.77" + react-native-tab-view "^1.2.0" -react-navigation-drawer@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-0.5.0.tgz#d91b6a6ec65c34ba78c00f814b1e6508922cc9ec" - integrity sha512-F1y593uC6pqBMGH+Omz75oNODEbxB/s0EGO8QtYwu1NmOOEUuuLA+c14zm+pgMsI4HlDabiHxPkWqsgGz25xVQ== - dependencies: - react-native-drawer-layout-polyfill "^1.3.2" +react-navigation-stack@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/react-navigation-stack/-/react-navigation-stack-1.4.0.tgz#69cdb029ea4ee5877d7e933b3117dc90bc841eb2" + integrity sha512-zEe9wCA0Ot8agarYb//0nSWYW1GM+1R0tY/nydUV0EizeJ27At0EklYVWvYEuYU6C48va6cu8OPL7QD/CcJACw== -react-navigation-stack@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-navigation-stack/-/react-navigation-stack-0.7.0.tgz#0b2f139ee1cba953037ef51353df992ec6c74fa2" - integrity sha512-3Tbb/SsustBrM9R/qaI6XuOfyqYMVbwkeHFC8NbU890vB0aKZvjAtioWLZ18e/4LgbiOCmoTdp37z3gkGDyNDQ== - -react-navigation-tabs@0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-0.8.4.tgz#aa767f28b899f13c99f2b034b4a665f8cf0a5737" - integrity sha512-CbS3xIVJVtpu+AYslv0PMLmjddJFVtU3XAhSJ9XnMrKLUJNmnQdW/L0w/Gp5qcBEF9h6bgsY3CoTtp7I6bqyOQ== +react-navigation-tabs@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/react-navigation-tabs/-/react-navigation-tabs-1.1.4.tgz#00a312250df3c519c60b7815a523ace5ee11163a" + integrity sha512-py2hLCRxPwXOzmY1W9XcY1rWXxdK6RGW/aXh56G9gIf8cpHNDhy/bJV4e46/JrVcse3ybFaN0liT09/DM/NdwQ== dependencies: hoist-non-react-statics "^2.5.0" prop-types "^15.6.1" react-lifecycles-compat "^3.0.4" - react-native-tab-view "^1.0.0" + react-native-tab-view "^1.4.1" -react-navigation@^2.12.1: - version "2.18.3" - resolved "https://registry.yarnpkg.com/react-navigation/-/react-navigation-2.18.3.tgz#de9a24dc37dfc33f3e4779a9f13f45ea97dfe19e" - integrity sha512-/5KGMG1Oj5LN/x/7AKF0MWrpX9Qe29307RxEsMCiRT/A4jCYT0DPY99Bl7ZAGtROxExEy3rwTfTrtvpIT+CU7A== +react-navigation@^3.11.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/react-navigation/-/react-navigation-3.11.1.tgz#ba696ad6b512088a97a20cc7e6a250c53dbddd26" + integrity sha512-n64HxLG5s5ucVFo1Gs+D9ujChhHDd98lpQ1p27wL7gq8V1PaRJMvsBEIsguhtc2rTIL/TWDynOesXQDG+Eg6FQ== dependencies: - clamp "^1.0.1" - create-react-context "0.2.2" - hoist-non-react-statics "^2.2.0" - path-to-regexp "^1.7.0" - query-string "^6.1.0" - react-is "^16.5.2" - react-lifecycles-compat "^3" - react-native-safe-area-view "0.11.0" - react-native-screens "^1.0.0-alpha.11" - react-navigation-deprecated-tab-navigator "1.3.0" - react-navigation-drawer "0.5.0" - react-navigation-stack "0.7.0" - react-navigation-tabs "0.8.4" + "@react-navigation/core" "~3.4.1" + "@react-navigation/native" "~3.5.0" + react-navigation-drawer "~1.2.1" + react-navigation-stack "~1.4.0" + react-navigation-tabs "~1.1.4" react-proxy@^1.1.7: version "1.1.8" diff --git a/desktop/resources/add.png b/desktop/resources/add.png new file mode 100644 index 0000000000000000000000000000000000000000..21b37f431d93d1789cf171e684e19cb1096ad181 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%DQ`~~$B>F!$q5pyiy8Di5;~Um z8UC027kqdH+XhG8#caJi%|a4V0T1dnIR3uq^0?Ex?#O`(D@hmA^}Wj$2R3H}UkO_K gL7sJSg8>6WNPEG`37?L<1{%xY>FVdQ&MBb@0Ogh~IsgCw literal 0 HcmV?d00001 diff --git a/desktop/resources/add_contact.png b/desktop/resources/add_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..b6dde36dd0510fe28eaf50b0cbbe2b2a3ee2f135 GIT binary patch literal 317 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 literal 0 HcmV?d00001 diff --git a/desktop/resources/browser.png b/desktop/resources/browser.png new file mode 100644 index 0000000000000000000000000000000000000000..c9349a2005ed77f61b62fa116fda3e7f85a77461 GIT binary patch literal 431 zcmV;g0Z{&lP)!O9?J5HU!Y1VR|h3~C0;KCHU7BR{&|P5z6elkO@@1^%E7 z&>-w^IB>vW1L5*M$ix8ov6!HGVLl5WFR*J5%p3w73^eEWL~Xd6TQEz=s>SGnwFcS0`69C77OD1`y=_a7B0fL|dc^%bz;J}^&`D{Z)HGLwlI896X!@F!xAi2mEJ Z><5YmWX8(?KSBTi002ovPDHLkV1hp}wz&WR literal 0 HcmV?d00001 diff --git a/desktop/resources/camera.png b/desktop/resources/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..eae2bedfbf412024075454888e411d718f8a5e21 GIT binary patch literal 350 zcmV-k0iphhP)3c(Cx;N@(;OnjTde#TE(*r{S0L;$ZDKss^lN)}Wj1ZK6$<$80#7bF}R9 znm)fsqcG9Ik8li8L9?E+ujflH!=M!@>$sc(yGUB98AHS^4#qSrRWi|jqN7KdOVmUf z)j33(GI4P5thbVgg1cL)RnYY)CkoZk^le6;iHY(?5;D@c8MQOteo-Sss#!Sllgjat zjeKNton4cE`sx(%sihvCVZYHrO$S7@L%5-m-UiDLFR;)S~gH w;ub%ddZJJo?zm2zzi94OfJ)e!|M9DM0^>|=WcSDJlK=n!07*qoM6N<$g1E7qYPMOnuAGA=(O!fJltoo?St~)kF%F83Wz@%oQG@{i!)qEyj}!xdUfbz* zeIq}Xxd_MYSvYzX^9n8;U879ZfdMpS>0r^d2UFNp0@>;#Wp>5TbQeZ(p#>({wox)M z*$a35t^-qeGUg=H3JN&Z!sQ%q{!S&BsZWTkR|v0QbhoF|y{LtJ<-`!;m%&lMT(k_Bc9@9R7RoO`jhGt^j+$Rl7QC13Z@W g6A`jN|Lr4t0zV)>(w~;OM*si-07*qoM6N<$f?CI+>i_@% literal 0 HcmV?d00001 diff --git a/desktop/resources/change.png b/desktop/resources/change.png new file mode 100644 index 0000000000000000000000000000000000000000..143002657ff7eaea5d96cd79f68a82f3cb00d023 GIT binary patch literal 281 zcmV+!0p|XRP)>zfK64HTm0HshuIxrQO4x|&)fpnlw0Fx8TI*;+9yI1C0-u@E(kQoZ( zNuijYp3!>@)6o(!3x-h}ro%vUmNk=OUGsr##>o6!hJ6NN6Cjo5H&0@cta+EmaE=6B6S-h$l)`Ys%%<}w{3&@hS^q%8zs+0&?tE6DR2SPk37CZRemtw z>u-t=0-eMQ`M}3o1@enzUpSRmayMnv)CQDbS}5&;b=)y0;D+AgHwL_ZsUaWeQD2+n fN_TF>{;gy$SQGB*4~e=R00000NkvXXu0mjf5a4(E literal 0 HcmV?d00001 diff --git a/desktop/resources/check.png b/desktop/resources/check.png new file mode 100644 index 0000000000000000000000000000000000000000..acfb992f60814405345f69913a2baeae6bef393b GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8h^LEVNX4zUm%O8 z&04(by;KczU> oP4xevUalR|y@@?R2507HPFIUc-z8Q22WUQnr>mdKI;Vst0MZmLRsaA1 literal 0 HcmV?d00001 diff --git a/desktop/resources/close.png b/desktop/resources/close.png new file mode 100644 index 0000000000000000000000000000000000000000..65e1b4f73506b7dd6063d69f0bb51af646768b32 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBT0LDHLn;{GUSniqG2n5zcxTUE z$ExNh%kCy^%9YvixW9C8Wb1EB*X>g^(LON oUbVKeUXd$)dgKkQrBi+}B#5^#H|I(n06K`l)78&qol`;+0HK>k+yDRo literal 0 HcmV?d00001 diff --git a/desktop/resources/commands.png b/desktop/resources/commands.png new file mode 100644 index 0000000000000000000000000000000000000000..06d320983f12c85e3c02d1780ecb9c2113ce9ed4 GIT binary patch literal 260 zcmV+f0sH=mP)kYy%41_&`N62Pn1F`|#05+hTc!Z45QHrP&1T?nuKuDloe&+PG@!1C0^$$Wg0l}i2 z0E3NjFsqPsW^g*F48tgtF^6ax6%&GgxI~53;LQSztB+&@e+df$VW$Dg>HPMXMv#j) zLoaCB)T9ZNvUI&5?yYNKHO1>=wv($tX=HqHzQXks{|EX&+t?dHlqquqC>MJZh)45M zIZU4&TC(=cOK$~h&)mBP)txS7`DChDwclC(9D7h9r0(=xKcpMm#|?virsVbj0000< KMNUMnLSTXq;%!L) literal 0 HcmV?d00001 diff --git a/desktop/resources/copy.png b/desktop/resources/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..9c19da8d237f68ffab465f9de4e7119fdc00efcb GIT binary patch literal 229 zcmV^P)wczl+;aC$x9mtBMfo;frEafnFG6X2wv z(7_}mM5(EKePfL6WhOG{3x-!lt#Xi8O}`Av@gp1PjGwoG&iI)?b^J`$uJJR0>cJ{V zwg{x$HSVeLX8VKGv+EW~mI`S~mUMy9U~OifKQL{(QT*uWr@?#$ZC`oKb3OGAg@_{{*v zL`I8qZCqU32MWzX0wNgtHZN>C#8fbcS5!o-;c?E;(8AT+_f=m^YG(P(yJp|kwLP@u zxLqjoo;#T{WW!z7bwyum^1uJS7b9SC`rpkqJ&n?J@vpsKF8)06`g7Jk?h@<$<(D-- zM9BXvm9tIZvy!j=yZk_S-Q6{xO8>Y{Rd;XU0Y)%` Mr>mdKI;Vst02?aQCIA2c literal 0 HcmV?d00001 diff --git a/desktop/resources/corner_left_top.png b/desktop/resources/corner_left_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0a4e57f825570d0433da1e0f026277f4261d9f GIT binary patch literal 614 zcmeAS@N?(olHy`uVBq!ia0vp^At21b1|(&&1r7o!#^NA%Cx&(BWL`2bFe!MtIEGX( zzP)SRC+sNUnkeOXDo(A5cLS%H6Njd>VxuSzr;3NL;AU1KIZ2gg`X-6h=jJ4CvQwRU zYgP5`rT?C6lij(E-PmvW<)bq9&eT|aK6&QYTh=cz!i9 zP3UFbnsk9*q#;LUg=ll#0)~{w4r?X8FtaL1vu7P$Ag{r2(;`5d?XLsliDQjXhA-H; z9L)Gegc1LkVt+Hvm45C2UfL<4aoyf2=Xz&vDt<0gU0W8pW5&DC97>IL-}KSlWDSPkf+?$VqkM~2=S<(HqHIeX^rne{Vo&n(}qAM(&K;lsW&Hnw%=I|IJoQ)&M8 zZ{-vF`T6?a;x_y}EGiMh%4LITkO~UKfhl7#c6r=Peo#O=WCW6-IUApdg6Z*;b&&+)3;xftul|! zpMN(eaq@v(&i8X}33C;|5y+9W-c(_`SLa}-7t8%`njxgN@xNAzwY@K literal 0 HcmV?d00001 diff --git a/desktop/resources/corner_right_top.png b/desktop/resources/corner_right_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6eaca3cd9a0dec8e76564134eb952fcb912091c8 GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^At21b1|(&&1r7o!#^NA%Cx&(BWL^Tsv?* zXZ*g-Ts`~!*Zj*z>z<{DKd`&J`<-z6Vc(l zMvHT8TwL4-3e7?SA{hEMFKjx*R4|8ER79-dan6bb8yIBLompF1A6Q5a87)1>|DKV# z8N1Ht^Bs5D#$DB~F3hSfd(rbbX7h(@JF^~|Z{B5j)>KPihih4E;>W3b&&8#_H`w0v Wq-bCKYP)m;@Y92b+V{$s`O1l`sjFPziAB3P+)2DfGC5+k5}E+;?f3q`i5j<2*_#;hAA=%a+UEZn1}-a=OFGhs_#o&E{uFrkyIyIsGk Y3seNqy@p7<-v9sr07*qoM6N<$f`|)mvH$=8 literal 0 HcmV?d00001 diff --git a/desktop/resources/delete.png b/desktop/resources/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5ed9404e3a678d3b5f03fbc15ce9d8cc2d8ab9 GIT binary patch literal 307 zcmV-30nGl1P)~#qGij=uGbP-yOiJxf;KPI`wW8K3_MnNbhYb9$)C+z;2{{$G$jbl#002ovPDHLk FV1nY!h7|w+ literal 0 HcmV?d00001 diff --git a/desktop/resources/desktop.png b/desktop/resources/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..2b03362c96838bcae015f4c607fe4f5b80fed34f GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%sd7&j$B>F!$q5pyiy8Q2BtA(> zbu{tq;1x``asI=6mL2mP8Fo9q_B3K+`JVh;#HGkCP%fGwwD)K;Z$NSftH5He0?8{5 zTO2K}_Dh*$U0C6`#ayFtA!F2vx9Xc}T*Brz7(BCYHJE3`_P1G*<)hS3gSsu}WLU2- ZF<2d8-e@_|Spnz-22WQ%mvv4FO#lK%I!gcm literal 0 HcmV?d00001 diff --git a/desktop/resources/download.png b/desktop/resources/download.png new file mode 100644 index 0000000000000000000000000000000000000000..0da5eaa1cd4dc7c5802743928bd9b6ca216ac3dc GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpbWaz@kcwMxuN>rUP~c&`V9%ty zVP>9_`Ndv|#z2E636WsNohxei+??VWf*a?FNg8fR)XCxQl5vs!C9dK)fnDQ_$gu;5 zb|mqi%w5J6#jXB*&iC(Ki+^6Km@#Yd(h$|+WpW0FUng*e7%om&7`5ih_KA~cPnB=` zvpg&^{OmSvRo{cW&#o&i*euC=FgL0}Z|k0wldT1B8K8tfz}(NX4z>1PRu~2_ih)6V40t zhuSc?mNKEo81LxBcdZU-kYFdTSiw(4r|pE{sL44$rjF6*2UngD-eG6(3LYub%sUS}m$B>F!Z!aGdWDpQ=zF3lF zy@1&&UFM8Y%njR_f0*uRGD;-hSLKlNadUP3mUw20ky@4k>rp4o%hk)mp3R)pJ9A~X o;S%P>As-|bDtublvvDWe!%(vod}=;+K+_pKUHx3vIVCg!00^iqlK=n! literal 0 HcmV?d00001 diff --git a/desktop/resources/edit.png b/desktop/resources/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e54d497cdf396d407853828c1080e705b33ab7 GIT binary patch literal 296 zcmV+@0oVSCP)#SQ{H%G=31`|ID*82;-D%6v>Eeh$bao%4)sBTJnKVgiq|(H z6noLaYz$3?ni&~VFcPFBQu4OnBclk||tQ0b-W;8iZp=)>^1NlhlK!=HY zSFKNZ?!=S8hx#taZKiK2nS{?283EH=DIg3$4;Mx>LoFNScTn6bw#wKv{hNW=QClil ux3LYub%DQ`~~$B>F!$q5pyixYk@v$nAb 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 literal 0 HcmV?d00001 diff --git a/desktop/resources/flash.png b/desktop/resources/flash.png new file mode 100644 index 0000000000000000000000000000000000000000..d2486fa6c06acfe4a73c002418a842abe34b8a7c GIT binary patch literal 325 zcmV-L0lNN)P)w;3U9a(^4EF}%L2bT=th zkhi_tYZ>jQNt<>wTgUnadHe4upc0K4Q{BUw;2e;%g7UGv|6ba>l;(~`PN?3#oqu0n X^!A*&=lE7-00000NkvXXu0mjfB)E#l literal 0 HcmV?d00001 diff --git a/desktop/resources/flash_active.png b/desktop/resources/flash_active.png new file mode 100644 index 0000000000000000000000000000000000000000..15bbb77c8e659700a316f57874d04ccdd2bd6010 GIT binary patch literal 272 zcmV+r0q_2aP)+ErEGQ2G!D*TEgCTuc%#7M5#~BJb=rS{etA^=b4B@03`WrgPp>e?wYVFXUPq>bC z#w3gG@D_>oddL`lH#G90Q;}J_9SSQDXJ!O#p5W06nub5DFn;gdcf}I$Mu`@o?3eI( z^Ae-<;&Mp*Z~G6XmwzR}qO2TpHc$^$M2oVPP@{#?zI*>3T$a;AQ${Te!s)y7_i+a} W%XC literal 0 HcmV?d00001 diff --git a/desktop/resources/group_chat.png b/desktop/resources/group_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..27cf5107b3e386a8e21dfadd25f235296db8b03b GIT binary patch literal 386 zcmV-|0e$|7P)JJZmjEf7+M@!%(A%8`$%Xl{iOMGu%hh0E=b*Sk z;JU}3uxa<;&fVS-0f-Em-W-9X zjXoHY6=s(+a0tIRKJb=1F*638Y`Vt#c^G!UAj_4avCZ7tH-7QAvhv|iL3?v7PYhU{ g!x70odBqdNKThxn;4o4GuK)l507*qoM6N<$f)K8%9{>OV literal 0 HcmV?d00001 diff --git a/desktop/resources/help.png b/desktop/resources/help.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e3656711fe8867503a34795be4343d71b44e66 GIT binary patch literal 436 zcmV;l0ZaagP);k{5g5T6lnvqy>VBYL9!GHc+sZ$VLC5KYqyT@= z6f`VWY}m15gM-ERI>;;l<>N79I1BU906DZm!VQBKTFC)O#cyo0r-jy)v57 z>{!t5t<1~T2u@+bNG`@i<&UEJ%H_tCcviFzP74jd(-!!}2f?GlXHq;j(sK6p5ICBs zN|=tAvfs;@0r1%wIr?1l&-jU8!#PKM@pe;nl_hd+1T^m(D02H2gHO4mkMxcDbx eO#=P5U)c{03`C!#&)_Bi0000 literal 0 HcmV?d00001 diff --git a/desktop/resources/history.png b/desktop/resources/history.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e753b116bdf16dd24662a40e8eb0b771f1fa73 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%si~eWjv*Dd-cGy7+n~VXlF#Cn z07SwPM^C1Rm`&h4!eVN8EXc#)&z8SSDhu{5VV&@TpS8c$ll^R>j8KuY+YYH?CXVm6 zm}taoFT9krlH26Pp3bZMv9E;KvpAQ1s$665`m!!S<<2a2DYe{)%|}fOePe#FzqvB| z%Co@3^-CSMB}=|F*y>(=Xsvll^YgEtwQoD0yq}gN6S6URX{VW@F3^Dtp00i_>zopr E06bYw$N&HU literal 0 HcmV?d00001 diff --git a/desktop/resources/home.png b/desktop/resources/home.png new file mode 100644 index 0000000000000000000000000000000000000000..19ddc6d532d1ff06b1396caa3fa7d76a4dca2f32 GIT binary patch literal 414 zcmV;P0b%}$P)A_smu9D5G1a=u= zV<8^sXM3y^EzsTaHLW~z$%#nYp@vvekzu}&He%2q>k<2yI5mE92ng^^%O%fgCO%xT zyMIb6Mz=|>X3KCap+qBjrKxMs_Z|ueoSBYFDw?60@8_!q$NgPVdQ_>1xL^B5WWpb< z`5mBG+SI6~vpb92E)3U0rVjz;;ZBVIhgz z1ep!Z?=dA6W5xWr@s~b72=oEit?|=9%&>6jC&Fii{>Mx40~-ZVg2xbUY5)KL07*qo IM6N<$f-Nn#2><{9 literal 0 HcmV?d00001 diff --git a/desktop/resources/home_1.png b/desktop/resources/home_1.png new file mode 100644 index 0000000000000000000000000000000000000000..afb65ba21ef7e0486e46af7bdd04ce6dc04d685f GIT binary patch literal 302 zcmV+}0nz@6P)Nklfe{>m5xN0v&=F(=H)uCu1V?ZLMzHUp)u==R{`5VYe1YMT3l{`#YZ@K_ z13c<0FbxLcO&N%SU%?EqE|pKICx;i%9=eQ@oA+EUMLzqw$}CFqBmzoXJEbUZ=wa1a z{Q0C3N&e8#89Ih) z5;h(VXwlAX)olFcI+yEz$90El>QxulFE*b2Fm|WjR1orkMk>_SJ9h-KlkAiTNKJw; zsbL5^0iJoEmZZ%FvfPl=iGNwz1AOMA^S2+g53kKLNQV+=ZvX%Q07*qoM6N<$f??l! ALI3~& literal 0 HcmV?d00001 diff --git a/desktop/resources/ic_background.png b/desktop/resources/ic_background.png new file mode 100644 index 0000000000000000000000000000000000000000..0265779ac7f7ea98f9cd3b1dd8c6574b3308f2f2 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iu>8A$%HX^8+*%mF?juFeVfmzl3x2;@q6x;TbZ t#JxSp$P45hQuw`m+i`Xsb_Rw9X5KdpjP2(a1_Q+zJYD@<);T3K0RU?y8QK5< literal 0 HcmV?d00001 diff --git a/desktop/resources/ic_foreground.png b/desktop/resources/ic_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8ffe231a9a5009a0afcbcf94f452c8b5fa3d68 GIT binary patch literal 730 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 literal 0 HcmV?d00001 diff --git a/desktop/resources/icon_avatar.png b/desktop/resources/icon_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..d28594fcf1025e53d42a910d3277b20119b7883c GIT binary patch literal 2282 zcmV;T)K-vSQY&E*KZ8oB3SG0D!_o~gDXt;~ z+6t*51}@JS|H(4XI^dH)E6`Z- zxfz%dE;|LB08W;C4gkM*&YrCYFO#KUk@zOyGr(ft6Tq}Gm!1ya?<{lvZQu_;7qH7Y z`$kqAGZ8Eje+=jV<^xeU{5G%~_#YUwQC$5=7B)$XK155=z>zv&=`kFCN6>d&yK{ESW#F0_MB-)W z8|4fz%Q^d>((?`Dl<7dlZq8DyF~+pEwl-b7=v#~-58yq$4GredfddEneMYkw=j;}d z_#^1(tOIyx1dq}NqjWI@~b!`+S-INy#kdLCITcmZZF~-yyH*nvGYFSr$?vh}U z_(Q-_bW*;d)}UIaJOq9v<3Bp1(Exs>mdOMgP%TS?Heh56KNh|_owH|Zjh4^no0BB{ zAD1L-$mjFTwZ;z`I>XPRHWeJwF$;n7z_Yam1BjxA^~RLVc$9@POpBt1^;vL0wVVeQ z291|m_-=F%zPs8<`&jrpu1wis1TDK!ZFj@4;I{Dn%Pazk$ZX)o8mhQ4)R6^>n%V#& zk+=a(qa?ttEFvUHbj#IHN5C#r+r1)jLxd*YZUA1&Dm$3V`M+NcbpQlSFQFReM?gzB zw??(XhB4Ss9-l76d}%@ktc1ZR*=QaaaYkTI+o7a5q+=Z_g zqq8CJ&Hm}rr#-uG-@Z$)FA-^nXn`?)vvcmnjB;Hg1Q(y-TWhUVM3xl_g%0m&(oWH| z7Ygxh2M^lE0fMln!e~tfi&phFmV!1Ey(`OOG4FQ^uIz7-NnAc<*OypIx4haImcEWJRqbPWBnwnZ#Zf|1P-*Gu`Pl%ZYMNK0F?*;w~+!2WM&+j0B?Zbp)n^%(6AiUw5E7`^xD#sz{BW5+LzL>$>;MoMNu>x zUEatNgGrLS(%ajc>Q5Dke}XQk{m41Hym)-H;2FR_fOi0eS`1)U62UNc5O@ptK&jJc z#9~@Fu|6E%7_3VFR|uRpq8iqZwpER1dH5l46!ko=tvkc)u@>ci6xA{Uk4__^@;K;OJ}0+LlD(rNGaD3#fzVs_BlPw8 z9W>Lh$~jxn8zq%rS|nZ!Y()nqe*soFXS-7~t^vWX@qKhs@D|#tU6q!v#vncieO8JK z)-M1nORYimK(JJO54A9Z+LD%}9Sv5y1z-wl&|ZaZ$r%JT0Y7lg{wsBb6UTZ#@NM90 z=s5ip`e;2}oB^dlt(!cq2Ob5!30xZv_o9>SozB^+jAkNnjAkm@81{FaM@LTUYjGK6 zwT)*c+JP(qN~e~`7`u(9_zlC`cSdjHDYZMiiatV5WMY=fdS{wQ+=`}E76aA#t@_Y` zM3-~+KvvwK4uVS|5;rmaR=mk07*qoM6N<$ Eg00Rb^#A|> literal 0 HcmV?d00001 diff --git a/desktop/resources/icon_check_on.png b/desktop/resources/icon_check_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d8318e7fcb15d7fe9b2cdfea6b7c439efa370283 GIT binary patch literal 316 zcmV-C0mJ@@P)Px#_DMuRR5%gslB)^=Q4oe#@xp?Lh(+AuOBjt-t3`v!VzL;_MzdfxSWJS^Xc3#q z>Jtcp;AQ=e?7(Q&D#{T#$k{K?`5bOc5S$U#F`?fB#t@a!U66u zhPW2ccY_`287saSt$EfAJ-C9zj3Q~4O$lLu)ptPl@MaM%1&6 zx}DM_KAPh`B%)r5yV1;QHGfFP>!PgUCjg7cTbb4?Jea1 O00000WbcEP)Px$ib+I4R9Fe^mQ8K~F${$h)NAw#9Hi}r1*_?TB94JnRpJAMfq=-2eG?aPDjI{P51yp1%zNtAx#VymRdDX z2?~BJrAwAcQc;4zcoh&PNGiZL76vJ*fx5al&X;Py!6xi4c3*360z$&9QgDob!F1KJ zN8o?iO$v$XF!czPs)4dF1kkaJJYmS8`gHIgmtb%~B8E2l`J|n0bnLak<;nSSty-aL zF#KK9#N;5-F%?ivp_V~y z!;WfG<8c)qXpQcH1}L%>Df0^$5mUevFa=D3q5?;@`Ul7jknREi0000Px$WJyFpR9Fe^*1bvuF%SpvnJpGPu<;4(eFIxdwK#-rPS6(+Ed&Ky3lA#`E1OmC znyoxs?d-%i@HG@H6t>tgK?8@bIgxXC>RKZ zf`Skz=RTwtwT-R8+VFRudfl_dOwYkVI=M*p^T+pXdQsao98`|(k44%evnVsyy?pV) z+|N2g_s}1hjiOj;W!|1gJNO4K;^jJmzGX-upZxi z#_84mitIkRH%8%IlM0Q|dEG%o*Xr+T!^Bsr1H&p~zNFW=s-APNz!a1!@EPx$Xh}ptR5%gcRIN?~K@9FUId%~UEcXgH*dQQ5+zAwqfZ-=ta3~0lQ(y^TfHy!P z7D2)xSkCbZV6nSmN;|npW-d!|gQUr()AsAvna*@UEyB!r8jf}?^A3m>6~aUx2Ds_1 zE?olUQ9g^Ve!3>{xtNgY(LD(}3Ib{cJSm7uPF=uVTB%g3Z zx0aMV0shxSeh??loMgHICw@;#Y5{||lD`8T=<95WPvvqi8*~`Y8r$wv*<%o3KK-oy Y0C^OI+_<Px#^hrcPR5%gcQ%eqlFc2-qcn3TPiHGnQa0RyB$*pb)3%!OeU9h4Xe2+M!lxbRw zD<^qjI`7Sgp%|msFbo+`0xi&eK%cQpNm+&<%z+CKGIIGc(}_U9Nv@#^PMpQUlYy)p zaSy)+I3YowF|pE_VeUe~J&4tF))){hCf54=bcTY96grbIZi_oPC|3?{z& z3~9C$fn@iimvC~=nvc8+@iTfpS)>47z_-TSf}guV)q~b?MXX_=9tpb@Nt)EM(6nGp zks8~i3S+uIFJxoypTJx0=$;^qNp8Qp*=&WYB>&nz*4pDAIFJ9@8@aEJWV6DyCjbBd M07*qoM6N<$g5D>C$^ZZW literal 0 HcmV?d00001 diff --git a/desktop/resources/icon_menu_group.png b/desktop/resources/icon_menu_group.png new file mode 100644 index 0000000000000000000000000000000000000000..40e9b7dc416ad5006a3fb8b3f987451f850fe06b GIT binary patch literal 1597 zcmV-D2EzG?P)Px)_en%SR9FeMR(otyWfVX6_O|O<){VV!f&!y+71$WaP#|H5Oo0svDp4>o5XGPp zl?04IBg)GJh*3J8tWS zaFVa*eZF7M{azeAWLmp%vt5#5C2&wEgPhLE+!^HiRxW#g3&(L%U#H{#D{yVu&NL8x zg)+zGaI$;}jF!qzmo9A9%Uiu+%Y5LZ9kLAZz5NKP!e&gGxpe6QPj8=|&g&V;Cd)Fv zX496BB(bwDB+CaRN!p-r)X7eMZ7y{x8mMr+Ngna;CT&hE*$~Ys*wWVE=k1~ zd-1Wqs!h%#hkj?iDa9{+12T*yJu@Q>-k3WZrcQni23Rd{^`CkcRxowe%jM3)2k$aN zG#>GiQ;j-;pko6Gq*CmP(oHJ*YUvC$Z14UIk|W z!%3R314?+iCvp>Mb&6v(=}16%3h76j$Dz)B6R1-Js@>B;W+Hcr)ll6d#{Sjqn9Ork zEDaYqT)AEcq9`hybVeKpl}rwwQx#07&s}xuj209C&o5fMc(ISg#NxWZ5{04VxVUR6 zv8$^a_Ut@d_vH@3DqI@-MsDHKXF#hb5YrY4^=o6Yn` zU6|Xc&50&Q1x5*FW#zW^K-=diPQfcC2bbL?l#eEwlD?!99Dz{&3pnQED8VrhM=YW% ziFWZG9OVeIAy)7M`4H4Z9F;g8lsYl-D;!om05LnJmq0cwwj9|y91&|2?ajWfuA8_E zgWdiBFUt}bjYioTZ;@>Y)&!KZF{k%!a}I5@v3u8%tJH5`IQe?aUZGY1@HMyGsjWWa z8hrX}Z94j+)=W)K4o)l_dm-08+$;#f2u+PflnW7D9kb~c*}Q#cf!S*LPz(f%y8Qlh zF(4YnU=Z?0I$-AXA~mPm@2}sx|8Qzuz1zYH_Jtz=dCsijvkrUqNQ`G4tU>u1^mS1U zbrMpxe*e?tP)OR}*5*kfT}$z1Gb~xS0OI4#iuoE|%=-@h3i!#?FoVGWgR=%f%D^PN zC*#1t^AN!Eufyww+YL={w>|Q(F35YjamKWwWGuiQ3ab#<7gSI^`FHHvv#zP7bp<|e zBEV7*5q<&{l&8ZBzx?J@L0K&p#XriC1M~-?QT@$Zc<8#|V)%;s+f|b>BrEIe$XxsA zaLx)`3Y!sJivnWXkGto!w6yMK>%)xy_9^>t$hBufT1qlluuHfm)cO86Q3c0O_FN8h zVb6bMHY8)0`by4f5qMS zc4w#0L<+5+H(#5B9lGyjOm2l5nwlXL3Mul?A&v31C-k-Xl0OEoxhv^!ok_er2lk}#m>Z1sA5yeNj)IYv#&7rMLs zd8|?!K5>qP*ABB0r&lPgJ0f~%Fmm5+fR4^SU41Mig3~T$8RpXtuc2#zrzo5$hSHK%X)&NW80|7DOTG5+8yCc2c2k($xZD#Wa0$Lnq zAu}!Y2N|EDEI^O*JpUH6mlQwWig#etc-sDPrnnm{zONiNk#=zlQ76zA#9h+!&ej?q vt-MOxzDGM%Kdaw6&SNL8itT>r-lP8lrp|ksUP&qW00000NkvXXu0mjfcA)oF literal 0 HcmV?d00001 diff --git a/desktop/resources/icon_money_white.png b/desktop/resources/icon_money_white.png new file mode 100755 index 0000000000000000000000000000000000000000..6510ff9c0472db3801fafb22bf899458471123df GIT binary patch literal 473 zcmV;~0Ve*5P)Px$lSxEDR7efYRk2RPFc7_KNt>31fsvsZVMDO-0el31!BPP$67T_Ro%jP-;0q7~ zLTqf50S1I%f!MJFInK02PKD#7s0d3@&c1i=ozFQ3;J*$cs`1mDT7E+6i&*L>k)~@! zBDErCk&h5U0GfvnI`fGX@i=`_Qb$O27fVGV(XTEM9A_{Px(T1iAfR7ee_R$XiqRTRE=X7&eZ?2p)5(H9d43DFk|Eg-i0QXlGH4C;fW0f{A~ z?UJn+aH%Gy717wOu|=~2K}BNNCMAj_8pV*{18@G;N?UDhAduFdw!5`ux3kyp%yNg> zGPAQSCwupvbME=hH}~Fi?+j?^!e&^-LsY`h;L>G9-Ksv!j*qW^7m)qSt=xA7Ed6^)1=#(&Z~` z?V42#OZjl#%Q%rpeE@KP5(6mkYv7E>B~fU{jy=$`h-mEImE{yq>R4W6uXlFu2hlb{ z7$SJM?ZuW}X>P7s$NYZ(KI@EVth}t0Jy};v>LA+3u4Gi=g7J1jkl-PYw(V&;n6Vfm zqUueR%#P@}r=MVcpKlbgwV2&(&OJNO)w4m@#fR7pV;ulEduM@X7r=&qWZ6Si6>dZ| z!2L-8gY3XNJ(ar7DzKyGOc9`_(;|$R%vs`mV7an<%g&wKQv|$T47a(=$Rr|+))6_> ztk0*r$*>Al(hcF`%= zadvvnnYj@qlPR5ursC$UWyfLqG#po1A56a{hTA*4(==MMv5L-D&U1A1c&rda#b!1a zMZwkZn;9cm5vWTxSFS6;&5)A_n3~C{Y2(36yo;i6g|}d1hhyS0ZfMx&bbHgyplR9_#4d@5h|Ox;+t|1pw(V;Y5-8uC`;HPB7%LGRHILR-f37G>JqjrkAXxR_*!Yor2&^$g zHi;yxsIbuR-+fn^?Q0?&YU)GSUJ1tG+=_OGwDajXW<#H4{konmy*fU@R+g6$ZUilW zhcMo-gOw*E^!&7AmLvyDpgha2t*g4(~Gpij)*{;9$edmv9C#A ztQge@@F?0gv<+xMw11ou1pvh+V`JM{*c)1Z?-7_6V>K30bp y?N3IGV8>cppE0V{33JPS`bvKD-NX0fo9KVr$wmfYWL?_;0000Px%@kvBMR7efARZU1#Q4~Js`bOPESb!7QsSIF z^O)oj1xorZrLUEN3A)p{djRsnS|Hs#5J57Ny-Mjw=)k<}6%%yz4W0lA!!8Koq^tWV z6%q9I4;{b)KBruVR#KKXX&w6%)qOVd;Sc`j<4i-A` z*p2UqB+amE4yvrGqC_O}wHzR^31Eezts>>HS^3`yR;7qu%4=m2J3`{;J7((?or7PI zm2LT3r3!>4Wp<=9TJ}9zhQj;qOzsVLFXa5QgH z?ey~1*?g-gVMh3k8d96Nn-R$sHTRKrY0dT}V5j}N>!U>SN`X-k4EJP)j;pz+L`(zX z0)1&W=bnxwWADhwmi+9}Tl#}WHqlYd($jsYAmtaeuk%)$C)T=uzyR&d&A&p`HK(bh zfAXA&>KrNmT~A&ip)Q63n<&i1B1y5SuPx$MoC0LR7ef&l}%0qF${%g5DQo$Rd50%So9Y32wn6BoPiBD;6gn{7YK0ze)@9) zhVLJMpM-)BLiuUjDA@M))S+5*#_a5A4ri-nQ+#!^zDgpMW<| zE8^bdnVKfM0Yshr5olk71?WIY6h8)MKsUJJCQEi-C@>4hUa_D1%-#d%0*EV_?ea^# zRnH|0PV?HU{tD+s+`zEd7*Hx;Hm@x)I8lsivC)+oqUS)$e}Tb9{;?MEM>-V-`;ri< zTSVe1aVsI{Ng7|RE;?X_P}=`3kUUL8^1>go zo*6+=HWvD;m=`oUw=0-ig1LkmE%A<{100)qhBi>>%zE&xD2lXToTVJw+p(i4t{ya@ zC`;lGHBI#(kD~Z$|MyoEdbHC;<0;u5^+?iJOF7oGWdGXRHPOQdo0<&=bU5zjdCp=a zT_k@x+5Yq)8O%9qO1=tx2@`HwZ8d~B3j0VeV#*>T@3npbQ_-7NR0iW%Y(e9*wyw2H}xki<0q|5(K(3sJjmKb0xhg8M< b+t1i51~mD#VR^UO00000NkvXXu0mjfP-~QE literal 0 HcmV?d00001 diff --git a/desktop/resources/info.png b/desktop/resources/info.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1080e39b8f2e2b96c6e6b202123a1876882090 GIT binary patch literal 384 zcmV-`0e}99P)LBTa5-7nXxPy)&>TDj z3o@Q~B4dW2zYY=<;Qb^7bZ23H4UiS=b_Qmu4jB<%;}@Z+-c2o-dyVSp{ZPT~XV?hb zLH?x0YS0Iaz(R9m

`qdadrfyrW@sDlLrc+RO;K0J54Zc4Rz zrdcl4e`G#0L)VXxk!V{KaSNmA%(x>BQL^-6r7mm%ytatf$AF5o?h=q=(iSt>Hc(0S z%szj-1Vl^5Gnx&c(hEQDdb1(U0vfDdh@WcOe@^>x)syWpX;``lMy-p`?6ROQ%_Xo7 z(W6nj4&(!SG**tU!~fBuEt~x%@XD=&e_5KR2F|eAU+iQ)^!Xx)23STs$e&?71atj~ eST;hx%l-iH%phTVSmb~J0000|k0wldT1B8K8v!{z=NX4z>1PNAWaSMYt=@sWc z%um@d{~*K785Kr74hJe`7;^D^*ED)z+stre0gJ(RyJn`7j7-H&Of9z=o|#M#-KJ6H z&Z~4*!6isRPpnYtO2ZU8DL39lxe5Kta-^hPDi5;h=CGd7`X(rFl9N+Ja!SJ+59YSN lDWboBOUk&t{Lh literal 0 HcmV?d00001 diff --git a/desktop/resources/keycard_logo.png b/desktop/resources/keycard_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0546b5458bc6ca66a0d9459120c11562f0d5d096 GIT binary patch literal 675 zcmV;U0$lxxP)kRo@GIDs zkZjAAS(~-bLn8m^^SRQIgkWjK`G6(t6M&eg%TaOrjELtrPM7odP6!P`)41Cor&7Xa z)f_;pNZ`3|myM9^o=-rM@Ad-)3=w6dUKu?FBCD@_h=Q!F-ais1E<{1UtnDYwu?2KZ4|Tc~Iq`MGb%&B(tv4%NPkHz-uhNuG$fT zJge4HW#!b&ZqVj|&kzYWWqIzqYxs|P<)lpvdTRB+bymu}%x|4TFGx0KNPa;zTiIIc zT#g1@&^o|#r$J|k4x9#5iG`y9bcV2)atm-)n^r9=9mYhCtsq2dr+YJZt98@aiKPK0 zF!}dpCy3cDw2+X69^_sSH5Or-ifgr*tc@GSDDMS9iP^T9PzWkVa=f|cerJf0-h>cE zc@o%V^%~f071zqj54^@HraB8EKd|&EPy^jK{`#JmQ~X7(rN6?|=m(naoBaR)002ov JPDHLkV1m=nElmIb literal 0 HcmV?d00001 diff --git a/desktop/resources/language.png b/desktop/resources/language.png new file mode 100644 index 0000000000000000000000000000000000000000..289bf5270f36a95fd95492cb2606441f80cef703 GIT binary patch literal 438 zcmV;n0ZIOeP)0wtsbI!HQ*9jqNl2hxFdknMmHD8Uja!99@?8Nf$&vp>6+5040U?mQR- z{vj$zXjnK*nBZWbaeJMlC4zK}Xd%whd~A@cWcM>PU9!zWK)@!m-4RV6tPb?_jtEj| zG17|uj2exKHmpuG6!Z%ENL5V>6aYzj;skh25`dzWO^HU320g#&f_$BQf9lK7k_P|D z2J0&%Mak$KWEBC-3qF{;xy9NI-wx9R^7&2_AQCTK`{yK%P1pt7Zvo0q`aL>GPc zq<=nLUmNlchS2;iX%eh|_M!O?NB4+6bsgz5H(MR7mWL}h{qjYiHpm=Qsp0SA1`QK_ gA}loI>m+{wU-9a~=$~|Z9smFU07*qoM6N<$f}h&LIRF3v literal 0 HcmV?d00001 diff --git a/desktop/resources/launch_logo.png b/desktop/resources/launch_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b6252c8da3008c6cb3edccf37bef5f0d3e440a7a GIT binary patch literal 3801 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 KL9O21*#7~l3mIAf literal 0 HcmV?d00001 diff --git a/desktop/resources/link.png b/desktop/resources/link.png new file mode 100644 index 0000000000000000000000000000000000000000..557c9bd19f0c408f9c2df46e5cfc0ff955b5377a GIT binary patch literal 329 zcmV-P0k-~$P)!&Cj$o6OmUtCcG zBs2^RR4};-B(d&}+9bA$(45tMV-F~AwmySdAR!R$vn!L${3bOd4`yFrb{ek48qx%1KegBfqwUn|C-1QYz$d5<9oW{1(X{V z4T+)K2$p5Dr8P)p%=Y7JYX5`2xM>%ik|{eO`udZn+VUuS?NEzT)Cc3ennQD1sP?P* b)*tl-t3Bo{g`x2m00000NkvXXu0mjf5lV|o literal 0 HcmV?d00001 diff --git a/desktop/resources/log_out.png b/desktop/resources/log_out.png new file mode 100644 index 0000000000000000000000000000000000000000..370625beeb9b70833df56a3f07a9585eb89b4028 GIT binary patch literal 324 zcmV-K0lWT*P)}M#u<^K$Qn-MQzsz^{Y64@zo)I0{pRABqZ4L zAdeL*`~`Zm5i3R!v{$g0d?Zj+jB=@~=q`dDP33q{DuVbmN0HFISzp}CuK6gC#Uj0_ zerHlu>@ZEEuga>X&L`)KBZ8;T>SLA7?hzJrh6vyNKJP7mst(6Xl^Zfj_R zKG~eH$rcJK43ps-QnxTBX-FJ7BJ_I}rUbfS-02c8a4qs6VgfTvM0ey@Sth916kfNZ zbFQWx%wTM}QI=#w)xHYw@CdDM)?>c{+jb>&qO@Y^eHqU~URiOtmC$-PWzS#sdwT*> WE8i6=`vK_y0000003lAc1Tz8 zN&mW~CB=y7ZJ7fAzJa10-E6)}EE|qx+hN&9M2tu*+xk!*kwZQ!_7T`QIClCdW^#HkzNajfv@?) zsu^+T(E!EOYhp4qzAX}o4h}>coBNfG>mfugE@nBE%ug-k&v16T2e+b0JddzN7k^Gn z4v+e5Ex&w~TD^87Y%#5nU(vW8L*jAy!VfFLk9^^QNYv0JnC9#@b_uvE!m0UP!Pb6g z3b(RpeRzC3|LN-V{B9bV-!-@;9uF72>=C-??9T~F;p*q(vc*qk66WfR0UXGxvQ^vS z=Gx)dPg$Re;d3xpFt&Itj#9lAo6UlI#+IOihCG9-C_zCb*)Eo`S+nS1)~ae|uyg4xHGmfMyH2c=qwUTKcG zfIRPmqy2UY*FNyBSx2tzSW{E3WoGN7-+D{;_Z;`mp2kOkGeeZ@S2m4fkdRyQ_it;d zOFkZR3+432(gF?bQ*@VBe<;&j5?qbo@CeXfA(kVgj?IV8pq@*Q7Ib2fiik;1f3?wt z$_|)~t*P8f)OoE7L5#p&cI&+fcs&jWmOjxP%Lwhb>Va9mxSW+|u$2-OP+{in?GIXZ z+^2$v!F>gLh#*;mi44ag>TP1w1-}AA_*k^ZS*vTcO$ui{9;P*DMaP6fd>3#t`sO zWAvUkJ0Pm?cmm83A=w}={iO5-3C?gOWy>lxc>iQZIKNJ>Vx^$;mci(y7L}8_VqUnUO}ii zL>VJ37uGt!@ZFWOh3}(H`Y{s&Ns!H&{6yCiNknv?=C1CZ#HGi`ra~?#4XubyPkMxU zU*}#-1z+z4`XVMiORT(KJ_Wt=2Oud7u0oswOD4wMZYf!fo*%x&Bj~#?{jFfU^R0KV zYJI&_hq{?p{@zO#=yX}!+c+Nr#vfnaL0i&8Q@K0+$NRxYI zyW-5lm=ZwNCpj4hs69;XfbhB&^HCeP9Kiiir70Ix$3K-7Z&2XfT)zG;Ne#n_h+(>0 zG^7ST`1!7x2+eL+D?NY!YqnMrSSh`Ty9!gQWeOL6d^M!04kYYIwPMoQ;D~I8_QK99 z&*vJf^FZ`TU!TXqNi7oISBP;wd5Lj(*M&WFb?0E*6J< z;9`&zQ>F{9kj$2TE&n`&kBD@c9u@89Nr3qinZ#Iu#&=sE+OZ6yVufV9AOw+mHemqd zqt}@=;+2@Wh;SPtw``f!-HZQ{oIz1OrxZX>T^Q}(%eB^$RHWt={9s?~M_no?KdGSY zRvy1#b#5ee0S^tG{iT3?-)%jl7p86VR5`OjHN}6*+{|DWOS}*LvowwqZ?7^zQrhr3 zJ!t(u$C2Y|CV~*io4$TR_Ut(gO7BanULB`!Che1=E%7?-_q_D3UtZir9vJmWBeMJC z{g@^J0g8Tv?$kX)mksv{B5l%EN@72pOxM);`$p?PasQRh9>0t(Sk*%>;yxw5U2k&^ U+#Z^6S^T2|P&UrUDr;=Qe~>P;KmY&$ literal 0 HcmV?d00001 diff --git a/desktop/resources/mailserver.png b/desktop/resources/mailserver.png new file mode 100644 index 0000000000000000000000000000000000000000..51389784c702113638dc6b9a58a3fcdc710347b1 GIT binary patch literal 258 zcmV+d0sa1oP)MI&MqnO8@`>07*qo IM6N<$f@|4lkN^Mx literal 0 HcmV?d00001 diff --git a/desktop/resources/make_admin.png b/desktop/resources/make_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d9b8ecdc77b93c57546855047aa55043f93555 GIT binary patch literal 354 zcmV-o0iFJdP)Bt{h|$1X~!dvANMWa-s&0;L}Z5YUHVcKf9<#{oZJ}#F@sZYnNckE-|Rl zr5OWM7_J)mUVAtv26hf^u@*LT8`M!4f^V1W-CysbI$F@RTfRxZ{z)(37@`)}8o7b) zk&|`@J!!818Ag4eq5FhVWvj34Q3h=O#lD@07*qoM6N<$f}bpu AzyJUM literal 0 HcmV?d00001 diff --git a/desktop/resources/max.png b/desktop/resources/max.png new file mode 100644 index 0000000000000000000000000000000000000000..096b9a0b35bfa1da7ac06f6602095e9d2cc1753d GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYudNC{Gv1kcwMxCm-Z(FyLUw7jY{% zys0zq7>6vQ{o0jkYL|W)eyf<;qRq)LdHv)M4oj*hvOgB%%`EBLupvR>^bWPh7Lt+| zJuX`GeO=9B-Mc%u^lHhfRmUO<=e(`(p6_;Q+iT7561iSqEZSFHig5p$p4)Z1Mxyq$ k!}1r`7cEqs^QT32s_2pv`>xj-0o}sj>FVdQ&MBb@0FHo5K>z>% literal 0 HcmV?d00001 diff --git a/desktop/resources/message.png b/desktop/resources/message.png new file mode 100644 index 0000000000000000000000000000000000000000..74e7ef02a1f6655656a4e6f541d96881c085ebc9 GIT binary patch literal 314 zcmV-A0mc4_P)Pi42C9NuG@h73x| zZHjz9#PoLPsoW;iC-Gzti3!QDPDnJ1c_CQ1nY>KU_@R@Woqr9l^v;gWoMN{ zba=#egz-gVaS_>(i~$?(2|9iWO`!T{FH4X)do9Yi7db&^l(`}uZ)*k=R5wt1Q~&?~ M07*qoM6N<$f>nBeX8-^I literal 0 HcmV?d00001 diff --git a/desktop/resources/mobile.png b/desktop/resources/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8e141fab5757f1a726addb827570f36d45baaa GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%sXk8^$B>F!Z>L@4ZBXEGInOK6 z*_+Ukw@CN|o6#ic1&R|^aNbZm_QJh7-sCLz_fqyfR$_ctrcQO_Q8II5Y-48?n=D!x z{Iq~2G3(Eh8%As^lg_PQBpR}v^{J{tRn1}rR!t8_uAmF@4*!HEtd-1im}Il*wvd|{ yORP%vv@5fI+fACV!6VDp@W%Q`zo;$y=E3LYub%DK}3S$B>F!Z!c`*WKiI7xp@0d z&V-ybP0l+XkKF32g} literal 0 HcmV?d00001 diff --git a/desktop/resources/network.png b/desktop/resources/network.png new file mode 100644 index 0000000000000000000000000000000000000000..801c5fdc51b85ef662d32ac6808e43f76a89d8e5 GIT binary patch literal 387 zcmV-}0et?6P)Nkl`tGOA1;9EALMB#b47{rkqRS2qfIokNL+uc#p8!PQz=E?72wGou%%0TYk@ftt4 h literal 0 HcmV?d00001 diff --git a/desktop/resources/next.png b/desktop/resources/next.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb116be24f2cc07e52a70c6b7d299ba719eff9d GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%DIZT4$B>F!Z!d4;Wl-Q@cFaGe zaguEVV~!M;3;(2Ujz7#X-y5nloexL^C|FGC-nC4t|J9`qW0^s;>*9wuJ^;;S@O1TaS?83{1OUEwE6)G` literal 0 HcmV?d00001 diff --git a/desktop/resources/notification.png b/desktop/resources/notification.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a02e2152b8f026b6493d7f451e6fabba12b030 GIT binary patch literal 235 zcmVl~8+osX;yrwpafikiBc%5NvW!3DXh@&r5&D`L#eIzJTZ=_955Vtt zBsy1ycMiWS#My~92^pPTs0&r3Fj+#Ap27*&XWt!WXpM?1O7VZuEXz?_a?wq@N~s0T l-pKG4rbph?Oz-$dJOBzi`w-CBUi|<7002ovPDHLkV1n{_VYUDO literal 0 HcmV?d00001 diff --git a/desktop/resources/one_on_one_chat.png b/desktop/resources/one_on_one_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..b94487fe60597a873b8d16a613334cee5153bc30 GIT binary patch literal 347 zcmV-h0i^zkP)gW5Jhhtqz)nh36X#U>Hr*c9e@Ms1PM4O4vK@)fdohcc|iH;w7VZLVdrEYdsfp&*l;O1LU@1LcyI*pgw}N_$wZa->#=EWm t+n!o(A6bUSF`)iFxgP@>OC&nt-KS7k9eBhfZu ut71TRyvg3_Y^$|*Jw+}$AeSB4PrLy_%K+_#&As;k0000|k0wldT1B8Lp3QrfukcwMxryk@zpupiOd2r$l z5BG%0Wz6mcTg==p&+_0+NYXzPSljmDC&QZyY)$M*LZ$-joa@f_JXo^8;=mK1ON&l@ zZPt9VCVdgp%A_9}D-_r#z6>c8eY!XJ&rf3y-9WySNgC`%o?F-@Rc|%-2=U%EUhHz) zsle}betQPrlX-d<|9shMyfvf8ykmOC`kbg;dc8}s=d$($n`S^s61>OSS; ZygQHZPBgaE+6r_tgQu&X%Q~loCIA^|S5g1~ literal 0 HcmV?d00001 diff --git a/desktop/resources/photo.png b/desktop/resources/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..762a6eae62b4e83884c792c0083d9110fc94a6f3 GIT binary patch literal 366 zcmV-!0g?WRP)g13frJc3?P62NABy4A4=cHOS)^G*=6$$Jd}tH!4j{>WLgkYP8TwT@uK` z$Ox#+HjCS4g6QLly!+j?5ia9!!0GpRNatYo%H-A2QX9fF4cRy(j9GOL)Lb4c-~GM z!jfrx0SeVxpePzoLE~)x_gLw4Aj7QRB7ds^@tZtU^Yy_RF^CE?lzNR6OJ;+Rg{D;XP2eSN6{1>%(nZM>^2;PUBq30#l{blz=`d@r2ZtY^Mx+Ax_U;qFB M07*qoM6N<$f+O3W4FCWD literal 0 HcmV?d00001 diff --git a/desktop/resources/profile.png b/desktop/resources/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd106826635b403a8d20d8af8bc6c9f26af3910 GIT binary patch literal 301 zcmV+|0n+}7P)gW5JiuKNI*g*L;?;P2gL!AfCF%X1SCWP4!ZpyohgsPCewcOvH9Cc&g^XNz3`(| z&=3%WftDf{b3qoT&cW0xOcu(;hdmYpSccds(?HW^x>>J75JC#Z#wYXj8b$=c>OmEP z(60K^OqCww5d^R9zki}>M)MsYSVuW%BY$F3m7bY?3`02={J?_b4;>E zRr&7kqBR0dzWcwjENwLC@{B1-xgBZA@#YRON+E;?MX&1=<*@YO6KjN>Ysz?=)ZFae zX*6chM3?_ekW*xixFd#?}yJFN>2OL00000NkvXXu0mjf^TUN` literal 0 HcmV?d00001 diff --git a/desktop/resources/public_chat.png b/desktop/resources/public_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a763907103623a1b0bb4361eb14401d8fcc1b1 GIT binary patch literal 345 zcmV-f0jBA$HfwvQ}$pV5zk0Sf(O@5+ao0%VCK#k?6WHY+D z8M%qOIE#l^rszP?coxdAzaxby@FaaX^X{k5QDV~6$BxIfNsbDYXQ)?d%?{-1*zrV( rdK!OG-04ty{oh4QV%#j)N57^oU?41S-+LF^00000NkvXXu0mjfN0O0G literal 0 HcmV?d00001 diff --git a/desktop/resources/qr.png b/desktop/resources/qr.png new file mode 100644 index 0000000000000000000000000000000000000000..2e03d17323c3f50d24236a1a310e9cb7a92b58bb GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpOivfbkcwMxLvHgnDDb?|=sBcj zsB#Hdb+vk>WZc5A2RcU{ zT~1DmSZLO><8aT_%rB=-EXYc$b=hLdm*@3$cI5BtQiX?fCas@jUDEsE?3^7&JN`6G zT&Bpl_@2O;qC)Z9={1hM41dmY{BvguHGaML$+XvKrjX3|tA7PzjY#2{%3EWW1>!vj2;EQ4N1Cw;~4)EZ9(6Asl z^ytySqR4wDQA5su??A8>!iy&&Z#Yu6^HYb`%R<|(+(j{(4Kx(KE%ZvS(9Cg3o=5~5 zf{La;X$43038mdL6zGB-L&S$JL%lRl#C4|hR)!;@j8SpEpMr~sPtl~3>myR{5EWiq z#+CJfh;-7;p)I_KXiTj-Ph`@Qln?UlKaDc1^hr#MD|thg*zRd*4ezl^%#g}CBa6@F zu&K@LWFEG4a;Hx1Z)Yg7d+xs>EYO6~4&}F34B&$s;tSiR%ZV*%7A61y002ovPDHLk FV1kJLhEf0k literal 0 HcmV?d00001 diff --git a/desktop/resources/remove_contact.png b/desktop/resources/remove_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..f801fd89f3c24ead80387ff6d38c2b351392c6fd GIT binary patch literal 304 zcmV-00nh%4P)5q~mfF=8h!Y9)W2ym_txDejG4VfMJZ2x(sM$reDl@1R<2bnD}K$Z^eWl7(Gyf zAavP$-l@?8IRwF}=jU%Ub2L#U@(iUMJ+HRhsVl!4)KN7f2BpNx0a!c22Fb^Ny>Kf8b$GD-@+*U7G4yc*EPx^_2Gs!!p<{g zyv-8xyKlTkcADsNp9y3YnPYXiWEIh6%j4}|C)ERRaPa->RxT?500003LYub%sg0g4jv*Ddk`p9Yuds0O@bYk7 zF?eBjxW4W86$7pmfzX~HiFIz81}p|oj7wB`rWhmc%6>hgq#4o zN!z~j{FZz+`LQXZ%Jw(u1q$XHSS8LSOE`tiS=%mk*&*`E^<=}g9-T!ES0#*$-ZIHd z^iDElD&{}Blk?HMpI5X>Wi-y;oe<(<$kCwY)aA%{V*%$B=_?JUti4h#JVFQ9js`Eb i^IgzqxVWK>f#FC%->b!_;hqgyyl?{p;`t!(|?KF7UBy zCXlpfG%XVG8;FXIk!i6U%{jOZzXF+8cQhRruXrp5jpl((z}_ES?4# znhtf+5tnc$wK~M_W~e&yW@5r%5|*fp(f1_El$_OTs$5|VZXwom?|VU#15hsl4B4&) z;8u9H2<4L$?wNZNd`BjF`lKKe^(-4Mu&B<8S}L}nj%k0P@FCU+)nf`1q_7OMt9`#e zaYs!3?G#*|%I=7iv^eA@Omjpf#I7#4Q6qPLk6BEc)tQXE8IP!TF8&WR8go|sb6qYi qf38;oRT$Z*?s`(W+q1EBwXPD0000HrCmfP_fc9$<1vNCs#x?c{T0_U+%<{c!4k zWEcqu!bFd0gJ>pX^?Fn-reoe<1R>O+R4SWssZcX4s7pC0WV`F+vMOm)?T+y z1tx>p^STp}u*CF=L1PnK5FT}D3)#>%p@voYjKj5{Kw%m2czSF~SR*Q@6IGAmJ1EDg aAJ-cLsHzrrWwi?c0000|k0wldT1B8LpRZkbkkcwN$2@AjE+t`4R z;Z)Db^osKzOI#WD}dE!4v1LrV5TTI+!YIk+e?X?k>M^j{MW?BEcHb~1a=^7F}++{Fwm44=O;-L#6I R#0~TygQu&X%Q~loCICxlV&VV* literal 0 HcmV?d00001 diff --git a/desktop/resources/send.png b/desktop/resources/send.png new file mode 100644 index 0000000000000000000000000000000000000000..565006f41b7f96f8be6024db6c2bb7cba1c608c5 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%sc=sh$B>F!Z!cN%F(`1j9NfF} zjtn<?X#x|832@AYwXMXUM9vc0|_Rmv@NN sf!I5KD(GGw?TDR literal 0 HcmV?d00001 diff --git a/desktop/resources/share.png b/desktop/resources/share.png new file mode 100644 index 0000000000000000000000000000000000000000..f70ab8f28b62d651d2c56904d344e1165692b4cd GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpL{AsTkcwMxuk>;@C>tyx!5^6esQ+2Nm$}8cE(nsshRm};;fYiOacvqedqSXJk!eB zf8s$#>3PL_>kd07E;nM#Ie}oVXH` z-DlW!Wly=AZ8+M~dQmR-z&`u?{EV;9oG{v`}inO`ahTh1OZgF=~;|TJyF#Ihfp#k|1!T#pb!YnZ0TlDA|y!GSDrbKmI*yP_Qo~DqHbL3*$LBpIEQi&twib$ zjvE=9&!AJ;y#P^5d^2R*JGOR3{bs*we2(+dmS3cMH<-)}0y>*OS!FYZjIWNp*gzoI zP(iGCWrwMFTpW=f);SdFIeM0iHQ9zjHg&`X7j>NCEA1riAP`j6Ez=pMH~-p3noLXO zlj9QVz*@lsblTxG;*or+b{G%{rsx-qZf?nLpt|LQp_mmr4axtqpFy>SckwsI;}4rV VI=VR!Onv|W002ovPDHLkV1nmnpiBS& literal 0 HcmV?d00001 diff --git a/desktop/resources/text.png b/desktop/resources/text.png new file mode 100644 index 0000000000000000000000000000000000000000..cab051f138267c367553d5566743d7e8077801e6 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8t!2%>3LYub%DQ`~~$B>F!Z>QYmWH8`hmObiQ z8tlGNS*13B>+IA24lTyQj|vY-=~x5`FZNjBx%aI|9_O<;D;`{bwduu;%p_A~L;YJ` g?B_ZzDeg;Q(D&_ZKO*{k9?)0@Pgg&ebxsLQ01F~5q5uE@ literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_arrow_down.png b/desktop/resources/tiny_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..51ee3d99f816cf6c2a83c297e9a1b67eb9de1ef5 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^53mDH{QsVYww$B>F!$q5oh3ATr8*ccy8 zWjFYf{^R@uhdpgAfxOJC4o+|sbZ%zI>s3hoF3A&UVqvfcC@s)`Uh%&q*F&jK3za_Z zc$1OvgFUQ3&gWgbR{nwK-ApUQSacMg6f(C}7aV=x$sNVIV%l#Wt|P~qnGV;qeLbQr cpT)p%j`(F4GMV9U<%;F63$2|S zAIgPHR%%v=aki`5u55D9H%AQ?UO z-Dg1+C~1{W!(61ObqBU^k8A`}$#Wr74Ua0i3Ed@iizW-|rma&px@bwo!c+`Sv&7x} x$JOY*d~L64mj@oure&^34s-rQZ+rqj*cZs6EpN@vH3k3x002ovPDHLkV1jsBWNQEb literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_edit.png b/desktop/resources/tiny_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..60851f1aa88d2a265964f2aaa803d450542e98f9 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+id`}n0kcwN$2@(|x4s4kJ(59K` z9=RFp9AxX8}Qh0P7UDn zIB@V4gG>XnRwADoBd3RhlS&9v_3KL$C)wQFc3$`U)hCmltz)gTk8&w_e_1_8k|ljA zyGl;PgP(6^{&TqUS?j9@vl5g3h1ALAKBhYb^M0+ObE&thkk~LG@UuiE>0bA^ix2xKot4Hu! f)xN*K|ER2jcBhA-j>3DO%Naaf{an^LB{Ts5Hak|K literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_lock.png b/desktop/resources/tiny_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..842deab5a33e6ce708da1399ad5f38934b5fecd8 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^53mDH{QsVYww$B>F!$q5qc4m2vxU)XrC z(c&l*&u7Vh&JSzY7!OJPTIhAX`DLBcDbWL`coy(6ZxsEIt&#BK{07Ezx6gl=zmQ>n z8{3BBgapRJ^=)m9S1z3YASbtAg+O+M>Vp8D#(y_to2AWo{COEGOphe@x7T|JEc{`6 exaHy0yNvwSOYVO05|RbFg2B_(&t;ucLK6T1P(>>M literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_lock_broken.png b/desktop/resources/tiny_lock_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a89d012c6c73553641177d09baccbcc1ce0726 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iGEW!BkcwN$2@>lLG%C(t*m$tf z;wTf(XUTug4{O*M4@v!6=ykpMWu4P0(F3P=7Vt4|6#bB`k?`aE2F7!@&wrS|utDU! zK9GCCV1m>y$$N*HMMRT$SF^};DPE8dc4m&_@di^F6W`JIl4?A!?r<}F XI6tpzrnPh$&;<;hu6{1-oD!MlZ8WiU%&Ub8# zc*@4}Uh<#upY)3J2@Z4GJ|{d?*fHON_y0tNzy$l4pOsQS8yg)NWxSY7x|^$3=$|t_ zBK&y9Z;gc|^8>yt)N0Q-_;@-C&r^jP4n8u<&Nd(KI;`Sd%wWyHFv}}gd#(=W8=$oe Mp00i_>zopr06U#Js{jB1 literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_pending.png b/desktop/resources/tiny_pending.png new file mode 100644 index 0000000000000000000000000000000000000000..912c8ac449537a3eae122d9e6f6ee5b450066216 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i8c!F;kcwN$2@ zQzll#@Z`KW^;+_u@t^b^=M@;9wHlsDnQ>BpEp4;m3nK|*3FD51Sv&ZzeVD(HA?KHm z2Fpz)p0K<#2@R_r+J-pWw6PhkV3Q5uWerf*Ot9#j>Bzpuk?XEFm&UYH1}79gR!Gip c4?Zfu&d?Pkv*CSh3&>Fnp00i_>zopr0N^S-jQ{`u literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_public.png b/desktop/resources/tiny_public.png new file mode 100644 index 0000000000000000000000000000000000000000..b763156f1b8644c2f62cbc779ef9099de247e3df GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i*`6+rAr-ftPKp+6G2n6SXHf}Z z64F}8cffIi0H?(YAlFG%fsym3{Ipd0*i+Zf>AVa#{{H2hFY|Q`fA?ax2!l4|z-D(3 zo`%E>&lfKwPu{3Xk}Pm}<{QEIV)l>c4arv1ANH}j1<5|>Y`N>}@xpw;agW)P>wmp` zx4C)a0|tSfJ>R02Z1I*%cAL53((3gS<%=)fy33=n$@@clDf2qk3LlmR)ww`tGI+ZB KxvX literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_reply.png b/desktop/resources/tiny_reply.png new file mode 100644 index 0000000000000000000000000000000000000000..482c1afadbfb61a202e316ab3fc995c3f5d68f01 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iCQlc~kcwMxCwU7t81T5vXHijL z$OxLvOdImFYC->!^ZUHtta0(>6mC9o^-HQ?}DJZ(c{z6R$`WKA9t5;;4s{?f6M-* ly8kArUa_6M@OgNYHeXiEt^0RGgMqGL@O1TaS?83{1OTp1M{NKA literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_settings.png b/desktop/resources/tiny_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..52d1b243628bb4d0cc4872a2d77456594c47f3a9 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iK2I0NkcwN$2@-V*jSCrhk39}v zci@9Ox5aG-ZA>Z?>uT=lHguaQ zbXqOQawy|FRK<8F?!JG(;o1;hJ`KBu#u}AC){=N1hmWi$E`Rk<`fTXz+3?WzT*BV| wOgl-z_IIT$HvQJRk_lHAI2?UqYr@E|dhLdtrhC@w0bR!6>FVdQ&MBb@08D~MCIA2c literal 0 HcmV?d00001 diff --git a/desktop/resources/tiny_tribute_to_talk.png b/desktop/resources/tiny_tribute_to_talk.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f970e105d374f69f1b1a63751dc0f1ca89744e GIT binary patch literal 249 zcmV?Y-i$4<9`f92mD=O| z0AA*0au{vuXJ{jlh(sbw^KTtM5QKuBKG^}pJgr7{4+thCb^qi6ZEX$k^nlvX+awAP zD9k*7(S*>6h9A3&@Wrk?_u{>rrU=O<=$7>XOAE+3tppMI00000NkvXXu0mjfaGGi# literal 0 HcmV?d00001 diff --git a/desktop/resources/tribute_to_talk.png b/desktop/resources/tribute_to_talk.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb9575d92dac9bef4b03e4c4380859b195aebdf GIT binary patch literal 404 zcmV;F0c-w=P)uw#M8_&&r6Al(}*hF;890dm3~J(ww8*x{h%{ov>pZBq*~$5%DAn+ThG)Oe^$ z{CrE5kpr&jzLS$rW*kJcr-k6)Zq9m%B2jK7HmZ`tC0dm{OVkI$gW}J9hFEh=qv&B@ zuY12(gVH3sp2lY*<(P&%xw8HsNN3H6Q@3s%xws>iiFU-{_J61NIyB>BoCL`&uldS)2b$U*gI4U|^UTAUSI zEB@w!VbiJDw0R;27&w^1h?_*u&`}YUWs8}71Eekk8NUbVSYa=IAee0tFhJjan!Yv8 yd-l$U{*UKtC&X2LRf2MKA|A1IJ#-85C)YQrjC93GmtpAu00003LYub%sT5Ba$B>F!Z>KnNF&J_%e=h#p z_}6j%E4goX%z`4tOm?1Hpu(|5%j3ZWo(YGG1EN?{C-!{X=HXV|?iUgLUQ1o(*_Hx^ z#rqFPG#;!>3z}i>o-}*w)5ni`XFn4CYuu^vWP!+9vGweeFYnzfts9U8w2#5l)z4*} HQ$iB}2+TWV literal 0 HcmV?d00001 diff --git a/desktop/resources/user_profile.png b/desktop/resources/user_profile.png new file mode 100644 index 0000000000000000000000000000000000000000..2035b0066316a93edd29c356a9653226b9bc14da GIT binary patch literal 395 zcmV;60d)R}P)=~*ifZD@kE!GXC%aCOQ*y{0ZIDEm(7M}LWbz(jWX0O5>)#QT>BVCvXRaCDo*QBD* zZPc1+%m4BjAyiI;zX1wg6#mw*M83sigwUl1YW6(|Sc_>-1auqTq(oF3>EQ|fgUHY6 zEt02n-rBCDIho-jd-th+0wt7TvqV;?PL&0D&oL)7v$&P+sC_&*Ml>Uf_$0-B>5>MT zuq)&3)Q1aH8R?p=5ha8vRgaRIj#f#Z%&$Tu(|*M literal 0 HcmV?d00001 diff --git a/desktop/resources/user_profile_1.png b/desktop/resources/user_profile_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2035b0066316a93edd29c356a9653226b9bc14da GIT binary patch literal 395 zcmV;60d)R}P)=~*ifZD@kE!GXC%aCOQ*y{0ZIDEm(7M}LWbz(jWX0O5>)#QT>BVCvXRaCDo*QBD* zZPc1+%m4BjAyiI;zX1wg6#mw*M83sigwUl1YW6(|Sc_>-1auqTq(oF3>EQ|fgUHY6 zEt02n-rBCDIho-jd-th+0wt7TvqV;?PL&0D&oL)7v$&P+sC_&*Ml>Uf_$0-B>5>MT zuq)&3)Q1aH8R?p=5ha8vRgaRIj#f#Z%&$Tu(|*M literal 0 HcmV?d00001 diff --git a/desktop/resources/username.png b/desktop/resources/username.png new file mode 100644 index 0000000000000000000000000000000000000000..819ea7d3e39672d4d04a2ccdf918cfaeb9c44eed GIT binary patch literal 454 zcmV;%0XhDOP)v+l+dOOc-;*T8z0H($!UIopS1=W z79KMeESTY7@wfvs5Jdh23{dBRUKN-P?s*PqOd&H2G;xUOhV*Ux4)jhZYw>%R;NIsL zSu_Va+V9LdaxuHW78-5lX~?seffP}<4B8b^cl2vXO_BXTAq@e$;^yAO`w5_-gN+0g zlH0~`!2%DL-ewlAYrG!BDcV%XuNnBtBmx&VZJAD56t#iRpiHJMnPVqRmAX+GlqLZ( zi)3RuUM8LnG&|@ycZ%ng|0NlW7py zG3XsxM{oUMi3a(mn_cbl#&K|Is`7?^?fOHwovoci(at7uZ>iB1c{H!QMmA(T+`9NzMdS0Y=vpo{ViJ|pQGKgjoSJ^R+tbFU=DnC3LYub%seVrv$B>F!$q5py&axH;Z_+Ey zf0(baWBx&g>4qO&q#7GO-slNT*x|p)@x3IA0k0Q>_ucdW1ucPuYibEzrVXl69en8W(789$lUni>;6PECxR=QaZz_I%aO!frp{x3 z4u@TEYG6EEw}|J*@eh58^38`c{@QXaU|=}7&S&0j4jXl#(-=Hm{an^LB{Ts5h(Aa; literal 0 HcmV?d00001 diff --git a/desktop/resources/warning.png b/desktop/resources/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..05f8a6db8a1b8b27134e33bba5c9fa047e352113 GIT binary patch literal 381 zcmV-@0fPRCP)!- zYW&fXF^pzv5L$hKx9yX&syE1^26_eR5iwq%9hjE`mwxVy>on)|+Gb9d<0m zQTrOm1-n;Pj!DD+-c}tEOkk8-5A(4!rKQm9+x}u-;6tA;0+#^`aE1J3Y=B@*KM~uT b(EqXrSot7f3B8YQ00000NkvXXu0mjfAOxdj literal 0 HcmV?d00001 diff --git a/modules/react-native-desktop-config/desktop/CMakeLists.txt b/modules/react-native-desktop-config/desktop/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/modules/react-native-desktop-gesture-handler/desktop/CMakeLists.txt b/modules/react-native-desktop-gesture-handler/desktop/CMakeLists.txt new file mode 100644 index 0000000000..2524fde7ff --- /dev/null +++ b/modules/react-native-desktop-gesture-handler/desktop/CMakeLists.txt @@ -0,0 +1,9 @@ +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(REACT_NATIVE_DESKTOP_EXTERNAL_MODULES_TYPE_NAMES ${REACT_NATIVE_DESKTOP_EXTERNAL_MODULES_TYPE_NAMES} + \"GestureHandlerModule\" PARENT_SCOPE) + +set(REACT_NATIVE_DESKTOP_EXTERNAL_MODULES_SRC ${REACT_NATIVE_DESKTOP_EXTERNAL_MODULES_SRC} + ${CMAKE_CURRENT_SOURCE_DIR}/gesturehandlermodule.cpp PARENT_SCOPE) + +include(${CMAKE_ROOT}/Modules/ExternalProject.cmake) diff --git a/modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.cpp b/modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.cpp new file mode 100644 index 0000000000..a594a2dace --- /dev/null +++ b/modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.cpp @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2017-present, Status Research and Development GmbH. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#include "gesturehandlermodule.h" +#include "bridge.h" +#include "eventdispatcher.h" + +#include +#include +#include + +namespace { +struct RegisterQMLMetaType { + RegisterQMLMetaType() { qRegisterMetaType(); } +} registerMetaType; +} // namespace + + +class GestureHandlerModulePrivate { +public: + Bridge* bridge = nullptr; +}; + +GestureHandlerModule::GestureHandlerModule(QObject* parent) : QObject(parent), d_ptr(new GestureHandlerModulePrivate) {} + +GestureHandlerModule::~GestureHandlerModule() {} + +void GestureHandlerModule::setBridge(Bridge* bridge) { + Q_D(GestureHandlerModule); + d->bridge = bridge; +} + +QString GestureHandlerModule::moduleName() { + return "RNGestureHandlerModule"; +} + +QList GestureHandlerModule::methodsToExport() { + return QList{}; +} + +QVariantMap GestureHandlerModule::constantsToExport() { + Q_D(GestureHandlerModule); + + QVariantMap directionValues{{"RIGHT", 1}, {"LEFT", 2}, {"UP", 4}, {"DOWN", 8}}; + + // QRect screenGeometry = screen->geometry(); + // QVariantMap screenValues{{"fontScale", 8}, + // {"width", screenGeometry.width()}, + // {"height", screenGeometry.height()}, + // {"scale", screen->devicePixelRatio()}}; + + // QVariantMap values{{"screen", screenValues}, {"window", windowValues}}; + + return QVariantMap{{"Direction", directionValues}}; +} + +void GestureHandlerModule::handleSetJSResponder(int viewTag, void* blockNativeResponder) {} + +void GestureHandlerModule::handleClearJSResponder() {} + +void GestureHandlerModule::createGestureHandler(const QString& handlerName, int handlerTag, void* config) {} +void GestureHandlerModule::attachGestureHandler(int handlerTag, int viewTag) {} +void GestureHandlerModule::updateGestureHandler(int handlerTag, void* config) {} +void GestureHandlerModule::dropGestureHandler(int handlerTag) {} diff --git a/modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.h b/modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.h new file mode 100644 index 0000000000..0d0d2c32a2 --- /dev/null +++ b/modules/react-native-desktop-gesture-handler/desktop/gesturehandlermodule.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2017-present, Status Research and Development GmbH. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#ifndef GESTUREHANDLER_H +#define GESTUREHANDLER_H + +#include "moduleinterface.h" + +#include + +class GestureHandlerModulePrivate; +class GestureHandlerModule : public QObject, public ModuleInterface { + Q_OBJECT + Q_INTERFACES(ModuleInterface) + + Q_DECLARE_PRIVATE(GestureHandlerModule) + +public: + Q_INVOKABLE GestureHandlerModule(QObject* parent = 0); + ~GestureHandlerModule(); + + void setBridge(Bridge* bridge) override; + + QString moduleName() override; + QList methodsToExport() override; + QVariantMap constantsToExport() override; + + Q_INVOKABLE void handleSetJSResponder(int viewTag, void* blockNativeResponder); + Q_INVOKABLE void handleClearJSResponder(); + Q_INVOKABLE void createGestureHandler(const QString& handlerName, int handlerTag, void* config); + Q_INVOKABLE void attachGestureHandler(int handlerTag, int viewTag); + Q_INVOKABLE void updateGestureHandler(int handlerTag, void* config); + Q_INVOKABLE void dropGestureHandler(int handlerTag); + + +private: + QScopedPointer d_ptr; +}; + +#endif // GESTUREHANDLER_H diff --git a/modules/react-native-desktop-gesture-handler/index.js b/modules/react-native-desktop-gesture-handler/index.js new file mode 100644 index 0000000000..82276071aa --- /dev/null +++ b/modules/react-native-desktop-gesture-handler/index.js @@ -0,0 +1,5 @@ +'use strict'; + +var RNGestureHandlerModule = require('react-native').NativeModules.RNGestureHandlerModule; + +module.exports = RNGestureHandlerModule; diff --git a/modules/react-native-desktop-gesture-handler/package.json b/modules/react-native-desktop-gesture-handler/package.json new file mode 100644 index 0000000000..11d321c131 --- /dev/null +++ b/modules/react-native-desktop-gesture-handler/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "nativePackage": true, + "name": "react-native-desktop-gesture-handler", + "version": "1.0.0", + "description": "Mock for react-native-gesture-handler package", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "" +} diff --git a/modules/react-native-desktop-linking/desktop/CMakeLists.txt b/modules/react-native-desktop-linking/desktop/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/modules/react-native-desktop-menu/desktop/CMakeLists.txt b/modules/react-native-desktop-menu/desktop/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/modules/react-native-desktop-notification/desktop/CMakeLists.txt b/modules/react-native-desktop-notification/desktop/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/modules/react-native-desktop-shortcuts/desktop/CMakeLists.txt b/modules/react-native-desktop-shortcuts/desktop/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/modules/react-native-status/desktop/rctstatus.cpp b/modules/react-native-status/desktop/rctstatus.cpp index e873750b7f..11c7627ffe 100644 --- a/modules/react-native-status/desktop/rctstatus.cpp +++ b/modules/react-native-status/desktop/rctstatus.cpp @@ -12,14 +12,14 @@ #include "bridge.h" #include "eventdispatcher.h" -#include -#include -#include -#include #include -#include +#include #include +#include +#include #include +#include +#include #include #include "libstatus.h" @@ -29,471 +29,653 @@ extern QString getLogFilePath(); namespace { struct RegisterQMLMetaType { - RegisterQMLMetaType() { - qRegisterMetaType(); - } + RegisterQMLMetaType() { qRegisterMetaType(); } } registerMetaType; } // namespace class RCTStatusPrivate { public: - static Bridge* bridge; - static RCTStatus* rctStatus; + static Bridge *bridge; + static RCTStatus *rctStatus; }; -Bridge* RCTStatusPrivate::bridge = nullptr; -RCTStatus* RCTStatusPrivate::rctStatus = nullptr; +Bridge *RCTStatusPrivate::bridge = nullptr; +RCTStatus *RCTStatusPrivate::rctStatus = nullptr; Q_LOGGING_CATEGORY(RCTSTATUS, "RCTStatus") -RCTStatus::RCTStatus(QObject* parent) : QObject(parent), d_ptr(new RCTStatusPrivate) { - RCTStatusPrivate::rctStatus = this; - SetSignalEventCallback((void*)&RCTStatus::statusGoEventCallback); - connect(this, &RCTStatus::statusGoEvent, this, &RCTStatus::onStatusGoEvent); +RCTStatus::RCTStatus(QObject *parent) + : QObject(parent), d_ptr(new RCTStatusPrivate) { + RCTStatusPrivate::rctStatus = this; + SetSignalEventCallback((void *)&RCTStatus::statusGoEventCallback); + connect(this, &RCTStatus::statusGoEvent, this, &RCTStatus::onStatusGoEvent); } RCTStatus::~RCTStatus() {} -void RCTStatus::setBridge(Bridge* bridge) { - Q_D(RCTStatus); - d->bridge = bridge; +void RCTStatus::setBridge(Bridge *bridge) { + Q_D(RCTStatus); + d->bridge = bridge; } -QString RCTStatus::moduleName() { - return "Status"; +QString RCTStatus::moduleName() { return "Status"; } + +QList RCTStatus::methodsToExport() { + return QList{}; } -QList RCTStatus::methodsToExport() { - return QList{}; +QVariantMap RCTStatus::constantsToExport() { return QVariantMap(); } + +void RCTStatus::shouldMoveToInternalStorage(double callbackId) { + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::shouldMoveToInternalStorage call"; + + d->bridge->invokePromiseCallback(callbackId, QVariantList{QVariant()}); } -QVariantMap RCTStatus::constantsToExport() { - return QVariantMap(); +void RCTStatus::moveToInternalStorage(double callbackId) { + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::moveToInternalStorage call"; + + d->bridge->invokePromiseCallback(callbackId, QVariantList{QVariant()}); } QString RCTStatus::prepareDirAndUpdateConfig(QString configString) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::prepareDirAndUpdateConfig call - configString:" << configString; + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::prepareDirAndUpdateConfig call - configString:" + << configString; - QJsonParseError jsonError; - const QJsonDocument& jsonDoc = QJsonDocument::fromJson(configString.toUtf8(), &jsonError); - if (jsonError.error != QJsonParseError::NoError){ - qCWarning(RCTSTATUS) << jsonError.errorString(); - } + QJsonParseError jsonError; + const QJsonDocument &jsonDoc = + QJsonDocument::fromJson(configString.toUtf8(), &jsonError); + if (jsonError.error != QJsonParseError::NoError) { + qCWarning(RCTSTATUS) << jsonError.errorString(); + } - QVariantMap configJSON = jsonDoc.toVariant().toMap(); - QVariantMap shhextConfig = configJSON["ShhextConfig"].toMap(); - qCDebug(RCTSTATUS) << "::startNode configString: " << configJSON; + QVariantMap configJSON = jsonDoc.toVariant().toMap(); + QVariantMap shhextConfig = configJSON["ShhextConfig"].toMap(); + qCDebug(RCTSTATUS) << "::startNode configString: " << configJSON; - int networkId = configJSON["NetworkId"].toInt(); - QString relativeDataDirPath = configJSON["DataDir"].toString(); - if (!relativeDataDirPath.startsWith("/")) - relativeDataDirPath.prepend("/"); + int networkId = configJSON["NetworkId"].toInt(); + QString relativeDataDirPath = configJSON["DataDir"].toString(); + if (!relativeDataDirPath.startsWith("/")) + relativeDataDirPath.prepend("/"); - QString rootDirPath = getDataStoragePath(); - QDir rootDir(rootDirPath); - QString absDataDirPath = rootDirPath + relativeDataDirPath; - QDir dataDir(absDataDirPath); - if (!dataDir.exists()) { - dataDir.mkpath("."); - } + QString rootDirPath = getDataStoragePath(); + QDir rootDir(rootDirPath); + QString absDataDirPath = rootDirPath + relativeDataDirPath; + QDir dataDir(absDataDirPath); + if (!dataDir.exists()) { + dataDir.mkpath("."); + } - d_gethLogFilePath = dataDir.absoluteFilePath("geth.log"); - configJSON["DataDir"] = absDataDirPath; - configJSON["KeyStoreDir"] = rootDir.absoluteFilePath("keystore"); - configJSON["LogFile"] = d_gethLogFilePath; + d_gethLogFilePath = dataDir.absoluteFilePath("geth.log"); + configJSON["DataDir"] = absDataDirPath; + configJSON["KeyStoreDir"] = rootDir.absoluteFilePath("keystore"); + configJSON["LogFile"] = d_gethLogFilePath; - shhextConfig["BackupDisabledDataDir"] = rootDirPath; + shhextConfig["BackupDisabledDataDir"] = rootDirPath; - configJSON["ShhExtConfig"] = shhextConfig; + configJSON["ShhExtConfig"] = shhextConfig; - const QJsonDocument& updatedJsonDoc = QJsonDocument::fromVariant(configJSON); - qCInfo(RCTSTATUS) << "::startNode updated configString: " << updatedJsonDoc.toVariant().toMap(); - return QString(updatedJsonDoc.toJson(QJsonDocument::Compact)); + const QJsonDocument &updatedJsonDoc = QJsonDocument::fromVariant(configJSON); + qCInfo(RCTSTATUS) << "::startNode updated configString: " + << updatedJsonDoc.toVariant().toMap(); + return QString(updatedJsonDoc.toJson(QJsonDocument::Compact)); } -void RCTStatus::prepareDirAndUpdateConfig(QString configString, double callbackId) { - Q_D(RCTStatus); - qCInfo(RCTSTATUS) << "::prepareDirAndUpdateConfig call - callbackId:" << callbackId; - QtConcurrent::run([&](QString configString, double callbackId) { - QString updatedConfig = prepareDirAndUpdateConfig(configString); - d->bridge->invokePromiseCallback(callbackId, QVariantList{updatedConfig.toUtf8().data()}); - }, configString, callbackId); +void RCTStatus::prepareDirAndUpdateConfig(QString configString, + double callbackId) { + Q_D(RCTStatus); + qCInfo(RCTSTATUS) << "::prepareDirAndUpdateConfig call - callbackId:" + << callbackId; + QtConcurrent::run( + [&](QString configString, double callbackId) { + QString updatedConfig = prepareDirAndUpdateConfig(configString); + d->bridge->invokePromiseCallback( + callbackId, QVariantList{updatedConfig.toUtf8().data()}); + }, + configString, callbackId); } void RCTStatus::initKeystore() { - qCInfo(RCTSTATUS) << "::initKeystore call"; - QString rootDir = getDataStoragePath(); - const char* result = InitKeystore(rootDir.toUtf8().data()); - logStatusGoResult("::initKeystore InitKeystore", result); + qCInfo(RCTSTATUS) << "::initKeystore call"; + QString rootDir = getDataStoragePath(); + const char *result = InitKeystore(rootDir.toUtf8().data()); + logStatusGoResult("::initKeystore InitKeystore", result); } -void RCTStatus::sendDataNotification(QString dataPayloadJSON, QString tokensJSON, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::sendDataNotification call - callbackId:" << callbackId; - QtConcurrent::run([&](QString dataPayloadJSON, QString tokensJSON, double callbackId) { - const char* result = SendDataNotification(dataPayloadJSON.toUtf8().data(), tokensJSON.toUtf8().data()); - logStatusGoResult("::sendDataNotification SendDataNotification", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, dataPayloadJSON, tokensJSON, callbackId); +void RCTStatus::sendDataNotification(QString dataPayloadJSON, + QString tokensJSON, double callbackId) { + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::sendDataNotification call - callbackId:" + << callbackId; + QtConcurrent::run( + [&](QString dataPayloadJSON, QString tokensJSON, double callbackId) { + const char *result = SendDataNotification( + dataPayloadJSON.toUtf8().data(), tokensJSON.toUtf8().data()); + logStatusGoResult("::sendDataNotification SendDataNotification", + result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + dataPayloadJSON, tokensJSON, callbackId); } - #include +#include #include #include -#include #include -void showFileInGraphicalShell(QWidget *parent, const QFileInfo &fileInfo) -{ - // Mac, Windows support folder or file. +void showFileInGraphicalShell(QWidget *parent, const QFileInfo &fileInfo) { +// Mac, Windows support folder or file. #ifdef Q_OS_WIN - const QString explorer = QStandardPaths::findExecutable(QLatin1String("explorer.exe")); - if (explorer.isEmpty()) { - QMessageBox::warning(parent, - QApplication::translate("Core::Internal", - "Launching Windows Explorer Failed"), - QApplication::translate("Core::Internal", - "Could not find explorer.exe in path to launch Windows Explorer.")); - return; - } - QStringList param; - if (!fileInfo.isDir()) - param += QLatin1String("/select,"); - param += QDir::toNativeSeparators(fileInfo.canonicalFilePath()); - QProcess::startDetached(explorer, param); + const QString explorer = + QStandardPaths::findExecutable(QLatin1String("explorer.exe")); + if (explorer.isEmpty()) { + QMessageBox::warning( + parent, QApplication::translate("Core::Internal", + "Launching Windows Explorer Failed"), + QApplication::translate( + "Core::Internal", + "Could not find explorer.exe in path to launch Windows Explorer.")); + return; + } + QStringList param; + if (!fileInfo.isDir()) + param += QLatin1String("/select,"); + param += QDir::toNativeSeparators(fileInfo.canonicalFilePath()); + QProcess::startDetached(explorer, param); #elif defined(Q_OS_MAC) - QStringList scriptArgs; - scriptArgs << QLatin1String("-e") - << QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"") - .arg(fileInfo.canonicalFilePath()); - QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs); - scriptArgs.clear(); - scriptArgs << QLatin1String("-e") - << QLatin1String("tell application \"Finder\" to activate"); - QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs); + QStringList scriptArgs; + scriptArgs << QLatin1String("-e") + << QString::fromLatin1( + "tell application \"Finder\" to reveal POSIX file \"%1\"") + .arg(fileInfo.canonicalFilePath()); + QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs); + scriptArgs.clear(); + scriptArgs << QLatin1String("-e") + << QLatin1String("tell application \"Finder\" to activate"); + QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs); #else - // we cannot select a file here, because no file browser really supports it... - const QString folder = fileInfo.isDir() ? fileInfo.absoluteFilePath() : fileInfo.dir().absolutePath(); - QProcess browserProc; - browserProc.setProgram("xdg-open"); - browserProc.setArguments(QStringList(folder)); - bool success = browserProc.startDetached(); - const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError()); - success = success && error.isEmpty(); - if (!success) { - QMessageBox::warning(parent, "Launching Explorer Failed", error); - return; - } + // we cannot select a file here, because no file browser really supports it... + const QString folder = fileInfo.isDir() ? fileInfo.absoluteFilePath() + : fileInfo.dir().absolutePath(); + QProcess browserProc; + browserProc.setProgram("xdg-open"); + browserProc.setArguments(QStringList(folder)); + bool success = browserProc.startDetached(); + const QString error = + QString::fromLocal8Bit(browserProc.readAllStandardError()); + success = success && error.isEmpty(); + if (!success) { + QMessageBox::warning(parent, "Launching Explorer Failed", error); + return; + } #endif } void RCTStatus::sendLogs(QString dbJSON, QString jsLogs, double callbackId) { - Q_D(RCTStatus); + Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::sendLogs call - logFilePath:" << getLogFilePath() - << "d_gethLogFilePath:" << d_gethLogFilePath - << "dbJSON:" << dbJSON; + qCDebug(RCTSTATUS) << "::sendLogs call - logFilePath:" << getLogFilePath() + << "d_gethLogFilePath:" << d_gethLogFilePath + << "dbJSON:" << dbJSON; - QString tmpDirName("Status.im"); - QDir tmpDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); - if (!tmpDir.mkpath(tmpDirName)) { - qCWarning(RCTSTATUS) << "::sendLogs could not create temp dir:" << tmpDirName; - return; - } + QString tmpDirName("Status.im"); + QDir tmpDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + if (!tmpDir.mkpath(tmpDirName)) { + qCWarning(RCTSTATUS) << "::sendLogs could not create temp dir:" + << tmpDirName; + return; + } - // Check that at least 20MB are available for log generation - QStorageInfo storage(tmpDir); - if (storage.bytesAvailable() < 20 * 1024 * 1024) { - QMessageBox dlg; - dlg.warning(QApplication::activeWindow(), - "Error", QString("Insufficient storage space available in %1 for log generation. Please free up some space.").arg(storage.rootPath()), - QMessageBox::Close); - return; - } + // Check that at least 20MB are available for log generation + QStorageInfo storage(tmpDir); + if (storage.bytesAvailable() < 20 * 1024 * 1024) { + QMessageBox dlg; + dlg.warning(QApplication::activeWindow(), "Error", + QString("Insufficient storage space available in %1 for log " + "generation. Please free up some space.") + .arg(storage.rootPath()), + QMessageBox::Close); + return; + } - QFile zipFile(tmpDir.absoluteFilePath(tmpDirName + QDir::separator() + "Status-debug-logs.zip")); - QZipWriter zipWriter(&zipFile); - QFile gethLogFile(d_gethLogFilePath); - QFile logFile(getLogFilePath()); - zipWriter.addFile("db.json", dbJSON.toUtf8()); - zipWriter.addFile("js_logs.log", jsLogs.toUtf8()); - if (gethLogFile.exists()) { - zipWriter.addFile(QFileInfo(gethLogFile).fileName(), &gethLogFile); - } - if (logFile.exists()) { - zipWriter.addFile(QFileInfo(logFile).fileName(), &logFile); - } - zipWriter.close(); + QFile zipFile(tmpDir.absoluteFilePath(tmpDirName + QDir::separator() + + "Status-debug-logs.zip")); + QZipWriter zipWriter(&zipFile); + QFile gethLogFile(d_gethLogFilePath); + QFile logFile(getLogFilePath()); + zipWriter.addFile("db.json", dbJSON.toUtf8()); + zipWriter.addFile("js_logs.log", jsLogs.toUtf8()); + if (gethLogFile.exists()) { + zipWriter.addFile(QFileInfo(gethLogFile).fileName(), &gethLogFile); + } + if (logFile.exists()) { + zipWriter.addFile(QFileInfo(logFile).fileName(), &logFile); + } + zipWriter.close(); - showFileInGraphicalShell(QApplication::activeWindow(), QFileInfo(zipFile)); + showFileInGraphicalShell(QApplication::activeWindow(), QFileInfo(zipFile)); } +void RCTStatus::exportLogs(double callbackId) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](double callbackId) { + const char *result = ExportNodeLogs(); + logStatusGoResult("::exportLogs", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + callbackId); +} void RCTStatus::addPeer(QString enode, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::addPeer call - callbackId:" << callbackId; - QtConcurrent::run([&](QString enode, double callbackId) { - const char* result = AddPeer(enode.toUtf8().data()); - logStatusGoResult("::addPeer AddPeer", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, enode, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::addPeer call - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString enode, double callbackId) { + const char *result = AddPeer(enode.toUtf8().data()); + logStatusGoResult("::addPeer AddPeer", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + enode, callbackId); } -void RCTStatus::saveAccountAndLogin(QString accountData, QString password, QString config, QString subAccountsData) { +void RCTStatus::saveAccountAndLogin(QString accountData, QString password, + QString config, QString subAccountsData) { - Q_D(RCTStatus); - QString finalConfig = prepareDirAndUpdateConfig(config); - QtConcurrent::run([&](QString accountData, QString password, QString finalConfig, QString subAccountsData) { - const char* result = SaveAccountAndLogin(accountData.toUtf8().data(), password.toUtf8().data(), finalConfig.toUtf8().data(), subAccountsData.toUtf8().data()); + Q_D(RCTStatus); + QString finalConfig = prepareDirAndUpdateConfig(config); + QtConcurrent::run( + [&](QString accountData, QString password, QString finalConfig, + QString subAccountsData) { + const char *result = SaveAccountAndLogin( + accountData.toUtf8().data(), password.toUtf8().data(), + finalConfig.toUtf8().data(), subAccountsData.toUtf8().data()); logStatusGoResult("::saveAccountAndLogin", result); - }, accountData, password, finalConfig, subAccountsData); + }, + accountData, password, finalConfig, subAccountsData); } +// void RCTStatus::saveAccountAndLoginWithKeycard(QString accountData, +// QString password, QString +// config, +// QString chatKey) { +// Q_D(RCTStatus); +// QString finalConfig = prepareDirAndUpdateConfig(config); +// QtConcurrent::run( +// [&](QString accountData, QString password, QString finalConfig, +// QString chatKey) { +// const char *result = SaveAccountAndLoginWithKeycard( +// accountData.toUtf8().data(), password.toUtf8().data(), +// finalConfig.toUtf8().data(), chatKey.toUtf8().data()); +// logStatusGoResult("::saveAccountAndLoginWithKeycard", result); +// }, +// accountData, password, finalConfig, chatKey); +//} + void RCTStatus::login(QString accountData, QString password) { - Q_D(RCTStatus); - QtConcurrent::run([&](QString accountData, QString password) { - const char* result = Login(accountData.toUtf8().data(), password.toUtf8().data()); + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString accountData, QString password) { + const char *result = + Login(accountData.toUtf8().data(), password.toUtf8().data()); logStatusGoResult("::login", result); - }, accountData, password); - + }, + accountData, password); } -void RCTStatus::logout() { - Q_D(RCTStatus); - QtConcurrent::run([&]() { - const char* result = Logout(); - logStatusGoResult("::logout", result); - }); +// void RCTStatus::loginWithKeycard(QString accountData, QString password, +// QString chatKey) { +// +// Q_D(RCTStatus); +// QtConcurrent::run( +// [&](QString accountData, QString password, QString chatKey) { +// const char *result = +// LoginWithKeycard(accountData.toUtf8().data(), +// password.toUtf8().data(), +// chatKey.toUtf8().data()); +// logStatusGoResult("::loginWithKeycard", result); +// }, +// accountData, password, chatKey); +//} +void RCTStatus::logout() { + Q_D(RCTStatus); + QtConcurrent::run([&]() { + const char *result = Logout(); + logStatusGoResult("::logout", result); + }); } void RCTStatus::openAccounts(double callbackId) { - Q_D(RCTStatus); - QtConcurrent::run([&](double callbackId) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](double callbackId) { QString rootDir = getDataStoragePath(); - const char* result = OpenAccounts(rootDir.toUtf8().data()); + const char *result = OpenAccounts(rootDir.toUtf8().data()); logStatusGoResult("::openAccounts", result); d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, callbackId); - + }, + callbackId); } void RCTStatus::multiAccountStoreAccount(QString json, double callbackId) { - Q_D(RCTStatus); - QtConcurrent::run([&](QString json, double callbackId) { - const char* result = MultiAccountStoreAccount(json.toUtf8().data()); + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString json, double callbackId) { + const char *result = MultiAccountStoreAccount(json.toUtf8().data()); logStatusGoResult("::multiAccountStoreAccount", result); d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, json, callbackId); + }, + json, callbackId); } void RCTStatus::multiAccountLoadAccount(QString json, double callbackId) { - Q_D(RCTStatus); - QtConcurrent::run([&](QString json, double callbackId) { - const char* result = MultiAccountLoadAccount(json.toUtf8().data()); + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString json, double callbackId) { + const char *result = MultiAccountLoadAccount(json.toUtf8().data()); logStatusGoResult("::multiAccountLoadAccount", result); d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, json, callbackId); + }, + json, callbackId); } void RCTStatus::multiAccountReset(double callbackId) { - Q_D(RCTStatus); - QtConcurrent::run([&](double callbackId) { - const char* result = MultiAccountReset(); + Q_D(RCTStatus); + QtConcurrent::run( + [&](double callbackId) { + const char *result = MultiAccountReset(); logStatusGoResult("::multiAccountReset", result); d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, callbackId); + }, + callbackId); } void RCTStatus::multiAccountDeriveAddresses(QString json, double callbackId) { - Q_D(RCTStatus); - QtConcurrent::run([&](QString json, double callbackId) { - const char* result = MultiAccountDeriveAddresses(json.toUtf8().data()); + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString json, double callbackId) { + const char *result = MultiAccountDeriveAddresses(json.toUtf8().data()); logStatusGoResult("::multiAccountDeriveAddresses", result); d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, json, callbackId); + }, + json, callbackId); } +void RCTStatus::multiAccountStoreDerived(QString json, double callbackId) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString json, double callbackId) { + const char *result = + MultiAccountStoreDerivedAccounts(json.toUtf8().data()); + logStatusGoResult("::multiAccountStoreDerived", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + json, callbackId); +} + +void RCTStatus::multiAccountGenerateAndDeriveAddresses(QString json, + double callbackId) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString json, double callbackId) { + const char *result = + MultiAccountGenerateAndDeriveAddresses(json.toUtf8().data()); + logStatusGoResult("::multiAccountGenerateAndDeriveAddresses", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + json, callbackId); +} + +void RCTStatus::multiAccountImportMnemonic(QString json, double callbackId) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString json, double callbackId) { + const char *result = MultiAccountImportMnemonic(json.toUtf8().data()); + logStatusGoResult("::multiAccountImportMnemonic", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + json, callbackId); +} void RCTStatus::verify(QString address, QString password, double callbackId) { - Q_D(RCTStatus); - qCInfo(RCTSTATUS) << "::verify call - callbackId:" << callbackId; - QtConcurrent::run([&](QString address, QString password, double callbackId) { - QDir rootDir(getDataStoragePath()); - QString keystorePath = rootDir.absoluteFilePath("keystore"); - const char* result = VerifyAccountPassword(keystorePath.toUtf8().data(), address.toUtf8().data(), password.toUtf8().data()); - logStatusGoResult("::verify VerifyAccountPassword", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, address, password, callbackId); + Q_D(RCTStatus); + qCInfo(RCTSTATUS) << "::verify call - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString address, QString password, double callbackId) { + QDir rootDir(getDataStoragePath()); + QString keystorePath = rootDir.absoluteFilePath("keystore"); + const char *result = VerifyAccountPassword(keystorePath.toUtf8().data(), + address.toUtf8().data(), + password.toUtf8().data()); + logStatusGoResult("::verify VerifyAccountPassword", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + address, password, callbackId); } - - -void RCTStatus::sendTransaction(QString txArgsJSON, QString password, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::sendTransaction call - callbackId:" << callbackId; - QtConcurrent::run([&](QString txArgsJSON, QString password, double callbackId) { - const char* result = SendTransaction(txArgsJSON.toUtf8().data(), password.toUtf8().data()); - logStatusGoResult("::sendTransaction SendTransaction", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, txArgsJSON, password, callbackId); +void RCTStatus::sendTransaction(QString txArgsJSON, QString password, + double callbackId) { + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::sendTransaction call - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString txArgsJSON, QString password, double callbackId) { + const char *result = SendTransaction(txArgsJSON.toUtf8().data(), + password.toUtf8().data()); + logStatusGoResult("::sendTransaction SendTransaction", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + txArgsJSON, password, callbackId); } - void RCTStatus::signMessage(QString rpcParams, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::signMessage call - callbackId:" << callbackId; - QtConcurrent::run([&](QString rpcParams, double callbackId) { - const char* result = SignMessage(rpcParams.toUtf8().data()); - logStatusGoResult("::signMessage SignMessage", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, rpcParams, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::signMessage call - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString rpcParams, double callbackId) { + const char *result = SignMessage(rpcParams.toUtf8().data()); + logStatusGoResult("::signMessage SignMessage", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + rpcParams, callbackId); } +void RCTStatus::signTypedData(QString data, QString account, QString password, + double callbackId) { + + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::signMessage call - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString data, QString account, QString password, double callbackId) { + const char *result = + SignTypedData(data.toUtf8().data(), account.toUtf8().data(), + password.toUtf8().data()); + logStatusGoResult("::signTypedData signTypedData", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + data, account, password, callbackId); +} void RCTStatus::signGroupMembership(QString content, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::signGroupMembership - callbackId:" << callbackId; - QtConcurrent::run([&](QString content, double callbackId) { - const char* result = SignGroupMembership(content.toUtf8().data()); - logStatusGoResult("::signGroupMembership SignGroupMembership", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, content, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::signGroupMembership - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString content, double callbackId) { + const char *result = SignGroupMembership(content.toUtf8().data()); + logStatusGoResult("::signGroupMembership SignGroupMembership", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + content, callbackId); } -void RCTStatus::extractGroupMembershipSignatures(QString signatures, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::extractGroupMembershipSignatures - callbackId:" << callbackId; - QtConcurrent::run([&](QString signatures, double callbackId) { - const char* result = ExtractGroupMembershipSignatures(signatures.toUtf8().data()); - logStatusGoResult("::extractGroupMembershipSignatures ExtractGroupMembershipSignatures", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, signatures, callbackId); +void RCTStatus::extractGroupMembershipSignatures(QString signatures, + double callbackId) { + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::extractGroupMembershipSignatures - callbackId:" + << callbackId; + QtConcurrent::run( + [&](QString signatures, double callbackId) { + const char *result = + ExtractGroupMembershipSignatures(signatures.toUtf8().data()); + logStatusGoResult("::extractGroupMembershipSignatures " + "ExtractGroupMembershipSignatures", + result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + signatures, callbackId); } -void RCTStatus::setAdjustResize() { -} +void RCTStatus::setAdjustResize() {} +void RCTStatus::setAdjustPan() {} -void RCTStatus::setAdjustPan() { -} +void RCTStatus::setSoftInputMode(int i) {} +void RCTStatus::clearCookies() {} -void RCTStatus::setSoftInputMode(int i) { -} - - - -void RCTStatus::clearCookies() { -} - - -void RCTStatus::clearStorageAPIs() { -} - +void RCTStatus::clearStorageAPIs() {} void RCTStatus::callRPC(QString payload, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::callRPC call - payload:" << payload.left(128) << "callbackId:" << callbackId; - QtConcurrent::run([&](QString payload, double callbackId) { - const char* result = CallRPC(payload.toUtf8().data()); - logStatusGoResult("::callRPC CallRPC", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, payload, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::callRPC call - payload:" << payload.left(128) + << "callbackId:" << callbackId; + QtConcurrent::run( + [&](QString payload, double callbackId) { + const char *result = CallRPC(payload.toUtf8().data()); + logStatusGoResult("::callRPC CallRPC", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + payload, callbackId); } void RCTStatus::callPrivateRPC(QString payload, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::callPrivateRPC call - payload:" << payload.left(128) << "callbackId:" << callbackId; - QtConcurrent::run([&](QString payload, double callbackId) { - const char* result = CallPrivateRPC(payload.toUtf8().data()); - logStatusGoResult("::callPrivateRPC CallPrivateRPC", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, payload, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::callPrivateRPC call - payload:" << payload.left(128) + << "callbackId:" << callbackId; + QtConcurrent::run( + [&](QString payload, double callbackId) { + const char *result = CallPrivateRPC(payload.toUtf8().data()); + logStatusGoResult("::callPrivateRPC CallPrivateRPC", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + payload, callbackId); } -void RCTStatus::closeApplication() { +void RCTStatus::closeApplication() {} + +void RCTStatus::connectionChange(QString type, bool isExpensive) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString type, bool isExpensive) { + ConnectionChange(type.toUtf8().data(), isExpensive ? 1 : 0); + qCWarning(RCTSTATUS) << "::connectionChange"; + }, + type, isExpensive); +} + +void RCTStatus::appStateChange(QString type) { + Q_D(RCTStatus); + QtConcurrent::run( + [&](QString type) { + AppStateChange(type.toUtf8().data()); + qCWarning(RCTSTATUS) << "::appStateChange"; + }, + type); } bool RCTStatus::JSCEnabled() { - qCDebug(RCTSTATUS) << "::JSCEnabled call"; - return false; + qCDebug(RCTSTATUS) << "::JSCEnabled call"; + return false; } -void RCTStatus::statusGoEventCallback(const char* event) { - qCDebug(RCTSTATUS) << "::statusGoEventCallback call - event: " << event; - RCTStatusPrivate::rctStatus->emitStatusGoEvent(event); +void RCTStatus::statusGoEventCallback(const char *event) { + qCDebug(RCTSTATUS) << "::statusGoEventCallback call - event: " << event; + RCTStatusPrivate::rctStatus->emitStatusGoEvent(event); } void RCTStatus::emitStatusGoEvent(QString event) { - qCDebug(RCTSTATUS) << "::emitStatusGoEvent call - event: " << event; - Q_EMIT statusGoEvent(event); + qCDebug(RCTSTATUS) << "::emitStatusGoEvent call - event: " << event; + Q_EMIT statusGoEvent(event); } void RCTStatus::onStatusGoEvent(QString event) { - qCDebug(RCTSTATUS) << "::onStatusGoEvent call - event: " << event.toUtf8().data(); - RCTStatusPrivate::bridge->eventDispatcher()->sendDeviceEvent("gethEvent", QVariantMap{{"jsonEvent", event.toUtf8().data()}}); + qCDebug(RCTSTATUS) << "::onStatusGoEvent call - event: " + << event.toUtf8().data(); + RCTStatusPrivate::bridge->eventDispatcher()->sendDeviceEvent( + "gethEvent", QVariantMap{{"jsonEvent", event.toUtf8().data()}}); } -void RCTStatus::logStatusGoResult(const char* methodName, const char* result) -{ - QJsonParseError jsonError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(QString(result).toUtf8(), &jsonError); - if (jsonError.error != QJsonParseError::NoError) { - qCWarning(RCTSTATUS) << qUtf8Printable(jsonError.errorString()); - return; - } +void RCTStatus::logStatusGoResult(const char *methodName, const char *result) { + QJsonParseError jsonError; + QJsonDocument jsonDoc = + QJsonDocument::fromJson(QString(result).toUtf8(), &jsonError); + if (jsonError.error != QJsonParseError::NoError) { + qCWarning(RCTSTATUS) << qUtf8Printable(jsonError.errorString()); + return; + } - QString error = jsonDoc.toVariant().toMap().value("error").toString(); - if (error.isEmpty()) { - qCDebug(RCTSTATUS) << methodName << "succeeded"; - } else { - qCWarning(RCTSTATUS) << methodName << "- error:" << qUtf8Printable(error); - } + QString error = jsonDoc.toVariant().toMap().value("error").toString(); + if (error.isEmpty()) { + qCDebug(RCTSTATUS) << methodName << "succeeded"; + } else { + qCWarning(RCTSTATUS) << methodName << "- error:" << qUtf8Printable(error); + } } void RCTStatus::updateMailservers(QString enodes, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::updateMailservers call - callbackId:" << callbackId; - QtConcurrent::run([&](QString enodes, double callbackId) { - const char* result = UpdateMailservers(enodes.toUtf8().data()); - logStatusGoResult("::updateMailservers UpdateMailservers", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, enodes, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::updateMailservers call - callbackId:" << callbackId; + QtConcurrent::run( + [&](QString enodes, double callbackId) { + const char *result = UpdateMailservers(enodes.toUtf8().data()); + logStatusGoResult("::updateMailservers UpdateMailservers", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + enodes, callbackId); } -void RCTStatus::getNodesFromContract(QString url, QString address, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::getNodesFromContract call - callbackId:" << callbackId; - QtConcurrent::run([&](QString url, QString address, double callbackId) { - const char* result = GetNodesFromContract(url.toUtf8().data(), address.toUtf8().data()); - logStatusGoResult("::getNodesFromContract GetNodesFromContract", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, url, address, callbackId); +void RCTStatus::getNodesFromContract(QString url, QString address, + double callbackId) { + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::getNodesFromContract call - callbackId:" + << callbackId; + QtConcurrent::run( + [&](QString url, QString address, double callbackId) { + const char *result = + GetNodesFromContract(url.toUtf8().data(), address.toUtf8().data()); + logStatusGoResult("::getNodesFromContract GetNodesFromContract", + result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + url, address, callbackId); } void RCTStatus::chaosModeUpdate(bool on, double callbackId) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::chaosModeUpdate call - callbackId:" << callbackId; - QtConcurrent::run([&](bool on, double callbackId) { - const char* result = ChaosModeUpdate(on); - logStatusGoResult("::chaosModeUpdate ChaosModeUpdate", result); - d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); - }, on, callbackId); + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::chaosModeUpdate call - callbackId:" << callbackId; + QtConcurrent::run( + [&](bool on, double callbackId) { + const char *result = ChaosModeUpdate(on); + logStatusGoResult("::chaosModeUpdate ChaosModeUpdate", result); + d->bridge->invokePromiseCallback(callbackId, QVariantList{result}); + }, + on, callbackId); } QString RCTStatus::generateAlias(QString publicKey) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::generateAlias call"; - //return GenerateGfycat(publicKey.toUtf8().data()); - return "test"; + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::generateAlias call"; + // return GenerateGfycat(publicKey.toUtf8().data()); + return "test"; } QString RCTStatus::identicon(QString publicKey) { - Q_D(RCTStatus); - qCDebug(RCTSTATUS) << "::identicon call"; - //return Identicon(publicKey.toUtf8().data()); - return "test"; + Q_D(RCTStatus); + qCDebug(RCTSTATUS) << "::identicon call"; + // return Identicon(publicKey.toUtf8().data()); + return "test"; } diff --git a/modules/react-native-status/desktop/rctstatus.h b/modules/react-native-status/desktop/rctstatus.h index a69cbe30ec..3095389aeb 100644 --- a/modules/react-native-status/desktop/rctstatus.h +++ b/modules/react-native-status/desktop/rctstatus.h @@ -20,73 +20,97 @@ Q_DECLARE_LOGGING_CATEGORY(RCTSTATUS) class RCTStatusPrivate; class RCTStatus : public QObject, public ModuleInterface { - Q_OBJECT - Q_INTERFACES(ModuleInterface) + Q_OBJECT + Q_INTERFACES(ModuleInterface) - Q_DECLARE_PRIVATE(RCTStatus) + Q_DECLARE_PRIVATE(RCTStatus) public: - Q_INVOKABLE RCTStatus(QObject* parent = 0); - ~RCTStatus(); + Q_INVOKABLE RCTStatus(QObject *parent = 0); + ~RCTStatus(); - void setBridge(Bridge* bridge) override; + void setBridge(Bridge *bridge) override; - QString moduleName() override; - QList methodsToExport() override; - QVariantMap constantsToExport() override; + QString moduleName() override; + QList methodsToExport() override; + QVariantMap constantsToExport() override; - Q_INVOKABLE void initKeystore(); - Q_INVOKABLE void sendDataNotification(QString dataPayloadJSON, QString tokensJSON, double callbackId); - Q_INVOKABLE void sendLogs(QString dbJSON, QString jsLogs, double callbackId); - Q_INVOKABLE void addPeer(QString enode, double callbackId); - Q_INVOKABLE void prepareDirAndUpdateConfig(QString configString, double callbackId); - Q_INVOKABLE void login(QString accountData, QString password); - Q_INVOKABLE void saveAccountAndLogin(QString accountData, QString password, QString config, QString subAccountsData); - Q_INVOKABLE void logout(); - Q_INVOKABLE void openAccounts(double callbackId); - Q_INVOKABLE void multiAccountStoreAccount(QString json, double callbackId); - Q_INVOKABLE void multiAccountLoadAccount(QString json, double callbackId); - Q_INVOKABLE void multiAccountReset(double callbackId); - Q_INVOKABLE void multiAccountDeriveAddresses(QString json, double callbackId); - Q_INVOKABLE void verify(QString address, QString password, double callbackId); - Q_INVOKABLE void sendTransaction(QString txArgsJSON, QString password, double callbackId); - Q_INVOKABLE void signMessage(QString rpcParams, double callbackId); - Q_INVOKABLE void signGroupMembership(QString content, double callbackId); - Q_INVOKABLE void extractGroupMembershipSignatures(QString signatures, double callbackId); - Q_INVOKABLE void updateMailservers(QString enodes, double callbackId); - Q_INVOKABLE void getNodesFromContract(QString url, QString address, double callbackId); - Q_INVOKABLE void chaosModeUpdate(bool on, double callbackId); + Q_INVOKABLE void shouldMoveToInternalStorage(double callbackId); + Q_INVOKABLE void moveToInternalStorage(double callbackId); + Q_INVOKABLE void initKeystore(); + Q_INVOKABLE void sendDataNotification(QString dataPayloadJSON, + QString tokensJSON, double callbackId); + Q_INVOKABLE void sendLogs(QString dbJSON, QString jsLogs, double callbackId); + Q_INVOKABLE void exportLogs(double callbackId); + Q_INVOKABLE void addPeer(QString enode, double callbackId); + Q_INVOKABLE void prepareDirAndUpdateConfig(QString configString, + double callbackId); + Q_INVOKABLE void login(QString accountData, QString password); + // Q_INVOKABLE void loginWithKeycard(QString accountData, QString password, + // QString chatKey); + Q_INVOKABLE void saveAccountAndLogin(QString accountData, QString password, + QString config, QString subAccountsData); + // Q_INVOKABLE void saveAccountAndLoginWithKeycard(QString accountData, + // QString password, + // QString config, + // QString chatKey); + Q_INVOKABLE void logout(); + Q_INVOKABLE void openAccounts(double callbackId); + Q_INVOKABLE void multiAccountStoreAccount(QString json, double callbackId); + Q_INVOKABLE void multiAccountLoadAccount(QString json, double callbackId); + Q_INVOKABLE void multiAccountReset(double callbackId); + Q_INVOKABLE void multiAccountDeriveAddresses(QString json, double callbackId); + Q_INVOKABLE void multiAccountImportMnemonic(QString json, double callbackId); + Q_INVOKABLE void multiAccountStoreDerived(QString json, double callbackId); + Q_INVOKABLE void multiAccountGenerateAndDeriveAddresses(QString json, + double callbackId); + Q_INVOKABLE void verify(QString address, QString password, double callbackId); + Q_INVOKABLE void sendTransaction(QString txArgsJSON, QString password, + double callbackId); + Q_INVOKABLE void signMessage(QString rpcParams, double callbackId); + Q_INVOKABLE void signTypedData(QString data, QString account, + QString password, double callbackId); - Q_INVOKABLE void setAdjustResize(); - Q_INVOKABLE void setAdjustPan(); - Q_INVOKABLE void setSoftInputMode(int i); + Q_INVOKABLE void signGroupMembership(QString content, double callbackId); + Q_INVOKABLE void extractGroupMembershipSignatures(QString signatures, + double callbackId); + Q_INVOKABLE void updateMailservers(QString enodes, double callbackId); + Q_INVOKABLE void getNodesFromContract(QString url, QString address, + double callbackId); + Q_INVOKABLE void chaosModeUpdate(bool on, double callbackId); - Q_INVOKABLE void clearCookies(); - Q_INVOKABLE void clearStorageAPIs(); - Q_INVOKABLE void callRPC(QString payload, double callbackId); - Q_INVOKABLE void callPrivateRPC(QString payload, double callbackId); - Q_INVOKABLE void closeApplication(); + Q_INVOKABLE void setAdjustResize(); + Q_INVOKABLE void setAdjustPan(); + Q_INVOKABLE void setSoftInputMode(int i); - Q_INVOKABLE static bool JSCEnabled(); - Q_INVOKABLE static void statusGoEventCallback(const char* event); + Q_INVOKABLE void clearCookies(); + Q_INVOKABLE void clearStorageAPIs(); + Q_INVOKABLE void callRPC(QString payload, double callbackId); + Q_INVOKABLE void callPrivateRPC(QString payload, double callbackId); + Q_INVOKABLE void closeApplication(); + Q_INVOKABLE void connectionChange(QString type, bool isExpensive); + Q_INVOKABLE void appStateChange(QString type); - Q_INVOKABLE QString identicon(QString publicKey); - Q_INVOKABLE QString generateAlias(QString publicKey); + Q_INVOKABLE static bool JSCEnabled(); + Q_INVOKABLE static void statusGoEventCallback(const char *event); - void emitStatusGoEvent(QString event); + Q_INVOKABLE QString identicon(QString publicKey); + Q_INVOKABLE QString generateAlias(QString publicKey); + + void emitStatusGoEvent(QString event); Q_SIGNALS: - void statusGoEvent(QString event); + void statusGoEvent(QString event); private Q_SLOTS: - void onStatusGoEvent(QString event); + void onStatusGoEvent(QString event); private: - void logStatusGoResult(const char* methodName, const char* result); + void logStatusGoResult(const char *methodName, const char *result); - QString prepareDirAndUpdateConfig(QString configString); - QScopedPointer d_ptr; - QString d_gethLogFilePath; + QString prepareDirAndUpdateConfig(QString configString); + QScopedPointer d_ptr; + QString d_gethLogFilePath; }; #endif // RCTSTATUS_H diff --git a/nix/desktop/base-image/default.nix b/nix/desktop/base-image/default.nix new file mode 100644 index 0000000000..031f6ff8a3 --- /dev/null +++ b/nix/desktop/base-image/default.nix @@ -0,0 +1,58 @@ +{ stdenv, fetchurl, unzip }: + +let + defaultPackageSource = { + version = "20190923"; + hostSystem = "x86_64-linux"; + }; + packageSources = { + "linux" = defaultPackageSource // { + sha256 = "1l2rmqc2mxlz4qp5pnl1763pzqh6y3aawxrd9336q5w35xgrgmcm"; + }; + "macos" = defaultPackageSource // { + sha256 = "1j73l7xry0xw922zxhbsai1391a4i15rni1pfszr3cis8v95n21v"; + hostSystem = "x86_64-darwin"; + }; + "windows" = defaultPackageSource // { + sha256 = "0sb1nqwy2ap7lr1vrk497fqrjhv7c470pm0kmrvwn4nas4gm40g5"; + }; + }; + packageFactory = target-os: + let packageSource = packageSources."${target-os}"; + in stdenv.mkDerivation rec { + inherit (packageSource) version; + pname = "status-im-${target-os}-desktop-files"; + + src = assert stdenv.lib.asserts.assertMsg + (stdenv.hostPlatform.system == packageSource.hostSystem) + "${pname} is not supported on ${stdenv.hostPlatform.system}"; + fetchurl { + inherit (packageSource) sha256; + url = "https://desktop-app-files.ams3.digitaloceanspaces.com/status-im-desktop-files-${target-os}-${packageSource.version}.zip"; + }; + + nativeBuildInputs = [ unzip ]; + + phases = [ "unpackPhase" ]; + unpackPhase = '' + mkdir -p $out/src + unzip $src -d $out/src + ''; + + meta = with stdenv.lib; { + description = "A base image for Status Desktop release distributions"; + homepage = https://desktop-app-files.ams3.digitaloceanspaces.com/; + license = licenses.gpl3; + maintainers = [ maintainers.pombeirp ]; + platforms = platforms.linux ++ platforms.darwin; + }; + }; + +in target-os: + let package = (packageFactory target-os); + in package // { + shellHook = '' + ${package.shellHook or ""} + export STATUSREACT_${stdenv.lib.toUpper target-os}_BASEIMAGE_PATH="${package}/src" + ''; +} diff --git a/nix/desktop/default.nix b/nix/desktop/default.nix index ac6b7cffaa..738eea440e 100644 --- a/nix/desktop/default.nix +++ b/nix/desktop/default.nix @@ -6,9 +6,10 @@ let inherit (stdenv.lib) catAttrs concatStrings optional unique; platform = callPackage ../platform.nix { inherit target-os; }; - linuxPlatform = callPackage ./linux { inherit status-go; }; - darwinPlatform = callPackage ./macos { inherit status-go darwin; }; - windowsPlatform = callPackage ./windows { inherit go; }; + baseImageFactory = callPackage ./base-image { inherit stdenv; }; + linuxPlatform = callPackage ./linux { inherit stdenv status-go baseImageFactory; }; + darwinPlatform = callPackage ./macos { inherit stdenv status-go darwin baseImageFactory; }; + windowsPlatform = callPackage ./windows { inherit stdenv go baseImageFactory; }; snoreNotifySources = callPackage ./cmake/snorenotify { }; qtkeychainSources = callPackage ./cmake/qtkeychain { }; selectedSources = diff --git a/nix/desktop/linux/base-image/default.nix b/nix/desktop/linux/base-image/default.nix deleted file mode 100644 index 82acc68ec3..0000000000 --- a/nix/desktop/linux/base-image/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ stdenv, fetchurl, unzip }: - -let - package = stdenv.mkDerivation rec { - name = "StatusImAppImage"; - version = "20190515"; - - src = - if stdenv.hostPlatform.system == "x86_64-linux" then - fetchurl { - url = "https://desktop-app-files.ams3.digitaloceanspaces.com/${name}_${version}.zip"; - sha256 = "0g7qa97cr0f9807sfd3khxiqz575i9kxi6lfda350ilaw8lnnfv2"; - } - else throw "${name} is not supported on ${stdenv.hostPlatform.system}"; - - nativeBuildInputs = [ unzip ]; - - phases = [ "unpackPhase" ]; - unpackPhase = '' - mkdir -p $out/src - unzip $src -d $out/src - ''; - - meta = with stdenv.lib; { - description = "A base image for Linux Status Desktop release distributions"; - homepage = https://desktop-app-files.ams3.digitaloceanspaces.com/; - license = licenses.gpl3; - maintainers = [ maintainers.pombeirp ]; - platforms = platforms.linux; - }; - }; - -in package // { - shellHook = (package.shellHook or "") + '' - export STATUSREACT_LINUX_BASEIMAGE_PATH="${package}/src" - ''; -} diff --git a/nix/desktop/linux/default.nix b/nix/desktop/linux/default.nix index eb2ee898c0..a08479650c 100644 --- a/nix/desktop/linux/default.nix +++ b/nix/desktop/linux/default.nix @@ -1,5 +1,5 @@ { stdenv, callPackage, - appimagekit, patchelf, qt5, status-go }: + appimagekit, patchelf, qt5, status-go, baseImageFactory }: with stdenv; @@ -7,7 +7,7 @@ assert isLinux; let inherit (lib) concatStrings catAttrs; - baseImage = callPackage ./base-image { }; + baseImage = baseImageFactory "linux"; appimagekit = callPackage ./appimagekit { }; linuxdeployqt = callPackage ./linuxdeployqt { inherit appimagekit; }; @@ -16,7 +16,6 @@ in { appimagekit linuxdeployqt patchelf - baseImage qt5.full ] ++ status-go.buildInputs; diff --git a/nix/desktop/macos/base-image/default.nix b/nix/desktop/macos/base-image/default.nix deleted file mode 100644 index bc87b46e33..0000000000 --- a/nix/desktop/macos/base-image/default.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ stdenv, fetchurl, unzip }: - -let - package = stdenv.mkDerivation rec { - pname = "StatusImAppBundle"; - version = "20190515"; - - src = - if stdenv.hostPlatform.system == "x86_64-darwin" then - fetchurl { - url = "https://desktop-app-files.ams3.digitaloceanspaces.com/Status_${version}.app.zip"; - sha256 = "1255jgdp0apqh7qfp752nww91iq39x5mm7rf0wazq2vjahfr4pc5"; - } - else throw "${pname} is not supported on ${stdenv.hostPlatform.system}"; - - nativeBuildInputs = [ unzip ]; - - phases = [ "unpackPhase" ]; - unpackPhase = '' - mkdir -p $out/src - unzip $src -d $out/src - ''; - - meta = with stdenv.lib; { - description = "A base image for macOS Status Desktop release distributions"; - homepage = https://desktop-app-files.ams3.digitaloceanspaces.com/; - license = licenses.gpl3; - maintainers = [ maintainers.pombeirp ]; - platforms = platforms.darwin; - }; - }; - -in package // { - shellHook = (package.shellHook or "") + '' - export STATUSREACT_MACOS_BASEIMAGE_PATH="${package}/src" - ''; -} diff --git a/nix/desktop/macos/default.nix b/nix/desktop/macos/default.nix index 55d005d794..8d21cc8fbe 100644 --- a/nix/desktop/macos/default.nix +++ b/nix/desktop/macos/default.nix @@ -1,5 +1,5 @@ { stdenv, callPackage, - darwin, qt5, status-go }: + darwin, qt5, status-go, baseImageFactory }: with darwin.apple_sdk.frameworks; @@ -7,7 +7,7 @@ assert stdenv.isDarwin; let inherit (stdenv.lib) concatStrings catAttrs; - baseImage = callPackage ./base-image { }; + baseImage = baseImageFactory "macos"; in { buildInputs = [ diff --git a/nix/desktop/windows/base-image/default.nix b/nix/desktop/windows/base-image/default.nix deleted file mode 100644 index 59ef0c6884..0000000000 --- a/nix/desktop/windows/base-image/default.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ stdenv, fetchurl, unzip }: - -assert stdenv.isLinux; - -let - package = stdenv.mkDerivation rec { - pname = "StatusIm-Windows-base-image"; - version = "20190515"; - - src = - if stdenv.hostPlatform.system == "x86_64-linux" then - fetchurl { - url = "https://desktop-app-files.ams3.digitaloceanspaces.com/${pname}_${version}.zip"; - sha256 = "0wkq0khllms2hnbznb1j8l8yfw6z7phzrdg4ndyik20jkl0faj8f"; - } - else throw "${pname} is not supported on ${stdenv.hostPlatform.system}"; - - nativeBuildInputs = [ unzip ]; - - phases = [ "unpackPhase" ]; - unpackPhase = '' - mkdir -p $out/src - unzip $src -d $out/src - ''; - - meta = with stdenv.lib; { - description = "A base image for Windows Status Desktop release distributions"; - homepage = https://desktop-app-files.ams3.digitaloceanspaces.com/; - license = licenses.gpl3; - maintainers = [ maintainers.pombeirp ]; - platforms = platforms.linux; - }; - }; - -in package // { - shellHook = (package.shellHook or "") + '' - export STATUSREACT_WINDOWS_BASEIMAGE_PATH="${package}/src" - ''; -} diff --git a/nix/desktop/windows/default.nix b/nix/desktop/windows/default.nix index d31251717b..3df41b5d56 100644 --- a/nix/desktop/windows/default.nix +++ b/nix/desktop/windows/default.nix @@ -1,10 +1,10 @@ { stdenv, callPackage, - conan, nsis, go }: + conan, nsis, go, baseImageFactory }: assert stdenv.isLinux; let - baseImage = callPackage ./base-image { }; + baseImage = baseImageFactory "windows"; in { buildInputs = stdenv.lib.optionals stdenv.isLinux [ diff --git a/nix/mobile/android/maven-and-npm-deps/default.nix b/nix/mobile/android/maven-and-npm-deps/default.nix index 85ff29676e..313c727bb1 100644 --- a/nix/mobile/android/maven-and-npm-deps/default.nix +++ b/nix/mobile/android/maven-and-npm-deps/default.nix @@ -43,7 +43,7 @@ let ]; dirsToExclude = [ ".git" ".svn" "CVS" ".hg" ".gradle" "build" "intermediates" "libs" "obj" ]; filesToInclude = [ ".babelrc" ]; - filesToExclude = [ "android/gradlew" ]; + filesToExclude = [ "VERSION" "android/gradlew" ]; root = path; }; }; diff --git a/react-native/src/desktop/status_im/react_native/js_dependencies.cljs b/react-native/src/desktop/status_im/react_native/js_dependencies.cljs index 02ba7e88e3..817bd2fdfa 100644 --- a/react-native/src/desktop/status_im/react_native/js_dependencies.cljs +++ b/react-native/src/desktop/status_im/react_native/js_dependencies.cljs @@ -18,10 +18,10 @@ (def desktop-shortcuts (js/require "react-native-desktop-shortcuts")) (def react-native-firebase #js {}) (def touchid #js {}) -(def camera #js {:default #js {:constants {:Aspect "Portrait"}}}) +(def camera #js {:RNCamera #js {:constants #js {:Aspect "Portrait"}}}) (def status-keycard #js {:default #js {}}) (def dialogs #js {}) -(def dismiss-keyboard #js {}) +(def dismiss-keyboard #()) (def image-crop-picker #js {}) (def image-resizer #js {}) (def svg #js {}) @@ -29,6 +29,7 @@ (def snoopy-filter #js {}) (def snoopy-bars #js {}) (def snoopy-buffer #js {}) +(def react-native-screens #js {}) (def background-timer #js {:setTimeout (fn [cb ms] (js/setTimeout cb ms))}) (def react-navigation (js/require "react-navigation")) (def react-native-navigation-twopane (js/require "react-native-navigation-twopane")) diff --git a/scripts/build-desktop.sh b/scripts/build-desktop.sh index d8c6e904bb..175185d958 100755 --- a/scripts/build-desktop.sh +++ b/scripts/build-desktop.sh @@ -122,6 +122,7 @@ function compile() { local EXTERNAL_MODULES_DIR="$(jq -r '.desktopExternalModules | @tsv | @text' "$jsPackagePath" | tr '\t' ';')" local DESKTOP_FONTS="$(jq -r '.desktopFonts | @tsv | @text' "$jsPackagePath" | tr '\t' ';')" + local DESKTOP_IMAGES="$(jq -r '.desktopImages | @tsv | @text' "$jsPackagePath" | tr '\t' ';')" pushd desktop rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile modules reportApp/CMakeFiles desktop/node_modules/google-breakpad/CMakeFiles desktop/node_modules/react-native-keychain/desktop/qtkeychain-prefix/src/qtkeychain-build/CMakeFiles desktop/node_modules/react-native-keychain/desktop/qtkeychain if is_windows_target; then @@ -142,6 +143,7 @@ function compile() { -DCMAKE_BUILD_TYPE=Release \ -DEXTERNAL_MODULES_DIR="$EXTERNAL_MODULES_DIR" \ -DDESKTOP_FONTS="$DESKTOP_FONTS" \ + -DDESKTOP_IMAGES="$DESKTOP_IMAGES" \ -DJS_BUNDLE_PATH="$JS_BUNDLE_PATH" || exit 1 make -S -j5 || exit 1 popd @@ -322,7 +324,7 @@ if is_macos; then local exeDir="$contentsDir/MacOS" [ $VERBOSE_LEVEL -ge 1 ] && echo "Checking rpaths in ${dylib}" - + # Walk through the dependencies of $dylib local dependencies=$(otool -L "$dylib" | grep -E "\s+/nix/" | sed "s|@executable_path|$exeDir|" | awk -F "(" '{print $1}' | xargs) local moduleDirPath=$(dirname $dylib) @@ -399,7 +401,7 @@ function bundleMacOS() { local usrBinPath=$(joinExistingPath "$WORKFOLDER" "$contentsPath/MacOS") cp -r assets/share/assets $contentsPath/Resources - ln -sf ../Resources/assets ../Resources/ubuntu-server ../Resources/node_modules $usrBinPath + ln -sf ../Resources/assets ../Resources/ubuntu-server $usrBinPath chmod +x $contentsPath/Resources/ubuntu-server cp ../desktop/bin/Status $usrBinPath/Status cp ../desktop/bin/reportApp $usrBinPath diff --git a/src/status_im/ui/components/camera.cljs b/src/status_im/ui/components/camera.cljs index d718f9ac3d..7eb7c5ac5c 100644 --- a/src/status_im/ui/components/camera.cljs +++ b/src/status_im/ui/components/camera.cljs @@ -2,18 +2,21 @@ (:require [goog.object :as object] [reagent.core :as reagent] [clojure.walk :as walk] - [status-im.react-native.js-dependencies :as js-dependencies])) + [status-im.react-native.js-dependencies :as js-dependencies] + [status-im.utils.platform :as platform])) (def default-camera (-> js-dependencies/camera (object/get "RNCamera"))) (defn- constants [t] - (-> default-camera - (object/get "Constants") - (object/get t) - (js->clj) - (walk/keywordize-keys))) + (if platform/desktop? + nil + (-> default-camera + (object/get "Constants") + (object/get t) + (js->clj) + (walk/keywordize-keys)))) (def aspects (constants "Orientation")) (def capture-targets (constants "CaptureTarget")) diff --git a/src/status_im/ui/components/icons/vector_icons.cljs b/src/status_im/ui/components/icons/vector_icons.cljs index 53465a23fc..02e958f3ad 100644 --- a/src/status_im/ui/components/icons/vector_icons.cljs +++ b/src/status_im/ui/components/icons/vector_icons.cljs @@ -1,6 +1,8 @@ (ns status-im.ui.components.icons.vector-icons (:require [status-im.ui.components.react :as react] - [status-im.ui.components.colors :as colors]) + [status-im.ui.components.colors :as colors] + [status-im.utils.platform :as platform] + [clojure.string :as string]) (:refer-clojure :exclude [use])) (defn- match-color [color] @@ -19,6 +21,11 @@ :else colors/black)) +(defn icon-source [name] + (if platform/desktop? + {:uri (keyword (string/replace (clojure.core/name name) "-" "_"))} + {:uri (keyword (clojure.core/name name))})) + (defn icon ([name] (icon name nil)) ([name {:keys [color resize-mode container-style @@ -31,15 +38,15 @@ {:width (or width 24) :height (or height 24)}) :accessibility-label accessibility-label} - [react/image {:source {:uri (keyword (clojure.core/name name))} - :style (cond-> {:width (or width 24) + [react/image {:style (cond-> {:width (or width 24) :height (or height 24)} resize-mode (assoc :resize-mode resize-mode) color - (assoc :tint-color (match-color color)))}]])) + (assoc :tint-color (match-color color))) + :source (icon-source name)}]])) (defn tiny-icon ([name] (tiny-icon name {})) diff --git a/src/status_im/ui/components/tabbar/core.cljs b/src/status_im/ui/components/tabbar/core.cljs index 92c915a881..705c802037 100644 --- a/src/status_im/ui/components/tabbar/core.cljs +++ b/src/status_im/ui/components/tabbar/core.cljs @@ -69,9 +69,10 @@ (when (pos? (if count @count 0)) [react/view tabs.styles/counter [components.common/counter @count]])] - [react/view {:style tabs.styles/tab-title-container} - [react/text {:style (tabs.styles/new-tab-title active?)} - label]]]])) + (when-not platform/desktop? + [react/view {:style tabs.styles/tab-title-container} + [react/text {:style (tabs.styles/new-tab-title active?)} + label]])]])) (defn tabs [current-view-id] [react/view @@ -132,11 +133,18 @@ (when-not (contains? #{:enter-pin-login :enter-pin-sign :enter-pin-settings} view-id) - (if platform/ios? - [tabs-animation-wrapper-ios - [react/animated-view - {:style (tabs.styles/animated-container visible? keyboard-shown?)} - [tabs tab]]] + (case platform/os + "ios" [tabs-animation-wrapper-ios + [react/animated-view + {:style (tabs.styles/animated-container visible? keyboard-shown?)} + [tabs tab]]] + "android" [tabs-animation-wrapper-android + keyboard-shown? + view-id + [react/animated-view + {:style (tabs.styles/animated-container visible? keyboard-shown?)} + [tabs tab]]] + "desktop" [tabs-animation-wrapper-android keyboard-shown? view-id diff --git a/src/status_im/ui/components/tabbar/styles.cljs b/src/status_im/ui/components/tabbar/styles.cljs index ed75e94c10..91fc40cfcd 100644 --- a/src/status_im/ui/components/tabbar/styles.cljs +++ b/src/status_im/ui/components/tabbar/styles.cljs @@ -8,7 +8,7 @@ (cond platform/android? 52 platform/ios? 52 - platform/desktop? 68)) + platform/desktop? 36)) (def minimized-tabs-height 36) @@ -83,6 +83,11 @@ {:height tabs-height :align-self :stretch :ios {:background-color :white + :shadow-radius 4 + :shadow-offset {:width 0 :height -5} + :shadow-opacity 0.3 + :shadow-color "rgba(0, 9, 26, 0.12)"} + :desktop {:background-color :white :shadow-radius 4 :shadow-offset {:width 0 :height -5} :shadow-opacity 0.3 diff --git a/src/status_im/ui/screens/chat/input/input.cljs b/src/status_im/ui/screens/chat/input/input.cljs index 2df3d2be56..fce608a892 100644 --- a/src/status_im/ui/screens/chat/input/input.cljs +++ b/src/status_im/ui/screens/chat/input/input.cljs @@ -89,7 +89,6 @@ :auto-capitalize :sentences} (when cooldown-enabled? {:placeholder (i18n/label :cooldown/text-input-disabled)}))])) -;) (defview invisible-input [{:keys [set-layout-width-fn value]}] (letsubs [{:keys [input-text]} [:chats/current-chat]] diff --git a/src/status_im/ui/screens/chat/styles/main.cljs b/src/status_im/ui/screens/chat/styles/main.cljs index db38ff34fc..0574078efd 100644 --- a/src/status_im/ui/screens/chat/styles/main.cljs +++ b/src/status_im/ui/screens/chat/styles/main.cljs @@ -273,6 +273,9 @@ {:color colors/blue :margin-bottom 40}) +(def select-chat + {:color colors/gray}) + (def messages-list-vertical-padding 46) (def are-you-friends-bubble diff --git a/src/status_im/ui/screens/chat/views.cljs b/src/status_im/ui/screens/chat/views.cljs index 3ab8d46a9e..373455165e 100644 --- a/src/status_im/ui/screens/chat/views.cljs +++ b/src/status_im/ui/screens/chat/views.cljs @@ -449,6 +449,6 @@ [chat-root true]) (defview select-chat [] - [react/view {:style {:align-items :center :justify-content :center :flex 1}} - [react/text {:style style/decline-chat} + [react/view {:align-items :center :justify-content :center :flex 1} + [react/text style/select-chat (i18n/label :t/select-chat)]]) diff --git a/src/status_im/ui/screens/desktop/main/chat/views.cljs b/src/status_im/ui/screens/desktop/main/chat/views.cljs index 74ab123201..94be32f7d4 100644 --- a/src/status_im/ui/screens/desktop/main/chat/views.cljs +++ b/src/status_im/ui/screens/desktop/main/chat/views.cljs @@ -66,10 +66,10 @@ (views/defview message-author-name [{:keys [from]}] (views/letsubs [{:keys [username]} [:contacts/contact-name-by-identity from]] [react/view {:flex-direction :row} - (when incoming-name - [react/text {:style styles/author} incoming-name]) + (when username + [react/text {:style styles/author} username]) [react/text {:style styles/author-generated} - (str (when incoming-name " • ") (gfycat/generate-gfy from))]])) + (str (when username " • ") (gfycat/generate-gfy from))]])) (views/defview member-photo [from] (views/letsubs [current-public-key [:multiaccount/public-key] diff --git a/src/status_im/ui/screens/home/styles.cljs b/src/status_im/ui/screens/home/styles.cljs index d9cbcdb5d4..01e4e3c9f8 100644 --- a/src/status_im/ui/screens/home/styles.cljs +++ b/src/status_im/ui/screens/home/styles.cljs @@ -14,11 +14,12 @@ (def last-message-container {:flex-shrink 1}) -(def last-message-text +(styles/def last-message-text {:flex 1 :align-self :stretch :line-height 22 - :color colors/gray}) + :color colors/gray + :desktop {:max-height 20}}) (def search-input-height 56) diff --git a/src/status_im/ui/screens/home/views.cljs b/src/status_im/ui/screens/home/views.cljs index f7f81ad4fb..dc9573cf4d 100644 --- a/src/status_im/ui/screens/home/views.cljs +++ b/src/status_im/ui/screens/home/views.cljs @@ -133,7 +133,7 @@ (when platform/ios? {:margin-bottom tabs.styles/tabs-diff}) (when two-pane-ui-enabled? - {:border-right-width 1 :border-right-color colors/black-transparent})) + {:border-right-width 1 :border-right-color colors/gray-lighter})) [status-bar/status-bar {:type :main}] [react/keyboard-avoiding-view {:style {:flex 1} :on-layout (fn [e]