Merge branch 'development' of https://github.com/ecency/ecency-mobile into development

This commit is contained in:
noumantahir 2023-10-10 12:23:06 +05:00
commit 20333425c7
25 changed files with 1490 additions and 141 deletions

View File

@ -14,6 +14,8 @@
0516471224D2C513005DE9C5 /* eshare.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0516470824D2C513005DE9C5 /* eshare.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
053EA30026B2B9920082FEB9 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053EA2FF26B2B9920082FEB9 /* File.swift */; };
053EA30326B2BA150082FEB9 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053EA30226B2BA150082FEB9 /* File.swift */; };
057A51A42AD4962300E9A768 /* NotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 057A51A32AD4962300E9A768 /* NotificationService.m */; };
057A51A82AD4962300E9A768 /* ImageNotifi.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 057A51A02AD4962300E9A768 /* ImageNotifi.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
05B6C49224C306CE00B7FA60 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
05B6C49424C306CE00B7FA60 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58190B3B23294814000EA0E1 /* StoreKit.framework */; };
05B6C49724C306CE00B7FA60 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
@ -30,6 +32,7 @@
58F9BCC624793C61004F0790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 58F9BCC224793C61004F0790 /* GoogleService-Info.plist */; };
58F9BCC724793C61004F0790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 58F9BCC224793C61004F0790 /* GoogleService-Info.plist */; };
58F9BCC824793C61004F0790 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 58F9BCC224793C61004F0790 /* GoogleService-Info.plist */; };
5F7A94E248006221381F7D50 /* libPods-Ecency-ImageNotifi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00F37CDCAC8340FCA11DB6F4 /* libPods-Ecency-ImageNotifi.a */; };
7C8D083700274C80BADEB3D6 /* Sansation_Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F1D77AE9F7B24CF19834052B /* Sansation_Bold.ttf */; };
872EB06D13C728B5C4C733E4 /* libPods-Ecency.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A897E6535C5B45DDED43406D /* libPods-Ecency.a */; };
89D99F65314A416290F8D921 /* Roboto.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 64F2A611E6EF486C8D3FB82C /* Roboto.ttf */; };
@ -45,6 +48,13 @@
remoteGlobalIDString = 0516470724D2C513005DE9C5;
remoteInfo = eshare;
};
057A51A62AD4962300E9A768 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 057A519F2AD4962300E9A768;
remoteInfo = ImageNotifi;
};
2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
@ -76,6 +86,7 @@
dstSubfolderSpec = 13;
files = (
0516471224D2C513005DE9C5 /* eshare.appex in Embed App Extensions */,
057A51A82AD4962300E9A768 /* ImageNotifi.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
@ -88,6 +99,7 @@
00E356EE1AD99517003FC87E /* EcencyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EcencyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
00E356F21AD99517003FC87E /* EcencyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EcencyTests.m; sourceTree = "<group>"; };
00F37CDCAC8340FCA11DB6F4 /* libPods-Ecency-ImageNotifi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Ecency-ImageNotifi.a"; sourceTree = BUILT_PRODUCTS_DIR; };
0516470824D2C513005DE9C5 /* eshare.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = eshare.appex; sourceTree = BUILT_PRODUCTS_DIR; };
0516470A24D2C513005DE9C5 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; };
0516470D24D2C513005DE9C5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = "<group>"; };
@ -96,6 +108,10 @@
053EA2FF26B2B9920082FEB9 /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = "<group>"; };
053EA30126B2BA140082FEB9 /* EcencyTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "EcencyTests-Bridging-Header.h"; sourceTree = "<group>"; };
053EA30226B2BA150082FEB9 /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = "<group>"; };
057A51A02AD4962300E9A768 /* ImageNotifi.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ImageNotifi.appex; sourceTree = BUILT_PRODUCTS_DIR; };
057A51A22AD4962300E9A768 /* NotificationService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationService.h; sourceTree = "<group>"; };
057A51A32AD4962300E9A768 /* NotificationService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationService.m; sourceTree = "<group>"; };
057A51A52AD4962300E9A768 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
05A14D162518B03000EB7509 /* Ecency-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Ecency-Bridging-Header.h"; sourceTree = "<group>"; };
05B6C4B724C306CE00B7FA60 /* Ecency.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ecency.app; sourceTree = BUILT_PRODUCTS_DIR; };
06844A5429119F05002FCC34 /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = Ecency/BootSplash.storyboard; sourceTree = "<group>"; };
@ -118,6 +134,7 @@
34E88D888DD444F8B285363C /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = "<group>"; };
420ABF9795564845A0963C27 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = "<group>"; };
4EB466C53BAE4EDC904357B3 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = "<group>"; };
557F629CF9A41CBDA5C9B081 /* Pods-Ecency-ImageNotifi.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ecency-ImageNotifi.release.xcconfig"; path = "Target Support Files/Pods-Ecency-ImageNotifi/Pods-Ecency-ImageNotifi.release.xcconfig"; sourceTree = "<group>"; };
5795D1B1C55E46FF96CC4AED /* RobotoMono-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "RobotoMono-Regular.ttf"; path = "../src/assets/fonts/RobotoMono-Regular.ttf"; sourceTree = "<group>"; };
58190B3B23294814000EA0E1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
58190B3D23294823000EA0E1 /* Ecency.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Ecency.entitlements; path = Ecency/Ecency.entitlements; sourceTree = "<group>"; };
@ -128,6 +145,7 @@
58F6300F2350580B0017C953 /* libRealmJS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libRealmJS.a; sourceTree = BUILT_PRODUCTS_DIR; };
58F9BCC224793C61004F0790 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
5ADE4B4B75DF437495E202D4 /* Sansation_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Sansation_Regular.ttf; path = ../src/assets/fonts/Sansation_Regular.ttf; sourceTree = "<group>"; };
637FA180975081FC81437804 /* Pods-Ecency-ImageNotifi.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Ecency-ImageNotifi.debug.xcconfig"; path = "Target Support Files/Pods-Ecency-ImageNotifi/Pods-Ecency-ImageNotifi.debug.xcconfig"; sourceTree = "<group>"; };
64F2A611E6EF486C8D3FB82C /* Roboto.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Roboto.ttf; path = ../src/assets/fonts/Roboto.ttf; sourceTree = "<group>"; };
65F56948860941D6BA55779F /* rubicon-icon-font.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "rubicon-icon-font.ttf"; path = "../src/assets/fonts/rubicon-icon-font.ttf"; sourceTree = "<group>"; };
6D935B44FB5A4CF3BF4D01DF /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = "<group>"; };
@ -163,6 +181,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
057A519D2AD4962300E9A768 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5F7A94E248006221381F7D50 /* libPods-Ecency-ImageNotifi.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
05B6C49324C306CE00B7FA60 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@ -220,6 +246,16 @@
path = eshare;
sourceTree = "<group>";
};
057A51A12AD4962300E9A768 /* ImageNotifi */ = {
isa = PBXGroup;
children = (
057A51A22AD4962300E9A768 /* NotificationService.h */,
057A51A32AD4962300E9A768 /* NotificationService.m */,
057A51A52AD4962300E9A768 /* Info.plist */,
);
path = ImageNotifi;
sourceTree = "<group>";
};
13B07FAE1A68108700A75B9A /* Ecency */ = {
isa = PBXGroup;
children = (
@ -246,6 +282,8 @@
25630E9BE79833145F3E34B9 /* Pods-Ecency.release.xcconfig */,
7246575DADCA4488EC9D462A /* Pods-Ecency-EcencyTests.debug.xcconfig */,
17B14A55DE011F4183CA4FA1 /* Pods-Ecency-EcencyTests.release.xcconfig */,
637FA180975081FC81437804 /* Pods-Ecency-ImageNotifi.debug.xcconfig */,
557F629CF9A41CBDA5C9B081 /* Pods-Ecency-ImageNotifi.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@ -261,6 +299,7 @@
ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
A897E6535C5B45DDED43406D /* libPods-Ecency.a */,
2AEEE72F26D37DC0AC8A99C2 /* libPods-Ecency-EcencyTests.a */,
00F37CDCAC8340FCA11DB6F4 /* libPods-Ecency-ImageNotifi.a */,
);
name = Frameworks;
sourceTree = "<group>";
@ -297,8 +336,8 @@
588A5065232A497100FC1361 /* Products */ = {
isa = PBXGroup;
children = (
588A506A232A497100FC1361 /* libReactNativeConfig.a */,
588A506C232A497100FC1361 /* libReactNativeConfig-tvOS.a */,
588A506A232A497100FC1361 /* libRNCConfig.a */,
588A506C232A497100FC1361 /* libRNCConfig-tvOS.a */,
);
name = Products;
sourceTree = "<group>";
@ -327,6 +366,7 @@
832341AE1AAA6A7D00B99B32 /* Libraries */,
00E356EF1AD99517003FC87E /* EcencyTests */,
0516470924D2C513005DE9C5 /* eshare */,
057A51A12AD4962300E9A768 /* ImageNotifi */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
258E34A3BDFFFBF80D598187 /* Pods */,
@ -346,6 +386,7 @@
2D02E4901E0B4A5D006451C7 /* Ecency-tvOSTests.xctest */,
05B6C4B724C306CE00B7FA60 /* Ecency.app */,
0516470824D2C513005DE9C5 /* eshare.appex */,
057A51A02AD4962300E9A768 /* ImageNotifi.appex */,
);
name = Products;
sourceTree = "<group>";
@ -390,6 +431,25 @@
productReference = 0516470824D2C513005DE9C5 /* eshare.appex */;
productType = "com.apple.product-type.app-extension";
};
057A519F2AD4962300E9A768 /* ImageNotifi */ = {
isa = PBXNativeTarget;
buildConfigurationList = 057A51A92AD4962400E9A768 /* Build configuration list for PBXNativeTarget "ImageNotifi" */;
buildPhases = (
1C81C8F285F08986579878AD /* [CP] Check Pods Manifest.lock */,
057A519C2AD4962300E9A768 /* Sources */,
057A519D2AD4962300E9A768 /* Frameworks */,
057A519E2AD4962300E9A768 /* Resources */,
8ED85028D513D87F748AB30C /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = ImageNotifi;
productName = ImageNotifi;
productReference = 057A51A02AD4962300E9A768 /* ImageNotifi.appex */;
productType = "com.apple.product-type.app-extension";
};
05B6C48C24C306CE00B7FA60 /* Ecency */ = {
isa = PBXNativeTarget;
buildConfigurationList = 05B6C4B424C306CE00B7FA60 /* Build configuration list for PBXNativeTarget "Ecency" */;
@ -411,6 +471,7 @@
);
dependencies = (
0516471124D2C513005DE9C5 /* PBXTargetDependency */,
057A51A72AD4962300E9A768 /* PBXTargetDependency */,
);
name = Ecency;
productName = Ecency;
@ -460,8 +521,8 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
DefaultBuildSystemTypeForWorkspace = Original;
LastSwiftUpdateCheck = 1160;
DefaultBuildSystemTypeForWorkspace = Latest;
LastSwiftUpdateCheck = 1430;
LastUpgradeCheck = 1230;
ORGANIZATIONNAME = "";
TargetAttributes = {
@ -476,6 +537,9 @@
DevelopmentTeam = 75B6RXTKGT;
ProvisioningStyle = Manual;
};
057A519F2AD4962300E9A768 = {
CreatedOnToolsVersion = 14.3.1;
};
05B6C48C24C306CE00B7FA60 = {
DevelopmentTeam = 75B6RXTKGT;
LastSwiftMigration = 1160;
@ -517,21 +581,24 @@
2D02E47A1E0B4A5D006451C7 /* Ecency-tvOS */,
2D02E48F1E0B4A5D006451C7 /* Ecency-tvOSTests */,
0516470724D2C513005DE9C5 /* eshare */,
057A519F2AD4962300E9A768 /* ImageNotifi */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
588A506A232A497100FC1361 /* libReactNativeConfig.a */ = {
588A506A232A497100FC1361 /* libRNCConfig.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
name = libRNCConfig.a;
path = libReactNativeConfig.a;
remoteRef = 588A5069232A497100FC1361 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
588A506C232A497100FC1361 /* libReactNativeConfig-tvOS.a */ = {
588A506C232A497100FC1361 /* libRNCConfig-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
name = "libRNCConfig-tvOS.a";
path = "libReactNativeConfig-tvOS.a";
remoteRef = 588A506B232A497100FC1361 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
@ -555,6 +622,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
057A519E2AD4962300E9A768 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
05B6C49624C306CE00B7FA60 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -696,6 +770,28 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Ecency/Pods-Ecency-resources.sh\"\n";
showEnvVarsInLog = 0;
};
1C81C8F285F08986579878AD /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Ecency-ImageNotifi-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
2C87F1D159FEC7C0B7E3D88E /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -770,6 +866,60 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
8ED85028D513D87F748AB30C /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Ecency-ImageNotifi/Pods-Ecency-ImageNotifi-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Ecency-ImageNotifi/Pods-Ecency-ImageNotifi-resources.sh\"\n";
showEnvVarsInLog = 0;
};
971975A45C595703A4946EE4 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -922,6 +1072,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
057A519C2AD4962300E9A768 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
057A51A42AD4962300E9A768 /* NotificationService.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
05B6C48F24C306CE00B7FA60 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -956,6 +1114,11 @@
target = 0516470724D2C513005DE9C5 /* eshare */;
targetProxy = 0516471024D2C513005DE9C5 /* PBXContainerItemProxy */;
};
057A51A72AD4962300E9A768 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 057A519F2AD4962300E9A768 /* ImageNotifi */;
targetProxy = 057A51A62AD4962300E9A768 /* PBXContainerItemProxy */;
};
2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 2D02E47A1E0B4A5D006451C7 /* Ecency-tvOS */;
@ -1119,6 +1282,83 @@
};
name = Release;
};
057A51AA2AD4962400E9A768 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 637FA180975081FC81437804 /* Pods-Ecency-ImageNotifi.debug.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 75B6RXTKGT;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ImageNotifi/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ImageNotifi;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = app.esteem.mobile.ios.ImageNotifi;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
057A51AB2AD4962400E9A768 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 557F629CF9A41CBDA5C9B081 /* Pods-Ecency-ImageNotifi.release.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 75B6RXTKGT;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ImageNotifi/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ImageNotifi;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = app.esteem.mobile.ios.ImageNotifi;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
05B6C4B524C306CE00B7FA60 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = AEF4CD0A8BA6A1EC68545063 /* Pods-Ecency.debug.xcconfig */;
@ -1536,6 +1776,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
057A51A92AD4962400E9A768 /* Build configuration list for PBXNativeTarget "ImageNotifi" */ = {
isa = XCConfigurationList;
buildConfigurations = (
057A51AA2AD4962400E9A768 /* Debug */,
057A51AB2AD4962400E9A768 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
05B6C4B424C306CE00B7FA60 /* Build configuration list for PBXNativeTarget "Ecency" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@ -13,6 +13,7 @@
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.ecency.eshare</string>
<string>group.com.ecency.notifi</string>
</array>
</dict>
</plist>

View File

@ -7,6 +7,7 @@
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.ecency.eshare</string>
<string>group.com.ecency.notifi</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.service</string>
<key>NSExtensionPrincipalClass</key>
<string>NotificationService</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,12 @@
//
// NotificationService.h
// ImageNotifi
//
// Created by Feruz Muradov on 2023-10-09.
//
#import <UserNotifications/UserNotifications.h>
@interface NotificationService : UNNotificationServiceExtension
@end

View File

@ -0,0 +1,34 @@
//
// NotificationService.m
// ImageNotifi
//
// Created by Feruz Muradov on 2023-10-09.
//
#import "NotificationService.h"
#import "FirebaseMessaging.h"
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here...
[[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent withContentHandler:contentHandler];
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
@end

View File

@ -38,6 +38,10 @@ target 'Ecency' do
# Pods for testing
end
target 'ImageNotifi' do
inherit! :complete
end
# Convert all permission pods into static libraries
pre_install do |installer|
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}

View File

@ -595,6 +595,8 @@ PODS:
- Firebase/Messaging (= 8.15.0)
- React-Core
- RNFBApp
- RNFlashList (1.6.1):
- React-Core
- RNGestureHandler (2.9.0):
- React-Core
- RNIap (12.8.2):
@ -764,6 +766,7 @@ DEPENDENCIES:
- "RNFBApp (from `../node_modules/@react-native-firebase/app`)"
- "RNFBDynamicLinks (from `../node_modules/@react-native-firebase/dynamic-links`)"
- "RNFBMessaging (from `../node_modules/@react-native-firebase/messaging`)"
- "RNFlashList (from `../node_modules/@shopify/flash-list`)"
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
- RNIap (from `../node_modules/react-native-iap`)
- RNImageCropPicker (from `../node_modules/react-native-image-crop-picker`)
@ -957,6 +960,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/@react-native-firebase/dynamic-links"
RNFBMessaging:
:path: "../node_modules/@react-native-firebase/messaging"
RNFlashList:
:path: "../node_modules/@shopify/flash-list"
RNGestureHandler:
:path: "../node_modules/react-native-gesture-handler"
RNIap:
@ -1084,6 +1089,7 @@ SPEC CHECKSUMS:
RNFBApp: e4439717c23252458da2b41b81b4b475c86f90c4
RNFBDynamicLinks: 538840f6e3f58511f857d15df1bc25ed655dc283
RNFBMessaging: 40dac204b4197a2661dec5be964780c6ec39bf65
RNFlashList: 236646d48f224a034f35baa0242e1b77db063b1e
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
RNIap: 90997da52f9ab2f42bf80e2bcec11e96c9fba2e3
RNImageCropPicker: 14fe1c29298fb4018f3186f455c475ab107da332
@ -1103,6 +1109,6 @@ SPEC CHECKSUMS:
Yoga: 92d086bb705a41cc588599b51db726ba7b1d341c
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
PODFILE CHECKSUM: 88d8c7dd2ade9033785999cb2cc59fe10485fc64
PODFILE CHECKSUM: dc3c4fda8abe00a19e8a83cff9a73a20bdaa5b4a
COCOAPODS: 1.11.3

View File

@ -58,6 +58,7 @@
"@react-navigation/native-stack": "^6.7.0",
"@react-navigation/stack": "^6.2.2",
"@reduxjs/toolkit": "^1.8.6",
"@shopify/flash-list": "^1.6.1",
"@tanstack/query-async-storage-persister": "^4.3.9",
"@tanstack/react-query": "^4.3.9",
"@tanstack/react-query-persist-client": "^4.3.9",

View File

@ -0,0 +1,28 @@
diff --git a/node_modules/react-native-fast-image/ios/FastImage/FFFastImageView.m b/node_modules/react-native-fast-image/ios/FastImage/FFFastImageView.m
index f710081..fe20770 100644
--- a/node_modules/react-native-fast-image/ios/FastImage/FFFastImageView.m
+++ b/node_modules/react-native-fast-image/ios/FastImage/FFFastImageView.m
@@ -73,12 +73,17 @@ - (void) setImageColor: (UIColor*)imageColor {
- (UIImage*) makeImage: (UIImage*)image withTint: (UIColor*)color {
UIImage* newImage = [image imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate];
- UIGraphicsBeginImageContextWithOptions(image.size, NO, newImage.scale);
- [color set];
- [newImage drawInRect: CGRectMake(0, 0, image.size.width, newImage.size.height)];
- newImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return newImage;
+
+ UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat defaultFormat];
+ UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:image.size format:format];
+
+ UIImage *resultImage = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
+ CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
+ [color set];
+ [newImage drawInRect:rect];
+ }];
+
+ return resultImage;
}
- (void) setImage: (UIImage*)image {

View File

@ -1,5 +1,6 @@
import React, { useState, Fragment, useRef } from 'react';
import { FlatList, Text } from 'react-native';
import { Text } from 'react-native';
import { FlashList } from '@shopify/flash-list';
import get from 'lodash/get';
import { useIntl } from 'react-intl';
@ -133,7 +134,6 @@ const CommentsView = ({
isLoggedIn={isLoggedIn}
showAllComments={showAllComments}
isShowSubComments={isShowSubComments}
key={get(item, 'permlink')}
marginLeft={marginLeft}
handleOnLongPress={() => _openCommentMenu(item)}
openReplyThread={() => _openReplyThread(item)}
@ -168,18 +168,18 @@ const CommentsView = ({
return (
<Fragment>
<FlatList
style={{ ...styles.list, ...styleOerride }}
contentContainerStyle={{ padding: 0 }}
<FlashList
contentContainerStyle={{ padding: 0, ...styles.list, ...styleOerride, }}
data={comments}
renderItem={_renderItem}
keyExtractor={(item) => item.author + item.permlink}
renderItem={_renderItem}
ListEmptyComponent={_renderEmptyContent()}
ListHeaderComponent={postContentView}
overScrollMode="never"
onEndReachedThreshold={1}
maxToRenderPerBatch={7}
initialNumToRender={5}
estimatedItemSize={100}
windowSize={10}
{...flatListProps}
/>

View File

@ -22,7 +22,6 @@ export const CommentsSection = ({ item, index, revealReplies, ...props }) => {
return (
<Animated.View key={item.author + item.permlink} entering={_enteringAnim}>
<Comment
key={item.author + item.permlink}
comment={item}
repliesToggle={toggle}
handleOnToggleReplies={() => setToggle(!toggle)}

View File

@ -10,7 +10,8 @@ import React, {
import { ActivityIndicator, Platform, Text } from 'react-native';
import { useIntl } from 'react-intl';
import { useNavigation } from '@react-navigation/native';
import { FlatList, RefreshControl } from 'react-native-gesture-handler';
import { RefreshControl } from 'react-native-gesture-handler';
import { FlashList } from '@shopify/flash-list';
// Components
import { postBodySummary } from '@ecency/render-helper';
@ -63,7 +64,7 @@ const PostComments = forwardRef(
const writeCommentRef = useRef(null);
const postInteractionRef = useRef<typeof PostHtmlInteractionHandler|null>(null);
const commentsListRef = useRef<FlatList | null>(null);
const commentsListRef = useRef<FlashList<any> | null>(null);
const [selectedFilter, setSelectedFilter] = useState('trending');
const [selectedOptionIndex, setSelectedOptionIndex] = useState(0);
@ -309,20 +310,17 @@ const PostComments = forwardRef(
return (
<Fragment>
<FlatList
<FlashList
ref={commentsListRef}
style={styles.list}
keyExtractor={(item) => `${item.author}/${item.permlink}`}
contentContainerStyle={styles.listContent}
ListHeaderComponent={_postContentView}
ListEmptyComponent={_renderEmptyContent}
data={isPostLoading ? [] : sortedSections}
onContentSizeChange={_onContentSizeChange}
estimatedItemSize={104}
renderItem={_renderItem}
keyExtractor={(item) => `${item.author}/${item.permlink}`}
initialNumToRender={6}
maxToRenderPerBatch={6}
updateCellsBatchingPeriod={100}
windowSize={13}
refreshControl={
<RefreshControl
refreshing={refreshing}

View File

@ -33,9 +33,9 @@ const PostDisplayContainer = ({
const dispatch = useAppDispatch();
const navigation = useNavigation();
const currentAccount = useAppSelector(state => state.account.currentAccount);
const isLoggedIn = useAppSelector(state => state.application.isLoggedIn);
const pinCode = useAppSelector(state => state.application.pin);
const currentAccount = useAppSelector((state) => state.account.currentAccount);
const isLoggedIn = useAppSelector((state) => state.application.isLoggedIn);
const pinCode = useAppSelector((state) => state.application.pin);
const [activeVotes, setActiveVotes] = useState([]);
const [activeVotesCount, setActiveVotesCount] = useState(0);
@ -45,8 +45,9 @@ const PostDisplayContainer = ({
if (post) {
console.log('Gettting reblogs inside postDisplayContainer');
const votes = get(post, 'active_votes', []);
const activeVotesCount = get(post, 'stats.total_votes', 0);
setActiveVotes(votes);
setActiveVotesCount(votes.length);
setActiveVotesCount(activeVotesCount);
getPostReblogs(post).then((result) => {
setReblogs(result || []);
});
@ -124,15 +125,12 @@ const PostDisplayContainer = ({
});
};
const _fetchPost = async () => {
if (post) {
fetchPost(post.author, post.permlink);
}
};
return (
<PostDisplayView
author={author}
@ -153,10 +151,8 @@ const PostDisplayContainer = ({
handleOnReplyPress={_handleOnReplyPress}
handleOnVotersPress={_handleOnVotersPress}
handleOnReblogsPress={_handleOnReblogsPress}
/>
);
};
export default PostDisplayContainer;

View File

@ -13,8 +13,8 @@ import {
RefreshControl,
ActivityIndicator,
View,
Alert,
} from 'react-native';
import { FlashList } from '@shopify/flash-list';
import { useSelector } from 'react-redux';
import { useNavigation } from '@react-navigation/native';
import { useIntl } from 'react-intl';
@ -267,7 +267,7 @@ const postsListContainer = (
return (
<Fragment>
<FlatList
<FlashList
ref={flatListRef}
data={cacheInjectedData}
showsVerticalScrollIndicator={false}
@ -276,6 +276,7 @@ const postsListContainer = (
onEndReachedThreshold={1}
maxToRenderPerBatch={5}
initialNumToRender={3}
estimatedItemSize={609}
windowSize={8}
extraData={[imageRatios, reblogsCollectionRef.current, votesCache]}
onEndReached={_onEndReached}

View File

@ -16,10 +16,10 @@ import {
import { deepLinkParser } from '../../utils/deepLinkParser';
import RootNavigation from '../../navigation/rootNavigation';
import getWindowDimensions from '../../utils/getWindowDimensions';
import { isHiveUri } from '../../utils/hive-uri';
import { handleHiveUriOperation } from '../../providers/hive/dhive';
import { isHiveUri, getFormattedTx } from '../../utils/hive-uri';
import { handleHiveUriOperation, resolveTransaction } from '../../providers/hive/dhive';
import bugsnagInstance from '../../config/bugsnag';
import { get, isArray } from 'lodash';
import { get } from 'lodash';
import showLoginAlert from '../../utils/showLoginAlert';
import authType from '../../constants/authType';
import { delay } from '../../utils/editor';
@ -156,55 +156,70 @@ export const QRModal = ({}: QRModalProps) => {
}
const parsed = hiveuri.decode(uri);
// resolve the decoded tx and params to a signable tx
let { tx, signer } = hiveuri.resolveTransaction(parsed.tx, parsed.params, {
signers: currentAccount.name,
preferred_signer: currentAccount.name,
});
const operations = get(tx, 'operations', []);
if (!_checkOpsArray(operations)) {
Alert.alert(
intl.formatMessage({
id: 'qr.multi_array_ops_alert',
}),
intl.formatMessage({
id: 'qr.multi_array_ops_aler_desct',
}),
);
return;
}
dispatch(
showActionModal({
title: intl.formatMessage({
id: 'qr.confirmTransaction',
}),
bodyContent: _checkOpsArray(operations) ? _renderActionModalBody(operations[0]) : null,
buttons: [
{
text: intl.formatMessage({
id: 'qr.cancel',
const authoritiesMap = new Map();
authoritiesMap.set('active', currentAccount?.local?.activeKey ? true : false);
authoritiesMap.set('posting', currentAccount?.local?.postingKey ? true : false);
authoritiesMap.set('owner', currentAccount?.local?.ownerKey ? true : false);
authoritiesMap.set('memo', currentAccount?.local?.memoKey ? true : false);
getFormattedTx(parsed.tx, authoritiesMap)
.then(async (formattedTx) => {
// resolve the decoded tx and params to a signable tx
const tx = await resolveTransaction(formattedTx.tx, parsed.params, currentAccount.name);
const ops = get(tx, 'operations', []);
const op = ops[0];
dispatch(
showActionModal({
title: intl.formatMessage({
id: 'qr.confirmTransaction',
}),
onPress: () => {},
style: 'cancel',
},
{
text: intl.formatMessage({
id: 'qr.approve',
}),
onPress: () => {
handleHiveUriOperation(currentAccount, pinCode, uri)
.then(() => {
dispatch(toastNotification(intl.formatMessage({ id: 'alert.successful' })));
})
.catch((err) => {
bugsnagInstance.notify(err);
dispatch(toastNotification(intl.formatMessage({ id: 'alert.key_warning' })));
});
bodyContent: _renderActionModalBody(op, formattedTx.opName),
buttons: [
{
text: intl.formatMessage({
id: 'qr.cancel',
}),
onPress: () => {},
style: 'cancel',
},
{
text: intl.formatMessage({
id: 'qr.approve',
}),
onPress: () => {
handleHiveUriOperation(currentAccount, pinCode, tx)
.then(() => {
dispatch(toastNotification(intl.formatMessage({ id: 'alert.successful' })));
})
.catch((err) => {
bugsnagInstance.notify(err);
if (err) {
dispatch(toastNotification(intl.formatMessage({ id: err })));
} else {
dispatch(
toastNotification(intl.formatMessage({ id: 'qr.transaction_failed' })),
);
}
});
},
},
],
}),
);
})
.catch((errObj) => {
Alert.alert(
intl.formatMessage({ id: errObj.errorKey1 }, { key: errObj.authorityKeyType }),
intl.formatMessage(
{
id: errObj.errorKey2,
},
},
],
}),
);
{ key: errObj.authorityKeyType },
),
);
return;
});
};
const _handleDeepLink = async (url) => {
@ -221,11 +236,6 @@ export const QRModal = ({}: QRModalProps) => {
}
};
// check operation array is valid and is a single operation array
const _checkOpsArray = (ops) => {
return ops && isArray(ops) && ops.length === 1 && isArray(ops[0]) && ops[0].length === 2;
};
const _renderTransactionInfoRow = (item: any) => (
<View style={styles.transactionRow}>
<Text numberOfLines={1} style={styles.transactionItem1}>
@ -236,10 +246,10 @@ export const QRModal = ({}: QRModalProps) => {
</Text>
</View>
);
const _renderActionModalBody = (operations: any) => (
const _renderActionModalBody = (operations: any, opName: string) => (
<View style={styles.transactionBodyContainer}>
<View style={styles.transactionHeadingContainer}>
<Text style={styles.transactionHeading}>{operations[0]}</Text>
<Text style={styles.transactionHeading}>{opName}</Text>
</View>
<View style={styles.transactionItemsContainer}>
{Object.entries(operations[1]).map((item) => _renderTransactionInfoRow(item))}

View File

@ -1,5 +1,4 @@
import React, { useEffect } from 'react';
import { Alert } from 'react-native'
import { useDispatch, useSelector } from 'react-redux';
// Actions
@ -18,7 +17,6 @@ const SideMenuContainer = ({ navigation }) => {
const drawerStatus = useDrawerStatus();
const isLoggedIn = useSelector((state) => state.application.isLoggedIn);
const currentAccount = useSelector((state) => state.account.currentAccount);
const isVisibleAccountsBottomSheet = useSelector(

View File

@ -1041,11 +1041,30 @@
"confirmTransaction": "Confirm transaction",
"approve": "Approve",
"cancel": "Cancel",
"multi_array_ops_alert": "Multiple operations array detected!",
"multi_array_ops_aler_desct": "Ecency does not support signing multiple operations, yet"
"multi_array_ops_alert": "Operation not supported by Ecency",
"multi_array_ops_aler_desct": "Ecency does not support signing multiple operations yet",
"invalid_op": "Invalid operation data",
"invalid_op_desc": "try contacting QR/link author",
"invalid_amount": "Invalid Amount",
"invalid_amount_desc": "Enter valid amount in proper format",
"transaction_failed": "Transaction Failed!",
"invalid_key": "{key} key is required to perform this transaction",
"invalid_key_desc": "kindly login with {key} key or master key to perform this transaction"
},
"history": {
"edit": "Edit History",
"version": "Version"
},
"chain-error": {
"min-root-comment": "You may only post once every five minutes.",
"identical-vote": "Your current vote on this content is identical to this vote.",
"insufficient-resource": "Insufficient Resource Credits.",
"delete-comment-with-vote": "Cannot delete a content with positive pending rewards.",
"comment-cashout": "Content after their payout cannot be deleted.",
"comment-children": "Cannot delete a content with replies.",
"paid-out-post-forbidden": "Voting for paid out content is not available.",
"missing-authority": "This operation requires Active private key or authority.",
"missing-owner-authority": "This operation requires Owner private key or authority.",
"insufficient_fund": "Insufficient Funds"
}
}

View File

@ -2082,59 +2082,77 @@ export const votingPower = (account) => {
};
/* eslint-enable */
export const resolveTransaction = async (parsedTx, parsedParams, signer) => {
const EXPIRE_TIME = 60 * 1000;
const props = await client.database.getDynamicGlobalProperties();
// resolve the decoded tx and params to a signable tx
const { tx } = hiveuri.resolveTransaction(parsedTx, parsedParams, {
/* eslint-disable no-bitwise */
ref_block_num: props.head_block_number & 0xffff,
ref_block_prefix: Buffer.from(props.head_block_id, 'hex').readUInt32LE(4),
expiration: new Date(Date.now() + client.broadcast.expireTime + EXPIRE_TIME)
.toISOString()
.slice(0, -5),
signers: [signer],
preferred_signer: signer,
});
tx.ref_block_num = parseInt(tx.ref_block_num + '', 10);
tx.ref_block_prefix = parseInt(tx.ref_block_prefix + '', 10);
return tx;
};
const handleChainError = (strErr: string) => {
if (/You may only post once every/.test(strErr)) {
return 'chain-error.min-root-comment';
} else if (/Your current vote on this comment is identical/.test(strErr)) {
return 'chain-error.identical-vote';
} else if (/Please wait to transact, or power up/.test(strErr)) {
return 'chain-error.insufficient-resource';
} else if (/Cannot delete a comment with net positive/.test(strErr)) {
return 'chain-error.delete-comment-with-vote';
} else if (/children == 0/.test(strErr)) {
return 'chain-error.comment-children';
} else if (/comment_cashout/.test(strErr)) {
return 'chain-error.comment-cashout';
} else if (/Votes evaluating for comment that is paid out is forbidden/.test(strErr)) {
return 'chain-error.paid-out-post-forbidden';
} else if (/Missing Active Authority/.test(strErr)) {
return 'chain-error.missing-authority';
} else if (/Missing Owner Authority/.test(strErr)) {
return 'chain-error.missing-owner-authority';
} else if (/does not have sufficient funds/.test(strErr)) {
return 'chain-error.insufficient_fund';
}
return null;
};
export const handleHiveUriOperation = async (
currentAccount: any,
pin: any,
hiveUri: string,
tx: any,
): Promise<TransactionConfirmation> => {
try {
const digitPinCode = getDigitPinCode(pin);
const key = getAnyPrivateKey(currentAccount.local, digitPinCode);
const privateKey = PrivateKey.fromString(key);
const { head_block_number, head_block_id, time } = await getDynamicGlobalProperties();
const ref_block_num = head_block_number & 0xffff;
const ref_block_prefix = Buffer.from(head_block_id, 'hex').readUInt32LE(4);
const expireTime = 60 * 1000;
const chainId = Buffer.from(
'beeab0de00000000000000000000000000000000000000000000000000000000',
'hex',
);
const expiration = new Date(new Date(`${time}Z`).getTime() + expireTime)
.toISOString()
.slice(0, -5);
const extensions = [];
const parsed = hiveuri.decode(hiveUri)
// resolve the decoded tx and params to a signable tx
let { tx, signer } = hiveuri.resolveTransaction(parsed.tx, parsed.params, {
expiration,
// accounts we are able to sign for
signers: currentAccount.name,
// selected signer if none is asked for by the params
preferred_signer: currentAccount.name,
});
//inject raw ref_block_num and ref_block_prefex to avoid string converstion by hiveuri.resolveTransaction
// e.g. from a get_dynamic_global_properties call
tx.ref_block_num = ref_block_num;
tx.ref_block_prefix = ref_block_prefix;
// console.log('tx : ', JSON.stringify(tx, null, 2));
// console.log('tx : ', tx);
const transaction = cryptoUtils.signTransaction(tx, privateKey, chainId);
const trxId = generateTrxId(transaction);
const resultHive = await client.broadcast.call('broadcast_transaction', [transaction]);
const result = Object.assign({ id: trxId }, resultHive);
// console.log('result : ', JSON.stringify(result, null, 2));
return result;
} catch (err) {
const errString = handleChainError(err.toString());
bugsnagInstance.notify(err, (event) => {
event.context = 'handle-hive-uri-operations';
event.setMetaData('hiveUri', hiveUri);
event.context = 'handle-hive-uri-operation';
event.setMetaData('tx', tx);
});
throw err;
return Promise.reject(errString);
}
};

View File

@ -221,17 +221,55 @@ export const useWavesQuery = (host: string) => {
const _data = unionBy(...wavesQueries.map((query) => query.data), 'url');
const _filteredData = useMemo(() =>
_data.filter(post => isArray(mutes) ? mutes.indexOf(post?.author) < 0 : true),
[mutes, _data])
_data.filter(post => isArray(mutes) ? mutes.indexOf(post?.author) < 0 : true),
[mutes, _data])
const _lastestWavesFetch = async () => {
await _fetchPermlinks('', true);
const _prevLatestWave = _filteredData[0]
const _firstQuery = wavesQueries[0];
if(!_firstQuery){
return [];
}
const queryResponse = await _firstQuery.refetch();
const _newData:any[] = queryResponse.data || [];
//check if new waves are available
const _lastIndex = _newData?.findIndex(item =>
( item.author + item.permlink === _prevLatestWave.author + _prevLatestWave.permlink));
let _newWaves:any[] = []
if (_lastIndex && _lastIndex !== 0) {
if (_lastIndex < 0) {
_newWaves = _newData?.slice(0, 5) || [];
} else {
_newWaves = _newData?.slice(0, _lastIndex) || [];
}
}
return _newWaves
}
return {
data: _filteredData,
isRefreshing,
isLoading: isLoading || wavesQueries.lastItem?.isLoading || wavesQueries.lastItem?.isFetching,
fetchNextPage: _fetchNextPage,
latestWavesFetch: _lastestWavesFetch,
refresh: _refresh,
};
};

View File

@ -464,7 +464,7 @@ class EditorContainer extends Component<EditorContainerProps, any> {
// create new darft otherwise
else if (draftField) {
const { title, body, tags } = draftField;
const draft = { title, body, tags, jsonMeta };
const draft = { title, body, tags, meta: jsonMeta };
const response = await addDraft(draft);
const _resDraft = response.pop();
@ -708,7 +708,7 @@ class EditorContainer extends Component<EditorContainerProps, any> {
const { post } = this.state;
const _prefix = `re-${post.author.replace(/\./g, '')}`
const _prefix = `re-${post.author.replace(/\./g, '')}`;
const permlink = generateUniquePermlink(_prefix);
const parentAuthor = post.author;

View File

@ -1,5 +1,5 @@
import React, { useRef, useState } from 'react';
import { ActivityIndicator, NativeScrollEvent, NativeSyntheticEvent, RefreshControl, View, FlatList } from 'react-native';
import React, { useEffect, useRef, useState } from 'react';
import { ActivityIndicator, NativeScrollEvent, NativeSyntheticEvent, RefreshControl, View, FlatList, AppState, Alert } from 'react-native';
import { Comments, EmptyScreen, Header, PostOptionsModal } from '../../../components';
import styles from '../styles/wavesScreen.styles';
import { wavesQueries } from '../../../providers/queries';
@ -8,6 +8,7 @@ import WavesHeader from '../children/wavesHeader';
import { PostTypes } from '../../../constants/postTypes';
import ScrollTopPopup from '../../../components/tabbedPosts/view/scrollTopPopup';
import { debounce } from 'lodash';
import reactotron from 'reactotron-react-native';
const SCROLL_POPUP_THRESHOLD = 5000;
@ -19,16 +20,43 @@ const WavesScreen = () => {
const postsListRef = useRef<FlatList>();
const blockPopupRef = useRef(false);
const scrollOffsetRef = useRef(0);
const appState = useRef(AppState.currentState);
const wavesQuery = wavesQueries.useWavesQuery('ecency.waves');
const isDarkTheme = useAppSelector(state => state.application.isDarkTheme)
const [enableScrollTop, setEnableScrollTop] = useState(false);
const [popupAvatars, setPopupAvatars] = useState<any[]>([])
const _fetchData = ({ refresh }: { refresh?: boolean }) => {
if (refresh) {
useEffect(() => {
const _stateSub = AppState.addEventListener('change', _handleAppStateChange);
return () => {
_stateSub.remove();
}
}, [])
//actions
const _handleAppStateChange = async (nextAppState) => {
if (
appState.current.match(/inactive|background/) &&
nextAppState === 'active'
) {
const latestWaves = await wavesQuery.latestWavesFetch()
if (latestWaves.length > 0) {
setPopupAvatars(latestWaves.map((item) => item.avatar))
setEnableScrollTop(true)
}
}
appState.current = nextAppState;
};
const _fetchData = (fetchProps: any) => {
if (fetchProps?.refresh) {
wavesQuery.refresh();
} else {
wavesQuery.fetchNextPage();
@ -38,8 +66,9 @@ const WavesScreen = () => {
//scrolls to top, blocks scroll popup for 2 seconds to reappear after scroll
const _scrollTop = () => {
if (postsListRef.current) {
postsListRef.current.scrollToOffset({offset:0});
postsListRef.current.scrollToOffset({ offset: 0 });
setEnableScrollTop(false);
setPopupAvatars([])
scrollPopupDebouce.cancel();
blockPopupRef.current = true;
setTimeout(() => {
@ -115,11 +144,12 @@ const WavesScreen = () => {
}}
/>
<ScrollTopPopup
popupAvatars={[]}
popupAvatars={popupAvatars}
enableScrollTop={enableScrollTop}
onPress={_scrollTop}
onClose={() => {
setEnableScrollTop(false);
setPopupAvatars([])
}}
/>
</View>

View File

@ -1,4 +1,129 @@
import { get, isArray } from 'lodash';
const operationsData = require('./operations.json');
/**
* checks if uri entered is valid hive uri
* Accepts a string
* Returns boolean if uri starts with 'hive://'
* */
export const isHiveUri = (uri: string) => {
let trimUri = uri.trim();
return trimUri.startsWith('hive://');
};
// check operation array is valid and is a single operation array
const _checkOpsArray = (ops: any) => {
return ops && isArray(ops) && ops.length === 1 && isArray(ops[0]) && ops[0].length === 2;
};
const findParentKey = (obj, value, parentKey = null) => {
for (let key in obj) {
if (obj[key] === value) {
return parentKey;
} else if (typeof obj[key] === 'object') {
const foundKey = findParentKey(obj[key], value, key);
if (foundKey) {
return foundKey;
}
}
}
return null;
};
// get operation name and signer field from operation object
const getOperationProps = (opName: string) => {
const op = get(operationsData, opName, null);
if (op) {
const signerField = findParentKey(op, '__signer');
return {
opName: op.name,
opAuthority: op.authority || '',
signerField,
};
} else {
return null;
}
};
// validate and format amount field in operation to 3 decimal places
const _formatAmount = (amount: string) => {
const splitAmt = amount.split(' ');
if (
splitAmt.length === 2 &&
parseFloat(splitAmt[0]) &&
(splitAmt[1] === 'HIVE' || splitAmt[1] === 'HBD')
) {
return `${parseFloat(splitAmt[0]).toFixed(3)} ${splitAmt[1]}`;
} else {
return null;
}
};
/**
* Validates tx from parsed data from hive-uri, checks if operation length is not greater than one and __signer is present in operation
* Accepts tx object of parsed uri from decode method of hive-uri
* Returns promise with keys for showing errors, and operation name parsed from operations.json and in case of success returns formatted tx
*
* */
export const getFormattedTx = (tx: any, authoritiesMap: Map<string, boolean>) => {
let opName;
let errorObj = {
errorKey1: '',
errorKey2: '',
authorityKeyType: '',
};
const ops = get(tx, 'operations', []);
const isValidOp = _checkOpsArray(ops);
if (!isValidOp) {
errorObj.errorKey1 = 'qr.multi_array_ops_alert';
errorObj.errorKey2 = 'qr.multi_array_ops_aler_desct';
return Promise.reject(errorObj);
}
const op = ops[0]; // single operation
const operationName = op[0]; // operation name
let operationObj = op[1]; // operation object
if (!operationName) {
errorObj.errorKey1 = 'qr.invalid_op';
errorObj.errorKey2 = 'qr.invalid_op_desc';
return Promise.reject(errorObj);
}
const opProps = getOperationProps(operationName); // get operation props from operations.json file i-e signer field and operation name
errorObj.authorityKeyType = opProps?.opAuthority || ''; // set key type to validate object
if (!opProps) {
errorObj.errorKey1 = 'qr.invalid_op';
errorObj.errorKey2 = 'qr.invalid_op_desc';
return Promise.reject(errorObj);
}
if (authoritiesMap && !authoritiesMap.get(opProps.opAuthority)) {
errorObj.errorKey1 = 'qr.invalid_key';
errorObj.errorKey2 = 'qr.invalid_key_desc';
return Promise.reject(errorObj);
}
// if amount field present in operation, validate and check for proper formatting and format to 3 decimal places
if (operationObj.hasOwnProperty('amount')) {
const amount = _formatAmount(operationObj.amount);
operationObj.amount = amount;
if (!amount) {
errorObj.errorKey1 = 'qr.invalid_amount';
errorObj.errorKey2 = 'qr.invalid_amount_desc';
return Promise.reject(errorObj);
}
}
const opSignerValue = get(op[1], opProps.signerField, '');
// if signer field contains empty value, fill it with __signer
if (!opSignerValue) {
operationObj[opProps.signerField] = '__signer';
}
opName = opProps.opName;
tx = {
...tx,
operations: [[operationName, operationObj]],
};
// resolve with formatted tx and opName
return Promise.resolve({ tx: tx, opName: opName });
};

741
src/utils/operations.json Normal file
View File

@ -0,0 +1,741 @@
{
"transfer": {
"name": "Transfer",
"authority": "active",
"description": "Transfers asset from one account to another.",
"schema": {
"from": {
"type": "account",
"defaultValue": "__signer"
},
"to": {
"type": "account"
},
"amount": {
"type": "amount"
},
"memo": {
"type": "string",
"defaultValue": "",
"maxLength": 2048
}
}
},
"recurrent_transfer": {
"name": "Recurring Transfers",
"authority": "active",
"description": "Recurring transfers of asset from one account to another.",
"schema": {
"from": {
"type": "account",
"defaultValue": "__signer"
},
"to": {
"type": "account"
},
"amount": {
"type": "amount"
},
"memo": {
"type": "string",
"defaultValue": "",
"maxLength": 2048
},
"recurrence": {
"type": "int"
},
"executions": {
"type": "int"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"delegate_vesting_shares": {
"name": "Delegate Hive Power",
"authority": "active",
"schema": {
"delegator": {
"type": "account",
"defaultValue": "__signer"
},
"delegatee": {
"type": "account"
},
"vesting_shares": {
"type": "amount"
}
}
},
"transfer_to_vesting": {
"name": "Power up",
"authority": "active",
"schema": {
"from": {
"type": "account",
"defaultValue": "__signer"
},
"to": {
"type": "account",
"defaultValue": "__signer"
},
"amount": {
"type": "amount"
}
}
},
"set_withdraw_vesting_route": {
"name": "Set withdraw vesting route",
"authority": "active",
"schema": {
"from_account": {
"type": "account",
"defaultValue": "__signer"
},
"to_account": {
"type": "account"
},
"percent": {
"type": "int"
},
"auto_vest": {
"type": "bool",
"defaultValue": false
}
}
},
"withdraw_vesting": {
"name": "Power down",
"authority": "active",
"schema": {
"account": {
"type": "account",
"defaultValue": "__signer"
},
"vesting_shares": {
"type": "amount"
}
}
},
"transfer_to_savings": {
"name": "Transfer to saving",
"authority": "active",
"schema": {
"from": {
"type": "account",
"defaultValue": "__signer"
},
"to": {
"type": "account",
"defaultValue": "__signer"
},
"amount": {
"type": "amount"
},
"memo": {
"type": "string",
"defaultValue": "",
"maxLength": 2048
}
}
},
"transfer_from_savings": {
"name": "Transfer from saving",
"authority": "active",
"schema": {
"from": {
"type": "account",
"defaultValue": "__signer"
},
"to": {
"type": "account",
"defaultValue": "__signer"
},
"amount": {
"type": "amount"
},
"memo": {
"type": "string",
"defaultValue": "",
"maxLength": 2048
},
"request_id": {
"type": "int"
}
}
},
"cancel_transfer_from_savings": {
"name": "Cancel transfer from saving",
"authority": "active",
"schema": {
"from": {
"type": "account",
"defaultValue": "__signer"
},
"request_id": {
"type": "int"
}
}
},
"convert": {
"name": "Convert",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"requestid": {
"type": "int"
},
"amount": {
"type": "amount"
}
}
},
"collateralized_convert": {
"name": "Collateralized Convert",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"requestid": {
"type": "int"
},
"amount": {
"type": "amount"
}
}
},
"account_witness_vote": {
"name": "Witness vote",
"authority": "active",
"schema": {
"account": {
"type": "account",
"defaultValue": "__signer"
},
"witness": {
"type": "account"
},
"approve": {
"type": "bool",
"defaultValue": true
}
}
},
"witness_update": {
"name": "Witness update",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"url": {
"type": "string",
"defaultValue": "https://ecency.com"
},
"block_signing_key": {
"type": "string",
"defaultValue": "STM1111111111111111111111111111111114T1Anm"
},
"props": {
"type": "object",
"defaultValue": {
"account_creation_fee": "1.000 HIVE",
"maximum_block_size": 131072,
"hbd_interest_rate": 2000
}
},
"fee": {
"type": "string",
"defaultValue": "0.000 HIVE"
}
}
},
"witness_set_properties": {
"name": "Witness set properties",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"props": {
"type": "object",
"defaultValue": {
"account_creation_fee": "1.000 HIVE",
"account_subsidy_budget": 10000,
"account_subsidy_decay": 330782,
"maximum_block_size": 65536,
"hbd_interest_rate": 2000,
"hbd_exchange_rate": {"base": "0.000 HBD", "quote": "0.000 HIVE"},
"url": "https://ecency.com",
"new_signing_key": "STM1111111111111111111111111111111114T1Anm"
}
}
}
},
"account_witness_proxy": {
"name": "Governance proxy",
"authority": "active",
"schema": {
"account": {
"type": "account",
"defaultValue": "__signer"
},
"proxy": {
"type": "account"
}
}
},
"claim_account": {
"name": "Claim account",
"authority": "active",
"schema": {
"creator": {
"type": "account",
"defaultValue": "__signer"
},
"fee": {
"type": "amount",
"defaultValue": "0.000 HIVE"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"account_create": {
"name": "Create account",
"authority": "active",
"schema": {
"creator": {
"type": "account",
"defaultValue": "__signer"
},
"fee": {
"type": "amount",
"defaultValue": "3.000 HIVE"
},
"new_account_name": {
"type": "account"
},
"memo_key": {
"type": "string"
},
"json_metadata": {
"type": "string"
},
"owner": {
"type": "object"
},
"active": {
"type": "object"
},
"posting": {
"type": "object"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"create_claimed_account": {
"name": "Create account with account credits",
"authority": "active",
"schema": {
"creator": {
"type": "account",
"defaultValue": "__signer"
},
"new_account_name": {
"type": "account"
},
"memo_key": {
"type": "string"
},
"json_metadata": {
"type": "string"
},
"owner": {
"type": "object"
},
"active": {
"type": "object"
},
"posting": {
"type": "object"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"vote": {
"name": "Vote",
"authority": "posting",
"schema": {
"voter": {
"type": "account",
"defaultValue": "__signer"
},
"author": {
"type": "account"
},
"permlink": {
"type": "string"
},
"weight": {
"type": "int",
"defaultValue": 10000
}
}
},
"limit_order_create": {
"name": "Create limit order",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"orderid": {
"type": "int"
},
"amount_to_sell": {
"type": "amount"
},
"min_to_receive": {
"type": "amount"
},
"fill_or_kill": {
"type": "bool"
},
"expiration": {
"type": "time"
}
}
},
"limit_order_create2": {
"name": "Create limit order",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"orderid": {
"type": "int"
},
"amount_to_sell": {
"type": "amount"
},
"exchange_rate": {
"type": "object"
},
"fill_or_kill": {
"type": "bool"
},
"expiration": {
"type": "time"
}
}
},
"limit_order_cancel": {
"name": "Cancel limit order",
"authority": "active",
"schema": {
"owner": {
"type": "account",
"defaultValue": "__signer"
},
"orderid": {
"type": "int"
}
}
},
"claim_reward_balance": {
"name": "Redeem rewards",
"authority": "posting",
"schema": {
"account": {
"type": "account",
"defaultValue": "__signer"
},
"reward_hive": {
"type": "amount"
},
"reward_hbd": {
"type": "amount"
},
"reward_vests": {
"type": "amount"
}
}
},
"comment": {
"name": "Post or comment",
"authority": "posting",
"schema": {
"parent_author": {
"type": "account",
"defaultValue": ""
},
"parent_permlink": {
"type": "string"
},
"author": {
"type": "account",
"defaultValue": "__signer"
},
"permlink": {
"type": "string"
},
"title": {
"type": "string"
},
"body": {
"type": "string"
},
"json_metadata": {
"type": "string"
}
}
},
"comment_options": {
"name": "Post or comment options",
"authority": "posting",
"schema": {
"author": {
"type": "account",
"defaultValue": "__signer"
},
"permlink": {
"type": "string"
},
"allow_curation_rewards": {
"type": "bool",
"defaultValue": true
},
"allow_votes": {
"type": "bool",
"defaultValue": true
},
"max_accepted_payout": {
"type": "amount",
"defaultValue": "1000000.000 SBD"
},
"percent_hbd": {
"type": "int",
"defaultValue": 10000
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"custom_json": {
"name": "Custom operation",
"authority": "posting",
"schema": {
"required_auths": {
"type": "array",
"defaultValue": []
},
"required_posting_auths": {
"name": "posting auths",
"type": "array",
"defaultValue": ["__signer"]
},
"id": {
"type": "string"
},
"json": {
"type": "json"
}
}
},
"delete_comment": {
"name": "Delete comment",
"authority": "posting",
"schema": {
"author": {
"type": "account",
"defaultValue": "__signer"
},
"permlink": {
"type": "string"
}
}
},
"account_update": {
"name": "Update account (active)",
"authority": "active",
"schema": {
"account": {
"type": "account",
"defaultValue": "__signer"
},
"owner": {
"type": "object"
},
"active": {
"type": "object"
},
"posting": {
"type": "object"
},
"memo_key": {
"type": "string"
},
"json_metadata": {
"type": "json"
}
}
},
"account_update2": {
"name": "Update account (posting)",
"authority": "posting",
"schema": {
"account": {
"type": "account",
"defaultValue": "__signer"
},
"json_metadata": {
"type": "json",
"defaultValue": ""
},
"posting_json_metadata": {
"type": "json"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"change_recovery_account": {
"name": "Change recovery account",
"authority": "owner",
"schema": {
"account_to_recover": {
"type": "account",
"defaultValue": "__signer"
},
"new_recovery_account": {
"type": "account"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"create_proposal": {
"name": "Create proposal",
"authority": "active",
"schema": {
"creator": {
"type": "account",
"defaultValue": "__signer"
},
"receiver": {
"type": "account",
"defaultValue": "__signer"
},
"start_date": {
"type": "time"
},
"end_date": {
"type": "time"
},
"daily_pay": {
"type": "amount"
},
"subject": {
"type": "string"
},
"permlink": {
"type": "string"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"remove_proposal": {
"name": "Remove proposal",
"authority": "active",
"schema": {
"proposal_owner": {
"type": "account",
"defaultValue": "__signer"
},
"proposal_ids": {
"type": "array"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"update_proposal_votes": {
"name": "Update proposal votes",
"authority": "active",
"schema": {
"voter": {
"type": "account",
"defaultValue": "__signer"
},
"proposal_ids": {
"type": "array"
},
"approve": {
"type": "bool",
"defaultValue": true
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
},
"update_proposal": {
"name": "Update proposal",
"authority": "active",
"schema": {
"creator": {
"type": "account",
"defaultValue": "__signer"
},
"proposal_id": {
"type": "int"
},
"daily_pay": {
"type": "amount"
},
"subject": {
"type": "string"
},
"permlink": {
"type": "string"
},
"extensions": {
"type": "array",
"defaultValue": []
}
}
}
}

View File

@ -1811,6 +1811,14 @@
dependencies:
any-observable "^0.3.0"
"@shopify/flash-list@^1.6.1":
version "1.6.1"
resolved "https://registry.yarnpkg.com/@shopify/flash-list/-/flash-list-1.6.1.tgz#7a46d8ec4e125b8b7bf686777d932c7c950e00c7"
integrity sha512-SlBlpP7+zol6D1SKaf402aS30Qgwdjwb8/Qn2CupYwXnTcu2l8TiXB766vcsIvKTqUO7ELfQnCwCq8NXx55FsQ==
dependencies:
recyclerlistview "4.2.0"
tslib "2.4.0"
"@sideway/address@^4.1.3":
version "4.1.4"
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0"
@ -7166,7 +7174,7 @@ lodash.camelcase@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
lodash.debounce@^4.0.8:
lodash.debounce@4.0.8, lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
@ -8662,7 +8670,7 @@ prompts@^2.0.1, prompts@^2.4.0:
kleur "^3.0.3"
sisteransi "^1.0.5"
prop-types@*, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.0, prop-types@^15.8.1:
prop-types@*, prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.0, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@ -9613,6 +9621,15 @@ recast@^0.20.4:
source-map "~0.6.1"
tslib "^2.0.1"
recyclerlistview@4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/recyclerlistview/-/recyclerlistview-4.2.0.tgz#a140149aaa470c9787a1426452651934240d69ef"
integrity sha512-uuBCi0c+ggqHKwrzPX4Z/mJOzsBbjZEAwGGmlwpD/sD7raXixdAbdJ6BTcAmuWG50Cg4ru9p12M94Njwhr/27A==
dependencies:
lodash.debounce "4.0.8"
prop-types "15.8.1"
ts-object-utils "0.0.5"
reduce-flatten@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27"
@ -10937,6 +10954,11 @@ tr46@~0.0.3:
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
ts-object-utils@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/ts-object-utils/-/ts-object-utils-0.0.5.tgz#95361cdecd7e52167cfc5e634c76345e90a26077"
integrity sha512-iV0GvHqOmilbIKJsfyfJY9/dNHCs969z3so90dQWsO1eMMozvTpnB1MEaUbb3FYtZTGjv5sIy/xmslEz0Rg2TA==
ts-toolbelt@^6.15.1:
version "6.15.5"
resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz#cb3b43ed725cb63644782c64fbcad7d8f28c0a83"
@ -10952,6 +10974,11 @@ tsconfig-paths@^3.14.1:
minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
tslib@^1.8.1, tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"