Mirror — see github.com/blacksky-algorithms/blacksky.community
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

add stripe checkout and support page

+717 -173
+4
.env.example
··· 46 46 47 47 # live-events web worker URL 48 48 LIVE_EVENTS_DEV_URL= 49 + 50 + # Stripe 51 + EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY= 52 + EXPO_PUBLIC_STRIPE_API_URL=
+10
Dockerfile
··· 61 61 ENV EXPO_PUBLIC_GROWTHBOOK_CLIENT_KEY=${EXPO_PUBLIC_GROWTHBOOK_CLIENT_KEY:-sdk-7gkUkGy9wguUjyFe} 62 62 63 63 # 64 + # Stripe 65 + # 66 + ARG EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY 67 + ENV EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=$EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY 68 + ARG EXPO_PUBLIC_STRIPE_API_URL 69 + ENV EXPO_PUBLIC_STRIPE_API_URL=$EXPO_PUBLIC_STRIPE_API_URL 70 + 71 + # 64 72 # Copy everything into the container 65 73 # 66 74 COPY . . ··· 88 96 echo "EXPO_PUBLIC_METRICS_API_HOST=$EXPO_PUBLIC_METRICS_API_HOST" >> .env && \ 89 97 echo "EXPO_PUBLIC_GROWTHBOOK_API_HOST=$EXPO_PUBLIC_GROWTHBOOK_API_HOST" >> .env && \ 90 98 echo "EXPO_PUBLIC_GROWTHBOOK_CLIENT_KEY=$EXPO_PUBLIC_GROWTHBOOK_CLIENT_KEY" >> .env && \ 99 + echo "EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=$EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY" >> .env && \ 100 + echo "EXPO_PUBLIC_STRIPE_API_URL=$EXPO_PUBLIC_STRIPE_API_URL" >> .env && \ 91 101 npm install --global yarn && \ 92 102 yarn && \ 93 103 yarn intl:build 2>&1 | tee i18n.log && \
+2
package.json
··· 106 106 "@react-navigation/native": "^7.1.26", 107 107 "@react-navigation/native-stack": "^7.9.0", 108 108 "@sentry/react-native": "~6.20.0", 109 + "@stripe/react-stripe-js": "^6.1.0", 110 + "@stripe/stripe-js": "^9.0.1", 109 111 "@tanstack/query-async-storage-persister": "^5.25.0", 110 112 "@tanstack/react-query": "5.25.0", 111 113 "@tanstack/react-query-persist-client": "^5.25.0",
+6
src/Navigation.tsx
··· 68 68 import {ProfileFeedLikedByScreen} from '#/view/screens/ProfileFeedLikedBy' 69 69 import {StorybookScreen} from '#/view/screens/Storybook' 70 70 import {SupportScreen} from '#/view/screens/Support' 71 + import {SupportReturnScreen} from '#/view/screens/SupportReturn' 71 72 import {TermsOfServiceScreen} from '#/view/screens/TermsOfService' 72 73 import {BottomBar} from '#/view/shell/bottom-bar/BottomBar' 73 74 import {createNativeStackNavigatorWithAuth} from '#/view/shell/createNativeStackNavigatorWithAuth' ··· 332 333 <Stack.Screen 333 334 name="Support" 334 335 getComponent={() => SupportScreen} 336 + options={{title: title(msg`Support`)}} 337 + /> 338 + <Stack.Screen 339 + name="SupportReturn" 340 + getComponent={() => SupportReturnScreen} 335 341 options={{title: title(msg`Support`)}} 336 342 /> 337 343 <Stack.Screen
+12
src/env/common.ts
··· 142 142 export const LIVE_EVENTS_URL = IS_DEV 143 143 ? (LIVE_EVENTS_DEV_URL ?? LIVE_EVENTS_PROD_URL) 144 144 : LIVE_EVENTS_PROD_URL 145 + 146 + /** 147 + * Stripe publishable key for embedded checkout 148 + */ 149 + export const STRIPE_PUBLISHABLE_KEY: string = 150 + process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY || '' 151 + 152 + /** 153 + * Stripe API URL for creating checkout sessions 154 + */ 155 + export const STRIPE_API_URL: string = 156 + process.env.EXPO_PUBLIC_STRIPE_API_URL || ''
+1
src/lib/routes/types.ts
··· 38 38 SharedPreferencesTester: undefined 39 39 Log: undefined 40 40 Support: undefined 41 + SupportReturn: {session_id?: string} 41 42 PrivacyPolicy: undefined 42 43 TermsOfService: undefined 43 44 CommunityGuidelines: undefined
+213 -137
src/locale/locales/en/messages.po
··· 80 80 81 81 #: src/view/shell/bottom-bar/BottomBar.tsx:223 82 82 #: src/view/shell/bottom-bar/BottomBar.tsx:255 83 - #: src/view/shell/Drawer.tsx:517 83 + #: src/view/shell/Drawer.tsx:523 84 84 msgid "{0, plural, one {# unread item} other {# unread items}}" 85 85 msgstr "" 86 86 ··· 225 225 msgid "{0}s" 226 226 msgstr "" 227 227 228 - #: src/view/shell/desktop/LeftNav.tsx:456 228 + #: src/view/shell/desktop/LeftNav.tsx:460 229 229 msgid "{count, plural, one {# unread item} other {# unread items}}" 230 230 msgstr "" 231 231 ··· 485 485 msgid "<0>{0}, </0><1>{1}, </1>and {2, plural, one {# other} other {# others}} are included in your starter pack" 486 486 msgstr "" 487 487 488 - #: src/view/shell/Drawer.tsx:119 488 + #: src/view/shell/Drawer.tsx:120 489 489 msgid "<0>{0}</0> {1, plural, one {follower} other {followers}}" 490 490 msgstr "" 491 491 492 - #: src/view/shell/Drawer.tsx:130 492 + #: src/view/shell/Drawer.tsx:131 493 493 msgid "<0>{0}</0> {1, plural, one {following} other {following}}" 494 494 msgstr "" 495 495 ··· 562 562 msgid "A screenshot of the post composer with a new button next to the post button that says \"Drafts\", with a rainbow firework effect. Below, the text in the composer reads \"Hey, did you hear the news? Blacksky has drafts now!!!\"." 563 563 msgstr "" 564 564 565 - #: src/Navigation.tsx:541 565 + #: src/Navigation.tsx:547 566 566 #: src/screens/Settings/AboutSettings.tsx:71 567 567 #: src/screens/Settings/Settings.tsx:256 568 568 #: src/screens/Settings/Settings.tsx:259 ··· 598 598 msgid "Accessibility" 599 599 msgstr "" 600 600 601 - #: src/Navigation.tsx:392 601 + #: src/Navigation.tsx:398 602 602 msgid "Accessibility Settings" 603 603 msgstr "" 604 604 605 - #: src/Navigation.tsx:408 605 + #: src/Navigation.tsx:414 606 606 #: src/screens/Login/LoginForm.tsx:76 607 607 #: src/screens/Settings/AccountSettings.tsx:64 608 608 #: src/screens/Settings/Settings.tsx:174 ··· 689 689 msgid "Activity from others" 690 690 msgstr "" 691 691 692 - #: src/Navigation.tsx:509 692 + #: src/Navigation.tsx:515 693 693 msgid "Activity notifications" 694 694 msgstr "" 695 695 ··· 744 744 745 745 #: src/screens/Settings/Settings.tsx:541 746 746 #: src/screens/Settings/Settings.tsx:544 747 - #: src/view/shell/desktop/LeftNav.tsx:262 748 747 #: src/view/shell/desktop/LeftNav.tsx:266 748 + #: src/view/shell/desktop/LeftNav.tsx:270 749 749 msgid "Add another account" 750 750 msgstr "" 751 751 ··· 1157 1157 msgid "Anyone who follows me" 1158 1158 msgstr "" 1159 1159 1160 - #: src/Navigation.tsx:549 1160 + #: src/Navigation.tsx:555 1161 1161 #: src/screens/Settings/AppIconSettings/index.tsx:62 1162 1162 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18 1163 1163 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23 ··· 1200 1200 msgid "App passwords" 1201 1201 msgstr "" 1202 1202 1203 - #: src/Navigation.tsx:360 1203 + #: src/Navigation.tsx:366 1204 1204 #: src/screens/Settings/AppPasswords.tsx:86 1205 1205 #: src/screens/Settings/AppPasswords.tsx:140 1206 1206 msgid "App Passwords" ··· 1242 1242 msgid "Appeal this decision" 1243 1243 msgstr "" 1244 1244 1245 - #: src/Navigation.tsx:400 1245 + #: src/Navigation.tsx:406 1246 1246 #: src/screens/Settings/AppearanceSettings.tsx:73 1247 1247 #: src/screens/Settings/Settings.tsx:224 1248 1248 #: src/screens/Settings/Settings.tsx:227 ··· 1362 1362 msgid "Back to Chats" 1363 1363 msgstr "" 1364 1364 1365 + #: src/view/screens/SupportReturn.tsx:114 1366 + #: src/view/screens/SupportReturn.tsx:120 1367 + msgid "Back to Support" 1368 + msgstr "" 1369 + 1365 1370 #: src/screens/Profile/Header/Shell.tsx:376 1366 1371 #: src/screens/Profile/Header/Shell.tsx:405 1367 1372 #: src/screens/Profile/Header/Shell.tsx:414 ··· 1407 1412 msgid "Before you can message another user, you must first verify your email." 1408 1413 msgstr "" 1409 1414 1410 - #: src/view/shell/Drawer.tsx:367 1415 + #: src/view/shell/Drawer.tsx:373 1411 1416 msgid "Begin Discussion" 1412 1417 msgstr "" 1413 1418 ··· 1525 1530 msgid "Blocked accounts" 1526 1531 msgstr "" 1527 1532 1528 - #: src/Navigation.tsx:201 1533 + #: src/Navigation.tsx:202 1529 1534 #: src/view/screens/ModerationBlockedAccounts.tsx:104 1530 1535 msgid "Blocked Accounts" 1531 1536 msgstr "" ··· 1712 1717 #: src/view/com/composer/photos/EditImageDialog.web.tsx:43 1713 1718 #: src/view/com/composer/photos/EditImageDialog.web.tsx:52 1714 1719 #: src/view/com/modals/DeleteAccount.tsx:98 1715 - #: src/view/shell/desktop/LeftNav.tsx:213 1720 + #: src/view/shell/desktop/LeftNav.tsx:217 1716 1721 msgid "Cancel" 1717 1722 msgstr "" 1718 1723 ··· 1821 1826 msgstr "" 1822 1827 1823 1828 #: src/lib/hooks/useNotificationHandler.ts:102 1824 - #: src/Navigation.tsx:566 1829 + #: src/Navigation.tsx:572 1825 1830 #: src/view/shell/bottom-bar/BottomBar.tsx:219 1826 - #: src/view/shell/desktop/LeftNav.tsx:610 1827 - #: src/view/shell/Drawer.tsx:485 1831 + #: src/view/shell/desktop/LeftNav.tsx:614 1832 + #: src/view/shell/Drawer.tsx:491 1828 1833 msgid "Chat" 1829 1834 msgstr "" 1830 1835 ··· 1847 1852 msgid "Chat muted" 1848 1853 msgstr "" 1849 1854 1850 - #: src/Navigation.tsx:576 1855 + #: src/Navigation.tsx:582 1851 1856 #: src/screens/Messages/components/InboxPreview.tsx:22 1852 1857 msgid "Chat request inbox" 1853 1858 msgstr "" ··· 1858 1863 msgstr "" 1859 1864 1860 1865 #: src/components/dms/ConvoMenu.tsx:78 1861 - #: src/Navigation.tsx:571 1866 + #: src/Navigation.tsx:577 1862 1867 #: src/screens/Messages/ChatList.tsx:354 1863 1868 msgid "Chat settings" 1864 1869 msgstr "" ··· 2108 2113 msgid "Comics" 2109 2114 msgstr "" 2110 2115 2111 - #: src/Navigation.tsx:350 2116 + #: src/Navigation.tsx:356 2112 2117 #: src/view/screens/CommunityGuidelines.tsx:37 2113 2118 msgid "Community Guidelines" 2114 2119 msgstr "" ··· 2122 2127 msgstr "" 2123 2128 2124 2129 #: src/view/com/feeds/ComposerPrompt.tsx:146 2125 - #: src/view/shell/desktop/LeftNav.tsx:575 2130 + #: src/view/shell/desktop/LeftNav.tsx:579 2126 2131 msgid "Compose new post" 2127 2132 msgstr "" 2128 2133 ··· 2206 2211 msgid "Content and media" 2207 2212 msgstr "" 2208 2213 2209 - #: src/Navigation.tsx:525 2214 + #: src/Navigation.tsx:531 2210 2215 msgid "Content and Media" 2211 2216 msgstr "" 2212 2217 ··· 2398 2403 msgid "Copy TXT record value" 2399 2404 msgstr "" 2400 2405 2401 - #: src/Navigation.tsx:355 2406 + #: src/Navigation.tsx:361 2402 2407 #: src/view/screens/CopyrightPolicy.tsx:34 2403 2408 msgid "Copyright Policy" 2404 2409 msgstr "" ··· 2487 2492 2488 2493 #: src/components/StarterPack/ProfileStarterPacks.tsx:206 2489 2494 #: src/components/StarterPack/ProfileStarterPacks.tsx:315 2490 - #: src/Navigation.tsx:606 2495 + #: src/Navigation.tsx:612 2491 2496 msgid "Create a starter pack" 2492 2497 msgstr "" 2493 2498 ··· 2578 2583 msgid "Custom" 2579 2584 msgstr "" 2580 2585 2586 + #: src/view/screens/SupportStripeCheckout.web.tsx:132 2587 + #: src/view/screens/SupportStripeCheckout.web.tsx:139 2588 + msgid "Custom amount" 2589 + msgstr "" 2590 + 2581 2591 #: src/components/dialogs/Embed.tsx:144 2582 2592 msgid "Customization options" 2583 2593 msgstr "" ··· 2897 2907 2898 2908 #: src/view/shell/desktop/RightNav.tsx:107 2899 2909 #: src/view/shell/desktop/RightNav.tsx:108 2900 - #: src/view/shell/Drawer.tsx:374 2910 + #: src/view/shell/Drawer.tsx:380 2901 2911 msgid "Discussion" 2902 2912 msgstr "" 2903 2913 ··· 2978 2988 msgid "Don't see an email? <0>Click here to resend.</0>" 2979 2989 msgstr "" 2980 2990 2991 + #: src/view/screens/SupportStripeCheckout.web.tsx:100 2992 + msgid "Donate ${0}" 2993 + msgstr "" 2994 + 2995 + #: src/view/screens/SupportStripeCheckout.web.tsx:99 2996 + msgid "Donate ${0}/mo" 2997 + msgstr "" 2998 + 2999 + #: src/view/screens/Support.tsx:63 3000 + #: src/view/screens/Support.tsx:64 3001 + msgid "Donate on OpenCollective" 3002 + msgstr "" 3003 + 3004 + #: src/view/screens/SupportStripeCheckout.web.tsx:113 3005 + msgid "Donate with Card" 3006 + msgstr "" 3007 + 3008 + #: src/view/screens/SupportStripeCheckout.web.tsx:159 3009 + msgid "Donation frequency" 3010 + msgstr "" 3011 + 2981 3012 #: src/components/contacts/components/InviteInfo.tsx:72 2982 3013 #: src/components/contacts/components/InviteInfo.tsx:78 2983 3014 #: src/components/contacts/screens/ViewMatches.tsx:394 ··· 3145 3176 msgid "Edit moderation list" 3146 3177 msgstr "" 3147 3178 3148 - #: src/Navigation.tsx:365 3179 + #: src/Navigation.tsx:371 3149 3180 #: src/view/screens/Feeds.tsx:519 3150 3181 msgid "Edit My Feeds" 3151 3182 msgstr "" ··· 3187 3218 msgid "Edit who can reply" 3188 3219 msgstr "" 3189 3220 3190 - #: src/Navigation.tsx:611 3221 + #: src/Navigation.tsx:617 3191 3222 msgid "Edit your starter pack" 3192 3223 msgstr "" 3193 3224 ··· 3342 3373 msgid "Enter a word or tag" 3343 3374 msgstr "" 3344 3375 3376 + #: src/view/screens/SupportStripeCheckout.web.tsx:146 3377 + msgid "Enter amount" 3378 + msgstr "" 3379 + 3345 3380 #: src/components/dialogs/EmailDialog/screens/Manage2FA/Disable.tsx:201 3346 3381 #: src/components/dialogs/EmailDialog/screens/Verify.tsx:320 3347 3382 #: src/screens/Settings/components/ChangePasswordDialog.tsx:63 ··· 3512 3547 msgid "Explicit sexual images." 3513 3548 msgstr "" 3514 3549 3515 - #: src/Navigation.tsx:795 3550 + #: src/Navigation.tsx:801 3516 3551 #: src/screens/Search/Shell.tsx:327 3517 - #: src/view/shell/desktop/LeftNav.tsx:690 3518 - #: src/view/shell/Drawer.tsx:433 3552 + #: src/view/shell/desktop/LeftNav.tsx:694 3553 + #: src/view/shell/Drawer.tsx:439 3519 3554 msgid "Explore" 3520 3555 msgstr "" 3521 3556 ··· 3552 3587 msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." 3553 3588 msgstr "" 3554 3589 3555 - #: src/Navigation.tsx:384 3590 + #: src/Navigation.tsx:390 3556 3591 #: src/screens/Settings/ExternalMediaPreferences.tsx:34 3557 3592 msgid "External Media Preferences" 3558 3593 msgstr "" ··· 3780 3815 msgid "False information about elections" 3781 3816 msgstr "" 3782 3817 3783 - #: src/Navigation.tsx:300 3818 + #: src/Navigation.tsx:301 3784 3819 msgid "Feed" 3785 3820 msgstr "" 3786 3821 ··· 3816 3851 msgid "Feedback sent to feed operator" 3817 3852 msgstr "" 3818 3853 3819 - #: src/Navigation.tsx:591 3854 + #: src/Navigation.tsx:597 3820 3855 #: src/screens/SavedFeeds.tsx:108 3821 3856 #: src/screens/Search/SearchResults.tsx:79 3822 3857 #: src/screens/StarterPack/StarterPackScreen.tsx:193 3823 3858 #: src/view/screens/Feeds.tsx:512 3824 3859 #: src/view/screens/Profile.tsx:239 3825 - #: src/view/shell/desktop/LeftNav.tsx:728 3826 - #: src/view/shell/Drawer.tsx:549 3860 + #: src/view/shell/desktop/LeftNav.tsx:732 3861 + #: src/view/shell/Drawer.tsx:555 3827 3862 msgid "Feeds" 3828 3863 msgstr "" 3829 3864 ··· 3887 3922 msgid "Find accounts to follow" 3888 3923 msgstr "" 3889 3924 3890 - #: src/Navigation.tsx:432 3891 - #: src/Navigation.tsx:633 3925 + #: src/Navigation.tsx:438 3926 + #: src/Navigation.tsx:639 3892 3927 msgid "Find Contacts" 3893 3928 msgstr "" 3894 3929 ··· 4026 4061 msgid "Followed by <0>{0}</0>, <1>{1}</1>, and {2, plural, one {# other} other {# others}}" 4027 4062 msgstr "" 4028 4063 4029 - #: src/Navigation.tsx:254 4064 + #: src/Navigation.tsx:255 4030 4065 msgid "Followers of @{0} that you know" 4031 4066 msgstr "" 4032 4067 ··· 4069 4104 msgid "Following feed preferences" 4070 4105 msgstr "" 4071 4106 4072 - #: src/Navigation.tsx:371 4107 + #: src/Navigation.tsx:377 4073 4108 #: src/screens/Settings/FollowingFeedPreferences.tsx:56 4074 4109 msgid "Following Feed Preferences" 4075 4110 msgstr "" ··· 4163 4198 msgid "Germ DM reconnected" 4164 4199 msgstr "" 4165 4200 4166 - #: src/view/shell/Drawer.tsx:378 4201 + #: src/view/shell/Drawer.tsx:384 4167 4202 msgid "Get help" 4168 4203 msgstr "" 4169 4204 ··· 4333 4368 msgstr "" 4334 4369 4335 4370 #: src/components/dms/ConvoMenu.tsx:241 4336 - #: src/view/shell/desktop/LeftNav.tsx:317 4337 - #: src/view/shell/desktop/LeftNav.tsx:323 4371 + #: src/view/shell/desktop/LeftNav.tsx:321 4372 + #: src/view/shell/desktop/LeftNav.tsx:327 4338 4373 msgid "Go to profile" 4339 4374 msgstr "" 4340 4375 ··· 4414 4449 msgid "Harming or endangering minors" 4415 4450 msgstr "" 4416 4451 4417 - #: src/Navigation.tsx:556 4452 + #: src/Navigation.tsx:562 4418 4453 msgid "Hashtag" 4419 4454 msgstr "" 4420 4455 ··· 4443 4478 #: src/screens/Settings/Settings.tsx:252 4444 4479 #: src/view/shell/desktop/RightNav.tsx:125 4445 4480 #: src/view/shell/desktop/RightNav.tsx:126 4446 - #: src/view/shell/Drawer.tsx:387 4481 + #: src/view/shell/Drawer.tsx:393 4447 4482 msgid "Help" 4448 4483 msgstr "" 4449 4484 ··· 4596 4631 msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" 4597 4632 msgstr "" 4598 4633 4599 - #: src/Navigation.tsx:790 4600 - #: src/Navigation.tsx:810 4634 + #: src/Navigation.tsx:796 4635 + #: src/Navigation.tsx:816 4601 4636 #: src/view/shell/bottom-bar/BottomBar.tsx:176 4602 - #: src/view/shell/desktop/LeftNav.tsx:672 4603 - #: src/view/shell/Drawer.tsx:459 4637 + #: src/view/shell/desktop/LeftNav.tsx:676 4638 + #: src/view/shell/Drawer.tsx:465 4604 4639 msgid "Home" 4605 4640 msgstr "" 4606 4641 ··· 4674 4709 4675 4710 #: src/screens/Settings/components/ChangeHandleDialog.tsx:354 4676 4711 msgid "If you have your own domain, you can use that as your handle. This lets you self-verify your identity. <0>Learn more here.</0>" 4677 - msgstr "" 4678 - 4679 - #: src/view/screens/Support.tsx:40 4680 - msgid "If you need help, please email us at <0/>." 4681 4712 msgstr "" 4682 4713 4683 4714 #: src/components/dialogs/EmailDialog/screens/Verify.tsx:272 ··· 4960 4991 msgid "Labels on your content" 4961 4992 msgstr "" 4962 4993 4963 - #: src/Navigation.tsx:227 4994 + #: src/Navigation.tsx:228 4964 4995 msgid "Language Settings" 4965 4996 msgstr "" 4966 4997 ··· 5115 5146 msgid "Like 10 posts to train the Discover feed" 5116 5147 msgstr "" 5117 5148 5118 - #: src/Navigation.tsx:469 5149 + #: src/Navigation.tsx:475 5119 5150 msgid "Like notifications" 5120 5151 msgstr "" 5121 5152 ··· 5127 5158 msgid "Like this labeler" 5128 5159 msgstr "" 5129 5160 5130 - #: src/Navigation.tsx:305 5131 - #: src/Navigation.tsx:310 5161 + #: src/Navigation.tsx:306 5162 + #: src/Navigation.tsx:311 5132 5163 msgid "Liked by" 5133 5164 msgstr "" 5134 5165 ··· 5163 5194 msgid "Likes of your reposts" 5164 5195 msgstr "" 5165 5196 5166 - #: src/Navigation.tsx:493 5197 + #: src/Navigation.tsx:499 5167 5198 msgid "Likes of your reposts notifications" 5168 5199 msgstr "" 5169 5200 ··· 5176 5207 msgid "Linear" 5177 5208 msgstr "" 5178 5209 5179 - #: src/Navigation.tsx:260 5210 + #: src/Navigation.tsx:261 5180 5211 msgid "List" 5181 5212 msgstr "" 5182 5213 ··· 5256 5287 msgid "List unmuted" 5257 5288 msgstr "" 5258 5289 5259 - #: src/Navigation.tsx:181 5290 + #: src/Navigation.tsx:182 5260 5291 #: src/view/screens/Lists.tsx:67 5261 5292 #: src/view/screens/Profile.tsx:233 5262 5293 #: src/view/screens/Profile.tsx:241 5263 - #: src/view/shell/desktop/LeftNav.tsx:746 5264 - #: src/view/shell/Drawer.tsx:564 5294 + #: src/view/shell/desktop/LeftNav.tsx:750 5295 + #: src/view/shell/Drawer.tsx:570 5265 5296 msgid "Lists" 5266 5297 msgstr "" 5267 5298 ··· 5333 5364 5334 5365 #: src/components/Post/Embed/index.tsx:237 5335 5366 #: src/view/com/composer/text-input/mobile/Autocomplete.tsx:61 5367 + #: src/view/screens/SupportReturn.tsx:80 5336 5368 msgid "Loading..." 5337 5369 msgstr "" 5338 5370 5339 - #: src/Navigation.tsx:330 5371 + #: src/Navigation.tsx:331 5340 5372 msgid "Log" 5341 5373 msgstr "" 5342 5374 ··· 5353 5385 msgid "Login" 5354 5386 msgstr "" 5355 5387 5356 - #: src/view/shell/Drawer.tsx:728 5388 + #: src/view/shell/Drawer.tsx:747 5357 5389 msgid "Logo by <0>@sawaratsuki.bsky.social</0>" 5358 5390 msgstr "" 5359 5391 ··· 5418 5450 msgid "Marked all as read" 5419 5451 msgstr "" 5420 5452 5453 + #: src/view/screens/SupportStripeCheckout.web.tsx:44 5454 + msgid "Maximum donation is $1,000" 5455 + msgstr "" 5456 + 5421 5457 #: src/components/dialogs/EmailDialog/screens/VerificationReminder.tsx:90 5422 5458 #: src/components/dialogs/EmailDialog/screens/VerificationReminder.tsx:97 5423 5459 msgid "Maybe later" ··· 5440 5476 msgid "Media that may be disturbing or inappropriate for some audiences." 5441 5477 msgstr "" 5442 5478 5443 - #: src/Navigation.tsx:453 5479 + #: src/Navigation.tsx:459 5444 5480 msgid "Mention notifications" 5445 5481 msgstr "" 5446 5482 ··· 5493 5529 msgid "Message options" 5494 5530 msgstr "" 5495 5531 5496 - #: src/Navigation.tsx:805 5532 + #: src/Navigation.tsx:811 5497 5533 msgid "Messages" 5498 5534 msgstr "" 5499 5535 ··· 5501 5537 msgid "Migrating from Bluesky? Use <0>move.blacksky.community</0> to move your followers, posts, and media to Blacksky." 5502 5538 msgstr "" 5503 5539 5540 + #: src/view/screens/SupportStripeCheckout.web.tsx:43 5541 + msgid "Minimum donation is $5" 5542 + msgstr "" 5543 + 5504 5544 #: src/components/moderation/ReportDialog/utils/useReportOptions.ts:177 5505 5545 msgid "Minor harassment or bullying" 5506 5546 msgstr "" 5507 5547 5508 - #: src/Navigation.tsx:517 5548 + #: src/Navigation.tsx:523 5509 5549 msgid "Miscellaneous notifications" 5510 5550 msgstr "" 5511 5551 ··· 5517 5557 msgid "Missing media" 5518 5558 msgstr "" 5519 5559 5520 - #: src/Navigation.tsx:186 5560 + #: src/Navigation.tsx:187 5521 5561 #: src/screens/Moderation/index.tsx:94 5522 5562 #: src/screens/Settings/Settings.tsx:188 5523 5563 #: src/screens/Settings/Settings.tsx:191 ··· 5556 5596 msgid "Moderation lists" 5557 5597 msgstr "" 5558 5598 5559 - #: src/Navigation.tsx:191 5599 + #: src/Navigation.tsx:192 5560 5600 #: src/view/screens/ModerationModlists.tsx:67 5561 5601 msgid "Moderation Lists" 5562 5602 msgstr "" ··· 5565 5605 msgid "moderation settings" 5566 5606 msgstr "" 5567 5607 5568 - #: src/Navigation.tsx:320 5608 + #: src/Navigation.tsx:321 5569 5609 msgid "Moderation states" 5570 5610 msgstr "" 5571 5611 ··· 5576 5616 #: src/components/moderation/ModerationDetailsDialog.tsx:54 5577 5617 #: src/lib/moderation/useModerationCauseDescription.ts:49 5578 5618 msgid "Moderator has chosen to set a general warning on the content." 5619 + msgstr "" 5620 + 5621 + #: src/view/screens/SupportStripeCheckout.web.tsx:168 5622 + #: src/view/screens/SupportStripeCheckout.web.tsx:170 5623 + msgid "Monthly" 5579 5624 msgstr "" 5580 5625 5581 5626 #: src/view/shell/desktop/Feeds.tsx:106 ··· 5693 5738 msgid "Muted accounts" 5694 5739 msgstr "" 5695 5740 5696 - #: src/Navigation.tsx:196 5741 + #: src/Navigation.tsx:197 5697 5742 #: src/view/screens/ModerationMutedAccounts.tsx:116 5698 5743 msgid "Muted Accounts" 5699 5744 msgstr "" ··· 5744 5789 msgid "Navigates to the next screen" 5745 5790 msgstr "" 5746 5791 5747 - #: src/view/shell/Drawer.tsx:80 5792 + #: src/view/shell/Drawer.tsx:81 5748 5793 msgid "Navigates to your profile" 5749 5794 msgstr "" 5750 5795 ··· 5790 5835 msgid "New Feature" 5791 5836 msgstr "" 5792 5837 5793 - #: src/Navigation.tsx:485 5838 + #: src/Navigation.tsx:491 5794 5839 msgid "New follower notifications" 5795 5840 msgstr "" 5796 5841 ··· 5835 5880 msgid "New post" 5836 5881 msgstr "" 5837 5882 5838 - #: src/view/shell/desktop/LeftNav.tsx:583 5883 + #: src/view/shell/desktop/LeftNav.tsx:587 5839 5884 msgctxt "action" 5840 5885 msgid "New Post" 5841 5886 msgstr "" ··· 6095 6140 msgid "Not followed by anyone you're following" 6096 6141 msgstr "" 6097 6142 6098 - #: src/Navigation.tsx:176 6143 + #: src/Navigation.tsx:177 6099 6144 #: src/view/screens/Profile.tsx:132 6100 6145 msgid "Not Found" 6101 6146 msgstr "" ··· 6125 6170 msgid "Nothing saved yet" 6126 6171 msgstr "" 6127 6172 6128 - #: src/Navigation.tsx:439 6129 - #: src/Navigation.tsx:586 6173 + #: src/Navigation.tsx:445 6174 + #: src/Navigation.tsx:592 6130 6175 #: src/view/screens/Notifications.tsx:135 6131 6176 msgid "Notification settings" 6132 6177 msgstr "" ··· 6139 6184 msgid "Notification Sounds" 6140 6185 msgstr "" 6141 6186 6142 - #: src/Navigation.tsx:581 6143 - #: src/Navigation.tsx:800 6187 + #: src/Navigation.tsx:587 6188 + #: src/Navigation.tsx:806 6144 6189 #: src/screens/Notifications/ActivityList.tsx:30 6145 6190 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:90 6146 6191 #: src/screens/Settings/NotificationSettings/index.tsx:92 ··· 6157 6202 #: src/screens/Settings/Settings.tsx:199 6158 6203 #: src/view/screens/Notifications.tsx:129 6159 6204 #: src/view/shell/bottom-bar/BottomBar.tsx:250 6160 - #: src/view/shell/desktop/LeftNav.tsx:709 6161 - #: src/view/shell/Drawer.tsx:512 6205 + #: src/view/shell/desktop/LeftNav.tsx:713 6206 + #: src/view/shell/Drawer.tsx:518 6162 6207 msgid "Notifications" 6163 6208 msgstr "" 6164 6209 ··· 6248 6293 msgid "One or more videos is missing alt text." 6249 6294 msgstr "" 6250 6295 6296 + #: src/view/screens/SupportStripeCheckout.web.tsx:163 6297 + #: src/view/screens/SupportStripeCheckout.web.tsx:165 6298 + msgid "One-time" 6299 + msgstr "" 6300 + 6251 6301 #: src/screens/Onboarding/StepProfile/index.tsx:118 6252 6302 msgid "Only .jpg and .png files are supported" 6253 6303 msgstr "" ··· 6383 6433 6384 6434 #: src/screens/Settings/Settings.tsx:448 6385 6435 msgid "Open system log" 6436 + msgstr "" 6437 + 6438 + #: src/view/screens/Support.tsx:52 6439 + msgid "OpenCollective" 6386 6440 msgstr "" 6387 6441 6388 6442 #: src/view/shell/desktop/Feeds.tsx:185 ··· 6623 6677 msgid "People" 6624 6678 msgstr "" 6625 6679 6626 - #: src/Navigation.tsx:247 6680 + #: src/Navigation.tsx:248 6627 6681 msgid "People followed by @{0}" 6628 6682 msgstr "" 6629 6683 6630 - #: src/Navigation.tsx:240 6684 + #: src/Navigation.tsx:241 6631 6685 msgid "People following @{0}" 6632 6686 msgstr "" 6633 6687 ··· 6803 6857 msgid "Please enter a valid email address." 6804 6858 msgstr "" 6805 6859 6860 + #: src/view/screens/SupportStripeCheckout.web.tsx:42 6861 + msgid "Please enter a valid number" 6862 + msgstr "" 6863 + 6806 6864 #: src/components/dialogs/MutedWords.tsx:86 6807 6865 msgid "Please enter a valid word, tag, or phrase to mute" 6808 6866 msgstr "" ··· 6945 7003 msgid "Post blocked" 6946 7004 msgstr "" 6947 7005 6948 - #: src/Navigation.tsx:273 6949 - #: src/Navigation.tsx:280 6950 - #: src/Navigation.tsx:287 6951 - #: src/Navigation.tsx:294 7006 + #: src/Navigation.tsx:274 7007 + #: src/Navigation.tsx:281 7008 + #: src/Navigation.tsx:288 7009 + #: src/Navigation.tsx:295 6952 7010 msgid "Post by @{0}" 6953 7011 msgstr "" 6954 7012 ··· 6982 7040 msgid "Post interaction settings" 6983 7041 msgstr "" 6984 7042 6985 - #: src/Navigation.tsx:207 7043 + #: src/Navigation.tsx:208 6986 7044 #: src/screens/ModerationInteractionSettings/index.tsx:34 6987 7045 msgid "Post Interaction Settings" 6988 7046 msgstr "" ··· 7082 7140 msgid "Privacy and security" 7083 7141 msgstr "" 7084 7142 7085 - #: src/Navigation.tsx:416 7086 - #: src/Navigation.tsx:424 7143 + #: src/Navigation.tsx:422 7144 + #: src/Navigation.tsx:430 7087 7145 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 7088 7146 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:48 7089 7147 msgid "Privacy and Security" ··· 7094 7152 msgid "Privacy and Security settings" 7095 7153 msgstr "" 7096 7154 7097 - #: src/Navigation.tsx:340 7155 + #: src/Navigation.tsx:346 7098 7156 #: src/screens/Settings/AboutSettings.tsx:88 7099 7157 #: src/screens/Settings/AboutSettings.tsx:91 7100 7158 #: src/view/screens/PrivacyPolicy.tsx:34 7101 - #: src/view/shell/Drawer.tsx:723 7102 - #: src/view/shell/Drawer.tsx:724 7159 + #: src/view/shell/Drawer.tsx:742 7160 + #: src/view/shell/Drawer.tsx:743 7103 7161 msgid "Privacy Policy" 7104 7162 msgstr "" 7105 7163 ··· 7117 7175 7118 7176 #: src/lib/api/index.ts:60 7119 7177 #: src/screens/Login/ForgotPasswordForm.tsx:150 7178 + #: src/view/screens/SupportStripeCheckout.web.tsx:189 7120 7179 msgid "Processing..." 7121 7180 msgstr "" 7122 7181 ··· 7126 7185 msgstr "" 7127 7186 7128 7187 #: src/view/shell/bottom-bar/BottomBar.tsx:293 7129 - #: src/view/shell/desktop/LeftNav.tsx:787 7130 - #: src/view/shell/Drawer.tsx:79 7131 - #: src/view/shell/Drawer.tsx:615 7188 + #: src/view/shell/desktop/LeftNav.tsx:791 7189 + #: src/view/shell/Drawer.tsx:80 7190 + #: src/view/shell/Drawer.tsx:621 7132 7191 msgid "Profile" 7133 7192 msgstr "" 7134 7193 ··· 7206 7265 msgid "QR code saved to your camera roll!" 7207 7266 msgstr "" 7208 7267 7209 - #: src/Navigation.tsx:461 7268 + #: src/Navigation.tsx:467 7210 7269 msgid "Quote notifications" 7211 7270 msgstr "" 7212 7271 ··· 7582 7641 msgid "Reply Hidden by You" 7583 7642 msgstr "" 7584 7643 7585 - #: src/Navigation.tsx:445 7644 + #: src/Navigation.tsx:451 7586 7645 msgid "Reply notifications" 7587 7646 msgstr "" 7588 7647 ··· 7703 7762 msgid "Repost ({0, plural, one {# repost} other {# reposts}})" 7704 7763 msgstr "" 7705 7764 7706 - #: src/Navigation.tsx:477 7765 + #: src/Navigation.tsx:483 7707 7766 msgid "Repost notifications" 7708 7767 msgstr "" 7709 7768 ··· 7744 7803 msgid "Reposts of your reposts" 7745 7804 msgstr "" 7746 7805 7747 - #: src/Navigation.tsx:501 7806 + #: src/Navigation.tsx:507 7748 7807 msgid "Reposts of your reposts notifications" 7749 7808 msgstr "" 7750 7809 ··· 7953 8012 msgid "Save to my feeds" 7954 8013 msgstr "" 7955 8014 7956 - #: src/view/shell/desktop/LeftNav.tsx:765 7957 - #: src/view/shell/Drawer.tsx:590 8015 + #: src/view/shell/desktop/LeftNav.tsx:769 8016 + #: src/view/shell/Drawer.tsx:596 7958 8017 msgctxt "link to bookmarks screen" 7959 8018 msgid "Saved" 7960 8019 msgstr "" ··· 7963 8022 msgid "Saved Feeds" 7964 8023 msgstr "" 7965 8024 7966 - #: src/Navigation.tsx:625 8025 + #: src/Navigation.tsx:631 7967 8026 #: src/screens/Bookmarks/index.tsx:61 7968 8027 msgid "Saved Posts" 7969 8028 msgstr "" ··· 8009 8068 msgid "Search" 8010 8069 msgstr "" 8011 8070 8012 - #: src/Navigation.tsx:266 8071 + #: src/Navigation.tsx:267 8013 8072 #: src/screens/Profile/ProfileSearch.tsx:37 8014 8073 msgid "Search @{0}'s posts" 8015 8074 msgstr "" ··· 8400 8459 msgid "Sets email for password reset" 8401 8460 msgstr "" 8402 8461 8403 - #: src/Navigation.tsx:222 8462 + #: src/Navigation.tsx:223 8404 8463 #: src/screens/Settings/Settings.tsx:101 8405 - #: src/view/shell/desktop/LeftNav.tsx:805 8406 - #: src/view/shell/Drawer.tsx:628 8464 + #: src/view/shell/desktop/LeftNav.tsx:809 8465 + #: src/view/shell/Drawer.tsx:634 8407 8466 msgid "Settings" 8408 8467 msgstr "" 8409 8468 ··· 8545 8604 msgid "Share your favorite feed!" 8546 8605 msgstr "" 8547 8606 8548 - #: src/Navigation.tsx:325 8607 + #: src/Navigation.tsx:326 8549 8608 msgid "Shared Preferences Tester" 8550 8609 msgstr "" 8551 8610 ··· 8723 8782 #: src/screens/SignupQueued.tsx:93 8724 8783 #: src/screens/SignupQueued.tsx:96 8725 8784 #: src/screens/Takendown.tsx:87 8726 - #: src/view/shell/desktop/LeftNav.tsx:212 8727 - #: src/view/shell/desktop/LeftNav.tsx:269 8728 - #: src/view/shell/desktop/LeftNav.tsx:272 8785 + #: src/view/shell/desktop/LeftNav.tsx:216 8786 + #: src/view/shell/desktop/LeftNav.tsx:273 8787 + #: src/view/shell/desktop/LeftNav.tsx:276 8729 8788 msgid "Sign out" 8730 8789 msgstr "" 8731 8790 ··· 8734 8793 msgstr "" 8735 8794 8736 8795 #: src/screens/Settings/Settings.tsx:297 8737 - #: src/view/shell/desktop/LeftNav.tsx:209 8796 + #: src/view/shell/desktop/LeftNav.tsx:213 8738 8797 msgid "Sign out?" 8739 8798 msgstr "" 8740 8799 ··· 8748 8807 msgid "Signed in as @{0}" 8749 8808 msgstr "" 8750 8809 8751 - #: src/Navigation.tsx:171 8810 + #: src/Navigation.tsx:172 8752 8811 msgid "Signing in..." 8753 8812 msgstr "" 8754 8813 ··· 8848 8907 msgstr "" 8849 8908 8850 8909 #: src/components/moderation/ReportDialog/index.tsx:231 8910 + #: src/view/screens/SupportReturn.tsx:107 8911 + #: src/view/screens/SupportStripeCheckout.web.tsx:76 8851 8912 msgid "Something went wrong. Please try again." 8852 8913 msgstr "" 8853 8914 ··· 8916 8977 msgid "Start chat with {displayName}" 8917 8978 msgstr "" 8918 8979 8919 - #: src/Navigation.tsx:596 8920 - #: src/Navigation.tsx:601 8980 + #: src/Navigation.tsx:602 8981 + #: src/Navigation.tsx:607 8921 8982 #: src/screens/StarterPack/Wizard/index.tsx:207 8922 8983 msgid "Starter Pack" 8923 8984 msgstr "" ··· 8972 9033 msgid "Stored as part of a secure code for matching with others" 8973 9034 msgstr "" 8974 9035 8975 - #: src/Navigation.tsx:315 9036 + #: src/Navigation.tsx:316 8976 9037 #: src/screens/Settings/Settings.tsx:457 8977 9038 msgid "Storybook" 8978 9039 msgstr "" ··· 9043 9104 msgid "Suggestive" 9044 9105 msgstr "" 9045 9106 9046 - #: src/Navigation.tsx:335 9047 - #: src/view/screens/Support.tsx:34 9048 - #: src/view/screens/Support.tsx:37 9107 + #: src/Navigation.tsx:336 9108 + #: src/Navigation.tsx:341 9109 + #: src/view/screens/Support.tsx:36 9110 + #: src/view/screens/SupportReturn.tsx:71 9111 + #: src/view/shell/desktop/LeftNav.tsx:827 9112 + #: src/view/shell/Drawer.tsx:647 9049 9113 msgid "Support" 9050 9114 msgstr "" 9051 9115 ··· 9053 9117 msgid "Support for this feature in your country has not been enabled yet! Please check back later." 9054 9118 msgstr "" 9055 9119 9120 + #: src/view/screens/Support.tsx:55 9121 + msgid "Support the Blacksky community through OpenCollective. Your contributions help us maintain and improve the platform." 9122 + msgstr "" 9123 + 9056 9124 #: src/view/shell/desktop/RightNav.tsx:99 9057 9125 #: src/view/shell/desktop/RightNav.tsx:100 9058 - #: src/view/shell/Drawer.tsx:391 9059 - #: src/view/shell/Drawer.tsx:400 9126 + #: src/view/shell/Drawer.tsx:397 9127 + #: src/view/shell/Drawer.tsx:406 9060 9128 msgid "Support Us" 9061 - msgstr "" 9062 - 9063 - #: src/view/screens/Support.tsx:44 9064 - msgid "support@blacksky.app" 9065 9129 msgstr "" 9066 9130 9067 9131 #: src/screens/Settings/Settings.tsx:123 9068 9132 #: src/screens/Settings/Settings.tsx:137 9069 9133 #: src/screens/Settings/Settings.tsx:581 9070 - #: src/view/shell/desktop/LeftNav.tsx:247 9134 + #: src/view/shell/desktop/LeftNav.tsx:251 9071 9135 msgid "Switch account" 9072 9136 msgstr "" 9073 9137 ··· 9076 9140 msgid "Switch Account" 9077 9141 msgstr "" 9078 9142 9079 - #: src/view/shell/desktop/LeftNav.tsx:110 9143 + #: src/view/shell/desktop/LeftNav.tsx:114 9080 9144 msgid "Switch accounts" 9081 9145 msgstr "" 9082 9146 9083 - #: src/view/shell/desktop/LeftNav.tsx:346 9147 + #: src/view/shell/desktop/LeftNav.tsx:350 9084 9148 msgid "Switch to {0}" 9085 9149 msgstr "" 9086 9150 ··· 9159 9223 msgstr "" 9160 9224 9161 9225 #: src/components/dialogs/BirthDateSettings.tsx:169 9162 - #: src/Navigation.tsx:345 9226 + #: src/Navigation.tsx:351 9163 9227 #: src/screens/Settings/AboutSettings.tsx:80 9164 9228 #: src/screens/Settings/AboutSettings.tsx:83 9165 9229 #: src/view/screens/TermsOfService.tsx:34 9166 - #: src/view/shell/Drawer.tsx:716 9167 - #: src/view/shell/Drawer.tsx:718 9230 + #: src/view/shell/Drawer.tsx:735 9231 + #: src/view/shell/Drawer.tsx:737 9168 9232 msgid "Terms of Service" 9169 9233 msgstr "" 9170 9234 ··· 9182 9246 msgid "Thank you for your feedback! It has been sent to the feed operator." 9183 9247 msgstr "" 9184 9248 9249 + #: src/view/screens/SupportReturn.tsx:85 9250 + msgid "Thank you for your support!" 9251 + msgstr "" 9252 + 9185 9253 #: src/components/intents/VerifyEmailIntentDialog.tsx:76 9186 9254 msgid "Thanks, you have successfully verified your email address. You can close this dialog." 9187 9255 msgstr "" ··· 9714 9782 msgid "Threaded" 9715 9783 msgstr "" 9716 9784 9717 - #: src/Navigation.tsx:378 9785 + #: src/Navigation.tsx:384 9718 9786 msgid "Threads Preferences" 9719 9787 msgstr "" 9720 9788 ··· 9776 9844 msgid "Top replies first" 9777 9845 msgstr "" 9778 9846 9779 - #: src/Navigation.tsx:561 9847 + #: src/Navigation.tsx:567 9780 9848 msgid "Topic" 9781 9849 msgstr "" 9782 9850 ··· 10295 10363 msgid "Verification settings" 10296 10364 msgstr "" 10297 10365 10298 - #: src/Navigation.tsx:215 10366 + #: src/Navigation.tsx:216 10299 10367 #: src/screens/Moderation/VerificationSettings.tsx:33 10300 10368 msgid "Verification Settings" 10301 10369 msgstr "" ··· 10375 10443 msgid "Video failed to process" 10376 10444 msgstr "" 10377 10445 10378 - #: src/Navigation.tsx:617 10446 + #: src/Navigation.tsx:623 10379 10447 msgid "Video Feed" 10380 10448 msgstr "" 10381 10449 ··· 11177 11245 msgstr "" 11178 11246 11179 11247 #: src/screens/Settings/Settings.tsx:298 11180 - #: src/view/shell/desktop/LeftNav.tsx:210 11248 + #: src/view/shell/desktop/LeftNav.tsx:214 11181 11249 msgid "You will be signed out of all your accounts." 11182 11250 msgstr "" 11183 11251 ··· 11355 11423 msgid "Your current handle <0>{0}</0> will automatically remain reserved for you. You can switch back to it at any time from this account." 11356 11424 msgstr "" 11357 11425 11426 + #: src/view/screens/SupportReturn.tsx:93 11427 + msgid "Your donation helps us maintain and improve the Blacksky community." 11428 + msgstr "" 11429 + 11358 11430 #: src/screens/Login/ForgotPasswordForm.tsx:52 11359 11431 #: src/screens/Settings/components/ChangePasswordDialog.tsx:81 11360 11432 #: src/screens/Signup/state.ts:284 ··· 11382 11454 msgid "Your full handle will be <0>@{0}</0>" 11383 11455 msgstr "" 11384 11456 11385 - #: src/Navigation.tsx:533 11457 + #: src/Navigation.tsx:539 11386 11458 #: src/screens/Search/modules/ExploreInterestsCard.tsx:67 11387 11459 #: src/screens/Settings/ContentAndMediaSettings.tsx:93 11388 11460 #: src/screens/Settings/ContentAndMediaSettings.tsx:96 ··· 11413 11485 11414 11486 #: src/screens/Signup/StepInfo/index.tsx:136 11415 11487 msgid "Your password must be at least 8 characters long." 11488 + msgstr "" 11489 + 11490 + #: src/view/screens/SupportReturn.tsx:101 11491 + msgid "Your payment is still being processed. Please check back later." 11416 11492 msgstr "" 11417 11493 11418 11494 #: src/view/com/composer/Composer.tsx:970
+1
src/routes.ts
··· 73 73 FindContactsSettings: '/settings/find-contacts', 74 74 // support 75 75 Support: '/support', 76 + SupportReturn: '/return', 76 77 PrivacyPolicy: '/support/privacy', 77 78 TermsOfService: '/support/tos', 78 79 CommunityGuidelines: '/support/community-guidelines',
+46 -25
src/view/screens/Support.tsx
··· 1 1 import React from 'react' 2 + import {View} from 'react-native' 2 3 import {msg, Trans} from '@lingui/macro' 3 4 import {useLingui} from '@lingui/react' 4 5 import {useFocusEffect} from '@react-navigation/native' 5 6 6 - import {HELP_DESK_URL} from '#/lib/constants' 7 - import {usePalette} from '#/lib/hooks/usePalette' 8 7 import { 9 8 type CommonNavigatorParams, 10 9 type NativeStackScreenProps, 11 10 } from '#/lib/routes/types' 12 - import {s} from '#/lib/styles' 13 11 import {useSetMinimalShellMode} from '#/state/shell' 14 - import {TextLink} from '#/view/com/util/Link' 15 - import {Text} from '#/view/com/util/text/Text' 16 - import {ViewHeader} from '#/view/com/util/ViewHeader' 17 - import {CenteredView} from '#/view/com/util/Views' 12 + import {atoms as a, useTheme} from '#/alf' 18 13 import * as Layout from '#/components/Layout' 14 + import {InlineLinkText} from '#/components/Link' 15 + import {Text} from '#/components/Typography' 16 + import {SupportStripeCheckout} from './SupportStripeCheckout' 19 17 20 18 type Props = NativeStackScreenProps<CommonNavigatorParams, 'Support'> 21 19 export const SupportScreen = (_props: Props) => { 22 - const pal = usePalette('default') 23 20 const setMinimalShellMode = useSetMinimalShellMode() 24 21 const {_} = useLingui() 22 + const t = useTheme() 25 23 26 24 useFocusEffect( 27 25 React.useCallback(() => { ··· 31 29 32 30 return ( 33 31 <Layout.Screen> 34 - <ViewHeader title={_(msg`Support`)} /> 35 - <CenteredView> 36 - <Text type="title-xl" style={[pal.text, s.p20, s.pb5]}> 37 - <Trans>Support</Trans> 38 - </Text> 39 - <Text style={[pal.text, s.p20]}> 40 - <Trans> 41 - If you need help, please email us at{' '} 42 - <TextLink 43 - href={HELP_DESK_URL} 44 - text={_(msg`support@blacksky.app`)} 45 - style={pal.link} 46 - /> 47 - . 48 - </Trans> 49 - </Text> 50 - </CenteredView> 32 + <Layout.Header.Outer> 33 + <Layout.Header.BackButton /> 34 + <Layout.Header.Content> 35 + <Layout.Header.TitleText> 36 + <Trans>Support</Trans> 37 + </Layout.Header.TitleText> 38 + </Layout.Header.Content> 39 + <Layout.Header.Slot /> 40 + </Layout.Header.Outer> 41 + <Layout.Content> 42 + <View style={[a.p_xl, a.gap_xl]}> 43 + <View 44 + style={[ 45 + a.p_lg, 46 + a.rounded_md, 47 + a.border, 48 + t.atoms.border_contrast_low, 49 + t.atoms.bg_contrast_25, 50 + ]}> 51 + <Text style={[a.text_lg, a.font_bold, a.pb_sm]}> 52 + <Trans>OpenCollective</Trans> 53 + </Text> 54 + <Text style={[a.leading_snug, t.atoms.text_contrast_medium]}> 55 + <Trans> 56 + Support the Blacksky community through OpenCollective. Your 57 + contributions help us maintain and improve the platform. 58 + </Trans> 59 + </Text> 60 + <View style={[a.pt_md]}> 61 + <InlineLinkText 62 + to="https://opencollective.com/blacksky" 63 + label={_(msg`Donate on OpenCollective`)}> 64 + <Trans>Donate on OpenCollective</Trans> 65 + </InlineLinkText> 66 + </View> 67 + </View> 68 + 69 + <SupportStripeCheckout /> 70 + </View> 71 + </Layout.Content> 51 72 </Layout.Screen> 52 73 ) 53 74 }
+125
src/view/screens/SupportReturn.tsx
··· 1 + import React, {useEffect, useState} from 'react' 2 + import {View} from 'react-native' 3 + import {msg, Trans} from '@lingui/macro' 4 + import {useLingui} from '@lingui/react' 5 + import {useFocusEffect, useNavigation} from '@react-navigation/native' 6 + 7 + import { 8 + type CommonNavigatorParams, 9 + type NativeStackScreenProps, 10 + type NavigationProp, 11 + } from '#/lib/routes/types' 12 + import {useSetMinimalShellMode} from '#/state/shell' 13 + import {atoms as a, useTheme} from '#/alf' 14 + import {Button, ButtonText} from '#/components/Button' 15 + import * as Layout from '#/components/Layout' 16 + import {Text} from '#/components/Typography' 17 + import {IS_WEB} from '#/env' 18 + import {STRIPE_API_URL} from '#/env/common' 19 + 20 + type Props = NativeStackScreenProps<CommonNavigatorParams, 'SupportReturn'> 21 + export const SupportReturnScreen = (_props: Props) => { 22 + const setMinimalShellMode = useSetMinimalShellMode() 23 + const {_} = useLingui() 24 + const t = useTheme() 25 + const navigation = useNavigation<NavigationProp>() 26 + const [status, setStatus] = useState<string | null>(null) 27 + const [loading, setLoading] = useState(true) 28 + 29 + useFocusEffect( 30 + React.useCallback(() => { 31 + setMinimalShellMode(false) 32 + }, [setMinimalShellMode]), 33 + ) 34 + 35 + useEffect(() => { 36 + if (!IS_WEB || !STRIPE_API_URL) { 37 + setLoading(false) 38 + return 39 + } 40 + 41 + const params = new URLSearchParams(window.location.search) 42 + const sessionId = params.get('session_id') 43 + if (!sessionId) { 44 + setLoading(false) 45 + return 46 + } 47 + 48 + fetch(`${STRIPE_API_URL}/session-status?session_id=${sessionId}`) 49 + .then(res => res.json()) 50 + .then(data => { 51 + setStatus(data.status) 52 + }) 53 + .catch(() => { 54 + setStatus('error') 55 + }) 56 + .finally(() => { 57 + setLoading(false) 58 + }) 59 + }, []) 60 + 61 + const handleBackToHome = React.useCallback(() => { 62 + navigation.navigate('Home') 63 + }, [navigation]) 64 + 65 + return ( 66 + <Layout.Screen> 67 + <Layout.Header.Outer> 68 + <Layout.Header.BackButton /> 69 + <Layout.Header.Content> 70 + <Layout.Header.TitleText> 71 + <Trans>Support</Trans> 72 + </Layout.Header.TitleText> 73 + </Layout.Header.Content> 74 + <Layout.Header.Slot /> 75 + </Layout.Header.Outer> 76 + <Layout.Content> 77 + <View style={[a.p_xl, a.gap_lg, a.align_center]}> 78 + {loading ? ( 79 + <Text style={[a.text_md, t.atoms.text_contrast_medium]}> 80 + <Trans>Loading...</Trans> 81 + </Text> 82 + ) : status === 'complete' ? ( 83 + <> 84 + <Text style={[a.text_xl, a.font_bold, a.text_center]}> 85 + <Trans>Thank you for your support!</Trans> 86 + </Text> 87 + <Text 88 + style={[ 89 + a.text_md, 90 + a.text_center, 91 + t.atoms.text_contrast_medium, 92 + ]}> 93 + <Trans> 94 + Your donation helps us maintain and improve the Blacksky 95 + community. 96 + </Trans> 97 + </Text> 98 + </> 99 + ) : status === 'open' ? ( 100 + <Text style={[a.text_md, t.atoms.text_contrast_medium]}> 101 + <Trans> 102 + Your payment is still being processed. Please check back later. 103 + </Trans> 104 + </Text> 105 + ) : ( 106 + <Text style={[a.text_md, t.atoms.text_contrast_medium]}> 107 + <Trans>Something went wrong. Please try again.</Trans> 108 + </Text> 109 + )} 110 + 111 + <Button 112 + label={_(msg`Back to Home`)} 113 + size="large" 114 + variant="solid" 115 + color="secondary" 116 + onPress={handleBackToHome}> 117 + <ButtonText> 118 + <Trans>Back to Home</Trans> 119 + </ButtonText> 120 + </Button> 121 + </View> 122 + </Layout.Content> 123 + </Layout.Screen> 124 + ) 125 + }
+3
src/view/screens/SupportStripeCheckout.tsx
··· 1 + export function SupportStripeCheckout() { 2 + return null 3 + }
+194
src/view/screens/SupportStripeCheckout.web.tsx
··· 1 + import React, {useCallback, useMemo, useState} from 'react' 2 + import {View} from 'react-native' 3 + import {msg, Trans} from '@lingui/macro' 4 + import {useLingui} from '@lingui/react' 5 + import { 6 + EmbeddedCheckout, 7 + EmbeddedCheckoutProvider, 8 + } from '@stripe/react-stripe-js' 9 + import {loadStripe} from '@stripe/stripe-js' 10 + 11 + import {atoms as a, useTheme} from '#/alf' 12 + import {Button, ButtonText} from '#/components/Button' 13 + import * as SegmentedControl from '#/components/forms/SegmentedControl' 14 + import * as TextField from '#/components/forms/TextField' 15 + import {Text} from '#/components/Typography' 16 + import {STRIPE_API_URL, STRIPE_PUBLISHABLE_KEY} from '#/env/common' 17 + 18 + const stripePromise = STRIPE_PUBLISHABLE_KEY 19 + ? loadStripe(STRIPE_PUBLISHABLE_KEY) 20 + : null 21 + 22 + const PRESET_AMOUNTS = [5, 10, 25, 50] 23 + 24 + export function SupportStripeCheckout() { 25 + const {_} = useLingui() 26 + const t = useTheme() 27 + const [amount, setAmount] = useState('7') 28 + const [recurring, setRecurring] = useState(false) 29 + const [clientSecret, setClientSecret] = useState<string | null>(null) 30 + const [error, setError] = useState<string | null>(null) 31 + const [loading, setLoading] = useState(false) 32 + 33 + const parsedAmount = useMemo(() => { 34 + const num = parseFloat(amount) 35 + return isNaN(num) ? 0 : num 36 + }, [amount]) 37 + 38 + const isValid = parsedAmount >= 5 && parsedAmount <= 1000 39 + 40 + const validationError = useMemo(() => { 41 + if (!amount) return null 42 + if (isNaN(parseFloat(amount))) return _(msg`Please enter a valid number`) 43 + if (parsedAmount < 5) return _(msg`Minimum donation is $5`) 44 + if (parsedAmount > 1000) return _(msg`Maximum donation is $1,000`) 45 + return null 46 + }, [amount, parsedAmount, _]) 47 + 48 + const handlePresetPress = useCallback((value: number) => { 49 + setAmount(String(value)) 50 + setError(null) 51 + }, []) 52 + 53 + const handleFrequencyChange = useCallback((value: string) => { 54 + setRecurring(value === 'monthly') 55 + }, []) 56 + 57 + const handleSubmit = useCallback(async () => { 58 + if (!isValid || !STRIPE_API_URL) return 59 + setLoading(true) 60 + setError(null) 61 + try { 62 + const res = await fetch(`${STRIPE_API_URL}/create-checkout-session`, { 63 + method: 'POST', 64 + headers: {'Content-Type': 'application/json'}, 65 + body: JSON.stringify({ 66 + amount: Math.round(parsedAmount * 100), 67 + recurring, 68 + }), 69 + }) 70 + if (!res.ok) { 71 + throw new Error('Failed to create checkout session') 72 + } 73 + const data = await res.json() 74 + setClientSecret(data.clientSecret) 75 + } catch (e: any) { 76 + setError(e.message || _(msg`Something went wrong. Please try again.`)) 77 + } finally { 78 + setLoading(false) 79 + } 80 + }, [isValid, parsedAmount, recurring, _]) 81 + 82 + if (!STRIPE_PUBLISHABLE_KEY || !STRIPE_API_URL) { 83 + return null 84 + } 85 + 86 + if (clientSecret && stripePromise) { 87 + return ( 88 + <View style={[a.rounded_md, a.overflow_hidden]}> 89 + <EmbeddedCheckoutProvider 90 + stripe={stripePromise} 91 + options={{clientSecret}}> 92 + <EmbeddedCheckout /> 93 + </EmbeddedCheckoutProvider> 94 + </View> 95 + ) 96 + } 97 + 98 + const buttonLabel = recurring 99 + ? _(msg`Donate $${parsedAmount.toFixed(2)}/mo`) 100 + : _(msg`Donate $${parsedAmount.toFixed(2)}`) 101 + 102 + return ( 103 + <View 104 + style={[ 105 + a.p_lg, 106 + a.rounded_md, 107 + a.border, 108 + t.atoms.border_contrast_low, 109 + t.atoms.bg_contrast_25, 110 + a.gap_lg, 111 + ]}> 112 + <Text style={[a.text_lg, a.font_bold]}> 113 + <Trans>Donate with Card</Trans> 114 + </Text> 115 + 116 + <View style={[a.flex_row, a.gap_sm, a.flex_wrap]}> 117 + {PRESET_AMOUNTS.map(preset => ( 118 + <Button 119 + key={preset} 120 + label={`$${preset}`} 121 + size="small" 122 + variant={parsedAmount === preset ? 'solid' : 'outline'} 123 + color={parsedAmount === preset ? 'primary' : 'secondary'} 124 + onPress={() => handlePresetPress(preset)}> 125 + <ButtonText>${preset}</ButtonText> 126 + </Button> 127 + ))} 128 + </View> 129 + 130 + <View> 131 + <TextField.LabelText> 132 + <Trans>Custom amount</Trans> 133 + </TextField.LabelText> 134 + <View style={[a.flex_row, a.align_center, a.gap_xs]}> 135 + <Text style={[a.text_md]}>$</Text> 136 + <View style={[a.flex_1]}> 137 + <TextField.Root> 138 + <TextField.Input 139 + label={_(msg`Custom amount`)} 140 + value={amount} 141 + onChangeText={text => { 142 + setAmount(text) 143 + setError(null) 144 + }} 145 + keyboardType="numeric" 146 + placeholder={_(msg`Enter amount`)} 147 + /> 148 + </TextField.Root> 149 + </View> 150 + </View> 151 + {validationError && ( 152 + <Text style={[a.text_sm, a.pt_xs, {color: t.palette.negative_500}]}> 153 + {validationError} 154 + </Text> 155 + )} 156 + </View> 157 + 158 + <SegmentedControl.Root 159 + label={_(msg`Donation frequency`)} 160 + type="radio" 161 + value={recurring ? 'monthly' : 'one-time'} 162 + onChange={handleFrequencyChange}> 163 + <SegmentedControl.Item value="one-time" label={_(msg`One-time`)}> 164 + <SegmentedControl.ItemText> 165 + <Trans>One-time</Trans> 166 + </SegmentedControl.ItemText> 167 + </SegmentedControl.Item> 168 + <SegmentedControl.Item value="monthly" label={_(msg`Monthly`)}> 169 + <SegmentedControl.ItemText> 170 + <Trans>Monthly</Trans> 171 + </SegmentedControl.ItemText> 172 + </SegmentedControl.Item> 173 + </SegmentedControl.Root> 174 + 175 + {error && ( 176 + <Text style={[a.text_sm, {color: t.palette.negative_500}]}> 177 + {error} 178 + </Text> 179 + )} 180 + 181 + <Button 182 + label={buttonLabel} 183 + size="large" 184 + variant="solid" 185 + color="primary" 186 + disabled={!isValid || loading} 187 + onPress={handleSubmit}> 188 + <ButtonText> 189 + {loading ? <Trans>Processing...</Trans> : buttonLabel} 190 + </ButtonText> 191 + </Button> 192 + </View> 193 + ) 194 + }
+23 -4
src/view/shell/Drawer.tsx
··· 35 35 Hashtag_Filled_Corner0_Rounded as HashtagFilled, 36 36 Hashtag_Stroke2_Corner0_Rounded as Hashtag, 37 37 } from '#/components/icons/Hashtag' 38 + import {Heart2_Stroke2_Corner0_Rounded as Heart} from '#/components/icons/Heart2' 38 39 import { 39 40 HomeOpen_Filled_Corner0_Rounded as HomeFilled, 40 41 HomeOpen_Stoke2_Corner0_Rounded as Home, ··· 253 254 Linking.openURL(HELP_DESK_URL) 254 255 }, []) 255 256 257 + const onPressSupport = React.useCallback(() => { 258 + navigation.navigate('Support') 259 + setDrawerOpen(false) 260 + }, [navigation, setDrawerOpen]) 261 + 256 262 const onPressContribute = React.useCallback(() => { 257 - Linking.openURL( 258 - 'https://opencollective.com/blacksky/contribute/backer-59760/checkout', 259 - ) 260 - }, []) 263 + navigation.navigate('Support') 264 + setDrawerOpen(false) 265 + }, [navigation, setDrawerOpen]) 261 266 262 267 // rendering 263 268 // = ··· 311 316 onPress={onPressProfile} 312 317 /> 313 318 <SettingsMenuItem onPress={onPressSettings} /> 319 + <SupportMenuItem onPress={onPressSupport} /> 314 320 </> 315 321 ) : ( 316 322 <> ··· 631 637 ) 632 638 } 633 639 SettingsMenuItem = React.memo(SettingsMenuItem) 640 + 641 + let SupportMenuItem = ({onPress}: {onPress: () => void}): React.ReactNode => { 642 + const {_} = useLingui() 643 + const t = useTheme() 644 + return ( 645 + <MenuItem 646 + icon={<Heart style={[t.atoms.text]} width={iconWidth} />} 647 + label={_(msg`Support`)} 648 + onPress={onPress} 649 + /> 650 + ) 651 + } 652 + SupportMenuItem = React.memo(SupportMenuItem) 634 653 635 654 function MenuItem({icon, label, count, bold, onPress}: MenuItemProps) { 636 655 const t = useTheme()
+22
src/view/shell/desktop/LeftNav.tsx
··· 50 50 Hashtag_Stroke2_Corner0_Rounded as Hashtag, 51 51 } from '#/components/icons/Hashtag' 52 52 import { 53 + Heart2_Filled_Stroke2_Corner0_Rounded as HeartFilled, 54 + Heart2_Stroke2_Corner0_Rounded as Heart, 55 + } from '#/components/icons/Heart2' 56 + import { 53 57 HomeOpen_Filled_Corner0_Rounded as HomeFilled, 54 58 HomeOpen_Stoke2_Corner0_Rounded as Home, 55 59 } from '#/components/icons/HomeOpen' ··· 803 807 /> 804 808 } 805 809 label={_(msg`Settings`)} 810 + /> 811 + <NavItem 812 + href="/support" 813 + icon={ 814 + <Heart 815 + aria-hidden={true} 816 + width={NAV_ICON_WIDTH} 817 + style={pal.text} 818 + /> 819 + } 820 + iconFilled={ 821 + <HeartFilled 822 + aria-hidden={true} 823 + width={NAV_ICON_WIDTH} 824 + style={pal.text} 825 + /> 826 + } 827 + label={_(msg`Support`)} 806 828 /> 807 829 808 830 <ComposeBtn />
+1 -3
src/view/shell/desktop/RightNav.tsx
··· 94 94 {showTrending && <SidebarTrendingTopics />} 95 95 96 96 <Text style={[a.leading_snug, t.atoms.text_contrast_low]}> 97 - <InlineLinkText 98 - to="https://opencollective.com/blacksky/contribute/backer-59760/checkout" 99 - label={_(msg`Support Us`)}> 97 + <InlineLinkText to="/support" label={_(msg`Support Us`)}> 100 98 {_(msg`Support Us`)} 101 99 </InlineLinkText> 102 100 {' • '}
+54 -4
yarn.lock
··· 2469 2469 "@babel/parser" "^7.28.6" 2470 2470 "@babel/types" "^7.28.6" 2471 2471 2472 - "@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3", "@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": 2472 + "@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": 2473 + version "7.29.0" 2474 + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" 2475 + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== 2476 + dependencies: 2477 + "@babel/code-frame" "^7.29.0" 2478 + "@babel/generator" "^7.29.0" 2479 + "@babel/helper-globals" "^7.28.0" 2480 + "@babel/parser" "^7.29.0" 2481 + "@babel/template" "^7.28.6" 2482 + "@babel/types" "^7.29.0" 2483 + debug "^4.3.1" 2484 + 2485 + "@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": 2473 2486 version "7.29.0" 2474 2487 resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" 2475 2488 integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== ··· 5870 5883 integrity sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw== 5871 5884 dependencies: 5872 5885 tslib "^2.6.2" 5886 + 5887 + "@stripe/react-stripe-js@^6.1.0": 5888 + version "6.1.0" 5889 + resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-6.1.0.tgz#644ff17db8de454d8746ee76f45ee727442512f4" 5890 + integrity sha512-LbKbRv4+wUSHLb5VNxqiYcKaqXPvTju0bJaF0RrzH0h4+aKWDXAk4RzUBcpNxxj8KtjuxICElANs1Li7aTv1IQ== 5891 + dependencies: 5892 + prop-types "^15.7.2" 5893 + 5894 + "@stripe/stripe-js@^9.0.1": 5895 + version "9.0.1" 5896 + resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-9.0.1.tgz#2924ebe40857f934a5348b743fee9ecb993c7cce" 5897 + integrity sha512-un0URSosrW7wNr7xZ5iI2mC9mdeXZ3KERoVlA2RdmeLXYxHUPXq0yHzir2n/MtyXXEdSaELtz4WXGS6dzPEeKA== 5873 5898 5874 5899 "@tanstack/query-async-storage-persister@^5.25.0": 5875 5900 version "5.90.22" ··· 16124 16149 resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" 16125 16150 integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== 16126 16151 16127 - "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 16152 + "string-width-cjs@npm:string-width@^4.2.0": 16153 + version "4.2.3" 16154 + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 16155 + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 16156 + dependencies: 16157 + emoji-regex "^8.0.0" 16158 + is-fullwidth-code-point "^3.0.0" 16159 + strip-ansi "^6.0.1" 16160 + 16161 + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 16128 16162 version "4.2.3" 16129 16163 resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 16130 16164 integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== ··· 16215 16249 dependencies: 16216 16250 safe-buffer "~5.1.0" 16217 16251 16218 - "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 16252 + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 16219 16253 version "6.0.1" 16220 16254 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 16221 16255 integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== ··· 16228 16262 integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 16229 16263 dependencies: 16230 16264 ansi-regex "^4.1.0" 16265 + 16266 + strip-ansi@^6.0.0, strip-ansi@^6.0.1: 16267 + version "6.0.1" 16268 + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 16269 + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 16270 + dependencies: 16271 + ansi-regex "^5.0.1" 16231 16272 16232 16273 strip-ansi@^7.0.1: 16233 16274 version "7.1.2" ··· 17432 17473 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 17433 17474 integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== 17434 17475 17435 - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: 17476 + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 17436 17477 version "7.0.0" 17437 17478 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 17438 17479 integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== ··· 17445 17486 version "6.2.0" 17446 17487 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 17447 17488 integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 17489 + dependencies: 17490 + ansi-styles "^4.0.0" 17491 + string-width "^4.1.0" 17492 + strip-ansi "^6.0.0" 17493 + 17494 + wrap-ansi@^7.0.0: 17495 + version "7.0.0" 17496 + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 17497 + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 17448 17498 dependencies: 17449 17499 ansi-styles "^4.0.0" 17450 17500 string-width "^4.1.0"