mirror of
https://github.com/ecency/ecency-mobile.git
synced 2024-12-22 21:01:31 +03:00
Merge branch 'development' of https://github.com/ecency/ecency-mobile into sa/edit-history
This commit is contained in:
commit
ba4bf2b56b
@ -144,7 +144,7 @@ android {
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode versionMajor * 10000 + versionMinor * 100 + versionPatch
|
||||
versionName "3.0.28"
|
||||
versionName "3.0.29"
|
||||
resValue "string", "build_config_package", "app.esteem.mobile.android"
|
||||
multiDexEnabled true
|
||||
// react-native-image-crop-picker
|
||||
|
@ -15,11 +15,11 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.28</string>
|
||||
<string>3.0.29</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2807</string>
|
||||
<string>2808</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true />
|
||||
<key>NSAppTransportSecurity</key>
|
||||
|
@ -15,10 +15,10 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.28</string>
|
||||
<string>3.0.29</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2807</string>
|
||||
<string>2808</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -1129,7 +1129,7 @@
|
||||
CODE_SIGN_IDENTITY = "iPhone Distribution";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 2807;
|
||||
CURRENT_PROJECT_VERSION = 2808;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = 75B6RXTKGT;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -1208,7 +1208,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Ecency/Ecency.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 2807;
|
||||
CURRENT_PROJECT_VERSION = 2808;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = 75B6RXTKGT;
|
||||
EXCLUDED_ARCHS = "";
|
||||
|
@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.28</string>
|
||||
<string>3.0.29</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
@ -15,10 +15,10 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.28</string>
|
||||
<string>3.0.29</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2807</string>
|
||||
<string>2808</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -730,7 +730,7 @@ SPEC CHECKSUMS:
|
||||
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
||||
BugsnagReactNative: a96bc039e0e4ec317a8b331714393d836ca60557
|
||||
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
|
||||
DoubleConversion: cde416483dac037923206447da6e1454df403714
|
||||
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
|
||||
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
|
||||
Firebase: c23a36d9e4cdf7877dfcba8dd0c58add66358999
|
||||
@ -742,7 +742,7 @@ SPEC CHECKSUMS:
|
||||
FirebaseInstanceID: bd3ffc24367f901a43c063b36c640b345a4a5dd1
|
||||
FirebaseMessaging: 5eca4ef173de76253352511aafef774caa1cba2a
|
||||
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
|
||||
glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
|
||||
glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85
|
||||
GoogleAppMeasurement: a6a3a066369828db64eda428cb2856dc1cdc7c4e
|
||||
GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
|
||||
GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
|
||||
|
@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.28</string>
|
||||
<string>3.0.29</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>2807</string>
|
||||
<string>2808</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionAttributes</key>
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ecency",
|
||||
"version": "3.0.28",
|
||||
"version": "3.0.29",
|
||||
"displayName": "Ecency",
|
||||
"private": true,
|
||||
"rnpm": {
|
||||
|
@ -2,21 +2,24 @@ import React, { useEffect, useState } from "react";
|
||||
import { Image } from "react-native";
|
||||
import EStyleSheet from "react-native-extended-stylesheet";
|
||||
import FastImage from "react-native-fast-image";
|
||||
import { TouchableWithoutFeedback } from "react-native-gesture-handler";
|
||||
import { TouchableOpacity } from "react-native-gesture-handler";
|
||||
|
||||
interface AutoHeightImageProps {
|
||||
contentWidth:number,
|
||||
imgUrl:string,
|
||||
isAnchored:boolean,
|
||||
activeOpacity?:number,
|
||||
onPress:()=>void,
|
||||
}
|
||||
|
||||
|
||||
export const AutoHeightImage = ({
|
||||
contentWidth,
|
||||
imgUrl,
|
||||
isAnchored,
|
||||
activeOpacity,
|
||||
onPress
|
||||
}:{
|
||||
contentWidth:number,
|
||||
imgUrl:string,
|
||||
isAnchored:boolean,
|
||||
onPress:()=>void,
|
||||
}) => {
|
||||
}:AutoHeightImageProps) => {
|
||||
|
||||
|
||||
const [imgWidth, setImgWidth] = useState(contentWidth);
|
||||
@ -47,14 +50,14 @@ import { TouchableWithoutFeedback } from "react-native-gesture-handler";
|
||||
}
|
||||
|
||||
return (
|
||||
<TouchableWithoutFeedback onPress={onPress} disabled={isAnchored}>
|
||||
<TouchableOpacity onPress={onPress} disabled={isAnchored} activeOpacity={activeOpacity || 1}>
|
||||
<FastImage
|
||||
style={imgStyle}
|
||||
source={{uri:imgUrl}}
|
||||
resizeMode={FastImage.resizeMode.contain}
|
||||
onLoad={_onLoad}
|
||||
/>
|
||||
</TouchableWithoutFeedback>
|
||||
</TouchableOpacity>
|
||||
|
||||
)
|
||||
}
|
@ -7,7 +7,7 @@ import { AutoHeightImage } from '../autoHeightImage/autoHeightImage';
|
||||
import { useHtmlIframeProps, iframeModel } from '@native-html/iframe-plugin';
|
||||
import WebView from 'react-native-webview';
|
||||
import { VideoPlayer } from '..';
|
||||
import {useHtmlTableProps } from '@native-html/table-plugin';
|
||||
import { useHtmlTableProps } from '@native-html/table-plugin';
|
||||
import { ScrollView } from 'react-native-gesture-handler';
|
||||
|
||||
interface PostHtmlRendererProps {
|
||||
@ -118,52 +118,7 @@ export const PostHtmlRenderer = memo(
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} catch (error) {}
|
||||
};
|
||||
|
||||
const _onElement = (element: Element) => {
|
||||
if (element.tagName === 'img' && element.attribs.src) {
|
||||
const imgUrl = element.attribs.src;
|
||||
console.log('img element detected', imgUrl);
|
||||
onElementIsImage(imgUrl);
|
||||
}
|
||||
};
|
||||
|
||||
const _anchorRenderer = ({ InternalRenderer, tnode, ...props }: CustomRendererProps<TNode>) => {
|
||||
const parsedTnode = parseLinkData(tnode);
|
||||
const _onPress = () => {
|
||||
console.log('Link Pressed:', tnode);
|
||||
const data = parseLinkData(tnode);
|
||||
_handleOnLinkPress(data);
|
||||
};
|
||||
|
||||
|
||||
//process video link
|
||||
if(tnode.classes?.indexOf('markdown-video-link') >= 0){
|
||||
|
||||
if(isComment){
|
||||
const imgElement = tnode.children.find((child) => {
|
||||
return child.classes.indexOf('video-thumbnail') > 0 ? true : false;
|
||||
});
|
||||
if (!imgElement) {
|
||||
return <VideoThumb contentWidth={contentWidth} onPress={_onPress} />;
|
||||
}
|
||||
} else {
|
||||
return (
|
||||
<VideoPlayer
|
||||
mode={parsedTnode.youtubeId ? 'youtube' : 'uri'}
|
||||
contentWidth={contentWidth}
|
||||
uri={parsedTnode.videoHref}
|
||||
youtubeVideoId={parsedTnode.youtubeId}
|
||||
startTime={parsedTnode.startTime}
|
||||
disableAutoplay={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return <InternalRenderer tnode={tnode} onPress={_onPress} {...props} />;
|
||||
} catch (error) { }
|
||||
};
|
||||
|
||||
|
||||
@ -186,6 +141,70 @@ export const PostHtmlRenderer = memo(
|
||||
return getMaxImageWidth(tnode.parent);
|
||||
};
|
||||
|
||||
|
||||
const _onElement = (element: Element) => {
|
||||
if (element.tagName === 'img' && element.attribs.src) {
|
||||
const imgUrl = element.attribs.src;
|
||||
console.log('img element detected', imgUrl);
|
||||
onElementIsImage(imgUrl);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
const _anchorRenderer = ({ InternalRenderer, tnode, ...props }: CustomRendererProps<TNode>) => {
|
||||
const parsedTnode = parseLinkData(tnode);
|
||||
const _onPress = () => {
|
||||
console.log('Link Pressed:', tnode);
|
||||
const data = parseLinkData(tnode);
|
||||
_handleOnLinkPress(data);
|
||||
};
|
||||
|
||||
|
||||
//process video link
|
||||
if (tnode.classes?.indexOf('markdown-video-link') >= 0) {
|
||||
|
||||
if (isComment) {
|
||||
const imgElement = tnode.children.find((child) => {
|
||||
return child.classes.indexOf('video-thumbnail') > 0 ? true : false;
|
||||
});
|
||||
if (!imgElement) {
|
||||
return <VideoThumb contentWidth={contentWidth} onPress={_onPress} />;
|
||||
}
|
||||
} else {
|
||||
return (
|
||||
<VideoPlayer
|
||||
mode={parsedTnode.youtubeId ? 'youtube' : 'uri'}
|
||||
contentWidth={contentWidth}
|
||||
uri={parsedTnode.videoHref}
|
||||
youtubeVideoId={parsedTnode.youtubeId}
|
||||
startTime={parsedTnode.startTime}
|
||||
disableAutoplay={true}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (tnode.children.length === 1 && tnode.children[0].tagName === 'img') {
|
||||
const maxImgWidth = getMaxImageWidth(tnode);
|
||||
return <AutoHeightImage
|
||||
contentWidth={maxImgWidth}
|
||||
imgUrl={tnode.children[0].attributes.src}
|
||||
isAnchored={false}
|
||||
activeOpacity={0.8}
|
||||
onPress={_onPress}
|
||||
/>
|
||||
}
|
||||
|
||||
|
||||
return <InternalRenderer tnode={tnode} onPress={_onPress} {...props} />;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const _imageRenderer = ({ tnode }: CustomRendererProps<TNode>) => {
|
||||
const imgUrl = tnode.attributes.src;
|
||||
const _onPress = () => {
|
||||
@ -225,25 +244,26 @@ export const PostHtmlRenderer = memo(
|
||||
|
||||
|
||||
//based on number of columns a table have, sets scroll enabled or disable, also adjust table full width
|
||||
const _tableRenderer = ({TDefaultRenderer, ...props}:CustomRendererProps<TNode>) => {
|
||||
const _tableRenderer = ({ TDefaultRenderer, ...props }: CustomRendererProps<TNode>) => {
|
||||
const tableProps = useHtmlTableProps(props);
|
||||
|
||||
const isScrollable = tableProps.numOfColumns > 3;
|
||||
const _tableWidth = isScrollable ? tableProps.numOfColumns * _minTableColWidth: contentWidth;
|
||||
props.style = {width:_tableWidth};
|
||||
const _tableWidth = isScrollable ? tableProps.numOfColumns * _minTableColWidth : contentWidth;
|
||||
props.style = { width: _tableWidth };
|
||||
|
||||
return (
|
||||
<ScrollView horizontal={true} scrollEnabled={isScrollable}>
|
||||
<TDefaultRenderer {...props} />
|
||||
<TDefaultRenderer {...props} />
|
||||
</ScrollView>
|
||||
)}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
// iframe renderer for rendering iframes in body
|
||||
const _iframeRenderer = function IframeRenderer(props) {
|
||||
const iframeProps = useHtmlIframeProps(props);
|
||||
|
||||
if(isComment){
|
||||
if (isComment) {
|
||||
const _onPress = () => {
|
||||
console.log('iframe thumb Pressed:', iframeProps);
|
||||
if (handleVideoPress) {
|
||||
@ -253,9 +273,9 @@ export const PostHtmlRenderer = memo(
|
||||
return (
|
||||
<VideoThumb contentWidth={contentWidth} onPress={_onPress} />
|
||||
)
|
||||
}else{
|
||||
} else {
|
||||
return (
|
||||
<VideoPlayer
|
||||
<VideoPlayer
|
||||
mode='uri'
|
||||
uri={iframeProps.source.uri}
|
||||
contentWidth={contentWidth}
|
||||
@ -281,9 +301,9 @@ export const PostHtmlRenderer = memo(
|
||||
img: styles.img,
|
||||
table: styles.table,
|
||||
tr: { ...styles.tr, width: contentWidth }, //center tag causes tr to have 0 width if not exclusivly set, contentWidth help avoid that
|
||||
th: { ...styles.th, minWidth: _minTableColWidth},
|
||||
td: { ...styles.td, minWidth: _minTableColWidth},
|
||||
div: { ...styles.div, maxWidth:contentWidth }, //makes sure width covers the available horizontal space for view and not exceed the contentWidth if parent bound id not defined
|
||||
th: { ...styles.th, minWidth: _minTableColWidth },
|
||||
td: { ...styles.td, minWidth: _minTableColWidth },
|
||||
div: { ...styles.div, maxWidth: contentWidth }, //makes sure width covers the available horizontal space for view and not exceed the contentWidth if parent bound id not defined
|
||||
blockquote: styles.blockquote,
|
||||
code: styles.code,
|
||||
li: styles.li,
|
||||
|
@ -7,9 +7,9 @@
|
||||
"transfer": "Siirto",
|
||||
"power_up": "Ansaintaan",
|
||||
"transfer_from_savings": "Säästöistä",
|
||||
"withdraw_savings": "Withdraw Savings",
|
||||
"withdraw_savings": "Kotiuta säästöihin",
|
||||
"withdraw_vesting": "Power Down",
|
||||
"open_order": "Open Order",
|
||||
"open_order": "Avoimet Tilaukset",
|
||||
"fill_order": "Täytä hakemus",
|
||||
"post": "Julkaisu",
|
||||
"comment": "Kommentti",
|
||||
@ -51,12 +51,12 @@
|
||||
"to": "Vastaanottaja",
|
||||
"estimated_value_desc": "Ostohinnan mukaan",
|
||||
"estimated_value": "Arvioutu arvo",
|
||||
"vote_value": "Vote value",
|
||||
"delegated_hive_power": "Delegated hive power",
|
||||
"powering_down_hive_power": "Powering down",
|
||||
"received_hive_power": "Received hive power",
|
||||
"total_hive_power": "Total hive power",
|
||||
"savings": "Savings",
|
||||
"vote_value": "Ääniarvo",
|
||||
"delegated_hive_power": "Valtuutettu Hive Power",
|
||||
"powering_down_hive_power": "Tehon alentaminen",
|
||||
"received_hive_power": "Vastaanotettu Hive Power",
|
||||
"total_hive_power": "Hive Power yhteensä",
|
||||
"savings": "Säästöt",
|
||||
"estimated_amount": "Ääniarvo",
|
||||
"amount_information": "Siirrä kytkintä muuttaaksesi määrää",
|
||||
"amount": "Määrä",
|
||||
@ -76,11 +76,11 @@
|
||||
"next": "SEURAAVA",
|
||||
"delegate": "Valtuuta",
|
||||
"power_down": "Power Down",
|
||||
"withdraw_hive": "Withdraw Savings",
|
||||
"withdraw_hbd": "Withdraw Savings",
|
||||
"withdraw_hive": "Kotiuta säästöihin",
|
||||
"withdraw_hbd": "Kotiuta säästöt",
|
||||
"transfer_to_savings": "Säästöihin",
|
||||
"convert": "Muunna",
|
||||
"convert_request": "Convert Request",
|
||||
"convert_request": "Muunnospyyntö",
|
||||
"escrow_transfer": "Escrow-siirto",
|
||||
"escrow_dispute": "Escrow-riita",
|
||||
"escrow_release": "Escrow-vapautus",
|
||||
@ -91,9 +91,9 @@
|
||||
"fill_transfer_from_savings": "Säästöt Toteutettu",
|
||||
"fill_vesting_withdraw": "PowerDown toteutettu",
|
||||
"ecency": {
|
||||
"title": "Points",
|
||||
"name": "Ecency Points",
|
||||
"buy": "GET POINTS"
|
||||
"title": "Pisteet",
|
||||
"name": "Ecency pisteet",
|
||||
"buy": "Lunasta pisteet"
|
||||
},
|
||||
"savinghive": {
|
||||
"title": "HIVE säästöt"
|
||||
@ -115,23 +115,23 @@
|
||||
"name": "Hive Power"
|
||||
},
|
||||
"hive_dollar": {
|
||||
"name": "Hive Dollar"
|
||||
"name": "Hive Dollarit"
|
||||
},
|
||||
"btc": {
|
||||
"title": "BTC",
|
||||
"buy": "OTA BTC",
|
||||
"address": "VASTAANOTA"
|
||||
},
|
||||
"last_updated": "Last Updated:",
|
||||
"updating": "Updating...",
|
||||
"coin_details": "Details",
|
||||
"change": "Change",
|
||||
"activities": "Activities",
|
||||
"savings_withdrawal": "Pending Withdrawals",
|
||||
"open_orders": "Open Orders",
|
||||
"conversions_requested": "Conversions Requested",
|
||||
"expires": "expires",
|
||||
"pending_requests": "Pending Requests"
|
||||
"last_updated": "Viimeksi päivitetty:",
|
||||
"updating": "Päivitetään...",
|
||||
"coin_details": "Lisätiedot",
|
||||
"change": "Muuta",
|
||||
"activities": "Toiminnat",
|
||||
"savings_withdrawal": "Odottavat Nostot",
|
||||
"open_orders": "Avoimet Tilaukset",
|
||||
"conversions_requested": "Pyydetyt muunnokset",
|
||||
"expires": "vanhenee",
|
||||
"pending_requests": "Odottavat pyynnöt"
|
||||
},
|
||||
"notification": {
|
||||
"vote": "äänesti",
|
||||
@ -217,7 +217,7 @@
|
||||
"currency": "Valuutta",
|
||||
"language": "Kieli",
|
||||
"server": "Palvelin",
|
||||
"color_theme": "Appearance",
|
||||
"color_theme": "Ulkoasu",
|
||||
"push_notification": "Push-ilmoitus",
|
||||
"notification": {
|
||||
"follow": "Seuraa",
|
||||
@ -241,9 +241,9 @@
|
||||
"always_warn": "Kysy aina"
|
||||
},
|
||||
"theme": {
|
||||
"system": "Device settings",
|
||||
"light": "Light",
|
||||
"dark": "Dark"
|
||||
"system": "Laitteen asetukset",
|
||||
"light": "Vaalea",
|
||||
"dark": "Tumma"
|
||||
},
|
||||
"feedback_success": "Sähköposti avattu onnistuneesti",
|
||||
"feedback_fail": "Sähköpostipalvelin alhaalla",
|
||||
@ -304,8 +304,8 @@
|
||||
"create_a_new_account": "Luo uusi tili",
|
||||
"add_an_existing_account": "Lisää olemassa oleva tili",
|
||||
"accounts": "Tilit",
|
||||
"refer": "Refer & Earn",
|
||||
"qr": "QR Scan"
|
||||
"refer": "Suosittele ja tienaa",
|
||||
"qr": "QR-koodi"
|
||||
},
|
||||
"header": {
|
||||
"title": "Kirjaudu mukauttaaksesi syötettäsi",
|
||||
@ -338,7 +338,7 @@
|
||||
"limited_lastchar": "Tagi päättyy kirjaimeen tai numeroon",
|
||||
"setting_schedule": "Aikataulutus",
|
||||
"setting_reward": "Palkkio",
|
||||
"setting_reblog": "Reblog",
|
||||
"setting_reblog": "Jako",
|
||||
"setting_beneficiary": "Hyötyjä",
|
||||
"setting_thumb": "Aseta pikkukuva",
|
||||
"reward_default": "Oletus 50 % / 50 %",
|
||||
@ -374,16 +374,16 @@
|
||||
"draft_save_title": "Tallennetaan luonnosta",
|
||||
"draft_update": "Päivitä nykyinen luonnos",
|
||||
"draft_save_new": "Tallenna uutena luonnoksena",
|
||||
"label": "Label",
|
||||
"enter_label_placeholder": "Enter Label (Optional)",
|
||||
"label": "Nimike",
|
||||
"enter_label_placeholder": "Syötä Tunniste (Valinnainen)",
|
||||
"url": "URL",
|
||||
"enter_url_placeholder": "Enter URL",
|
||||
"link_type_text": "Type of Link",
|
||||
"preview": "Preview",
|
||||
"invalid_url_error": "Please insert valid url",
|
||||
"plain": "Plain",
|
||||
"enter_url_placeholder": "Kirjoita URL-osoite",
|
||||
"link_type_text": "Linkin tyyppi",
|
||||
"preview": "Esikatselu",
|
||||
"invalid_url_error": "Syötä kelvollinen URL",
|
||||
"plain": "Yksinkertainen",
|
||||
"video": "Video",
|
||||
"image": "Image"
|
||||
"image": "Kuva"
|
||||
},
|
||||
"snippets": {
|
||||
"label_no_snippets": "Katkelmia ei löytynyt",
|
||||
@ -406,7 +406,7 @@
|
||||
"title": "Ladatut kuvat",
|
||||
"title_remove_confirmation": "Poista kuva",
|
||||
"btn_add": "Kuva",
|
||||
"btn_insert": "INSERT",
|
||||
"btn_insert": "Lisää",
|
||||
"btn_delete": "POISTA",
|
||||
"message_failed": "Kuvan lataaminen epäonnistui"
|
||||
},
|
||||
@ -486,8 +486,8 @@
|
||||
"restart_ecency": "Haluatko käynnistää Ecencyn uudelleen?",
|
||||
"restart_ecency_desc": "Muutosten käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||
"invalid_response": "Pyyntöä ei voitu käsitellä, Yritä myöhemmin uudelleen.",
|
||||
"wallet_updating": "Wallet update in progress, try again as update finishes",
|
||||
"claim_failed": "Failed to claim rewards, {message}\nTry again or write to support@ecency.com"
|
||||
"wallet_updating": "Lompakon päivitys käynnissä, yritä uudelleen päivityksen valmistuessa",
|
||||
"claim_failed": "Palkintojen lunastaminen epäonnistui, {message}\nYritä uudelleen tai kirjoita osoitteeseen support@ecency.com"
|
||||
},
|
||||
"post": {
|
||||
"reblog_alert": "Haluatko varmasti jakaa?",
|
||||
@ -567,10 +567,10 @@
|
||||
"promote": "korosta",
|
||||
"boost": "tehosta",
|
||||
"report": "raportoi",
|
||||
"pin-blog": "Pin to blog",
|
||||
"unpin-blog": "Unpin from blog",
|
||||
"pin-community": "Pin to community",
|
||||
"unpin-community": "Unpin from community"
|
||||
"pin-blog": "Kiinnitä blogiin",
|
||||
"unpin-blog": "Irrota blogista",
|
||||
"pin-community": "Kiinnitä yhteisölle",
|
||||
"unpin-community": "Poista kiinnitys yhteisöstä"
|
||||
},
|
||||
"deep_link": {
|
||||
"no_existing_user": "Käyttäjää ei ole",
|
||||
@ -613,7 +613,7 @@
|
||||
"stop_information": "Haluatko varmasti poistua?",
|
||||
"percent": "Prosentti",
|
||||
"auto_vests": "Automaattiset Ansainnat",
|
||||
"vests": "Vests",
|
||||
"vests": "Annot",
|
||||
"save": "TALLENNA",
|
||||
"percent_information": "Prosenttitieto",
|
||||
"next": "SEURAAVA",
|
||||
@ -624,7 +624,7 @@
|
||||
"stop": "Lopeta",
|
||||
"sc_power_down_error": "Tätä ominaisuutta ei ole vielä toteutettu Hivesignerin kirjautumisessa",
|
||||
"address_view": "Näytä osoite",
|
||||
"already_delegated": "Already delegated to ",
|
||||
"already_delegated": "On jo delegoitu ",
|
||||
"remain_hp": "HP jäljellä",
|
||||
"account_detail_head": "Tilin tiedot",
|
||||
"account_detail_subhead": "Anna HIVE Power -valtuutuksen saajan käyttäjänimi",
|
||||
@ -638,13 +638,13 @@
|
||||
"username_alert": "Virhe käyttäjänimessä!",
|
||||
"username_alert_detail": "Valitse toinen käyttäjänimi",
|
||||
"power_down": "Power Down",
|
||||
"power_down_amount_head": "Withdraw Amount",
|
||||
"power_down_amount_subhead": "Enter amount for powering down hive power",
|
||||
"withdraw_accounts": "Withdraw Accounts",
|
||||
"amount_hp": "Amount (HP)",
|
||||
"powering_down": "Powering Down",
|
||||
"powering_down_subheading": "You are currently powering down.",
|
||||
"powering_down_info": "Next power down is in {days} days, {hp} HIVE"
|
||||
"power_down_amount_head": "Nostomäärä",
|
||||
"power_down_amount_subhead": "Syötä hive power tehonalennuksen määrä",
|
||||
"withdraw_accounts": "Nostotilit",
|
||||
"amount_hp": "Määrä (HP)",
|
||||
"powering_down": "Tehon alentaminen",
|
||||
"powering_down_subheading": "Olet alentamassa tehoa.",
|
||||
"powering_down_info": "Seuraavaan tehonalennukseen on {days} päivää, {hp} HIVE"
|
||||
},
|
||||
"boost": {
|
||||
"title": "Hanki pisteitä",
|
||||
@ -744,7 +744,7 @@
|
||||
"mute": "HILJENNÄ / ESTÄ",
|
||||
"unmute": "POISTA HILJENNYS / ESTO",
|
||||
"report": "ILMIANNA KÄYTTÄJÄ",
|
||||
"delegate": "DELEGATE HIVE POWER"
|
||||
"delegate": "VALTUUTA HIVE POWER"
|
||||
},
|
||||
"communities": {
|
||||
"joined": "Jäsenyys",
|
||||
@ -792,18 +792,18 @@
|
||||
"load_draft_tooltip": "Lataa viimeisin luonnoksesi tähän"
|
||||
},
|
||||
"refer": {
|
||||
"refer_earn": "Refer & Earn",
|
||||
"refer": "Refer",
|
||||
"rewarded": "Referral points rewarded",
|
||||
"not_rewarded": "Referral reward pending",
|
||||
"delegate_hp": "Delegate HP",
|
||||
"earned": "Earned Points",
|
||||
"pending": "Pending Points",
|
||||
"empty_text": "Refer your loved ones today and earn free points"
|
||||
"refer_earn": "Suosittele ja tienaa",
|
||||
"refer": "Suosittele",
|
||||
"rewarded": "Suosituspisteitä saatu",
|
||||
"not_rewarded": "Suosituspalkkio odottaa",
|
||||
"delegate_hp": "Valtuuta HP",
|
||||
"earned": "Ansaitut Pisteet",
|
||||
"pending": "Odottavat Pisteet",
|
||||
"empty_text": "Suosittele tutuillesi ja tienaa ilmaisia pisteitä"
|
||||
},
|
||||
"qr": {
|
||||
"qr_scan": "QR Scan",
|
||||
"open": "Open URL",
|
||||
"detected_url": "Detected URL"
|
||||
"qr_scan": "QR-koodi",
|
||||
"open": "Avaa URL",
|
||||
"detected_url": "Havaittu URL"
|
||||
}
|
||||
}
|
||||
|
@ -271,9 +271,11 @@ class ApplicationContainer extends Component {
|
||||
};
|
||||
|
||||
//change app theme on the fly
|
||||
_appearanceChangeListener = ({ colorScheme }) => {
|
||||
console.log('OS color scheme changed', colorScheme);
|
||||
_appearanceChangeListener = () => {
|
||||
const { dispatch } = this.props;
|
||||
|
||||
//workaround for bug with Appearece package: https://github.com/facebook/react-native/issues/28525#issuecomment-841812810
|
||||
const colorScheme = Appearance.getColorScheme();
|
||||
getTheme().then((darkThemeSetting) => {
|
||||
if (darkThemeSetting === null) {
|
||||
dispatch(isDarkTheme(colorScheme === 'dark'));
|
||||
|
@ -23,7 +23,6 @@ class NotificationContainer extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
notifications: [],
|
||||
notificationsMap: new Map(),
|
||||
lastNotificationId: null,
|
||||
isRefreshing: true,
|
||||
@ -41,7 +40,7 @@ class NotificationContainer extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
_getActivities = (type = 'activities', loadMore = false) => {
|
||||
_getActivities = (type = 'activities', loadMore = false, loadUnread = false) => {
|
||||
const { lastNotificationId, endOfNotification, isLoading, notificationsMap } = this.state;
|
||||
const since = loadMore ? lastNotificationId : null;
|
||||
|
||||
@ -49,7 +48,7 @@ class NotificationContainer extends Component {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!endOfNotification || !loadMore) {
|
||||
if (!endOfNotification || !loadMore || loadUnread) {
|
||||
this.setState({
|
||||
isRefreshing: !loadMore,
|
||||
isLoading: true,
|
||||
@ -65,8 +64,12 @@ class NotificationContainer extends Component {
|
||||
isLoading: false,
|
||||
});
|
||||
} else {
|
||||
console.log('');
|
||||
const stateNotifications = notificationsMap.get(type) || [];
|
||||
const _notifications = loadMore
|
||||
? unionBy(notificationsMap.get(type) || [], res, 'id')
|
||||
? unionBy(stateNotifications, res, 'id')
|
||||
: loadUnread
|
||||
? unionBy(res, stateNotifications, 'id')
|
||||
: res;
|
||||
notificationsMap.set(type, _notifications);
|
||||
this.setState({
|
||||
@ -133,7 +136,7 @@ class NotificationContainer extends Component {
|
||||
|
||||
_readAllNotification = () => {
|
||||
const { dispatch, intl, isConnected, currentAccount, pinCode } = this.props;
|
||||
const { notifications } = this.state;
|
||||
const { notificationsMap } = this.state;
|
||||
|
||||
if (!isConnected) {
|
||||
return;
|
||||
@ -143,7 +146,11 @@ class NotificationContainer extends Component {
|
||||
|
||||
markNotifications()
|
||||
.then(() => {
|
||||
const updatedNotifications = notifications.map((item) => ({ ...item, read: 1 }));
|
||||
notificationsMap.forEach((notifications, key) => {
|
||||
const updatedNotifications = notifications.map((item) => ({ ...item, read: 1 }));
|
||||
notificationsMap.set(key, updatedNotifications);
|
||||
});
|
||||
|
||||
dispatch(updateUnreadActivityCount(0));
|
||||
markHiveNotifications(currentAccount, pinCode)
|
||||
.then(() => {
|
||||
@ -152,7 +159,7 @@ class NotificationContainer extends Component {
|
||||
.catch((err) => {
|
||||
bugsnapInstance.notify(err);
|
||||
});
|
||||
this.setState({ notifications: updatedNotifications, isRefreshing: false });
|
||||
this.setState({ notificationsMap, isRefreshing: false });
|
||||
})
|
||||
.catch(() => {
|
||||
Alert.alert(
|
||||
@ -174,14 +181,25 @@ class NotificationContainer extends Component {
|
||||
};
|
||||
|
||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
||||
const { selectedFilter } = this.state;
|
||||
const { selectedFilter, notificationsMap } = this.state;
|
||||
const { currentAccount } = this.props;
|
||||
if (
|
||||
currentAccount &&
|
||||
nextProps.currentAccount &&
|
||||
nextProps.currentAccount.name !== currentAccount.name
|
||||
) {
|
||||
this.setState({ endOfNotification: false }, () => this._getActivities(selectedFilter));
|
||||
if (currentAccount && nextProps.currentAccount) {
|
||||
if (nextProps.currentAccount.name !== currentAccount.name) {
|
||||
this.setState(
|
||||
{
|
||||
endOfNotification: false,
|
||||
notificationsMap: new Map(),
|
||||
},
|
||||
() => this._getActivities(selectedFilter),
|
||||
);
|
||||
} else if (
|
||||
nextProps.currentAccount.unread_activity_count > currentAccount.unread_activity_count
|
||||
) {
|
||||
notificationsMap.forEach((value, key) => {
|
||||
console.log('fetching new activities for ', key);
|
||||
this._getActivities(key, false, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,7 @@ import { isRTL } from '../../../utils/I18nUtils';
|
||||
|
||||
export default EStyleSheet.create({
|
||||
cardContainer: {
|
||||
backgroundColor:'$primaryLightBackground',
|
||||
backgroundColor: '$primaryLightBackground',
|
||||
marginVertical: 8,
|
||||
marginHorizontal: 16,
|
||||
borderRadius: 12,
|
||||
@ -14,37 +14,37 @@ export default EStyleSheet.create({
|
||||
borderColor: "$primaryLightBackground",
|
||||
} as ViewStyle,
|
||||
|
||||
cardHeader:{
|
||||
flexDirection:'row',
|
||||
alignItems:'center',
|
||||
cardHeader: {
|
||||
flexDirection: 'row',
|
||||
alignItems: 'center',
|
||||
paddingHorizontal: 16,
|
||||
paddingTop:16,
|
||||
paddingTop: 16,
|
||||
} as ViewStyle,
|
||||
|
||||
cardTitleContainer:{
|
||||
cardTitleContainer: {
|
||||
marginHorizontal: 8,
|
||||
flex:1,
|
||||
flex: 1,
|
||||
} as ViewStyle,
|
||||
|
||||
cardValuesContainer:{
|
||||
cardValuesContainer: {
|
||||
marginHorizontal: 8,
|
||||
|
||||
justifyContent:'flex-end'
|
||||
|
||||
justifyContent: 'flex-end'
|
||||
} as ViewStyle,
|
||||
|
||||
claimContainer:{
|
||||
flexDirection:'row',
|
||||
justifyContent:'center',
|
||||
alignItems:'center',
|
||||
marginTop:8
|
||||
claimContainer: {
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
marginTop: 8
|
||||
} as ViewStyle,
|
||||
|
||||
claimBtn:{
|
||||
flexDirection: 'row',
|
||||
paddingHorizontal: 16
|
||||
claimBtn: {
|
||||
flexDirection: 'row',
|
||||
paddingHorizontal: 16
|
||||
} as ViewStyle,
|
||||
|
||||
claimBtnTitle:{
|
||||
claimBtnTitle: {
|
||||
color: '$pureWhite',
|
||||
fontSize: 14,
|
||||
fontWeight: 'bold',
|
||||
@ -62,16 +62,16 @@ export default EStyleSheet.create({
|
||||
height: 24,
|
||||
} as ViewStyle,
|
||||
|
||||
logo:{
|
||||
height:24,
|
||||
width:24,
|
||||
borderRadius:12,
|
||||
backgroundColor:'$primaryBlue',
|
||||
logo: {
|
||||
height: 24,
|
||||
width: 24,
|
||||
borderRadius: 12,
|
||||
backgroundColor: '$primaryBlue',
|
||||
} as ImageStyle,
|
||||
|
||||
menuIcon:{
|
||||
menuIcon: {
|
||||
color: '$primaryBlue',
|
||||
paddingLeft:12,
|
||||
paddingLeft: 12,
|
||||
} as ViewStyle,
|
||||
|
||||
header: {
|
||||
@ -80,52 +80,56 @@ export default EStyleSheet.create({
|
||||
dotStyle: {
|
||||
backgroundColor: '$primaryDarkText',
|
||||
},
|
||||
chartContainer:{
|
||||
height:112,
|
||||
chartContainer: {
|
||||
height: 112,
|
||||
},
|
||||
cardFooter:{
|
||||
position:'absolute',
|
||||
bottom:8,
|
||||
left: isRTL() ? 16 : 76,
|
||||
right: isRTL() ? 76 : 16,
|
||||
paddingTop:8,
|
||||
flexDirection: isRTL() ? "row-reverse" : "row",
|
||||
justifyContent:'space-between',
|
||||
borderColor:'$chartText',
|
||||
borderTopWidth:EStyleSheet.hairlineWidth,
|
||||
cardFooter: {
|
||||
position: 'absolute',
|
||||
bottom: 8,
|
||||
left: isRTL() ? 16 : 76,
|
||||
right: isRTL() ? 76 : 16,
|
||||
paddingTop: 8,
|
||||
flexDirection: isRTL() ? "row-reverse" : "row",
|
||||
justifyContent: 'space-between',
|
||||
borderColor: '$chartText',
|
||||
borderTopWidth: EStyleSheet.hairlineWidth,
|
||||
} as ViewStyle,
|
||||
textDiffPositive:{
|
||||
fontSize:18,
|
||||
textDiffPositive: {
|
||||
fontSize: 18,
|
||||
color: '$primaryGreen',
|
||||
textAlign: 'left',
|
||||
} as TextStyle,
|
||||
textDiffNegative:{
|
||||
fontSize:16,
|
||||
textDiffNegative: {
|
||||
fontSize: 16,
|
||||
color: '$primaryRed',
|
||||
textAlign: 'left',
|
||||
} as TextStyle,
|
||||
textCurValue:{
|
||||
fontSize:16,
|
||||
textCurValue: {
|
||||
fontSize: 16,
|
||||
color: '$primaryBlack',
|
||||
fontWeight: '300',
|
||||
textAlign: 'left',
|
||||
} as TextStyle,
|
||||
textTitle:{
|
||||
fontSize:16,
|
||||
textTitle: {
|
||||
fontSize: 16,
|
||||
color: '$primaryBlack',
|
||||
fontWeight: '500',
|
||||
textAlign: 'left',
|
||||
},
|
||||
textSubtitle:{
|
||||
fontSize:14,
|
||||
textSubtitle: {
|
||||
fontSize: 14,
|
||||
color: '$primaryDarkText',
|
||||
fontWeight: '300',
|
||||
textAlign: 'left',
|
||||
} as TextStyle,
|
||||
textSubtitleRight:{
|
||||
fontSize:14,
|
||||
textSubtitleRight: {
|
||||
fontSize: 14,
|
||||
color: '$primaryDarkText',
|
||||
fontWeight: '300',
|
||||
textAlign:'right'
|
||||
} as TextStyle
|
||||
});
|
||||
textAlign: 'right'
|
||||
} as TextStyle,
|
||||
claimActivityIndicator: {
|
||||
marginLeft: 16
|
||||
} as ViewStyle
|
||||
|
||||
});
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { View, Text, Dimensions, TouchableOpacity } from 'react-native';
|
||||
import { View, Text, Dimensions, TouchableOpacity, ActivityIndicator } from 'react-native';
|
||||
import React, { ComponentType, Fragment, useEffect, useState } from 'react';
|
||||
import styles from './children.styles';
|
||||
import { Icon, MainButton, SimpleChart } from '../../../components';
|
||||
@ -18,6 +18,7 @@ export interface CoinCardProps {
|
||||
unclaimedRewards: string;
|
||||
enableBuy?: boolean;
|
||||
isClaiming?: boolean;
|
||||
isLoading?: boolean;
|
||||
footerComponent: ComponentType<any>
|
||||
onCardPress: () => void;
|
||||
onClaimPress: () => void;
|
||||
@ -37,6 +38,7 @@ export const CoinCard = ({
|
||||
unclaimedRewards,
|
||||
enableBuy,
|
||||
isClaiming,
|
||||
isLoading,
|
||||
onCardPress,
|
||||
onClaimPress,
|
||||
}: CoinCardProps) => {
|
||||
@ -83,11 +85,20 @@ export const CoinCard = ({
|
||||
const btnTitle = unclaimedRewards
|
||||
? unclaimedRewards
|
||||
: intl.formatMessage({ id: `wallet.${id}.buy` });
|
||||
|
||||
const _rightComponent = isLoading ? (
|
||||
<ActivityIndicator color={EStyleSheet.value('$pureWhite')} style={styles.claimActivityIndicator} />
|
||||
) : (
|
||||
<View style={styles.claimIconWrapper}>
|
||||
<Icon name="add" iconType="MaterialIcons" color={EStyleSheet.value('$primaryBlue')} size={23} />
|
||||
</View>
|
||||
)
|
||||
|
||||
return (
|
||||
<View style={styles.claimContainer}>
|
||||
<MainButton
|
||||
isLoading={isClaiming && claimExpected}
|
||||
isDisable={isClaiming && claimExpected}
|
||||
isDisable={isLoading || (isClaiming && claimExpected)}
|
||||
style={styles.claimBtn}
|
||||
height={50}
|
||||
onPress={_onClaimPress}
|
||||
@ -96,9 +107,7 @@ export const CoinCard = ({
|
||||
<Text style={styles.claimBtnTitle}>
|
||||
{btnTitle}
|
||||
</Text>
|
||||
<View style={styles.claimIconWrapper}>
|
||||
<Icon name="add" iconType="MaterialIcons" color={EStyleSheet.value('$primaryBlue')} size={23} />
|
||||
</View>
|
||||
{_rightComponent}
|
||||
</Fragment>
|
||||
</MainButton>
|
||||
</View>
|
||||
|
@ -69,7 +69,10 @@ const WalletScreen = ({navigation}) => {
|
||||
//side-effects
|
||||
useEffect(()=>{
|
||||
AppState.addEventListener('change', _handleAppStateChange);
|
||||
_fetchData();
|
||||
|
||||
//if coinsData is empty, initilise wallet without a fresh acount fetch
|
||||
_fetchData(Object.keys(coinsData).length?true:false);
|
||||
|
||||
|
||||
return _cleanup;
|
||||
},[])
|
||||
@ -229,6 +232,7 @@ const WalletScreen = ({navigation}) => {
|
||||
unclaimedRewards={coinData.unclaimedBalance}
|
||||
enableBuy={!coinData.unclaimedBalance && item.id === COIN_IDS.ECENCY}
|
||||
isClaiming={isClaiming}
|
||||
isLoading={isLoading}
|
||||
onCardPress={_onCardPress}
|
||||
onClaimPress={_onClaimPress}
|
||||
footerComponent={index === 0 && <HorizontalIconList options={POINTS} optionsKeys={POINTS_KEYS} />}
|
||||
|
Loading…
Reference in New Issue
Block a user