Add Support screen (#1171)

* Update strings.ftl

* Add drawer item for Support

* Update strings.ftl

* Change key

* UI for Support screen

* Link out to websites on button presses

* Restyle screen header

* Eslint settings to get rid of an error

* Use react-native-store-review to ask for review

* Not needed use of .tsx in import

* Remove comments
This commit is contained in:
Johannes Klein
2024-02-25 22:33:04 +01:00
committed by GitHub
parent 61754f1eb1
commit 4877c1a369
12 changed files with 170 additions and 29 deletions

View File

@@ -130,7 +130,10 @@ module.exports = {
ignorePatterns: ["/coverage/*", "/vendor/*"],
settings: {
"import/resolver": {
"babel-module": { allowExistingDirectories: true }
"babel-module": { allowExistingDirectories: true },
node: {
extensions: [".js", ".jsx", ".ts", ".tsx"]
}
}
}
};

View File

@@ -37,6 +37,8 @@ format.bracket_spacing=false
module.file_ext=.js
module.file_ext=.json
module.file_ext=.ios.js
module.file_ext=.ts
module.file_ext=.tsx
munge_underscores=true
@@ -53,9 +55,6 @@ suppress_type=$FlowFixMe
suppress_type=$FlowFixMeProps
suppress_type=$FlowFixMeState
module.file_ext=.ts
module.file_ext=.tsx
[lints]
sketchy-null-number=warn
sketchy-null-mixed=warn

View File

@@ -448,6 +448,8 @@ PODS:
- React-RCTImage
- RNShareMenu (6.0.0):
- React
- RNStoreReview (0.4.3):
- React-Core
- RNSVG (13.14.0):
- React-Core
- RNVectorIcons (9.2.0):
@@ -530,6 +532,7 @@ DEPENDENCIES:
- RNReanimated (from `../node_modules/react-native-reanimated`)
- RNScreens (from `../node_modules/react-native-screens`)
- RNShareMenu (from `../node_modules/react-native-share-menu`)
- RNStoreReview (from `../node_modules/react-native-store-review`)
- RNSVG (from `../node_modules/react-native-svg`)
- RNVectorIcons (from `../node_modules/react-native-vector-icons`)
- VisionCamera (from `../node_modules/react-native-vision-camera`)
@@ -676,6 +679,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-screens"
RNShareMenu:
:path: "../node_modules/react-native-share-menu"
RNStoreReview:
:path: "../node_modules/react-native-store-review"
RNSVG:
:path: "../node_modules/react-native-svg"
RNVectorIcons:
@@ -757,6 +762,7 @@ SPEC CHECKSUMS:
RNReanimated: f186e85d9f28c9383d05ca39e11dd194f59093ec
RNScreens: d3675ab2878704de70c9dae57fa5d024802404cc
RNShareMenu: cb9dac548c8bf147d06f0bf07296ad51ea9f5fc3
RNStoreReview: 31dbfd0dac2eea9675f0b84f1dd3261c2110c337
RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396
RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8
VisionCamera: 523b49054bee9dace64189ab6631cb41e8b83fe0

11
package-lock.json generated
View File

@@ -86,6 +86,7 @@
"react-native-screens": "^3.21.1",
"react-native-sensitive-info": "^6.0.0-alpha.9",
"react-native-share-menu": "^6.0.0",
"react-native-store-review": "^0.4.3",
"react-native-svg": "^13.14.0",
"react-native-svg-transformer": "^1.1.0",
"react-native-uuid": "^2.0.1",
@@ -23006,6 +23007,11 @@
"resolved": "https://registry.npmjs.org/react-native-share-menu/-/react-native-share-menu-6.0.0.tgz",
"integrity": "sha512-KdmRnqjI/B2MigSxGmhbYJ3WMJxKXj+0c47ANcVZ/PTzc2vtz6d1r4KQJgkBImXgNC+vowpuD2UGdPllxadr2A=="
},
"node_modules/react-native-store-review": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/react-native-store-review/-/react-native-store-review-0.4.3.tgz",
"integrity": "sha512-RSQ6vx2j4p41GwTqNv2VV7yold62j5qDbGEBAjFi6gkXMrMpxFMg+82FPjbh6012tqv6Ebzwfqw6S4m4d7sddw=="
},
"node_modules/react-native-svg": {
"version": "13.14.0",
"resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.14.0.tgz",
@@ -42843,6 +42849,11 @@
"resolved": "https://registry.npmjs.org/react-native-share-menu/-/react-native-share-menu-6.0.0.tgz",
"integrity": "sha512-KdmRnqjI/B2MigSxGmhbYJ3WMJxKXj+0c47ANcVZ/PTzc2vtz6d1r4KQJgkBImXgNC+vowpuD2UGdPllxadr2A=="
},
"react-native-store-review": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/react-native-store-review/-/react-native-store-review-0.4.3.tgz",
"integrity": "sha512-RSQ6vx2j4p41GwTqNv2VV7yold62j5qDbGEBAjFi6gkXMrMpxFMg+82FPjbh6012tqv6Ebzwfqw6S4m4d7sddw=="
},
"react-native-svg": {
"version": "13.14.0",
"resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.14.0.tgz",

View File

@@ -111,6 +111,7 @@
"react-native-screens": "^3.21.1",
"react-native-sensitive-info": "^6.0.0-alpha.9",
"react-native-share-menu": "^6.0.0",
"react-native-store-review": "^0.4.3",
"react-native-svg": "^13.14.0",
"react-native-svg-transformer": "^1.1.0",
"react-native-uuid": "^2.0.1",

View File

@@ -1,4 +1,4 @@
export { default as ActivityAnimation } from "./ActivityAnimation/ActivityAnimation.tsx";
export { default as ActivityAnimation } from "./ActivityAnimation/ActivityAnimation";
export { default as ActivityCount } from "./ActivityCount/ActivityCount";
export { default as CommentsCount } from "./ActivityCount/CommentsCount";
export { default as IdentificationsCount } from "./ActivityCount/IdentificationsCount";

View File

@@ -0,0 +1,72 @@
// @flow
import {
Body2, Button, Heading4, ScrollViewWrapper
} from "components/SharedComponents";
import { View } from "components/styledComponents";
import { t } from "i18next";
import type { Node } from "react";
import React from "react";
import { Alert, Linking } from "react-native";
import * as StoreReview from "react-native-store-review";
const Support = (): Node => {
const onDonatePress = async ( ) => {
const url = "https://inaturalist.org/donate";
const supported = await Linking.canOpenURL( url );
if ( supported ) {
await Linking.openURL( url );
} else {
Alert.alert( `Don't know how to open this URL: ${url}` );
}
};
const onShopPress = async ( ) => {
const url = "https://inaturalist.threadless.com";
const supported = await Linking.canOpenURL( url );
if ( supported ) {
await Linking.openURL( url );
} else {
Alert.alert( `Don't know how to open this URL: ${url}` );
}
};
const onReviewPress = ( ) => {
StoreReview.requestReview( );
};
return (
<ScrollViewWrapper>
<View className="p-4">
<Heading4 className="mb-3">{t( "DONATE-TO-INATURALIST" )}</Heading4>
<Body2 className="mb-5">{t( "Your-donation-to-iNaturalist" )}</Body2>
<Body2 className="mb-5">{t( "iNaturalist-is-a-501" )}</Body2>
<Button
className="mb-8"
level="focus"
text={t( "DONATE-TO-INATURALIST" )}
onPress={() => onDonatePress( )}
/>
<Heading4 className="mb-3">{t( "INATURALIST-STORE" )}</Heading4>
<Body2 className="mb-5">
{t( "You-can-also-check-out-merchandise" )}
</Body2>
<Button
className="mb-8"
level="neutral"
text={t( "SHOP-INATURALIST-MERCH" )}
onPress={() => onShopPress( )}
/>
<Heading4 className="mb-3">{t( "LEAVE-US-A-REVIEW" )}</Heading4>
<Button
className="mb-8"
level="neutral"
text={t( "REVIEW-INATURALIST" )}
onPress={() => onReviewPress( )}
/>
</View>
</ScrollViewWrapper>
);
};
export default Support;

View File

@@ -328,6 +328,8 @@ Display-Name = Display Name
Do-not-collect-stability-and-usage-data-using-third-party-services = Do not collect stability and usage data using third-party services
DONATE-TO-INATURALIST = DONATE TO INATURALIST
# Label for a button the user taps when a task is complete
DONE = DONE
@@ -472,6 +474,10 @@ iNaturalist-Network-Affiliation = iNaturalist Network Affiliation
iNaturalist-is-a-community-of-naturalists = iNaturalist is a community of naturalists that works together to create and identify wild biodiversity observations.
iNaturalist-is-a-501 = iNaturalist is a 501(c)(3) non-profit in the United States of America (Tax ID/EIN 92-1296468).
INATURALIST-STORE = INATURALIST STORE
Insects = Insects
Introduced = Introduced
@@ -494,6 +500,8 @@ Language-Locale = Language/Locale
# Shows date user last active on iNaturalist on user profile
Last-Active-date = Last Active: {$date}
LEAVE-US-A-REVIEW = LEAVE US A REVIEW!
Licensing = Licensing
Location = Location
@@ -815,6 +823,8 @@ RESET-PASSWORD = RESET PASSWORD
Return-to-login = Return to login
REVIEW-INATURALIST = REVIEW INATURALIST
Reviewed = Reviewed
Reviewed-observations-only = Reviewed observations only
@@ -869,6 +879,8 @@ Share-location = Share Location
Share-location = Share Location
SHOP-INATURALIST-MERCH = SHOP INATURALIST MERCH
Sign-out = Sign out
Sign-Up = Sign Up
@@ -902,6 +914,10 @@ ESTABLISHMENT-MEANS-header = ESTABLISHMENT MEANS
Stay-on-this-screen = Stay on this screen while your location loads.
Support = Support
SUPPORT = SUPPORT
Syncing = Syncing...
Tap-to-search-for-taxa = Tap to search for taxa
@@ -1088,6 +1104,8 @@ Take-a-photo-with-your-camera = Take a photo with your camera
Upload-a-photo-from-your-gallery = Upload a photo from your gallery
Record-a-sound = Record a sound
You-can-also-check-out-merchandise = You can also check out merchandise for iNaturalist and Seek at our store below!
You-can-also-explore-existing-observations = You can also explore existing observations on iNaturalist to discover what's around you.
You-changed-filters-will-be-discarded = You changed filters, but they were not applied to your explore search results.
@@ -1108,6 +1126,9 @@ You-will-lose-all-existing-observations = {$count ->
You-can-still-share-the-file =
You can still share the file with another app. If you can email it, please send it to { $email }
Your-donation-to-iNaturalist =
Your donation to iNaturalist supports the improvement and stability of the mobile apps and website that connects millions of people to nature and enables the protection of biodiversity worldwide!
Zoom-in-as-much-as-possible-to-improve =
Zoom in as much as possible to improve location accuracy and get better identifications.
@@ -1446,7 +1467,6 @@ IDENTIFY = IDENTIFY
PROJECTS = PROJECTS
HELP = HELP
BLOG = BLOG
DONATE = DONATE
SETTINGS = SETTINGS
LOG-OUT = LOG OUT
Log-out = Log out

View File

@@ -185,6 +185,7 @@
"Display": "Display",
"Display-Name": "Display Name",
"Do-not-collect-stability-and-usage-data-using-third-party-services": "Do not collect stability and usage data using third-party services",
"DONATE-TO-INATURALIST": "DONATE TO INATURALIST",
"DONE": {
"comment": "Label for a button the user taps when a task is complete",
"val": "DONE"
@@ -276,6 +277,8 @@
"iNaturalist-Applications": "iNaturalist Applications",
"iNaturalist-Network-Affiliation": "iNaturalist Network Affiliation",
"iNaturalist-is-a-community-of-naturalists": "iNaturalist is a community of naturalists that works together to create and identify wild biodiversity observations.",
"iNaturalist-is-a-501": "iNaturalist is a 501(c)(3) non-profit in the United States of America (Tax ID/EIN 92-1296468).",
"INATURALIST-STORE": "INATURALIST STORE",
"Insects": "Insects",
"Introduced": "Introduced",
"Invalid-login": {
@@ -297,6 +300,7 @@
"comment": "Shows date user last active on iNaturalist on user profile",
"val": "Last Active: { $date }"
},
"LEAVE-US-A-REVIEW": "LEAVE US A REVIEW!",
"Licensing": "Licensing",
"Location": "Location",
"LOCATION": "LOCATION",
@@ -542,6 +546,7 @@
"val": "RESET PASSWORD"
},
"Return-to-login": "Return to login",
"REVIEW-INATURALIST": "REVIEW INATURALIST",
"Reviewed": "Reviewed",
"Reviewed-observations-only": "Reviewed observations only",
"Reviewed-only": "Reviewed only",
@@ -567,6 +572,7 @@
"Share": "Share",
"SHARE-DEBUG-LOGS": "SHARE DEBUG LOGS",
"Share-location": "Share Location",
"SHOP-INATURALIST-MERCH": "SHOP INATURALIST MERCH",
"Sign-out": "Sign out",
"Sign-Up": "Sign Up",
"some-rights-reserved": {
@@ -591,6 +597,8 @@
"val": "ESTABLISHMENT MEANS"
},
"Stay-on-this-screen": "Stay on this screen while your location loads.",
"Support": "Support",
"SUPPORT": "SUPPORT",
"Syncing": "Syncing...",
"Tap-to-search-for-taxa": "Tap to search for taxa",
"Taxon": "Taxon",
@@ -694,6 +702,7 @@
"Take-a-photo-with-your-camera": "Take a photo with your camera",
"Upload-a-photo-from-your-gallery": "Upload a photo from your gallery",
"Record-a-sound": "Record a sound",
"You-can-also-check-out-merchandise": "You can also check out merchandise for iNaturalist and Seek at our store below!",
"You-can-also-explore-existing-observations": "You can also explore existing observations on iNaturalist to discover what's around you.",
"You-changed-filters-will-be-discarded": "You changed filters, but they were not applied to your explore search results.",
"You-denied-iNaturalist-permission-to-do-that": {
@@ -704,6 +713,7 @@
"You-must-be-logged-in-to-view-messages": "You must be logged in to view messages",
"You-will-lose-all-existing-observations": "{ $count ->\n [one] You will lose all existing observations. Would you like to discard 1 observation?\n *[other] You will lose all existing observations. Would you like to discard { $count } observations?\n}",
"You-can-still-share-the-file": "You can still share the file with another app. If you can email it, please send it to { $email }",
"Your-donation-to-iNaturalist": "Your donation to iNaturalist supports the improvement and stability of the mobile apps and website that connects millions of people to nature and enables the protection of biodiversity worldwide!",
"Zoom-in-as-much-as-possible-to-improve": "Zoom in as much as possible to improve location accuracy and get better identifications.",
"Your-location-uncertainty-is-over-x-km": "Your location uncertainty is over { $x } km, which is too high to be helpful to identifiers. Edit the location and zoom in until the accuracy circle turns green and is centered on where you observed the organism.",
"Category-leading": {
@@ -1011,7 +1021,6 @@
"IDENTIFY": "IDENTIFY",
"HELP": "HELP",
"BLOG": "BLOG",
"DONATE": "DONATE",
"SETTINGS": "SETTINGS",
"LOG-OUT": "LOG OUT",
"Log-out": "Log out",

View File

@@ -328,6 +328,8 @@ Display-Name = Display Name
Do-not-collect-stability-and-usage-data-using-third-party-services = Do not collect stability and usage data using third-party services
DONATE-TO-INATURALIST = DONATE TO INATURALIST
# Label for a button the user taps when a task is complete
DONE = DONE
@@ -472,6 +474,10 @@ iNaturalist-Network-Affiliation = iNaturalist Network Affiliation
iNaturalist-is-a-community-of-naturalists = iNaturalist is a community of naturalists that works together to create and identify wild biodiversity observations.
iNaturalist-is-a-501 = iNaturalist is a 501(c)(3) non-profit in the United States of America (Tax ID/EIN 92-1296468).
INATURALIST-STORE = INATURALIST STORE
Insects = Insects
Introduced = Introduced
@@ -494,6 +500,8 @@ Language-Locale = Language/Locale
# Shows date user last active on iNaturalist on user profile
Last-Active-date = Last Active: {$date}
LEAVE-US-A-REVIEW = LEAVE US A REVIEW!
Licensing = Licensing
Location = Location
@@ -815,6 +823,8 @@ RESET-PASSWORD = RESET PASSWORD
Return-to-login = Return to login
REVIEW-INATURALIST = REVIEW INATURALIST
Reviewed = Reviewed
Reviewed-observations-only = Reviewed observations only
@@ -869,6 +879,8 @@ Share-location = Share Location
Share-location = Share Location
SHOP-INATURALIST-MERCH = SHOP INATURALIST MERCH
Sign-out = Sign out
Sign-Up = Sign Up
@@ -902,6 +914,10 @@ ESTABLISHMENT-MEANS-header = ESTABLISHMENT MEANS
Stay-on-this-screen = Stay on this screen while your location loads.
Support = Support
SUPPORT = SUPPORT
Syncing = Syncing...
Tap-to-search-for-taxa = Tap to search for taxa
@@ -1088,6 +1104,8 @@ Take-a-photo-with-your-camera = Take a photo with your camera
Upload-a-photo-from-your-gallery = Upload a photo from your gallery
Record-a-sound = Record a sound
You-can-also-check-out-merchandise = You can also check out merchandise for iNaturalist and Seek at our store below!
You-can-also-explore-existing-observations = You can also explore existing observations on iNaturalist to discover what's around you.
You-changed-filters-will-be-discarded = You changed filters, but they were not applied to your explore search results.
@@ -1108,6 +1126,9 @@ You-will-lose-all-existing-observations = {$count ->
You-can-still-share-the-file =
You can still share the file with another app. If you can email it, please send it to { $email }
Your-donation-to-iNaturalist =
Your donation to iNaturalist supports the improvement and stability of the mobile apps and website that connects millions of people to nature and enables the protection of biodiversity worldwide!
Zoom-in-as-much-as-possible-to-improve =
Zoom in as much as possible to improve location accuracy and get better identifications.
@@ -1446,7 +1467,6 @@ IDENTIFY = IDENTIFY
PROJECTS = PROJECTS
HELP = HELP
BLOG = BLOG
DONATE = DONATE
SETTINGS = SETTINGS
LOG-OUT = LOG OUT
Log-out = Log out

View File

@@ -3,7 +3,9 @@ import About from "components/About";
import PlaceholderComponent from "components/PlaceholderComponent";
import Search from "components/Search/Search";
import Settings from "components/Settings/Settings";
import { Heading4 } from "components/SharedComponents";
import Mortal from "components/SharedComponents/Mortal";
import Support from "components/Support/Support";
import { t } from "i18next";
import {
hideHeader,
@@ -27,6 +29,8 @@ const BottomTabs = ( ) => {
const isOnline = useIsConnected( );
const renderTabBar = props => <CustomTabBarContainer {...props} isOnline={isOnline} />;
const supportTitle = () => <Heading4>{t( "SUPPORT" )}</Heading4>;
return (
<Mortal>
<Tab.Navigator
@@ -53,27 +57,23 @@ const BottomTabs = ( ) => {
component={Settings}
options={{ headerTitle: t( "Settings" ) }}
/>
<Tab.Screen
name="Support"
component={Support}
options={{
...showHeader,
headerTitle: supportTitle,
headerTitleAlign: "center"
}}
/>
<Tab.Screen
name="about"
component={About}
options={{ headerTitle: t( "About-iNaturalist" ) }}
/>
<Tab.Screen
name="help"
component={PlaceholderComponent}
/>
<Tab.Screen
name="Help"
component={PlaceholderComponent}
/>
<Tab.Screen
name="Blog"
component={PlaceholderComponent}
/>
<Tab.Screen
name="Donate"
component={PlaceholderComponent}
/>
<Tab.Screen name="help" component={PlaceholderComponent} />
<Tab.Screen name="Help" component={PlaceholderComponent} />
<Tab.Screen name="Blog" component={PlaceholderComponent} />
<Tab.Screen
name="ProjectsStackNavigator"
component={ProjectsStackNavigator}

View File

@@ -96,11 +96,11 @@ const CustomDrawerContent = ( { ...props }: Props ): Node => {
navigation: "about",
icon: "inaturalist"
},
// donate: {
// label: t( "DONATE" ),
// navigation: "Donate",
// icon: "heart"
// },
support: {
label: t( "SUPPORT" ),
navigation: "Support",
icon: "heart"
},
settings: {
label: t( "SETTINGS" ),
navigation: "settings",