Compare commits

..

1811 Commits

Author SHA1 Message Date
Eric Bailey eb2e901682 Remove staleTime 2023-11-14 14:16:24 -06:00
Eric Bailey 456f2fa2af Fix type 2023-11-14 13:59:04 -06:00
Eric Bailey 97e548e869 Merge remote-tracking branch 'origin' into eric/fix-self-mention
* origin:
  Fix root sibling context issue (#1902)
2023-11-14 13:56:34 -06:00
Eric Bailey 0e79c38dfd Use queryClient 2023-11-14 13:51:33 -06:00
Eric Bailey 2cf3f4c9b7 Fix self mention, resolve handle 2023-11-14 13:14:46 -06:00
Eric Bailey 00f8c8b06d Fix root sibling context issue (#1902) 2023-11-14 10:46:37 -08:00
Paul Frazee 0a26e78dcb Composer update (react-query refactor) (#1899)
* Move composer state to a context

* Rework composer to use RQ

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2023-11-14 10:41:55 -08:00
Paul Frazee c687172de9 Fix poll latest loop (#1901)
* Avoid pollLatest loop

* Set poll interval on profile feeds
2023-11-14 12:33:05 -06:00
Eric Bailey 3fde1bea1b Handle end of feed (#1898)
* Handle end of feed

* Add isFetching
2023-11-14 11:28:40 -06:00
Eric Bailey 4355f0fd9a Refactor onboarding suggested follows (#1897)
* Refactor onboarding suggested follows

* Fix error state, track call

* Remove todo

* Use flatmap

* Add additional try catch

* Remove todo
2023-11-14 11:25:37 -06:00
Paul Frazee a81c4b68fa Update Muted and Blocked accounts screens (react-query refactor) (#1892)
* Add my-blocked-accounts and my-muted-accounts queries

* Update ProfileCard to use the profile shadow cache and useModerationOpts

* Update blocked accounts and muted accounts screens
2023-11-13 17:30:56 -08:00
Paul Frazee 0501c2be77 Profile cleanup (react-query refactor) (#1891)
* Only fetch profile tab content when focused

* Fix keys

* Add missing behaviors to post tabs

* Delete old profile mobx model
2023-11-13 15:12:41 -08:00
Paul Frazee 47204d9551 Update profile preview to use react-query (#1890) 2023-11-13 14:57:53 -08:00
Paul Frazee 9fca7b3af6 Add feedgens tab to profile (#1889) 2023-11-13 14:46:19 -08:00
Eric Bailey b04748e703 Factor out store from post-feed query (#1888) 2023-11-13 14:07:18 -08:00
Eric Bailey 06eb8b9a4c Factor our feed source model (#1887)
* Refactor first onboarding step

* Replace old FeedSourceCard

* Clean up CustomFeedEmbed

* Remove discover feeds model

* Refactor ProfileFeed screen

* Remove useCustomFeed

* Delete some unused models

* Rip out more prefs

* Factor out treeView from thread comp

* Improve last commit
2023-11-13 13:53:57 -08:00
Paul Frazee a01463788d More profile refactor updates (#1886)
* Update the profile avatar lightbox

* Update profile editor

* Add dynamic likes tab

* Add dynamic feeds and lists tabs

* Implement lists listing on profiles
2023-11-13 13:29:33 -08:00
dan 8217761363 Fix jump for web pager (#1884) 2023-11-13 13:03:47 -08:00
dan bb4ed3cd49 Fix lint on main (#1885) 2023-11-13 13:01:26 -08:00
dan e1938931e0 Refactor profile screen to use new pager and react-query (#1870)
* Profile tabs WIP

* Refactor the profile screen to use react-query (WIP)

* Add the profile shadow and get follow, mute, and block working

* Cleanup

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-11-13 10:35:15 -08:00
Eric Bailey c3edde8ac6 More prefs cleanup (#1882)
* Update useHomeTabs

* Use queryClient to fetch

* Replace useHomeTabs and useDesktopRightNavItems

* Fix type error

* Some cleanup
2023-11-13 10:21:53 -08:00
Eric Bailey 37a2204483 Update clear account behavior, ensure agent is set (#1881) 2023-11-13 08:20:38 -08:00
Paul Frazee b445c15cc9 Refactor notifications to use react-query (#1878)
* Move broadcast channel to lib

* Refactor view/com/post/Post and remove temporary 2 components

* Add useModerationOpts hook

* Refactor notifications to use react-query

* Fix: only trigger updates in useModerationOpts when the values have changed

* Implement unread notification tracking

* Add moderation filtering to notifications

* Handle native/push notifications

* Remove dead code

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2023-11-12 18:13:11 -08:00
Eric Bailey c584a3378d Refactor My Feeds (#1877)
* Refactor My Feeds screen

* Remove unused feed UI models

* Add back PTR
2023-11-12 16:26:02 -08:00
Paul Frazee d9e0a927c1 Refactor lists to use new queries (#1875)
* Refactor lists queries to react-query

* Delete old lists-list model

* Implement list, list-members, and list-memberships react-queries

* Update CreateOrEditList modal

* First pass at my-follows and actor-autocomplete queries

* Update ListAddUserModal to use new queries, change to ListAddRemoveUsersModal

* Update UserAddRemoveLists modal

* Remove old TODO

* Fix indent, autocomplete query

* Add a todo

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2023-11-12 12:45:25 -08:00
Eric Bailey 05b728fffc Eric/preferences (#1873)
* Add initial preferences query, couple mutations

* Remove unused

* Clean up labels, migrate getModerationOpts

* Add birth date handling

* Migrate feed prefs

* Migrate thread view prefs

* Migrate homeFeed to use existing key name

* Fix up saved feeds in response, no impl yet

* Migrate saved feeds to new hooks

* Clean up more of preferences

* Fix PreferencesThreads load state

* Fix modal dismissal

* Small spacing fix

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-11-12 11:31:11 -08:00
Paul Frazee c8c308e31e Refactor feeds to use react-query (#1862)
* Update to react-query v5

* Introduce post-feed react query

* Add feed refresh behaviors

* Only fetch feeds of visible pages

* Implement polling for latest on feeds

* Add moderation filtering to slices

* Handle block errors

* Update feed error messages

* Remove old models

* Replace simple-feed option with disable-tuner option

* Add missing useMemo

* Implement the mergefeed and fixes to polling

* Correctly handle failed load more state

* Improve error and empty state behaviors

* Clearer naming
2023-11-10 15:34:25 -08:00
dan 51f04b9620 Use min height for pager lists and increase it (#1869) 2023-11-10 22:29:12 +00:00
dan 86b4842d67 Fix initial pager gap after fast scroll (#1868) 2023-11-10 21:23:17 +00:00
dan 91f8a23fbc Scroll sync in the pager without jumps (#1863) 2023-11-10 19:54:33 +00:00
dan 65def37165 Push useAnimatedScrollHandler down everywhere to work around bugs (#1866)
* Move useOnMainScroll handlers to leaves

* Force Feed to always take handlers

* Pass handlers from the pager
2023-11-10 19:00:46 +00:00
Eric Bailey e0e5bc8fd8 Fix type errors (#1867) 2023-11-10 18:20:33 +00:00
Eric Bailey 6513055d02 Merge pull request #1860 from bluesky-social/eric/startup
Web login/signup and shell
2023-11-10 11:31:36 -06:00
Eric Bailey 436a14eabb Pare down session as much as possible 2023-11-10 09:59:04 -06:00
Eric Bailey d0d93168d4 Clean up isDirty handling 2023-11-10 08:59:39 -06:00
dan 8d7475c130 Work around web stale closure bug in Reanimated (#1865) 2023-11-10 14:58:13 +00:00
Eric Bailey 499021229a Remove error states, just best effort 2023-11-10 08:53:23 -06:00
Eric Bailey 60386f8f07 Swap order 2023-11-10 08:48:15 -06:00
Eric Bailey b0c9cce5c3 Follow conventions for query, use isDirty flag in session store to avoid unneccessary writes 2023-11-10 08:46:45 -06:00
Eric Bailey 742f53d1ec Comments 2023-11-09 20:46:45 -06:00
Eric Bailey 2d7b89c6a1 Cleanup getProfile 2023-11-09 20:39:54 -06:00
Eric Bailey ab878ba9a6 Web login/signup and shell 2023-11-09 20:35:17 -06:00
dan 487d871cfd Pull useAnimatedScrollHandler back up (#1858)
* Revert "Pull animated scroll handler down from pager"

This reverts commit ecebb78e40.

* Only handle onScroll for current page
2023-11-09 23:47:54 +00:00
Paul Frazee fb4f5709c4 Refactor post threads to use react query (#1851)
* Add post and post-thread queries

* Update PostThread components to use new queries

* Move from normalized cache to shadow cache model

* Merge post shadow into the post automatically

* Remove dead code

* Remove old temporary session

* Fix: set agent on session creation

* Temporarily double-login

* Handle post-thread uri resolution errors
2023-11-09 15:35:25 -08:00
Eric Bailey 625cbc435f First pass at a session handler (#1850)
* First pass at a session handler

* TODOs

* Fix recursion

* Couple more things

* Add back resume session concept

* Handle ready

* Cleanup of initial loading states

* Handle init failure

* Cleanup

* Remove account

* Add updateCurrentAccount

* Remove log

* Cleanup

* Integrate removeAccount

* Add hasSession

* Add to App.native, harden migration

* Use effect to persist data
2023-11-09 15:14:51 -08:00
dan 664e7a91a9 Fix tab alignment on the web (#1857) 2023-11-09 21:56:25 +00:00
dan c627a766cd Show tabs when swiping feeds (#1856) 2023-11-09 21:45:31 +00:00
dan 7a55ca6133 Sync top/bottom bar disappearance to the scroll (#1855)
* Disable existing code that toggles shell

* Make shell mode a float

* Translate based on the gesture

* Track header and footer heights

* Add web support

* Fix types and cleanup

* Add back isScrolled logic

* Add comments
2023-11-09 12:15:05 -08:00
Ansh 1dcf882619 Hotfix internationalization on mobile (#1854)
* hotfix internationalization on mobile

* remove comment
2023-11-09 10:49:46 -08:00
Ansh 4c7850f8c4 Internationalization & localization (#1822)
* install and setup lingui

* setup dynamic locale activation and async loading

* first pass of automated replacement of text messages

* add some more documentaton

* fix nits

* add `es` and `hi`locales for testing purposes

* make accessibilityLabel localized

* compile and extract new messages

* fix merge conflicts

* fix eslint warning

* change instructions from sending email to opening PR

* fix comments
2023-11-09 10:04:16 -08:00
dan 82059b7ee1 Hide/show header and footer without re-renders, take two (#1849)
* Remove callsites using the state value

* Remove unused code

* Change shell mode without re-renders

* Adjust "write your reply" for mode
2023-11-09 00:25:27 +00:00
Eric Bailey bd531f2344 Pull language methods into api context (#1847)
* Pull language methods into api context

* Rename for consistency
2023-11-08 11:55:38 -08:00
Eric Bailey f18b15241a Add modal state provider, replace usage except methods (#1833)
* Add modal state provider, replace usage except methods

* Replace easy spots

* Fix sticky spots

* Replace final usages

* Memorize context objects

* Add more warnings
2023-11-08 10:34:10 -08:00
Paul Frazee 5eadadffbf State layer cleanup: move alt-text-required into preferences and fix a bug in reminders (#1845)
* Move alt-text-required into preferences

* Fix bug: reminders now using new onboarding state
2023-11-08 09:46:07 -08:00
Paul Frazee 5843e212c0 Move language preferences to new persistence + context (#1837) 2023-11-08 09:38:28 -08:00
Paul Frazee e75b2d508b Move invite-state to new persistence + context and replace the notifications with just showing uses in the modal (#1840) 2023-11-08 09:10:59 -08:00
Paul Frazee 74f8390f1d Move muted threads to new persistence + context (#1838) 2023-11-08 09:08:42 -08:00
Paul Frazee 4afed4be28 Move onboarding state to new persistence + reducer context (#1835) 2023-11-08 09:04:06 -08:00
Paul Frazee 3a211017d3 Move require alt-text to new persistence + context (#1839) 2023-11-08 08:52:01 -08:00
Paul Frazee 2acc88e78d Move reminders to new persisted state layer (#1834) 2023-11-07 16:39:13 -08:00
Eric Bailey 96d8faf4b0 Add persistent state provider (#1830)
* Add persistent state provider

* Catch write error

* Handle read errors, update error msgs

* Fix lint

* Don't provide initial state to loader

* Remove colorMode from shell state

* Idea: hook into persisted context from other files

* Migrate settings to new hook

* Rework persisted state to split individual contexts

* Tweak persisted schema and validation

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-11-07 14:06:17 -08:00
Eric Bailey bfe196bac5 Extract shell state into separate context (#1824)
* WIP

* Add shell state

* Integrate new shell state for drawer and minimal shell mode

* Replace isDrawerSwipeDisabled

* Split shell state into separate contexts to avoid needless re-renders

* Fix typo

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-11-07 11:37:47 -08:00
Noritada Kobayashi 7158157f5f Correct meta tag attributes (#1829) 2023-11-07 09:56:44 -08:00
dan 7b2a7db83c Pull animated scroll handler down from pager (#1827) 2023-11-07 08:46:39 -08:00
dan fa821943da Use Sentry only for errors (#1776)
* Use Sentry only for errors

* Fix merge
2023-11-07 04:30:00 +00:00
Eric Bailey 7ffbee18b5 Fix removal of old lists from saved feeds (#1823)
* Fix removal of old lists from saved feeds

* Fix saved feed removal race condition
2023-11-06 18:51:46 -08:00
dan a4baf14e4b Fix accidental unwrapped strings (#1826) 2023-11-06 14:42:25 -08:00
dan d715246e26 Fix sticky pager jumps (#1825)
* Defer showing pager content until its header settles

* Introduce the concept of headerOnlyHeight

* Keep headerOnlyHeight in state, make headerHeight derived

* Hide content until *both* header (only) and tabbar are measured

* Hide tabbar to read its layout earlier

* Give consistent keys to pages
2023-11-06 22:30:10 +00:00
dan 4c00fc576d Fix minor list layout bugs (#1810)
* Fix accidental border on mobile

* Fix lists list to take full screen
2023-11-06 17:15:01 +00:00
Eric Bailey 95b5e642dc Merge pull request #1814 from bluesky-social/eric/replace-logger
Remove old logger
2023-11-04 14:00:38 -05:00
Eric Bailey f6fe980a64 Remove old logger 2023-11-04 13:43:28 -05:00
Eric Bailey f51351e80d Replace all logs with new logger 2023-11-04 13:42:36 -05:00
Eric Bailey e49a3d8a56 Merge pull request #1813 from bluesky-social/eric/app-903-extract-logger-into-singleton
Add new logger
2023-11-04 13:12:46 -05:00
Eric Bailey 0c76866757 Add logDump tests, ensure Log screen is reversed 2023-11-04 13:09:12 -05:00
Eric Bailey 7e29ebbadb Fix other error logs while I'm at it 2023-11-04 12:58:50 -05:00
Eric Bailey df0dcf32f9 Fix immediate TS errors 2023-11-04 12:42:27 -05:00
Eric Bailey 5fd41ad5a2 Comment out sentry in prod for now 2023-11-04 12:28:30 -05:00
Eric Bailey fd93bf2146 Add new logger 2023-11-04 12:18:56 -05:00
Paul Frazee 46c2564e65 Increment iOS buildnumber & android version code for release 2023-11-03 16:44:59 -07:00
Paul Frazee ebad6d2b1a ListAddUser modal UX improvements (#1809)
* typo

* Add loading state to ListAddUser

* Improve UI/UX of ListAddUser
2023-11-03 16:44:00 -07:00
Paul Frazee 4de852ded8 Refresh on scroll-to-top by active section press (#1807) 2023-11-03 14:53:47 -07:00
Paul Frazee 445f976881 Improved list and feed errors (#1798)
* Fix error-state rendering of ProfileList

* Unsave/unpin lists on delete

* Improve handling of failing feedgens

* Only show 'remove' btn on feed DNE
2023-11-03 14:18:44 -07:00
Eric Bailey 691af26895 Add subpath imports (#1808) 2023-11-03 14:17:40 -07:00
Paul Frazee 047f74c67d Fix copyright report link (#1799) 2023-11-02 22:09:31 -07:00
Paul Frazee 9437d743e2 Bump ios build number 2023-11-02 19:55:15 -07:00
Paul Frazee 846c130706 Lookup did for my profile at screen to avoid bad actor error (#1800) 2023-11-02 19:54:43 -07:00
dan 8747c215b1 Work around a startup stall caused by expo-image on low-end Android (#1801)
* Use plain RN image for startup-blocking UI

* Add comments
2023-11-02 19:33:18 -07:00
Paul Frazee 5e2025e60a Bump @atproto/api@0.6.23 2023-11-02 18:27:20 -07:00
Eric Bailey f258289be9 Treat PHP pages as HTML (#1797) 2023-11-02 15:16:31 -07:00
Paul Frazee 0f4bfcb05d Replace draglist due to upstream errors (#1795)
* Replace draggable flatlist with simple sort buttons

* Remove react-native-draggable-flatlist dep

* Fix hitslops

* Update lockfile

* Remove bad flex:1
2023-11-02 12:09:57 -07:00
dan 0e8723c3bb Patch facebook/metro#1130 to profile module init (#1796) 2023-11-02 18:48:07 +00:00
Paul Frazee 237bce391b Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-11-02 09:43:47 -07:00
Paul Frazee c8b9407e0e Merge branch 'flicknow-make-choose-account-scrollable' into main 2023-11-02 09:43:37 -07:00
Paul Frazee b782cd0d06 Fix max-height issues 2023-11-02 09:42:29 -07:00
Paul Frazee 4e5a99d4d3 Merge branch 'make-choose-account-scrollable' of https://github.com/flicknow/social-app into flicknow-make-choose-account-scrollable 2023-11-02 09:34:49 -07:00
Spandan Tripathy d7744c2590 Update build.md (#1785) 2023-11-02 09:27:31 -07:00
Paul Frazee 29bfed78f7 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-11-01 21:14:47 -07:00
Paul Frazee 232e90c0a0 1.56 2023-11-01 21:14:39 -07:00
Paul Frazee 59271663b5 Store saved feeds on the root store so we can load on init (#1793) 2023-11-01 18:45:59 -07:00
flicknow 5f135aa021 Make choose account form scrollable 2023-11-01 20:55:06 -04:00
Paul Frazee f57a8cf8ba Lists updates: curate lists and blocklists (#1689)
* Add lists screen

* Update Lists screen and List create/edit modal to support curate lists

* Rework the ProfileList screen and add curatelist support

* More ProfileList progress

* Update list modals

* Rename mutelists to modlists

* Layout updates/fixes

* More layout fixes

* Modal fixes

* List list screen updates

* Update feed page to give more info

* Layout fixes to ListAddUser modal

* Layout fixes to FlatList and Feed on desktop

* Layout fix to LoadLatestBtn on Web

* Handle did resolution before showing the ProfileList screen

* Rename the CustomFeed routes to ProfileFeed for consistency

* Fix layout issues with the pager and feeds

* Factor out some common code

* Fix UIs for mobile

* Fix user list rendering

* Fix: dont bubble custom feed errors in the merge feed

* Refactor feed models to reduce usage of the SavedFeeds model

* Replace CustomFeedModel with FeedSourceModel which abstracts feed-generators and lists

* Add the ability to pin lists

* Add pinned lists to mobile

* Remove dead code

* Rework the ProfileScreenHeader to create more real-estate for action buttons

* Improve layout behavior on web mobile breakpoints

* Refactor feed & list pages to use new Tabs layout component

* Refactor to ProfileSubpageHeader

* Implement modlist block and mute

* Switch to new api and just modify state on modlist actions

* Fix some UI overflows

* Fix: dont show edit buttons on lists you dont own

* Fix alignment issue on long titles

* Improve loading and error states for feeds & lists

* Update list dropdown icons for ios

* Fetch feed display names in the mergefeed

* Improve rendering off offline feeds in the feed-listing page

* Update Feeds listing UI to react to changes in saved/pinned state

* Refresh list and feed on posts tab press

* Fix pinned feed ordering UI

* Fixes to list pinning

* Remove view=simple qp

* Add list to feed tuners

* Render richtext

* Add list href

* Add 'view avatar'

* Remove unused import

* Fix missing import

* Correctly reflect block by list state

* Replace the <Tabs> component with the more effective <PagerWithHeader> component

* Improve the responsiveness of the PagerWithHeader

* Fix visual jank in the feed loading state

* Improve performance of the PagerWithHeader

* Fix a case that would cause the header to animate too aggressively

* Add the ability to scroll to top by tapping the selected tab

* Fix unit test runner

* Update modlists test

* Add curatelist tests

* Fix: remove link behavior in ListAddUser modal

* Fix some layout jank in the PagerWithHeader on iOS

* Simplify ListItems header rendering

* Wait for the appview to recognize the list before proceeding with list creation

* Fix glitch in the onPageSelecting index of the Pager

* Fix until()

* Copy fix

Co-authored-by: Eric Bailey <git@esb.lol>

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2023-11-01 16:15:40 -07:00
dan f9944b55e2 Simplify loading emoji data (#1790) 2023-11-01 17:49:07 +00:00
dan 9fb20517ae Remove unused Intl.Segmenter polyfill (#1789) 2023-11-01 16:52:34 +00:00
Eric Bailey 4bf1719092 Merge pull request #1788 from bluesky-social/eric/app-899-remove-icons-from-startup-code
Revise icons startup code
2023-11-01 10:38:37 -05:00
dan 85c26fb5a8 Instrument module init in DEV (#1787) 2023-11-01 15:31:33 +00:00
Eric Bailey b42806a6e0 Revise icons startup code 2023-11-01 10:15:37 -05:00
Samiksha Mishra adb5ce2961 Updated the mistake (#1777)
Corrected the typo error
2023-10-31 08:39:35 -07:00
Tarık b5f36dc7a3 UI/UX improvements in Edit profile screen (#1767)
* Remove cropped area in Edit profile screen iOS

* Hide cancel button when saving changes in EditProfile

* Disable fadeOut animation cancel button for web in EditProfile screen

Since react-native-reanimated is not configured for web support (https://docs.swmansion.com/react-native-reanimated/docs/2.x/fundamentals/web-support/), we are enabling fade out animation for iOS and android solely
2023-10-30 21:01:25 -07:00
Igor Shevchenko b2d4771b5f chore: fix typos in testing.md (#1764) 2023-10-30 20:40:30 -07:00
Eric Bailey ddf0a1cced Filter non-self threads from profile view (#1757) 2023-10-30 20:40:06 -07:00
Paul Frazee 40752982da Merge branch 'main' of https://github.com/haideralipunjabi/social-app into main 2023-10-30 19:26:23 -07:00
Leo Lamprecht 68c809b09a Use more beautiful title separator (#1728) 2023-10-30 19:25:19 -07:00
Pouria Delfanazari 21f7a2a247 Allow back navigation to home on profile header (#1717)
Navigate back to home if there is no navigation history.
2023-10-30 19:23:41 -07:00
Paul Frazee 97ce9a73d2 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-10-30 19:18:34 -07:00
Paul Frazee 33ea9ccef7 Merge branch 'Tanza3D-improve-post-button' into main 2023-10-30 19:18:24 -07:00
Paul Frazee 33a87ca22e Yep, one pixel 2023-10-30 19:18:02 -07:00
dan ef1d6ee490 Log time to first paint (#1775)
* Log time to first paint

* Fix TS
2023-10-31 02:07:14 +00:00
Paul Frazee 1eb623ee2f Merge branch 'improve-post-button' of https://github.com/Tanza3D/social-app into Tanza3D-improve-post-button 2023-10-30 18:54:29 -07:00
Paul Frazee d5c7b8ceb8 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-10-30 18:07:33 -07:00
Paul Frazee bae429202a Merge branch 'liby-fix/step2-waitlist-link-accessibility' into main 2023-10-30 18:06:58 -07:00
Paul Frazee 0747193977 Fix a11y prop 2023-10-30 18:06:31 -07:00
dan 4a4106ba45 Don't inline-require Babel runtime helpers (#1774) 2023-10-31 00:59:00 +00:00
Paul Frazee 2577cbf252 Merge branch 'fix/step2-waitlist-link-accessibility' of https://github.com/liby/social-app into liby-fix/step2-waitlist-link-accessibility 2023-10-30 17:50:44 -07:00
Paul Frazee 9f33badfff Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-10-30 17:50:31 -07:00
Paul Frazee e18e7ce34a Merge branch 'liby-bugfix/desktop-web-text-link-media-query-issue' into main 2023-10-30 17:45:07 -07:00
Paul Frazee 9826e7c7b9 Rename component to match new behavior 2023-10-30 17:44:58 -07:00
dan 515c9d5529 Don't compile Hermes-supported features with Babel (#1773)
* Don't transpile Hermes-supported features

* Disable the object spread plugin

We're using Hermes, and Hermes supports object spread.
We can remove this patch when we upgrade Expo because it'll be conditional there.
2023-10-31 00:23:01 +00:00
Paul Frazee 871ded193c Merge branch 'bugfix/desktop-web-text-link-media-query-issue' of https://github.com/liby/social-app into liby-bugfix/desktop-web-text-link-media-query-issue 2023-10-30 17:11:17 -07:00
Paul Frazee e1dcedd87e Merge branch 'elijah-wright-patch-1' into main 2023-10-30 17:08:15 -07:00
Paul Frazee 1acf4969c5 Fix lint 2023-10-30 17:08:07 -07:00
Paul Frazee dbbd71c6d0 Merge branch 'patch-1' of https://github.com/elijah-wright/social-app into elijah-wright-patch-1 2023-10-30 17:03:34 -07:00
dan 84ee64025f Let Metro handle import/export instead of Babel (#1772)
* Let Metro handle import/export instead of Babel

* Keep using Babel for ESM->CJS in tests
2023-10-30 21:54:23 +00:00
Paul Frazee 6c11c0b81d 1.55 2023-10-30 09:58:58 -07:00
dan 7ebf1ed371 Initialize screen modules lazily (#1763)
* Initialize screen modules lazily

* Use getComponent (thanks @ecreeth for the tip)
2023-10-27 19:06:28 +01:00
dan 53afafb04f Remove redundant linking listeners (#1760) 2023-10-26 21:05:48 -07:00
dan 3e5a64b454 Fix white flash on startup (#1759) 2023-10-27 04:06:40 +01:00
dan 46f3265936 Enable inline requires (#1756) 2023-10-26 17:54:15 -07:00
Paul Frazee a1a61ef2e5 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-10-26 10:40:35 -07:00
Ansh 927cee18d9 Update Analytics (#1743) 2023-10-26 08:37:14 -07:00
Haider Ali Punjabi 7fa0708e0e Added show more for long posts 2023-10-26 19:38:39 +05:30
Ansh c13b6946ba 1721 Update support link (#1722)
* change support page copy

* fix grammar
2023-10-25 10:00:46 -07:00
Ansh ee80cae75f add scroll indicator on web to profile suggested follows card (#1724) 2023-10-25 09:54:52 -07:00
Ansh 1781b3aab7 allow enter key to trigger waitlist signup (#1723) 2023-10-25 09:54:04 -07:00
elliot 3426b24f67 Fixed CropImage modal aspect ratio buttons visibility in dark mode (#1730) 2023-10-25 09:41:56 -07:00
dan 4a4be1de1a Remove MobX from Link (#1745)
* Remove MobX from Link

* Keep memo() though

We previously had observer() apply it automatically, so re-add it
2023-10-25 08:47:21 -07:00
dan 32fbb9dba7 Simplify the avatar component (#1744)
* Copypaste UserAvatar to EditableUserAvatar

* Swap usages with onSelectNewAvatar to EditableUserAvatar

* Split prop types into UserAvatarProps and EditableUserAvatarProps

* Remove dead branches from EditableUserAvatar

* Remove dead branches from UserAvatar
2023-10-25 04:57:34 +01:00
dan c6e28f88e5 Fix four gallery images for Firefox (#1710) 2023-10-18 15:08:12 -04:00
Tanza3D db0de651ba Fix wonky comment 2023-10-18 14:14:45 +01:00
Tanza3D 6848ade046 Shrink to 16 again 2023-10-18 13:53:55 +01:00
Tanza3D de94acb6c8 Improve New Post button 2023-10-18 13:53:00 +01:00
Bryan Lee 78b374b43d Improved accessibility and interaction for waitlist Link in Step2 component 2023-10-15 06:26:56 +08:00
Paul Frazee 01e25c912c 1.54 2023-10-14 10:32:11 -07:00
Ansh 8e9cf182c2 Performance optimization (#1676)
* upgrade sentry to support profiling monitoring

* remove console logs in production builds

* feeds tab bar and bottom bar animation centralized

* refactor FeedPage out of Home

* add script to start in production mode

* move FAB inner to reanimated

* move FABInner back to `Animated` RN animation

* add perf commands

* add testing with Maestro and perf with Flashlight

* fix merge conflicts

* fix resourceClass name in eas.json

* fix onEndReachedThreshold in Feed

* memoize styles

* go back to old styling for LoadLatestBtn

* remove reanimated code from useMinimalShellMode

* move shell animations to hook/reanimated for perf

* fix empty state issue

* make shell animation feel smoother

* make shell animation more smooth

* run animation with autorun

* specify keys for tab bar properly

* remove comments

* remove already imported dep

* fix lint

* add testing instructions

* mock sentry-expo for jest

* fix jest mocks

* Fix the load-latest button on desktop and tablet

* Fix: don't move the FAB in tablet mode

* Fix type error

* Fix tabs bar positioning on tablet

* Fix types

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-10-13 18:54:35 -07:00
dan 9042f503c2 Scope drawer drag workaround to feed pagers (#1694) 2023-10-13 15:15:36 -07:00
dan abfd9a8c0b Toggle lightbox controls on tap (#1687)
* Make the lightbox controls animation smoother

* Toggle controls on tap

* Disable pointer events when hidden
2023-10-13 20:10:27 +01:00
dan f447eaa669 Fix profile preview jump (#1693)
* Add top inset for profile preview to match target screen

* Avoid flicker by waiting for profile screen navigation

* Fix glimmer to align with the content

* A more reliable (but non-scientific) fix for the flash

* Lower the timeout
2023-10-13 20:10:15 +01:00
dan d5ccbd76d5 Disable events on hidden bars (#1686) 2023-10-13 15:29:50 +01:00
dan eba9f8a166 Fix profile layout shift (#1690) 2023-10-13 15:25:16 +01:00
dan 2a1edab6d4 Don't re-render bars when showing/hiding them (#1691)
* Don't re-render bars when showing/hiding them

* Fix more cases

* Use autorun instead of reaction to fix first render
2023-10-13 15:24:28 +01:00
dan 4431cfe2d2 Fix crash when scrolling down on the web (#1684) 2023-10-12 13:15:19 -07:00
dan 997918547c Make shell hide/show animation smoother (#1683)
* Make shell hide/show animation smoother

* Also animate "load latest"
2023-10-12 21:02:17 +01:00
dan c2a1cf4e56 Fix layout shift for multi-image posts (#1673)
* Fix layout shift for multi-image posts

* Add a comment for the hack

* Use margins instead of gap

* Move alt label
2023-10-12 19:14:27 +01:00
Jake Gold d98e3a8b45 bskyweb: add rate limiting to reduce DoSability 2023-10-11 13:00:59 -07:00
Eric Bailey d40d931d86 use new zeed-dom version (#1671) 2023-10-11 09:04:06 -07:00
Paul Frazee 5dd673d1ff 1.53 2023-10-10 17:32:19 -07:00
Eric Bailey 10deddd0ad resolve fork of zeed-dom (#1663) 2023-10-10 16:23:12 -07:00
dan a48c213af5 Port remaining lightbox code to Reanimated (#1669)
* Port remaining lightbox code to Reanimated

* Fix  memoization
2023-10-10 23:48:31 +01:00
Paul Frazee 0b44af38ea Update testrunner to use new dev-env [WIP] (#1575)
* Update testrunner to use new dev-env

* Fix label testcase

* Vendor the dev-infra scripts from the atproto repo for the dev-env server runner

* Bump detox to fix the ios sim control issue

* Use iphone 15 pro for tests

* Ensure the reminders never trigger during tests

* Skip the shell tests due to a crash bug with detox and the drawer
2023-10-10 15:46:27 -07:00
dan aad8d12ede Fix MobX crash for Android lightbox (#1668)
* Fix MobX crash for Android lightbox

* Reorder props to match between forks
2023-10-10 23:02:00 +01:00
dan 209d8b683c Change lightbox to use Pager (#1666)
* Change lightbox to use Pager

* Fix crash issue on ios

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-10-10 22:37:28 +01:00
Ansh aa085b0b14 make empty feed required (#1667) 2023-10-10 14:32:00 -07:00
Paul Frazee 4d450da194 Only warn on links to bsky.app if it represents itself as another url (#1662)
* Only warn on links to bsky.app if it represents itself as another url (close #1652)

* Clean up
2023-10-10 14:02:50 -07:00
Paul Frazee e878da04a1 Fix keyboard double pad issue in email change & verify modals (#1664) 2023-10-10 14:02:31 -07:00
Eric Bailey fc28fc639f Don't highlight tags in composer yet (#1665) 2023-10-10 13:44:27 -07:00
Paul Frazee d68b4ca856 Fix: fetch follows on desktop search for typeahead (#1660) 2023-10-10 12:27:32 -07:00
dan 60c0db03f7 Remove duplicate modal container (#1661) 2023-10-10 11:57:14 -07:00
dan d47ff542da Drive-by lightbox refactors (#1659)
* Remove dead code from lightbox

* Rename imageIndex prop to initialImageIndex

* Rename currentImageIndex to imageIndex
2023-10-10 11:07:21 -07:00
Paul Frazee bc2c44cb98 Only prompt users once to verify email (according to local storage) close #1657 (#1658) 2023-10-10 10:57:09 -07:00
Paul Frazee 098f4b526e Revert "Fix invite codes flash on desktop, use loading placeholder (#1591)" (#1656)
This reverts commit 9278822088.
2023-10-10 10:08:04 -07:00
dan f452ce74f4 Refactor iOS lightbox to Reanimated (#1645)
* Remove unnecessary transform logic

* Switch iOS swipe-to-dimiss to Reanimated
2023-10-10 10:04:38 +01:00
Paul Frazee 832b05b64a Bump package.json to 1.52 2023-10-09 15:24:23 -07:00
Paul Frazee acb003d7e1 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-10-09 14:58:40 -07:00
dan ce0f796008 Remove unnecessary opacity logic (#1646) 2023-10-09 22:29:56 +01:00
Muneyuki Noguchi b12cfbe90b Fix typo in image.ts (#1638) 2023-10-09 12:29:16 -07:00
Raku d85bbc1a28 fix typo README.md (#1631) 2023-10-09 11:55:15 -07:00
Toni Alatalo c43a0d8160 Typo fix in README.md: "small about" -> "small amount" (#1639) 2023-10-09 11:48:57 -07:00
Elijah Wright c39352f859 readd hint 2023-10-08 14:30:57 -07:00
Elijah Wright 0122cdb0b6 fix accessibility in AutoSizedImage 2023-10-08 14:29:20 -07:00
Paul Frazee 9aff2597cf Bump build revision 2023-10-06 18:02:22 -07:00
Paul Frazee 77b21dfb1c Fix bug that prevents unfollowing (#1633) 2023-10-06 18:01:57 -07:00
Paul Frazee 9cff82448f 1.52 2023-10-06 08:48:39 -07:00
bnewbold 34f9d12987 README: tweaks to high-level context (#1625) 2023-10-06 08:45:41 -07:00
dan d2f11f8e36 Fix stuck lightbox header after double tap (#1627) 2023-10-05 20:22:32 -07:00
Paul Frazee 3b78d3227f Fix: add padding to the spinner bottom while loading threads (#1626) 2023-10-05 20:10:43 -07:00
dan 64153067e3 Rewrite Android lightbox (#1624) 2023-10-05 19:54:36 -07:00
Paul Frazee 8366fe2c4a Dont trim before posting (close #1621) (#1622)
* Dont trim before posting (close #1621)

* Tweak: do trim end
2023-10-05 19:08:20 -07:00
Paul Frazee b74a0e0fe2 Only listen to back button on android (#1623) 2023-10-05 18:29:41 -07:00
Paul Frazee bd7db8af26 Improve typeahead search with inclusion of followed users (temporary solution) (#1612)
* Update follows cache to maintain some user info

* Prioritize follows in composer autocomplete

* Clean up logic and add new autocomplete to search

* Update follow hook
2023-10-05 16:44:05 -07:00
Paul Frazee 19f8389fc7 Slightly smaller highlighted post text (#1608) 2023-10-05 16:13:49 -07:00
Paul Frazee 0168aada37 Pull upstream bugfixes to bottom-sheet (#1606)
* Bump bottom-sheet to latest for bugfixes

* Small tweak to the account switcher
2023-10-05 15:55:31 -07:00
dan 4ec5fabdd1 Fix animations and gestures getting reset on state updates in the lightbox (#1618)
* Fix translation resetting on state update

* Copy getImageStyles into iOS and Android forks

* Fix opacity resetting on state update
2023-10-05 15:52:04 -07:00
dan 260b03a05c Remove unused lightbox options (#1616)
* Inline lightbox helpers

* Delete unused useImagePrefetch

* Delete unused long press gesture

* Always enable double tap

* Always enable swipe to close

* Remove unused onImageIndexChange

* Inline custom Hooks into ImageViewing

* Declare LightboxFooter outside Lightbox

* Add more TODO comments

* Inline useDoubleTapToZoom

* Remove dead utils, move utils used only once
2023-10-05 15:28:56 -07:00
Paul Frazee eb7306b165 Profile UI tweaks (#1607)
* Use inverted color instead of primary color for press state

* Fix: add missing border to empty state
2023-10-04 13:28:07 -07:00
Patroll 9278822088 Fix invite codes flash on desktop, use loading placeholder (#1591)
* Fix invite codes flashing untrue value before loaded

* Add loading placeholder for right nav invites
2023-10-04 10:31:43 -07:00
Paul Frazee 2ba0c6a711 Update to react-native@0.72.5 (#1599)
* Update to react-native@0.72.5

* Fix the patch
2023-10-04 10:17:13 -07:00
Baasbase c6da98c818 Fixed a typo on the onboarding recommended screen (#1604) 2023-10-04 08:58:01 -07:00
Paul Frazee b1a1bae02e Onboarding & feed fixes (#1602)
* Fix: improve the 'end of feed' detection condition

* Fix the feeds link on mobile in the empty state

* Align the following empty state better on web

* Dont autofocus the search input in the search tab

* Fix the error boundary render

* Add 'end of feed' CTA to following feed

* Reduce the default feeds to discover now that we have feed-selection during onboarding

* Fix case where loading spinner fails to stop rendering in bottom of feed

* Fix: dont show loading spinner at footer of feed when refreshing

* Fix: dont fire reminders during onboarding

* Optimize adding feeds and update to mirror the api behaviors more closely

* Use the lock in preferences to avoid clobbering in-flight updates

* Refresh the feed after onboarding to ensure content is visible

* Remove the now-incorrect comment

* Tune copy
2023-10-04 08:57:23 -07:00
Bryan Lee 2ca673d7f5 Replace isDesktop with isWeb in DesktopWebTextLink component
- Replaced `useWebMediaQueries().isDesktop` with `isWeb` in `DesktopWebTextLink` component to fix inconsistent behavior due to media query changes.
- `isWeb` doesn't rely on media queries, offering stable judgement and avoiding fluctuation when adjusting the browser window.
2023-10-04 21:47:19 +08:00
Paul Frazee a76fb78d53 Improve time to content in the search page (#1603)
* Improve time to content in the search page

* Improve loading state clarity
2023-10-03 20:01:09 -07:00
Paul Frazee 847d4d19b5 Fix a potential reference error in bottombarweb (#1600) 2023-10-03 19:55:44 -07:00
Paul Frazee 6598fca79d Fix: only use scroll-positioning control on thread when looking at replies (#1587) 2023-10-03 19:55:28 -07:00
Paul Frazee 588659380a Add an illustration to the email verification reminder (#1586)
* Add an illustration to the email verification reminder

* Set height on svg to avoid overflow issues in android
2023-10-03 19:51:57 -07:00
Paul Frazee 001b29a7e3 Fix bad reference when image picker is canceled (#1598) 2023-10-03 17:19:21 -07:00
Paul Frazee fd5bbb2769 Warn the user on links that dont match their text (#1573)
* Add link warning modal when URLs do not match their text

* Simplify the misleading link case for clarity

* Fix typecheck

* fix dark mode

* Give a stronger visual indication of the root domain in the link warning

* More rigorous URL mismatch logic

* Remove debug

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-10-02 14:47:39 -07:00
Ansh 2f157c152a fix styling when on FeedsTab (#1574) 2023-10-02 13:28:18 -07:00
Paul Frazee 90b18cf004 Fix alt text selectability in lightbox on web (close #1548) (#1571) 2023-10-02 13:25:41 -07:00
Paul Frazee 64410efafe Small sizing tweaks to the web modal (#1568) 2023-10-02 09:28:04 -07:00
Manish 72e3763446 Add the build step for atproto (#1579)
Co-authored-by: Manish <manish.nayal@nium.com>
2023-10-02 09:18:34 -07:00
Ansh 04fda0f142 Fix 1405 handle android back button in composer (#1446)
* handle android back button in composer

* improve backHandler error handling

* simplify composer onClose functionality
2023-09-29 07:49:59 +04:00
Paul Frazee 1f60e1a748 Fix warning 2023-09-28 20:45:11 -07:00
Bryan Lee 2aae37d67b Improve Device Detection For Better Responsiveness (#1512)
* Refactor `useOnMainScroll` function to use responsive device detection

- Replace static `isDesktopWeb` with `useWebMediaQueries` hook to enable dynamic device type detection.
- Create `useDeviceLimits` hook to dynamically determine `DY_LIMIT_UP` and `DY_LIMIT_DOWN` based on device type.
- Update dependency arrays for the `useCallback` hooks to include new dynamic variables.

* Refactor styles to be responsive to device type

- Create `useStyles` hook that generates styles object based on device type detected from `useWebMediaQueries`.
- Replace static styles object with dynamic styles object generated from `useStyles` hook in components.
- This allows `paddingLeft` values for 'ul' and 'ol' styles to adapt to device type dynamically.
- This allows `maxWidth` values for 'metaItem'' styles to adapt to device type dynamically.

* Remove `isDesktopWeb` in favor of `useWebMediaQueries().isDesktop`

* Refactor `SplashScreen` component for responsive design

* Revision based on review results

* Fix isNative check

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-09-28 12:47:34 -07:00
Paul Frazee 2e5f73ff61 Account quick switch modal (#1567)
* quick switch menu

* Some small tweaks and fixes to the account switch modal

* Factor out the account switcher logic to a hook

* Add haptic feedback on account switcher open

* Fix bad merge

---------

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
2023-09-28 12:41:44 -07:00
Gabriel Donadel Dall'Agnol 3e340b336e Add example google-services file (#1545)
* Add example google-services file

* Update build.md
2023-09-28 12:22:23 -07:00
Paul Frazee 65b83e0d6b Merge branch 'Tanza3D-small-pfp-desktop-2' into main 2023-09-28 12:12:03 -07:00
Paul Frazee f5a78c2c86 Slightly larger desktop leftnav pfp 2023-09-28 12:11:09 -07:00
Paul Frazee d4a234d5ce Merge branch 'small-pfp-desktop-2' of https://github.com/Tanza3D/social-app into Tanza3D-small-pfp-desktop-2 2023-09-28 12:08:39 -07:00
Paul Frazee cd3b0e54fb Email verification and change flows (#1560)
* fix 'Reposted by' text overflow

* Add email verification flow

* Implement change email flow

* Add verify email reminder on load

* Bump @atproto/api@0.6.20

* Trim the inputs

* Accessibility fixes

* Fix typo

* Fix: include the day in the sharding check

* Update auto behaviors

* Update yarn.lock

* Temporary error message

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2023-09-28 12:08:00 -07:00
Paul Frazee 16763d1d41 Handle long feed listings on the right nav with scrolling (#1562) 2023-09-28 10:33:14 -07:00
Paul Frazee cc1c9ab305 Merge branch 'mozzius-expand-author-pressable' into main 2023-09-28 10:32:55 -07:00
Paul Frazee d57c8f7bca Fix pointer 2023-09-28 10:32:34 -07:00
Paul Frazee 1aa1b69a94 Merge branch 'expand-author-pressable' of https://github.com/mozzius/bluesky-official-app into mozzius-expand-author-pressable 2023-09-28 10:27:24 -07:00
Paul Frazee e181bae9a6 Merge branch 'left-padding-on-sidebar' of https://github.com/Tanza3D/social-app into main 2023-09-28 10:25:38 -07:00
Tanza 83bb5c1710 Move sidebar by 10px for more even padding (#1543) 2023-09-28 10:24:46 -07:00
Samuel Newman a427010629 Don't render a pressable if there's only one notification author 2023-09-28 11:03:52 +01:00
Eric Bailey b030d94a64 fix link highlighting with mention present (#1544) 2023-09-27 09:15:50 -07:00
Eric Bailey 6d4ad59416 Merge pull request #1553 from mozzius/refreshed-web-repost-dropdown
Use refreshed dropdown style for repost/quote post dropdown
2023-09-27 11:14:56 -05:00
Paul Frazee d87c232660 Improve image cropping on android and introduce aspect ratio field (#1525)
* Fix image cropping on android

* Store and use aspect ratio field in post images (close #1392)
2023-09-27 09:08:21 -07:00
Eric Bailey 6325eff938 Improvements to auto-mentioning users from their profiles (#1556)
* Don't automatically mention users with invalid handles

* don't mention when using did urls

* resolve profile from cache

* a little clearer

---------

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
2023-09-27 09:06:33 -07:00
Samuel Newman 5d59ab2ac0 replace dropdown component 2023-09-27 11:32:42 +01:00
Tanza3D e941da646d Move sidebar by 10px for more even padding 2023-09-26 22:12:22 +01:00
Tanza3D 1185ac4053 Small PFP on desktop 2023-09-26 22:07:56 +01:00
Eric Bailey 42723dfaf6 fix 'Reposted by' text overflow (#1535) 2023-09-26 12:24:05 -07:00
dan 95736a5168 Add instructions for running on device (#1541) 2023-09-26 11:46:46 -07:00
Foysal Ahamed b0873cae97 💄 Remove report option on my own post (#1537) 2023-09-26 10:48:07 -07:00
Paul Frazee 83b3b5e1c0 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-09-25 13:50:44 -07:00
Sasha Mansurov 5f476851a3 Fix gallery image size (#1474)
Fixes #1323
2023-09-25 13:50:29 -07:00
Paul Frazee be2f319a34 Bump android version code 2023-09-22 18:13:07 -07:00
Paul Frazee e9f30894b1 Bump ios build number 2023-09-22 18:08:50 -07:00
Paul Frazee 150fe421d6 Fixes to tests (#1518) 2023-09-22 17:49:41 -07:00
Paul Frazee 41b53ca37b Trim whitespace on invite code (#1517) 2023-09-22 17:04:58 -07:00
Paul Frazee b7697f08d6 Accessibility fixes: add missing labels, dynamically scale home header (#1516)
* Improve labels

* Dynanically adjust home header to account for font scaling
2023-09-22 17:04:47 -07:00
Paul Frazee 88b95df200 Update backend routes to match frontend (#1515) 2023-09-22 17:04:36 -07:00
Eric Bailey 1b3b4c6692 Merge pull request #1513 from bluesky-social/eric/app-855-update-language-settings-in-app
update translator link show logic
2023-09-22 10:22:28 -05:00
Eric Bailey 28f5a8e44d bool 2023-09-22 09:46:46 -05:00
Eric Bailey 4fa576cb30 update translator link show logic 2023-09-22 09:24:48 -05:00
Paul Frazee 146132a080 Bump ios buildnumber 2023-09-21 21:01:15 -07:00
Paul Frazee 8584009bae Move home feed and thread preferences to server (#1507)
* Move home feed and thread preferences to server

* Fix thread usage of prefs

* Remove log

* Bump @atproto/api@0.6.16

* Improve type usage
2023-09-21 21:00:32 -07:00
Paul Frazee 28b692a118 Switch the date input web version to the date-input web control (#1510)
* Switch the date input web version to the date-input web control

* Fix types
2023-09-21 17:41:09 -07:00
Paul Frazee 1abe5270dd Wrap the post thread screen in an observer (#1509) 2023-09-21 17:36:50 -07:00
Paul Frazee 44985d2312 Dont reposition load latest button on desktop (#1508) 2023-09-21 17:36:33 -07:00
Paul Frazee 8aabbb9b6f Minor alignment fix 2023-09-21 15:07:56 -07:00
Paul Frazee 7931787dd7 Tune the treeview mode to use larger immediate-children (#1506)
* Tune the treeview mode to use larger immediate-children

* Fix display name alignment
2023-09-21 13:47:42 -07:00
Eric Bailey 8a5f9cd43d Language settings updates, new primary language setting (#1471)
* move content languages to screen

* add dropdown library, style primary lang select

* update settings button

* show selected langauges in button

* use primary language in translator link

* update copy

* lint
2023-09-21 11:33:19 -07:00
Paul Frazee 335061f763 Bump ios build number 2023-09-20 19:48:40 -07:00
Eric Bailey e837a499f3 add suggested follows metrics (#1503) 2023-09-20 19:48:03 -07:00
Paul Frazee 5a945c2024 Prefilter the mergefeed to ensure a better mix of following and custom feeds (#1498)
* Prefilter the mergefeed to ensure a better mix of following and custom feeds

* Test suite improvements & tests for the mergefeed (#1499)

* Disable invite codes test for now

* Update test sim to latest iphone

* Introduce TestCtrls driver

* Add mergefeed tests
2023-09-20 19:47:56 -07:00
Paul Frazee 68dd3210d1 Improve consistency of floating button positioning (#1501) 2023-09-20 19:45:05 -07:00
Bryan Lee f5e9e4af89 Updates InviteCodes modal to use dynamic/responsive styles on web (#1502) 2023-09-20 19:16:33 -07:00
Eric Bailey 6df1bcad31 add suggested follow section to profile header (#1481)
* add suggested follow section to profile header

* fix button overflow

* don't even render on preview

* fix useFollowDid and FollowButton race condition

* add section header, close button, active state

* lighten icon
2023-09-20 19:16:11 -07:00
Paul Frazee 498c3e2c27 Tune the treeview UI a bit more (#1494) 2023-09-20 19:13:54 -07:00
Paul Frazee acc98ac1ab Dont show the reply prompt if minimal shell mode triggers (#1495) 2023-09-20 19:12:40 -07:00
Paul Frazee 95e8a6bf41 Even less intrusive status line for posts (#1496) 2023-09-20 19:11:28 -07:00
Paul Frazee 8f8bed9a1c Fix a mobx complaint about mutations (#1500) 2023-09-20 19:11:07 -07:00
dan d33aaf57ad Add a tip about Android emulator memory limit (#1492) 2023-09-20 12:03:07 -07:00
Eric Bailey a1c040cd79 Merge pull request #1476 from bluesky-social/bnewbold/bump-api-dep
yarn: bump @atproto/api to remove redundant deps
2023-09-20 11:07:13 -05:00
Eric Bailey 5665968f72 Merge remote-tracking branch 'origin' into bnewbold/bump-api-dep
* origin:
  Allow touch at the top of the lightbox (#1489)
  Bump ios build number
  Feeds tab fixes (#1486)
  Nicer 'post processing status' in the composer (#1472)
  Inline createPanResponder (#1483)
  Tree view threads experiment (#1480)
  Make "double tap to zoom" precise across platforms (#1482)
  Onboarding recommended follows (#1457)
  Add thread sort settings (#1475)
2023-09-20 11:03:57 -05:00
dan cd96f8dcc8 Allow touch at the top of the lightbox (#1489) 2023-09-20 12:41:18 +01:00
Paul Frazee 6db7113108 Bump ios build number 2023-09-19 21:45:03 -07:00
Paul Frazee 971c8025e6 Feeds tab fixes (#1486)
* Bold the saved feeds on mobile

* Improve the saved feeds loading state

* Add soft reset handler to feeds page

* Show feed descriptions in profile listing

* Add an 'about this feed' modal

* Fix type assertion
2023-09-19 21:44:23 -07:00
Paul Frazee 753fb8bfbc Nicer 'post processing status' in the composer (#1472) 2023-09-19 20:40:58 -07:00
dan 8b8fba7284 Inline createPanResponder (#1483) 2023-09-20 03:46:59 +01:00
Paul Frazee 1af8e83d53 Tree view threads experiment (#1480)
* Add tree-view experiment to threads

* Fix typo

* Remove extra minimalshellmode call

* Fix to parent line rendering

* Fix extra border

* Some ui cleanup
2023-09-19 19:08:11 -07:00
dan d2c253a284 Make "double tap to zoom" precise across platforms (#1482)
* Implement double tap for Android

* Match the new behavior on iOS
2023-09-19 18:32:44 -07:00
Ansh 859588c3f6 Onboarding recommended follows (#1457)
* upgrade api package

* add RecommendedFollows as a step in onboarding

* add list of recommended follows from suggested actor model

* remove dead code

* hoist suggestedActors into onboarding model

* add comments

* load more suggested follows on follow

* styling changes

* add animation

* tweak animations

* adjust styling slightly

* adjust styles on mobile

* styling improvements for web

* fix text alignment in RecommendedFollows

* dedupe inserted suggestions

* fix animation duration

* Minor spacing tweak

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com> and Eric Bailey <git@esb.lol>
2023-09-20 01:18:50 +05:30
Paul Frazee da8499c881 Add thread sort settings (#1475)
* Add thread sorting preferences

* UI tweaks

* Tweak settings

* Tune the copy
2023-09-19 12:24:58 -07:00
bryan newbold 63527493fd yarn: bump @atproto/api to remove redundant deps 2023-09-18 18:39:26 -07:00
Paul Frazee 9c4374f66a 1.51 2023-09-18 14:34:41 -07:00
Foysal Ahamed 3c4899b3c4 🐛 Handle middle mouse click on feed list items (#1469)
* 🐛 Handle middle mouse click on feed list items

* ♻️ Refactor the event listener and turn it into a dedicated hook for web

* 🧹 Cleanup unnecessary Link changes

* Fix import

* Create native version of useAuxClick

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-09-18 14:34:12 -07:00
Paul Frazee 255beb0c1f Various release fixes (#1470)
* Fix error state for recommended feeds

* Handle failure to set default feeds more safely

* Dont return undefined within react-query

* Update yarn.lock
2023-09-18 13:38:33 -07:00
Paul Frazee 157daad605 Update yarn.lock 2023-09-18 12:05:18 -07:00
Paul Frazee ea885339cf Feed UI update working branch [WIP] (#1420)
* Feeds navigation on right side of desktop (#1403)

* Remove home feed header on desktop

* Add feeds to right sidebar

* Add simple non-moving header to desktop

* Improve loading state of custom feed header

* Remove log

Co-authored-by: Eric Bailey <git@esb.lol>

* Remove dead comment

---------

Co-authored-by: Eric Bailey <git@esb.lol>

* Redesign feeds tab (#1439)

* consolidate saved feeds and discover into one screen

* Add hoverStyle behavior to <Link>

* More UI work on SavedFeeds

* Replace satellite icon with a hashtag

* Tune My Feeds mobile ui

* Handle no results in my feeds

* Remove old DiscoverFeeds screen

* Remove multifeed

* Remove DiscoverFeeds from router

* Improve loading placeholders

* Small fixes

* Fix types

* Fix overflow issue on firefox

* Add icons prompting to open feeds

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

* Merge feed prototype [WIP] (#1398)

* POC WIP for the mergefeed

* Add feed API wrapper and move mergefeed into it

* Show feed source in mergefeed

* Add lodash.random dep

* Improve mergefeed sampling and reliability

* Tune source ui element

* Improve mergefeed edge condition handling

* Remove in-place update of feeds for performance

* Fix link on native

* Fix bad ref

* Improve variety in mergefeed sampling

* Fix types

* Fix rebase error

* Add missing source field (got dropped in merge)

* Update find more link

* Simplify the right hand feeds nav

* Bring back load latest button on desktop & unify impl

* Add 'From' to source

* Add simple headers to desktop home & notifications

* Fix thread view jumping around horizontally

* Add unread indicators to desktop headers

* Add home feed preference for enabling the mergefeed

* Add a preference for showing replies among followed users only (#1448)

* Add a preference for showing replies among followed users only

* Simplify the reply filter UI

* Fix typo

* Simplified custom feed header

* Add soft reset to custom feed screen

* Drop all the in-post translate links except when expanded (#1455)

* Update mobile feed settings links to match desktop

* Fixes to feeds screen loading states

* Bolder active state of feeds tab on mobile web

* Fix dark mode issue

---------

Co-authored-by: Eric Bailey <git@esb.lol>
Co-authored-by: Ansh <anshnanda10@gmail.com>
2023-09-18 11:44:29 -07:00
Eric Bailey 3118e3e933 improve drawer reflow for large text (#1464) 2023-09-15 15:18:09 -07:00
Paul Frazee 754663e5c3 Add findlast shim for outdated browsers (#1463)
* Add findlast shim for crappy browsers

* Fix types
2023-09-15 14:40:15 -07:00
Paul Frazee 0672451ddc Sanitize BIDI characters from display names (#1462) 2023-09-15 14:05:45 -07:00
Paul Frazee 763a50692f Readd hitslop to post controls (#1461)
* Readd hitslop to post controls

* Bigger hitslop on bigger controls
2023-09-15 14:01:44 -07:00
Eric Bailey e3de91788e Merge pull request #1452 from bluesky-social/eric/update-image-picker
bump picker deps
2023-09-15 14:06:55 -05:00
Eric Bailey 8593f41f36 don't thread a self-repost of a self-reply (#1450)
* don't thread a self-repost of a self-reply

* typo
2023-09-15 09:34:12 -07:00
Ansh 188d4893f9 add React Query and hook up to existing functionality (#1358)
* add React Query and hook up to existing functionality

* wire in remote data, add error message

* remove hard-coded feeds

* oops fix logic

* add loading state

* fix loading on mobile

---------

Co-authored-by: Eric Bailey <git@esb.lol>
2023-09-15 09:32:44 -07:00
Eric Bailey 84b7edd9db Merge pull request #1451 from bluesky-social/eric/theme-switching-web
fix theme switching on web without refresh
2023-09-15 11:06:06 -05:00
Eric Bailey 0e8d564555 link out to more context 2023-09-15 11:00:06 -05:00
Eric Bailey 01870883d6 clean up into hook 2023-09-14 18:15:17 -05:00
Ansh 50f811666a Fix Profile link from drawer on Mobile Web (#1437)
* 🗺️ fix an issue where web devices that see the Drawer couldn't access Profile from said Drawer

* fix routes on web

* handle profile button active state

* add hack for web navigation

* fix comment

---------

Co-authored-by: Micah Maligie <kerosuppi@gmail.com>
2023-09-14 16:10:59 -07:00
Eric Bailey e643c43459 add build:apk and apk config (#1454) 2023-09-14 16:06:25 -07:00
bnewbold 37252e90b4 update Bluesky PBLLC to PBC (Public Benefit Corporation) (#1453) 2023-09-14 14:51:06 -07:00
Eric Bailey bd8dac0154 bump picker deps 2023-09-14 15:17:57 -05:00
Eric Bailey 9a86f0dae4 simplify logic 2023-09-14 13:23:20 -05:00
Eric Bailey a88ac217c2 fix theme switching on web without refresh 2023-09-14 12:55:47 -05:00
Ansh b9268d503a wrap impersonation text (#1447) 2023-09-13 11:12:58 -07:00
Ansh 9c72fcc9b4 share mute list link with did not handle (#1438) 2023-09-12 15:35:34 -07:00
Ansh 4977a5d2a3 Fix 651 Make followers and following button into a <Link> (#1429)
* make followers and following button into a Link

* make buttons into `<a>` tags
2023-09-12 13:47:55 -07:00
Paul Frazee 2b6fe4cb50 1.50 2023-09-11 18:23:40 -07:00
Paul Frazee 9b5bd53f84 Remove accessibilityRole=button on dropdown mask, it causes issues on firefox (#1436) 2023-09-11 18:09:02 -07:00
Paul Frazee 9e8b14f710 Add birth date gating to moderation settings (#1435)
* Add birth date preference, modal to set, link in settings, and age gate in moderation

* Styling fixes for android

* Fix types
2023-09-11 18:04:09 -07:00
Paul Frazee 0090371011 Paginate the PostThread to avoid rendering too many posts and crashing the app on large threads (#1432) 2023-09-11 17:41:00 -07:00
Eric Bailey 21371081c6 fix theme flashing (#1417)
* fix theme flashing

* remove memo

* use AppState listener
2023-09-11 14:39:31 -07:00
Paul Frazee f8c611118e Separate list deletion into chunks (close #1430) (#1431) 2023-09-11 14:28:30 -07:00
Paul Frazee 977f9228f8 Revert "Fix 1338 mark notifications read with timeout and on app state change (#1340)" (#1433)
This reverts commit d2e65d2a7f.
2023-09-11 14:28:13 -07:00
Paul Frazee 57c10cbcab Bump @atproto/api@0.6.12 (#1434) 2023-09-11 14:28:02 -07:00
Ansh 27cb1bd276 make sure click events on the emoji picker don't bubble up to the mask (#1427) 2023-09-11 13:31:14 -07:00
Ansh bcd63e710c Lytic analytics migration (#1428)
* add new api event proxy

* add new apiHost for analytics web
2023-09-11 11:41:27 -07:00
Ansh 01775e5bff add new api event proxy (#1400) 2023-09-11 22:36:49 +05:30
uakci 731d84faaa composer: inhibit Cmd-Enter from inputting newline (#1421) 2023-09-11 09:02:14 -07:00
Bossett 775aa87540 Update time.ts to handle very small or negative time differences (#1390)
* Update time.ts to handle very small or negative time differences

Right now, posts can appear to be from the future with a negative time difference (i.e. -3s appears). This change defines 'NOW' as less than 5 seconds old, and returns 'now' in that case.

It's not clear how localisation is handled - this may need translation.

* Add test for 'now' in time/ago(...)

Add tests for ago() for right now (i.e. 'now') and 10s ago to ensure the seconds case is still tested
2023-09-08 08:57:22 -07:00
dan 6d73ed96e1 Make Sentry optional (#1416)
* Move app.json -> app.config.js

* Make Sentry optional
2023-09-08 08:47:01 -07:00
dan adc5b75b2b Fix autocomplete avatar alignment (#1414) 2023-09-08 16:30:42 +01:00
dan 44a00e1b7e Set crop mode to None by default (#1415)
Fixes #1263

Previously, opening the crop tool had 1:1 selected by default. So if you opened it and pressed Done without changing anything, it would format the image as 1:1.

After this change, None is selected by default. So if you open the crop tool and press Done without changing anything, nothing will change.
2023-09-08 16:30:00 +01:00
Micah Maligie c10cb8e972 💅 disallow overflow outside of post content area(s) (#1395) 2023-09-07 18:13:28 -07:00
dan 8a93321fb1 Give explicit names to MobX observer components (#1413)
* Consider observer(...) as components

* Add display names to MobX observers

* Temporarily suppress nested components

* Suppress new false positives for react/prop-types
2023-09-07 17:36:08 -07:00
dan 69209c988f Update build instructions (#1406)
- Use pnpm
- Clarify when prebuild is needed
2023-09-07 17:29:16 -07:00
dan a5b89dffa6 Add ESLint React plugin (#1412)
* Add eslint-plugin-react

* Enable display name rule
2023-09-07 16:38:57 -07:00
Ansh 00595591c4 Hotfix: Fix unable to enter invite code (#1409)
* Remove accessibilityRole from invite code input

* remove unused styles
2023-09-07 13:50:24 -07:00
Paul Frazee 2963fb4c6d Fix scrollbar gutters on web (#1401)
* Fix scrollbar gutters on web

* Fix typecheck
2023-09-07 09:32:14 -07:00
dan 138e6d9b97 Fix lint-staged not allowing edits to Markdown files (#1402)
* Remove unnecessary overrides config

* Only lint-staged code files
2023-09-07 02:06:07 +01:00
dan 82a17db594 Always prebuild cleanly (#1399) 2023-09-06 17:21:48 -07:00
Eric Bailey b76b56b4a4 Merge pull request #1397 from bluesky-social/eric/fix-startup-error
prevent error screen on startup
2023-09-06 16:33:56 -05:00
Eric Bailey fdc4ae1f7b prevent error screen on startup 2023-09-06 16:27:44 -05:00
Minseo Lee b6d239aa37 Update ProfileHeader.tsx (#1389) 2023-09-06 13:45:50 -07:00
Ansh 63f0b2f0e5 fix text color on waitlist join (#1387) 2023-09-06 09:37:07 -07:00
dan dd5697329f Remove unnecessary deps from package.json (#1393) 2023-09-06 09:36:45 -07:00
dan 19adb10de1 Use frozen lockfile for CI workflows (#1394) 2023-09-06 09:26:19 -07:00
Paul Frazee 565c1a0510 1.49 2023-09-05 14:04:36 -07:00
Paul Frazee 52f3810e81 Update tests 2023-09-05 14:03:39 -07:00
Paul Frazee 411c1581f6 Fix thread positioning on load (#1385)
* Fix minIndex for consistent positioning on thread view

* Enable maintainVisibleContentPosition on android now that it's supported
2023-09-05 13:40:38 -07:00
Eric Bailey e3e91816d1 Upgrade to Expo 49 (#1331)
* update to expo 49

* update expo-camera to fix console erorrs

* run doctor again

* fix ts errors

* patch @sentry/react-native

Getting `cannot read property 'ignoreLogs' of undefined` in this file.
Ironically, this may be a cyclical imports problem. LogBox isn't enabled
in production, so this patch should only affect dev/test.

* fix type error

* reinstall newer reanimated

* pin expo-dev-client to fix reanimated dev-build issue

* fix type errors, fix bad conflict res

* Fix to notifications badge z-index on desktop

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-09-05 12:23:22 -07:00
dan 9a3fa512eb Enable Fast Refresh for web (#1383) 2023-09-05 11:13:42 -07:00
Paul Frazee 764c7cd569 Updates to use dynamic/responsive styles on web (#1351)
* Move most responsive queries to the hook

* Fix invalid CSS value

* Fixes to tablet render of post thread

* Fix overflow issues on web

* Fix search header on tablet

* Fix QP margin in web composer

* Fix: only apply double gutter once to flatlist (close #1368)

* Fix styles on discover feeds header

* Fix double discover links in multifeed
2023-09-05 10:42:19 -07:00
dan be8084ae10 Fix mismatching button label for speech recognition (#1372)
* Fix mismatching a11y label

* Update all new post button labels to match
2023-09-05 16:55:39 +01:00
dan 161746519c Fix caret jumps for web composer (#1374)
* Fix caret jumps for web composer

* Autofocus at the end on mount
2023-09-05 08:21:10 +01:00
Paul Frazee 419ac2d0df Improved mute alerting (#1355)
* Use a simpler mute alert when viewing a post by a muted user

* Dont mute self-QPs when we're overriding a mute

* Fix types
2023-09-01 12:30:02 -07:00
Paul Frazee 3e96373903 Sort thread replies by likes (#1356)
* Sort replies by likes

* Types fix
2023-09-01 11:54:51 -07:00
Ansh 4cd3ddecad refresh when empty (#1354) 2023-08-31 16:45:18 -07:00
Samuel Newman f16cc9537a show images in notification if post also has record embed (#1349) 2023-08-31 16:44:42 -07:00
Eric Bailey ba393cd642 encode all unsafe characters in post text for translate URL (#1345) 2023-08-31 16:39:18 -07:00
Ansh d2e65d2a7f Fix 1338 mark notifications read with timeout and on app state change (#1340)
* mark notifications read with timeout and on app state change

* fix type
2023-08-30 18:06:02 -07:00
Ansh 4ac82536c9 Fix 1304 refresh notifications when a notif is clicked or received (#1339)
* refresh notifications when a notif is clicked

* make notification syncing smarter

* allow enabled appview proxy on mobile

* put back syncqueue code
2023-08-30 18:04:33 -07:00
Ansh 4bec7c1d85 Fix #1328 fix emoji picker scroll on firefox and chrome (#1332)
* fix emoji picker scroll on firefox and chrome

* click outside emoji picker to dismiss

* dynamically position emoji picker

* dynamically placing picker
2023-08-30 17:58:24 -07:00
Paul Frazee 04992f14f1 Improvements to UI in web logged-out views (#1341)
* Add LoggedOutLayout for desktop/tablet web

* Avoid screen flash in the transition to onboarding

* Fix comment
2023-08-30 17:55:01 -07:00
Ansh a498acab6e fix types for breakpoints on mobile (#1342) 2023-08-30 17:02:23 -07:00
Paul Frazee f9cab178b9 Merge branch 'ansh/app-812-add-custom-feed-discovery-to-onboarding' into main 2023-08-30 16:18:21 -07:00
Paul Frazee 59dcedeea2 Fix: remove bottom bar during onboard 2023-08-30 16:15:06 -07:00
Paul Frazee 8bc8dcc094 Simplify the RecommendedFeeds with breakpoint components 2023-08-30 16:13:09 -07:00
Paul Frazee 3fa9b6daba Fix types and remove dead code 2023-08-30 15:30:26 -07:00
Ansh 9446c67880 Move PreferencesHomeFeed to a screen instead of a modal (#1335)
* move `PreferencesHomeFeed` to a screen instead of a modal

* add web route for home feed preferences

* upgrade `@miblanchard/react-native-slider` to fix lint

* fix web route naming

* fix desktop web styling

* add `react-native-slider` mock
2023-08-30 15:21:12 -07:00
Paul Frazee a29f10aefe Moderation settings fixes (#1336)
* Default isAdultContentEnabled to false on all devices.

The original intent of setting the default based on the device was
to make the maximally-permissive choice. It turns out this was a
mistake as it created sync issues between devices; users would be
confused by the lack of congruity between them. We have to go with
false by default to ensure sync is retained.

* Update preferences model to use new sdk api

* Delete dead code

* Dont show the iOS adult content warning in content filtering settings if adult content is enabled

* Bump @atproto/api@0.6.8

* Codebase style consistency
2023-08-30 15:19:19 -07:00
Paul Frazee 8ed6e72ea4 More fixes to mobile onboard 2023-08-30 15:15:10 -07:00
Paul Frazee 05d1d8d8a4 Fix onboarding on mobile web 2023-08-30 14:57:03 -07:00
Paul Frazee cd8ae1298e Tweak dark mode on web 2023-08-30 10:56:07 -07:00
Paul Frazee b847917969 Tweaks to mobile onboard 2023-08-29 23:02:37 -07:00
Paul Frazee 5e765bf1cb Rework web onboarding 2023-08-29 22:56:13 -07:00
Paul Frazee 5d9534ca72 Move onboarding to the withAuthRequired HOC 2023-08-29 20:20:51 -07:00
Eric Bailey 3a90b479fd fix lightbox on search page (#1330)
* fix lightbox on search page

* add styles to mobile web too
2023-08-29 17:41:50 -07:00
Eric Bailey 22b7964b5e Merge pull request #1334 from bluesky-social/eric/fix-android-perms-noop
handle stuck state with granular android permissions
2023-08-29 19:27:43 -05:00
Eric Bailey 5710140a73 handle stuck state with granular android permissions 2023-08-29 17:09:38 -05:00
Ansh Nanda bf37913701 fix onboarding on web 2023-08-29 12:16:26 -07:00
Eric Bailey 6bee7d518b bump yarn (#1329) 2023-08-29 11:01:14 -07:00
bnewbold 461c1da6de update golang to v1.21; set GOEXPERIMENT=loopvar (#1256)
* golang: update to v1.21, and set GOEXPERIMENT=loopvar

* golang: go mod tidy
2023-08-28 19:35:23 -07:00
Paul Frazee 40e030793a 1.48 2023-08-28 19:11:15 -07:00
Paul Frazee 2619c55c10 Test fixes 2023-08-28 19:10:36 -07:00
Ansh Nanda 742440c22d add more tracking 2023-08-28 18:55:40 -07:00
Ansh Nanda 8f0f3be8fb start onboarding only for new account creations 2023-08-28 18:53:58 -07:00
Ansh Nanda bcef7400db simplify onboarding model function naming 2023-08-28 18:47:56 -07:00
Eric Bailey 1c460c40f4 Make posts behave more like links (#1316)
* use cursor for post cards

* ignore type error

* handle meta keys on non native links

(cherry picked from commit daccafea0b7ab21af6572767e496d20f32ead353)

* remove cursor on non-post notifications, not quite right

* Simplify link handling

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-28 18:41:28 -07:00
Paul Frazee cc2838761b Replace web editor link behavior (#1319)
* Replace web editor link behavior (close #1293) (close #1292)

* Update link decorator to match rich text link detector
2023-08-28 18:40:45 -07:00
Patroll 2c60a0328d Fix: Don't flash default profile avatar and link in nav (#1287) 2023-08-28 17:58:14 -07:00
Paul Frazee 5ee754e6f9 Improvements to feed assembly to avoid possible state issues (#1318)
* Avoid potential dropped posts due to pruning when checking for latest

* Add a sanity check to ensure dup react keys never occur (close #1315)
2023-08-28 17:54:59 -07:00
Ansh Nanda a231fdf64e track onboarding steps 2023-08-28 17:51:26 -07:00
Ansh Nanda b38629b9b5 Merge branch 'main' into ansh/app-812-add-custom-feed-discovery-to-onboarding 2023-08-28 17:49:14 -07:00
Paul Frazee e2f0770b88 Remove ability for Post component to load from URI (close #1302) (#1317) 2023-08-28 17:08:21 -07:00
Ansh Nanda b2dd4ea0f5 fix onboarding stuck on welcome 2023-08-28 15:50:51 -07:00
Ansh Nanda 3f1b313fa4 add custom feed discovery to onboarding 2023-08-28 15:41:02 -07:00
Ansh Nanda c4cf288296 remove logs 2023-08-28 13:39:24 -07:00
Ansh Nanda edfd326069 move onboarding to screens 2023-08-28 13:37:44 -07:00
Ansh Nanda 84e065667a update packages 2023-08-28 13:36:34 -07:00
Eric Bailey c77fd588e9 wrap mutation in runInAction (#1305) 2023-08-28 11:55:56 -07:00
Ansh Nanda 0ca28ccca6 Merge branch 'main' into ansh/app-812-add-custom-feed-discovery-to-onboarding 2023-08-25 14:53:03 -07:00
Ansh Nanda 08fe7fb084 create onboarding model 2023-08-25 14:36:10 -07:00
Paul Frazee a3cb12f584 Move the web composer to the top of the screen (#1282) 2023-08-25 10:30:15 -07:00
Eric Bailey b15a435069 Eslint updates (#1281)
* eslint: Update eslintrc

* eslint: Strings must use singlequote  quotes

* eslint: expected { after if-condition

* eslint: update warnings

* a little cleanup

* remove conflicted file

---------

Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-25 08:48:38 -07:00
Eric Bailey a0dca81a74 don't mention own user from composer (#1279) 2023-08-25 08:47:47 -07:00
Eric Bailey 953ae9c096 Update/fix ChangeHandle form (#1280)
* fix well-known did copy value

* s/Domain/Host in change handle form
2023-08-25 08:47:12 -07:00
Paul Frazee 37a70f0a67 1.47 build 3 2023-08-24 16:29:44 -07:00
Eric Bailey 462022741d Use Pressable for most links/embeds (#1181)
* delay press on all links

* use Pressable for all accessible links
2023-08-24 16:28:26 -07:00
Eric Bailey 4654a9a45e defer loading of feeds until visible (#1271)
* defer loading of feeds until visible

* Fix: use existing hasLoaded

* Fix: dont query for latest during initial load

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-24 16:26:29 -07:00
Paul Frazee a5981e127f Fixes to the feed discovery page (#1238)
* Bump yarn.lock for... reasons

* Restyle DiscoverFeeds empty state (close #1236)

* Fix: maintain search state in feed discovery (close #1204)

* tsconfig fixes

* Tweaks to yarn.lock
2023-08-24 16:16:14 -07:00
Ansh 7410bcd888 setup isAuthenticatedUser in profileUiModel inside an action (#1272) 2023-08-24 16:13:42 -07:00
Paul Frazee c6f321862b Add analytics event for when the app is opened from a notification (#1270)
* Add analytics event for when the app is opened from a notification

* Tweak notification ID
2023-08-24 16:07:16 -07:00
bnewbold a115c17a09 bskyweb: switch from PDS backend to AppView backend (#1065)
* bskyweb: replace PDS with AppView (no auth)

* bskyweb: update example .env files for appview
2023-08-24 16:00:45 -07:00
Paul Frazee 766521486c Increment build number 2023-08-23 17:14:30 -07:00
Paul Frazee c1c02f480b A couple quick notifications fixes (#1262)
* Create separate .easignore to ensure google-services.json goes to eas

* Set the notifications serviceDid according to the session host

* Fix types
2023-08-23 17:10:00 -07:00
Paul Frazee 93d5ba1820 Fix eas.json 2023-08-23 16:35:01 -07:00
Paul Frazee 9bd9d40306 1.47 2023-08-23 16:30:33 -07:00
Ansh 6487a87542 [APP-836] Emoji picker for web (#1254)
* add emoji-mart package for emoji dropdown picker

* remove emoji picker modal

* load emoji mart data not as part of the main bundle

* remove @emoji-mart/data

* setup emoji insertion with events

* get emoji data from local static assets

* close emoji picker after one emoji has been inserted

* Switch emoji picker trigger to an icon

* Update emoji-mart-data.js

* make grabbing emoji data work on more browsers

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-23 16:29:23 -07:00
Ansh 8ab5eb6583 [APP-786] Native notifications (#1095)
* move `notifee.ts` to notifications folder

* install expo notifications

* add UIBackgroundMode `remote-notifications` to app.json

* fix notifee import in Debug.tsx

* add `google-services.json`

* add `development-device` class to eas.json

* Add `notifications.ts` for native notification handling

* send push token to server

* update `@atproto/api`

* fix putting notif token to server

* fix how push token is uploaded

* fix lint

* enable debug appview proxy header on all platforms

* setup `notifications.ts` to work with app view notifs

* clean up notification handler

* add comments

* update packages to correct versions

* remove notifee

* clean up code a lil

* rename push token endpoint

* remove unnecessary comments

* fix comments

* Remove old background scheduler

* Fixes to push notifications API use

* Bump @atproto/api@0.6.6

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-23 16:28:51 -07:00
Ansh 32b9648931 Fixes #1252 fix alt text setting description toggle (#1261)
* make toggle border width slightly larger

* change copy
2023-08-23 16:16:55 -07:00
Eric Bailey b6317d4ce7 Improve handling of unselecting languanges in composer language menu (#1093)
* allow toggling off/on multiple from main composer lang menu

* fix dropdown styles for long labels

* udpate model to use new string field

* update language UI

* save langs to history on submit

* remove edit

* clean up use new fields

* default to deviceLocales

* fix default valu

* feedback

* use radio icon
2023-08-23 13:40:15 -07:00
Eric Bailey acad8cb455 Merge pull request #1260 from bluesky-social/eric/fix-window
fix bad reference on native
2023-08-23 14:34:41 -05:00
Eric Bailey 473a9fc73e fix bad reference on native 2023-08-23 14:31:08 -05:00
Jake Gold b4931fa185 bskyweb: cache /static/{images,js} for 1 week, other files for 1 hour 2023-08-23 09:23:09 -07:00
Paul Frazee 8e1d0b0396 Change Handle modal DNS instruction tweaks for clarity (#1245)
* Remove potentially confusing period from subdomain in changehandle (close #1004)

* Clarify dns instructions further (close #1087)
2023-08-22 16:37:04 -07:00
Paul Frazee 54706a0437 Fix: update posts rendered in notifs on refresh (close #1196) (#1243) 2023-08-22 16:36:49 -07:00
Paul Frazee fcea27ea0b Fix: include link-meta abort signal for timeout (close #1214) (#1240) 2023-08-22 16:36:36 -07:00
Paul Frazee 54118fe478 Fix feed empty state (close #1235) (#1239) 2023-08-22 16:36:23 -07:00
Eric Bailey 2b13dc0f3a Add likes tab (#1227)
* add likes tab

(cherry picked from commit 6c5ffd964ca0b185ddfc37088d82712a006a1163)

* only show Likes tab to authenticated user

(cherry picked from commit ecc1254411d760158b6d7a4c5f05d940db872dfc)

* Bump @atproto/api@0.6.5

* fix types

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-22 12:30:51 -07:00
Eric Bailey 548ec6c82d add title attr to text text links (#1228)
* add title attr to text text links

* Revert "add title attr to text text links"

This reverts commit c028cd184e.

* use css tooltips

* add to expanded post state

* handle theming

* add to bskyweb
2023-08-22 11:04:17 -07:00
Ansh 16b265a861 [APP-834] Allow @ing someone in post directly from profile (#1241)
* setup `initMention` for mobile

* setup creating post with profile tagged on web
2023-08-22 11:01:00 -07:00
Ansh 3aadc43c89 [APP-835] trim end of email during login (#1242)
* trim end of email during login

* Switch trimEnd() to trim()

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-22 10:52:59 -07:00
Paul Frazee fb1199e21d Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-08-22 10:50:45 -07:00
Paul Frazee 0a50df1cce Minor formatting 2023-08-22 10:50:19 -07:00
Paul Frazee 17fcc2f25c Merge branch 'fix-empty-search' of https://github.com/darnfish/social-app into darnfish-fix-empty-search 2023-08-22 10:49:53 -07:00
Eric Bailey 13c11801b9 fix thread double border (#1251) 2023-08-22 10:49:03 -07:00
Eric Bailey 09a445d804 do not thread author media filtered feed (#1253) 2023-08-22 10:46:49 -07:00
William Gibson d3f525ab28 Don't submit search if query is empty 2023-08-22 04:27:46 -04:00
Ansh 88357d5c82 add profiles sampling to sentry (#1237) 2023-08-21 16:49:59 -07:00
Eric Bailey 4cc2695d84 allow handles to start with a number (#1231)
* allow handles to start with a number

* don't allow leading hyphen
2023-08-21 13:37:57 -07:00
Paul Frazee 257c15ec1f ios buildNumber 2 2023-08-17 18:59:55 -07:00
Paul Frazee 2198aab8b2 Fix to post meta overflow in highlighted post (#1211)
* Fix to post meta overflow in highlighted post

* Give more space to desktop web
2023-08-17 18:59:25 -07:00
Paul Frazee ee9cf7402f Bump react-native-gesture-handler@2.12.1 2023-08-17 18:30:08 -07:00
Paul Frazee 4342d0f84c 1.46 2023-08-17 18:13:32 -07:00
Paul Frazee 26f4e313ad Bump detox 2023-08-17 18:09:18 -07:00
Paul Frazee c7cad72368 Fix android postmeta alignment 2023-08-17 17:48:45 -07:00
Ansh c219fbe57a upgrade react-native-reanimated (#1198) 2023-08-17 17:47:10 -07:00
Paul Frazee 43d1f002f5 Dont suggest users that are muted or blocked (close #1185) (#1209) 2023-08-17 17:44:48 -07:00
Eric Bailey 55ad56f689 default translate to device language (#1207) 2023-08-17 15:45:36 -07:00
Paul Frazee 4a59178cd2 Update the web composer textinput to an emitter (close #1193) (#1205)
The tiptap useEditor() hook creates an awkward challenge for passing
event handlers into its plugins and native events. By introducing a
memoized editor, we should be able to shuttle events out of tiptap
without retriggering the useEditor hook. The emitter can then change
its registered handlers with each state update.
2023-08-17 13:39:59 -07:00
Paul Frazee 5e63d3164b A set of composer fixes (#1187)
* Don't insert a newline on cmd+entrl (close #1173)

* Don't linkify selected text on url-paste (close #1149)

* Disable the adult content controls if there is no media on the post (close #1169)
2023-08-16 10:46:52 -07:00
Paul Frazee 819340dd3c Shorten links in composer to reduce char usage (#1188)
* Modify toShortUrl() to always include the full domain

* Shorten links in the composer to save on characters

* Apply some limits to the link card suggester
2023-08-16 10:22:50 -07:00
Paul Frazee 5379561934 Tune link card font sizes on desktop 2023-08-16 10:10:39 -07:00
Paul Frazee 79a6819769 Tune up the link card to look nicer, show more info, and layout horizontally on web to user space more nicely (#1190) 2023-08-16 10:02:41 -07:00
Paul Frazee 884e5c9294 Fix to "Load new posts" showing sometimes when there's nothing new to show (#1191)
* Fix to feed item react key value (hopefully)

* Fix false-firing of load more (close #1028)
2023-08-16 10:00:22 -07:00
Jerry Chen b0282865fa Require bluesky-social/social-app for .github/workflows/build-and-push-* (#1152) 2023-08-15 18:50:19 -07:00
Paul Frazee 6ccfb1375a Fix tap target size of post dropdown menus (#1180) 2023-08-15 15:49:52 -07:00
Eric Bailey 0576caae36 use greater of indexedAt or machine clock (#1182)
* use greater of indexedAt or machine clock

* correct mobx usage
2023-08-15 15:18:35 -07:00
Paul Frazee 6964382bad Remove view selector offsetting (close #1174) (#1183)
* Remove view selector offsetting (close #1174)

* Remove horizontal scroll indicator in view selector
2023-08-15 15:13:40 -07:00
Paul Frazee ce1d75e164 Fix link color in dark mode (close #1170) (#1184) 2023-08-15 15:09:54 -07:00
Foysal Ahamed abbc6543f4 Repurpose report post modal and re-use for list reporting (#1070)
*  Repupose report post modal and re-use for list reporting

*  Allow reporting a feed generator

*  ♻️ Refactor report modal into one shared component for reporting different collections

*  Adjust report option selector in tests

*  Add test for list reporting

* ♻️  Refactor reason options and add options for list and feedgen

* 🧹 Cleanup remaining todo

* Fix to mutelist react keys

* Fix regression from rebase

* Improve customfeed mobile header

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-15 14:32:06 -07:00
Paul Frazee a5762c2d7d Clear caches on session change (#1179) 2023-08-15 12:55:51 -07:00
Eric Bailey 331c506728 fix prefetching lightbox images (#1163)
* fix prefetching lightbox images

* use array signature

* fix other RN native image usage

* delay prefetching to allow UI to re-render
2023-08-15 12:53:03 -07:00
Ansh 77178844fd [APP-798] add key to ProfileCardPills render method (#1158)
* add key to `ProfileCardPills` render method

* More reliable key generation

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-08-15 11:32:57 -07:00
Paul Frazee 94527a4d9e 1.45 2023-08-15 10:08:07 -07:00
Paul Frazee f4891a47a1 Fix to feeds view in profiles (#1171)
* Fix load of feeds tab

* Add e2e test for profile feeds
2023-08-15 09:59:49 -07:00
Eric Bailey a3af2a2b85 use user.handle response from getProfile, not getSession (#1165) 2023-08-15 09:59:34 -07:00
Ansh 4d953f0504 Fixes #1124: Trim alt text before saving (#1159)
* trim alt text before setting

* Drop `trim` from helpers.ts
2023-08-14 11:41:44 -05:00
Paul Frazee 003a75fd8e Build increment 2023-08-11 08:50:59 -07:00
Paul Frazee 993026cbc4 Fix: close keyboard when viewing the self-label modal (#1153) 2023-08-11 08:50:24 -07:00
Paul Frazee 821b9ba6e6 1.44 2023-08-10 16:54:52 -07:00
Paul Frazee c8bc3a1822 Test fix 2023-08-10 16:54:13 -07:00
Paul Frazee 79d78b5f59 Fix: set background color of the view selector (#1151) 2023-08-10 16:47:34 -07:00
Paul Frazee e5b7a894a3 More useful block-state information in embeds (#1150)
* More useful block-state information in embeds

* Tune copy
2023-08-10 16:25:11 -07:00
Paul Frazee ac6f6eef66 Replace the emojis in the self-labeler with a remove button (#1147) 2023-08-10 12:54:27 -07:00
Eric Bailey cc3fcb1645 Adds profile media tab (#1137)
* add media tab

* fix loading state

* cleanup

* update naming

* upgrade api package

* fix load state

* add scroll view to tabs

* fix overflow on mobile web
2023-08-10 10:50:37 -07:00
Paul Frazee 03d152675e Add self-labeling controls (#1141)
* Add self-label modal

* Use the shield-exclamation icon consistently on post moderation

* Wire up self-labeling

* Bump @atproto/api@0.6.0

* Bump @atproto/dev-env@^0.2.3

* Add e2e test for self-labeling

* Fix types
2023-08-09 17:34:16 -07:00
Eric Bailey 48813a96d6 wait for list memberships to load before becoming interactive (#1140)
* wait for list memberships to load before becoming interactive

* add spinner

* remove secondary spinner
2023-08-09 15:50:40 -07:00
Paul Frazee b5511e1450 Bump @atproto.api@0.5.4 2023-08-08 16:24:19 -07:00
Paul Frazee bbe9861eef Add alerts to embeds (#1138)
* Add alerts to embeds

* Add images to the mock data

* Fix types
2023-08-08 15:54:36 -07:00
Paul Frazee e51dbefd0a Fix to feed discovery (#1134)
* Fixes to debounce

* Less aggressive debounce
2023-08-08 11:56:34 -07:00
Paul Frazee 72e459f3e2 Fix rendering of feed and list post-embeds (close #1131) (#1135) 2023-08-08 11:34:33 -07:00
Paul Frazee 3c29a1be4d Fix to react-key uniqueness in feeds (#1136) 2023-08-08 11:34:19 -07:00
Eric Bailey 872a7f93f4 Merge pull request #1133 from bluesky-social/eric/fix-thread-ui
fix thread spacing and reply lines
2023-08-08 12:32:44 -05:00
Eric Bailey c48ff1855c remove unused styles 2023-08-08 11:36:48 -05:00
Eric Bailey 8cb076f5fd fix thread spacing and reply lines 2023-08-08 11:34:48 -05:00
Eric Bailey f7a0ea3e13 Merge pull request #1132 from bluesky-social/eric/fix-reply-line
fix long thread styling
2023-08-08 10:21:21 -05:00
Eric Bailey 85b4de701b fix long thread styling 2023-08-08 10:08:57 -05:00
Paul Frazee 7bbaccad1c Fix: dont use profile preview modal on mobile web (#1125) 2023-08-07 15:01:26 -07:00
Paul Frazee 89fc975a15 Perf: switch to stable react keys (#1113) 2023-08-05 11:29:55 -07:00
Eric Bailey d53cbb91bb fix post thread feedback regression (#1109) 2023-08-04 13:48:22 -07:00
Paul Frazee f63ed57e3b Fix repeated firing of scroll into view on large threads (#1108) 2023-08-04 13:48:07 -07:00
Paul Frazee 5d2d0976ba Increment ios build number 2023-08-04 12:14:53 -07:00
Paul Frazee d9cf37aecf Collection of small UI fixes & improvements (#1104)
* Fix black bar appearing in link card images

* Include QPs in posts cache

* Fix like color for feed likes in notifications

* Fix post embed spacing
2023-08-04 12:14:21 -07:00
Eric Bailey c42b9c1b4e fix feed UI alignment issues (#1106)
* fix feed alignment issues

* fix reason line alignment
2023-08-04 12:13:41 -07:00
Paul Frazee c4459ec4e8 Simplify the after-post logic to avoid a UI bug (#1105) 2023-08-04 09:26:09 -07:00
Paul Frazee b154d3ea21 Labeling & moderation updates [DRAFT] (#1057)
* First pass moving to the new labeling sdk (it compiles)

* Correct behaviors around interpreting label moderation

* Improve moderation state rendering

* Improve hiders and alerts

* Improve handling of mutes

* Improve profile warnings

* Add profile blurring to profile header

* Add blocks to test cases

* Render labels on profile cards, do not filter

* Filter profiles from suggestions using moderation

* Apply profile blurring to ProfileCard

* Handle blocked and deleted quote posts

* Temporarily translate content filtering settings to new labels

* Fix types

* Tune ContentHider & PostHider click targets

* Put a warning on profilecard label pills

* Fix screenhider learnmore link on mobile

* Enforce no-override on user avatar

* Dont enumerate profile blur-media labels in alerts

* Fixes to muted posts (esp quotes of muted users)

* Fixes to account/profile warnings

* Bump @atproto/api@0.5.0

* Bump @atproto/api@0.5.1

* Fix tests

* 1.43

* Remove log

* Bump @atproto/api@0.5.2
2023-08-03 22:08:30 -07:00
Jake Gold 3ae5a6b631 bskyweb: publish Bluesky IPs 2023-08-03 11:02:34 -07:00
Paul Frazee 96280d5f1a Improve the profile preview with "swipe up to view" and local cache optimization (#1096)
* Update the ProfilePreview to use a swipe-up to navigate

* Use the profile cache to optimize load performance

* Hack to align the header in the profile preview against the screen view

* Fix profiles cache logic to ensure cache is used

* Fix dark mode on profile preview
2023-08-03 10:25:17 -07:00
Eric Bailey 1211c353d0 resolve did before loading feed (#1092)
* resolve did before loading feed

* add loader

* wrap with authRequired, handle errors
2023-08-03 10:00:38 -07:00
Paul Frazee a63f97aef2 Use a post and handle-resolution cache to enable quick postthread loading (#1097)
* Use a post and handle-resolution cache to enable quick postthread loading

* Fix positioning of thread when loaded from cache and give more visual cues

* Include parent posts in cache

* Include notifications in cache
2023-08-03 09:44:43 -07:00
William 7256169506 Change button based on option (#1077) 2023-08-02 09:56:47 -07:00
Ansh f33fdb97b6 change copy in `InviteCodes.tsx (#1082) 2023-08-02 09:34:39 -07:00
Emily Liu 869cc3aaae update readme (#1083)
Co-authored-by: Emily Liu <emilyliu732l@gmail.com>
2023-08-02 09:32:13 -07:00
Paul Frazee 4effa88aec 1.42 2023-07-28 21:14:02 -05:00
Paul Frazee 1195f28992 Fix keyboard support on the dropdown (#1073)
* Fix: dropdown now supports accessibility labels and keyboard controls

* Fix event propagation around the post dropdown
2023-07-28 18:12:21 -05:00
Paul Frazee 45da8a86c9 Fix to tests 2023-07-28 16:32:55 -05:00
Ansh 3b8b562268 [APP-737] Accessible native dropdown menu (#988)
* fix comments

* add zeego package

* get basic native dropdown working

* add separator and icon components

* refined native dropdown component

* add android build properties to app.json

* move `PostDropdownBtn` to its own component

* fix selectors issue

* move `PostDropdownBtn` to its own component

* fix hitslop

* fix post dropdown hitslop

* fix android dropdown icons

* move `UserAvatar.tsx` to native dropdown

* use native dropdown in `ProfileHeader.tsx`

* use native dropdown in `PostThreadItem.tsx`

* use native dropdown in `UserBanner.tsx`

* use native dropdown in `CustomFeed.tsx`

* replace `testId` with `testID` (which is what is used everywhere)

* move `Settings.tsx` to use native dropdown

* create jest mocks for zeego

* create jest mock for `zeego/dropdown-menu`

* web styles for native dropdown

* remove example native dropdown

* adjust web styles

* fix propagation

* fix pressable in `Settings.tsx`

* animate dropdown on web

* add keyboard nav and hover styles

* add hitslop to constants

* add comments to NativeDropdown component

* temporarily removed android icons

* add testID to PostDropdownBtn

* add testID back to all NativeDropdown button implementations

* add postDropdownBtn testID

* add testID to dropdown items

* remove testID from dropdown menu item

* refactor home-screen tests for native dropdown

* refactor profile-screen tests for native dropdown

* refactor thread-muting tests for native dropdown

* refactor thread-screen tests for native dropdown

* fix dropdown color for post dropdown button

* remove icons from android dropdown menu

* fix `create-account.test.ts`

* fix `invite-codes.test.ts`
2023-07-28 16:00:37 -05:00
Foysal Ahamed eec300d772 List cleanup on remove (#1069)
* 💄 Hide Add to List option on own profile

*  Remove Lists tab when last list is removed

*  Add listener to list delete on profile screen

*  Only show save changes in list modal when changes are made
2023-07-28 11:04:27 -05:00
Ansh 38d78e16bf Search custom feeds (#1031)
* paginate custom feeds

* basic search

* update `@atproto/api`

* use search from the API

* debounce search for 200ms
2023-07-28 10:29:37 -05:00
Foysal Ahamed 8e9b8b6b36 💄 Hide Add to List option on own profile (#1068) 2023-07-27 13:07:02 -05:00
Paul Frazee 49356700c3 [APP-782] Support invalid handles correctly (#1049)
* Update profile link construction to support handle.invalid

* Update list links  to support using handles

* Use did for isMe check to ensure invalid handles dont distort the check

* Shift the red (error) colors away from the pink spectrum

* Add ThemedText helper component

* Add sanitizedHandle() helper to render invalid handles well

* Fix regression: only show avatar in PostMeta when needed

* Restore the color of likes

* Remove users with invalid handles from default autosuggests
2023-07-27 10:50:12 -05:00
Steven 5a0899b989 fix: invisible url when only a protocol (#1059)
* fix: invisible url when only a protocol

- Fixes https://github.com/bluesky-social/social-app/issues/1058

* fix: handle more cases when url is not http/https
2023-07-27 10:49:37 -05:00
David Buchanan 44b3929240 Update icons.tsx - Simplify SatelliteDishIcon paths (#1048)
This prevents rendering jank
2023-07-25 10:21:17 -05:00
GitStart c1580dae1f fix: ALT text entered in the compose dialog is erased when you press "Edit" again (#1054) 2023-07-25 09:47:26 -05:00
Logan Rosen 806be6f722 Bump react-native-paste-input; remove hack (#1051) 2023-07-25 09:45:38 -05:00
Ansh bb99a234e1 [APP-720] Paginate custom feeds (#1030)
* paginate custom feeds

* Fix loading state bug

* DRY code up
2023-07-21 17:39:06 -05:00
Eric Bailey bf00d49863 #995 use asAnchor on external embeds (#1043)
* use asAnchor on external embeds

* add noFeedback back, fix TouchableWithoutFeedback anchor handling
2023-07-21 17:17:35 -05:00
Ansh 7e1dac0439 fix mute list overflow bug (#1041) 2023-07-20 11:48:23 -07:00
Ansh 30ac9259c7 [APP-775] Add Welcome screen after account creation (#1038)
* add comments to step 1-3

* add onboarding screen

* add analytics for onboarding tracking

* fix useEffect

* change text

* change icon size

* put onboarding into bottom sheet modal instead of react navigation

* wip

* Simplify the type validation

* Fix: only trigger onboarding modal when account creation succeeds

* Add the 'session-ready' event which fires when the new session is stable

* Use the 'session-ready' event to trigger the onboarding modal

* update copy

* update copy

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-07-19 23:50:42 -07:00
Ansh 3517d9fa28 Hotfix mobile web styling issues (#1039)
* remove hardcoded height for bottom bar

* prevent overflow of tab bar on mobile web
2023-07-19 15:00:40 -07:00
Eric Bailey 302490cb31 wrap interval in runInAction (#1037) 2023-07-19 14:24:35 -05:00
Eric Bailey 0ae52e91ce #984 Updating indexedAt timestamps (#1024)
* add TimeElapsed util component, integrate into PostThreadItem

* integrate into posts

* use consistent naming

* use mobx and single interval for TimeElapsed
2023-07-19 12:16:57 -05:00
Eric Bailey 4515559b1a #929 Wrap PasteInput updates in a setTimeout (#1033)
* wrap PasteInput updates in a setTimeout

* just wrap the whole callback
2023-07-19 12:08:40 -05:00
Sam Brownstone abd2c8e695 Fix cursor not being a pointer on profile back button (#1022)
* Fix cursor not being a pointer on profile back button

* Change TouchableOpacity to Pressable

* switch back to TouchableWithoutFeedback

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-07-18 15:40:36 -07:00
Eric Bailey a6bb38ee51 Merge pull request #1032 from bluesky-social/fix-1001-modal-scrolling
#1001 Modal content overflow
2023-07-18 16:46:22 -05:00
Eric Bailey 8a66af11ae Merge pull request #1011 from bluesky-social/eric/app-741-add-pre-commit-hook
add pre commit hook for linting/formatting
2023-07-18 16:45:24 -05:00
Eric Bailey 9ef54814f0 fix lint 2023-07-18 15:26:04 -05:00
Eric Bailey 1ca5792165 create explicit relationship between values 2023-07-18 15:18:56 -05:00
Eric Bailey 17deaaa7e7 use calc 2023-07-18 15:15:02 -05:00
Ansh Nanda b59ca5f343 undo commit 2023-07-18 13:05:17 -07:00
Ansh Nanda e0f30c716a test 2023-07-18 13:04:29 -07:00
Eric Bailey ea567362a1 Merge pull request #1025 from GitStartHQ/BLUESKY-OSS-8
[Web] A lot of post content in a modal causes parts of modal to become inaccessible
2023-07-18 14:57:21 -05:00
Paul Frazee 8d47e6f112 Merge branch 'therealjeffg-term_violation_addition' into main 2023-07-18 11:47:22 -05:00
Paul Frazee 9ac820baac Tweak copy 2023-07-18 11:47:10 -05:00
Paul Frazee ff61fc3c1d Merge branch 'term_violation_addition' of https://github.com/therealjeffg/social-app into therealjeffg-term_violation_addition 2023-07-18 11:43:14 -05:00
gitstart dea8b74580 fix hidden parts on modal 2023-07-18 07:05:57 +00:00
Eric Bailey aa4b79e77a handle failed custom feeds on home screen (#1012)
* handle failed custom feeds on home screen

* remove unnecessary edit

* make sure edits to pinned feeds are handled and reloaded

* fix lint
2023-07-17 17:31:56 -05:00
Paul Frazee bfed96bd7b Bump ios build number 2023-07-17 16:17:49 -05:00
Paul Frazee ad15ee31f3 [APP-773] Change waitlist explainer copy (#1021)
* Change waitlist explainer copy

* Restore the waitlist modal snap point to 80% to account for smaller phones

* Tune copy further
2023-07-17 16:17:14 -05:00
Jeff Griffiths 76aa792afd adds additional reason for reporting an account profile 2023-07-14 09:50:55 -07:00
Eric Bailey 2f63afc92e fix typo 2023-07-13 17:39:43 -07:00
Eric Bailey c75383bf9c move eslint dep to devDeps 2023-07-13 15:56:29 -07:00
Eric Bailey 5a2401ada9 conditionally install husky 2023-07-13 15:55:30 -07:00
Eric Bailey c83573bf97 set up lint-staged via husky
(cherry picked from commit 98151fafbd9b248fce62f013cecd3d20d4d17006)
2023-07-13 15:35:56 -07:00
Paul Frazee 3bd891b01a 1.41 2023-07-07 12:01:31 -05:00
Paul Frazee 237e957d16 Fixes and improvements to the Profile Preview modal (#992)
* Fix: use more reliable navigation method

* Fix: show lightbox over the active modal

* Fix: close the profile preview on navigation

* Factor out UserPreviewLink and add preview behavior to notifications

* Fix postmeta overflow on web

* Fix lint
2023-07-07 12:00:17 -05:00
Paul Frazee d8aded7b15 1.40 2023-07-06 21:24:01 -05:00
Paul Frazee 6f69157269 Post UI updates (Profile Preview on mobile) (#990)
* Update postmeta to put the timestamp on the right side on mobile

* Drop the two-line PostMeta mode

* Add ProfilePreview modal

* Tune PostMeta to give the best behavior possible for a given platform

* Remove old showFollowBtn attributes

* Fix style issue

* Switch the follow button in the profile header to use the inverted color for consistency with the rest of the app

* Fix lint

* Fix darkmode

* Tune the profile preview footer

* Better analytics choice
2023-07-06 21:12:54 -05:00
Ansh df7552135a [APP-703] Android horizontal scroll registers as tap (#960)
* use Touchables from react-native-gesture-handler

* upgrade `react-native-gesture-handler` to latest version

* add FixedTouchableHighlight for android

* add workaround comment

* wait for animations to complete before loading data

* downgrade RNGH back to the version we had
2023-07-06 20:41:27 -05:00
Paul Frazee bf1785765d [APP-729] Replace the ImageHider blurring effect with a simpler and more reliable card (#959)
* Replace the ImageHider blurring effect with a simpler and more reliable card

* A few improvements to ImageHider layout

* Simplify the ImageHider a bit more

* Small web layout tweak
2023-07-06 20:29:52 -05:00
Ansh b06304a253 [APP-28] add status page link (#987)
* add status page to mobile

* add status page URL to super slow loading screen

* store STATUS_PAGE_URL in constants.ts
2023-07-06 20:29:18 -05:00
Paul Frazee 831b367eb9 [APP-736] Clarify hate-group moderation as it's currently used (#985)
* Clarify hate-group moderation as it's currently used

* Update src/lib/labeling/const.ts

Co-authored-by: Emily Liu <emilyliu7321@gmail.com>

---------

Co-authored-by: Ansh <anshnanda10@gmail.com>
Co-authored-by: Emily Liu <emilyliu7321@gmail.com>
2023-07-06 20:28:31 -05:00
Paul Frazee e14c9783e0 [APP-735] Post language improvements (#982)
* Fix composer character-counter bouncing around UI elements

* Fix composer toolbar padding when keyboard is dismissed on iOS

* Use the full name of the language in the composer footer

* Add headings to the DropdownButton

* Update the composer language control to use a simpler dropdown

* Fix lint

* Add translate link to Post component used in notifications

* Fix lint
2023-07-06 20:28:10 -05:00
Jonty Wareing f05c2f06d6 Fix missing post text in noscript post view (#981) 2023-07-06 12:12:00 -05:00
Paul Frazee edb37e2c06 1.39 2023-07-05 21:22:04 -05:00
Paul Frazee d442b1cd4c Update support links (#977)
* Add the new zendesk feedback form URL

* Dont wrap handle or display name in the drawer

* Add help link

* Tune drawer footer layout

* Type fixes

* make helpdesk urls more composable for future

* fix typo

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-07-05 19:58:29 -05:00
Paul Frazee 3a6073abb8 Added instructions for .well-known method (supersedes #887) (#979)
* Added instructions for .well-known method

* Factor out SelectableBtn

* Rework the ChangeHandle modal to be a little clearer

* Fix lint

* Fix desktop layout

---------

Co-authored-by: Haider Ali Punjabi <haiderali@cyberservices.com>
Co-authored-by: Haider Ali Punjabi <haideralipunjabi@hackesta.org>
2023-07-05 19:56:42 -05:00
Ansh fe32730025 [APP-702] Render Custom Feed likes properly (#980)
* render href for custom feed likes properly

* fix custom feed text in push notification

* fix custom feed accessibility title

* fix lint
2023-07-05 19:56:26 -05:00
Ændra Rininsland 99aa38e3ca Fixes vertical alignment in feed tab bar (#974)
The tab bar items need `justify-content: center` on them or else they can appear unaligned when a feed name has an emoji character in it.
2023-07-05 18:26:18 -05:00
Ikko Eltociear Ashimine 3498c1d239 fix: typo in feed-manip.ts (#967)
prefered -> preferred
2023-07-05 09:49:45 -07:00
Paul Frazee 9750c393a0 1.38 2023-07-03 19:05:54 -05:00
Paul Frazee c8eeb6ba1c Fix: re-add the scroll boundary to avoid minimal shell at top of screen (#956) 2023-07-03 18:36:49 -05:00
Ansh 40a872612f don't throw, but log OTA listener errors (#958) 2023-07-03 18:17:28 -05:00
Ansh 269c0687fd track successful account creation (#955) 2023-07-03 18:17:03 -05:00
Paul Frazee 343154a403 Fix reply-root reference (fixes thread muting) (#957) 2023-07-03 17:54:09 -05:00
Paul Frazee 696bffe832 Add alt text validation option to user preferences (supersedes #913) (#914)
* Add alt text validation option to user preferences

* Fix typos/linting issues

* Update accessibility setting to match styles

* Update the required alt text reminder to go away once it's added

---------

Co-authored-by: Emma Fuller <emma@emmafuller.dev>
2023-07-03 15:58:07 -05:00
Paul Frazee bc55241c9a [APP-724] Collection of accessibility fixes (#949)
* Fix: include alt text on the web lightbox image

* a11y: Dont read the 'ALT' label

* a11y: remove a wrapper behavior from posts

This appears to have been introduced with the goal of creating meta
actions on posts, but the behavior seems counter-productive. The
accessibility inspector was unable to access individual items within
the post and therefore most content was simply skipped.

There may be a way to support the post actions without losing the
ability to access the inner elements but I couldnt find it. -prf

* a11y: apply alt tags to image wrappers so they get read

* a11y: set Link accessibilityLabel to the title if none set

* a11y: skip the SANDBOX watermark

* a11y: improve post meta to not read UI and give a useful date

* ally: improve post controls

* a11y: add labels to lightbox images on mobile

* fix types
2023-07-03 15:57:53 -05:00
Paul Frazee 0163ba0af8 Fix: let images on desktop web take more vertical space (#953) 2023-07-03 15:57:39 -05:00
Ansh edff1992b1 Add permission checks before saving image (#945)
* catch permission errors when saving image to album

* Save photos to media library alone (not an album)

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-07-03 13:17:12 -05:00
Paul Frazee 7cf0db7d14 Fix saved feeds screen layout on web (close #920) (#943) 2023-07-02 15:59:07 -05:00
Markus Amalthea Magnuson 1ea2a94b9b Fix keyboard navigation on settings page. (#923) 2023-07-02 15:18:42 -05:00
Markus Amalthea Magnuson 6768e3ff71 Make sidebar avatar keyboard-clickable. (#921) 2023-07-02 15:07:39 -05:00
Paul Frazee 97f0d3431c fix: stabilize minimalShellMode toggling by introducing modified thresholds (supersedes #938) (#942)
* add separate scroll up/down thresholds to prevent rapid state changes

* set `DY_LIMIT_DOWN` to 150

* Use a different scroll dy limit on web/mobile

---------

Co-authored-by: Sehyun Chung <sehyun.chung@icloud.com>
2023-07-02 15:03:16 -05:00
Ansh 7ee7d968e5 [APP-708] Onboarding revamp (#939)
* Move Discover New Feeds button to the top of the MultiFeed

* add discover custom feeds to empty following page
2023-07-02 13:30:02 -05:00
Dylan Smith 2be2498940 Use consistent font weight for repost count (#940) 2023-07-02 13:25:47 -05:00
Paul Frazee 7597fab290 1.37 2023-07-01 14:30:36 -05:00
Paul Frazee 2e93e4a919 Performance improvement (#937)
* Perf: Wait until a feed is visible in the home screen before fetching data

* perf: update feed checkForLatest to use limit=1

* Fix lint
2023-07-01 14:25:13 -05:00
Paul Frazee 93689ad73d Fix: correctly handle the case where the user has no languages configured 2023-06-30 12:21:30 -05:00
Paul Frazee 948b324cd8 1.36 2023-06-30 12:07:46 -05:00
Paul Frazee d50ba22820 Fix: reset navigation state on account switch (#933) 2023-06-30 11:38:37 -05:00
Paul Frazee 010588ee7c Fix thread muting (#932) 2023-06-30 11:38:22 -05:00
Paul Frazee ed5a88d9d8 [APP-718] Improvements and fixes to language handling (#931)
* Add locale helpers for narrowing languages

* Add a translate link to posts in a different language

* Update language filtering to use narrowing when multiple declared

* Fix a few more RTL layout cases

* Fix types
2023-06-30 11:35:29 -05:00
Paul Frazee 48844aa4c7 Include a notice during account creation for under-18 users (#927) 2023-06-30 11:34:52 -05:00
Paul Frazee c72e24f841 [APP-716] Add 'save image' button to the lightbox (#926)
* Add 'save image' button to the lightbox

* Fix types

* Fix types
2023-06-30 11:34:04 -05:00
Paul Frazee 5fcca17129 1.35 2023-06-28 13:41:42 -05:00
Paul Frazee eb05c4cd6f [APP-692] Accessibility font-scaling fixes (#922)
* Fix: enable font scaling in the composer text input

* Fix: cancel button in search no longer wraps

* Fix: report modals no longer clip off the bottom with scaled fonts

* Fix scrolling on android

* Allow wrapping in dropdown items until we can handle proper sizing
2023-06-28 13:38:21 -05:00
Paul Frazee df3589f207 Fix: hide the keyboard before showing the discard modal (#925) 2023-06-28 13:37:19 -05:00
Paul Frazee 8d32f3de37 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-06-28 09:59:16 -05:00
Paul Frazee c98bdcf86d 1.34 2023-06-27 20:56:45 -05:00
Paul Frazee f8d218e11a Simulator fixes (#918)
* Update the mock server to use the dev-env to manage the server

* Fix list testIDs

* Fix the invite test construction

* Remove leftover test hardcode
2023-06-27 20:55:46 -05:00
Paul Frazee dce80be075 Fix copy and dark mode styles in the home feed preferences (#915) 2023-06-27 15:00:00 -05:00
Paul Frazee 0921dd4335 Fix some broken links on policy docs (#916) 2023-06-27 14:59:42 -05:00
Paul Frazee a733b5b9f4 Revert change to the cancel button in the composer (#917) 2023-06-27 11:56:26 -07:00
Paul Frazee 1024f37a54 Merge branch 'benharri-forks-skip-confirmation-for-empty-post' into main 2023-06-27 11:04:33 -05:00
Paul Frazee 0f9429605d Merge branch 'skip-confirmation-for-empty-post' of https://github.com/benharri-forks/social-app into benharri-forks-skip-confirmation-for-empty-post 2023-06-27 11:01:25 -05:00
Ansh a8bbaa06c7 [APP-705] Metrics revamp pt2 (#896)
* export track function from analytics.tsx

* fix create account tracking

* fix tracking sign in

* add custom feed events

* fix type errors

* refactor create post event

* add profile follow & unfollow events

* refactor PostsFeedSliceModel into its own file

* refactor PostThreadItemModel into its own file

* reorganize code a lil bit

* refactor post-thread-item to use post-feed-item model under the hood

* add post events

* add post reply tracking

* track custom feed load more

* track list subscribe and unsubscribe
2023-06-27 10:11:05 -05:00
Paul Frazee bfaa6d73f3 Improvements to the alt text behaviors in the composer (#910)
* Add an image preview in the alt modal

* Composer: add info about alt text and a green checkmark when done

* Shrink the alt visual indicator a bit so it doesnt obscure the image

* Fix typo

* Fix: avoid requiring multiple tabs to save alt text

* update react-native-screens

* Improve the alt text help tip

* Remove redundant hints

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-06-27 09:52:49 -05:00
Ansh 25b3e14926 make discard btn more apparent in UI (#912) 2023-06-26 17:10:04 -07:00
Paul Frazee cd21a7dfc9 Fix Voice Control input on iOS (closes #891) (#911)
* Add patch to fix issue with VoiceControl on iOS

* Fix .patch
2023-06-26 18:53:35 -05:00
Ben Harris 2e082b6977 fix cancel post behavior
- prompt now appears for the cancel button
- no prompt when post is empty
- appease eslint
2023-06-26 16:28:28 -04:00
Ansh b9abd444e5 [APP-657] Add share list functionality (#863)
* replace delete list button text with icon

* fix mute list styling on desktop

* add share button to nav bar on a list

* fix styling when on profile

* bug: add key to ImageHorzList

* clean up code & refactor

* fix styling for ListItems

* create a reusable ListActions component for actions on a list

* remove dead styles

* add keys to ListActions

* add helpers to set list embed

* render list embeds

* fix list sharing on web

* make style prop optional in ListCard

* update `@atproto/api` to `0.3.13`
2023-06-26 12:15:39 -05:00
Markus Amalthea Magnuson 1666a747eb Add a11y details to profile page compose button. (#909)
This adds accessibility role, label and hint to the compose button on profile pages, to match the same button in all other views.
2023-06-26 12:14:51 -05:00
Ansh 08804f265e [APP-690] better handling of post languages language filtering (#893)
* add SelectLangBtn

* memoized objects that are created to reduce re-creation on re-render

* add langs when uploading post

* only send the top 3 languages otherwise backend will throw error

* mv ContentLanguagesSettings to folder

* add post languages settings modal and state

* fix typos

* modify feed manip to also check langs label on post

* Fix tests

* Remove log

* Update feed-manip.ts

* Fix syntax errors

* UI tuneups

* Show the currently selected languages in the composer

* fix linting

* Use a bcp-47 matching function

* Fix a duplicate language issue

* Fix web

* Dont include lang in prompt

* Make select language btn an observer

* Keep device languages on top of language selection UIs

* Fix android build settings

* Enforce a max of 3 languages in posts

* Fix tests

* Fix types

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-06-23 12:48:52 -05:00
Logan Rosen 9b19a95e63 Bump @types/react to ^18 and adjust types (#889) 2023-06-22 12:40:32 -04:00
Paul Frazee 180697b66b 1.33 2023-06-16 16:28:46 -05:00
Paul Frazee 46c65958bc Merge branch 'estrattonbailey-eric/reply-settings-toggle' into main 2023-06-16 16:02:56 -05:00
Paul Frazee 20cdede5e1 Small style fixes 2023-06-16 16:02:26 -05:00
Paul Frazee 31c9e02c0a Update feed settings icon 2023-06-16 15:56:27 -05:00
Eric Bailey 20f77ae7b7 feat: styling/copy cleanup 2023-06-16 15:17:09 -05:00
Eric Bailey 73c6afc7fb fix: comment 2023-06-16 15:16:30 -05:00
Eric Bailey 896aea9837 feat: add home feed preferences settings modal and tuners 2023-06-16 15:01:43 -05:00
Ansh 17e7590bcd [APP-511] metrics overhaul: frontend work (#506)
* WIP

* fix types and update imports

* wip

* tagged events that should be server side

* remove server-side analytics

* remove useless import

* add additional profile header events

* remove useless import

* track follow/unfollow clicks

* add missing types
2023-06-15 16:45:14 -05:00
Paul Frazee 1695ae34db 1.32 2023-06-14 23:17:25 -05:00
Paul Frazee 56ec3bf89e Move policy docs to blueskyweb.xyz (#881) 2023-06-14 20:00:28 -05:00
Paul Frazee 3663ee57f3 Add testnet warning (#880)
* Add testnet warning

* Add watermarks to posts

* Call the test environment the Sandbox
2023-06-14 20:00:16 -05:00
Ansh 775b5e6578 add checks to make sure we are on web (#879) 2023-06-14 17:20:46 -05:00
Tymoteusz Boba 272ddeb7e2 Upgrade Reanimated from 2.14.4 to 3.1.0 (#753)
* Update Reanimated API to v3

* Fix failing tests after updating Reanimated

* Include changes from package.json in Reanimated library to patch

* upgrade reanimated to 3.3.0

* remove patch

* upgrade bottom sheet

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-06-14 16:35:06 -05:00
Ansh 9b9f339e3e [APP-686] Fix mobile web styling (#876)
* fix desktop window size

* fix desktop window size

* add listener for resize events

* fix when going from mobile to web

* only add eventListener for web
2023-06-14 15:26:44 -05:00
Ansh 71af9fd04b add error handling to updateCache for saved-feeds (#878) 2023-06-14 15:14:56 -05:00
Markus Amalthea Magnuson c060cd4158 Various case and text fixes. (#757)
* Various case and text fixes.

* Update some labels per requested changes.

---------

Co-authored-by: Ansh <anshnanda10@gmail.com>
2023-06-13 11:35:13 -07:00
Ivan Silvestre 37782ae60b Desktop: prevent unnecessary X scroll between 1230px and 1260px (#828)
* Desktop: prevent unnecessary X scroll between 1230px and 1260px

* imports structure without changes

* re add dot to text
2023-06-13 11:29:36 -07:00
GitStart c20f8937cb UX: account deletion dialogue does not tell me which account I'm deleting (#835)
* fix: account deletion dialogue does not tell me which account I'm deleting

* update styles and display name
2023-06-13 11:24:57 -07:00
Paul Frazee 1a12fa5775 Add temporary appview-proxy header toggle (#874) 2023-06-13 13:10:42 -05:00
Paul Frazee 6efbe820d9 Merge branch 'loganrosen-loganrosen/heading-elements' into main 2023-06-12 17:26:17 -05:00
Paul Frazee bc2bf20e08 Update info screen titles to use H1 2023-06-12 17:25:52 -05:00
Paul Frazee 9c8e0ab33a Merge branch 'loganrosen/heading-elements' of https://github.com/loganrosen/social-app into loganrosen-loganrosen/heading-elements 2023-06-12 17:06:39 -05:00
Paul Frazee abdb4aace6 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-06-12 17:06:17 -05:00
Markus Amalthea Magnuson 571285c2b4 Fix image-only posts not being visible in custom feeds. (#871) 2023-06-12 17:05:31 -05:00
Logan Rosen 9232daba7a Move useWebMediaQueries() above return (#872) 2023-06-11 20:12:50 -07:00
Markus Amalthea Magnuson 8f74c7b949 Fix image-only posts not being visible in custom feeds. 2023-06-12 01:40:59 +02:00
Logan Rosen 55cf53cfd5 Use native heading elements 2023-06-10 19:12:26 -04:00
Paul Frazee 8d03ab9399 1.31 2023-06-09 17:32:40 -05:00
Logan Rosen 9ac8c44a6a Use Linking.openSettings() so it works on Android (#865) 2023-06-08 20:47:24 -07:00
Logan Rosen cae615769c Link to instructions for creating Sentry auth token (#864) 2023-06-08 19:54:37 -07:00
Ansh 6a967cce00 make build version text copy on press (#862) 2023-06-08 14:40:20 -05:00
Ansh b3e7801796 Revert "show date after 7 days closes #754" (#860) 2023-06-08 11:32:56 -05:00
Ansh 007d12e182 push instead of navigate (#861) 2023-06-07 17:55:25 -05:00
Ansh 0be14a1b46 [APP-680] Allow users to add details when reporting (#854)
* allow user to add text when reporting post

* add DMCA override

* increase modal size

* fix dark mode text color

* re-organize components

* add details option when reporting account

* hard-code modal size so it works on smaller devices

* fix modal on web

* Remove outline from textarea focus

* Tweak some styles

* Fix lint

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-06-07 11:11:04 -05:00
Ansh fc12a1205c allow image to clicked to go to post in notificaitons (#858) 2023-06-07 09:57:49 -05:00
Logan Rosen bdcdb4e4dc Use expo-image-picker on Web (#847) 2023-06-06 09:38:58 -05:00
Keith Cirkel a67eaa6ace remove X-UA-Compatible meta tag (#857)
This meta tag allows Internet Explorer 7 through 11 to change which document mode they would use. As of 2013, however, [Microsoft Edge would ignore this value except under strict circumstances](https://learn.microsoft.com/en-gb/archive/blogs/ie/living-on-the-edge-our-next-step-in-helping-the-web-just-work). This meta tag is ignored in modern versions of Edge (Chromium based).

[Internet Explorer 11 reached EOL in June 2022](https://blogs.windows.com/windowsexperience/2022/06/15/internet-explorer-11-has-retired-and-is-officially-out-of-support-what-you-need-to-know/) and today makes up an exceedingly small proportion of internet traffic.

It's unlikely that anyone is browsing on Internet Explorer, and less
likely that they're browsing on IE<11, which makes this tag redundant.

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-06-06 09:33:23 -05:00
Keith Cirkel b33626c3c7 remove trailing / on meta tags (#856)
* remove trailing / on meta tags

Meta tags are [void elements](https://html.spec.whatwg.org/multipage/syntax.html#void-elements) which means they are self closing, and do not require a closing tag, nor a trailing `/`.

The trailing `/` is something that was required in XHTML but [is ignored
in HTML](https://html.spec.whatwg.org/multipage/syntax.html#start-tags). Quoth the spec:

> On void elements, [the trailing slash] does not mark the start tag as self-closing but instead is unnecessary and has no effect of any kind. For such void elements, it should be used only with caution — especially since, if directly preceded by an unquoted attribute value, it becomes part of the attribute value rather than being discarded by the parser.

* remove trailing / on link tags
2023-06-06 09:32:30 -05:00
Ansh bf36101bf2 [APP-655] Password autocomplete when logging in (#838)
* remove unused styles

* refine login form to autofill password from password manager
2023-06-06 09:31:50 -05:00
Logan Rosen 8cc89a5a16 Fix dark mode detection on mobile (#852) 2023-06-05 09:40:13 -07:00
Paul Frazee 48637246c7 1.30 2023-06-02 15:38:49 -05:00
Paul Frazee 75b729a670 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-06-02 15:29:36 -05:00
Paul Frazee a2721ceb95 Fix to simulator tests 2023-06-02 15:29:27 -05:00
Ansh ba4bb46c3f [APP-107] OTA updates (#587)
* add 1000ms fallbackToCacheTimeout

* add listener via useOTAUpdate hook and show modal if update is available

* finish expo-updates setup

* setup useOTAUpdate hook

* add 1000ms fallbackToCacheTimeout

* add listener via useOTAUpdate hook and show modal if update is available

* finish expo-updates setup

* setup useOTAUpdate hook

* add OTA updates

* Update build.md

* temporarily disable ota updates

* refactor useOTAUpdate code
2023-06-02 13:27:59 -07:00
Paul Frazee ad4eaf5ed2 Move suggested follow recommendations to the server (#836)
* Move suggested follow recommendations to the server

* fix search results color in dark mode

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-06-02 15:01:16 -05:00
Paul Frazee e8843ded5b Fix a bunch of type errors and add a type-check to the github workflows (#837)
* Add yarn type-check

* Rename to yarn typecheck

* Fix a collection of type errors

* Add typecheck to automated tests

* add `dist` to exluded folders tsconfig

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-06-02 15:01:04 -05:00
Logan Rosen 46c9de7c18 Don't show Remove button for nonexistent avatar/banner (#833) 2023-06-02 09:51:11 -05:00
Paul Frazee 3217c7ff32 More custom-feed behavior fixes [APP-678] (#831)
* Remove extraneous custom-feed health check

* Fixes to custom feed preference sync

* Fix lint

* Remove dead code (client-side suggested posts constructor)

* Enforce the feed-fetch limit in the client if the generator fails to observe the parameter

* Bump the number of items fetched in the multifeed per feed from 5 to 10

* Reset the currently active feed when the pinned feeds change

* Some fixes to icons

* Add a prompt to load latest to the multifeed

* Remove debug
2023-06-02 09:48:53 -05:00
Paul Frazee e9c84a192b Fixes to feed preference and state sync [APP-678] (#829)
* Remove extraneous custom-feed health check

* Fixes to custom feed preference sync

* Fix lint

* Fix to how preferences are synced to enable membership modifications
2023-06-01 14:46:13 -05:00
Jake Gold f416798c5f bskyweb: add security.txt 2023-06-01 11:47:59 -07:00
Kadi Kraman d4e7355cca fix: support scroll to top on profile screen (#725)
* Support scroll to top on profile screen

* Refactor types

* Remove async

* Improve types
2023-06-01 11:00:00 -05:00
Michi Hoffmann 792d7e1a55 Fix line breaks on side bar links (#815) 2023-06-01 10:51:42 -05:00
Samuel Newman 88212eb065 translate to primary language rather than just english (#814) 2023-06-01 10:50:18 -05:00
Ansh 1fc694d488 [APP-656] make alt text expandable (#821)
* make alt text expandable

* clean code
2023-06-01 10:47:17 -05:00
Ansh 5c25d670d0 move early return to after all hooks (#823) 2023-06-01 10:41:27 -05:00
Ansh 54e5e30945 [APP-674] Fix search results tab bar (#822)
* fix search results tab bar

* Fix spacing on web

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-06-01 10:40:26 -05:00
Jake Gold 49840f3a27 bskyweb: gzip HTTP responses + some other minor improvements (#826)
* bskyweb: gzip HTTP responses + JSON logging + minor refactoring

* reduce timeout and max header size

* add a security.txt
2023-06-01 10:22:02 -05:00
Ansh 8fde55b59b simplify how x position is calculated for scrollTo in TabBar (#820) 2023-06-01 10:19:15 -05:00
bnewbold 31a41d9b09 bskyweb: run-dev-bskyweb in debug mode (#827) 2023-05-31 20:44:50 -07:00
Ansh 189fdb1789 fix linting & type errors (#819) 2023-05-31 17:19:08 -07:00
LW 7d7410942f fix: make DesktopLeftNav not overflow screen (#762)
* fix: make DesktopLeftNav not overflow screen

* scroll: auto
2023-05-30 21:18:00 -05:00
Ansh 3cb8169a4f Fix deeplink when app is suspended (#812)
* Update Navigation.tsx

Missing If statement within the Deep Linking function that broke the ability to change state to hometab

* Updated the function correctly, I missed a bracket

* format

* add pre-existing home state when unspecified path

* Remove unnecessary log

---------

Co-authored-by: Gai <68623807+that-gai-gai@users.noreply.github.com>
Co-authored-by: that-gai-gai <kgai@protonmail.com>
2023-05-30 21:16:29 -05:00
Paul Frazee 421f29ad98 Merge branch 'ericvolp12-inherit_system_theme' into main 2023-05-30 21:13:34 -05:00
Paul Frazee 2413549fa5 Tune sizing of appearance control 2023-05-30 21:13:18 -05:00
Jaz 09ade363fd Merge branch 'main' into inherit_system_theme 2023-05-30 18:25:29 -07:00
38elements e224569a11 Remove lodash.clonedeep in package.json (#652) 2023-05-30 20:19:09 -05:00
Matin Zadeh Dolatabad fa9351534b perf: enable lazy loading for tab navigation (#711) 2023-05-30 20:16:30 -05:00
Markus Amalthea Magnuson 7d47b342d6 Make terms and notices dates less ambiguous. (#713) 2023-05-30 20:09:35 -05:00
Ollie H c0ca27b7ce Use proxy for fetching link meta (#716)
* Use proxy for fetching link meta

* Remove link meta test due to hitting proxy

* setup different staging and prod proxy URLs

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-30 20:08:49 -05:00
Bartosz Kaszubowski 2018558585 feat(Login): allow submitting on password field (#720) 2023-05-30 19:56:13 -05:00
Ben Harris 037713321d show package.json version on web (#717) 2023-05-30 19:53:23 -05:00
Ollie H a9a661ab58 Add ability to reply, repost (without quote post), and like posts using VoiceOver (#765)
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-30 19:50:56 -05:00
Ben Harris 7458b6f600 Move MAX_GRAPHEME_LENGTH to constants.ts (#735) 2023-05-30 19:41:56 -05:00
skipness 0239225796 fix: content trimmed in server input modal (#733) 2023-05-30 19:41:21 -05:00
Okechukwu Somtochukwu 8258317c38 [typo] correct typo was 'fo' instead of 'to' (#721) 2023-05-30 17:26:40 -07:00
Ollie H 072682dd9f Rework scaled dimensions and compression (#737)
* Rework scaled dimensions and compression

* Unbreak image / banner uploads

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-30 19:23:55 -05:00
Ollie H deebe18aaa Use non-pipe translation link (#740) 2023-05-30 18:54:47 -05:00
Ansh a911250ea8 add instructions to removing sentry in build.md (#749)
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-30 18:50:52 -05:00
David Buchanan 1ca40cf1fd Update HomeIconSolid: widen the front door (#756) 2023-05-30 18:49:03 -05:00
Ben Harris ca34364cf0 Support arrow key navigation for Lightbox.web.tsx (#761)
* Support arrow key navigation for Lightbox.web.tsx

renames onEscape to onKeyDown

* appease eslint

* appease eslint again

* wrap onPressLeft and onPressRight in useCallback
2023-05-30 18:45:49 -05:00
MohammadReza Mahmoudi 442d453600 Fix profile load issue + enhancement of profile isCurrent style (#764)
* fix profile isActive issue

* fix myProfile load issue when visiting other profiles first

* fix lint issues

* change currentRouteName to currentRouteInfo
2023-05-30 18:42:22 -05:00
Paul Frazee 5d0a3e6c65 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-05-30 18:35:18 -05:00
Seth Arnold 1e5c4609a8 Update ProfileHeader.tsx (#810)
Change error message from "failed to blocK" to "failed to unblock"
2023-05-30 18:32:46 -05:00
Paul Frazee a11a1b7657 Merge branch 'show_timestamp_after_7d' of https://github.com/benharri-forks/social-app into main 2023-05-30 18:20:26 -05:00
Paul Frazee 762ab3d385 Update yarn.lock 2023-05-30 18:20:11 -05:00
Ben Harris 439135944c make eslint happy 2023-05-30 18:30:12 -04:00
Ben Harris f2cf1d8c79 show date after 7 days, closes #754
adjust the behavior of ago() to show the date after a week
2023-05-30 18:22:22 -04:00
Ollie H 234e04c396 Update follower/following a11y hints and labels (#755)
* Update follower/following a11y hints and labels

* Update ProfileHeader.tsx

---------

Co-authored-by: Ansh <anshnanda10@gmail.com>
2023-05-30 13:39:50 -07:00
Ben Harris 09c515d273 fix web links to no longer point to staging (#758)
* fix web link in README.md

* missed one
2023-05-30 13:34:14 -07:00
Josh Soref c808721938 Spelling (#772)
* spelling: account

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: activated

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: additional

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: appropriate

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: bskyweb

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: description

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: display

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: highlighted

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: javascript

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: locally-hosted

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: notification

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: occurring

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: parenthetical

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: preexisting

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: prefetched

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: punctuation

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

* spelling: simplicity

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>

---------

Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2023-05-30 14:46:43 -05:00
Ansh 724951e2f0 stick to bottom sheet version 4.4.5 (#777) 2023-05-30 14:37:40 -05:00
GitStart 69bcb72061 update delete app password confirmation modal (#803) 2023-05-30 13:56:30 -05:00
Logan Rosen a89129fcf6 Fix button to find people to follow (#806) 2023-05-30 13:55:06 -05:00
Paul Frazee 19ea6b6ae7 Merge branch 'ivansilvestre-main' into main 2023-05-30 13:53:46 -05:00
Paul Frazee e77c616970 Hide both the left and right nav on desktop when logged out 2023-05-30 13:53:33 -05:00
Paul Frazee 7a7b99d033 Merge branch 'main' of https://github.com/ivansilvestre/social-app into ivansilvestre-main 2023-05-30 13:45:44 -05:00
bnewbold a51d5dc7e2 labels: add 'corpse' to 'violent' category (#802)
Overlooked this when the label was added earlier.
2023-05-30 13:43:37 -05:00
Ivan Silvestre caab6309df Desktop: hide the left panel and the invite codes from the main page if you are not logged in 2023-05-30 13:54:23 +01:00
Jake Gold e58fe2e204 add/serve .well-known files (both files) 2023-05-26 17:59:25 -07:00
Jake Gold c98b65f6a9 add/serve .well-known files 2023-05-26 17:49:58 -07:00
Paul Frazee 7b6948e617 Merge branch 'custom-algos' into main 2023-05-25 21:17:11 -05:00
Paul Frazee e832352e98 Bump build numbers 2023-05-25 21:14:45 -05:00
Paul Frazee 62b309be5b Include follow button in posts on the multifeed 2023-05-25 21:13:30 -05:00
Paul Frazee 93984277c9 Simulator fixes 2023-05-25 21:10:44 -05:00
Ansh Nanda bcedbbc8b3 error for custom feed when it is not valid or offlien 2023-05-25 19:01:37 -07:00
Paul Frazee 11262ffc83 Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos 2023-05-25 20:49:16 -05:00
Paul Frazee 229153a26c Fix tsc 2023-05-25 20:48:43 -05:00
Ansh Nanda fa9b91f793 Merge branch 'custom-algos' of https://github.com/bluesky-social/social-app into custom-algos 2023-05-25 18:48:41 -07:00
Ansh Nanda 4cd9a4493e add empty state for custom feed 2023-05-25 18:48:40 -07:00
Paul Frazee 25153f1f4d Fix lint 2023-05-25 20:45:35 -05:00
Paul Frazee 68332bc877 UI tune ups 2023-05-25 20:44:37 -05:00
Paul Frazee 27ff9ce43b Remove sorting in feed-manip 2023-05-25 20:32:12 -05:00
Paul Frazee 9da5a1a780 Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos 2023-05-25 20:28:01 -05:00
Paul Frazee 0a1f912ece Fixes & updates for mobile web 2023-05-25 20:27:55 -05:00
Ansh Nanda 2c970781b7 replace profile with hamburger menu in search as well 2023-05-25 18:25:31 -07:00
Paul Frazee 651f3abc1f Tune up custom feed uis on web 2023-05-25 20:19:49 -05:00
Paul Frazee 216d301191 Fix bad import 2023-05-25 20:12:49 -05:00
Paul Frazee 767f5353ea Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos 2023-05-25 20:02:41 -05:00
Paul Frazee 257686f360 Add feeds tab 2023-05-25 20:02:37 -05:00
Ansh Nanda 202a56cff6 small tweak to tab bar positioning 2023-05-25 16:23:32 -07:00
Paul Frazee df6d249e85 Small tweak to feed tab bar positioning 2023-05-25 17:53:57 -05:00
Paul Frazee dd1bbcfb0b Add scrollview to drawer 2023-05-25 17:26:34 -05:00
Paul Frazee 8fa33ac928 Add my feeds to the drawer 2023-05-25 17:13:32 -05:00
Paul Frazee 7916c2e02e Add 'popular with friends' to default feeds 2023-05-25 17:10:00 -05:00
Paul Frazee bf056cf622 Visually unify the home header with other screens 2023-05-25 17:09:23 -05:00
Paul Frazee cc6ead42d0 Switch to new satellite icon on the header 2023-05-25 17:00:39 -05:00
Paul Frazee 20ef1b8b7b Add custom satellite-dish icons 2023-05-25 16:51:12 -05:00
Paul Frazee 0f30f743cb Use the bars icon on the viewheader 2023-05-25 15:56:29 -05:00
Paul Frazee e33dad8b72 Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos 2023-05-25 15:56:19 -05:00
Ansh Nanda 881be748d5 increase save custom feed btn hitslop 2023-05-25 13:54:43 -07:00
Ansh Nanda bce6c8d5ec rename Algos to Feeds on profile 2023-05-25 13:51:08 -07:00
Ansh Nanda a9027cfb45 turn of auto correct and capitalize on search 2023-05-25 13:50:59 -07:00
Ansh Nanda 14619cf8a3 fix type errors on Custom Feed screen 2023-05-25 13:46:17 -07:00
Ansh Nanda be2beae1f1 delete old My Feeds / Saved Feeds screen 2023-05-25 13:46:06 -07:00
Ansh Nanda f891305185 fix padding on Discover Feeds screen 2023-05-25 13:42:26 -07:00
Ansh Nanda 8bb3f40a59 add saved feeds to left nav on desktop 2023-05-25 13:14:40 -07:00
Ansh Nanda 6e5078e0c1 Merge branch 'custom-algos' of https://github.com/bluesky-social/social-app into custom-algos 2023-05-25 13:00:16 -07:00
Paul Frazee a39a06ba09 Tune the saved feeds ui 2023-05-25 14:58:04 -05:00
Paul Frazee f03ac9fd56 Tune the UI layout of the feed tab header 2023-05-25 14:56:23 -05:00
Ansh Nanda db63442360 adjust styling for feeds tab bar on mobile 2023-05-25 12:54:31 -07:00
Ansh Nanda 524f8b6abd Merge branch 'custom-algos' of https://github.com/bluesky-social/social-app into custom-algos 2023-05-25 00:18:00 -07:00
Ansh Nanda 0bdb0ac006 put user avatar on bottom bar and replace with hamburger menu on top 2023-05-25 00:17:57 -07:00
Ansh Nanda 007c523010 add top bar and link to new SavedScreen 2023-05-25 00:08:44 -07:00
Paul Frazee 93e9fa8edf Restore the 'load more' button on web 2023-05-25 01:53:37 -05:00
Paul Frazee e89103915d Update load latest to show when there's new activity with an indicator 2023-05-25 01:30:48 -05:00
Paul Frazee 6f02548bca Make load-latest button same on web 2023-05-25 00:20:49 -05:00
Paul Frazee 0262ed11ea Fix the 'dancing header' problem on web 2023-05-25 00:10:48 -05:00
Paul Frazee 5124be33ad Tune the footer text ui a bit 2023-05-24 23:59:37 -05:00
Paul Frazee b00e0d71ef Bump build number for ios 2023-05-24 22:10:14 -05:00
Paul Frazee dfb39e7c4f Add feed discovery page 2023-05-24 22:09:39 -05:00
Paul Frazee 12c7f6d6a5 Tune the custom feeds header a bit more 2023-05-24 19:27:04 -05:00
Paul Frazee 629ca24e90 Tune the custom feed header 2023-05-24 19:03:59 -05:00
Paul Frazee 2ba4d9bfbf Add compose fab to custom feed screen 2023-05-24 18:50:19 -05:00
Paul Frazee 0a18229784 Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos 2023-05-24 18:46:55 -05:00
Paul Frazee 4e1876fe85 Refactor the scroll-to-top UX 2023-05-24 18:46:27 -05:00
Ansh Nanda 32c9dabb74 make tab bar scroll view draggable on web 2023-05-24 15:04:30 -07:00
Ansh Nanda 7e555ecc1b fix lint errors 2023-05-24 15:00:36 -07:00
Ansh Nanda 04468eb1b7 make prettier and eslint work together 2023-05-24 14:59:42 -07:00
Ansh Nanda 9673225f78 fix scrollToTop for web 2023-05-24 14:18:49 -07:00
Ansh Nanda 58a0489ce3 add isWeb check to disable haptics on web 2023-05-24 13:59:53 -07:00
Ansh Nanda 858ec6438d show scroll to top button when scrolling stops 2023-05-23 15:48:14 -07:00
Ansh Nanda 0fd5c9294a refactor load latest btn 2023-05-23 15:33:27 -07:00
Ansh Nanda fc9e28ca72 slight performance improvements 2023-05-23 15:28:46 -07:00
Ansh Nanda b561a51ed9 add button to reset preferences in dev mode 2023-05-23 14:18:35 -07:00
Ansh Nanda 52a8879754 update pinned feed from custom feed view 2023-05-22 20:07:40 -07:00
Ansh Nanda 8a2349c55f increase pin button hitslop 2023-05-22 19:14:10 -07:00
Ansh Nanda 512c918c03 decrease long press time required to reoreder pinned feed 2023-05-22 19:10:03 -07:00
Ansh Nanda dfcdd37087 add haptics to save, like, and pin actions on feed 2023-05-22 18:46:36 -07:00
Ansh Nanda 64e303d911 optimistic updates for liking custom feeds 2023-05-22 16:35:37 -07:00
Ansh Nanda 762bd15ed6 fix prod default feeds not working 2023-05-22 16:12:05 -07:00
Ansh Nanda 7cad7d12f1 add refreshControl to tab ViewSelector 2023-05-19 18:32:21 -07:00
Ansh Nanda 8bcbbb869a fix dark mode color for creator handle on CustomFeed screen 2023-05-19 18:30:24 -07:00
Ansh Nanda 48a9e1b1dd fix refresh control color in ViewSelector.tsx 2023-05-19 18:27:13 -07:00
Ollie H 15c1b6ee15 Merge pull request #744 from bluesky-social/ollie/693
Update labels for avatar
2023-05-18 21:09:39 -07:00
Paul Frazee 91ae0d7775 1.29 testflight 2023-05-18 21:06:00 -05:00
renahlee 2a5ac1a6de Update labels for avatar 2023-05-18 17:31:57 -07:00
Paul Frazee 37acc9e930 A few more UX tweaks 2023-05-18 18:22:46 -05:00
Paul Frazee 0b8dd95f2a Bump deps again 2023-05-18 18:22:34 -05:00
Paul Frazee da6fa2dede Bump deps 2023-05-18 18:04:32 -05:00
Paul Frazee 4fa4c67cc5 Some fixes 2023-05-18 17:36:16 -05:00
Paul Frazee 46ed910cda Add list-type avatar 2023-05-18 17:10:42 -05:00
Paul Frazee 324c9209dc Only show algos and lists on profiles if there are items 2023-05-18 17:01:48 -05:00
Paul Frazee ad8778ab10 Add server-side routes 2023-05-18 16:55:50 -05:00
Paul Frazee 3c89dd40f9 Fix lint 2023-05-18 16:54:17 -05:00
Paul Frazee 1ecf0da81b Add feed sharing 2023-05-18 16:22:11 -05:00
Paul Frazee 84990c509e Drop the hard-coded what's hot algo 2023-05-18 15:12:18 -05:00
Paul Frazee 2f4408582b Set default feeds 2023-05-18 15:06:32 -05:00
Paul Frazee 9c9e4e5691 Merge branch 'custom-algos' of github.com:bluesky-social/social-app into custom-algos 2023-05-18 14:39:12 -05:00
Paul Frazee 5537d19e55 Update saved feeds to use preferences 2023-05-18 14:39:04 -05:00
Jake Gold 211fce47ce Fix /api/waitlist API (#726)
* move /waitlist to /api/waitlist where its expected

* parse waitlist API request as JSON, duh
2023-05-18 11:56:09 -07:00
Ansh Nanda f1d2166c29 fix spacing when user has no feeds 2023-05-18 10:36:16 -07:00
Ansh Nanda 571fc37a99 fix error & empty state when rendering custom feeds on profile 2023-05-18 10:34:34 -07:00
Paul Frazee acea0e074d Tab bar fixes 2023-05-18 12:05:32 -05:00
Paul Frazee 754496b957 Fix custom feed header on desktop web 2023-05-18 11:57:49 -05:00
Paul Frazee 7691fe4f48 Store/sync pinned feeds on the server 2023-05-18 11:51:25 -05:00
Paul Frazee d88c27a419 Improve web titles 2023-05-17 23:36:36 -05:00
Paul Frazee 5a20e0fafa Add web titles 2023-05-17 23:33:59 -05:00
Paul Frazee 129fc42e95 Improve pinned feed management 2023-05-17 23:32:19 -05:00
Jaz 7f76c2d67e Merge branch 'main' into inherit_system_theme 2023-05-17 21:19:20 -07:00
Jaz ac3a95dc72 Remove unused imports 2023-05-17 21:15:37 -07:00
Jaz 3c15f6ba02 Move appearance settings to settings page 2023-05-17 21:14:26 -07:00
Paul Frazee bec94ed82c Desktop styling fixes 2023-05-17 22:58:53 -05:00
Paul Frazee ed7293ea66 Remove redundant component 2023-05-17 22:15:44 -05:00
Paul Frazee a2c89b47a1 Add custom feed liked by screen 2023-05-17 22:12:14 -05:00
Paul Frazee 998879d6d6 Remove redundant feed-settings page 2023-05-17 22:04:01 -05:00
Paul Frazee 177df36330 Fixes to the tab bar 2023-05-17 21:54:40 -05:00
Paul Frazee 6bf8e72157 Usability improvements to feeds 2023-05-17 21:23:32 -05:00
Paul Frazee f0003d1931 Add 'my feeds' tab 2023-05-17 20:33:58 -05:00
Paul Frazee c55ce6de02 Rework the UI for the custom feed view 2023-05-17 15:52:11 -05:00
Paul Frazee 0f5b3808f8 Remove a focus-effect that was triggering a rerender loop 2023-05-17 15:03:19 -05:00
Paul Frazee 2fd3b4ca04 Clean up the custom-feed model 2023-05-17 14:55:04 -05:00
Paul Frazee 9c02fbb925 Unify the display name fallback behavior 2023-05-17 14:38:23 -05:00
Paul Frazee 4e56d24a9d Dont show save button in embed cards 2023-05-17 14:34:37 -05:00
Paul Frazee fb03bbf288 Fix some palette issues 2023-05-17 14:26:23 -05:00
Paul Frazee a4c6dd6b1e Tune up the custom feed card rendering 2023-05-17 14:24:27 -05:00
Paul Frazee 3d09008bfd Reorganize custom feeds in the view layer 2023-05-17 14:03:08 -05:00
Paul Frazee b672006f7e Reorganize custom-feed state models and add the missing _reactKey attribute 2023-05-17 13:52:16 -05:00
Paul Frazee a2b089d315 Add 'algo' variant of avatars 2023-05-17 13:42:29 -05:00
Paul Frazee 85910cdbea Fix missed change in merge 2023-05-17 13:42:16 -05:00
Paul Frazee df3b988157 Update yarn.lock 2023-05-17 13:42:09 -05:00
Paul Frazee 7aa1d9010e Merge branch 'main' into custom-algos 2023-05-17 12:30:54 -05:00
Ollie H 0ca096138a Merge pull request #692 from bluesky-social/ollie/unread-notifications
Update hint for notifications
2023-05-17 09:37:54 -07:00
renahlee d6ca8e918a Update to empty hint if no notifications 2023-05-17 09:13:06 -07:00
renahlee f7f0db65d3 Update hint for notifications 2023-05-17 09:12:09 -07:00
Paul Frazee 562faa76cc feat: add basic visual feedback on Button interactions (#708)
* feat: add basic visual feedback on Button interaction

* Use a more efficient approach to providing visual feedback

* Fix some lint issues left over from another PR

---------

Co-authored-by: Simek <gosimek@gmail.com>
2023-05-17 11:10:51 -05:00
LW 41f3a05515 style: remove useUnreadCountLabel hack from 50c1841 (#655) (#686)
I just realized how `mobx` works (never used before lol) and now I feel
dumb.
2023-05-17 09:50:28 -05:00
Ollie H 656baa7239 Close active elements on state change (#677) 2023-05-17 09:46:10 -05:00
Richard Gordon 09bb2f5208 hidereport button on own post (#676) 2023-05-17 09:43:08 -05:00
William d7826a3334 Properly set isInputFocused (#666) 2023-05-17 09:41:54 -05:00
Mohammad Reza Mahmoudi 6dde5ede34 fix theme opposite labels (#700) 2023-05-17 09:33:05 -05:00
Pedro b132ff7a76 Update build.md - minor typo (#696)
This is not the smallest PR in the world, this is just a tribute.

(actually, it's just one byte, so it might be the smallest PR in the world)
2023-05-17 09:27:02 -05:00
LW b1c5794190 docs: update e2e mock server command (#662) 2023-05-17 09:21:34 -05:00
Matin Zadeh Dolatabad c1fe12f5bf chore: update expo-image to 1.2.3 (#664)
Issue: https://github.com/expo/expo/pull/22491
2023-05-17 09:19:59 -05:00
Ansh Nanda 52c72d6532 cleanup package.json 2023-05-16 23:46:29 -07:00
Ansh Nanda 90adc19415 fix re-rendering issue 2023-05-16 23:45:14 -07:00
Ansh Nanda 1378ab46e9 make sure TabBar re-rerenders when pinned feeds changes 2023-05-16 23:40:51 -07:00
Ansh Nanda 3501fda015 allow changing pinned feed order on web 2023-05-16 23:38:34 -07:00
Jaz b2ef6bde00 Unstage open post in new tab changes, oops 2023-05-16 23:22:18 -07:00
Jaz f4327aff69 Fix mobile layout at least for mobile web 2023-05-16 23:11:29 -07:00
Jaz 85dfef87ab Use a three-state radio button for color mode 2023-05-16 23:06:08 -07:00
Jaz da0ed7e002 Feat: Use system default color mode, but allow user override 2023-05-16 21:36:43 -07:00
Ansh Nanda 99d66679b3 use uri instead of rkey to get feed data 2023-05-16 19:09:19 -07:00
Ansh Nanda 59c1b545fa fix routing on web 2023-05-16 19:04:47 -07:00
Ansh Nanda ff3cc3b84d fix dark mode styling 2023-05-16 18:39:02 -07:00
Ansh Nanda 53ca0cd626 drag to rearrange pinned items 2023-05-16 18:28:44 -07:00
Ansh Nanda 139027ac5f bad fix to the tab bar animation 2023-05-16 17:27:46 -07:00
Jacques Favreau 404b2f043c fix: Add vendor prefix for web blur. (#678) 2023-05-16 18:39:15 -05:00
Michi Hoffmann b7f081d6e4 Fix line break in New Post button (#657) 2023-05-16 18:38:06 -05:00
Ansh Nanda 532bc88ecc fix edge case when feed is liked only by one person 2023-05-16 16:31:35 -07:00
Ansh Nanda 5397447ca7 fix unliking 2023-05-16 16:30:14 -07:00
Ansh Nanda 1e54125f7f reload AlgoItem on focus via prop 2023-05-16 16:27:38 -07:00
Ansh Nanda 3f41d3db26 make sure state is being synced across components 2023-05-16 16:07:07 -07:00
Ansh Nanda f2e39d8ad2 allow for pinning saved feeds 2023-05-16 15:50:52 -07:00
Ollie H 5f66adc9a6 Replace image picker with expo-image-picker (#649)
* Replace image picker with expo-image-picker

* Fix cropper & picker on web

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-16 17:38:32 -05:00
Ansh Nanda dd788550be add heart icon to AlgoItem 2023-05-16 13:57:29 -07:00
Ansh Nanda 58e9c30abe link to user who created custom feed from preview 2023-05-16 13:56:59 -07:00
Ansh Nanda 25a9013380 add react-native-draggable-flatlist package 2023-05-16 13:41:14 -07:00
Ansh d5bec4ff37 Update build instructions (#639)
* Create .env.example

* Update build.md

* Update eas.json

* Update build.md

* Update build.md

* Update build.md

* Update docs/build.md

Co-authored-by: Caleb Jasik <calebjasik@jasik.xyz>

---------

Co-authored-by: Caleb Jasik <calebjasik@jasik.xyz>
2023-05-16 13:14:02 -05:00
LW 50c1841a06 feat: Update HTML title on web #626 #599 (#655)
For any `Screen` that shows on desktop, `title` is "(1) ... - Bluesky"
where "(1)" is the unread notification count.

The titles are unlocalized and the string "Bluesky" is hardcoded,
following the pattern of the rest of the app.

Display names and post content are loaded into the title as effects.

Tested:
* all screens
* screen changes / component mounts/unmounts
* long posts with links and images
* display name set/unset
* spamming myself with notifications, clearing notifications
* /profile/did:... links
* lint (only my changed files), jest, e2e.

New utilities: `useUnreadCountLabel`, `bskyTitle`,
`combinedDisplayName`, `useSetTitle`.

resolves: #626 #599
2023-05-16 13:13:05 -05:00
LW a5838694bd test: detox needs tapReturnKey after typeText (#663)
Without this, all `yarn e2e:run` tests get hung on the "input custom
service" step when logging in.

Only used one machine to repro, so an additional repro could be useful.
2023-05-16 12:48:54 -05:00
Markus Amalthea Magnuson 924e18e644 Remove surrounding spaces in parentheses. (#667) 2023-05-16 12:44:30 -05:00
Ansh Nanda 8071ae313d like/unlike improvements WIP 2023-05-15 22:39:47 -07:00
Ansh Nanda c4a666c221 new design for custom feed preview 2023-05-15 17:59:36 -07:00
Ollie H a891f4c326 Merge pull request #631 from aarongustafson/patch-1
Remove max scale from viewport config `meta`
2023-05-15 17:07:44 -07:00
Aaron Gustafson 255bba5fb8 Remove max scale from viewport config meta
Maximum scale creates accessibility issues for folks who need to zoom in
2023-05-15 15:44:10 -07:00
Ollie H e2055dfb78 Image editor mobile layout update (#613)
* Image editor mobile layout update

* Minor viewport fix
2023-05-15 16:54:14 -05:00
Tierney Cyren aa786068cf Create LICENSE file and point to it from README.md (#623)
* Create LICENSE

adds a LICENSE file that can be picked up by first- and third-party tooling

* Update README.md to point to LICENSE file
2023-05-15 16:02:41 -05:00
Paul Frazee 952af3473a Prepare for open-sourcing (#619)
* Add issue templates

* Update readme and docs for contributors

* Tune up the README.md

* Tune language a bit

* Tune copy
2023-05-15 15:45:52 -05:00
Paul Frazee 5e8e0ad680 Update the default suggested users list to match recent activity 2023-05-15 15:27:58 -05:00
Ollie H 628d877325 Use dropdown for web reposting and quote posting (#607)
* Use dropdown for web reposting and quote posting

* Remove collateral damage

* Tune the repost dropdown positioning

* Move postctrls into their own folder

* Factor out repost button into native/web build

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-15 15:18:39 -05:00
Ansh Nanda 6249bb16ca remove tab bar underline animation 2023-05-15 12:31:27 -07:00
bnewbold 0a0afdf2c2 reporting: anti-social option; alert emoji around urgent option (#617)
* reporting: new anti-social post report option

* reporting: alarm emoji on urgent report option

* reporting: appease 'make lint'

I originally had text on a separate line, but that failed, so I put
text+tags on a line and thought that worked, but failed again? Seems
inconsistent, but trying again.

* Remove emojis and increase report post height

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-15 14:25:50 -05:00
Ollie H 824a2313b1 Style cleaning and initial text size audit (#618)
* Style cleaning and initial text size audit

* Put file back
2023-05-15 13:14:45 -05:00
Ollie H 841ad692d3 Make autocomplete pressable (#620) 2023-05-15 13:12:38 -05:00
Ansh Nanda d7e39bde12 saved feeds in tab bar 2023-05-15 11:00:54 -07:00
Ansh Nanda 5010861160 custom feed screen 2023-05-15 10:42:23 -07:00
Ansh Nanda 61ea37ff81 renamed page to savedfeeds 2023-05-14 18:37:18 -07:00
Ansh Nanda 6105314f15 add empty view to CustomAlgorithms screen 2023-05-14 15:38:38 -07:00
Ansh Nanda 8948118d5c view all saved algos in settings 2023-05-13 12:25:06 -07:00
Ansh Nanda 047024a5ac create algo-item model and redefine data models 2023-05-13 11:59:08 -07:00
Ansh Nanda c24389df87 custom feed embed 2023-05-12 19:46:50 -07:00
Ansh Nanda 760b5309e0 show algos by user on profile 2023-05-12 19:32:39 -07:00
Ansh Nanda fa4af20764 remove unncessary code from actorFeedModel 2023-05-12 17:22:53 -07:00
Ansh Nanda 06ce42158e actor feeds model 2023-05-12 17:21:17 -07:00
Ansh Nanda be6d48a57e bookmarked feeds model 2023-05-12 17:21:11 -07:00
Ansh Nanda 370d52bd1f add custom algorithm screen to settings under moderation 2023-05-12 14:40:58 -07:00
Ansh Nanda 678f75b495 add window dimensions to global styles 2023-05-12 13:51:07 -07:00
Paul Frazee 5f074a21c9 Tune hand icon 2023-05-12 10:21:09 -05:00
Paul Frazee 0a7bb43644 Replace the moderation hand icon with a better icon 2023-05-12 10:10:29 -05:00
Paul Frazee 60cfdb197c Bump version numbers 2023-05-11 18:14:32 -05:00
Paul Frazee 6a37043801 Tests fix 2023-05-11 18:13:50 -05:00
Paul Frazee 75007d8fae [APP-643] Account preferences server sync (#615)
* Bump deps

* Bump deps

* Add server sync of content preferences and an adult content toggle
2023-05-11 17:52:38 -05:00
Ollie H c2a8713ff4 a11y cleanup for mute lists (#614) 2023-05-11 16:30:27 -05:00
Paul Frazee ebcd633386 [APP-635] Mutelists (#601)
* Add lists and profilelist screens

* Implement lists screen and lists-list in profiles

* Add empty states to the lists screen

* Switch (mostly) from blocklists to mutelists

* Rework: create a new moderation screen and move everything related under it

* Fix moderation screen on desktop web

* Tune the empty state code

* Change content moderation modal to content filtering

* Add CreateMuteList modal

* Implement mutelist creation

* Add lists listings

* Add the ability to create new mutelists

* Add 'add to list' tool

* Satisfy the hashtag hyphen haters

* Add update/delete/subscribe/unsubscribe to lists

* Show which list caused a mute

* Add list un/subscribe

* Add the mute override when viewing a profile's posts

* Update to latest backend

* Add simulation tests and tune some behaviors

* Fix lint

* Bump deps

* Fix list refresh after creation

* Mute list subscriptions -> Mute lists
2023-05-11 16:08:21 -05:00
bnewbold 34d8fa5991 top-level Makefile (#597)
* top-level Makefile

The primary motivation here is the `build-web` command, which calls the
yarn build and then also copies over JS files. The Dockerfile does this
and I always forget when doing it manually.

* build-web: cp bundles in yarn command, not Makefile+Dockerfile
2023-05-11 13:22:56 -07:00
bnewbold d624b7cf58 bskyweb: iterate on HTML card metadata (#609)
Probably still not perfect, but better.

- don't user avatar image. use banner for profile and post img, or
  nothing
- most twitter metadata fields were redundant; twitter will parse out
  opengraph ("og:"), so don't duplicate those
- add regular HTML description (for google, etc)
- include URI
- actually include text
2023-05-11 10:41:47 -05:00
Ollie H 19d6ded631 Prevent reply to from cascading (#610) 2023-05-11 10:38:54 -05:00
Ollie H 0192923ef3 Only allow one close draft confirmation at a time (#611)
* Only allow one close draft confirmation at a time

* lint
2023-05-11 10:38:10 -05:00
bnewbold c2fb4d4b4b small label updates (#612)
* labels: fix 'consentual' typo

This label has never been applied, so safe to just change it.

* labels: new 'nsfl' label, under both porn and gore categories

* labels: new account-security label (always warn)

* labling: re-word spam subtitle
2023-05-11 10:37:26 -05:00
Ollie H b0ebb6c9d1 Update web image editor (#588)
* Update web image editor

* Delete type-assertions.ts

* Re-add getKeys

* Uncomment rotation code

* Revert "Uncomment rotation code"

This reverts commit 6269f3b928.

* Shuffle dependencies and update mobile resolution

* Update ImageEditor modal layout for mobile

* Avoid accidental closes of the EditImage modal

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-09 14:55:44 -05:00
Ollie H 8f6b5d3df9 Add avatar to mobile autocomplete and create grapheme hook (#602)
* Add avatar to mobile autocomplete and create grapheme hook

* Remove comment, update filename, cut out redundant logic
2023-05-09 12:13:23 -05:00
bnewbold 9a91b0c538 bskyweb: middleware to remove trailing / (#598) 2023-05-09 12:03:42 -05:00
Ollie H bf3ea67442 Add time to app password and fix related text wrapping (#604) 2023-05-09 12:02:55 -05:00
Ansh 28f7ff76a4 add target="_blank" prop to LinkText for safari (#606) 2023-05-09 12:01:42 -05:00
Ollie H cfdfd8f395 Add text wrapping to profile header (#603) 2023-05-09 12:00:54 -05:00
Paul Frazee d0990e9b49 Bump ios build number 2023-05-09 00:45:33 -05:00
Paul Frazee b756a27958 [APP-639] Improve nsfw handling & force hidden on iOS (#605)
* Identify adult content labels and handle them more specifically

* Change adult content defaults to more conservative settings

* Add an adultcontentenabled override that prohibits access on iOS

* Improve usability of the content hider

* Fix lint
2023-05-09 00:43:20 -05:00
Paul Frazee 7a176b3fdf [APP-615] COPPA-compliant signup (#570)
* Rework account creation to be COPPA compliant

* Fix lint

* Switch android datepicker to use the spinner mode

* Fix type signatures & usages
2023-05-08 17:25:57 -05:00
Ollie H cdfb1c7abf Visual improvements to web autocomplete (#591)
* Visual improvements to web autocomplete

* Remove stray styling
2023-05-08 16:09:15 -05:00
Ollie H 84046f42d5 Format count and fix type warning (#600) 2023-05-08 16:02:19 -05:00
Ansh 6124e52836 add theme to SafeAreaView and preventAutoHide SplashScreen (#592) 2023-05-08 15:05:36 -05:00
bnewbold 249d166811 bskyweb: re-work HTML meta tags, for share cards (#596) 2023-05-08 15:03:03 -05:00
bnewbold 6d9e23b1be bskyweb: update robots.txt (#595)
This is to make crawling more explicitly allowed, communicating
expectations.

If we ever end up with "expensive" routes on this service, will want to
add Crawl-Delay.
2023-05-07 12:19:56 -07:00
Ollie H 0c604ff1c2 Merge pull request #593 from bluesky-social/ollie/fix-hardbreak
Fix hardbreak formatting
2023-05-05 16:53:12 -07:00
renahlee 2f61fc31fd Fix hardbreak formatting 2023-05-05 16:36:48 -07:00
Paul Frazee b3b1fa1707 1.28 2023-05-05 00:55:33 -05:00
Paul Frazee ce89b2fae1 Add account information to the top of settings (#583) 2023-05-05 00:41:31 -05:00
Ansh 646eddad5a make haptic feedback weaker on android (#584) 2023-05-05 00:41:08 -05:00
Ansh 99ecb17739 useLegacyImplementation in Android (#585) 2023-05-05 00:40:16 -05:00
Ansh f28405f928 sanitize app passwords name (#589) 2023-05-05 00:27:05 -05:00
Ollie H 8d78e8581c Move href back to link (#590)
* Move href back to link

* Fix cmd/ctrl click on left nav

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-05 00:25:52 -05:00
Ansh d3e8bd3e9a [APP-547] Universal links & deeplinking (#555)
* added ios scheme and intentFilters for deep linking

* added intentFilters for android deep linking

* add .env files to .gitignore

* add autoVerify for android deep links
2023-05-04 16:18:27 -05:00
bnewbold c8af784328 Updates indigo golang packages post-lex-refactor (!), which fixes XRPC calls (#582)
* bskyweb: update modules

* bskyweb: fix XRPC string type

* gitignore: yarn web build output in bskyweb
2023-05-04 13:56:17 -05:00
Paul Frazee 7a008c987c 1.27 2023-05-04 01:21:08 -05:00
Paul Frazee 49f9df6355 [APP-633] Improve some behaviors around desktop leftnav (#581)
* Make leftnav elements act as anchor tags (bonus feature in this pr)

* Add screen reset behavior to the desktop left nav

* Move the leftnav link into the text
2023-05-04 01:20:23 -05:00
Paul Frazee 2749b8e371 Rework alt image modal to be fullscreen due to android bugs with the bottomsheet and keyboard (#577) 2023-05-04 00:55:57 -05:00
Paul Frazee ab3074fdee Add the !filter and !warn imperative labels (#580) 2023-05-04 00:55:33 -05:00
Ollie H 33bf9c3869 Remove focus outline on composer (#572) 2023-05-04 00:54:59 -05:00
Paul Frazee d97e75c62f [APP-539] Rework lightbox and alt-image behaviors (#573)
* Replace the long press on the lightbox with footer controls

* Remove long-press from images in the feed

* Tune the lightbox footer control ui

* Replace the AltImageRead modal with the ability to view all alt text in the lightbox footer

* Tune lightbox footer for iOS

* Add alt text to the web lightbox

* Fix lint

* a11y slight changes

---------

Co-authored-by: renahlee <renahlee@outlook.com>
2023-05-04 00:54:35 -05:00
Ollie H 4ef853ef6c Remove text underline from lists (#574) 2023-05-04 00:54:22 -05:00
Ollie H 011baa78c1 a11y label cleanup (#576) 2023-05-04 00:53:49 -05:00
Paul Frazee 0f68e6a6ff Add mock data to test unknown labels (#578) 2023-05-04 00:24:14 -05:00
Paul Frazee 7f88845c9b Add icon-intolerant and behavior-intolerant to the political hategroup category (#579) 2023-05-04 00:22:54 -05:00
Ollie H e2d2bbb0d5 Merge pull request #575 from bluesky-social/ollie/README
Update README with Go instructions
2023-05-03 20:47:04 -07:00
Ollie H aed54822a3 Update README.md 2023-05-03 20:39:49 -07:00
renahlee 13586ec6ef Update README with Go instructions 2023-05-03 20:20:52 -07:00
Paul Frazee 906b906eb1 Remove the attempts to make the language filter more lenient (#569) 2023-05-03 11:49:46 -05:00
Jake Gold 204c6729e7 add required security HTTP headers (#568) 2023-05-03 07:14:29 -07:00
Paul Frazee 14e9719bcc Increment android versioncode 2023-05-03 00:45:19 -05:00
Paul Frazee feff19f705 1.26 2023-05-02 23:56:01 -05:00
Paul Frazee 12a2144232 Remove some confusing horizontal lines in threads (#566) 2023-05-02 23:32:29 -05:00
Paul Frazee 883700e090 [APP-601] Add muted accounts list (#565)
* Add muted accounts list

* Fix icon for muted accounts
2023-05-02 23:32:16 -05:00
Paul Frazee 2eb0d8c095 [APP-611] Add nice date to expanded post view (#567)
* Add nice date to expanded post view

* Fix styles
2023-05-02 23:29:16 -05:00
Paul Frazee 6f1c4ec9a9 [APP-549] Language controls for Whats Hot (#563)
* Add a content-language preference control

* Update whats hot to only show the selected languages and to refresh on lang pref changes

* Fix lint

* Fix tests

* Add missing accessibility role
2023-05-02 23:06:55 -05:00
Ollie H 95f8360d19 Add keyboard shortcuts: new, escape, and hard break (#552)
* Add keyboard shortcuts: new, escape, and hard break

* Add preferences modal

* Remove code accidentally re-added due to rebase

* Fix incorrect copy and lint

* Put stuff back so diffs are clearer

* Re-add invite codes to settings

* Address comments

* Tune the copy

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-02 23:00:18 -05:00
Paul Frazee af905947bc Fix confirm profile sizing for blocks (#564) 2023-05-02 22:52:58 -05:00
Paul Frazee 8c675248d4 Fix replies with <2 likes showing in the following feed 2023-05-02 21:51:25 -05:00
Paul Frazee d225e857b5 [APP-610] Make the language filter more lenient (#562)
* Tune the language filter to accept posts when a determination cant be made

* use j instead of i since i has been declared in upper scope

* use j instead of i since i has been declared in upper scope

* Pass the j man

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
2023-05-02 20:03:01 -05:00
Paul Frazee ddb8ebb412 Fix image sharing on iOS (#561) 2023-05-02 20:00:22 -05:00
Ollie H bd80db619b Pre-web image changes refactor (#560)
* Pre-web image changes refactor

* Remove unneeded async behavior
2023-05-02 16:27:00 -05:00
Ollie H 74fbb47979 Strip whitespaces from tokens (#558) 2023-05-01 23:29:13 -05:00
Ollie H 83959c595d React Native accessibility (#539)
* React Native accessibility

* First round of changes

* Latest update

* Checkpoint

* Wrap up

* Lint

* Remove unhelpful image hints

* Fix navigation

* Fix rebase and lint

* Mitigate an known issue with the password entry in login

* Fix composer dismiss

* Remove focus on input elements for web

* Remove i and npm

* pls work

* Remove stray declaration

* Regenerate yarn.lock

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-01 20:38:47 -05:00
Ansh c75c888de2 [APP-527] setup sentry (#532)
* setup sentry

* add sentry to transformIgnorePatterns to fix jest issues

* update README with sourcemap instructions

* only enable integrations on native

* fix sentry web

* remove testing code

* fix sentry authToken

* Switch over to paul's auth tokens temporarily (lol)

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-01 14:42:31 -05:00
Ollie H dbb3c5c155 Image alt text view modal (#551)
* Image alt text view modal

* Minor style tweaks

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-05-01 13:59:17 -05:00
Ollie H 0ec98c77ef Format large numbers (#556) 2023-05-01 13:31:00 -05:00
Paul Frazee 7171d0404e App store fixes (permission descriptions) (#557)
* Fix permission usage descriptions on iOS

* Bump ios build number
2023-05-01 13:13:58 -05:00
Paul Frazee 9b50c3ddbb 1.25 2023-04-28 20:03:55 -05:00
Paul Frazee a95c03e280 Implement blocks (#554)
* Quick fix to prompt

* Add blocked accounts screen

* Add blocking tools to profile

* Blur avis/banners of blocked users

* Factor blocking state into moderation dsl

* Filter post slices from the feed if any are hidden

* Handle various block UIs

* Filter in the client on blockedBy

* Implement block list

* Fix some copy

* Bump deps

* Fix lint
2023-04-28 20:03:13 -05:00
Ollie Hsieh e68aa75429 Merge pull request #553 from bluesky-social/ollie/APP-581
Up Android snap point
2023-04-28 17:20:33 -07:00
renahlee b754ed0e5a Up Android snap point 2023-04-28 17:12:17 -07:00
Paul Frazee 173e06f866 Fix to embed labels lookup (#550)
* Fix to embed labels lookup

* Fix lint

* Fix lint
2023-04-27 15:01:38 -05:00
Paul Frazee 301c2e5beb Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-04-27 13:15:04 -05:00
Paul Frazee da06b608f2 1.23.0 build 2 2023-04-27 13:14:54 -05:00
Paul Frazee 1d50ddb378 Refactor moderation to apply to accounts, profiles, and posts correctly (#548)
* Add ScreenHider component

* Add blur attribute to UserAvatar and UserBanner

* Remove dead suggested posts component and model

* Bump @atproto/api@0.2.10

* Rework moderation tooling to give a more precise DSL

* Add label mocks

* Apply finer grained moderation controls

* Refactor ProfileCard to just take the profile object

* Apply moderation to user listings and banner

* Apply moderation to notifications

* Fix lint

* Tune avatar & banner blur settings per platform

* 1.24
2023-04-27 12:38:23 -05:00
Ollie Hsieh 51be8474db Update invite code copy (#549) 2023-04-27 12:31:03 -05:00
Ollie Hsieh 7a2c21026d Load previous state in alt text modal (#546) 2023-04-27 09:51:47 -05:00
Ollie Hsieh c8e51a7d48 Fix Android sharing (#545) 2023-04-27 09:38:28 -05:00
Ollie Hsieh 62b07f93fd Support Ctrl + Enter for non-Mac (#544) 2023-04-27 09:31:14 -05:00
Ollie Hsieh 996dba7595 Close lightbox on web with escape key (#543)
* Close lightbox on web with escape key

* Lint
2023-04-27 09:30:47 -05:00
Ollie Hsieh afd87a6390 Add undo to web composer (#542) 2023-04-27 09:27:33 -05:00
Paul Frazee a81158bd2a Tune some copy 2023-04-26 09:33:56 -05:00
Paul Frazee 8d8b3f53a0 1.23 2023-04-25 21:26:33 -05:00
Paul Frazee c8541a7243 Fix e2e 2023-04-25 21:25:49 -05:00
Paul Frazee fc19ffba38 Update report modal to use new groupings (close [APP-567]) (#533) 2023-04-25 21:04:50 -05:00
Paul Frazee 9b86cb5c36 Fix: dont request more than 25 posts at a time (close [APP-561]) (#534) 2023-04-25 20:47:37 -05:00
Paul Frazee f33a355a1a [APP-562] Persist 'copied' state of invite codes (#535)
* Persist 'copied' state of invite codes (close APP-562)

* Dont show copied message if invite used
2023-04-25 20:47:07 -05:00
Paul Frazee e1fd50d014 Add web network failure error detection (close APP-83) (#537) 2023-04-25 20:46:47 -05:00
Ansh e99c324f14 add pal.text to onboarding screens (#538) 2023-04-25 20:46:34 -05:00
Paul Frazee ae895155fd Fix to error screen and postthread loading state (#540)
* Fix loading state on postthread

* Improve error screen rendering

* Dark mode exclamation in error screen

* Fix lint
2023-04-25 20:45:59 -05:00
Ollie Hsieh 8f3915e0a5 Merge pull request #541 from bluesky-social/ansh/app-569-make-sure-android-is-not-allowing-more
[APP-569] Only allow selecting 4 pics max
2023-04-25 14:52:53 -07:00
Ansh Nanda fa612fade6 only allow selecting 4 images max 2023-04-25 14:45:41 -07:00
Ansh c8a7f27d43 Merge pull request #536 from bluesky-social/ansh/app-558-share-profile-and-post-broken-on-android
[APP-558] Sharing refactor
2023-04-25 14:04:56 -07:00
Ansh Nanda d0d24ea248 consolidated share code to shareUrl 2023-04-25 13:45:46 -07:00
Ansh 01410ad4bf create Alert.tsx and Alert.web.tsx and replace uses (#513) 2023-04-25 14:01:47 -05:00
Ansh Nanda 3463f601a3 add dev menu opening instructions by platform 2023-04-25 11:59:11 -07:00
Ollie Hsieh b00365c196 Prevent keyboard from blocking alt image modal (#531)
* Prevent keyboard from blocking alt image modal

* Tune padding of altimage modal on desktop web

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-25 13:34:06 -05:00
Paul Frazee 3ef7504f91 1.22 2023-04-24 20:08:37 -05:00
Paul Frazee 26cef73b5c If adding the user's post when empty, just refresh (#530) 2023-04-24 20:07:58 -05:00
Paul Frazee f4da2f4442 Tune feed loading behavior (#528)
* Never autoload home feed on focus

* On web, just check for new notifications on focus

* Switching tab in the home feed now checks for latest
2023-04-24 19:41:27 -05:00
Paul Frazee 7a10762716 Rework how recently-created posts are added to the feed (repeat posts issue) (#527)
* Rework new-post behavior to just add the user's created post to the top

* Only add post to top when not a reply

* Fix: run update in action
2023-04-24 19:41:16 -05:00
Paul Frazee df1791bde2 Update hardcoded suggested actors (#524)
* Update the hardcoded suggested follows

* Update the suggested actors to just use hardcoded list since there's now the foaf system
2023-04-24 18:49:11 -05:00
Ansh c5222db38b memoize things, clean code, and replace deprecated resizeMode with contentFit (#526) 2023-04-24 18:45:02 -05:00
Paul Frazee 1b356556c9 Performance fixes with new getPosts (#525)
* Update notifications to fetch in a batch using getPosts

* Improve search perf with getPosts

* Bump @atproto/api@0.2.9

* Just use post uri for key
2023-04-24 17:02:58 -05:00
Paul Frazee da8af38dcc Android & visual fixes: color themes, repost icon, navigation, back handler, etc (#519)
* Switch android to use slide left/right animations on navigation

* Bump the repost icon down by a pixel

* Tune theme colors for contrast and darker bg on darkmode

* Move back handler to a point in the init flow that leads to more consistent capture of events

* Fix image share flow on android

* Fix lint

* Add todo about sharing not available

* Drop the android slide animation because it's too slow

* Fix 'flashes of white' in dark mode android
2023-04-24 16:36:05 -05:00
Ollie Hsieh 9d8600c213 Merge pull request #522 from bluesky-social/ollie/staging-link
Update client staging URL
2023-04-24 11:06:05 -07:00
renahlee 57c87ba7cf Update client staging URL 2023-04-24 10:55:35 -07:00
Ollie Hsieh df8059bf9a Increase alt text limit to 1000 (#521) 2023-04-24 12:44:42 -05:00
Paul Frazee 36eca53b87 1.21 2023-04-22 19:29:54 -05:00
Paul Frazee c7600fe0c2 Web fixes (#517)
* Fix scroll behaviors on web

* Remove headers on web to avoid scroll overflow

* Fix follow button press in cards
2023-04-22 19:08:41 -05:00
Paul Frazee 5085861b9a Feed fixes: repeat posts & nonreplies showing up in the wrong place (#516)
* Fix the repeat posts issue on the home feed

* Fix: replies no longer show up in the no-replies feed
2023-04-22 18:35:12 -05:00
Paul Frazee d35f7c1f1a Android fixes (#515)
* Fix profile screen performance on android and remove dead code

* Correctly handle android hardware back btn

* Fix EditProfile modal for android

* Fix lint
2023-04-22 17:14:20 -05:00
Ollie Hsieh eb6b36be61 Merge pull request #514 from bluesky-social/ollie/ap-dark-mode
Fix App Passwords iOS dark mode modal
2023-04-22 06:22:08 -07:00
renahlee 7d43e25933 Fix App Passwords iOS dark mode modal 2023-04-21 22:15:59 -07:00
Paul Frazee 2b96279103 Fix link opening (#512) 2023-04-21 20:28:19 -05:00
Paul Frazee af2fd3cf29 More hotfixes to app passwords (#511)
* Fix app passwords modal on web

* Fix delete app password on web
2023-04-21 19:58:42 -05:00
Paul Frazee 16124b5081 1.20.0 2023-04-21 19:41:59 -05:00
Paul Frazee bbc2ab334d Hotfix feed sizing (#510)
* Fix home feed sizing on web

* Bump api@0.2.8
2023-04-21 19:34:07 -05:00
Ansh 38eb299011 [APP-522] Create & revoke App Passwords within settings (#505)
* create and delete app passwords

* add randomly generated name

* Tweak copy and layout of app passwords

* Improve app passwords on desktop web

* Rearrange settings

* Change app-passwords route and add to backend

* Fix link

* Fix some more desktop web

* Remove log

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-21 18:55:29 -05:00
Ollie Hsieh aa56f4a5e2 Move border positioning to FlatList and ScrollView (#509)
* Move border positioning to FlatList and ScrollView

* Fix mobile web tab bar border
2023-04-21 16:40:41 -05:00
Ollie Hsieh f0706dbe9f Add alt text support and rework image layout (#503)
* Add alt text support and rework image layout

* Add additional BottomSheet implementation to account for nested Composer modal

* Use mobile gallery layout on mobile web

* Missing key

* Fix lint

* Move altimage modal into the standard modal system

* Fix overflow wrapping of images

* Fixes to the alt-image modal

* Remove unnecessary switch

* Restore old imagelayoutgrid code

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-21 16:20:06 -05:00
Paul Frazee 0f5735b616 Fix profile link 404s on session change & handle change [APP 523] (#507)
* Use DID to link to the user profile to gracefully handle... handle changes

* Reset nav state on active profile change
2023-04-21 12:21:38 -05:00
Paul Frazee 9f9bd314b3 1.19 2023-04-20 17:43:01 -05:00
Paul Frazee e02c926c8a Improvements to notifications screen [APP-520] (#501)
* Refresh or sync notifications when the tab is navigated to

* Fix to bad textnode render

* Speed up initial session load

* Fix lint

* Restore updateSessionState() on session resumption
2023-04-20 17:36:25 -05:00
Paul Frazee f2fe4abdce Fix positioning of the load more button (#502) 2023-04-20 17:34:45 -05:00
Paul Frazee 22884b53ad Thread muting [APP-29] (#500)
* Implement thread muting

* Apply filtering on background fetched notifs

* Implement thread-muting tests
2023-04-20 17:16:56 -05:00
Ollie Hsieh 3e78c71018 Share profile and post (#499) 2023-04-20 13:08:30 -05:00
Ansh 74a1910e12 [APP-514] Fix weird scrollbar position on profile screen (#497)
* add scrollIndicatorInset to ViewSelector FlatList

* Update ViewSelector.tsx

* Update ViewSelector.tsx
2023-04-20 12:32:49 -05:00
Paul Frazee 04e0ebe8fc Feed and notifs improvements (#498)
* Reduce frequency of the notifications sync

* Reduce frequency of home feed polling

* Ensure loading spinner is visible in notifications

* Render notifications loading spinner in the flatlist

* Fixes and performance improvements to notifications

* Render 30+ on notifications if at max

* Fix issue with repeating posts in home feed

* Dont check for unread notifs if we're already at max
2023-04-19 20:11:10 -05:00
Ollie Hsieh b24ba3adc9 Add cursor to clickable elements (#491)
* Add cursor to clickable elements

* Add cursor to clickable elements

* Update per comments

* Fix word wrap in notifications

* Center the web login-load screen

* Add hover states on web

* Fix lint

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-19 20:05:10 -05:00
Ansh 1472bd4f17 #420: add updateDataOptimistically utility to disallow like counter out of sync (#446)
* add isLikedPressed flag to disallow like counter out of sync

* create revertible helper for updateDataOptimistically

* test implementation

* Update updateDataOptimistically() and apply to reposts

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-19 15:58:24 -05:00
Paul Frazee be83d2933c 1.18 2023-04-19 14:28:49 -05:00
Paul Frazee b40287e4be [APP 513] Label tuning (#496)
* Label updates: break out sexual into 3 categories; tune defaults; improve descriptions

* Fix misapplication of warning in notifications
2023-04-19 14:27:54 -05:00
Ollie Hsieh 3cc0fb1d67 Merge pull request #494 from bluesky-social/ollie/APP-91
[APP-91] Support CMD + Enter to publish post
2023-04-19 12:27:43 -07:00
renahlee 31df05825c Support CMD + Enter to publish post 2023-04-19 11:58:04 -07:00
Paul Frazee 8917cf77a0 Fix: consistently give suggestions in search (#493) 2023-04-19 12:43:34 -05:00
Paul Frazee 192f842ebd Update android version code 2023-04-18 19:00:46 -05:00
Paul Frazee 3e29121f32 1.17 2023-04-18 18:32:47 -05:00
Paul Frazee 75fd653be3 Rework search suggestions for performance (#492) 2023-04-18 18:29:54 -05:00
Paul Frazee 1ab8f31517 Fix user avatar and banner selector on web (#490) 2023-04-18 15:27:42 -05:00
Ansh c8157d6d38 Update README.md (#487)
Update README with new build instructions since we are no longer using the ios and android folders. So, ideally, devs will never need to open XCode and Android Studio (thank the gods)
2023-04-18 13:06:38 -05:00
Ansh 737235f5e0 add edges to ImageViewing component (#471) 2023-04-18 13:06:09 -05:00
Ollie Hsieh c2a4ffc99f Quote post legibility (#486) 2023-04-18 12:53:47 -05:00
Ansh 10621e86e4 APP-70 give profile its own tab mobile (#469)
* add prebuild command to package.json

* add ProfileTab navigator and screen

* add prop to remove back button from profile

* fix MyProfileTabNavigatorParams type

* fix dep array for rendering ProfileHeader

* just added ts-ignore

* enable opening drawer in profile tab

* clean up useNavigationTabState

* clean up code

* fix hideBackButton code flow
2023-04-18 11:19:37 -05:00
Ollie Hsieh 2509290fdd Split image cropping into secondary step (#473)
* Split image cropping into secondary step

* Use ImageModel and GalleryModel

* Add fix for pasting image URLs

* Move models to state folder

* Fix things that broke after rebase

* Latest -- has image display bug

* Remove contentFit

* Fix iOS display in gallery

* Tuneup the api signatures and implement compress/resize on web

* Fix await

* Lint fix and remove unused function

* Fix android image pathing

* Fix external embed x button on android

* Remove min-height from composer (no longer useful and was mispositioning the composer on android)

* Fix e2e picker

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-17 15:41:44 -07:00
Paul Frazee 91fadadb58 Fix web home feed sizing and related issues (close #432) (#475)
* Fix web home feed sizing (close #432)

* Fix lint

* Fix positioning of profile not found error

* Fix load latest on mobile

* Fix overflow issues on mobile web (visible in postthread)

* Fix bottom pad on mobile web

* Remove old comment
2023-04-15 10:15:30 -07:00
Paul Frazee a79dcd3d38 Fix: sanitize URLs before placing them on the page (#488) 2023-04-15 09:24:03 -07:00
Paul Frazee a6634ec45d Update bskyweb html styles 2023-04-13 16:36:08 -07:00
Paul Frazee f917c426a0 Web darkmode fixes (#474)
* Change dark mode borders to be slightly lighter than the bg rather than slightly darker

* Add dark mode styling to web composer

* Fix editprofile darkmode
2023-04-13 16:10:27 -07:00
Paul Frazee 5caa6a5e08 Update the bskyweb routes (#468) 2023-04-13 10:12:35 -07:00
Paul Frazee 8aabc70fa9 Update config 2023-04-12 20:49:36 -07:00
Paul Frazee d70182a996 Bump deps 2023-04-12 20:29:33 -07:00
Ansh Nanda c88903dad4 fix composer SafeAreaView 2023-04-12 20:28:01 -07:00
Paul Frazee 0d22767609 1.16 2023-04-12 18:59:35 -07:00
Ansh f2f73e414a temporary android fix for image picker issue (#466) 2023-04-12 18:50:49 -07:00
Ansh ec0510d1d9 add scrollIndicatorInset right: 1 to fix (#464) 2023-04-12 18:50:04 -07:00
Ansh f50f07f562 #435 web dark mode (#455)
* add ThemeProvider to App.web.tsx

* make FlatNavigator use themed color

* fix extra padding on top in web

* add observer to App.web.tsx to make it react to theme changes

* fix TS for useColorSchemeStyle

* add dark mode toggle button to web LeftNav

* fix index.web.tsx border colors for web

* Move the darkmode desktop web toggle to the right nav column

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-12 18:49:40 -07:00
Ansh 05e4e4ff93 add maxHeight of 100vh to web modal to stop overflow (#463) 2023-04-12 18:28:45 -07:00
John Fawcett f6769b283f Mobile Web (#427)
* WIP

* WIP

* Fix header offset on web

* Remove debug

* Fix web mobile feed and FAB layout

* Fix modals on mobile web

* Remove dead code

* Remove ios config that shouldnt be committed now

* Move bottom bar into its own folder

* Fix web drawer navigation and state behaviors

* Remove dark mode toggle from web drawer for now

* Fix search on mobile web

* Fix the logged out splash screen on mobile web

* Fixes to detox simulator

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-12 18:27:55 -07:00
Paul Frazee 2fed6c4021 Add first round of labeling tools (#467)
* Rework notifications to sync locally in full and give users better control

* Fix positioning of load more btn on web

* Improve behavior of load more notifications btn

* Fix to post rendering

* Fix notification fetch abort condition

* Add start of post-hiding by labels

* Create a standard postcontainer and improve show/hide UI on posts

* Add content hiding to expanded post form

* Improve label rendering to give more context to users when appropriate

* Fix rendering bug

* Add user/profile labeling

* Implement content filtering preferences

* Filter notifications by content prefs

* Update test-pds config

* Bump deps
2023-04-12 18:26:38 -07:00
Ansh a20d034ba5 Expo Updates (#426)
* install expo-updates

* configure expo-updates
2023-04-11 12:14:28 -07:00
Ansh 76132ca4dc make unfollow button light colored button (#429) 2023-04-11 12:13:38 -07:00
Paul Frazee a683c9e15f replace react-native-fast-image with expo-image (#452) 2023-04-11 12:12:34 -07:00
Ansh 14c8473210 [DRAFT] Android (#424)
* add android & ios folders to .gitignore

* delete android and ios dirs

* fix android build errors

* fix status bar color

* fix top cutoff on composer in android

* fix weird whitespace issue in post

* fix greyed out header android

* fix main feed getting cut off android

* fix swiping on main feed

* fix profile tabs switching on android

* A few app.json config items for iOS

* Update app.json for bgfetch

* make swiping work on android

* make splash screen cover

* add eas.json

* fix image container on android

* fix android status bar color

* use expo-splash-screen instead of react-native-splash-screen

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-09 18:02:44 -07:00
Paul Frazee 362ea7240d 1.15 2023-04-07 12:39:45 -05:00
Paul Frazee 0c9935f125 Filter out bad mentions instead of erroring during post (close #391) (#422) 2023-04-07 11:51:20 -05:00
Paul Frazee 0407e93ef8 Fix load spinner positioning (close #415) (#421) 2023-04-07 11:46:26 -05:00
Paul Frazee e27cd0098f Fix: correctly track when profile state was last updated 2023-04-07 11:10:03 -05:00
Paul Frazee ab11f206d8 Stripe checkmark emojis from display names (close #396) (#419) 2023-04-07 11:09:25 -05:00
Paul Frazee 4b98992257 Update AtUri import to use official package with fix for usernames that start with numbers (close #414) (#418) 2023-04-07 10:30:58 -05:00
Paul Frazee b84533090d Small fix: run in action 2023-04-07 08:59:32 -05:00
Paul Frazee 15478a8f0c 1.14 2023-04-06 23:38:16 -05:00
Paul Frazee 2f519bd66e Add tos, community guidelines, and copyright policy (#410)
* Add tos, community guidelines, and copyright policy

* Fix lint
2023-04-06 22:53:58 -05:00
Paul Frazee a74919ef33 Readd the ios universal links config (close #371) (#408) 2023-04-06 19:54:00 -05:00
Paul Frazee 7c99df33ad Fix to post overflow on web (close #395) (#407) 2023-04-06 17:12:48 -05:00
Paul Frazee 1fa9402453 Fix darkmode placeholder text in composer (#406)
* Remove old comment

* Fix darkmode placeholder text in composer (close #401)
2023-04-06 16:48:05 -05:00
Paul Frazee b7648cfe73 Fix repost rendering (#405) 2023-04-06 16:28:45 -05:00
Paul Frazee 4f886f712c Fix web sidebar listing of invite codes 2023-04-05 20:43:11 -05:00
Paul Frazee ea04c2bd33 Add user invite codes (#393)
* Add mobile UIs for invite codes

* Update invite code UIs for web

* Finish implementing invite code behaviors (including notifications of invited users)

* Bump deps

* Update web right nav to use real data; also fix lint
2023-04-05 18:56:02 -05:00
Paul Frazee 8e28d3c6be Analytics fixes (closes #386) (#387)
* Only send analytics events when the user is logged in

* Only send analytics events when the user is logged in (web)

* Add analytics identify() call
2023-04-05 11:15:22 -05:00
bnewbold 92b80ff048 bskyweb: bump indigo version (#383) 2023-04-05 10:17:46 -05:00
Paul Frazee f717ff6719 Add analytics to the web build (close #233) (#385)
* Add analytics to the web build (close #233)

* Use bsky endpoint for analytics
2023-04-04 13:01:38 -05:00
Paul Frazee b100abca0e 1.13 2023-04-03 19:52:58 -05:00
Paul Frazee 25cc5b997f Rework the me.follows cache to reduce network load (#384) 2023-04-03 19:50:46 -05:00
Paul Frazee 50f7f9877f Give the unfiltered view if the language filter yields no results (close #358) (#382) 2023-04-03 16:33:14 -05:00
Paul Frazee 9102af6b07 More darkmode fixes (#381)
* Update confirm modal to use theming system (close #347)

* Add dark mode styles to serverinput modal

* Fix lint
2023-04-03 16:19:22 -05:00
Paul Frazee 59e6b308c6 Fix: don't let the toast take pointer events (close #374) (#380) 2023-04-03 16:00:00 -05:00
Paul Frazee b12cd53a4d Improve "Load more" error handling in feeds (#379)
* Add explicit load-more error handling to posts feed

* Add explicit load-more error handling to notifications feed

* Properly set hasMore to false after an error
2023-04-03 15:57:17 -05:00
Paul Frazee 2045c615a8 Reorganize state models for clarity (#378) 2023-04-03 15:21:17 -05:00
John Fawcett 9652d994dd Fix click targets for post controls (#332) (#363)
* Fix click targets for post controls (#332)

* Add padding to the right side of the post controls

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-04-03 12:32:35 -05:00
John Fawcett 180e373b6f Fix full thread SVG dots not rendering (#346) (#364) 2023-04-03 12:18:57 -05:00
Paul Frazee 9d178c7e15 Fix unit tests (#377)
* Fix unit tests

* Remove excess lint and prettier checks from gh actions
2023-04-03 12:11:06 -05:00
Paul Frazee 70abcc48b8 Fixes & updates for xcode 14.3 (#369) 2023-04-03 10:32:19 -05:00
bnewbold 95fb65093a golang: update deps (minor) (#367)
* golang: minor deps update

* golang: update deps for latest indigo
2023-04-03 09:43:08 -05:00
Paul Frazee cc7b2a246e Lex refactor fixes (#368)
* Fix: handle validation failures correctly in feed-view

* Fix: convert the off-spec feed view to lex objects

* Fix to fetching all follows during init

* Bump @atproto/api@0.2.1

* Fix: properly group together like notifications

* 1.12
2023-04-02 14:20:19 -05:00
bnewbold 14965d4d97 ci: golang version as string, not number (#361) 2023-04-02 09:56:41 -07:00
Jake Gold a0435cf3d4 update for lex refactor 2023-04-02 08:34:37 -07:00
Paul Frazee a3334a01a2 Lex refactor (#362)
* Remove the hackcheck for upgrades

* Rename the PostEmbeds folder to match the codebase style

* Updates to latest lex refactor

* Update to use new bsky agent

* Update to use api package's richtext library

* Switch to upsertProfile

* Add TextEncoder/TextDecoder polyfill

* Add Intl.Segmenter polyfill

* Update composer to calculate lengths by grapheme

* Fix detox

* Fix login in e2e

* Create account e2e passing

* Implement an e2e mocking framework

* Don't use private methods on mobx models as mobx can't track them

* Add tooling for e2e-specific builds and add e2e media-picker mock

* Add some tests and fix some bugs around profile editing

* Add shell tests

* Add home screen tests

* Add thread screen tests

* Add tests for other user profile screens

* Add search screen tests

* Implement profile imagery change tools and tests

* Update to new embed behaviors

* Add post tests

* Fix to profile-screen test

* Fix session resumption

* Update web composer to new api

* 1.11.0

* Fix pagination cursor parameters

* Add quote posts to notifications

* Fix embed layouts

* Remove youtube inline player and improve tap handling on link cards

* Reset minimal shell mode on all screen loads and feed swipes (close #299)

* Update podfile.lock

* Improve post notfound UI (close #366)

* Bump atproto packages
2023-03-31 13:17:26 -05:00
bnewbold 19f3a2fa92 CI: run on all PRs, and on main (after merge/push) (#355) 2023-03-27 10:19:26 -05:00
John Fawcett def8be2137 Fixes the lightbox image index not being passed through to the web version (#306) (#324) 2023-03-27 10:18:14 -05:00
bnewbold 2789d5c056 Basic golang CI setup (#360)
* bskyweb: Makefile and dev env

This matches the setup for local dev testing in atproto and indigo
repos.

* gitignore: don't ignore self and .github/

* CI: golang build+test and lint actions

* bskyweb: better use of godotenv

A recent change from indigo.

* prettier: ignore top-level app.json

* CI: bump from golang 1.19 to 1.20

* bskyweb: update to golang 1.20
2023-03-27 10:16:17 -05:00
Paul Frazee 4fbe0e267c 1.10.0 2023-03-23 10:17:24 -05:00
Paul Frazee a14c2ede39 Fix layout issues with search on Web (close #345) (#357) 2023-03-22 15:49:49 -05:00
Paul Frazee f6f1fe2558 Feed updates (Closes #344) (#356)
* Rework feed polling to correctly detect when new content is available (close #344)

* Tweak how the tuner works for consistency

* Improve the feed-update behavior after posting

* Load latest notifications when opening the tab
2023-03-22 15:46:49 -05:00
Paul Frazee 449f9243f3 Filter content by your device's configured languages (#354) 2023-03-22 13:23:12 -05:00
Paul Frazee a369e07956 Fix tsc 2023-03-22 11:07:00 -05:00
Paul Frazee a8a747ebcb Fix bad reference (close 348) (#353) 2023-03-22 10:49:39 -05:00
Paul Frazee 2dc774788b Move the feed selector to the header (#352)
* Reorg pager components into their own folder

* Move the feed selector to the header

* Fix lint
2023-03-22 10:46:09 -05:00
Paul Frazee 4f814207bc Merge the suggested actors model with the general suggestion system (#343) 2023-03-21 19:18:15 -05:00
Paul Frazee f20fb92dc3 1.9 2023-03-21 17:59:37 -05:00
Paul Frazee a7e3ce2585 Add fulltext search for posts and profiles (closes #340) (#342)
* Refactor mobile search screen

* Remove 'staleness' fetch trigger on search

* Implement a temporary fulltext search solution

* Add missing key from profile search result

* A few UI & UX improvements to the search suggestions

* Update web search suggestions

* Implement search in web build
2023-03-21 17:58:50 -05:00
Paul Frazee 48e18662f6 Fix bug in checking for latest 2023-03-21 13:51:27 -05:00
Paul Frazee eab855ffff A few fixes to ensure threads show up as often as possible 2023-03-21 13:47:17 -05:00
Paul Frazee b542f0f7f8 Merge branch 'main' of github.com:bluesky-social/social-app into main 2023-03-21 13:36:39 -05:00
Paul Frazee 1e34e62259 Elide long threads in the feed (close #333) 2023-03-21 13:36:27 -05:00
Paul Frazee b692f29773 Raise the bar a bit more for showing replies in the feed 2023-03-21 13:26:13 -05:00
Paul Frazee 35fae5ab25 Fix duplicates showing up in the feed due to reply parents 2023-03-21 13:20:35 -05:00
Paul Frazee 92d9267805 Fix: don't incorrectly assemble threads when somebody replies multiple times to the same post 2023-03-21 13:13:36 -05:00
Paul Frazee 08d513e8c1 Fix default-banner sizing & positioning (#336) 2023-03-21 13:03:25 -05:00
Paul Frazee 858d4c8c88 Introduce an image sizes cache to improve feed layouts (close #213) (#335)
* Introduce an image sizes cache to improve feed layouts (close #213)

* Clear out resolved promises from the image cache
2023-03-21 12:59:10 -05:00
Paul Frazee c1d454b7cf Fix sizing on the composer text input (#331) 2023-03-20 19:08:48 -05:00
Jake Gold 67e4882bb3 bskyweb additions (#296)
Add some minor bskyweb improvements, Mailmodo endpoint, Dockerfile for bskyweb, container image push
2023-03-20 14:41:15 -07:00
Paul Frazee d8f4475696 Fix default banner sizing 2023-03-20 16:20:29 -05:00
Paul Frazee 91b360fd19 Fix: poll for unread notifications globally (close #303) (#330) 2023-03-20 16:18:42 -05:00
Paul Frazee 8a3601c07c Fix visibility of the mentions autocomplete in the composer (#326) (#329)
* Improve layout in composer to ensure the mentions autocomplete is visible (closes #326)

* Dont dismiss the keyboard in the composer
2023-03-20 16:10:29 -05:00
Paul Frazee df6a712834 Request permissions properly on mobile (closes #308) (#328) 2023-03-20 15:16:56 -05:00
Paul Frazee 4f9e9e609e Darkmode fixes (#301) (#327)
* Fix dark mode rendering of 'follows you' pill

* Fix the darkmode coloring of the PTR

* Fix dark mode styles in dns instructions

* Only lint the src dir
2023-03-20 14:53:59 -05:00
Paul Frazee d9ed13ea90 Fix Podfile.lock 2023-03-19 19:46:49 -05:00
Paul Frazee 1dcd7e5735 Merge branch 'onboarding-and-discovery' into main 2023-03-19 19:45:59 -05:00
Paul Frazee 994332af91 Add missing deps and an atob polyfill 2023-03-19 19:02:55 -05:00
Paul Frazee 1de724b24b Add custom feeds selector, rework search, simplify onboarding (#325)
* Get home screen's swipable pager working with the drawer

* Add tab bar to pager

* Implement popular & following views on home screen

* Visual tune-up

* Move the feed selector to the footer

* Fix to 'new posts' poll

* Add the view header as a feed item

* Use the native driver on the tabbar indicator to improve perf

* Reduce home polling to the currently active page; also reuse some code

* Add soft reset on tap selected in tab bar

* Remove explicit 'onboarding' flow

* Choose good stuff based on service

* Add foaf-based follow discovery

* Fall back to who to follow

* Fix backgrounds

* Switch to the off-spec goodstuff route

* 1.8

* Fix for dev & staging

* Swap the tab bar items and rename suggested to what's hot

* Go to whats-hot by default if you have no follows

* Implement pager and tabbar for desktop web

* Pin deps to make expo happy

* Add language filtering to goodstuff
2023-03-19 18:53:57 -05:00
Paul Frazee 4787c8383d Add language filtering to goodstuff 2023-03-19 18:47:49 -05:00
Paul Frazee a811c57480 Pin deps to make expo happy 2023-03-19 18:11:45 -05:00
Paul Frazee 23e8484986 Implement pager and tabbar for desktop web 2023-03-19 18:11:33 -05:00
John Fawcett c31ffdac1b Fixes the lightbox not having a close button on web (#306) (#323) 2023-03-19 17:39:37 -05:00
John Fawcett db6b198d18 Fixes profile edit image selection not prompting users on web (#309) (#321)
* Fixes profile edit image selection not prompting users on web (#309)

* Fixes linting erros
2023-03-19 17:38:53 -05:00
John Fawcett ea2b2583b8 Fixes character counter missing on web (#300) (#322) 2023-03-19 17:37:59 -05:00
Paul Frazee 7a754850bc Go to whats-hot by default if you have no follows 2023-03-19 17:30:58 -05:00
Paul Frazee 6578d2bfad Swap the tab bar items and rename suggested to what's hot 2023-03-19 16:25:42 -05:00
John Fawcett 30c54aa265 Fixes quote post not showing up in quote post composer (#315) (#318) 2023-03-18 19:44:39 -05:00
Paul Frazee 5def9eb238 Fix for dev & staging 2023-03-17 18:40:26 -05:00
Paul Frazee a2462498c0 1.8 2023-03-17 18:39:31 -05:00
Paul Frazee 808affc78b Switch to the off-spec goodstuff route 2023-03-17 18:38:16 -05:00
Paul Frazee 8364e1a081 Fix backgrounds 2023-03-17 18:11:57 -05:00
Paul Frazee 025681c2f2 Fall back to who to follow 2023-03-17 18:09:27 -05:00
Paul Frazee ff39b072f3 Add foaf-based follow discovery 2023-03-17 18:01:53 -05:00
Paul Frazee 6af2585f32 Choose good stuff based on service 2023-03-17 15:20:34 -05:00
Paul Frazee 308b1e8beb Remove explicit 'onboarding' flow 2023-03-17 15:18:46 -05:00
Paul Frazee b711a49df9 Add soft reset on tap selected in tab bar 2023-03-17 15:17:28 -05:00
Paul Frazee 201c21df6d Reduce home polling to the currently active page; also reuse some code 2023-03-17 15:14:17 -05:00
Paul Frazee 93b334cce4 Use the native driver on the tabbar indicator to improve perf 2023-03-17 15:02:43 -05:00
Paul Frazee 4a16b179e2 Add the view header as a feed item 2023-03-17 14:53:58 -05:00
Paul Frazee 44fcdca06a Fix to 'new posts' poll 2023-03-17 14:41:04 -05:00
Paul Frazee c3ed0dc44c Move the feed selector to the footer 2023-03-17 14:03:16 -05:00
Paul Frazee 244b06c19d Visual tune-up 2023-03-16 22:02:44 -05:00
Paul Frazee 71209bb3ac Implement popular & following views on home screen 2023-03-16 21:47:11 -05:00
Paul Frazee ad9da82612 Add tab bar to pager 2023-03-16 19:54:32 -05:00
Paul Frazee f01d43f9e8 Get home screen's swipable pager working with the drawer 2023-03-16 19:09:19 -05:00
Paul Frazee c50a20d214 Refactor feed manipulation and rendering to be more robust (#297) 2023-03-16 15:54:06 -05:00
Paul Frazee 93df983692 Disable the drawer and reset the nav when the user logs out or switches accounts 2023-03-16 11:41:59 -05:00
Paul Frazee 64c8689a29 Update team handles and fetch more data in discovery 2023-03-15 17:29:38 -05:00
Paul Frazee 53fc5bf336 Remove ipad support that somehow crept in 2023-03-15 16:55:56 -05:00
Paul Frazee 4f20a17b6e Tune up notification badge rendering 2023-03-15 16:39:45 -05:00
Paul Frazee 474b4b7840 Optimize and refactor profile rendering a bit 2023-03-15 15:46:39 -05:00
Paul Frazee 8a279b8d2c Temporarily disable swipe gesture on profiles 2023-03-15 15:34:57 -05:00
Paul Frazee 3c05a08482 Logout bug hunt (#294)
* Stop storing the log on disk

* Add more info to the session logging

* Only clear session tokens from storage when they've expired

* Retry session resumption a few times if it's a network issue

* Improvements to the 'connecting' screen
2023-03-15 15:05:13 -05:00
Paul Frazee 94741cdded Temporary hackfix for desktop search 2023-03-14 17:35:58 -05:00
Paul Frazee 8d2e649b4d Create build step for the web server (#289)
* Create build step for the web server

* Update bskyweb routes and 404 behavior
2023-03-14 17:30:15 -05:00
bnewbold 8629e167cd bskyweb: proof-of-concept golang daemon to serve SPA (#275)
* gitignore: /dist/

* bskyweb: initial work-in-progress

* bskyweb: import icons from bluesky-website

* bskyweb: switch to pongo2 templates; iterate on views

* bskyweb: example.env (and docs)

* bskyweb: go fmt

* bskyweb: remove plan file

* bskyweb: README: tweak formatting

* prettier: ignore /dist/, bskyweb templates

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-03-14 15:00:44 -05:00
Paul Frazee 528e14fe90 Handle logged out mobile web better 2023-03-14 14:59:37 -05:00
Paul Frazee 41f4385db9 Fix multiline input in composer 2023-03-14 14:38:02 -05:00
Paul Frazee 5bbb980250 Fix mentions in web 2023-03-14 14:36:31 -05:00
Paul Frazee b4e5179c9c A couple small fixes 2023-03-14 13:34:05 -05:00
Paul Frazee 617d93fb48 Add waitlist signup 2023-03-14 13:30:20 -05:00
Paul Frazee b838c786e0 Delete dead code 2023-03-14 13:14:56 -05:00
Paul Frazee 1b7292e1db Fix lint, tsc; delete dead code 2023-03-14 13:13:46 -05:00
Paul Frazee c73d1e80b1 Remove dead code 2023-03-14 13:12:42 -05:00
Paul Frazee 4eb9eb006c Fix redundant filename 2023-03-14 13:12:13 -05:00
Paul Frazee 7ff4e91363 Move the shell-ui model to the ui folder 2023-03-14 13:11:46 -05:00
Paul Frazee cf30c66c33 Move the profile-ui model to the new ui folder 2023-03-14 13:11:04 -05:00
Paul Frazee acf0f80de2 Rework account creation and login views 2023-03-14 13:03:43 -05:00
Paul Frazee d55780f5c3 Tune the logged out web view 2023-03-14 08:37:34 -05:00
Paul Frazee 774fb83719 Rework logged out state to preserve routing and work for web 2023-03-13 23:30:12 -05:00
Paul Frazee b5c64a03b6 Notification count fixes 2023-03-13 21:46:16 -05:00
Paul Frazee 6533d7dd08 Add /support and /support/privacy 2023-03-13 20:34:01 -05:00
Paul Frazee 56cf890deb Move to expo and react-navigation (#288)
* WIP - adding expo

* WIP - adding expo 2

* Fix tsc

* Finish adding expo

* Disable the 'require cycle' warning

* Tweak plist

* Modify some dependency versions to make expo happy

* Fix icon fill

* Get Web compiling for expo

* 1.7

* Switch to react-navigation in expo2 (#287)

* WIP Switch to react-navigation

* WIP Switch to react-navigation 2

* WIP Switch to react-navigation 3

* Convert all screens to react navigation

* Update BottomBar for react navigation

* Update mobile menu to be react-native drawer

* Fixes to drawer and bottombar

* Factor out some helpers

* Replace the navigation model with react-navigation

* Restructure the shell folder and fix the header positioning

* Restore the error boundary

* Fix tsc

* Implement not-found page

* Remove react-native-gesture-handler (no longer used)

* Handle notifee card presses

* Handle all navigations from the state layer

* Fix drawer behaviors

* Fix two linking issues

* Switch to our react-native-progress fork to fix an svg rendering issue

* Get Web working with react-navigation

* Refactor routes and navigation for a bit more clarity

* Remove dead code

* Rework Web shell to left/right nav to make this easier

* Fix ViewHeader for desktop web

* Hide profileheader back btn on desktop web

* Move the compose button to the left nav

* Implement reply prompt in threads for desktop web

* Composer refactors

* Factor out all platform-specific text input behaviors from the composer

* Small fix

* Update the web build to use tiptap for the composer

* Tune up the mention autocomplete dropdown

* Simplify the default avatar and banner

* Fixes to link cards in web composer

* Fix dropdowns on web

* Tweak load latest on desktop

* Add web beta message and feedback link

* Fix up links in desktop web
2023-03-13 16:01:43 -05:00
Paul Frazee 503e03d91e No longer a beta 2023-03-08 13:03:59 -06:00
Paul Frazee ff20981288 Fix lint 2023-03-07 17:18:49 -06:00
Paul Frazee 181121b451 Another set of UI updates (FAB returns, a few others) (#281)
* Bring back the FAB and move compose out of the footer

* Increase the touch target sizes of the header back btns (close #279)

* Trigger 'load more' sooner (close #280)
2023-03-07 17:17:44 -06:00
Paul Frazee e74f94bc72 Big batch of UI updates (#276)
* Replace react-native-root-toast with a custom toast that fits the visual style

* Tune dark mode colors

* Tune colors a bit more

* Move the reply prompt to a fixed position in the footer

* Fully hide muted posts but give a control to show anyway (close #270)

* Improve thread rendering (better clarity on reply lines)

* Add follower/following counts to side menu

* Fix issues with display name overflows
2023-03-07 15:52:24 -06:00
Paul Frazee 2f3fc4fe4e Handle-change modal with custom domain support (#273)
* Dont append the server's domain name when a custom domain is used

* Update the settings look & feel and add a tool to remove accounts from the switcher

* Try not rendering the bottomsheet when no modal is active.

There are cases where the bottomsheet decides to show itself when
it's not supposed to. It seems obvious to do what this change is
doing -- just dont render bottomsheet if no modal is active -- but
previously we experienced issues with that approach. This time it
seems to be working, so we're gonna yolo try it.

* Implement a handle-change modal with support for custom domains (closes #65)
2023-03-06 21:37:48 -06:00
Paul Frazee 20de7782ba Fix typo 2023-03-06 15:46:44 -06:00
Paul Frazee bb6bd905c2 Fix: fetch follows before everything else to avoid rendering follow buttons wrongly 2023-03-06 15:40:52 -06:00
Paul Frazee e069bde75c Tune the menu's dark mode bg color 2023-03-06 15:39:58 -06:00
Paul Frazee 6980bb0827 Fix the darkmode icon in the menu 2023-03-06 15:38:52 -06:00
Paul Frazee 36791e68b3 Onboarding tweaks (#272)
* Small fix to side menu rendering

* Change onboarding to use an explicit 'is onboarding' mode to more clearly control the flow

* Add a progress bar to the welcome banner

* Dont show the 'unfollow button' on posts in weird times (close #271)

* Improve the empty state of the feed

* Only suggest recent posts
2023-03-06 15:34:22 -06:00
Paul Frazee 74c30c60b8 Show replies in the main feed if they have 2 or more upvotes (#269) 2023-03-06 14:49:42 -06:00
Paul Frazee f84a379376 Factor out the bottom bar and layer it under the side menu (close #243) (#268) 2023-03-06 11:59:06 -06:00
Paul Frazee c2a931f49c 1.6 2023-03-06 10:55:45 -06:00
Paul Frazee eeac64cc88 Look & feel updates: replace the "FAB" with a footer menu item, update the side menu (#263)
* Remove old tab controls from the mobile shell

* Add 'compose' and 'profile' to the footer; remove the FAB

* Fix lint

* Tune the footer icons

* Tune the 'current' state of footer icons

* Add 2xl text styles

* Tune the footer icons a bit more

* Fix lint

* More footer tuning
2023-03-06 10:54:56 -06:00
Paul Frazee 159615990d 1.5 2023-03-03 14:44:00 -08:00
Paul Frazee c7560ae2f7 Add an x button to the search to clear the input 2023-03-03 14:38:59 -08:00
Paul Frazee 8e22ce8e2a Turn links to posts into quote posts (#262)
* Turn links to posts into quote posts

* Fix lint
2023-03-03 16:30:33 -06:00
arcalinea d74ff9c219 New user constants (#260)
* update users

* update

* With constructed intro feed, only grab 20 random suggested users to avoid perf issues

* Don't 'check for latest' in the feed with the suggestions feed

* Show/hide the welcome banner on account change (close #257)

---------

Co-authored-by: Jay Graber <arcalinea@gmail.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-03-03 15:37:17 -06:00
Paul Frazee 69d6774277 Move the translate item to the top of the menu 2023-03-03 13:19:00 -08:00
Paul Frazee a9920d9630 Add translate link to post menu (#261)
* Add a google translate menu item to posts

* Fix: make sure the dropdown menu is always visible (when low on the screen)
2023-03-03 15:13:31 -06:00
Paul Frazee c2bfa111ac Remove replies from the home feed (#259)
* Remove replies from the home feed (close #252)

* Increase the 'load more' threshhold
2023-03-03 14:43:18 -06:00
Paul Frazee b1fa1b633f Fix dark mode ellipsis on posts 2023-03-03 12:05:38 -08:00
Paul Frazee fd9d6327b4 Edit profile fixes (#258)
* Fix: only clear banner or avi when requested in edit profile

* Set the default snap points to 90% to ensure the modal never fails to raise
2023-03-03 14:02:40 -06:00
Paul Frazee 36b8f011a4 1.4 2023-03-02 17:02:46 -08:00
Ansh e592e59f4e 72-delete-avatar-and-cover (#255)
* allow to delete profile pic

* allow for removing banner
2023-03-02 18:53:18 -06:00
Ansh aeb04a2ed0 make authorAvatar optional prop (#254) 2023-03-02 18:51:13 -06:00
Paul Frazee 403c187cf5 Minor improvements to web autocomplete in composer 2023-03-02 16:43:19 -08:00
Ansh 75174a6c37 73-post-embeds (#253)
* update api to 0.1.3

* add repost modal with reposting functionality

* add quote post UI

* allow creation and view of quote posts

* Validate the post record before rendering a quote post

* Use createdAt in quote posts for now

* add web modal support

* Tune the quote post rendering

* Make did and declarationCid optional in postmeta

* Make did and declarationCid optional in postmeta

* dont allow image or link preview if quote post

* Handle no-text quote posts

* Tune the repost modal

* Tweak composer post text

* Fix lint

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-03-02 18:09:48 -06:00
Paul Frazee f539659ac8 Quick fixes to dark mode character counter colors 2023-03-02 13:59:44 -08:00
Paul Frazee ea4ec26683 Increase network timeouts (closes #248) (#249)
* Increase network timeouts (close #248)

* Fix: on post error only update the ext link card if it's in use
2023-03-02 13:31:16 -06:00
Paul Frazee 06e09facfe Trim whitespace from the invite code (close #245) (#247) 2023-03-02 12:42:52 -06:00
Ansh bd9386d81c New onboarding (#241)
* delete old onboarding files and code

* add custom FollowButton component to Post, FeedItem, & ProfileCard

* move building suggested feed into helper lib

* show suggested posts/feed if follower list is empty

* Update tsconfig.json

* add pagination to getting new onboarding

* remove unnecessary console log

* fix naming, add better null check for combinedCursor

* In locally-combined feeds, correctly produce an undefined cursor when out of data

* Minor refactors of the suggested posts lib functions

* Show 'follow button' style of post meta in certain conditions only

* Only show follow btn in posts on the main feed and the discovery feed

* Add a welcome notice to the home feed

* Tune the timing of when the welcome banner shows or hides

* Make the follow button an observer (closes #244)

* Update postmeta to keep the follow btn after press until next render

* A couple of fixes that ensure consistent welcome screen

* Fix lint

* Rework the welcome banner

* Fix cache invalidation of follows model on user switch

* Show welcome banner while loading

* Update the home onboarding feed to get top posts from hardcode recommends

* Drop unused helper function

* Update happy path tests

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-03-02 12:21:33 -06:00
Paul Frazee 9b46b2e6a9 A couple various fixes (#242)
* Fix: set the status bar color for dark mode when logging in

* Add some logging

* Improve read/unread tracking behaviors in notifications
2023-03-01 16:54:50 -06:00
Paul Frazee 1fd2942b9b 1.3 2023-03-01 09:13:43 -08:00
Paul Frazee df712a89d3 Fixes to dark mode (#238) 2023-03-01 10:35:56 -06:00
Paul Frazee d054b1baf8 Fix tests for march 1st 2023-03-01 08:35:25 -08:00
Paul Frazee dc7b5a34e7 Add a temporary lexicon refactor guard (#235)
* Add a temporary lexicon refactor guard

* Fix test

* Fix tsconfig formatting
2023-02-28 11:57:49 -06:00
Paul Frazee fcd8c7b037 Remove leftover log 2023-02-28 09:08:36 -08:00
Paul Frazee dcfc13f8d0 Add analytics identify() call with hashed email 2023-02-28 09:03:44 -08:00
Paul Frazee d375a45859 Fix analytics in native build 2023-02-27 11:08:01 -06:00
Paul Frazee f7d2a8935c Better fix to native modals 2023-02-27 10:59:19 -06:00
Paul Frazee be121da134 Fix to native modals 2023-02-27 10:54:44 -06:00
Paul Frazee fb4e28e713 Fix tsconfig for jsx 2023-02-27 10:52:22 -06:00
Paul Frazee 0bbdaa9ea4 Fix import 2023-02-27 10:47:39 -06:00
Paul Frazee dc6cdeae60 Fix lint 2023-02-27 10:45:59 -06:00
Paul Frazee fb4419786e Fix tests 2023-02-27 10:44:42 -06:00
Paul Frazee 55a8a8fa4c Sync browser navigation with app 2023-02-24 17:47:53 -06:00
Paul Frazee dcd396153c Clean up desktop web header search 2023-02-24 12:25:02 -06:00
Paul Frazee 70e74efe69 Hold off on customizing web feed rendering for now 2023-02-24 11:51:35 -06:00
Paul Frazee 9bda3b72d0 Simplify the desktop search screen 2023-02-24 11:49:25 -06:00
Paul Frazee d97e233518 Fixes to lineheight on web to counteract emoji issues 2023-02-24 11:40:43 -06:00
Paul Frazee 80bd3398d7 Remove the desktop right column for now 2023-02-24 11:29:27 -06:00
Paul Frazee fa115c1cba Fix region sizing on web 2023-02-24 10:10:21 -06:00
Paul Frazee 3e19728618 Replace some old modal models that got missed 2023-02-24 10:07:01 -06:00
Michael Staub 58b187ce7c fix: webpack flags 2023-02-23 16:35:11 -08:00
Michael Staub 693cbb9f18 Merge branch 'rnw' of github.com:bluesky-social/social-app into rnw 2023-02-23 16:34:25 -08:00
Michael Staub 23f07d8def fix: commit yarn.lock file 2023-02-23 16:33:06 -08:00
Michael Staub c173cffd62 fix: webpack hot reloading 2023-02-23 16:32:56 -08:00
Michael Staub e11f360376 feat: implement DesktopSearch component 2023-02-23 16:32:46 -08:00
Paul Frazee bbd0b03a46 Update modal com name 2023-02-23 17:29:34 -06:00
Paul Frazee 154c34e915 Rework modals to support multiple active 2023-02-23 17:22:03 -06:00
Paul Frazee b4f2a6979a Add setImmediate polyfill to web, fixing dropdown items 2023-02-23 16:42:52 -06:00
Paul Frazee 4182edfd7e Implement image uploading in the web composer 2023-02-23 16:02:31 -06:00
Michael Staub f709c50809 fix: browser history 2023-02-23 13:52:12 -08:00
Paul Frazee 0f293ecf95 Show a 'not available for mobile web' screen (temporary) 2023-02-23 12:39:10 -06:00
Paul Frazee a014b4e6cb Tweak approach to the viewheader 2023-02-23 12:26:25 -06:00
Paul Frazee ac655a0cf4 Web: go lighter for now, ditch the composer prompt in feed 2023-02-23 10:48:50 -06:00
Paul Frazee 86652c071a Missed in last commit 2023-02-23 10:25:24 -06:00
Paul Frazee 5f92180058 Move all of the web left-nav shell into the header 2023-02-23 10:19:21 -06:00
Paul Frazee 9bf48ed595 Change web shell to use permanent header 2023-02-23 09:38:02 -06:00
Paul Frazee e828f380e7 Update web header and search 2023-02-23 01:07:20 -06:00
Paul Frazee c5f28376c8 Rework web shell ui 2023-02-22 23:37:14 -06:00
Paul Frazee 9bfffadd88 Fix temporary web useAnalytics hook 2023-02-22 21:23:22 -06:00
Paul Frazee 2db7ad8ef3 Fix ref forwarding in web 2023-02-22 21:21:17 -06:00
Paul Frazee f28334739b Merge main into the Web PR (#230)
* Update to RN 71.1.0 (#100)

* Update to RN 71

* Adds missing lint plugin

* Add missing native changes

* Bump @atproto/api@0.0.7 (#112)

* Image not loading on swipe (#114)

* Adds prefetching to images

* Adds image prefetch

* bugfix for images not showing on swipe

* Fixes prefetch bug

* Update src/view/com/util/PostEmbeds.tsx

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

* Fixes to session management (#117)

* Update session-management to solve incorrectly dropped sessions

* Reset the nav on account switch

* Reset the feed on me.load()

* Update tests to reflect new account-switching behavior

* Increase max image resolutions and sizes (#118)

* Slightly increase the hitslop for post controls

* Fix character counter color in dark mode

* Update login to use new session.create api, which enables email login (close #93) (#119)

* Replaces the alert with dropdown for profile image and banner (#123)

* replaces the alert with dropdown for profile image and banner

* lint

* Fix to ordering of images in the embed grid (#121)

* Add explicit link-embed controls to the composer (#120)

* Add explicit link-embed controls

* Update the target rez/size of link embed thumbs

* Remove the alert before publishing without a link card

* [Draft] Fixes image failing on reupload issue (#128)

* Fixes image failing on reupload issue

* Use tmp folder instead of documents

* lint

* Image performance improvements (#126)

* Switch out most images for FastImage

* Add image loading placeholders

* Fix tests

* Collection of fixes to list rendering (#127)

* Fix bug that caused endless spinners in profile feeds

* Bundle fetches of suggested actors into one update

* Fixes to suggested follow rendering

* Fix missing replacement of flex:1 to height:100

* Fixes to navigation swipes (#129)

* Nav swipe: increase the distance traveled in response to gesture movement.

This causes swipes to feel faster and more responsive.

* Fix: fully clamp the swipe against the edge

* Improve the performance of swipes by skipping the interaction manager

* Adds dark mode to the edit screen (#130)

* Adds dark mode to edit screen

* lint

* lint

* lint

* Reduce render cost of post controls and improve perceived responsiveness (#132)

* Move post control animations into conditional render and increase perceived responsiveness

* Remove log

* Adds dark mode to the dropdown (#131)

* Adds dark mode to the bottom sheet

* Make background button lighter (like before)

* lint

* Fix bug in lightbox rendering (#133)

* Fix layout in onboarding to not overflow the footer

* Configure feed FlatList (removeClippedSubviews=true) to improve scroll performance (#136)

* Disable like/repost animations to see if theyre causing #135 (#137)

* Composer: mention tagging now works in middle of text (close #105) (#139)

* Implement account deletion (#141)

* Fix photo & camera permission management (#140)

* Check photo & camera perms and alert the user if not available (close #64)

- Adds perms checks with a prompt to update settings if needed
- Moves initial access of photos in the composer so that the initial prompt
  occurs at an intuitive time.

* Add react-native-permissions test mock

* Fix issue causing multiple access requests

* Use longer var names

* Update podfile.lock

* Lint fix

* Move photo perm request in composer to the gallery btn instead of when the carousel is opened

* Adds more tracking all around the app (#142)

* Adds more tracking all around the app

* more events

* lint

* using better analytics naming

* missed file

* more fixes

* Calculate image aspect ratio on load (#146)

* Calculate image aspect ratio on load

* Move aspect ratio bounds to constants

* Adds detox testing and instructions (#147)

* Adds detox testing and instructions

* lint

* lint

* Error cleanup (close #79) (#148)

* Avoid surfacing errors to the user when it's not critical

* Remove now-unused GetAssertionsView

* Apply cleanError() consistently

* Give a better error message for Upstream Failures (http status 502)

* Hide errors in notifications because they're not useful

* More e2e tests (create account) (#150)

* Adds respots under the 'post' tab under profile (#158)

* Adds dark mode to delete account screen (#159)

* 87 dark mode edit profile (#162)

* Adds dark mode to delete account screen

* Adds one more missed darkmode

* more fixes

* Remove fallback gradient on external links without thumbs (#164)

* Remove fallback gradient on external links without thumbs

* Remove fallback gradient on external links without thumbs in the composer preview

* Fix refresh behavior around a series of models (repost, graph, vote) (#163)

* Fix refresh behavior around a series of models (repost, graph, vote)

* Fix cursor behavior in reposted-by view

* Fixes issue where retrying on image upload fails (#166)

* Fixes issue where retrying on image upload fails

* Lint, longer test time

* Longer waitfor time in tests

* even longer timeout

* longer timeout

* missed file

* Update src/view/com/composer/ComposePost.tsx

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

* Update src/view/com/composer/ComposePost.tsx

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

* 154 cached image profile (#167)

* Fixes issue where retrying on image upload fails

* Lint, longer test time

* Longer waitfor time in tests

* even longer timeout

* longer timeout

* missed file

* Fixes image cache error on second try for profile screen

* lint

* lint

* lint

* Refactor session management to use a new "Agent" API (#165)

* Add the atp-agent implementation (temporarily in this repo)

* Rewrite all session & API management to use the new atp-agent

* Update tests for the atp-agent refactor

* Refactor management of session-related state. Includes:
- More careful management of when state is cleared or fetched
- Debug logging to help trace future issues
- Clearer APIs overall

* Bubble session-expiration events to the user and display a toast to explain

* Switch to the new @atproto/api@0.1.0

* Minor aesthetic cleanup in SessionModel

* Wire up ReportAccount and ReportPost (#168)

* Fixes embeds for youtube channels (#169)

* Bump app ios version to 1.1 (needed after app store submission)

* Fix potential issues with promise guards when an error occurs (#170)

* Refactor models to use bundleAsync and lock regions (#171)

* Fix to an edge case with feed re-ordering for threads (#172)

* 151 fix youtube channel embed (#173)

* Fixes embeds for youtube channels

* Tests for youtube extract meta

* lint

* Add 'doesnt use non-exempt encryption' to ios config

* Rework the search UI and add  (#174)

* Add search tab and move icon to footer

* Remove subtitles from view header

* Remove unused code

* Clean up UI of search screen

* Search: give better user feedback to UI state and add a cancel button

* Add WhoToFollow section to search

* Add a temporary SuggestedPosts solution using the patented 'bsky team algo'

* Trigger reload of suggested content in search on open

* Wait five min between reloading discovery content

* Reduce weight of solid search icon in footer

* Fix lint

* Fix tests

* 151 feat youtube embed iframe (#176)

* youtube embed iframe temp commit

* Fixes styling and code cleanup

* lint

* Now clicking between the pause and settings button doesn't trigger the parent

* use modest branding (less yt logos)

* Stop playing the video once there's a navigation event

* Make sure the iframe is unmounted on any navigation event

* fixes tests

* lint

* Add scroll-to-top for all screens (#177)

* Adds hardcoded suggested list (#178)

* Adds hardcoded suggested list

* Update suggested-actors-view to support page sizes smaller than the hardcoded list

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

* more robust centering of the play button (#181)

Co-authored-by: Aryan Goharzad <arrygoo@gmail.com>

* Bundle of UI modifications (#175)

* Adjust visual balance of SuggestedPosts and WhoToFollow

* Fix bug in the discovery load trigger

* Adjust search header aesthetic and have it scroll away

* More visual balance tweaks on the search page

* Even more visual balance tweaks on the search page

* Hide the footer on scroll in search

* Ditch the composer prompt buttons in the home feed

* Center the view header title

* Hide header on scroll on the home feed

* Fix e2e tests

* Fix home feed positioning (closes #189) (#195)

* Fix home feed positioning for floating header

* Fix positioning of errors in home feed

* Fix lint

* Don't show new-content notification for reposts (close #179) (#197)

* Show the splash screen during session resumption (close #186) (#199)

* Fix to suggested follows: chunk the hardcoded fetches to 25 at a time (close #196) (#198)

* UI updates to the floating action button (#201)

* Update FAB to use a plus icon and not drop shadow

* Update FAB positioning to be more consistent in different shell modes

* Animate the FAB's repositioning

* Remove the 'loading' placeholder from images as it degraded feed perf (#202)

* Remove the 'loading' placeholder from images as it degraded feed perf

* Remove references

* Fix RN bug that causes home feed not to load more; also fix home feed load view. (#208)

RN has a bug where rendering a flatlist with an empty array appears to break its
virtual list windowing behaviors. See https://stackoverflow.com/a/67873596

* Only give the loading spinner on the home feed during PTR (#207)

(cherry picked from commit b7a5da12fdfacef74873b5cf6d75f20d259bde0e)

* Implement our own lifecycle tracking to ensure it never fires while the app is backgrounded (close #193) (#211)

* Push notification fixes (#210)

* Fix to when screen analytics events are firing

* Fix: dont trigger update state when backgrounded

* Small fix to notifee API usage

* Fix: properly load notification info for push card

* Add feedback link to main menu (close #191) (#212)

* Add "follows you" information and sync follow state between views (#215)

* Bump @atproto/api@0.1.2 and update API usage

* Add 'follows you' pill to profile header (close #110)

* Add 'follows you' to followers and follows (close #103)

* Update reposted-by and liked-by views to use the same components as followers and following

* Create a local follows cache MyFollowsModel to keep views in sync (close #205)

* Add incremental hydration to the MyFollows model

* Fix tests

* Update deps

* Fix lint

* Fix to paginated fetches

* Fix reference

* Fix potential state-desync issue

* Fixes to notifications (#216)

* Improve push-notification for follows

* Refresh notifications on screen open (close #214)

* Avoid showing loader more than needed in post threads

* Refactor notification polling to handle view-state more effectively

* Delete a bunch of tests taht werent adding value

* Remove the accounts integration test; we'll use the e2e test instead

* Load latest in notifications when the screen is open rather than full refresh

* Randomize hard-coded suggested follows (#226)

* Ensure follows are loaded before filtering hardcoded suggestions

* Randomize hard-coded suggested profiles (close #219)

* Sanitizes posts on publish and render (#217)

* Sanatizes posts on publish and render

* lint

* lint and added sanitize to thread view as well

* adjusts indices based on replaced text

* Woops, fixes a bug

* bugfix + cleanup

* comment

* lint

* move sanitize text to later in the flow

* undo changes to compose post

* Add RichText library building upon the sanitizePost library method

* Add lodash.clonedeep dep

* Switch to RichText processing on record load & render

* Fix lint

---------

Co-authored-by: Paul Frazee <pfrazee@gmail.com>

* A group of notifications fixes (#227)

* Fix: don't group together notifications that can't visually be grouped (close #221)

* Mark all notifications read on PTR

* Small optimization: useCallback and useMemo in posts feed

* Add loading spinner to footer of notifications (close #222)

* Fix to scrolling to posts within a thread (#228)

* Fix: render the entire thread at start so that scrollToIndex works always (close #270)

* Visual fixes to thread 'load more'

* A few small perf improvements to thread rendering

* Fix lint

* 1.2

* Remove unused logger lib

* Remove state-mock

* Type fixes

* Reorganize the folder structure for lib and switch to typescript path aliases

* Move build-flags into lib

* Move to the state path alias

* Add view path alias

* Fix lint

* iOS build fixes

* Wrap analytics in native/web splitter and re-enable in all view code

* Add web version of react-native-webview

* Add web split for version number

* Fix BlurView import for web

* Add web split for fastimage

* Create web split for permissions lib

* Fix for web high priority images

---------

Co-authored-by: Aryan Goharzad <arrygoo@gmail.com>
2023-02-22 14:23:57 -06:00
Paul Frazee 7916b26aad Break out the web/native image picking code and make some progress on the web version 2023-01-27 15:51:24 -06:00
Paul Frazee 0673129b20 Fix import paths 2023-01-27 00:19:58 -06:00
Paul Frazee 99360f7bd9 Implement basic web composer 2023-01-27 00:16:07 -06:00
Paul Frazee 5961c26800 Update 'load latest' btn for web 2023-01-26 23:24:37 -06:00
Paul Frazee e6b63e3f53 Update compose prompts for web 2023-01-26 23:04:38 -06:00
Paul Frazee cd96c94d3a Add the user profile to the left nav 2023-01-26 22:40:39 -06:00
Paul Frazee 4b33cdb7ec Implement modals for web 2023-01-26 22:25:38 -06:00
Paul Frazee 24559599f3 Implement web toast 2023-01-26 22:08:10 -06:00
Paul Frazee 20eaac6acd Add lightbox for web 2023-01-26 21:54:47 -06:00
Paul Frazee 883d5749ed Update login/create-account and onboard for web 2023-01-26 21:03:50 -06:00
Paul Frazee df57c69f06 Update layouts on a bunch of views 2023-01-26 20:33:47 -06:00
Paul Frazee 9659625e8e Fix background in web scroll elements and update settings screen for web 2023-01-26 20:16:37 -06:00
Paul Frazee f7e3b1451e Add web version of the header 2023-01-26 20:04:11 -06:00
Paul Frazee a3df8840ea Fix repost icon on web 2023-01-26 19:50:04 -06:00
Paul Frazee f51ad28025 Add right column of web shell and tweak left column 2023-01-26 19:49:16 -06:00
Paul Frazee c24d0254bc Add left column of web shell 2023-01-26 19:06:46 -06:00
Paul Frazee 20ccb03427 Fix to blurviews 2023-01-26 18:15:43 -06:00
Paul Frazee d04a6d7539 Add web layout components 2023-01-26 17:55:15 -06:00
Paul Frazee 57d876a530 Fix: move imports and constants for the api-polyfill over from their old location 2023-01-26 17:38:25 -06:00
Paul Frazee a3d2db9645 Get MVP of web app running 2023-01-26 12:53:46 -06:00
Paul Frazee 751dfb20fd Add web polyfills 2023-01-26 12:36:27 -06:00
Paul Frazee d6ec627c8c Update web build and web-specific components; RNW now builds 2023-01-26 12:12:27 -06:00
Paul Frazee 7e3f6f0306 Fix all type errors 2023-01-26 11:25:52 -06:00
Paul Frazee c4ba5e7fd5 Bump podfile.lock 2023-01-26 09:51:05 -06:00
Paul Frazee 32be661d87 Brand tuning: switch from "blueprint B" to "cloud imagery" (#96)
* Switch app icon to bluesky image

* Update splash screen to clouds

* Update login screen to use branding

* Lighten the shadows in the brand imagery
2023-01-25 19:01:16 -06:00
Paul Frazee 67e9b3596d Fix: dont dedup reposts that are in threads, as that can cause rendering issues (close #71) 2023-01-25 17:57:53 -06:00
Paul Frazee e08a46f0c6 Add a sanity check to avoid bad references, close #77 2023-01-25 17:49:22 -06:00
Paul Frazee 1090783f91 Fix pagination and rendering of suggested follows (#95) 2023-01-25 17:46:14 -06:00
Aryan Goharzad eb33c3fa81 Saves image on long press (#83)
* Saves image on long press

* Adds save on long press

* Forking lightbox

* move to wrapper only to the bottom sheet to reduce impact of this change

* lint

* lint

* lint

* Use official `share` API

* Clean up cache after download

* comment

* comment

* Reduce swipe close velocity

* Updates per feedback

* lint

* bugfix

* Adds delayed press-in for TouchableOpacity
2023-01-25 17:25:34 -06:00
Aryan Goharzad adf328b50c Adds darkmode support for "Liked by" screen (#94)
* Adds darkmode support for "Liked by" screen

* changes based on feedback

* variable naming
2023-01-25 16:54:22 -06:00
Paul Frazee 5f18931915 Push notification & session management cleanup (#92)
* Add some temporary logging to help suss out the session drop issue

* Fix to session resumption: copy session tokens during a resumeSession attempt

* Factor out notifee display into a lib and add to storybook

* Tune the bg notifications fetch to only get what is needed

* Fix: run account update inside a mobx action

* Remove debugging logs for sessions

* Fixes to bg notifications fetch
2023-01-25 11:31:09 -06:00
Paul Frazee 079e1dbe18 Fix missing config for background fetch 2023-01-24 19:59:40 -06:00
Paul Frazee 869f6c4e0e Initial pass at push notifications + some fixes to the session management (#91)
* Fix: test the session during resume to ensure it's valid

* Don't delete sessions for now

* Add notifee and request notif permissions on first login

* Set unread notifications badge on app icon

* Trigger a notifee card on new notifications

* Experimental: use react-native-background-fetch to check for notifications

* Add missing mocks

* Fix to resumeSession()
2023-01-24 19:32:24 -06:00
Paul Frazee 21f5f4de15 Add basic analytics (#89)
* Add basic analytics

* Fix: add mock for analytics
2023-01-24 13:58:35 -06:00
Paul Frazee f36c956536 Resolve all remaining lint issues (#88)
* Rework 'navIdx' variables from number arrays to strings to avoid equality-check failures in react hooks

* Resolve all remaining lint issues

* Fix tests

* Use node v18 in gh action test
2023-01-24 13:00:11 -06:00
Aryan Goharzad 3a90114f3a more prettier and lint cleanup (#82)
* more prettier and lint cleanup

* Fixes more lint issues

* lint

* ignore more files

* remove todos

* lint
2023-01-24 11:03:18 -06:00
Paul Frazee 9027882fb4 Account switcher (#85)
* Update the account-create and signin views to use the design system.

Also:
- Add borderDark to the theme
- Start to an account selector in the signin flow

* Dark mode fixes in signin ui

* Track multiple active accounts and provide account-switching UI

* Add test tooling for an in-memory pds

* Add complete integration tests for login and the account switcher
2023-01-24 09:06:27 -06:00
Aryan Goharzad 439305b57e Removes white space from around images (#81)
* Removes white space from around images

* Add a subtle border
2023-01-23 20:17:37 -06:00
Aryan Goharzad 06e41167d0 Lints some errors and warnings (#76) 2023-01-20 13:43:28 -06:00
Aryan Goharzad 2fce1637b4 Fixes embed links for twitter and tiktok (#74) 2023-01-20 12:54:30 -06:00
Paul Frazee d4b9ef3b0a Only use cursors supplied by the server (ref #59) 2023-01-20 10:39:00 -06:00
Paul Frazee c4cca8cf6c Sanity check selector swipes 2023-01-20 10:15:59 -06:00
Paul Frazee 56747263df More layout fixes in notifications 2023-01-20 08:40:41 -06:00
Paul Frazee db4109a5ea Spacing fix of expanded notifications 2023-01-20 08:36:15 -06:00
Paul Frazee c2e7dd8f48 Fix font color of expanded notifs 2023-01-20 08:35:35 -06:00
Paul Frazee 620d5bb102 Fix text color in composer 2023-01-19 20:08:43 -06:00
Paul Frazee 142b5dfc1b Fix a case where the 'aborted' error message was getting through 2023-01-19 17:55:00 -06:00
Paul Frazee ddcc719192 Fix: taps on images in the composer now register even when input is focused 2023-01-19 17:46:45 -06:00
Paul Frazee 41f76a68e3 Fix: new post doesnt open images selector 2023-01-19 17:37:24 -06:00
Paul Frazee 570b76a71d Add the ability to paste images into the composer (#56) 2023-01-19 17:36:49 -06:00
Paul Frazee 15589d216f Fix error logs 2023-01-19 17:05:36 -06:00
Paul Frazee 6dcf9f8d5b Fixes to likes list 2023-01-19 16:54:30 -06:00
Paul Frazee a24b29d64b Fixes to reposted-by list 2023-01-19 16:50:16 -06:00
Paul Frazee c11bfc7541 Fixes to follows listing 2023-01-19 16:39:40 -06:00
Paul Frazee aec0f1c3ba Fixes to the followers list view 2023-01-19 16:38:12 -06:00
Paul Frazee 88ab1f171a Update podfile.lock 2023-01-19 16:37:21 -06:00
Paul Frazee 80f58cf9f3 Fix: ensure all views can scroll to the bottom 2023-01-19 15:21:06 -06:00
Paul Frazee 2972fd8372 Update load latest to match sizing and aesthetic better 2023-01-19 15:10:15 -06:00
Paul Frazee 90d6d75af1 Fix html extraction tests 2023-01-19 14:30:33 -06:00
Paul Frazee 8d7566f200 Visual tweaks to post prompts 2023-01-19 14:28:11 -06:00
Paul Frazee 39e996ed8e Fix weird bar at top of composer in dark mode 2023-01-19 14:17:15 -06:00
Paul Frazee 43ef1756c1 Fix bad ref 2023-01-19 14:17:00 -06:00
Paul Frazee 3f95f98ef9 Change post prompt to a set of buttons (#55) 2023-01-19 14:08:53 -06:00
Aryan Goharzad f10a8308d9 Fixes youtube embed issues (#50)
* fixes youtube embed

* move extractMetaHtml test to its own file

* tests cleanup

* Add fallback for youtube meta data

* lint

* Check for youtube in the url domain

* use hostname instead of full url to check for link domain

* checks only for domain
2023-01-19 12:53:11 -06:00
Paul Frazee 9230d52ff5 Improve link meta fetching for bsky links (#54)
* Add share dropdown item to profiles

* Temporary improvement for links to content on the network

* Enlarge text slightly on embed cards
2023-01-19 12:30:28 -06:00
Aryan Goharzad 0536a6afcf Adding action for linting (#51)
* Adding action for linting

* Configuring eslint

* Update lint.yml

* Update lint.yml

* Update lint.yml

* adds yarn jest to package.json

* test report

* debugging tests

* trying force exit

* force exit

* test1

* forceexit

* using another reporter

* jest debugging

* separated lints & tests

* test

* Cleanup

* Add  /src/third-party, /ios, and /android to ignore list
2023-01-19 12:28:52 -06:00
Paul Frazee f969e746f7 Clean up the settings page 2023-01-19 11:49:53 -06:00
Paul Frazee 1c5c2622bf Improve the 'expand avis' animation in the notifications 2023-01-19 11:41:24 -06:00
Paul Frazee d2db9baacc Fix missing key in list 2023-01-19 11:35:37 -06:00
Paul Frazee 74ab6530d4 Add the ability to expand/collapse users in notifications 2023-01-19 11:34:07 -06:00
Paul Frazee 1ed82b6c59 Tune the empty state visuals 2023-01-19 10:50:21 -06:00
Paul Frazee f47751ad42 Tweak compose prompt spacing 2023-01-19 10:40:55 -06:00
Paul Frazee 2798250489 Post layout tweaks (#53)
* Increase left margin on feed and embiggen avis

* Decrease feed margins a bit

* Tweak post bottom margin

* Update loading placeholder to match feed

* Update 'view full thread' positioning

* Update postthread to match feed layout

* Update notifications and individual post to match new layout

* Add missing aborted check
2023-01-19 10:35:57 -06:00
Paul Frazee 6588961d2e Update composer to preview external link cards (#52)
* Fetch external link metadata during compose so the user can preview and remove the embed

* Add missing mocks

* Update tests to match recent changes
2023-01-18 18:14:46 -06:00
Paul Frazee 27ee550d15 Enlarge avatars in the notifications 2023-01-18 17:06:17 -06:00
Paul Frazee bda32c1ceb Remove log 2023-01-18 16:52:00 -06:00
Paul Frazee ebc2033d18 Handle post deletions by removing from active views (close #37) 2023-01-18 16:45:48 -06:00
Paul Frazee ace0e6bfd9 Fix image compression (close #41) 2023-01-18 14:54:55 -06:00
Paul Frazee 1898d5dbaa Keep the composer image selector open after choosing an image 2023-01-18 14:47:59 -06:00
Paul Frazee d0364c09ad Hackfix around 'images too large' issue 2023-01-18 14:47:42 -06:00
Paul Frazee bf03167ca6 Update compose prompt for isual balance and to include image button 2023-01-18 13:57:53 -06:00
Paul Frazee 9d6c4698a1 Lighten the button gradients a bit 2023-01-18 13:30:50 -06:00
Paul Frazee c97045a21a Fix to text consistency in composer 2023-01-18 13:22:34 -06:00
Paul Frazee 726ff6bb01 Focus the text input on tap during the composer 2023-01-18 13:21:23 -06:00
Paul Frazee 302acaccb6 Remove all links from post meta to ensure taps are more consistent 2023-01-18 13:10:08 -06:00
Paul Frazee 6a01e0529b Prettier profile headers (no standard header) 2023-01-18 12:56:53 -06:00
Paul Frazee 990c824648 Move the grays from a red undertone to blue 2023-01-18 12:40:51 -06:00
Paul Frazee a51354e6e6 Update gradients to use a more consistent blue theme 2023-01-18 12:32:48 -06:00
Paul Frazee 77580ab6a4 Rework all typography 2023-01-18 11:15:40 -06:00
Paul Frazee df4acbd683 Merge branch 'improved-lightbox' into main 2023-01-17 21:18:25 -06:00
Paul Frazee 7328e80825 Fix an issue that caused the shelf menu to show up at random 2023-01-17 21:01:52 -06:00
Paul Frazee 80e035cede Remove leftover code 2023-01-17 20:47:43 -06:00
Paul Frazee 065d7ef629 Improve lightbox... and update to React Native 0.71.0 (#49)
* Switch to a better lightbox implementation (close #42)

* Upgrade to react-native 0.71.0

* Update (or remove low-value) tests
2023-01-17 20:40:02 -06:00
Paul Frazee a3e9a0691e Update (or remove low-value) tests 2023-01-17 20:38:15 -06:00
Paul Frazee a13f9bf091 Upgrade to react-native 0.71.0 2023-01-17 20:21:11 -06:00
Paul Frazee b449ab842f Switch to a better lightbox implementation (close #42) 2023-01-17 19:34:12 -06:00
Paul Frazee 61682d5846 Add images to the post in the right order 2023-01-17 18:35:48 -06:00
Paul Frazee bccc8a64d0 Give a more sensible default crop in the post image picker (related #39) 2023-01-17 18:35:37 -06:00
Paul Frazee fb334b1b3f Add profile menuitem to main menu (close #47) 2023-01-17 16:55:43 -06:00
Paul Frazee 5da45cd8cd Fix to extraneous home feed polling 2023-01-17 16:49:11 -06:00
Paul Frazee 41337f6d17 Visual improvements to post embeds for external links 2023-01-17 16:42:32 -06:00
Paul Frazee 90ac2fe1fc Group together notifications more aggressively 2023-01-17 16:25:10 -06:00
Paul Frazee 5a5835f561 Fix left-alignment on notifications 2023-01-17 16:22:34 -06:00
Paul Frazee 40d769e854 Increase the profile bio line-count cutoff significantly to only catch very silly newline abuse (close #48) 2023-01-17 16:18:41 -06:00
Paul Frazee c80c63cda5 More adjustments to the repost icon 2023-01-17 13:25:04 -06:00
Paul Frazee 65fef125ce Enlarge repost icon arrows 2023-01-17 13:21:11 -06:00
Paul Frazee e3e2831d11 Rework repost icon to match line widths 2023-01-17 13:17:38 -06:00
Paul Frazee 798622b307 Refer to upvotes as 'likes' in the UI (will change in the protocol soon) 2023-01-17 12:35:47 -06:00
Paul Frazee ee8d311795 Fix notification descriptions and render images for your own posts in notifs 2023-01-17 12:12:17 -06:00
Paul Frazee b9778b7943 Lighten post controls a little in light-mode and add them to the theme 2023-01-17 11:20:07 -06:00
Paul Frazee b574607466 Lighten borders slightly 2023-01-17 11:14:47 -06:00
Paul Frazee 050df83db7 Fix an issue that caused the feed to rearrange on loadmore 2023-01-17 10:58:51 -06:00
Paul Frazee e5ec07b919 Remove duplicate posts caused by reposts 2023-01-17 10:45:37 -06:00
Paul Frazee e11d53b67d Add loading spinners to lightbox views (close #38) 2023-01-17 10:40:09 -06:00
Paul Frazee 4e312d1d24 Shrink the header back down but use bolder title text 2023-01-17 10:32:40 -06:00
Paul Frazee bf1092ad86 Remove scenes (#36)
* Remove scenes from the main menu

* Remove scenes from the profile view

* Remove 'scenes explainer' from onboarding flow

* Remove scene-related modals

* Remove member/membership code

* Remove all scenes-related items from notifications

* Remove scene-related code from posts feed

* Remove scene-related API helpers

* Update tests
2023-01-17 10:11:30 -06:00
João Ferreiro 5abcc8e336 Unit Testing (#35)
* add testing lib

* remove coverage folder from git

* finished basic test setup

* fix tests typescript and import paths

* add first snapshot

* testing utils

* rename test files; update script flags; ++tests

* testing utils functions

* testing downloadAndResize wip

* remove download test

* specify unwanted coverage paths;
remove update snapshots flag

* fix strings tests

* testing downloadAndResize method

* increasing testing

* fixing snapshots wip

* fixed shell mobile snapshot

* adding snapshots for the screens

* fix onboard snapshot

* fix typescript issues

* fix TabsSelector snapshot

* Account for testing device's locale in ago() tests

* Remove platform detection on regex

* mocking store state wip

* mocking store state

* increasing test coverage

* increasing test coverage

* increasing test coverage on src/screens

* src/screens (except for profile) above 80% cov

* testing profile screen wip

* increase coverage on Menu and TabsSelector

* mocking profile ui state wip

* mocking profile ui state wip

* fixing mobileshell tests wip

* snapshots using testing-library

* fixing profile tests wip

* removing mobile shell tests

* src/view/com tests wip

* remove unnecessary patch-package

* fixed profile test error

* clear mocks after every test

* fix base mocked store values (getters)

* fix base mocked store values
(hasLoaded, nonReplyFeed)

* profile screen above 80% coverage

* testing custom hooks

* improving composer coverage

* fix tests after merge

* finishing composer coverage

* improving src/com/discover coverage

* improve src/view/com/login coverage
fix SuggestedFollows tests
adding some comments

* fix SuggestedFollows tests

* improve src/view/com/profile coverage
extra minor fixes

* improve src/view/com/notifications coverage

* update coverage ignore patterns

* rename errorMessageTryAgainButton
increase SuggestedFollows converage

* improve src/view/com/posts coverage

* improve src/view/com/onboard coverage

* update snapshot

* improve src/view/com/post coverage

* improve src/view/com/post-thread coverage
rename ErrorMessage tests
test Debug and Log components

* init testing state

* testing root-store

* updating comments

* small fixes

* removed extra console logs

* improve src/state/models coverage
refactor rootStore
rename some spies

* adding cleanup method after tests

* improve src/state/models coverage

* improve src/state/models coverage

* improve src/state/models coverage

* improve src/state/models coverage

* test setInterval in setupState

* Clean up tests and update Home screen state management

* Remove some tests we dont need

* Remove snapshot tests

* Remove any tests that dont demonstrate clear value

* Cleanup

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-01-17 10:06:00 -06:00
Paul Frazee 11c861d2d3 Remove the avi from the compose prompt 2023-01-16 17:37:18 -06:00
Paul Frazee dac9bc24d1 Enlarge the view header 2023-01-16 17:21:35 -06:00
Paul Frazee 46a8dbdee1 Dark mode color fixes 2023-01-16 17:11:15 -06:00
Paul Frazee 00b7189d5d Readd the FAB for composing new posts 2023-01-16 17:07:33 -06:00
Paul Frazee f7d7c78611 Round the corners on single-image embeds a bit more 2023-01-16 16:58:30 -06:00
Paul Frazee 158945bbf6 More spacing and sizing tweaks, including larger post controls 2023-01-16 16:54:35 -06:00
Paul Frazee 1a69235cf0 Enlarge post text slightly 2023-01-16 16:42:07 -06:00
Paul Frazee 0c9ffd99d8 More spacing fixes, especially for the repost info 2023-01-16 16:34:52 -06:00
Paul Frazee 6d4431b777 Spacing fixes 2023-01-16 16:30:05 -06:00
Paul Frazee c659f0ef9f Fix visual consistency of 'reply to' in post and use display name 2023-01-16 16:24:16 -06:00
Paul Frazee e5e31e5fe2 Fix missing metrics in post threads 2023-01-16 16:22:24 -06:00
Paul Frazee 7f8f53b087 Move menu controls into post footers and improve meta info rendering 2023-01-16 16:09:51 -06:00
Aryan Goharzad 0e85b33276 Readme Cleanup (#40)
* Readme Cleanup

Updates instructions for starting the dev/staging servers

* Update README.md

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2023-01-16 15:40:34 -06:00
Paul Frazee 1b5c347667 Fix: remove duplicates in the TL caused by rendering reply parents 2023-01-16 14:49:58 -06:00
Paul Frazee 29020fbcee Fix image compression for avis and banner images 2023-01-12 15:07:32 -06:00
Paul Frazee 7215da135b Add scrolling to menu 2023-01-03 14:35:33 -06:00
Paul Frazee 429cc1abf1 Bump deps to pull in some bugfixes 2023-01-03 14:31:12 -06:00
Paul Frazee 87a824429c Indicate images in notifications 2023-01-03 13:14:10 -06:00
Paul Frazee b9b0965000 Implement validation and proper type detection 2023-01-03 13:08:56 -06:00
Paul Frazee 1acef14a1c Improve handling around connection failures during login 2023-01-03 12:17:07 -06:00
Paul Frazee 06de0129af Add 'is 13' checkbox to account creation 2023-01-03 11:49:40 -06:00
Paul Frazee 147b85c7fb Fix to feed update 2023-01-03 11:26:51 -06:00
Paul Frazee 42d7dc1c6c Fix session hydration during load 2023-01-03 11:08:39 -06:00
Paul Frazee 08d38c219d Fix bug in error handling 2023-01-03 11:08:29 -06:00
Paul Frazee d262393992 Introduce error boundaries around all screens 2023-01-02 21:49:14 -06:00
Paul Frazee 4eabc2d65a Improve error logging 2023-01-02 21:39:15 -06:00
Paul Frazee 6885fb2b41 Bump api@0.0.5 and use the type guard helpers 2023-01-02 20:56:35 -06:00
Paul Frazee f6a0e634d7 Implement logging system 2023-01-02 17:38:13 -06:00
Paul Frazee 99cec71ed7 Dont mute posts for a user when viewing their profile 2023-01-02 13:45:27 -06:00
Paul Frazee 8cd2b4a721 Implement account muting 2023-01-02 13:40:14 -06:00
Paul Frazee 3972706c54 Fix to loading state 2022-12-30 15:58:28 -06:00
Paul Frazee 8f59957fab Fix the status bar coloring 2022-12-30 15:56:54 -06:00
Paul Frazee a90fd5d26f Add dark mode toggle 2022-12-30 15:48:34 -06:00
Paul Frazee 53267d755b Integrate composer into design system 2022-12-30 15:42:09 -06:00
Paul Frazee 5eddbcea16 Various small fixes 2022-12-30 15:32:07 -06:00
Paul Frazee 3d91cf3137 Integrate search into suggested follows 2022-12-30 15:21:09 -06:00
Paul Frazee a7a310a06b Dont autofocus the search input 2022-12-30 15:12:36 -06:00
Paul Frazee 62c6da3b9f Integrate settings into design system and some various fixes/tweaks 2022-12-30 15:11:47 -06:00
Paul Frazee d952c550ea Integrate menu into design system 2022-12-30 15:08:10 -06:00
Paul Frazee 58a591f314 Integrate notifications into the design system 2022-12-30 13:34:10 -06:00
Paul Frazee 9084e0e4a8 Integrate profile listings into design system 2022-12-30 13:20:55 -06:00
Paul Frazee 10f613475a Update profile header to use design system 2022-12-30 13:13:10 -06:00
Paul Frazee 5e07b5bbc3 Integrate the shell into the design system 2022-12-30 12:49:07 -06:00
Paul Frazee efaf8a54b8 Integrate ViewSelector into design system 2022-12-30 12:40:16 -06:00
Paul Frazee b47714fb11 Integrate composer prompt into design system 2022-12-30 12:35:37 -06:00
Paul Frazee 434d874598 Integrate ViewHeader into the design system 2022-12-30 12:29:11 -06:00
Paul Frazee 55ca7dcce1 Update threads to use design system 2022-12-30 12:19:45 -06:00
Paul Frazee 55500e2f66 Improve image layout 2022-12-30 11:55:25 -06:00
Paul Frazee f609794bd2 Tune post controls 2022-12-28 19:37:30 -06:00
Paul Frazee 607203134e Update posts in feed to use the theming system 2022-12-28 19:20:02 -06:00
Paul Frazee 8f55e3149e Update notifications 2022-12-28 15:53:06 -06:00
Paul Frazee 23e7ae49d4 Tighten up spacing and dividers 2022-12-28 15:50:28 -06:00
Paul Frazee 84e74d5ee4 Fix letter spacing 2022-12-28 15:08:14 -06:00
Paul Frazee 7e31645e9a Add a design system (#34)
* Add theming system

* Add standard Button control and update RadioButtons

* Unify radiobutton with design system

* Update debug screen to have multiple views

* Add ToggleButton

* Update error controls to use design system

* Add typography to <Text> element

* Move DropdownButton into the design system

* Clean out old code

* Move Text into design system

* Add 'inverted' color palette

* Move LoadingPlaceholder into the design system
2022-12-28 14:06:01 -06:00
Paul Frazee cc63660982 Increase image resolutions 2022-12-26 17:41:12 -06:00
Paul Frazee 838fc601c1 Start with highest quality compression and find a suitable size (#33) 2022-12-26 12:01:40 -06:00
Paul Frazee 8652b74a38 Bump @atproto/api@0.0.3 2022-12-22 14:43:54 -06:00
João Ferreiro 7517b65dcd Unit testing (#32)
* add testing lib

* remove coverage folder from git

* finished basic test setup

* fix tests typescript and import paths

* add first snapshot

* testing utils

* rename test files; update script flags; ++tests

* testing utils functions

* testing downloadAndResize wip

* remove download test

* specify unwanted coverage paths;
remove update snapshots flag

* fix strings tests

* testing downloadAndResize method

* increasing testing

* fixing snapshots wip

* fixed shell mobile snapshot

* adding snapshots for the screens

* fix onboard snapshot

* fix typescript issues

* fix TabsSelector snapshot

* Account for testing device's locale in ago() tests

* Remove platform detection on regex

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2022-12-22 09:32:39 -06:00
Paul Frazee 4913a07e33 Unvendor the api and switch to @atproto/api 2022-12-22 09:17:07 -06:00
Paul Frazee 7f4a54ff0d Fix issue which caused parent posts to fail at mobx reactivity 2022-12-21 14:37:22 -06:00
Paul Frazee e7d971410f Update to use new getTimeline, getAuthorFeed, and getPostThread output models 2022-12-20 22:54:56 -06:00
Paul Frazee 4f3bf401da Replace removed hasIndexes behavior 2022-12-20 16:32:04 -06:00
Paul Frazee d83571a59e Get the composer into a passable visual state on android when the keyboard is open 2022-12-20 14:55:50 -06:00
Paul Frazee 297664bfe2 Fix post-meta truncation on android 2022-12-20 14:50:04 -06:00
Paul Frazee 0a2c3e6b51 Fixes to text input colors on android 2022-12-20 14:29:50 -06:00
Paul Frazee abcfc11fe0 Wrap all <Text> in a helper that ensures black color is applied by default 2022-12-20 12:49:44 -06:00
Paul Frazee 74d76fbc6a Use consistent rendering of avis and post metas in threads 2022-12-20 10:33:56 -06:00
Paul Frazee 99a28c0aae Proper fix to the previous panic fix: put threads at the end when they should be there 2022-12-20 09:20:53 -06:00
Paul Frazee 71e4b3d756 Fix to error condition that breaks the feed 2022-12-20 09:02:38 -06:00
Paul Frazee 0401dfc5d3 A couple more android updates 2022-12-19 19:43:28 -06:00
João Ferreiro 19d5496bfc rn-fetch-blob android setup 2022-12-19 19:26:54 -06:00
João Ferreiro 723bad1a28 minor fix 2022-12-19 19:26:54 -06:00
João Ferreiro 469b05c4be fixing remaining text colors on android 2022-12-19 19:25:58 -06:00
João Ferreiro 982f46376b fixing modal & keyboard interaction on android 2022-12-19 19:23:24 -06:00
João Ferreiro 70f4debc0b initial android fixes 2022-12-19 19:20:44 -06:00
João Ferreiro 0a3e7e63b2 fix camera permissions 2022-12-19 19:19:00 -06:00
João Ferreiro affe2c8508 fix android runtime 2022-12-19 19:19:00 -06:00
João Ferreiro 0726350570 fix android build 2022-12-19 19:19:00 -06:00
Paul Frazee 0d7385a41a Remove prefetch of feed (it wasnt working) 2022-12-19 19:16:56 -06:00
Paul Frazee 7b974acc7a Tighten up the post control hit regions 2022-12-19 19:13:26 -06:00
Paul Frazee c9b209c6fd Tighten up the home feed 2022-12-19 19:12:43 -06:00
Paul Frazee 3ae5f2886b Enable image-only posts 2022-12-19 18:51:13 -06:00
Paul Frazee e99eb7bfad Fix to thread ordering in the feed: correctly identify the starts of threads when adjacent 2022-12-19 13:22:18 -06:00
Paul Frazee ae3099dfca Improve thread rendering 2022-12-18 18:54:05 -06:00
Paul Frazee 69b86255c6 Add WIP 'report account' modal 2022-12-18 17:45:23 -06:00
Paul Frazee 66a0f8e848 Add WIP 'report post' modal 2022-12-18 17:28:28 -06:00
Paul Frazee 36dc1c7525 Reduce confusing visual feedback while scrolling 2022-12-18 16:43:18 -06:00
Paul Frazee c3caf4826e Add zooming to the lightbox 2022-12-16 16:32:54 -06:00
Paul Frazee d7e71e079f Prefetch feed refreshes to speed up 'load more posts' 2022-12-16 15:37:13 -06:00
Paul Frazee 4ef3afb604 Fixes to the composer UX around images and scrolling 2022-12-16 14:48:37 -06:00
Paul Frazee 3aded6887d Add swipe gestures to the lightbox 2022-12-16 11:57:45 -06:00
Paul Frazee 3a44a1cfdc Implement 'forgot password' flow 2022-12-15 17:45:03 -06:00
Paul Frazee 0d54f6e126 Split login screen into component files 2022-12-15 14:06:05 -06:00
Paul Frazee 356870ef60 Just do full renders of parent posts in the feed 2022-12-15 11:43:05 -06:00
Paul Frazee c5ac23047a Dont use ??= 2022-12-15 10:21:25 -06:00
Paul Frazee d0a437f8fb Improve handling of connection loss 2022-12-14 16:03:10 -06:00
Paul Frazee 568ff92582 Fix state-tracking 2022-12-14 15:49:45 -06:00
Paul Frazee 7181a75bfb Reset feeds on login 2022-12-14 15:49:38 -06:00
Paul Frazee 9f27af6199 Add haptic feedback to likes and reposts 2022-12-14 15:46:21 -06:00
Paul Frazee 4966b2152e Add post embeds (images and external links) 2022-12-14 15:35:15 -06:00
Paul Frazee 345ec83f26 Move posts feed to root store (me) and ensure new posts always update the feed 2022-12-13 15:52:18 -06:00
Paul Frazee ebfa6e5581 Fix: avoid dup keynames in posts feed 2022-12-13 15:51:54 -06:00
Paul Frazee b5a50478d9 Enlarge feed avis slightly 2022-12-13 15:40:55 -06:00
Paul Frazee 9ad9bc5c0e Ensure load more is always visible 2022-12-13 15:36:05 -06:00
Paul Frazee 135628baf2 Use avatar in viewheader when cant go back 2022-12-13 15:35:45 -06:00
Paul Frazee ac97667206 Fix: avoid duplicate key names in notifications 2022-12-13 15:35:11 -06:00
Paul Frazee 8af8d782c7 Fix issue that caused repost & trend data to get lost on feed updates 2022-12-13 15:17:18 -06:00
Paul Frazee 9a99c9c8c8 Hide main menu drawer on click outside 2022-12-13 15:01:14 -06:00
Paul Frazee e8eb3e131c Use full available screen 2022-12-13 14:58:25 -06:00
Paul Frazee e4ee6e5bb6 Fix: show avatars in all notifications 2022-12-13 14:53:00 -06:00
Paul Frazee 9e1bb898f0 Debug: disable feed reordering to isolate bugs 2022-12-13 11:15:32 -06:00
Paul Frazee e37ac91bee Reposition 'load latest' based on minimal shell mode 2022-12-13 11:15:18 -06:00
Paul Frazee 1aec0ee156 Hide footer on scroll down (minimal shell mode) 2022-12-12 16:04:14 -06:00
Paul Frazee 470f444eed Improvements to service selection during login 2022-12-12 15:13:45 -06:00
Paul Frazee b2239228e7 Add profile image lightbox 2022-12-12 14:54:56 -06:00
Paul Frazee b32bf69be7 Improve session management 2022-12-12 14:39:02 -06:00
Paul Frazee 693d6bfd0a Add banner image upload to profiles 2022-12-12 13:47:18 -06:00
Paul Frazee 22ddfaa2b5 Improvements to 'edit profile' error messages 2022-12-12 13:17:40 -06:00
Paul Frazee 8501cf1c7d Add 'loading more' spinner to feeds 2022-12-12 11:22:54 -06:00
Paul Frazee 2b27be31e6 Tune the swipe gesture to detect more easily 2022-12-12 11:11:37 -06:00
Paul Frazee 03d9fd3179 More aesthetic and perf improvements to the menu drawer 2022-12-12 10:48:36 -06:00
Paul Frazee 5fa3c16d0d Fix duplicate 'end of feed' issue 2022-12-12 09:56:19 -06:00
Paul Frazee 9e5940f0ab Improve aesthetic of main menu swipeout (use screen mask) 2022-12-09 11:46:49 -06:00
Paul Frazee fbf8e5fa14 Add main menu button 2022-12-09 11:22:19 -06:00
Paul Frazee 356297cace Show 'processing' spinner in edit profile modal 2022-12-08 16:08:15 -06:00
Paul Frazee e73c7cee39 Turn the main menu into a 'drawer' instead of a screen in the history 2022-12-08 15:34:22 -06:00
Paul Frazee 53b8f0d040 Switch to temporary 'fixed tabs' model for default and notifications 2022-12-08 14:21:28 -06:00
Paul Frazee 539bf5d350 Add avatar images and fix some type signatures 2022-12-08 13:45:23 -06:00
Paul Frazee 273e6d2973 Replace reanimated for tabs selector 2022-12-07 17:08:49 -06:00
Paul Frazee efbef238a8 Cleanup 2022-12-07 16:59:10 -06:00
Paul Frazee f5d1a5c38d Replace navigational 'back swipe' gesture with new HorzSwipe util 2022-12-07 16:56:14 -06:00
Paul Frazee 9ce02dff5b Add HorzSwipe gesture and integrate it into the ViewSelector 2022-12-07 15:51:06 -06:00
Paul Frazee 79d5708b69 Switch to react-native default animation tools for composer and post controls 2022-12-06 17:43:54 -06:00
Paul Frazee ae522c86fe Fix mention-creation and implement mentions in notifications 2022-12-06 13:47:52 -06:00
Paul Frazee 1a11c13fce Better empty state in profiles 2022-12-06 13:09:18 -06:00
Paul Frazee e042bd33ef Ensure all feed views can refresh 2022-12-06 13:04:40 -06:00
Paul Frazee 588aface7c Add build version to menu 2022-12-06 12:40:40 -06:00
Paul Frazee 246b0e19e1 Add context to replies when appearing in the feed 2022-12-06 12:29:13 -06:00
Paul Frazee d60de5e214 Implement terms-of-service and privacy-policy links in signup 2022-12-06 11:39:46 -06:00
Paul Frazee 5c1519b9ee Update API build 2022-12-06 11:39:30 -06:00
João Ferreiro 84a60592a8 Upload profile image (#29)
* add editable button profile picture

* add editable button cover picture

* upload profile photos (save them locally)

* rollback pbxproj changes

* rollback podfile checksum (for git only)

* move edit photos onto edit profile modal

* adjust edit icon and image cropping size

* added temporary (react state) image

* added IMAGES_ENABLED flag

* minor lint fix

* save local photos on edit profile upload (wip)

* save profile photos on profile view state (wip)

* remove unecessary computed

* save photo in state before pushing it to viewmodel

* refactor profile pictures's state

* remove unnecessary isMe prop

* removing old comments

* tweak icon size & position

* A few styling tweaks and a fix to mobx state management

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2022-12-06 10:57:15 -06:00
Paul Frazee 4cc90b8ac9 Fix to unicode zero-width characters in expanded posts 2022-12-06 10:15:59 -06:00
Paul Frazee 8d3d26134f Never allow undefined values in me model 2022-12-06 10:11:45 -06:00
Paul Frazee 474c4f9b5d Rework the 'main menu' to be a screen that's always in history 2022-12-06 10:11:32 -06:00
Paul Frazee 70cfae56e2 Add missing usage descriptions for ios 2022-12-06 10:08:27 -06:00
Paul Frazee 5821975be6 Enlarge the small emoji-only replies 2022-12-05 15:40:33 -06:00
Paul Frazee 7561b19f3d Dismiss keyboard in search on scroll 2022-12-05 15:22:23 -06:00
Paul Frazee bbe6bf8fc2 Add 'copy post text' tool 2022-12-05 15:03:42 -06:00
Paul Frazee 73c84f6f64 Better sized and more informative character counter 2022-12-05 13:59:13 -06:00
Paul Frazee 39bab0bb08 Switch to System font to fix emoji rendering 2022-12-05 13:44:24 -06:00
Paul Frazee 65e5f2ac86 Fix: never attempt update on 0 items 2022-12-05 13:36:13 -06:00
Paul Frazee 26b2797e2c Increase touch-size of the 'load new posts' button 2022-12-05 13:33:31 -06:00
Paul Frazee f27e32e54c Ensure the UI always renders, even in bad network conditions (close #6) 2022-12-05 13:25:04 -06:00
Paul Frazee 59363181e1 Merge branch 'upload-image' into main 2022-12-05 11:25:33 -06:00
Paul Frazee 5d7c4ddd90 Remove loading-placeholder animation; according to some issues, animated linear-gradients may cause crashes 2022-12-05 10:50:46 -06:00
Paul Frazee 662a4ef23b Fix 'swipe back to nothing' bug 2022-12-05 10:39:34 -06:00
Paul Frazee b08afc12fe Make 'backswipe' a little easier to trigger 2022-12-05 10:25:53 -06:00
Paul Frazee f3f3bfb335 Enlarge click targets for post controls and view header 2022-12-05 10:18:38 -06:00
Paul Frazee 8a43040ec6 Hide images behind a build flag until ready 2022-12-02 10:48:57 -06:00
João Ferreiro 67c4dcff37 Upload image in composer (#27)
* upload images in composer v1

* fix android compile

* reafctor image carousel into new component;
fix photo overlapping text in composer

* revert android changes

* further refactoring code into different components

* move show carousel out of the component

* fixing add photo using camera

* fix typescript issue; force mediatype photo

* change post test with photo attached;
remove auto linking settings

* use runInAction in getPhotos model

* react-hooks/exhaustive-deps fixes

* crop every photo;
make use of useCallback

* moving placeholder condition

* Cleanup

Co-authored-by: Paul Frazee <pfrazee@gmail.com>
2022-12-02 10:41:01 -06:00
Paul Frazee ea27b9ed08 Cleanup 2022-12-02 10:40:22 -06:00
João Ferreiro 90942ae146 moving placeholder condition 2022-11-29 18:32:07 +00:00
João Ferreiro 6ba5d15cb6 crop every photo;
make use of useCallback
2022-11-29 18:26:16 +00:00
João Ferreiro 68e1abf4a9 react-hooks/exhaustive-deps fixes 2022-11-29 17:51:06 +00:00
João Ferreiro 1f16c75121 use runInAction in getPhotos model 2022-11-29 17:46:55 +00:00
João Ferreiro 3b899bfc66 change post test with photo attached;
remove auto linking settings
2022-11-29 16:45:44 +00:00
João Ferreiro 58aa4f0436 Merge branch 'main' into upload-image 2022-11-29 16:19:38 +00:00
João Ferreiro d08e877b3a fix typescript issue; force mediatype photo 2022-11-29 16:19:15 +00:00
João Ferreiro 87d37f9df9 fixing add photo using camera 2022-11-29 16:11:17 +00:00
Paul Frazee 7ae1bac620 Improvements to link and mention detection regarding surrounding punctuation 2022-11-29 10:01:57 -06:00
João Ferreiro 23ea592987 move show carousel out of the component 2022-11-29 16:00:21 +00:00
João Ferreiro dcb361329e Merge branch 'main' into upload-image 2022-11-29 15:36:26 +00:00
João Ferreiro 31be6fbbac further refactoring code into different components 2022-11-29 15:35:49 +00:00
Paul Frazee 2ccbe4f702 Relax the requirement that post entities match their value 2022-11-29 09:35:10 -06:00
Paul Frazee 57f2d1d59f Decode html entities in link embeds 2022-11-29 09:29:57 -06:00
João Ferreiro 0102e91f3a revert android changes 2022-11-29 15:25:32 +00:00
João Ferreiro acfdea2518 reafctor image carousel into new component;
fix photo overlapping text in composer
2022-11-29 10:59:32 +00:00
João Ferreiro 77ea3bfd0a Merge branch 'main' into upload-image 2022-11-29 10:29:19 +00:00
Paul Frazee 88c868dd80 Improve handling of deleted posts 2022-11-28 16:37:39 -06:00
Paul Frazee bf7b0be23d Fixes to edit profile modal 2022-11-28 14:51:49 -06:00
Paul Frazee 39aaa13468 Fix jank in notifications loading-state rendering 2022-11-28 14:22:19 -06:00
Paul Frazee 9051aecdcb Use a persistent notifications model to improve load times of the notifications view 2022-11-28 14:19:49 -06:00
Paul Frazee 1aa1f77049 Improve unread notification styling 2022-11-28 13:56:05 -06:00
Paul Frazee 6ec33dd89f Batch notification loads to avoid layout reflows due to async 2022-11-28 13:45:49 -06:00
João Ferreiro 3ce113f107 fix android compile 2022-11-28 16:56:23 +00:00
João Ferreiro c5f3200d6b Merge branch 'main' into upload-image 2022-11-28 16:56:05 +00:00
João Ferreiro 5ea750599d upload images in composer v1 2022-11-28 16:46:58 +00:00
Paul Frazee b9c9895c45 Slow down and enlarge post-ctrl animations (close #11) 2022-11-28 10:40:25 -06:00
Paul Frazee 0e6237e58c Fix toast positioning (close #9) 2022-11-28 10:38:16 -06:00
Paul Frazee c86ff23757 Set a page-size on notifications 2022-11-28 10:22:52 -06:00
Paul Frazee bcb1ad98de Fix a couple incorrect link detections ('e.g.' and 'foo.jpg') (close #13) 2022-11-28 10:22:08 -06:00
Paul Frazee 8723b51693 Remove the 'warning color' from the character counter 2022-11-28 09:58:40 -06:00
Paul Frazee 490a3bb751 Tune post-thread expanded view: add reply prompt, fix spacing and sizing 2022-11-28 09:49:41 -06:00
Paul Frazee b978a2f18b Enlarge the 'load more posts' prompt 2022-11-28 09:30:31 -06:00
Paul Frazee 1784a4912d Enlarge the view header, left align the title, and add a compose button 2022-11-28 09:29:35 -06:00
Paul Frazee cb5210d24d Update composer to shrink fonts and use more consistent visuals; also autofocus the input 2022-11-28 09:14:04 -06:00
Paul Frazee e3fffac97b Increase information density and enlarge some click targets 2022-11-28 09:13:37 -06:00
Paul Frazee 9c4f62ffeb Fix 'load more' showing up incorrectly 2022-11-28 08:30:34 -06:00
Paul Frazee f5ff0fd274 Add link embeds to posts 2022-11-23 17:01:00 -06:00
Paul Frazee 89638dbd18 Implement a link metadata fetching util function 2022-11-23 16:29:17 -06:00
Paul Frazee eb106a9758 Include reposts in no-replies view of feeds 2022-11-23 16:27:49 -06:00
Paul Frazee 810fcf9910 Remove webcrypto polyfill, as it's no longer needed 2022-11-23 15:04:44 -06:00
Paul Frazee 4eb8bc1249 Detect links in profile bios 2022-11-23 14:53:33 -06:00
Paul Frazee 2b37b6549b Add replying-to context to threads 2022-11-23 14:22:40 -06:00
Paul Frazee a993499890 Ensure threads group together posts by op 2022-11-23 13:45:50 -06:00
Paul Frazee d09bf31431 Disable landscape orientation in iPhones 2022-11-23 13:34:45 -06:00
Paul Frazee 1370353ff6 Fix: Adjust home TL post dedup to ensure polling works correctly 2022-11-23 13:29:26 -06:00
Paul Frazee fbcf0d79d1 Show parent post in composer when replying (close #3) 2022-11-23 13:28:29 -06:00
Paul Frazee 0840c3f8f7 Fix: dont detect double dots as urls 2022-11-23 13:15:38 -06:00
Paul Frazee 67906db720 Fix keyboard issues in search 2022-11-23 13:12:29 -06:00
Paul Frazee 23d98b9557 Turn composer character counter into a countdown 2022-11-23 13:07:09 -06:00
Paul Frazee f41ba844b3 Handle bsky.app links natively 2022-11-23 10:51:20 -06:00
Paul Frazee b4a8da4c27 Longer shortened URLs 2022-11-23 10:44:55 -06:00
Paul Frazee ba837ad9af Add threading to post feeds 2022-11-23 10:39:28 -06:00
Paul Frazee 8da3124f3a Fallback to display name in search results 2022-11-22 16:18:10 -06:00
Paul Frazee 903cce20e7 Implement user search 2022-11-22 16:14:58 -06:00
Paul Frazee 99b50e2fd5 Keep fetching suggestions to reach a full list 2022-11-22 15:53:23 -06:00
Paul Frazee 0f735fc575 Farewell, todos.txt 2022-11-22 14:31:46 -06:00
Paul Frazee e488cf8f44 Add support for links with no scheme in composer 2022-11-22 14:30:35 -06:00
Paul Frazee 1df48d4dad Fix to tests 2022-11-22 14:30:13 -06:00
Paul Frazee ce56d4e34e Shorten rendered URLs in posts 2022-11-22 13:16:40 -06:00
Paul Frazee 27db820a9d Fix to thread reply lines (fill full space) 2022-11-22 13:04:54 -06:00
Paul Frazee 31a4fcc91c Add bottom padding to threads 2022-11-22 12:58:08 -06:00
Paul Frazee d7b1a2e0ee Scroll to highlighted post in threads 2022-11-22 12:56:56 -06:00
Paul Frazee 8f883d00bc Add compose prompt to home feed empty state 2022-11-22 12:29:50 -06:00
Paul Frazee eaa2105570 Add 'posts & replies' view to profiles 2022-11-22 12:26:53 -06:00
Paul Frazee d608d67bfe Turn home button into a 'go back to start of nav history' 2022-11-22 12:19:38 -06:00
Paul Frazee 9ff78bbc43 Change post prompt to 'Whats up?' 2022-11-22 12:16:08 -06:00
Paul Frazee 6e67825eca Shrink and darken the post controls a little 2022-11-22 12:15:26 -06:00
Paul Frazee 79688cd042 Shrink the footer a bit 2022-11-22 12:02:45 -06:00
Paul Frazee c2a39d7c1f Refactor: create src/lib to reflect actual sharing of that code 2022-11-22 12:02:31 -06:00
Paul Frazee e858bb52de Merge branch 'simplify' into main 2022-11-21 18:55:08 -06:00
Paul Frazee b2dba9a15b Track rotated auth tokens 2022-11-21 16:17:40 -06:00
Paul Frazee ed146a582c Add web linking and proper share controls 2022-11-21 16:07:26 -06:00
Paul Frazee 7e487fd5ae Adjust control alignment 2022-11-20 16:29:43 -06:00
Paul Frazee f43b24d405 Fix the pointy edges on the arrow icons 2022-11-20 16:24:44 -06:00
Paul Frazee c6108fb646 Move search btn into the viewheader 2022-11-20 12:25:11 -06:00
Paul Frazee a21bcf10dd Add build flags and disable tabs for now 2022-11-20 12:00:40 -06:00
Paul Frazee 63348807b5 Adjust post control sizing and alignment 2022-11-20 11:45:31 -06:00
Paul Frazee 3a10139064 Remove downvotes from the UI 2022-11-20 11:32:13 -06:00
Paul Frazee 8e3dc52536 Replace the FAB with a compose prompt at the top of the feed 2022-11-20 11:20:08 -06:00
Paul Frazee 39058cd36a Dont group notifications that are an hour apart 2022-11-18 15:38:20 -06:00
Paul Frazee e02b39bf84 Fix data loss on notifications-view update 2022-11-18 14:17:26 -06:00
Paul Frazee fbb9689e4a Dedup posts in the home TL 2022-11-18 14:05:19 -06:00
Paul Frazee 6e2b7a0b90 Add support for web links 2022-11-18 13:59:17 -06:00
Paul Frazee 9d13e05dbf Fix rendering of mentions in composer 2022-11-18 11:55:05 -06:00
Paul Frazee 0ac6c0ff61 Add long press newtab to footer nav 2022-11-18 11:40:12 -06:00
Paul Frazee 368286ad67 Fix richtext link rendering 2022-11-18 11:37:25 -06:00
Paul Frazee 2f9dd131f9 Spacing and sizing fixes 2022-11-18 11:37:12 -06:00
Paul Frazee 5efd0a5b7e Dont autofocus composer to avoid a bug with keyboard avoiding views 2022-11-18 11:10:29 -06:00
Paul Frazee a2a2519e87 Small sizing and spacing tweaks 2022-11-18 11:10:19 -06:00
Paul Frazee 69609d8732 Add min height to post text 2022-11-18 10:58:48 -06:00
Paul Frazee ff68e5b85a Fix avatar click target in posts 2022-11-18 10:48:18 -06:00
Paul Frazee 89e7a99292 Fix post thread title 2022-11-17 16:26:00 -06:00
Paul Frazee ab2e0ab88f Add padding to the bottom of the feed to ensure compose btn doesnt cover it 2022-11-17 16:07:38 -06:00
Paul Frazee a3bca154c4 Improve reliability of screen titles 2022-11-17 16:01:29 -06:00
Paul Frazee b2160ae159 Add new tab animation 2022-11-17 15:44:54 -06:00
Paul Frazee 2b98714548 Add live search to autocomplete and only highlight known handles 2022-11-17 14:35:12 -06:00
Paul Frazee 859087f21d Fix loadLatest() on home feed 2022-11-17 13:17:08 -06:00
Paul Frazee c6b137a153 Fix: correctly set visible on screens 2022-11-17 13:15:04 -06:00
Paul Frazee 8b584c8c09 Improve perf of post rendering 2022-11-17 13:02:53 -06:00
Paul Frazee 5d7f3e1863 Invalidate profiles cache on direct load 2022-11-17 13:01:57 -06:00
Paul Frazee 0d70a09777 Clear session when auth fails 2022-11-17 12:33:59 -06:00
Paul Frazee eae5ac839c Poll periodically for new posts 2022-11-17 12:33:19 -06:00
Paul Frazee f6e591339d Improve coffee 2022-11-17 11:29:35 -06:00
Paul Frazee 6fb4b005fd Add tabs explainer and fix 'black screen' during onboard 2022-11-17 11:21:04 -06:00
Paul Frazee 3a9bb6a98d Lighten the post controls 2022-11-17 11:03:38 -06:00
Paul Frazee 5271718b3b Fix positioning with overflows in the post meta 2022-11-17 10:56:42 -06:00
Paul Frazee 6b715224f2 Include tab count and move btn to center 2022-11-17 10:37:30 -06:00
Paul Frazee b390101106 Open in new tab on long press 2022-11-17 10:36:57 -06:00
Paul Frazee 58d5cb47b7 Avoid overlap against phone header when tabs selector is open 2022-11-17 10:24:40 -06:00
Paul Frazee a0afb8386b Fix header spacing for when dark mode is active 2022-11-17 10:15:48 -06:00
Paul Frazee 362478f793 Show bold icons in footer based on state 2022-11-16 18:04:21 -06:00
Paul Frazee 361789975f Add a fancy 'drawer' animation to the tabs selector 2022-11-16 17:18:16 -06:00
Paul Frazee 284c635330 Add post deletion to highlighted post in threads 2022-11-16 16:18:15 -06:00
Paul Frazee 41ae87e770 Add post deletion 2022-11-16 16:16:43 -06:00
Paul Frazee bd1a4b198e Clear notifications count optimistically 2022-11-16 14:36:16 -06:00
Paul Frazee 92046473f8 Fix composer positioning 2022-11-16 14:33:01 -06:00
Paul Frazee 5bb8751bc1 Fix input positioning for small screens 2022-11-16 14:28:33 -06:00
Paul Frazee 0b7b91d5fd Fix sizing on smaller phones 2022-11-16 14:05:21 -06:00
Paul Frazee fec1589f7c Nicer loading state for profiles 2022-11-16 13:32:10 -06:00
Paul Frazee e9102bcbac Reduce jank in refreshes 2022-11-16 13:18:53 -06:00
Paul Frazee 17825cd611 Add placeholder loading states 2022-11-16 13:05:36 -06:00
Paul Frazee e003f2e3cb Improve reliability of modal close 2022-11-16 12:37:46 -06:00
Paul Frazee fe09567760 Fix up/down vote number changes 2022-11-16 11:02:36 -06:00
Paul Frazee dcf6a49715 Add animations to post controls 2022-11-16 10:58:39 -06:00
Paul Frazee 64d095a96b Update prod service URL 2022-11-16 10:06:57 -06:00
Paul Frazee 4eb993e885 Better invite code error message 2022-11-15 15:13:55 -06:00
Paul Frazee 3725a2eed1 Add a server instance selector and drop env vars 2022-11-15 15:09:50 -06:00
Paul Frazee 9a6df95ade Switch to using setVote() 2022-11-15 13:19:21 -06:00
Paul Frazee 60c72087ff Add current user profile to header and enlarge the header 2022-11-15 13:11:01 -06:00
Paul Frazee ccae52f612 Add compose button to notifications, profile, and search 2022-11-15 13:00:00 -06:00
Paul Frazee fe056a76ea Add missing dep 2022-11-15 12:54:15 -06:00
Paul Frazee b6705fbbaa Improve connectivity-issue error message 2022-11-15 12:54:04 -06:00
Paul Frazee 4ae6fbd3c8 Better loading screens 2022-11-15 12:07:41 -06:00
Paul Frazee e470e3933b Improve empty states 2022-11-15 10:54:43 -06:00
Paul Frazee fb3a43c216 Improve error messages 2022-11-15 10:46:12 -06:00
Paul Frazee 6e93301542 Add profile info caching 2022-11-14 16:56:59 -06:00
Paul Frazee 723dee5704 Disable storing nav state due to bugs 2022-11-14 16:56:40 -06:00
Paul Frazee c98edca116 Add more info to routing 2022-11-14 16:30:06 -06:00
Paul Frazee 700d4e99b9 Restore nav state hydration 2022-11-14 16:28:58 -06:00
Paul Frazee a6e2429a13 Improve not found page 2022-11-14 16:27:59 -06:00
Paul Frazee d7c6fbe11d Use only alphabet in generated avatar 2022-11-14 15:58:21 -06:00
Paul Frazee 9170040acb Update all state on profile change 2022-11-14 15:55:38 -06:00
Paul Frazee 96dc748733 Make 'back swiping' a little easier 2022-11-14 15:47:56 -06:00
Paul Frazee 4a2170be49 Enforce limits on create scene as well 2022-11-14 15:19:08 -06:00
Paul Frazee 4a0b79da4a Fix double-posting bug 2022-11-14 15:10:34 -06:00
Paul Frazee ef071c0915 Fix issue causing double-loads of notifications 2022-11-14 15:02:42 -06:00
Paul Frazee bc9be64a4e Automatically add the domain to the handle during signin 2022-11-14 14:30:59 -06:00
Paul Frazee 23fd43e306 Fix empty states for scene members and memberships 2022-11-14 14:24:23 -06:00
Paul Frazee 829fa175d0 Fix: scroll all the way down on home feed 2022-11-14 14:18:42 -06:00
Paul Frazee 25fdb41948 Fix overflows in post meta info 2022-11-14 14:16:31 -06:00
Paul Frazee d0234784eb Turn off autocorrect and auto-lowercase login handle 2022-11-14 14:01:01 -06:00
Paul Frazee 2271112317 Add link behaviors to search screen suggestions 2022-11-14 13:52:23 -06:00
Paul Frazee 75f801ed71 Dont suggest followed users and add empty state to suggestions 2022-11-14 13:48:57 -06:00
Paul Frazee e5cb141954 Dont include self in suggested follows 2022-11-14 13:42:53 -06:00
Paul Frazee fb3ca42646 Always fallback from displayName to handle 2022-11-14 13:39:10 -06:00
Paul Frazee 12ac6fe52e Turn 'include reason' on posts into a link 2022-11-14 13:36:09 -06:00
Paul Frazee 482ddc9c0d Reposition to handle scene creation keyboard view 2022-11-14 13:32:04 -06:00
Paul Frazee 51c9a51f8c Change appid to xyz.blueskyweb.app 2022-11-14 13:13:08 -06:00
Paul Frazee 837ec8308a Improvements to the feature explainer, including intro screen and screenshot of scenes 2022-11-14 13:12:29 -06:00
Paul Frazee 210082be93 Add staging env 2022-11-11 15:02:19 -06:00
Paul Frazee 38ed9a7943 Implement profile updates 2022-11-11 14:15:43 -06:00
Paul Frazee fe52d19c48 Add UI to remove members from scenes 2022-11-11 13:28:23 -06:00
Paul Frazee 22849fb4fc Implement trending 2022-11-11 13:10:05 -06:00
Paul Frazee 486ce26a91 Handle pending invites correctly 2022-11-11 12:49:53 -06:00
Paul Frazee 72fad215df Disable scene discover btn for now 2022-11-11 10:17:23 -06:00
Paul Frazee 3a0e9f52f3 Only suggest users in invite suggestions 2022-11-11 10:17:14 -06:00
Paul Frazee cc015d1686 Fixes to onboarding 2022-11-10 17:19:45 -06:00
Paul Frazee 0fc8ef3358 Fixes to account creation 2022-11-10 17:05:26 -06:00
Paul Frazee f6b3e5f9e0 Fix follows 2022-11-10 16:35:13 -06:00
Paul Frazee d3707f30e3 Implement scene invitation and membership controls 2022-11-10 16:30:14 -06:00
Paul Frazee ecf56729b0 More informative empty state for scenes 2022-11-09 17:34:55 -06:00
Paul Frazee e7536289cb Add scene creator 2022-11-09 15:57:49 -06:00
Paul Frazee 93b64cf474 Add 'you are a member' line to scene headers and small other tweaks 2022-11-09 13:48:40 -06:00
Paul Frazee 41a18bf32f Add creator to scene profile header 2022-11-09 13:12:03 -06:00
Paul Frazee 0cdfd089f5 Implement scene member/memberships listings 2022-11-08 16:37:21 -06:00
Paul Frazee e6429182a1 Implement scenes listing in main menu 2022-11-08 15:56:22 -06:00
Paul Frazee 1fbc4cf1f2 Finish the upvote/downvote implementation 2022-11-08 12:14:51 -06:00
Paul Frazee e650d98924 Add search view; factor out SuggestedFollows component; add suggested follows to search 2022-11-07 16:24:06 -06:00
Paul Frazee d228a5f4f5 Add onboarding (WIP) 2022-11-07 15:35:51 -06:00
Paul Frazee b4097e25d6 Reuse service address 2022-11-07 11:45:26 -06:00
Paul Frazee ff9161d8e7 Sizing and spacing fixes based on on-device testing 2022-11-05 16:12:06 -05:00
Paul Frazee 5d6ab1f548 Unify profile follow btn colors with the rest 2022-11-05 15:07:28 -05:00
Paul Frazee dd146957e6 Set ios app icon 2022-11-05 14:55:41 -05:00
Paul Frazee 541717d467 Add splash screen to ios 2022-11-05 14:52:44 -05:00
Paul Frazee 2377431901 Rename to bsky.app 2022-11-05 13:56:22 -05:00
Paul Frazee b6f3a234da Replace likes with votes on post UIs 2022-11-05 13:48:45 -05:00
Paul Frazee eb28a12639 More profile header tweaks 2022-11-05 13:02:21 -05:00
Paul Frazee 851ff65d66 Tweak profile header 2022-11-05 12:43:21 -05:00
Paul Frazee 807bd3b834 Switch to procedurally-generated banners 2022-11-05 12:33:59 -05:00
Paul Frazee 60b1c53d85 Add actor types to the profiles and clean up the UI 2022-11-05 11:58:48 -05:00
Paul Frazee 3f730f1173 Update to new textslice 2022-11-04 17:56:48 -05:00
Paul Frazee f333a90fab Update to the latest APIs 2022-11-04 17:39:54 -05:00
Paul Frazee 8ae6e67eea Rework the composer to a less buggy solution 2022-11-01 14:25:41 -05:00
Paul Frazee 05055e184d Remove old tabs selector modal 2022-11-01 14:00:58 -05:00
Paul Frazee 98937dda47 Add animation to the tabs selector 2022-11-01 13:46:07 -05:00
Paul Frazee ae18007d35 Replace notifications icon 2022-11-01 13:45:58 -05:00
Paul Frazee c949269abc Replace footer-nav back and forward arrows with search and notifications 2022-11-01 11:53:30 -05:00
Paul Frazee ab134cac93 Add consistent view headers 2022-11-01 11:06:43 -05:00
Paul Frazee 0fd2c3c4cb Update scene items in mainmenu to use generated avatars 2022-11-01 10:06:24 -05:00
Paul Frazee 6329ab4b08 Improve animation jitter in main menu 2022-11-01 10:02:24 -05:00
Paul Frazee d0b94d7570 Fix typo 2022-10-31 17:24:58 -05:00
Paul Frazee fd6a2b1b40 Switch to autogenerated avis for now 2022-10-31 17:23:47 -05:00
Paul Frazee eceef67d46 WIP scene UIs 2022-10-31 12:17:58 -05:00
Paul Frazee 1ab8285ad3 Fix some useEffect() cleanup issues 2022-10-26 14:48:15 -05:00
Paul Frazee 1983512fef Update to latest APIs 2022-10-26 14:34:47 -05:00
Paul Frazee 349cfe7177 Add contacts screen 2022-10-12 18:56:10 -05:00
Paul Frazee 0c0c9eb05c Update api nsids 2022-10-12 15:18:46 -05:00
Paul Frazee c9388a3cc5 Improve main menu (animation, aesthetics) 2022-10-11 15:16:46 -05:00
Paul Frazee d7a75a2062 Home button scrolls to top when on home page 2022-10-11 09:37:01 -05:00
Paul Frazee 8dc8200f07 Rearrange shell buttons to merge notifications into menu and bring back forward 2022-10-11 09:19:09 -05:00
Paul Frazee a1428ca59a Remove the firehose view from home 2022-10-11 09:18:39 -05:00
Paul Frazee 4143167ab7 Speed up shell nav button presses 2022-10-11 09:18:24 -05:00
Paul Frazee ba6580101e Rework footer controls 2022-10-10 21:13:25 -05:00
Paul Frazee 287f2992fa Rework profile header controls 2022-10-10 21:13:10 -05:00
Paul Frazee f5c4a97eaf Add firehose view to home screen 2022-10-04 14:22:20 -05:00
Paul Frazee 5631c2d2e6 Update to new get*Feed xrpc methods 2022-10-04 12:55:25 -05:00
Paul Frazee 236c908058 Update the view after a post is created 2022-10-04 11:33:32 -05:00
Paul Frazee 0aaa406b17 Implement profile-update api 2022-10-04 11:10:24 -05:00
Paul Frazee bf39791f01 Implement a couple missing bits 2022-10-04 10:53:08 -05:00
Paul Frazee c5ab005908 Fix to mention rendering 2022-10-04 10:26:33 -05:00
Paul Frazee 9f4b5fba4f Choose mention candidates from follows 2022-10-04 10:18:35 -05:00
Paul Frazee 0296e8411e Fixes to entity extraction 2022-10-04 10:15:35 -05:00
Paul Frazee 195d2f7d2b Implement mentions rendering 2022-10-03 16:02:03 -05:00
Paul Frazee 2058505bf1 Fix to auth of mutation ops 2022-10-03 11:17:12 -05:00
Paul Frazee c7d7e152a0 Implement notifications 2022-10-03 10:53:36 -05:00
Paul Frazee b05a334dcb Remove debug time delays 2022-09-30 11:30:18 -05:00
Paul Frazee efa84fb8e7 Fix thread view sizing 2022-09-29 15:17:31 -05:00
Paul Frazee 11f213ad09 Clear all state on signout 2022-09-29 13:55:07 -05:00
Paul Frazee e3e4c4366c Add settings page 2022-09-29 11:59:11 -05:00
Paul Frazee 8ff5f81f24 Light icons 2022-09-29 10:40:05 -05:00
Paul Frazee fc776c2652 Add profile to tabs selector modal 2022-09-29 09:24:36 -05:00
Paul Frazee 44e208f283 More blue theming 2022-09-29 09:11:48 -05:00
Paul Frazee e9f0405555 Beta banner 2022-09-29 09:05:47 -05:00
Paul Frazee a9f9235976 Remove top bar in the shell 2022-09-29 09:05:40 -05:00
Paul Frazee 0312a8132c Swap new tab and share buttons in tabs modal 2022-09-29 09:05:07 -05:00
Paul Frazee 16fbefc354 No visual feedback on FAB to reduce jank 2022-09-29 09:04:49 -05:00
Paul Frazee cb5a575bc8 Fix feed pagination on user profiles 2022-09-28 17:02:55 -05:00
Paul Frazee b4ad0cff4b Add reply information to feed items 2022-09-28 15:36:25 -05:00
Paul Frazee a21a0d2988 Improve thread rendering (show reply lines) 2022-09-28 15:03:16 -05:00
Paul Frazee 9f91edc1d1 Fix to session load 2022-09-28 15:03:02 -05:00
Paul Frazee e6627183e1 Switch to one default avi 2022-09-28 14:00:40 -05:00
Paul Frazee 5909509bea Update api 2022-09-28 13:59:57 -05:00
Paul Frazee ef4b9cf8d9 Add account creation 2022-09-27 14:24:47 -05:00
Paul Frazee c89ec94b17 Remove old auth code 2022-09-27 10:13:12 -05:00
Paul Frazee dd73fc2183 Add logout and tweak signin screen 2022-09-27 08:59:15 -05:00
Paul Frazee 0208302907 Implement signin flow 2022-09-26 21:03:07 -05:00
Paul Frazee 2e352f383e A few client fixes 2022-09-26 13:38:37 -05:00
Paul Frazee a8c8286b88 Implement unfollow, unlike, unrepost 2022-09-23 09:47:21 -05:00
Paul Frazee aabde2b401 Replace mock-api with real api 2022-09-22 19:28:25 -05:00
Paul Frazee 5193a5b48e Add close animation to tabs selector 2022-09-09 16:45:37 -05:00
Paul Frazee 530243859c Replace tabs selector with better solution, also fix some bugs with the modal state 2022-09-09 16:20:46 -05:00
Paul Frazee 2a7c53f307 Reduce the frequency of accidental visual triggers of touchable items 2022-09-09 13:24:44 -05:00
Paul Frazee 46524d85d8 Fix some jank in the navigation swipes 2022-09-09 13:11:30 -05:00
Paul Frazee 639c25821e Disable swipe gestures in view selector for now 2022-09-09 12:10:18 -05:00
Paul Frazee acaa8c5c11 Make view-selector swipes easier to trigger 2022-09-09 11:58:28 -05:00
Paul Frazee e6ebb213cc Make nav swipes easier to trigger 2022-09-09 11:55:53 -05:00
Paul Frazee 46d20cdde8 Allow nav swipes to start from anywhere on the screen 2022-09-09 11:55:31 -05:00
Paul Frazee 44c85bbc56 UI sizing fixes 2022-09-09 11:29:46 -05:00
Paul Frazee effe3d6b59 Rename mobile start-point index.js to avoid build issues 2022-09-09 11:29:22 -05:00
Paul Frazee 35556a84b2 Implement autocomplete UI in composer 2022-09-08 13:39:53 -05:00
Paul Frazee 9010078489 Add EditProfile modal 2022-09-07 16:00:25 -05:00
Paul Frazee 5ae39612d7 Improve navigation gesture and fix caching issue 2022-09-07 14:43:00 -05:00
Paul Frazee 69265753bf Refactor profile to use new ViewSelector element which is reusable and now supports swipe gestures 2022-09-06 22:34:31 -05:00
Paul Frazee 4974f97bf3 Add 'swipe to go back' gesture 2022-09-06 17:29:26 -05:00
Paul Frazee bb06ef4f6e Rework profile page to include working view selector 2022-09-06 14:26:39 -05:00
Paul Frazee 2ec09ba545 Rework profile header 2022-09-05 16:57:20 -05:00
Paul Frazee cb310ab1c1 Rewrite the post composer as a modal 2022-09-05 14:16:48 -05:00
Paul Frazee 41bbe2b60b Add post dropdown menus 2022-09-02 15:43:10 -05:00
Paul Frazee cdae685ee1 Move SharePost modal to new system 2022-09-02 12:17:33 -05:00
Paul Frazee 2f0939a1c2 Implement consistent Link component 2022-09-02 11:52:33 -05:00
Paul Frazee 6835caa760 Add more robust modals controller 2022-09-02 11:51:46 -05:00
Paul Frazee 8de3b066eb Rename location-menu to location-navigator and add an actual location-menu 2022-09-02 09:55:52 -05:00
Paul Frazee 62a4e9aed1 Add accounts menu to shell 2022-09-02 09:30:21 -05:00
Paul Frazee 156a6a100f Add location 'menu' 2022-09-01 16:06:09 -05:00
Paul Frazee 5f48cb5e27 Fix bug in selection of screens to cache 2022-09-01 13:30:57 -05:00
Paul Frazee bb51af5ae9 Implement working screen-state management and remove extraneous loads 2022-09-01 12:00:08 -05:00
Paul Frazee 346385ce43 Fix screen-blanking bug 2022-09-01 10:58:29 -05:00
Paul Frazee 71594d069c Update post thread aesthetics 2022-08-31 21:02:12 -05:00
Paul Frazee 6bec139679 Add avi and context menu to shell topbar 2022-08-31 20:43:36 -05:00
Paul Frazee b3b2cfe909 Add composer FAB to home page 2022-08-31 20:09:58 -05:00
Paul Frazee 4aa8a58f27 Aesthetic improvements 2022-08-31 20:09:47 -05:00
Paul Frazee b4802c6b5b Unify the color palette 2022-08-31 17:06:44 -05:00
Paul Frazee 97f52b6a03 New navigation model (#1)
* Flatten all routing into a single stack

* Replace router with custom implementation

* Add shell header and titles

* Add tab selector

* Add back/forward history menus on longpress

* Fix: don't modify state during render

* Add refresh() to navigation and reroute navigations to the current location to refresh instead of add to history

* Cache screens during navigation to maintain scroll position and improve load-time for renders
2022-08-31 14:36:50 -05:00
924 changed files with 88275 additions and 35917 deletions
+86
View File
@@ -0,0 +1,86 @@
/** @type {Detox.DetoxConfig} */
module.exports = {
testRunner: {
args: {
$0: 'jest',
config: '__e2e__/jest.config.js',
},
jest: {
setupTimeout: 120000,
},
},
apps: {
'ios.debug': {
type: 'ios.app',
binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/bluesky.app',
build:
'xcodebuild -workspace ios/Bluesky.xcworkspace -scheme Bluesky -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build',
},
'ios.release': {
type: 'ios.app',
binaryPath:
'ios/build/Build/Products/Release-iphonesimulator/bluesky.app',
build:
'xcodebuild -workspace ios/Bluesky.xcworkspace -scheme Bluesky -configuration Release -sdk iphonesimulator -derivedDataPath ios/build',
},
'android.debug': {
type: 'android.apk',
binaryPath: 'android/app/build/outputs/apk/debug/app-debug.apk',
build:
'cd android ; ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug ; cd -',
reversePorts: [8081],
},
'android.release': {
type: 'android.apk',
binaryPath: 'android/app/build/outputs/apk/release/app-release.apk',
build:
'cd android ; ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release ; cd -',
},
},
devices: {
simulator: {
type: 'ios.simulator',
device: {
type: 'iPhone 15 Pro',
},
},
attached: {
type: 'android.attached',
device: {
adbName: '.*',
},
},
emulator: {
type: 'android.emulator',
device: {
avdName: 'Pixel_3a_API_30_x86',
},
},
},
configurations: {
'ios.sim.debug': {
device: 'simulator',
app: 'ios.debug',
},
'ios.sim.release': {
device: 'simulator',
app: 'ios.release',
},
'android.att.debug': {
device: 'attached',
app: 'android.debug',
},
'android.att.release': {
device: 'attached',
app: 'android.release',
},
'android.emu.debug': {
device: 'emulator',
app: 'android.debug',
},
'android.emu.release': {
device: 'emulator',
app: 'android.release',
},
},
}
+102
View File
@@ -0,0 +1,102 @@
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/
npm-debug.log
yarn-error.log
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/
*/fastlane/report.xml
*/fastlane/Preview.html
*/fastlane/screenshots
# Bundle artifact
*.jsbundle
# Ruby / CocoaPods
/ios/Pods/
/vendor/bundle/
# Testing
coverage/
junit.xml
artifacts
# Web bundle outputs
/dist/
# Expo
.expo/
dist/
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
# VSCode
.vscode
# gitignore and github actions
!.gitignore
!.github
# Android & iOS folders
android/
ios/
# environment variables
.env
.env.*
# Firebase (Android) Google services
# INCLUDED: google-services.json
+3
View File
@@ -0,0 +1,3 @@
SENTRY_AUTH_TOKEN=
EXPO_PUBLIC_LOG_LEVEL=debug
EXPO_PUBLIC_LOG_DEBUG=
+28 -13
View File
@@ -1,17 +1,32 @@
module.exports = {
root: true,
extends: '@react-native-community',
parser: '@typescript-eslint/parser',
// plugins: ['@typescript-eslint'],
overrides: [
{
files: ['*.js', '*.mjs', '*.ts', '*.tsx'],
rules: {
'@typescript-eslint/no-shadow': 'off',
'no-shadow': 'off',
'no-undef': 'off',
semi: [2, 'never'],
},
},
extends: [
'@react-native-community',
'plugin:react/recommended',
'plugin:react-native-a11y/ios',
'prettier',
],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint', 'detox', 'react'],
rules: {
'react/no-unescaped-entities': 0,
'react-native/no-inline-styles': 0,
},
ignorePatterns: [
'**/__mocks__/*.ts',
'src/platform/polyfills.ts',
'src/third-party',
'ios',
'android',
'coverage',
'*.lock',
'.husky',
'patches',
'bskyweb',
'*.html',
'bskyweb',
],
settings: {
componentWrapperFunctions: ['observer'],
},
}
+35
View File
@@ -0,0 +1,35 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
<!-- A clear and concise description of what the bug is. -->
**To Reproduce**
Steps to reproduce the behavior:
1.
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
**Details**
- Platform: <!-- desktop chrome windows, mobile safari, iOS, Android -->
- Platform version:
- App version:
**Additional context**
<!-- Add any other context about the problem here. -->
+24
View File
@@ -0,0 +1,24 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature-request
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->
@@ -0,0 +1,55 @@
name: build-and-push-bskyweb-aws
on:
push:
branches:
- main
- jake/bskyweb-additions
env:
REGISTRY: ${{ secrets.AWS_ECR_REGISTRY_USEAST2_PACKAGES_REGISTRY }}
USERNAME: ${{ secrets.AWS_ECR_REGISTRY_USEAST2_PACKAGES_USERNAME }}
PASSWORD: ${{ secrets.AWS_ECR_REGISTRY_USEAST2_PACKAGES_PASSWORD }}
IMAGE_NAME: bskyweb
jobs:
bskyweb-container-aws:
if: github.repository == 'bluesky-social/social-app'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v1
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ env.USERNAME}}
password: ${{ env.PASSWORD }}
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v4
with:
images: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=sha,enable=true,priority=100,prefix=,suffix=,format=long
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
file: ./Dockerfile
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
@@ -0,0 +1,57 @@
name: build-and-push-bskyweb-ghcr
on:
push:
branches:
- main
- jake/bskyweb-additions
env:
REGISTRY: ghcr.io
USERNAME: ${{ github.actor }}
PASSWORD: ${{ secrets.GITHUB_TOKEN }}
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}
jobs:
bskyweb-container-ghcr:
if: github.repository == 'bluesky-social/social-app'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v1
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ env.USERNAME }}
password: ${{ env.PASSWORD }}
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v4
with:
images: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=sha,enable=true,priority=100,prefix=bskyweb:,suffix=,format=long
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
file: ./Dockerfile
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
+43
View File
@@ -0,0 +1,43 @@
name: golang
on:
pull_request:
push:
branches:
- main
concurrency:
group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}'
cancel-in-progress: true
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Git Checkout
uses: actions/checkout@v3
- name: Set up Go tooling
uses: actions/setup-go@v3
with:
go-version: '1.21'
- name: Dummy JS File
run: touch bskyweb/static/js/blah.js
- name: Check
run: cd bskyweb/ && make check
- name: Build (binary)
run: cd bskyweb/ && make build
- name: Test
run: cd bskyweb/ && make test
lint:
runs-on: ubuntu-latest
steps:
- name: Git Checkout
uses: actions/checkout@v3
- name: Set up Go tooling
uses: actions/setup-go@v3
with:
go-version: '1.21'
- name: Dummy JS File
run: touch bskyweb/static/js/blah.js
- name: Lint
run: cd bskyweb/ && make lint
+39
View File
@@ -0,0 +1,39 @@
name: Lint
on:
pull_request:
push:
branches:
- main
concurrency:
group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}'
cancel-in-progress: true
jobs:
linting:
name: Run linters
runs-on: ubuntu-latest
steps:
- name: Check out Git repository
uses: actions/checkout@v3
- name: Yarn install
run: yarn --frozen-lockfile
- name: Lint check
run: yarn lint
- name: Type check
run: yarn typecheck
testing:
name: Run tests
runs-on: ubuntu-latest
steps:
- name: Install node 18
uses: actions/setup-node@v3
with:
node-version: 18
- name: Check out Git repository
uses: actions/checkout@v3
- name: Yarn install
run: yarn --frozen-lockfile
- name: Run tests
run: |
yarn test --forceExit
+44
View File
@@ -59,3 +59,47 @@ buck-out/
# Ruby / CocoaPods
/ios/Pods/
/vendor/bundle/
# Testing
coverage/
junit.xml
artifacts
# Web bundle outputs
/dist/
# Expo
.expo/
dist/
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
# VSCode
.vscode
# gitignore and github actions
!.gitignore
!.github
# Android & iOS folders
android/
ios/
# environment variables
.env
.env.*
# Firebase (Android) Google services
google-services.json
# Performance results (Flashlight)
.perf/
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
yarn lint-staged
+12
View File
@@ -0,0 +1,12 @@
ios
android
src/third-party
src/app.json
public
/bskyweb/templates
/dist/
/.watchmanconfig
/app.json
web/index.html
web-build/*
+1 -1
View File
@@ -1 +1 @@
2.7.4
2.7.6
+73
View File
@@ -0,0 +1,73 @@
FROM golang:1.21-bullseye AS build-env
WORKDIR /usr/src/social-app
ENV DEBIAN_FRONTEND=noninteractive
# Node
ENV NODE_VERSION=18
ENV NVM_DIR=/usr/share/nvm
# Go
ENV GODEBUG="netdns=go"
ENV GOOS="linux"
ENV GOARCH="amd64"
ENV CGO_ENABLED=1
ENV GOEXPERIMENT="loopvar"
COPY . .
#
# Generate the JavaScript webpack.
#
RUN mkdir --parents $NVM_DIR && \
wget \
--output-document=/tmp/nvm-install.sh \
https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh && \
bash /tmp/nvm-install.sh
RUN \. "$NVM_DIR/nvm.sh" && \
nvm install $NODE_VERSION && \
nvm use $NODE_VERSION && \
npm install --global yarn && \
yarn && \
yarn build-web
# DEBUG
RUN find ./bskyweb/static && find ./web-build/static
#
# Generate the bskyweb Go binary.
#
RUN cd bskyweb/ && \
go mod download && \
go mod verify
RUN cd bskyweb/ && \
go build \
-v \
-trimpath \
-tags timetzdata \
-o /bskyweb \
./cmd/bskyweb
FROM debian:bullseye-slim
ENV GODEBUG=netdns=go
ENV TZ=Etc/UTC
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install --yes \
dumb-init \
ca-certificates
ENTRYPOINT ["dumb-init", "--"]
WORKDIR /bskyweb
COPY --from=build-env /bskyweb /usr/bin/bskyweb
CMD ["/usr/bin/bskyweb"]
LABEL org.opencontainers.image.source=https://github.com/bluesky-social/social-app
LABEL org.opencontainers.image.description="bsky.app Web App"
LABEL org.opencontainers.image.licenses=MIT
+2 -2
View File
@@ -1,6 +1,6 @@
source 'https://rubygems.org'
# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version
ruby '2.7.4'
ruby File.read(File.join(__dir__, '.ruby-version')).strip
gem 'cocoapods', '~> 1.11', '>= 1.11.2'
gem 'cocoapods', '~> 1.11', '>= 1.11.3'
+7
View File
@@ -0,0 +1,7 @@
Copyright 2023 Bluesky PBC
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+35
View File
@@ -0,0 +1,35 @@
SHELL = /bin/bash
.SHELLFLAGS = -o pipefail -c
.PHONY: help
help: ## Print info about all commands
@echo "Commands:"
@echo
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[01;32m%-20s\033[0m %s\n", $$1, $$2}'
.PHONY: build-web
build-web: ## Compile web bundle, copy to bskyweb directory
yarn build-web
.PHONY: test
test: ## Run all tests
yarn test
.PHONY: lint
lint: ## Run style checks and verify syntax
yarn run lint
#.PHONY: fmt
#fmt: ## Run syntax re-formatting
# yarn prettier
.PHONY: deps
deps: ## Installs dependent libs using 'yarn install'
yarn install --frozen-lockfile
.PHONY: nvm-setup
nvm-setup: ## Use NVM to install and activate node+yarn
nvm install 18
nvm use 18
npm install --global yarn
+67 -30
View File
@@ -1,39 +1,76 @@
# Social App
# Bluesky Social App
In-progress social app.
Welcome friends! This is the codebase for the Bluesky Social app.
Uses:
Get the app itself:
- [React Native](https://reactnative.dev)
- [React Native for Web](https://necolas.github.io/react-native-web/)
- [React Navigation](https://reactnative.dev/docs/navigation#react-navigation)
- [MobX](https://mobx.js.org/README.html)
- [Async Storage](https://github.com/react-native-async-storage/async-storage)
- **Web: [bsky.app](https://bsky.app)**
- **iOS: [App Store](https://apps.apple.com/us/app/bluesky-social/id6444370199)**
- **Android: [Play Store](https://play.google.com/store/apps/details?id=xyz.blueskyweb.app&hl=en_US&gl=US)**
## Build instructions
## Development Resources
- Setup your environment [using the react native instructions](https://reactnative.dev/docs/environment-setup).
- After initial setup:
- `cd ios ; pod install`
- Start the dev servers
- `yarn dev-pds`
- `yarn dev-wallet`
- Run the dev app
- iOS: `yarn ios`
- Android: `yarn android`
- Web: `yarn web`
- Tips
- `npx react-native info` Checks what has been installed.
- On M1 macs, [you need to exclude "arm64" from the target architectures](https://stackoverflow.com/a/65399525)
- Annoyingly this must be re-set via XCode after every pod install
- The android simulator won't be able to access localhost services unless you run `adb reverse tcp:{PORT} tcp:{PORT}`
- For instance, the localhosted dev-wallet will need `adb reverse tcp:3001 tcp:3001`
- For some reason, the typescript compiler chokes on platform-specific files (e.g. `foo.native.ts`) but only when compiling for Web thus far. Therefore we always have one version of the file which doesn't use a platform specifier, and that should bee the Web version. ([More info](https://stackoverflow.com/questions/44001050/platform-specific-import-component-in-react-native-with-typescript).)
This is a [React Native](https://reactnative.dev/) application, written in the TypeScript programming language. It builds on the `atproto` TypeScript packages (like [`@atproto/api`](https://www.npmjs.com/package/@atproto/api)), code for which is also on open source, but in [a different git repository](https://github.com/bluesky-social/atproto).
## Various notes
There is a small amount of Go language source code (in `./bskyweb/`), for a web service that returns the React Native Web application.
### Polyfills
The [Build Instructions](./docs/build.md) are a good place to get started with the app itself.
`./platform/polyfills.*.ts` adds polyfills to the environment. Currently this includes:
The Authenticated Transfer Protocol ("AT Protocol" or "atproto") is a decentralized social media protocol. You don't *need* to understand AT Protocol to work with this application, but it can help. Learn more at:
- TextEncoder / TextDecoder
- [Overview and Guides](https://atproto.com/guides/overview)
- [Github Discussions](https://github.com/bluesky-social/atproto/discussions) 👈 Great place to ask questions
- [Protocol Specifications](https://atproto.com/specs/atp)
- [Blogpost on self-authenticating data structures](https://blueskyweb.xyz/blog/3-6-2022-a-self-authenticating-social-protocol)
The Bluesky Social application encompasses a set of schemas and APIs built in the overall AT Protocol framework. The namespace for these "Lexicons" is `app.bsky.*`.
## Contributions
> While we do accept contributions, we prioritize high quality issues and pull requests. Adhering to the below guidelines will ensure a more timely review.
**Rules:**
- We may not respond to your issue or PR.
- We may close an issue or PR without much feedback.
- We may lock discussions or contributions if our attention is getting DDOSed.
- We're not going to provide support for build issues.
**Guidelines:**
- Check for existing issues before filing a new one please.
- Open an issue and give some time for discussion before submitting a PR.
- Stay away from PRs like...
- Changing "Post" to "Skeet."
- Refactoring the codebase, eg to replace mobx with redux or something.
- Adding entirely new features without prior discussion.
Remember, we serve a wide community of users. Our day to day involves us constantly asking "which top priority is our top priority." If you submit well-written PRs that solve problems concisely, that's an awesome contribution. Otherwise, as much as we'd love to accept your ideas and contributions, we really don't have the bandwidth. That's what forking is for!
## Forking guidelines
You have our blessing 🪄✨ to fork this application! However, it's very important to be clear to users when you're giving them a fork.
Please be sure to:
- Change all branding in the repository and UI to clearly differentiate from Bluesky.
- Change any support links (feedback, email, terms of service, etc) to your own systems.
- Replace any analytics or error-collection systems with your own so we don't get super confused.
## Security disclosures
If you discover any security issues, please send an email to security@bsky.app. The email is automatically CCed to the entire team and we'll respond promptly.
## Are you a developer interested in building on atproto?
Bluesky is an open social network built on the AT Protocol, a flexible technology that will never lock developers out of the ecosystems that they help build. With atproto, third-party can be as seamless as first-party through custom feeds, federated services, clients, and more.
If you're a developer interested in building on atproto, we'd love to email you a Bluesky invite code. Simply share your GitHub (or similar) profile with us via [this form](https://forms.gle/BF21oxVNZiDjDhXF9).
## License (MIT)
See [./LICENSE](./LICENSE) for the full license.
## P.S.
We ❤️ you and all of the ways you support us. Thank you for making Bluesky a great place!
+12
View File
@@ -0,0 +1,12 @@
/** @type {import('@jest/types').Config.InitialOptions} */
module.exports = {
rootDir: '..',
testMatch: ['<rootDir>/__e2e__/**/*.test.ts'],
testTimeout: 120000,
maxWorkers: 1,
globalSetup: 'detox/runners/jest/globalSetup',
globalTeardown: 'detox/runners/jest/globalTeardown',
reporters: ['detox/runners/jest/reporter'],
testEnvironment: 'detox/runners/jest/testEnvironment',
verbose: true,
}
+77
View File
@@ -0,0 +1,77 @@
# flow.yaml
appId: xyz.blueskyweb.app
---
- launchApp
# Login
# - runFlow:
# when:
# - tapOn: "Sign In"
# - tapOn: "Username or email address"
# - inputText: "ansh.bsky.team"
# - tapOn: "Password"
# - inputText: "PASSWORd"
# - tapOn: "Next"
# Allow notifications if popup is visible
# - runFlow:
# when:
# visible: "Notifications"
# commands:
# - tapOn: "Allow"
# Scroll in main feed
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
# Swipe between feeds
- swipe:
direction: "LEFT"
- swipe:
direction: "LEFT"
- swipe:
direction: "LEFT"
- swipe:
direction: "RIGHT"
- swipe:
direction: "RIGHT"
- swipe:
direction: "RIGHT"
# Go to Notifications
- tapOn:
id: "viewHeaderDrawerBtn"
- tapOn: "Notifications"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- swipe:
direction: "DOWN" # Make header visible
# Go to Feeds tab
- tapOn:
id: "viewHeaderDrawerBtn"
- tapOn: "Feeds"
- scrollUntilVisible:
element: "Discover"
direction: UP
- tapOn: "Discover"
- waitForAnimationToEnd
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
# Click on post
- tapOn:
id: "postText"
index: 0
- "scroll"
- "scroll"
- "scroll"
- "scroll"
- "scroll"
+519
View File
@@ -0,0 +1,519 @@
import {createServer as createHTTPServer} from 'node:http'
import {parse} from 'node:url'
import {createServer, TestPDS} from '../jest/test-pds'
async function main() {
let server: TestPDS
createHTTPServer(async (req, res) => {
const url = parse(req.url || '/', true)
if (req.method !== 'POST') {
return res.writeHead(200).end()
}
try {
console.log('Closing old server')
await server?.close()
console.log('Starting new server')
const inviteRequired = url?.query && 'invite' in url.query
server = await createServer({inviteRequired})
console.log('Listening at', server.pdsUrl)
if (url?.query) {
if ('users' in url.query) {
console.log('Generating mock users')
await server.mocker.createUser('alice')
await server.mocker.createUser('bob')
await server.mocker.createUser('carla')
await server.mocker.users.alice.agent.upsertProfile(() => ({
displayName: 'Alice',
description: 'Test user 1',
}))
await server.mocker.users.bob.agent.upsertProfile(() => ({
displayName: 'Bob',
description: 'Test user 2',
}))
await server.mocker.users.carla.agent.upsertProfile(() => ({
displayName: 'Carla',
description: 'Test user 3',
}))
if (inviteRequired) {
await server.mocker.createInvite(server.mocker.users.alice.did)
}
}
if ('follows' in url.query) {
console.log('Generating mock follows')
await server.mocker.follow('alice', 'bob')
await server.mocker.follow('alice', 'carla')
await server.mocker.follow('bob', 'alice')
await server.mocker.follow('bob', 'carla')
await server.mocker.follow('carla', 'alice')
await server.mocker.follow('carla', 'bob')
}
if ('posts' in url.query) {
console.log('Generating mock posts')
for (let user in server.mocker.users) {
await server.mocker.users[user].agent.post({text: 'Post'})
}
}
if ('feeds' in url.query) {
console.log('Generating mock feed')
await server.mocker.createFeed('alice', 'alice-favs', [])
}
if ('thread' in url.query) {
console.log('Generating mock posts')
const res = await server.mocker.users.bob.agent.post({
text: 'Thread root',
})
await server.mocker.users.carla.agent.post({
text: 'Thread reply',
reply: {
parent: {cid: res.cid, uri: res.uri},
root: {cid: res.cid, uri: res.uri},
},
})
}
if ('mergefeed' in url.query) {
console.log('Generating mock users')
await server.mocker.createUser('alice')
await server.mocker.createUser('bob')
await server.mocker.createUser('carla')
await server.mocker.createUser('dan')
await server.mocker.users.alice.agent.upsertProfile(() => ({
displayName: 'Alice',
description: 'Test user 1',
}))
await server.mocker.users.bob.agent.upsertProfile(() => ({
displayName: 'Bob',
description: 'Test user 2',
}))
await server.mocker.users.carla.agent.upsertProfile(() => ({
displayName: 'Carla',
description: 'Test user 3',
}))
await server.mocker.users.dan.agent.upsertProfile(() => ({
displayName: 'Dan',
description: 'Test user 4',
}))
console.log('Generating mock follows')
await server.mocker.follow('alice', 'bob')
await server.mocker.follow('alice', 'carla')
console.log('Generating mock posts')
let posts: Record<string, any[]> = {
alice: [],
bob: [],
carla: [],
dan: [],
}
for (let i = 0; i < 10; i++) {
for (let user in server.mocker.users) {
if (user === 'alice') continue
posts[user].push(
await server.mocker.createPost(user, `Post ${i}`),
)
}
}
for (let i = 0; i < 10; i++) {
for (let user in server.mocker.users) {
if (user === 'alice') continue
if (i % 5 === 0) {
await server.mocker.createReply(user, 'Self reply', {
cid: posts[user][i].cid,
uri: posts[user][i].uri,
})
}
if (i % 5 === 1) {
await server.mocker.createReply(user, 'Reply to bob', {
cid: posts.bob[i].cid,
uri: posts.bob[i].uri,
})
}
if (i % 5 === 2) {
await server.mocker.createReply(user, 'Reply to dan', {
cid: posts.dan[i].cid,
uri: posts.dan[i].uri,
})
}
await server.mocker.users[user].agent.post({text: `Post ${i}`})
}
}
console.log('Generating mock feeds')
await server.mocker.createFeed(
'alice',
'alice-favs',
posts.dan.map(p => p.uri),
)
await server.mocker.createFeed(
'alice',
'alice-favs2',
posts.dan.map(p => p.uri),
)
}
if ('labels' in url.query) {
console.log('Generating naughty users with labels')
const anchorPost = await server.mocker.createPost(
'alice',
'Anchor post',
)
for (const user of [
'dmca-account',
'dmca-profile',
'dmca-posts',
'porn-account',
'porn-profile',
'porn-posts',
'nudity-account',
'nudity-profile',
'nudity-posts',
'scam-account',
'scam-profile',
'scam-posts',
'unknown-account',
'unknown-profile',
'unknown-posts',
'hide-account',
'hide-profile',
'hide-posts',
'no-promote-account',
'no-promote-profile',
'no-promote-posts',
'warn-account',
'warn-profile',
'warn-posts',
'muted-account',
'muted-by-list-account',
'blocking-account',
'blockedby-account',
'mutual-block-account',
]) {
await server.mocker.createUser(user)
await server.mocker.follow('alice', user)
await server.mocker.follow(user, 'alice')
await server.mocker.createPost(user, `Unlabeled post from ${user}`)
await server.mocker.createReply(
user,
`Unlabeled reply from ${user}`,
anchorPost,
)
await server.mocker.like(user, anchorPost)
}
await server.mocker.labelAccount('dmca-violation', 'dmca-account')
await server.mocker.labelProfile('dmca-violation', 'dmca-profile')
await server.mocker.labelPost(
'dmca-violation',
await server.mocker.createPost('dmca-posts', 'dmca post'),
)
await server.mocker.labelPost(
'dmca-violation',
await server.mocker.createQuotePost(
'dmca-posts',
'dmca quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'dmca-violation',
await server.mocker.createReply(
'dmca-posts',
'dmca reply',
anchorPost,
),
)
await server.mocker.labelAccount('porn', 'porn-account')
await server.mocker.labelProfile('porn', 'porn-profile')
await server.mocker.labelPost(
'porn',
await server.mocker.createImagePost('porn-posts', 'porn post'),
)
await server.mocker.labelPost(
'porn',
await server.mocker.createQuotePost(
'porn-posts',
'porn quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'porn',
await server.mocker.createReply(
'porn-posts',
'porn reply',
anchorPost,
),
)
await server.mocker.labelAccount('nudity', 'nudity-account')
await server.mocker.labelProfile('nudity', 'nudity-profile')
await server.mocker.labelPost(
'nudity',
await server.mocker.createImagePost('nudity-posts', 'nudity post'),
)
await server.mocker.labelPost(
'nudity',
await server.mocker.createQuotePost(
'nudity-posts',
'nudity quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'nudity',
await server.mocker.createReply(
'nudity-posts',
'nudity reply',
anchorPost,
),
)
await server.mocker.labelAccount('scam', 'scam-account')
await server.mocker.labelProfile('scam', 'scam-profile')
await server.mocker.labelPost(
'scam',
await server.mocker.createPost('scam-posts', 'scam post'),
)
await server.mocker.labelPost(
'scam',
await server.mocker.createQuotePost(
'scam-posts',
'scam quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'scam',
await server.mocker.createReply(
'scam-posts',
'scam reply',
anchorPost,
),
)
await server.mocker.labelAccount(
'not-a-real-label',
'unknown-account',
)
await server.mocker.labelProfile(
'not-a-real-label',
'unknown-profile',
)
await server.mocker.labelPost(
'not-a-real-label',
await server.mocker.createPost('unknown-posts', 'unknown post'),
)
await server.mocker.labelPost(
'not-a-real-label',
await server.mocker.createQuotePost(
'unknown-posts',
'unknown quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'not-a-real-label',
await server.mocker.createReply(
'unknown-posts',
'unknown reply',
anchorPost,
),
)
await server.mocker.labelAccount('!hide', 'hide-account')
await server.mocker.labelProfile('!hide', 'hide-profile')
await server.mocker.labelPost(
'!hide',
await server.mocker.createPost('hide-posts', 'hide post'),
)
await server.mocker.labelPost(
'!hide',
await server.mocker.createQuotePost(
'hide-posts',
'hide quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'!hide',
await server.mocker.createReply(
'hide-posts',
'hide reply',
anchorPost,
),
)
await server.mocker.labelAccount('!no-promote', 'no-promote-account')
await server.mocker.labelProfile('!no-promote', 'no-promote-profile')
await server.mocker.labelPost(
'!no-promote',
await server.mocker.createPost(
'no-promote-posts',
'no-promote post',
),
)
await server.mocker.labelPost(
'!no-promote',
await server.mocker.createQuotePost(
'no-promote-posts',
'no-promote quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'!no-promote',
await server.mocker.createReply(
'no-promote-posts',
'no-promote reply',
anchorPost,
),
)
await server.mocker.labelAccount('!warn', 'warn-account')
await server.mocker.labelProfile('!warn', 'warn-profile')
await server.mocker.labelPost(
'!warn',
await server.mocker.createPost('warn-posts', 'warn post'),
)
await server.mocker.labelPost(
'!warn',
await server.mocker.createQuotePost(
'warn-posts',
'warn quote post',
anchorPost,
),
)
await server.mocker.labelPost(
'!warn',
await server.mocker.createReply(
'warn-posts',
'warn reply',
anchorPost,
),
)
await server.mocker.users.alice.agent.mute('muted-account.test')
await server.mocker.createPost('muted-account', 'muted post')
await server.mocker.createQuotePost(
'muted-account',
'muted quote post',
anchorPost,
)
await server.mocker.createReply(
'muted-account',
'muted reply',
anchorPost,
)
const list = await server.mocker.createMuteList(
'alice',
'Muted Users',
)
await server.mocker.addToMuteList(
'alice',
list,
server.mocker.users['muted-by-list-account'].did,
)
await server.mocker.createPost('muted-by-list-account', 'muted post')
await server.mocker.createQuotePost(
'muted-by-list-account',
'account quote post',
anchorPost,
)
await server.mocker.createReply(
'muted-by-list-account',
'account reply',
anchorPost,
)
await server.mocker.createPost('blocking-account', 'blocking post')
await server.mocker.createQuotePost(
'blocking-account',
'blocking quote post',
anchorPost,
)
await server.mocker.createReply(
'blocking-account',
'blocking reply',
anchorPost,
)
await server.mocker.users.alice.agent.app.bsky.graph.block.create(
{
repo: server.mocker.users.alice.did,
},
{
subject: server.mocker.users['blocking-account'].did,
createdAt: new Date().toISOString(),
},
)
await server.mocker.createPost('blockedby-account', 'blockedby post')
await server.mocker.createQuotePost(
'blockedby-account',
'blockedby quote post',
anchorPost,
)
await server.mocker.createReply(
'blockedby-account',
'blockedby reply',
anchorPost,
)
await server.mocker.users[
'blockedby-account'
].agent.app.bsky.graph.block.create(
{
repo: server.mocker.users['blockedby-account'].did,
},
{
subject: server.mocker.users.alice.did,
createdAt: new Date().toISOString(),
},
)
await server.mocker.createPost(
'mutual-block-account',
'mutual-block post',
)
await server.mocker.createQuotePost(
'mutual-block-account',
'mutual-block quote post',
anchorPost,
)
await server.mocker.createReply(
'mutual-block-account',
'mutual-block reply',
anchorPost,
)
await server.mocker.users.alice.agent.app.bsky.graph.block.create(
{
repo: server.mocker.users.alice.did,
},
{
subject: server.mocker.users['mutual-block-account'].did,
createdAt: new Date().toISOString(),
},
)
await server.mocker.users[
'mutual-block-account'
].agent.app.bsky.graph.block.create(
{
repo: server.mocker.users['mutual-block-account'].did,
},
{
subject: server.mocker.users.alice.did,
createdAt: new Date().toISOString(),
},
)
// flush caches
await server.mocker.testNet.processAll()
}
}
console.log('Ready')
return res.writeHead(200).end(server.pdsUrl)
} catch (e) {
console.error('Error!', e)
return res.writeHead(500).end()
}
}).listen(1986)
console.log('Mock server manager listening on 1986')
}
main()
+107
View File
@@ -0,0 +1,107 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer, sleep} from '../util'
describe('Composer', () => {
beforeAll(async () => {
await createServer('?users')
await openApp({
permissions: {notifications: 'YES', medialibrary: 'YES', photos: 'YES'},
})
})
it('Login', async () => {
await loginAsAlice()
await element(by.id('homeScreenFeedTabs-Following')).tap()
})
it('Post text only', async () => {
await element(by.id('composeFAB')).tap()
await device.takeScreenshot('1- opened composer')
await element(by.id('composerTextInput')).typeText('Post text only')
await device.takeScreenshot('2- entered text')
await element(by.id('composerPublishBtn')).tap()
await device.takeScreenshot('3- opened general section')
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Post with an image', async () => {
await element(by.id('composeFAB')).tap()
await element(by.id('composerTextInput')).typeText('Post with an image')
await element(by.id('openGalleryBtn')).tap()
await sleep(1e3)
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Post with a link card', async () => {
await element(by.id('composeFAB')).tap()
await element(by.id('composerTextInput')).typeText(
'Post with a https://example.com link card',
)
await element(by.id('addLinkCardBtn')).tap()
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Reply text only', async () => {
const post = by.id('feedItem-by-alice.test')
await element(by.id('replyBtn').withAncestor(post)).atIndex(0).tap()
await element(by.id('composerTextInput')).typeText('Reply text only')
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Reply with an image', async () => {
const post = by.id('feedItem-by-alice.test')
await element(by.id('replyBtn').withAncestor(post)).atIndex(0).tap()
await element(by.id('composerTextInput')).typeText('Reply with an image')
await element(by.id('openGalleryBtn')).tap()
await sleep(1e3)
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Reply with a link card', async () => {
const post = by.id('feedItem-by-alice.test')
await element(by.id('replyBtn').withAncestor(post)).atIndex(0).tap()
await element(by.id('composerTextInput')).typeText(
'Reply with a https://example.com link card',
)
await element(by.id('addLinkCardBtn')).tap()
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('QP text only', async () => {
const post = by.id('feedItem-by-alice.test')
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await element(by.id('quoteBtn').withAncestor(by.id('repostModal'))).tap()
await element(by.id('composerTextInput')).typeText('QP text only')
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('QP with an image', async () => {
const post = by.id('feedItem-by-alice.test')
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await element(by.id('quoteBtn').withAncestor(by.id('repostModal'))).tap()
await element(by.id('composerTextInput')).typeText('QP with an image')
await element(by.id('openGalleryBtn')).tap()
await sleep(1e3)
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('QP with a link card', async () => {
const post = by.id('feedItem-by-alice.test')
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await element(by.id('quoteBtn').withAncestor(by.id('repostModal'))).tap()
await element(by.id('composerTextInput')).typeText(
'QP with a https://example.com link card',
)
await element(by.id('addLinkCardBtn')).tap()
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
})
+36
View File
@@ -0,0 +1,36 @@
/* eslint-env detox/detox */
import {openApp, createServer} from '../util'
describe('Create account', () => {
let service: string
beforeAll(async () => {
service = await createServer('')
await openApp({permissions: {notifications: 'YES'}})
})
it('I can create a new account', async () => {
await element(by.id('createAccountButton')).tap()
await device.takeScreenshot('1- opened create account screen')
await element(by.id('otherServerBtn')).tap()
await device.takeScreenshot('2- selected other server')
await element(by.id('customServerInput')).clearText()
await element(by.id('customServerInput')).typeText(service)
await device.takeScreenshot('3- input test server URL')
await element(by.id('nextBtn')).tap()
await element(by.id('emailInput')).typeText('example@test.com')
await element(by.id('passwordInput')).typeText('hunter2')
await device.takeScreenshot('4- entered account details')
await element(by.id('nextBtn')).tap()
await element(by.id('handleInput')).typeText('e2e-test')
await device.takeScreenshot('4- entered handle')
await element(by.id('nextBtn')).tap()
await expect(element(by.id('welcomeOnboarding'))).toBeVisible()
await element(by.id('continueBtn')).tap()
await expect(element(by.id('recommendedFeedsOnboarding'))).toBeVisible()
await element(by.id('continueBtn')).tap()
await expect(element(by.id('recommendedFollowsOnboarding'))).toBeVisible()
await element(by.id('continueBtn')).tap()
await expect(element(by.id('homeScreen'))).toBeVisible()
})
})
+208
View File
@@ -0,0 +1,208 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, loginAsBob, createServer, sleep} from '../util'
describe('Curate lists', () => {
beforeAll(async () => {
await createServer('?users&follows&posts')
await openApp({
permissions: {notifications: 'YES', medialibrary: 'YES', photos: 'YES'},
})
})
it('Login and create a curatelists', async () => {
await expect(element(by.id('signInButton'))).toBeVisible()
await loginAsAlice()
await element(by.id('e2eGotoLists')).tap()
await element(by.id('newUserListBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editNameInput')).typeText('Good Ppl')
await element(by.id('editDescriptionInput')).typeText('They good')
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await element(by.text('About')).tap()
await expect(element(by.id('headerTitle'))).toHaveText('Good Ppl')
await expect(element(by.id('listDescription'))).toHaveText('They good')
})
it('Edit display name and description via the edit curatelist modal', async () => {
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editNameInput')).clearText()
await element(by.id('editNameInput')).typeText('Bad Ppl')
await element(by.id('editDescriptionInput')).clearText()
await element(by.id('editDescriptionInput')).typeText('They bad')
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('headerTitle'))).toHaveText('Bad Ppl')
await expect(element(by.id('listDescription'))).toHaveText('They bad')
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Remove description via the edit curatelist modal', async () => {
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editDescriptionInput')).clearText()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('listDescription'))).not.toBeVisible()
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Set avi via the edit curatelist modal', async () => {
await expect(element(by.id('userAvatarFallback'))).toExist()
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('changeAvatarBtn')).tap()
await element(by.text('Library')).tap()
await sleep(3e3)
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('userAvatarImage'))).toExist()
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Remove avi via the edit curatelist modal', async () => {
await expect(element(by.id('userAvatarImage'))).toExist()
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('changeAvatarBtn')).tap()
await element(by.text('Remove')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('userAvatarFallback'))).toExist()
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Delete the curatelist', async () => {
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Delete List')).tap()
await element(by.id('confirmBtn')).tap()
await expect(element(by.id('listsEmpty'))).toBeVisible()
})
it('Create a new curatelist', async () => {
await element(by.id('newUserListBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editNameInput')).typeText('Good Ppl')
await element(by.id('editDescriptionInput')).typeText('They good')
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await element(by.text('About')).tap()
await expect(element(by.id('headerTitle'))).toHaveText('Good Ppl')
await expect(element(by.id('listDescription'))).toHaveText('They good')
})
it('Adds users on curatelists from the list', async () => {
await element(by.text('About')).tap()
await element(by.id('addUserBtn')).tap()
await expect(element(by.id('listAddUserModal'))).toBeVisible()
await waitFor(element(by.id('user-bob.test-addBtn')))
.toBeVisible()
.withTimeout(5000)
await element(by.id('user-bob.test-addBtn')).tap()
await element(by.id('doneBtn')).tap()
await expect(element(by.id('listAddUserModal'))).not.toBeVisible()
await expect(element(by.id('user-bob.test'))).toBeVisible()
})
it('Shows posts by the users in the list', async () => {
await element(by.text('Posts')).tap()
await expect(element(by.id('feedItem-by-bob.test'))).toBeVisible()
})
it('Pins the list', async () => {
await element(by.id('pinBtn')).tap()
await element(by.id('e2eGotoHome')).tap()
await element(by.id('homeScreenFeedTabs-Good Ppl')).tap()
await expect(element(by.id('feedItem-by-bob.test'))).toBeVisible()
await element(by.id('bottomBarFeedsBtn')).tap()
await element(by.id('saved-feed-Good Ppl')).tap()
await expect(element(by.id('feedItem-by-bob.test'))).toBeVisible()
await element(by.id('unpinBtn')).tap()
await element(by.id('bottomBarHomeBtn')).tap()
await expect(
element(by.id('homeScreenFeedTabs-Good Ppl')),
).not.toBeVisible()
await element(by.id('e2eGotoLists')).tap()
await element(by.id('list-Good Ppl')).tap()
})
it('Removes users on curatelists from the list', async () => {
await element(by.text('About')).tap()
await expect(element(by.id('user-bob.test'))).toBeVisible()
await element(by.id('user-bob.test-editBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).toBeVisible()
await element(by.id('toggleBtn-Good Ppl')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).not.toBeVisible()
})
it('Shows the curatelist on my profile', async () => {
await element(by.id('bottomBarProfileBtn')).tap()
await element(by.id('selector')).swipe('left')
await element(by.id('selector-4')).tap()
await element(by.id('list-Good Ppl')).tap()
})
it('Adds and removes users on curatelists from the profile', async () => {
await element(by.id('bottomBarSearchBtn')).tap()
await element(by.id('searchTextInput')).typeText('bob')
await element(by.id('searchAutoCompleteResult-bob.test')).tap()
await expect(element(by.id('profileView'))).toBeVisible()
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Add to Lists')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).toBeVisible()
await element(by.id('toggleBtn-Good Ppl')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).not.toBeVisible()
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Add to Lists')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).toBeVisible()
await element(by.id('toggleBtn-Good Ppl')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).not.toBeVisible()
})
it('Can report a user list', async () => {
await element(by.id('e2eGotoSettings')).tap()
await element(by.id('signOutBtn')).tap()
await loginAsBob()
await element(by.id('bottomBarSearchBtn')).tap()
await element(by.id('searchTextInput')).typeText('alice')
await element(by.id('searchAutoCompleteResult-alice.test')).tap()
await element(by.id('selector')).swipe('left')
await element(by.id('selector-3')).tap()
await element(by.id('list-Good Ppl')).tap()
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Report List')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await expect(element(by.text('Report List'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonRude'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
})
+93
View File
@@ -0,0 +1,93 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer} from '../util'
describe('Home screen', () => {
beforeAll(async () => {
await createServer('?users&follows&posts')
await openApp({permissions: {notifications: 'YES'}})
})
it('Login', async () => {
await loginAsAlice()
await element(by.id('homeScreenFeedTabs-Following')).tap()
})
it('Can like posts', async () => {
const carlaPosts = by.id('feedItem-by-carla.test')
await expect(
element(by.id('likeCount').withAncestor(carlaPosts)).atIndex(0),
).toHaveText('0')
await element(by.id('likeBtn').withAncestor(carlaPosts)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(carlaPosts)).atIndex(0),
).toHaveText('1')
await element(by.id('likeBtn').withAncestor(carlaPosts)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(carlaPosts)).atIndex(0),
).toHaveText('0')
})
it('Can repost posts', async () => {
const carlaPosts = by.id('feedItem-by-carla.test')
await expect(
element(by.id('repostCount').withAncestor(carlaPosts)).atIndex(0),
).toHaveText('0')
await element(by.id('repostBtn').withAncestor(carlaPosts)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(carlaPosts)).atIndex(0),
).toHaveText('1')
await element(by.id('repostBtn').withAncestor(carlaPosts)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(carlaPosts)).atIndex(0),
).toHaveText('0')
})
it('Can report posts', async () => {
const carlaPosts = by.id('feedItem-by-carla.test')
await element(by.id('postDropdownBtn').withAncestor(carlaPosts))
.atIndex(0)
.tap()
await element(by.text('Report post')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
it('Can swipe between feeds', async () => {
await element(by.id('homeScreen')).swipe('left', 'fast', 0.75)
await expect(element(by.id('whatshotFeedPage'))).toBeVisible()
await element(by.id('homeScreen')).swipe('right', 'fast', 0.75)
await expect(element(by.id('followingFeedPage'))).toBeVisible()
})
it('Can tap between feeds', async () => {
await element(by.id("homeScreenFeedTabs-What's hot")).tap()
await expect(element(by.id('whatshotFeedPage'))).toBeVisible()
await element(by.id('homeScreenFeedTabs-Following')).tap()
await expect(element(by.id('followingFeedPage'))).toBeVisible()
})
it('Can delete posts', async () => {
const alicePosts = by.id('feedItem-by-alice.test')
await expect(element(alicePosts.withDescendant(by.text('Post')))).toExist()
await element(by.id('postDropdownBtn').withAncestor(alicePosts))
.atIndex(0)
.tap()
await element(by.text('Delete post')).tap()
await expect(element(by.id('confirmModal'))).toBeVisible()
await element(by.id('confirmBtn')).tap()
await expect(
element(alicePosts.withDescendant(by.text('Post'))),
).not.toExist()
})
})
+69
View File
@@ -0,0 +1,69 @@
/* eslint-env detox/detox */
/**
* This test is being skipped until we can resolve the detox crash issue
* with the side drawer.
*/
import {openApp, loginAsAlice, createServer} from '../util'
describe('invite-codes', () => {
let service: string
let inviteCode = ''
beforeAll(async () => {
service = await createServer('?users&invite')
await openApp({permissions: {notifications: 'YES'}})
})
it('I can fetch invite codes', async () => {
await expect(element(by.id('signInButton'))).toBeVisible()
await loginAsAlice()
await element(by.id('e2eOpenInviteCodesModal')).tap()
await expect(element(by.id('inviteCodesModal'))).toBeVisible()
const attrs = await element(by.id('inviteCode-0-code')).getAttributes()
inviteCode = attrs.text
await element(by.id('closeBtn')).tap()
await element(by.id('e2eSignOut')).tap()
})
it('I can create a new account with the invite code', async () => {
await element(by.id('createAccountButton')).tap()
await device.takeScreenshot('1- opened create account screen')
await element(by.id('otherServerBtn')).tap()
await device.takeScreenshot('2- selected other server')
await element(by.id('customServerInput')).clearText()
await element(by.id('customServerInput')).typeText(service)
await device.takeScreenshot('3- input test server URL')
await element(by.id('nextBtn')).tap()
await element(by.id('inviteCodeInput')).typeText(inviteCode)
await element(by.id('emailInput')).typeText('example@test.com')
await element(by.id('passwordInput')).typeText('hunter2')
await device.takeScreenshot('4- entered account details')
await element(by.id('nextBtn')).tap()
await element(by.id('handleInput')).typeText('e2e-test')
await device.takeScreenshot('4- entered handle')
await element(by.id('nextBtn')).tap()
await expect(element(by.id('welcomeOnboarding'))).toBeVisible()
await element(by.id('continueBtn')).tap()
await expect(element(by.id('recommendedFeedsOnboarding'))).toBeVisible()
await element(by.id('continueBtn')).tap()
await expect(element(by.id('recommendedFollowsOnboarding'))).toBeVisible()
await element(by.id('continueBtn')).tap()
await expect(element(by.id('homeScreen'))).toBeVisible()
})
it('I get a notification for the new user', async () => {
await element(by.id('e2eSignOut')).tap()
await loginAsAlice()
await waitFor(element(by.id('homeScreen')))
.toBeVisible()
.withTimeout(5000)
await element(by.id('bottomBarNotificationsBtn')).tap()
await expect(element(by.id('invitedUser'))).toBeVisible()
})
it('I can dismiss the new user notification', async () => {
await element(by.id('dismissBtn')).tap()
await expect(element(by.id('invitedUser'))).not.toBeVisible()
})
})
+19
View File
@@ -0,0 +1,19 @@
/* eslint-env detox/detox */
import {openApp, login, createServer} from '../util'
describe('Login', () => {
let service: string
beforeAll(async () => {
service = await createServer('?users')
await openApp({permissions: {notifications: 'YES'}})
})
it('As Alice, I can login', async () => {
await expect(element(by.id('signInButton'))).toBeVisible()
await login(service, 'alice', 'hunter2', {
takeScreenshots: true,
})
await device.takeScreenshot('5- opened home screen')
})
})
+157
View File
@@ -0,0 +1,157 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer} from '../util'
describe('Mergefeed', () => {
beforeAll(async () => {
await createServer('?mergefeed')
await openApp({permissions: {notifications: 'YES'}})
})
it('Login', async () => {
await loginAsAlice()
await element(by.id('e2eToggleMergefeed')).tap()
})
it('Sees the expected mix of posts with default filters', async () => {
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'slow',
1,
0.5,
0.5,
)
// followed users
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-carla.test')),
).atIndex(0),
).toHaveText('Post 9')
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-bob.test')),
).atIndex(0),
).toHaveText('Post 9')
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'up',
'fast',
1,
0.5,
0.5,
)
// feed users
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-dan.test')),
).atIndex(0),
).toHaveText('Post 0')
})
it('Sees the expected mix of posts with replies disabled', async () => {
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'fast',
1,
0.5,
0.5,
)
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'fast',
1,
0.5,
0.5,
)
await element(by.id('viewHeaderHomeFeedPrefsBtn')).tap()
await element(by.id('toggleRepliesBtn')).tap()
await element(by.id('confirmBtn')).tap()
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'slow',
1,
0.5,
0.5,
)
// followed users
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-carla.test')),
).atIndex(0),
).toHaveText('Post 9')
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-bob.test')),
).atIndex(0),
).toHaveText('Post 9')
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'up',
'fast',
1,
0.5,
0.5,
)
// feed users
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-dan.test')),
).atIndex(0),
).toHaveText('Post 0')
})
it('Sees the expected mix of posts with no follows', async () => {
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'fast',
1,
0.5,
0.5,
)
await element(by.id('bottomBarSearchBtn')).tap()
await element(by.id('searchTextInput')).typeText('bob')
await element(by.id('searchAutoCompleteResult-bob.test')).tap()
await expect(element(by.id('profileView'))).toBeVisible()
await element(by.id('unfollowBtn')).tap()
await element(by.id('profileHeaderBackBtn')).tap()
// have to wait for the toast to clear
await waitFor(element(by.id('searchTextInputClearBtn')))
.toBeVisible()
.withTimeout(5000)
await element(by.id('searchTextInputClearBtn')).tap()
await element(by.id('searchTextInput')).typeText('carla')
await element(by.id('searchAutoCompleteResult-carla.test')).tap()
await expect(element(by.id('profileView'))).toBeVisible()
await element(by.id('unfollowBtn')).tap()
await element(by.id('profileHeaderBackBtn')).tap()
await element(by.id('bottomBarHomeBtn')).tap()
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'slow',
1,
0.5,
0.5,
)
await element(by.id('followingFeedPage-feed-flatlist')).swipe(
'down',
'slow',
1,
0.5,
0.5,
)
// followed users NOT present
await expect(element(by.id('feedItem-by-carla.test'))).not.toExist()
await expect(element(by.id('feedItem-by-bob.test'))).not.toExist()
// feed users
await expect(
element(
by.id('postText').withAncestor(by.id('feedItem-by-dan.test')),
).atIndex(0),
).toHaveText('Post 0')
})
})
+187
View File
@@ -0,0 +1,187 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, loginAsBob, createServer, sleep} from '../util'
describe('Mod lists', () => {
beforeAll(async () => {
await createServer('?users&follows&labels')
await openApp({
permissions: {notifications: 'YES', medialibrary: 'YES', photos: 'YES'},
})
})
it('Login and view my modlists', async () => {
await expect(element(by.id('signInButton'))).toBeVisible()
await loginAsAlice()
await element(by.id('e2eGotoModeration')).tap()
await element(by.id('moderationlistsBtn')).tap()
await expect(element(by.id('list-Muted Users'))).toBeVisible()
await element(by.id('list-Muted Users')).tap()
await expect(
element(by.id('user-muted-by-list-account.test')),
).toBeVisible()
})
it('Toggle mute subscription', async () => {
await element(by.id('unmuteBtn')).tap()
await element(by.id('subscribeBtn')).tap()
await element(by.text('Mute accounts')).tap()
await element(by.id('confirmBtn')).tap()
})
it('Edit display name and description via the edit modlist modal', async () => {
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editNameInput')).clearText()
await element(by.id('editNameInput')).typeText('Bad Ppl')
await element(by.id('editDescriptionInput')).clearText()
await element(by.id('editDescriptionInput')).typeText('They bad')
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('headerTitle'))).toHaveText('Bad Ppl')
await expect(element(by.id('listDescription'))).toHaveText('They bad')
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Remove description via the edit modlist modal', async () => {
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editDescriptionInput')).clearText()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('listDescription'))).not.toBeVisible()
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Set avi via the edit modlist modal', async () => {
await expect(element(by.id('userAvatarFallback'))).toExist()
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('changeAvatarBtn')).tap()
await element(by.text('Library')).tap()
await sleep(3e3)
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('userAvatarImage'))).toExist()
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Remove avi via the edit modlist modal', async () => {
await expect(element(by.id('userAvatarImage'))).toExist()
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Edit List Details')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('changeAvatarBtn')).tap()
await element(by.text('Remove')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('userAvatarFallback'))).toExist()
// have to wait for the toast to clear
await waitFor(element(by.id('headerDropdownBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Delete the modlist', async () => {
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Delete List')).tap()
await element(by.id('confirmBtn')).tap()
await expect(element(by.id('listsEmpty'))).toBeVisible()
})
it('Create a new modlist', async () => {
await element(by.id('newModListBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).toBeVisible()
await element(by.id('editNameInput')).typeText('Bad Ppl')
await element(by.id('editDescriptionInput')).typeText('They bad')
await element(by.id('saveBtn')).tap()
await expect(element(by.id('createOrEditListModal'))).not.toBeVisible()
await expect(element(by.id('headerTitle'))).toHaveText('Bad Ppl')
await expect(element(by.id('listDescription'))).toHaveText('They bad')
})
it('Adds and removes users on modlists from the list', async () => {
await element(by.id('addUserBtn')).tap()
await expect(element(by.id('listAddUserModal'))).toBeVisible()
await waitFor(element(by.id('user-warn-posts.test-addBtn')))
.toBeVisible()
.withTimeout(5000)
await element(by.id('user-warn-posts.test-addBtn')).tap()
await element(by.id('doneBtn')).tap()
await expect(element(by.id('listAddUserModal'))).not.toBeVisible()
await element(by.id('listItems-flatlist')).swipe(
'down',
'slow',
1,
0.5,
0.5,
)
await expect(element(by.id('user-warn-posts.test'))).toBeVisible()
await element(by.id('user-warn-posts.test-editBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).toBeVisible()
await element(by.id('toggleBtn-Bad Ppl')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).not.toBeVisible()
})
it('Shows the modlist on my profile', async () => {
await element(by.id('bottomBarProfileBtn')).tap()
await element(by.id('selector')).swipe('left')
await element(by.id('selector-4')).tap()
await element(by.id('list-Bad Ppl')).tap()
})
it('Adds and removes users on modlists from the profile', async () => {
await element(by.id('bottomBarSearchBtn')).tap()
await element(by.id('searchTextInput')).typeText('bob')
await element(by.id('searchAutoCompleteResult-bob.test')).tap()
await expect(element(by.id('profileView'))).toBeVisible()
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Add to Lists')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).toBeVisible()
await element(by.id('toggleBtn-Bad Ppl')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).not.toBeVisible()
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Add to Lists')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).toBeVisible()
await element(by.id('toggleBtn-Bad Ppl')).tap()
await element(by.id('saveBtn')).tap()
await expect(element(by.id('userAddRemoveListsModal'))).not.toBeVisible()
})
it('Can report a mute list', async () => {
await element(by.id('e2eGotoSettings')).tap()
await element(by.id('signOutBtn')).tap()
await loginAsBob()
await element(by.id('bottomBarSearchBtn')).tap()
await element(by.id('searchTextInput')).typeText('alice')
await element(by.id('searchAutoCompleteResult-alice.test')).tap()
await element(by.id('selector')).swipe('left')
await element(by.id('selector-3')).tap()
await element(by.id('list-Bad Ppl')).tap()
await element(by.id('headerDropdownBtn')).tap()
await element(by.text('Report List')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await expect(element(by.text('Report List'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonRude'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
})
+184
View File
@@ -0,0 +1,184 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer, sleep} from '../util'
describe('Profile screen', () => {
beforeAll(async () => {
await createServer('?users&posts&feeds')
await openApp({
permissions: {notifications: 'YES', medialibrary: 'YES', photos: 'YES'},
})
})
it('Login and navigate to my profile', async () => {
await expect(element(by.id('signInButton'))).toBeVisible()
await loginAsAlice()
await element(by.id('bottomBarProfileBtn')).tap()
})
it('Can see feeds', async () => {
await element(by.id('selector')).swipe('left')
await element(by.id('selector-4')).tap()
await expect(element(by.id('feed-alice-favs'))).toBeVisible()
await element(by.id('selector')).swipe('right')
await element(by.id('selector-0')).tap()
})
it('Open and close edit profile modal', async () => {
await element(by.id('profileHeaderEditProfileButton')).tap()
await expect(element(by.id('editProfileModal'))).toBeVisible()
await element(by.id('editProfileCancelBtn')).tap()
await expect(element(by.id('editProfileModal'))).not.toBeVisible()
})
it('Edit display name and description via the edit profile modal', async () => {
await element(by.id('profileHeaderEditProfileButton')).tap()
await expect(element(by.id('editProfileModal'))).toBeVisible()
await element(by.id('editProfileDisplayNameInput')).clearText()
await element(by.id('editProfileDisplayNameInput')).typeText('Alicia')
await element(by.id('editProfileDescriptionInput')).clearText()
await element(by.id('editProfileDescriptionInput')).typeText(
'One cool hacker',
)
await element(by.id('editProfileSaveBtn')).tap()
await expect(element(by.id('editProfileModal'))).not.toBeVisible()
await expect(element(by.id('profileHeaderDisplayName'))).toHaveText(
'Alicia',
)
await expect(element(by.id('profileHeaderDescription'))).toHaveText(
'One cool hacker',
)
})
it('Remove display name and description via the edit profile modal', async () => {
await element(by.id('profileHeaderEditProfileButton')).tap()
await expect(element(by.id('editProfileModal'))).toBeVisible()
await element(by.id('editProfileDisplayNameInput')).clearText()
await element(by.id('editProfileDescriptionInput')).clearText()
await element(by.id('editProfileSaveBtn')).tap()
await expect(element(by.id('editProfileModal'))).not.toBeVisible()
await expect(element(by.id('profileHeaderDisplayName'))).toHaveText(
'alice.test',
)
await expect(element(by.id('profileHeaderDescription'))).not.toExist()
})
it('Set avi and banner via the edit profile modal', async () => {
await expect(element(by.id('userBannerFallback'))).toExist()
await expect(element(by.id('userAvatarFallback'))).toExist()
await element(by.id('profileHeaderEditProfileButton')).tap()
await expect(element(by.id('editProfileModal'))).toBeVisible()
await element(by.id('changeBannerBtn')).tap()
await element(by.text('Library')).tap()
await sleep(3e3)
await element(by.id('changeAvatarBtn')).tap()
await element(by.text('Library')).tap()
await sleep(3e3)
await element(by.id('editProfileSaveBtn')).tap()
await expect(element(by.id('editProfileModal'))).not.toBeVisible()
await expect(element(by.id('userBannerImage'))).toExist()
await expect(element(by.id('userAvatarImage'))).toExist()
})
it('Remove avi and banner via the edit profile modal', async () => {
await expect(element(by.id('userBannerImage'))).toExist()
await expect(element(by.id('userAvatarImage'))).toExist()
await element(by.id('profileHeaderEditProfileButton')).tap()
await expect(element(by.id('editProfileModal'))).toBeVisible()
await element(by.id('changeBannerBtn')).tap()
await element(by.text('Remove')).tap()
await element(by.id('changeAvatarBtn')).tap()
await element(by.text('Remove')).tap()
await element(by.id('editProfileSaveBtn')).tap()
await expect(element(by.id('editProfileModal'))).not.toBeVisible()
await expect(element(by.id('userBannerFallback'))).toExist()
await expect(element(by.id('userAvatarFallback'))).toExist()
})
it('Navigate to another user profile', async () => {
await element(by.id('bottomBarSearchBtn')).tap()
// have to wait for the toast to clear
await waitFor(element(by.id('searchTextInput')))
.toBeVisible()
.withTimeout(5000)
await element(by.id('searchTextInput')).typeText('bob')
await element(by.id('searchAutoCompleteResult-bob.test')).tap()
await expect(element(by.id('profileView'))).toBeVisible()
})
it('Can follow/unfollow another user', async () => {
await element(by.id('followBtn')).tap()
await expect(element(by.id('unfollowBtn'))).toBeVisible()
await element(by.id('unfollowBtn')).tap()
await expect(element(by.id('followBtn'))).toBeVisible()
})
it('Can mute/unmute another user', async () => {
await expect(element(by.id('profileHeaderAlert'))).not.toExist()
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Mute Account')).tap()
await expect(element(by.id('profileHeaderAlert'))).toBeVisible()
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Unmute Account')).tap()
await expect(element(by.id('profileHeaderAlert'))).not.toExist()
})
it('Can report another user', async () => {
await element(by.id('profileHeaderDropdownBtn')).tap()
await element(by.text('Report Account')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
it('Can like posts', async () => {
const posts = by.id('feedItem-by-bob.test')
await expect(
element(by.id('likeCount').withAncestor(posts)).atIndex(0),
).toHaveText('0')
await element(by.id('likeBtn').withAncestor(posts)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(posts)).atIndex(0),
).toHaveText('1')
await element(by.id('likeBtn').withAncestor(posts)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(posts)).atIndex(0),
).toHaveText('0')
})
it('Can repost posts', async () => {
const posts = by.id('feedItem-by-bob.test')
await expect(
element(by.id('repostCount').withAncestor(posts)).atIndex(0),
).toHaveText('0')
await element(by.id('repostBtn').withAncestor(posts)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(posts)).atIndex(0),
).toHaveText('1')
await element(by.id('repostBtn').withAncestor(posts)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(posts)).atIndex(0),
).toHaveText('0')
})
it('Can report posts', async () => {
const posts = by.id('feedItem-by-bob.test')
await element(by.id('postDropdownBtn').withAncestor(posts)).atIndex(0).tap()
await element(by.text('Report post')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
})
+23
View File
@@ -0,0 +1,23 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer} from '../util'
describe('Search screen', () => {
beforeAll(async () => {
await createServer('?users')
await openApp({
permissions: {notifications: 'YES', medialibrary: 'YES', photos: 'YES'},
})
})
it('Login', async () => {
await loginAsAlice()
})
it('Navigate to another user profile via autocomplete', async () => {
await element(by.id('bottomBarSearchBtn')).tap()
await element(by.id('searchTextInput')).typeText('bob')
await element(by.id('searchAutoCompleteResult-bob.test')).tap()
await expect(element(by.id('profileView'))).toBeVisible()
})
})
+33
View File
@@ -0,0 +1,33 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer, sleep} from '../util'
describe('Self-labeling', () => {
beforeAll(async () => {
await createServer('?users')
await openApp({
permissions: {notifications: 'YES', medialibrary: 'YES', photos: 'YES'},
})
})
it('Login', async () => {
await loginAsAlice()
await element(by.id('homeScreenFeedTabs-Following')).tap()
})
it('Post an image with the porn label', async () => {
await element(by.id('composeFAB')).tap()
await element(by.id('composerTextInput')).typeText('Post with an image')
await element(by.id('openGalleryBtn')).tap()
await sleep(3e3)
await element(by.id('labelsBtn')).tap()
await element(by.id('pornLabelBtn')).tap()
await element(by.id('confirmBtn')).tap()
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
const posts = by.id('feedItem-by-alice.test')
await expect(
element(by.id('contentHider-embed').withAncestor(posts)).atIndex(0),
).toExist()
})
})
+33
View File
@@ -0,0 +1,33 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer} from '../util'
describe('Shell', () => {
beforeAll(async () => {
await createServer('?users')
await openApp({permissions: {notifications: 'YES'}})
})
it('Login', async () => {
await loginAsAlice()
await element(by.id('homeScreenFeedTabs-Following')).tap()
})
it('Can swipe the shelf open', async () => {
await element(by.id('homeScreen')).swipe('right', 'fast', 0.75)
await expect(element(by.id('drawer'))).toBeVisible()
await element(by.id('drawer')).swipe('left', 'fast', 0.75)
await expect(element(by.id('drawer'))).not.toBeVisible()
})
it('Can open the shelf by pressing the header avi', async () => {
await element(by.id('viewHeaderDrawerBtn')).tap()
await expect(element(by.id('drawer'))).toBeVisible()
})
it('Can navigate using the shelf', async () => {
await element(by.id('menuItemButton-Notifications')).tap()
await expect(element(by.id('drawer'))).not.toBeVisible()
await expect(element(by.id('notificationsScreen'))).toBeVisible()
})
})
+101
View File
@@ -0,0 +1,101 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, loginAsBob, createServer} from '../util'
describe('Thread muting', () => {
beforeAll(async () => {
await createServer('?users&follows')
await openApp({permissions: {notifications: 'YES'}})
})
it('Login, create a thread, and log out', async () => {
await loginAsAlice()
await element(by.id('homeScreenFeedTabs-Following')).tap()
await element(by.id('composeFAB')).tap()
await element(by.id('composerTextInput')).typeText('Test thread')
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Login, reply to the thread, and log out', async () => {
await loginAsBob()
await element(by.id('homeScreenFeedTabs-Following')).tap()
const alicePosts = by.id('feedItem-by-alice.test')
await element(by.id('replyBtn').withAncestor(alicePosts)).atIndex(0).tap()
await element(by.id('composerTextInput')).typeText('Reply 1')
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
})
it('Login, confirm notification exists, mute thread, and log out', async () => {
await loginAsAlice()
await element(by.id('bottomBarNotificationsBtn')).tap()
const bobNotifs = by.id('feedItem-by-bob.test')
await expect(
element(by.id('postText').withAncestor(bobNotifs)).atIndex(0),
).toHaveText('Reply 1')
await element(by.id('postDropdownBtn').withAncestor(bobNotifs))
.atIndex(0)
.tap()
await element(by.text('Mute thread')).tap()
// have to wait for the toast to clear
await waitFor(element(by.id('viewHeaderDrawerBtn')))
.toBeVisible()
.withTimeout(5000)
})
it('Login, reply to the thread twice, and log out', async () => {
await loginAsBob()
await element(by.id('bottomBarProfileBtn')).tap()
await element(by.id('selector-1')).tap()
const bobPosts = by.id('feedItem-by-bob.test')
await element(by.id('replyBtn').withAncestor(bobPosts)).atIndex(0).tap()
await element(by.id('composerTextInput')).typeText('Reply 2')
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
const alicePosts = by.id('feedItem-by-alice.test')
await element(by.id('replyBtn').withAncestor(alicePosts)).atIndex(0).tap()
await element(by.id('composerTextInput')).typeText('Reply 3')
await element(by.id('composerPublishBtn')).tap()
await expect(element(by.id('composeFAB'))).toBeVisible()
await element(by.id('bottomBarHomeBtn')).tap()
})
it('Login, confirm notifications dont exist, unmute the thread, confirm notifications exist', async () => {
await loginAsAlice()
await element(by.id('bottomBarNotificationsBtn')).tap()
const bobNotifs = by.id('feedItem-by-bob.test')
await expect(
element(by.id('postText').withAncestor(bobNotifs)).atIndex(0),
).not.toExist()
await element(by.id('bottomBarHomeBtn')).tap()
const alicePosts = by.id('feedItem-by-alice.test')
await element(by.id('postDropdownBtn').withAncestor(alicePosts))
.atIndex(0)
.tap()
await element(by.text('Unmute thread')).tap()
// TODO
// the swipe down to trigger PTR isnt working and I dont want to block on this
// -prf
// await element(by.id('bottomBarNotificationsBtn')).tap()
// await element(by.id('notifsFeed')).swipe('down', 'fast')
// await waitFor(element(by.id('postText').withAncestor(bobNotifs)))
// .toBeVisible()
// .withTimeout(5000)
// await expect(
// element(by.id('postText').withAncestor(bobNotifs)).atIndex(0),
// ).toHaveText('Reply 2')
// await expect(
// element(by.id('postText').withAncestor(bobNotifs)).atIndex(1),
// ).toHaveText('Reply 3')
// await expect(
// element(by.id('postText').withAncestor(bobNotifs)).atIndex(2),
// ).toHaveText('Reply 1')
})
})
+126
View File
@@ -0,0 +1,126 @@
/* eslint-env detox/detox */
import {openApp, loginAsAlice, createServer} from '../util'
describe('Thread screen', () => {
beforeAll(async () => {
await createServer('?users&follows&thread')
await openApp({permissions: {notifications: 'YES'}})
})
it('Login & navigate to thread', async () => {
await loginAsAlice()
await element(by.id('homeScreenFeedTabs-Following')).tap()
await element(by.id('feedItem-by-bob.test')).atIndex(0).tap()
await expect(
element(
by
.id('postThreadItem-by-bob.test')
.withDescendant(by.text('Thread root')),
),
).toBeVisible()
await expect(
element(
by
.id('postThreadItem-by-carla.test')
.withDescendant(by.text('Thread reply')),
),
).toBeVisible()
})
it('Can like the root post', async () => {
const post = by.id('postThreadItem-by-bob.test')
await expect(
element(by.id('likeCount').withAncestor(post)).atIndex(0),
).not.toExist()
await element(by.id('likeBtn').withAncestor(post)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(post)).atIndex(0),
).toHaveText('1 like')
await element(by.id('likeBtn').withAncestor(post)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(post)).atIndex(0),
).not.toExist()
})
it('Can like a reply post', async () => {
const post = by.id('postThreadItem-by-carla.test')
await expect(
element(by.id('likeCount').withAncestor(post)).atIndex(0),
).toHaveText('0')
await element(by.id('likeBtn').withAncestor(post)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(post)).atIndex(0),
).toHaveText('1')
await element(by.id('likeBtn').withAncestor(post)).atIndex(0).tap()
await expect(
element(by.id('likeCount').withAncestor(post)).atIndex(0),
).toHaveText('0')
})
it('Can repost the root post', async () => {
const post = by.id('postThreadItem-by-bob.test')
await expect(
element(by.id('repostCount').withAncestor(post)).atIndex(0),
).not.toExist()
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(post)).atIndex(0),
).toHaveText('1 repost')
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(post)).atIndex(0),
).not.toExist()
})
it('Can repost a reply post', async () => {
const post = by.id('postThreadItem-by-carla.test')
await expect(
element(by.id('repostCount').withAncestor(post)).atIndex(0),
).toHaveText('0')
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(post)).atIndex(0),
).toHaveText('1')
await element(by.id('repostBtn').withAncestor(post)).atIndex(0).tap()
await expect(element(by.id('repostModal'))).toBeVisible()
await element(by.id('repostBtn').withAncestor(by.id('repostModal'))).tap()
await expect(element(by.id('repostModal'))).not.toBeVisible()
await expect(
element(by.id('repostCount').withAncestor(post)).atIndex(0),
).toHaveText('0')
})
it('Can report the root post', async () => {
const post = by.id('postThreadItem-by-bob.test')
await element(by.id('postDropdownBtn').withAncestor(post)).atIndex(0).tap()
await element(by.text('Report post')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
it('Can report a reply post', async () => {
const post = by.id('postThreadItem-by-carla.test')
await element(by.id('postDropdownBtn').withAncestor(post)).atIndex(0).tap()
await element(by.text('Report post')).tap()
await expect(element(by.id('reportModal'))).toBeVisible()
await element(
by.id('reportReasonRadios-com.atproto.moderation.defs#reasonSpam'),
).tap()
await element(by.id('sendReportBtn')).tap()
await expect(element(by.id('reportModal'))).not.toBeVisible()
})
})
+119
View File
@@ -0,0 +1,119 @@
import {resolveConfig} from 'detox/internals'
import {execSync} from 'child_process'
const platform = device.getPlatform()
export async function openApp(opts: any) {
opts = opts || {}
const config = await resolveConfig()
if (device.getPlatform() === 'ios') {
// disable password autofill
execSync(
`plutil -replace restrictedBool.allowPasswordAutoFill.value -bool NO ~/Library/Developer/CoreSimulator/Devices/${device.id}/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles/Library/ConfigurationProfiles/UserSettings.plist`,
)
execSync(
`plutil -replace restrictedBool.allowPasswordAutoFill.value -bool NO ~/Library/Developer/CoreSimulator/Devices/${device.id}/data/Library/UserConfigurationProfiles/EffectiveUserSettings.plist`,
)
execSync(
`plutil -replace restrictedBool.allowPasswordAutoFill.value -bool NO ~/Library/Developer/CoreSimulator/Devices/${device.id}/data/Library/UserConfigurationProfiles/PublicInfo/PublicEffectiveUserSettings.plist`,
)
}
if (config.configurationName.split('.').includes('debug')) {
return await openAppForDebugBuild(platform, opts)
} else {
return await device.launchApp({
...opts,
newInstance: true,
})
}
}
export async function isVisible(id: string) {
try {
await expect(element(by.id(id))).toBeVisible()
return true
} catch (e) {
return false
}
}
export async function login(
service: string,
username: string,
password: string,
{takeScreenshots} = {takeScreenshots: false},
) {
await element(by.id('signInButton')).tap()
if (takeScreenshots) {
await device.takeScreenshot('1- opened sign-in screen')
}
if (await isVisible('chooseAccountForm')) {
await element(by.id('chooseNewAccountBtn')).tap()
}
await element(by.id('loginSelectServiceButton')).tap()
if (takeScreenshots) {
await device.takeScreenshot('2- opened service selector')
}
await element(by.id('customServerTextInput')).typeText(service)
await element(by.id('customServerTextInput')).tapReturnKey()
await element(by.id('customServerSelectBtn')).tap()
if (takeScreenshots) {
await device.takeScreenshot('3- input custom service')
}
await element(by.id('loginUsernameInput')).typeText(username)
await element(by.id('loginPasswordInput')).typeText(password)
if (takeScreenshots) {
await device.takeScreenshot('4- entered username and password')
}
await element(by.id('loginNextButton')).tap()
}
export async function loginAsAlice() {
await element(by.id('e2eSignInAlice')).tap()
}
export async function loginAsBob() {
await element(by.id('e2eSignInBob')).tap()
}
async function openAppForDebugBuild(platform: string, opts: any) {
const deepLinkUrl = // Local testing with packager
/*process.env.EXPO_USE_UPDATES
? // Testing latest published EAS update for the test_debug channel
getDeepLinkUrl(getLatestUpdateUrl())
: */ getDeepLinkUrl(getDevLauncherPackagerUrl(platform))
if (platform === 'ios') {
await device.launchApp({
...opts,
newInstance: true,
})
sleep(3000)
await device.openURL({
url: deepLinkUrl,
})
} else {
await device.launchApp({
...opts,
newInstance: true,
url: deepLinkUrl,
})
}
await sleep(3000)
}
export async function createServer(path = '') {
const res = await fetch(`http://localhost:1986/${path}`, {method: 'POST'})
const resBody = await res.text()
return resBody
}
const getDeepLinkUrl = (url: string) =>
`expo+bluesky://expo-development-client/?url=${encodeURIComponent(url)}`
const getDevLauncherPackagerUrl = (platform: string) =>
`http://localhost:8081/index.bundle?platform=${platform}&dev=true&minify=false&disableOnboarding=1`
export const sleep = (t: number) => new Promise(res => setTimeout(res, t))
+60
View File
@@ -0,0 +1,60 @@
import React, {ReactNode} from 'react'
import {View, ScrollView, Modal, FlatList, TextInput} from 'react-native'
const BottomSheetModalContext = React.createContext(null)
const BottomSheetModalProvider = (props: any) => {
return <BottomSheetModalContext.Provider {...props} value={{}} />
}
class BottomSheet extends React.Component<{
onClose?: () => void
children?: ReactNode
}> {
snapToIndex() {}
snapToPosition() {}
expand() {}
collapse() {}
close() {
this.props.onClose?.()
}
forceClose() {}
render() {
return <View>{this.props.children}</View>
}
}
const BottomSheetModal = (props: any) => <Modal {...props} />
const BottomSheetBackdrop = (props: any) => <View {...props} />
const BottomSheetHandle = (props: any) => <View {...props} />
const BottomSheetFooter = (props: any) => <View {...props} />
const BottomSheetScrollView = (props: any) => <ScrollView {...props} />
const BottomSheetFlatList = (props: any) => <FlatList {...props} />
const BottomSheetTextInput = (props: any) => <TextInput {...props} />
const useBottomSheet = jest.fn()
const useBottomSheetModal = jest.fn()
const useBottomSheetSpringConfigs = jest.fn()
const useBottomSheetTimingConfigs = jest.fn()
const useBottomSheetInternal = jest.fn()
const useBottomSheetDynamicSnapPoints = jest.fn()
export {useBottomSheet}
export {useBottomSheetModal}
export {useBottomSheetSpringConfigs}
export {useBottomSheetTimingConfigs}
export {useBottomSheetInternal}
export {useBottomSheetDynamicSnapPoints}
export {
BottomSheetModalProvider,
BottomSheetBackdrop,
BottomSheetHandle,
BottomSheetModal,
BottomSheetFooter,
BottomSheetScrollView,
BottomSheetFlatList,
BottomSheetTextInput,
}
export default BottomSheet
+1
View File
@@ -0,0 +1 @@
export const Slider = {}
+6
View File
@@ -0,0 +1,6 @@
export default {
requestPermission: jest.fn(),
onForegroundEvent: jest.fn(),
setBadgeCount: jest.fn(),
displayNotification: jest.fn(),
}
@@ -0,0 +1,9 @@
export const CameraRoll = {
getPhotos: jest.fn().mockResolvedValue({
edges: [
{node: {image: {uri: 'path/to/image1.jpg'}}},
{node: {image: {uri: 'path/to/image2.jpg'}}},
{node: {image: {uri: 'path/to/image3.jpg'}}},
],
}),
}
-1
View File
@@ -1 +0,0 @@
export default from '@react-native-async-storage/async-storage/jest/async-storage-mock'
+1
View File
@@ -0,0 +1 @@
export const getLocales = jest.fn().mockResolvedValue([])
@@ -0,0 +1,4 @@
export default {
configure: jest.fn().mockResolvedValue(0),
finish: jest.fn(),
}
+1
View File
@@ -0,0 +1 @@
export default {}
+9
View File
@@ -0,0 +1,9 @@
export const openPicker = jest
.fn()
.mockImplementation(() => Promise.resolve({uri: ''}))
export const openCamera = jest
.fn()
.mockImplementation(() => Promise.resolve({uri: ''}))
export const openCropper = jest
.fn()
.mockImplementation(() => Promise.resolve({uri: ''}))
+67
View File
@@ -0,0 +1,67 @@
// @flow
// https://github.com/FormidableLabs/react-native-svg-mock
import React from 'react'
const createComponent = function (name) {
return class extends React.Component {
// overwrite the displayName, since this is a class created dynamically
static displayName = name
render() {
return React.createElement(name, this.props, this.props.children)
}
}
}
// Mock all react-native-svg exports
// from https://github.com/magicismight/react-native-svg/blob/master/index.js
const Svg = createComponent('Svg')
const Circle = createComponent('Circle')
const Ellipse = createComponent('Ellipse')
const G = createComponent('G')
const Text = createComponent('Text')
const TextPath = createComponent('TextPath')
const TSpan = createComponent('TSpan')
const Path = createComponent('Path')
const Polygon = createComponent('Polygon')
const Polyline = createComponent('Polyline')
const Line = createComponent('Line')
const Rect = createComponent('Rect')
const Use = createComponent('Use')
const Image = createComponent('Image')
const Symbol = createComponent('Symbol')
const Defs = createComponent('Defs')
const LinearGradient = createComponent('LinearGradient')
const RadialGradient = createComponent('RadialGradient')
const Stop = createComponent('Stop')
const ClipPath = createComponent('ClipPath')
const Pattern = createComponent('Pattern')
const Mask = createComponent('Mask')
export {
Svg,
Circle,
Ellipse,
G,
Text,
TextPath,
TSpan,
Path,
Polygon,
Polyline,
Line,
Rect,
Use,
Image,
Symbol,
Defs,
LinearGradient,
RadialGradient,
Stop,
ClipPath,
Pattern,
Mask,
}
export default Svg
+10
View File
@@ -0,0 +1,10 @@
jest.mock('rn-fetch-blob', () => {
return {
__esModule: true,
default: {
fs: {
unlink: jest.fn(),
},
},
}
})
+3
View File
@@ -0,0 +1,3 @@
jest.mock('sentry-expo', () => ({
init: () => jest.fn(),
}))
+2
View File
@@ -0,0 +1,2 @@
export const DropdownMenu = jest.fn().mockImplementation(() => {})
export const create = jest.fn().mockImplementation(() => {})
-16
View File
@@ -1,16 +0,0 @@
// /**
// * @format
// */
// import 'react-native'
// import React from 'react'
// import App from '../src/App'
// // Note: test renderer must be required after react-native.
// import renderer from 'react-test-renderer'
// it('renders correctly', () => {
// renderer.act(() => {
// renderer.create(<App />)
// })
// })
+47
View File
@@ -0,0 +1,47 @@
export const exampleComHtml = `<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta name="description" content="An example website">
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>`
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+47
View File
@@ -0,0 +1,47 @@
import {bundleAsync} from '../../../src/lib/async/bundle'
describe('bundle', () => {
it('bundles multiple simultaneous calls into one execution', async () => {
let calls = 0
const fn = bundleAsync(async () => {
calls++
await new Promise(r => setTimeout(r, 1))
return 'hello'
})
const [res1, res2, res3] = await Promise.all([fn(), fn(), fn()])
expect(calls).toEqual(1)
expect(res1).toEqual('hello')
expect(res2).toEqual('hello')
expect(res3).toEqual('hello')
})
it('does not bundle non-simultaneous calls', async () => {
let calls = 0
const fn = bundleAsync(async () => {
calls++
await new Promise(r => setTimeout(r, 1))
return 'hello'
})
const res1 = await fn()
const res2 = await fn()
const res3 = await fn()
expect(calls).toEqual(3)
expect(res1).toEqual('hello')
expect(res2).toEqual('hello')
expect(res3).toEqual('hello')
})
it('is not affected by rejections', async () => {
let calls = 0
const fn = bundleAsync(async () => {
calls++
await new Promise(r => setTimeout(r, 1))
throw new Error()
})
const res1 = await fn().catch(() => 'reject')
const res2 = await fn().catch(() => 'reject')
const res3 = await fn().catch(() => 'reject')
expect(calls).toEqual(3)
expect(res1).toEqual('reject')
expect(res2).toEqual('reject')
expect(res3).toEqual('reject')
})
})
+19
View File
@@ -0,0 +1,19 @@
import {isNetworkError} from '../../src/lib/strings/errors'
describe('isNetworkError', () => {
const inputs = [
'TypeError: Network request failed',
'Uncaught TypeError: Cannot read property x of undefined',
'Uncaught RangeError',
'Error: Aborted',
]
const outputs = [true, false, false, true]
it('correctly distinguishes network errors', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const result = isNetworkError(input)
expect(result).toEqual(outputs[i])
}
})
})
+134
View File
@@ -0,0 +1,134 @@
import {extractHtmlMeta} from '../../src/lib/link-meta/html'
import {exampleComHtml} from './__mocks__/exampleComHtml'
import {youtubeHTML} from './__mocks__/youtubeHtml'
import {tiktokHtml} from './__mocks__/tiktokHtml'
import {youtubeChannelHtml} from './__mocks__/youtubeChannelHtml'
describe('extractHtmlMeta', () => {
const cases = [
['', {}],
['nothing', {}],
['<title>title</title>', {title: 'title'}],
['<title> aSd!@#AC </title>', {title: 'aSd!@#AC'}],
['<title>\n title\n </title>', {title: 'title'}],
['<meta name="title" content="meta title">', {title: 'meta title'}],
[
'<meta name="description" content="meta description">',
{description: 'meta description'},
],
['<meta property="og:title" content="og title">', {title: 'og title'}],
[
'<meta property="og:description" content="og description">',
{description: 'og description'},
],
[
'<meta property="og:image" content="https://ogimage.com/foo.png">',
{image: 'https://ogimage.com/foo.png'},
],
[
'<meta property="twitter:title" content="twitter title">',
{title: 'twitter title'},
],
[
'<meta property="twitter:description" content="twitter description">',
{description: 'twitter description'},
],
[
'<meta property="twitter:image" content="https://twitterimage.com/foo.png">',
{image: 'https://twitterimage.com/foo.png'},
],
['<meta\n name="title"\n content="meta title"\n>', {title: 'meta title'}],
]
it.each(cases)(
'given the html tag %p, returns %p',
// @ts-ignore not worth fixing -prf
(input, expectedResult) => {
const output = extractHtmlMeta({html: input as string, hostname: ''})
expect(output).toEqual(expectedResult)
},
)
it('extracts title and description from a generic HTML page', () => {
const input = exampleComHtml
const expectedOutput = {
title: 'Example Domain',
description: 'An example website',
}
const output = extractHtmlMeta({html: input, hostname: 'example.com'})
expect(output).toEqual(expectedOutput)
})
it('extracts title and description from a Tiktok HTML page', () => {
const input = tiktokHtml
const expectedOutput = {
title:
'Coca-Cola and Mentos! Super Reaction! #cocacola #mentos #reaction #bal... | TikTok',
description:
'5.5M Likes, 20.8K Comments. TikTok video from Power Vision Tests (@_powervision_): &quot;Coca-Cola and Mentos! Super Reaction! #cocacola #mentos #reaction #balloon #sciencemoment #scienceexperiment #experiment #test #amazing #pvexp&quot;. оригинальный звук - Power Vision Tests.',
}
const output = extractHtmlMeta({html: input, hostname: 'tiktok.com'})
expect(output).toEqual(expectedOutput)
})
it('extracts title and description from a generic youtube page', () => {
const input = youtubeHTML
const expectedOutput = {
title: 'HD Video (1080p) with Relaxing Music of Native American Shamans',
description:
'Stunning HD Video ( 1080p ) of Patagonian Nature with Relaxing Native American Shamanic Music. HD footage used from ',
image: 'https://i.ytimg.com/vi/x6UITRjhijI/sddefault.jpg',
}
const output = extractHtmlMeta({html: input, hostname: 'youtube.com'})
expect(output).toEqual(expectedOutput)
})
it('extracts avatar from a youtube channel', () => {
const input = youtubeChannelHtml
const expectedOutput = {
title: 'penguinz0',
description:
'Clips channel: https://www.youtube.com/channel/UC4EQHfzIbkL_Skit_iKt1aA\n\nTwitter: https://twitter.com/MoistCr1TiKaL\n\nInstagram: https://www.instagram.com/bigmoistcr1tikal/?hl=en\n\nTwitch: https://www.twitch.tv/moistcr1tikal\n\nSnapchat: Hugecharles\n\nTik Tok: Hugecharles\n\nI don&#39;t have any other public accounts.',
image:
'https://yt3.googleusercontent.com/ytc/AL5GRJWOhJOuUC6C2b7gP-5D2q6ypXbcOOckyAE1En4RUQ=s176-c-k-c0x00ffffff-no-rj',
}
const output = extractHtmlMeta({html: input, hostname: 'youtube.com'})
expect(output).toEqual(expectedOutput)
})
it('extracts username from the url a twitter profile page', () => {
const expectedOutput = {
title: '@bluesky on Twitter',
}
const output = extractHtmlMeta({
html: '',
hostname: 'twitter.com',
pathname: '/bluesky',
})
expect(output).toEqual(expectedOutput)
})
it('extracts username from the url a tweet', () => {
const expectedOutput = {
title: 'Tweet by @bluesky',
}
const output = extractHtmlMeta({
html: '',
hostname: 'twitter.com',
pathname: '/bluesky/status/1582437529969917953',
})
expect(output).toEqual(expectedOutput)
})
it("does not extract username from the url when it's not a tweet or profile page", () => {
const expectedOutput = {
title: 'Twitter',
}
const output = extractHtmlMeta({
html: '',
hostname: 'twitter.com',
pathname: '/i/articles/follows/-1675653703?time_window=24',
})
expect(output).toEqual(expectedOutput)
})
})
+121
View File
@@ -0,0 +1,121 @@
import {
downloadAndResize,
DownloadAndResizeOpts,
} from '../../src/lib/media/manip'
import ImageResizer from '@bam.tech/react-native-image-resizer'
import RNFetchBlob from 'rn-fetch-blob'
describe('downloadAndResize', () => {
const errorSpy = jest.spyOn(global.console, 'error')
const mockResizedImage = {
path: jest.fn().mockReturnValue('file://resized-image.jpg'),
size: 100,
width: 50,
height: 50,
mime: 'image/jpeg',
}
beforeEach(() => {
const mockedCreateResizedImage =
ImageResizer.createResizedImage as jest.Mock
mockedCreateResizedImage.mockResolvedValue(mockResizedImage)
})
afterEach(() => {
jest.clearAllMocks()
})
it('should return resized image for valid URI and options', async () => {
const mockedFetch = RNFetchBlob.fetch as jest.Mock
mockedFetch.mockResolvedValueOnce({
path: jest.fn().mockReturnValue('file://downloaded-image.jpg'),
flush: jest.fn(),
})
const opts: DownloadAndResizeOpts = {
uri: 'https://example.com/image.jpg',
width: 100,
height: 100,
maxSize: 500000,
mode: 'cover',
timeout: 10000,
}
const result = await downloadAndResize(opts)
expect(result).toEqual(mockResizedImage)
expect(RNFetchBlob.config).toHaveBeenCalledWith({
fileCache: true,
appendExt: 'jpeg',
})
expect(RNFetchBlob.fetch).toHaveBeenCalledWith(
'GET',
'https://example.com/image.jpg',
)
expect(ImageResizer.createResizedImage).toHaveBeenCalledWith(
'file://downloaded-image.jpg',
100,
100,
'JPEG',
100,
undefined,
undefined,
undefined,
{mode: 'cover'},
)
})
it('should return undefined for invalid URI', async () => {
const opts: DownloadAndResizeOpts = {
uri: 'invalid-uri',
width: 100,
height: 100,
maxSize: 500000,
mode: 'cover',
timeout: 10000,
}
const result = await downloadAndResize(opts)
expect(errorSpy).toHaveBeenCalled()
expect(result).toBeUndefined()
})
it('should return undefined for unsupported file type', async () => {
const mockedFetch = RNFetchBlob.fetch as jest.Mock
mockedFetch.mockResolvedValueOnce({
path: jest.fn().mockReturnValue('file://downloaded-image'),
flush: jest.fn(),
})
const opts: DownloadAndResizeOpts = {
uri: 'https://example.com/image',
width: 100,
height: 100,
maxSize: 500000,
mode: 'cover',
timeout: 10000,
}
const result = await downloadAndResize(opts)
expect(result).toEqual(mockResizedImage)
expect(RNFetchBlob.config).toHaveBeenCalledWith({
fileCache: true,
appendExt: 'jpeg',
})
expect(RNFetchBlob.fetch).toHaveBeenCalledWith(
'GET',
'https://example.com/image',
)
expect(ImageResizer.createResizedImage).toHaveBeenCalledWith(
'file://downloaded-image',
100,
100,
'JPEG',
100,
undefined,
undefined,
undefined,
{mode: 'cover'},
)
})
})
+13
View File
@@ -0,0 +1,13 @@
import {LikelyType, getLikelyType} from '../../src/lib/link-meta/link-meta'
describe('getLikelyType', () => {
it('correctly handles non-parsed url', async () => {
const output = await getLikelyType('https://example.com')
expect(output).toEqual(LikelyType.HTML)
})
it('handles non-string urls without crashing', async () => {
const output = await getLikelyType('123')
expect(output).toEqual(LikelyType.Other)
})
})
+24
View File
@@ -0,0 +1,24 @@
import {clamp} from '../../src/lib/numbers'
describe('clamp', () => {
const inputs: [number, number, number][] = [
[100, 0, 200],
[100, 0, 100],
[0, 0, 100],
[100, 0, -1],
[4, 1, 1],
[100, -100, 0],
[400, 100, -100],
[70, -1, 1],
[Infinity, Infinity, Infinity],
]
const outputs = [100, 100, 0, -1, 1, 0, -100, 1, Infinity]
it('correctly clamps any given number and range', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const result = clamp(...input)
expect(result).toEqual(outputs[i])
}
})
})
+412
View File
@@ -0,0 +1,412 @@
import {RichText} from '@atproto/api'
import {
getYoutubeVideoId,
makeRecordUri,
toNiceDomain,
toShortUrl,
toShareUrl,
} from '../../src/lib/strings/url-helpers'
import {pluralize, enforceLen} from '../../src/lib/strings/helpers'
import {ago} from '../../src/lib/strings/time'
import {detectLinkables} from '../../src/lib/strings/rich-text-detection'
import {shortenLinks} from '../../src/lib/strings/rich-text-manip'
import {makeValidHandle, createFullHandle} from '../../src/lib/strings/handles'
import {cleanError} from '../../src/lib/strings/errors'
describe('detectLinkables', () => {
const inputs = [
'no linkable',
'@start middle end',
'start @middle end',
'start middle @end',
'@start @middle @end',
'@full123.test-of-chars',
'not@right',
'@bad!@#$chars',
'@newline1\n@newline2',
'parenthetical (@handle)',
'start https://middle.com end',
'start https://middle.com/foo/bar end',
'start https://middle.com/foo/bar?baz=bux end',
'start https://middle.com/foo/bar?baz=bux#hash end',
'https://start.com/foo/bar?baz=bux#hash middle end',
'start middle https://end.com/foo/bar?baz=bux#hash',
'https://newline1.com\nhttps://newline2.com',
'start middle.com end',
'start middle.com/foo/bar end',
'start middle.com/foo/bar?baz=bux end',
'start middle.com/foo/bar?baz=bux#hash end',
'start.com/foo/bar?baz=bux#hash middle end',
'start middle end.com/foo/bar?baz=bux#hash',
'newline1.com\nnewline2.com',
'not.. a..url ..here',
'e.g.',
'e.g. real.com fake.notreal',
'something-cool.jpg',
'website.com.jpg',
'e.g./foo',
'website.com.jpg/foo',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/ ',
'https://foo.com https://bar.com/whatever https://baz.com',
'punctuation https://foo.com, https://bar.com/whatever; https://baz.com.',
'parenthetical (https://foo.com)',
'except for https://foo.com/thing_(cool)',
]
const outputs = [
['no linkable'],
[{link: '@start'}, ' middle end'],
['start ', {link: '@middle'}, ' end'],
['start middle ', {link: '@end'}],
[{link: '@start'}, ' ', {link: '@middle'}, ' ', {link: '@end'}],
[{link: '@full123.test-of-chars'}],
['not@right'],
[{link: '@bad'}, '!@#$chars'],
[{link: '@newline1'}, '\n', {link: '@newline2'}],
['parenthetical (', {link: '@handle'}, ')'],
['start ', {link: 'https://middle.com'}, ' end'],
['start ', {link: 'https://middle.com/foo/bar'}, ' end'],
['start ', {link: 'https://middle.com/foo/bar?baz=bux'}, ' end'],
['start ', {link: 'https://middle.com/foo/bar?baz=bux#hash'}, ' end'],
[{link: 'https://start.com/foo/bar?baz=bux#hash'}, ' middle end'],
['start middle ', {link: 'https://end.com/foo/bar?baz=bux#hash'}],
[{link: 'https://newline1.com'}, '\n', {link: 'https://newline2.com'}],
['start ', {link: 'middle.com'}, ' end'],
['start ', {link: 'middle.com/foo/bar'}, ' end'],
['start ', {link: 'middle.com/foo/bar?baz=bux'}, ' end'],
['start ', {link: 'middle.com/foo/bar?baz=bux#hash'}, ' end'],
[{link: 'start.com/foo/bar?baz=bux#hash'}, ' middle end'],
['start middle ', {link: 'end.com/foo/bar?baz=bux#hash'}],
[{link: 'newline1.com'}, '\n', {link: 'newline2.com'}],
['not.. a..url ..here'],
['e.g.'],
['e.g. ', {link: 'real.com'}, ' fake.notreal'],
['something-cool.jpg'],
['website.com.jpg'],
['e.g./foo'],
['website.com.jpg/foo'],
[
'Classic article ',
{
link: 'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
},
],
[
'Classic article ',
{
link: 'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
},
' ',
],
[
{link: 'https://foo.com'},
' ',
{link: 'https://bar.com/whatever'},
' ',
{link: 'https://baz.com'},
],
[
'punctuation ',
{link: 'https://foo.com'},
', ',
{link: 'https://bar.com/whatever'},
'; ',
{link: 'https://baz.com'},
'.',
],
['parenthetical (', {link: 'https://foo.com'}, ')'],
['except for ', {link: 'https://foo.com/thing_(cool)'}],
]
it('correctly handles a set of text inputs', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const output = detectLinkables(input)
expect(output).toEqual(outputs[i])
}
})
})
describe('pluralize', () => {
const inputs: [number, string, string?][] = [
[1, 'follower'],
[1, 'member'],
[100, 'post'],
[1000, 'repost'],
[10000, 'upvote'],
[100000, 'other'],
[2, 'man', 'men'],
]
const outputs = [
'follower',
'member',
'posts',
'reposts',
'upvotes',
'others',
'men',
]
it('correctly pluralizes a set of words', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const output = pluralize(...input)
expect(output).toEqual(outputs[i])
}
})
})
describe('makeRecordUri', () => {
const inputs: [string, string, string][] = [
['alice.test', 'app.bsky.feed.post', '3jk7x4irgv52r'],
]
const outputs = ['at://alice.test/app.bsky.feed.post/3jk7x4irgv52r']
it('correctly builds a record URI', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const result = makeRecordUri(...input)
expect(result).toEqual(outputs[i])
}
})
})
describe('ago', () => {
const inputs = [
1671461038,
'04 Dec 1995 00:12:00 GMT',
new Date(),
new Date().setSeconds(new Date().getSeconds() - 10),
new Date().setMinutes(new Date().getMinutes() - 10),
new Date().setHours(new Date().getHours() - 1),
new Date().setDate(new Date().getDate() - 1),
new Date().setMonth(new Date().getMonth() - 1),
]
const outputs = [
new Date(1671461038).toLocaleDateString(),
new Date('04 Dec 1995 00:12:00 GMT').toLocaleDateString(),
'now',
'10s',
'10m',
'1h',
'1d',
'1mo',
]
it('correctly calculates how much time passed, in a string', () => {
for (let i = 0; i < inputs.length; i++) {
const result = ago(inputs[i])
expect(result).toEqual(outputs[i])
}
})
})
describe('makeValidHandle', () => {
const inputs = [
'test-handle-123',
'test!"#$%&/()=?_',
'this-handle-should-be-too-big',
]
const outputs = ['test-handle-123', 'test', 'this-handle-should-b']
it('correctly parses and corrects handles', () => {
for (let i = 0; i < inputs.length; i++) {
const result = makeValidHandle(inputs[i])
expect(result).toEqual(outputs[i])
}
})
})
describe('createFullHandle', () => {
const inputs: [string, string][] = [
['test-handle-123', 'test'],
['.test.handle', 'test.test.'],
['test.handle.', '.test.test'],
]
const outputs = [
'test-handle-123.test',
'.test.handle.test.test.',
'test.handle.test.test',
]
it('correctly parses and corrects handles', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const result = createFullHandle(...input)
expect(result).toEqual(outputs[i])
}
})
})
describe('enforceLen', () => {
const inputs: [string, number][] = [
['Hello World!', 5],
['Hello World!', 20],
['', 5],
]
const outputs = ['Hello', 'Hello World!', '']
it('correctly enforces defined length on a given string', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const result = enforceLen(...input)
expect(result).toEqual(outputs[i])
}
})
})
describe('cleanError', () => {
const inputs = [
'TypeError: Network request failed',
'Error: Aborted',
'Error: TypeError "x" is not a function',
'Error: SyntaxError unexpected token "export"',
'Some other error',
]
const outputs = [
'Unable to connect. Please check your internet connection and try again.',
'Unable to connect. Please check your internet connection and try again.',
'TypeError "x" is not a function',
'SyntaxError unexpected token "export"',
'Some other error',
]
it('removes extra content from error message', () => {
for (let i = 0; i < inputs.length; i++) {
const result = cleanError(inputs[i])
expect(result).toEqual(outputs[i])
}
})
})
describe('toNiceDomain', () => {
const inputs = [
'https://example.com/index.html',
'https://bsky.app',
'https://bsky.social',
'#123123123',
]
const outputs = ['example.com', 'bsky.app', 'Bluesky Social', '#123123123']
it("displays the url's host in a easily readable manner", () => {
for (let i = 0; i < inputs.length; i++) {
const result = toNiceDomain(inputs[i])
expect(result).toEqual(outputs[i])
}
})
})
describe('toShortUrl', () => {
const inputs = [
'https://bsky.app',
'https://bsky.app/3jk7x4irgv52r',
'https://bsky.app/3jk7x4irgv52r2313y182h9',
'https://very-long-domain-name.com/foo',
'https://very-long-domain-name.com/foo?bar=baz#andsomemore',
]
const outputs = [
'bsky.app',
'bsky.app/3jk7x4irgv52r',
'bsky.app/3jk7x4irgv52...',
'very-long-domain-name.com/foo',
'very-long-domain-name.com/foo?bar=baz#...',
]
it('shortens the url', () => {
for (let i = 0; i < inputs.length; i++) {
const result = toShortUrl(inputs[i])
expect(result).toEqual(outputs[i])
}
})
})
describe('toShareUrl', () => {
const inputs = ['https://bsky.app', '/3jk7x4irgv52r', 'item/test/123']
const outputs = [
'https://bsky.app',
'https://bsky.app/3jk7x4irgv52r',
'https://bsky.app/item/test/123',
]
it('appends https, when not present', () => {
for (let i = 0; i < inputs.length; i++) {
const result = toShareUrl(inputs[i])
expect(result).toEqual(outputs[i])
}
})
})
describe('getYoutubeVideoId', () => {
it(' should return undefined for invalid youtube links', () => {
expect(getYoutubeVideoId('')).toBeUndefined()
expect(getYoutubeVideoId('https://www.google.com')).toBeUndefined()
expect(getYoutubeVideoId('https://www.youtube.com')).toBeUndefined()
expect(
getYoutubeVideoId('https://www.youtube.com/channelName'),
).toBeUndefined()
expect(
getYoutubeVideoId('https://www.youtube.com/channel/channelName'),
).toBeUndefined()
})
it('getYoutubeVideoId should return video id for valid youtube links', () => {
expect(getYoutubeVideoId('https://www.youtube.com/watch?v=videoId')).toBe(
'videoId',
)
expect(
getYoutubeVideoId(
'https://www.youtube.com/watch?v=videoId&feature=share',
),
).toBe('videoId')
expect(getYoutubeVideoId('https://youtu.be/videoId')).toBe('videoId')
})
})
describe('shortenLinks', () => {
const inputs = [
'start https://middle.com/foo/bar?baz=bux#hash end',
'https://start.com/foo/bar?baz=bux#hash middle end',
'start middle https://end.com/foo/bar?baz=bux#hash',
'https://newline1.com/very/long/url/here\nhttps://newline2.com/very/long/url/here',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
]
const outputs = [
[
'start middle.com/foo/bar?baz=... end',
['https://middle.com/foo/bar?baz=bux#hash'],
],
[
'start.com/foo/bar?baz=... middle end',
['https://start.com/foo/bar?baz=bux#hash'],
],
[
'start middle end.com/foo/bar?baz=...',
['https://end.com/foo/bar?baz=bux#hash'],
],
[
'newline1.com/very/long/ur...\nnewline2.com/very/long/ur...',
[
'https://newline1.com/very/long/url/here',
'https://newline2.com/very/long/url/here',
],
],
[
'Classic article socket3.wordpress.com/2018/02/03/d...',
[
'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
],
],
]
it('correctly shortens rich text while preserving facet URIs', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const inputRT = new RichText({text: input})
inputRT.detectFacetsWithoutResolution()
const outputRT = shortenLinks(inputRT)
expect(outputRT.text).toEqual(outputs[i][0])
expect(outputRT.facets?.length).toEqual(outputs[i][1].length)
for (let j = 0; j < outputs[i][1].length; j++) {
expect(outputRT.facets![j].features[0].uri).toEqual(outputs[i][1][j])
}
}
})
})
@@ -0,0 +1,84 @@
import {
getMentionAt,
insertMentionAt,
} from '../../../src/lib/strings/mention-manip'
describe('getMentionAt', () => {
type Case = [string, number, string | undefined]
const cases: Case[] = [
['hello @alice goodbye', 0, undefined],
['hello @alice goodbye', 1, undefined],
['hello @alice goodbye', 2, undefined],
['hello @alice goodbye', 3, undefined],
['hello @alice goodbye', 4, undefined],
['hello @alice goodbye', 5, undefined],
['hello @alice goodbye', 6, 'alice'],
['hello @alice goodbye', 7, 'alice'],
['hello @alice goodbye', 8, 'alice'],
['hello @alice goodbye', 9, 'alice'],
['hello @alice goodbye', 10, 'alice'],
['hello @alice goodbye', 11, 'alice'],
['hello @alice goodbye', 12, 'alice'],
['hello @alice goodbye', 13, undefined],
['hello @alice goodbye', 14, undefined],
['@alice', 0, 'alice'],
['@alice hello', 0, 'alice'],
['@alice hello', 1, 'alice'],
['@alice hello', 2, 'alice'],
['@alice hello', 3, 'alice'],
['@alice hello', 4, 'alice'],
['@alice hello', 5, 'alice'],
['@alice hello', 6, 'alice'],
['@alice hello', 7, undefined],
['alice@alice', 0, undefined],
['alice@alice', 6, undefined],
]
it.each(cases)(
'given input string %p and cursor position %p, returns %p',
(str, cursorPos, expected) => {
const output = getMentionAt(str, cursorPos)
expect(output?.value).toEqual(expected)
},
)
})
describe('insertMentionAt', () => {
type Case = [string, number, string]
const cases: Case[] = [
['hello @alice goodbye', 0, 'hello @alice goodbye'],
['hello @alice goodbye', 1, 'hello @alice goodbye'],
['hello @alice goodbye', 2, 'hello @alice goodbye'],
['hello @alice goodbye', 3, 'hello @alice goodbye'],
['hello @alice goodbye', 4, 'hello @alice goodbye'],
['hello @alice goodbye', 5, 'hello @alice goodbye'],
['hello @alice goodbye', 6, 'hello @alice.com goodbye'],
['hello @alice goodbye', 7, 'hello @alice.com goodbye'],
['hello @alice goodbye', 8, 'hello @alice.com goodbye'],
['hello @alice goodbye', 9, 'hello @alice.com goodbye'],
['hello @alice goodbye', 10, 'hello @alice.com goodbye'],
['hello @alice goodbye', 11, 'hello @alice.com goodbye'],
['hello @alice goodbye', 12, 'hello @alice.com goodbye'],
['hello @alice goodbye', 13, 'hello @alice goodbye'],
['hello @alice goodbye', 14, 'hello @alice goodbye'],
['@alice', 0, '@alice.com '],
['@alice hello', 0, '@alice.com hello'],
['@alice hello', 1, '@alice.com hello'],
['@alice hello', 2, '@alice.com hello'],
['@alice hello', 3, '@alice.com hello'],
['@alice hello', 4, '@alice.com hello'],
['@alice hello', 5, '@alice.com hello'],
['@alice hello', 6, '@alice.com hello'],
['@alice hello', 7, '@alice hello'],
['alice@alice', 0, 'alice@alice'],
['alice@alice', 6, 'alice@alice'],
]
it.each(cases)(
'given input string %p and cursor position %p, returns %p',
(str, cursorPos, expected) => {
const output = insertMentionAt(str, cursorPos, 'alice.com')
expect(output).toEqual(expected)
},
)
})
+134
View File
@@ -0,0 +1,134 @@
import {
linkRequiresWarning,
isPossiblyAUrl,
splitApexDomain,
} from '../../../src/lib/strings/url-helpers'
describe('linkRequiresWarning', () => {
type Case = [string, string, boolean]
const cases: Case[] = [
['http://example.com', 'http://example.com', false],
['http://example.com', 'example.com', false],
['http://example.com', 'example.com/page', false],
['http://example.com', '', true],
['http://example.com', 'other.com', true],
['http://example.com', 'http://other.com', true],
['http://example.com', 'some label', true],
['http://example.com', 'example.com more', true],
['http://example.com', 'http://example.co', true],
['http://example.co', 'http://example.com', true],
['http://example.com', 'example.co', true],
['http://example.co', 'example.com', true],
['http://site.pages.dev', 'http://site.page', true],
['http://site.page', 'http://site.pages.dev', true],
['http://site.pages.dev', 'site.page', true],
['http://site.page', 'site.pages.dev', true],
['http://site.pages.dev', 'http://site.pages', true],
['http://site.pages', 'http://site.pages.dev', true],
['http://site.pages.dev', 'site.pages', true],
['http://site.pages', 'site.pages.dev', true],
['http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 'my post', false],
['https://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 'my post', false],
['http://bsky.app/', 'bluesky', false],
['https://bsky.app/', 'bluesky', false],
[
'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
false,
],
[
'https://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
false,
],
[
'http://bsky.app/',
'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
false,
],
[
'https://bsky.app/',
'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
false,
],
[
'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
'https://google.com',
true,
],
[
'https://bsky.app/profile/bob.test/post/3kbeuduu7m22v',
'https://google.com',
true,
],
['http://bsky.app/', 'https://google.com', true],
['https://bsky.app/', 'https://google.com', true],
// bad uri inputs, default to true
['', '', true],
['example.com', 'example.com', true],
]
it.each(cases)(
'given input uri %p and text %p, returns %p',
(uri, text, expected) => {
const output = linkRequiresWarning(uri, text)
expect(output).toEqual(expected)
},
)
})
describe('isPossiblyAUrl', () => {
type Case = [string, boolean]
const cases: Case[] = [
['', false],
['text', false],
['some text', false],
['some text', false],
['some domain.com', false],
['domain.com', true],
[' domain.com', true],
['domain.com ', true],
[' domain.com ', true],
['http://domain.com', true],
[' http://domain.com', true],
['http://domain.com ', true],
[' http://domain.com ', true],
['https://domain.com', true],
[' https://domain.com', true],
['https://domain.com ', true],
[' https://domain.com ', true],
['http://domain.com/foo', true],
['http://domain.com stuff', true],
]
it.each(cases)('given input uri %p, returns %p', (str, expected) => {
const output = isPossiblyAUrl(str)
expect(output).toEqual(expected)
})
})
describe('splitApexDomain', () => {
type Case = [string, string, string]
const cases: Case[] = [
['', '', ''],
['example.com', '', 'example.com'],
['foo.example.com', 'foo.', 'example.com'],
['foo.bar.example.com', 'foo.bar.', 'example.com'],
['example.co.uk', '', 'example.co.uk'],
['foo.example.co.uk', 'foo.', 'example.co.uk'],
['example.nonsense', '', 'example.nonsense'],
['foo.example.nonsense', '', 'foo.example.nonsense'],
['foo.bar.example.nonsense', '', 'foo.bar.example.nonsense'],
['example.com.example.com', 'example.com.', 'example.com'],
]
it.each(cases)(
'given input uri %p, returns %p,%p',
(str, expected1, expected2) => {
const output = splitApexDomain(str)
expect(output[0]).toEqual(expected1)
expect(output[1]).toEqual(expected2)
},
)
})
-118
View File
@@ -1,118 +0,0 @@
import {LikelyType, getLinkMeta} from '../src/lib/link-meta'
const exampleComHtml = `<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta name="description" content="An example website">
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>`
describe('getLinkMeta', () => {
const inputs = [
'',
'httpbadurl',
'https://example.com',
'https://example.com/index.html',
'https://example.com/image.png',
'https://example.com/video.avi',
'https://example.com/audio.ogg',
'https://example.com/javascript.js',
]
const outputs = [
{
error: 'Invalid URL',
likelyType: LikelyType.Other,
url: '',
},
{
error: 'Invalid URL',
likelyType: LikelyType.Other,
url: 'httpbadurl',
},
{
likelyType: LikelyType.HTML,
url: 'https://example.com',
title: 'Example Domain',
description: 'An example website',
},
{
likelyType: LikelyType.HTML,
url: 'https://example.com/index.html',
title: 'Example Domain',
description: 'An example website',
},
{
likelyType: LikelyType.Image,
url: 'https://example.com/image.png',
},
{
likelyType: LikelyType.Video,
url: 'https://example.com/video.avi',
},
{
likelyType: LikelyType.Audio,
url: 'https://example.com/audio.ogg',
},
{
likelyType: LikelyType.Other,
url: 'https://example.com/javascript.js',
},
]
it('correctly handles a set of text inputs', async () => {
for (let i = 0; i < inputs.length; i++) {
global.fetch = jest.fn().mockImplementationOnce(() => {
return new Promise((resolve, reject) => {
resolve({
ok: true,
status: 200,
text: () => exampleComHtml,
})
})
})
const input = inputs[i]
const output = await getLinkMeta(input)
expect(output).toEqual(outputs[i])
}
})
})
-319
View File
@@ -1,319 +0,0 @@
import {
extractEntities,
detectLinkables,
extractHtmlMeta,
} from '../src/lib/strings'
describe('extractEntities', () => {
const knownHandles = new Set(['handle.com', 'full123.test-of-chars'])
const inputs = [
'no mention',
'@handle.com middle end',
'start @handle.com end',
'start middle @handle.com',
'@handle.com @handle.com @handle.com',
'@full123.test-of-chars',
'not@right',
'@handle.com!@#$chars',
'@handle.com\n@handle.com',
'parenthetical (@handle.com)',
'start https://middle.com end',
'start https://middle.com/foo/bar end',
'start https://middle.com/foo/bar?baz=bux end',
'start https://middle.com/foo/bar?baz=bux#hash end',
'https://start.com/foo/bar?baz=bux#hash middle end',
'start middle https://end.com/foo/bar?baz=bux#hash',
'https://newline1.com\nhttps://newline2.com',
'start middle.com end',
'start middle.com/foo/bar end',
'start middle.com/foo/bar?baz=bux end',
'start middle.com/foo/bar?baz=bux#hash end',
'start.com/foo/bar?baz=bux#hash middle end',
'start middle end.com/foo/bar?baz=bux#hash',
'newline1.com\nnewline2.com',
'not.. a..url ..here',
'e.g.',
'something-cool.jpg',
'website.com.jpg',
'e.g./foo',
'website.com.jpg/foo',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/ ',
'https://foo.com https://bar.com/whatever https://baz.com',
'punctuation https://foo.com, https://bar.com/whatever; https://baz.com.',
'parenthentical (https://foo.com)',
'except for https://foo.com/thing_(cool)',
]
interface Output {
type: string
value: string
noScheme?: boolean
}
const outputs: Output[][] = [
[],
[{type: 'mention', value: 'handle.com'}],
[{type: 'mention', value: 'handle.com'}],
[{type: 'mention', value: 'handle.com'}],
[
{type: 'mention', value: 'handle.com'},
{type: 'mention', value: 'handle.com'},
{type: 'mention', value: 'handle.com'},
],
[
{
type: 'mention',
value: 'full123.test-of-chars',
},
],
[],
[{type: 'mention', value: 'handle.com'}],
[
{type: 'mention', value: 'handle.com'},
{type: 'mention', value: 'handle.com'},
],
[{type: 'mention', value: 'handle.com'}],
[{type: 'link', value: 'https://middle.com'}],
[{type: 'link', value: 'https://middle.com/foo/bar'}],
[{type: 'link', value: 'https://middle.com/foo/bar?baz=bux'}],
[{type: 'link', value: 'https://middle.com/foo/bar?baz=bux#hash'}],
[{type: 'link', value: 'https://start.com/foo/bar?baz=bux#hash'}],
[{type: 'link', value: 'https://end.com/foo/bar?baz=bux#hash'}],
[
{type: 'link', value: 'https://newline1.com'},
{type: 'link', value: 'https://newline2.com'},
],
[{type: 'link', value: 'middle.com', noScheme: true}],
[{type: 'link', value: 'middle.com/foo/bar', noScheme: true}],
[{type: 'link', value: 'middle.com/foo/bar?baz=bux', noScheme: true}],
[{type: 'link', value: 'middle.com/foo/bar?baz=bux#hash', noScheme: true}],
[{type: 'link', value: 'start.com/foo/bar?baz=bux#hash', noScheme: true}],
[{type: 'link', value: 'end.com/foo/bar?baz=bux#hash', noScheme: true}],
[
{type: 'link', value: 'newline1.com', noScheme: true},
{type: 'link', value: 'newline2.com', noScheme: true},
],
[],
[],
[],
[],
[],
[],
[
{
type: 'link',
value:
'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
},
],
[
{
type: 'link',
value:
'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
},
],
[
{type: 'link', value: 'https://foo.com'},
{type: 'link', value: 'https://bar.com/whatever'},
{type: 'link', value: 'https://baz.com'},
],
[
{type: 'link', value: 'https://foo.com'},
{type: 'link', value: 'https://bar.com/whatever'},
{type: 'link', value: 'https://baz.com'},
],
[{type: 'link', value: 'https://foo.com'}],
[{type: 'link', value: 'https://foo.com/thing_(cool)'}],
]
it('correctly handles a set of text inputs', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const result = extractEntities(input, knownHandles)
if (!outputs[i].length) {
expect(result).toBeFalsy()
} else if (outputs[i].length && !result) {
expect(result).toBeTruthy()
} else if (result) {
expect(result.length).toBe(outputs[i].length)
for (let j = 0; j < outputs[i].length; j++) {
expect(result[j].type).toEqual(outputs[i][j].type)
if (outputs[i][j].noScheme) {
expect(result[j].value).toEqual(`https://${outputs[i][j].value}`)
} else {
expect(result[j].value).toEqual(outputs[i][j].value)
}
if (outputs[i]?.[j].type === 'mention') {
expect(
input.slice(result[j].index.start, result[j].index.end),
).toBe(`@${result[j].value}`)
} else {
if (!outputs[i]?.[j].noScheme) {
expect(
input.slice(result[j].index.start, result[j].index.end),
).toBe(result[j].value)
} else {
expect(
input.slice(result[j].index.start, result[j].index.end),
).toBe(result[j].value.slice('https://'.length))
}
}
}
}
}
})
})
describe('detectLinkables', () => {
const inputs = [
'no linkable',
'@start middle end',
'start @middle end',
'start middle @end',
'@start @middle @end',
'@full123.test-of-chars',
'not@right',
'@bad!@#$chars',
'@newline1\n@newline2',
'parenthetical (@handle)',
'start https://middle.com end',
'start https://middle.com/foo/bar end',
'start https://middle.com/foo/bar?baz=bux end',
'start https://middle.com/foo/bar?baz=bux#hash end',
'https://start.com/foo/bar?baz=bux#hash middle end',
'start middle https://end.com/foo/bar?baz=bux#hash',
'https://newline1.com\nhttps://newline2.com',
'start middle.com end',
'start middle.com/foo/bar end',
'start middle.com/foo/bar?baz=bux end',
'start middle.com/foo/bar?baz=bux#hash end',
'start.com/foo/bar?baz=bux#hash middle end',
'start middle end.com/foo/bar?baz=bux#hash',
'newline1.com\nnewline2.com',
'not.. a..url ..here',
'e.g.',
'e.g. real.com fake.notreal',
'something-cool.jpg',
'website.com.jpg',
'e.g./foo',
'website.com.jpg/foo',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
'Classic article https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/ ',
'https://foo.com https://bar.com/whatever https://baz.com',
'punctuation https://foo.com, https://bar.com/whatever; https://baz.com.',
'parenthentical (https://foo.com)',
'except for https://foo.com/thing_(cool)',
]
const outputs = [
['no linkable'],
[{link: '@start'}, ' middle end'],
['start ', {link: '@middle'}, ' end'],
['start middle ', {link: '@end'}],
[{link: '@start'}, ' ', {link: '@middle'}, ' ', {link: '@end'}],
[{link: '@full123.test-of-chars'}],
['not@right'],
[{link: '@bad'}, '!@#$chars'],
[{link: '@newline1'}, '\n', {link: '@newline2'}],
['parenthetical (', {link: '@handle'}, ')'],
['start ', {link: 'https://middle.com'}, ' end'],
['start ', {link: 'https://middle.com/foo/bar'}, ' end'],
['start ', {link: 'https://middle.com/foo/bar?baz=bux'}, ' end'],
['start ', {link: 'https://middle.com/foo/bar?baz=bux#hash'}, ' end'],
[{link: 'https://start.com/foo/bar?baz=bux#hash'}, ' middle end'],
['start middle ', {link: 'https://end.com/foo/bar?baz=bux#hash'}],
[{link: 'https://newline1.com'}, '\n', {link: 'https://newline2.com'}],
['start ', {link: 'middle.com'}, ' end'],
['start ', {link: 'middle.com/foo/bar'}, ' end'],
['start ', {link: 'middle.com/foo/bar?baz=bux'}, ' end'],
['start ', {link: 'middle.com/foo/bar?baz=bux#hash'}, ' end'],
[{link: 'start.com/foo/bar?baz=bux#hash'}, ' middle end'],
['start middle ', {link: 'end.com/foo/bar?baz=bux#hash'}],
[{link: 'newline1.com'}, '\n', {link: 'newline2.com'}],
['not.. a..url ..here'],
['e.g.'],
['e.g. ', {link: 'real.com'}, ' fake.notreal'],
['something-cool.jpg'],
['website.com.jpg'],
['e.g./foo'],
['website.com.jpg/foo'],
[
'Classic article ',
{
link: 'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
},
],
[
'Classic article ',
{
link: 'https://socket3.wordpress.com/2018/02/03/designing-windows-95s-user-interface/',
},
' ',
],
[
{link: 'https://foo.com'},
' ',
{link: 'https://bar.com/whatever'},
' ',
{link: 'https://baz.com'},
],
[
'punctuation ',
{link: 'https://foo.com'},
', ',
{link: 'https://bar.com/whatever'},
'; ',
{link: 'https://baz.com'},
'.',
],
['parenthentical (', {link: 'https://foo.com'}, ')'],
['except for ', {link: 'https://foo.com/thing_(cool)'}],
]
it('correctly handles a set of text inputs', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const output = detectLinkables(input)
expect(output).toEqual(outputs[i])
}
})
})
describe('extractHtmlMeta', () => {
const inputs = [
'',
'nothing',
'<title>title</title>',
'<title> aSd!@#AC </title>',
'<title>\n title\n </title>',
'<meta name="title" content="meta title">',
'<meta name="description" content="meta description">',
'<meta property="og:title" content="og title">',
'<meta property="og:description" content="og description">',
'<meta property="og:image" content="https://ogimage.com/foo.png">',
'<meta property="twitter:title" content="twitter title">',
'<meta property="twitter:description" content="twitter description">',
'<meta property="twitter:image" content="https://twitterimage.com/foo.png">',
'<meta\n name="title"\n content="meta title"\n>',
]
const outputs = [
{},
{},
{title: 'title'},
{title: 'aSd!@#AC'},
{title: 'title'},
{title: 'meta title'},
{description: 'meta description'},
{title: 'og title'},
{description: 'og description'},
{image: 'https://ogimage.com/foo.png'},
{title: 'twitter title'},
{description: 'twitter description'},
{image: 'https://twitterimage.com/foo.png'},
{title: 'meta title'},
]
it('correctly handles a set of text inputs', () => {
for (let i = 0; i < inputs.length; i++) {
const input = inputs[i]
const output = extractHtmlMeta(input)
expect(output).toEqual(outputs[i])
}
})
})
-55
View File
@@ -1,55 +0,0 @@
# To learn about Buck see [Docs](https://buckbuild.com/).
# To run your application with Buck:
# - install Buck
# - `npm start` - to start the packager
# - `cd android`
# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
# - `buck install -r android/app` - compile, install and run application
#
load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
lib_deps = []
create_aar_targets(glob(["libs/*.aar"]))
create_jar_targets(glob(["libs/*.jar"]))
android_library(
name = "all-libs",
exported_deps = lib_deps,
)
android_library(
name = "app-code",
srcs = glob([
"src/main/java/**/*.java",
]),
deps = [
":all-libs",
":build_config",
":res",
],
)
android_build_config(
name = "build_config",
package = "xyz.blueskyweb.app",
)
android_resource(
name = "res",
package = "xyz.blueskyweb.app",
res = "src/main/res",
)
android_binary(
name = "app",
keystore = "//android/keystores:debug",
manifest = "src/main/AndroidManifest.xml",
package_type = "debug",
deps = [
":app-code",
],
)
-320
View File
@@ -1,320 +0,0 @@
apply plugin: "com.android.application"
import com.android.build.OutputFile
import org.apache.tools.ant.taskdefs.condition.Os
/**
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
* and bundleReleaseJsAndAssets).
* These basically call `react-native bundle` with the correct arguments during the Android build
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
* bundle directly from the development server. Below you can see all the possible configurations
* and their defaults. If you decide to add a configuration block, make sure to add it before the
* `apply from: "../../node_modules/react-native/react.gradle"` line.
*
* project.ext.react = [
* // the name of the generated asset file containing your JS bundle
* bundleAssetName: "index.android.bundle",
*
* // the entry file for bundle generation. If none specified and
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
* // default. Can be overridden with ENTRY_FILE environment variable.
* entryFile: "index.android.js",
*
* // https://reactnative.dev/docs/performance#enable-the-ram-format
* bundleCommand: "ram-bundle",
*
* // whether to bundle JS and assets in debug mode
* bundleInDebug: false,
*
* // whether to bundle JS and assets in release mode
* bundleInRelease: true,
*
* // whether to bundle JS and assets in another build variant (if configured).
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
* // The configuration property can be in the following formats
* // 'bundleIn${productFlavor}${buildType}'
* // 'bundleIn${buildType}'
* // bundleInFreeDebug: true,
* // bundleInPaidRelease: true,
* // bundleInBeta: true,
*
* // whether to disable dev mode in custom build variants (by default only disabled in release)
* // for example: to disable dev mode in the staging build type (if configured)
* devDisabledInStaging: true,
* // The configuration property can be in the following formats
* // 'devDisabledIn${productFlavor}${buildType}'
* // 'devDisabledIn${buildType}'
*
* // the root of your project, i.e. where "package.json" lives
* root: "../../",
*
* // where to put the JS bundle asset in debug mode
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
*
* // where to put the JS bundle asset in release mode
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
*
* // where to put drawable resources / React Native assets, e.g. the ones you use via
* // require('./image.png')), in debug mode
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
*
* // where to put drawable resources / React Native assets, e.g. the ones you use via
* // require('./image.png')), in release mode
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
*
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
* // for example, you might want to remove it from here.
* inputExcludes: ["android/**", "ios/**"],
*
* // override which node gets called and with what additional arguments
* nodeExecutableAndArgs: ["node"],
*
* // supply additional arguments to the packager
* extraPackagerArgs: []
* ]
*/
project.ext.react = [
enableHermes: false, // clean and rebuild if changing
]
apply from: "../../node_modules/react-native/react.gradle"
/**
* Set this to true to create two separate APKs instead of one:
* - An APK that only works on ARM devices
* - An APK that only works on x86 devices
* The advantage is the size of the APK is reduced by about 4MB.
* Upload all the APKs to the Play Store and people will download
* the correct one based on the CPU architecture of their device.
*/
def enableSeparateBuildPerCPUArchitecture = false
/**
* Run Proguard to shrink the Java bytecode in release builds.
*/
def enableProguardInReleaseBuilds = false
/**
* The preferred build flavor of JavaScriptCore.
*
* For example, to use the international variant, you can use:
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
*
* The international variant includes ICU i18n library and necessary data
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
* give correct results when using with locales other than en-US. Note that
* this variant is about 6MiB larger per architecture than default.
*/
def jscFlavor = 'org.webkit:android-jsc:+'
/**
* Whether to enable the Hermes VM.
*
* This should be set on project.ext.react and that value will be read here. If it is not set
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
* and the benefits of using Hermes will therefore be sharply reduced.
*/
def enableHermes = project.ext.react.get("enableHermes", false);
/**
* Architectures to build native code for.
*/
def reactNativeArchitectures() {
def value = project.getProperties().get("reactNativeArchitectures")
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
}
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "xyz.blueskyweb.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture.
externalNativeBuild {
ndkBuild {
arguments "APP_PLATFORM=android-21",
"APP_STL=c++_shared",
"NDK_TOOLCHAIN_VERSION=clang",
"GENERATED_SRC_DIR=$buildDir/generated/source",
"PROJECT_BUILD_DIR=$buildDir",
"REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
"REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build"
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
cppFlags "-std=c++17"
// Make sure this target name is the same you specify inside the
// src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
targets "app_appmodules"
// Fix for windows limit on number of character in file paths and in command lines
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
arguments "NDK_APP_SHORT_COMMANDS=true"
}
}
}
if (!enableSeparateBuildPerCPUArchitecture) {
ndk {
abiFilters (*reactNativeArchitectures())
}
}
}
}
if (isNewArchitectureEnabled()) {
// We configure the NDK build only if you decide to opt-in for the New Architecture.
externalNativeBuild {
ndkBuild {
path "$projectDir/src/main/jni/Android.mk"
}
}
def reactAndroidProjectDir = project(':ReactAndroid').projectDir
def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) {
dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck")
from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
into("$buildDir/react-ndk/exported")
}
def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) {
dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck")
from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
into("$buildDir/react-ndk/exported")
}
afterEvaluate {
// If you wish to add a custom TurboModule or component locally,
// you should uncomment this line.
// preBuild.dependsOn("generateCodegenArtifactsFromSchema")
preDebugBuild.dependsOn(packageReactNdkDebugLibs)
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
// Due to a bug inside AGP, we have to explicitly set a dependency
// between configureNdkBuild* tasks and the preBuild tasks.
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
configureNdkBuildRelease.dependsOn(preReleaseBuild)
configureNdkBuildDebug.dependsOn(preDebugBuild)
reactNativeArchitectures().each { architecture ->
tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure {
dependsOn("preDebugBuild")
}
tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure {
dependsOn("preReleaseBuild")
}
}
}
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include (*reactNativeArchitectures())
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
// Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
exclude group:'com.facebook.fbjni'
}
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
} else {
implementation jscFlavor
}
}
if (isNewArchitectureEnabled()) {
// If new architecture is enabled, we let you build RN from source
// Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
// This will be applied to all the imported transtitive dependency.
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute(module("com.facebook.react:react-native"))
.using(project(":ReactAndroid")).because("On New Architecture we're building React Native from source")
}
}
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.implementation
into 'libs'
}
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
def isNewArchitectureEnabled() {
// To opt-in for the New Architecture, you can either:
// - Set `newArchEnabled` to true inside the `gradle.properties` file
// - Invoke gradle with `-newArchEnabled=true`
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
}
-19
View File
@@ -1,19 +0,0 @@
"""Helper definitions to glob .aar and .jar targets"""
def create_aar_targets(aarfiles):
for aarfile in aarfiles:
name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
lib_deps.append(":" + name)
android_prebuilt_aar(
name = name,
aar = aarfile,
)
def create_jar_targets(jarfiles):
for jarfile in jarfiles:
name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
lib_deps.append(":" + name)
prebuilt_jar(
name = name,
binary_jar = jarfile,
)
Binary file not shown.
-10
View File
@@ -1,10 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
-13
View File
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
</application>
</manifest>
@@ -1,73 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package com.app;
import android.content.Context;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.android.utils.FlipperUtils;
import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
import com.facebook.react.ReactInstanceEventListener;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.modules.network.NetworkingModule;
import okhttp3.OkHttpClient;
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
if (FlipperUtils.shouldEnableFlipper(context)) {
final FlipperClient client = AndroidFlipperClient.getInstance(context);
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
client.addPlugin(new ReactFlipperPlugin());
client.addPlugin(new DatabasesFlipperPlugin(context));
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
client.addPlugin(CrashReporterPlugin.getInstance());
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
NetworkingModule.setCustomClientBuilder(
new NetworkingModule.CustomClientBuilder() {
@Override
public void apply(OkHttpClient.Builder builder) {
builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
}
});
client.addPlugin(networkFlipperPlugin);
client.start();
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
// Hence we run if after all native modules have been initialized
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if (reactContext == null) {
reactInstanceManager.addReactInstanceEventListener(
new ReactInstanceEventListener() {
@Override
public void onReactContextInitialized(ReactContext reactContext) {
reactInstanceManager.removeReactInstanceEventListener(this);
reactContext.runOnNativeModulesQueueThread(
new Runnable() {
@Override
public void run() {
client.addPlugin(new FrescoFlipperPlugin());
}
});
}
});
} else {
client.addPlugin(new FrescoFlipperPlugin());
}
}
}
}
-44
View File
@@ -1,44 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xyz.blueskyweb.app">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- deep linking via web links -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- debug host: https://bsky.pfrazee.com -->
<data android:scheme="https" />
<data android:host="bsky.pfrazee.com" />
</intent-filter>
<!-- deep linking via custom links -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- debug scheme: bsky://app -->
<data android:scheme="bsky" />
<data android:host="app" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -1,46 +0,0 @@
package xyz.blueskyweb.app;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import android.os.Bundle;
public class MainActivity extends ReactActivity {
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
* rendering of the component.
*/
@Override
protected String getMainComponentName() {
return "xyz.blueskyweb.app";
}
/**
* Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
* you can specify the rendered you wish to use (Fabric or the older renderer).
*/
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new MainActivityDelegate(this, getMainComponentName());
}
public static class MainActivityDelegate extends ReactActivityDelegate {
public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
super(activity, mainComponentName);
}
@Override
protected ReactRootView createRootView() {
ReactRootView reactRootView = new ReactRootView(getContext());
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
return reactRootView;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
}
}
}
@@ -1,91 +0,0 @@
package xyz.blueskyweb.app;
import android.app.Application;
import android.content.Context;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.soloader.SoLoader;
import xyz.blueskyweb.app.newarchitecture.MainApplicationReactNativeHost;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost =
new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
};
private final ReactNativeHost mNewArchitectureNativeHost =
new MainApplicationReactNativeHost(this);
@Override
public ReactNativeHost getReactNativeHost() {
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
return mNewArchitectureNativeHost;
} else {
return mReactNativeHost;
}
}
@Override
public void onCreate() {
super.onCreate();
// If you opted-in for the New Architecture, we enable the TurboModule system
ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
SoLoader.init(this, /* native exopackage */ false);
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
}
/**
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
*
* @param context
* @param reactInstanceManager
*/
private static void initializeFlipper(
Context context, ReactInstanceManager reactInstanceManager) {
if (BuildConfig.DEBUG) {
try {
/*
We use reflection here to pick up the class that initializes Flipper,
since Flipper library is not available in release mode
*/
Class<?> aClass = Class.forName("com.app.ReactNativeFlipper");
aClass
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
.invoke(null, context, reactInstanceManager);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
@@ -1,116 +0,0 @@
package xyz.blueskyweb.app.newarchitecture;
import android.app.Application;
import androidx.annotation.NonNull;
import com.facebook.react.PackageList;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
import com.facebook.react.bridge.JSIModulePackage;
import com.facebook.react.bridge.JSIModuleProvider;
import com.facebook.react.bridge.JSIModuleSpec;
import com.facebook.react.bridge.JSIModuleType;
import com.facebook.react.bridge.JavaScriptContextHolder;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.UIManager;
import com.facebook.react.fabric.ComponentFactory;
import com.facebook.react.fabric.CoreComponentsRegistry;
import com.facebook.react.fabric.EmptyReactNativeConfig;
import com.facebook.react.fabric.FabricJSIModuleProvider;
import com.facebook.react.uimanager.ViewManagerRegistry;
import xyz.blueskyweb.app.BuildConfig;
import xyz.blueskyweb.app.newarchitecture.components.MainComponentsRegistry;
import xyz.blueskyweb.app.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate;
import java.util.ArrayList;
import java.util.List;
/**
* A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both
* TurboModule delegates and the Fabric Renderer.
*
* <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
* `newArchEnabled` property). Is ignored otherwise.
*/
public class MainApplicationReactNativeHost extends ReactNativeHost {
public MainApplicationReactNativeHost(Application application) {
super(application);
}
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
// TurboModules must also be loaded here providing a valid TurboReactPackage implementation:
// packages.add(new TurboReactPackage() { ... });
// If you have custom Fabric Components, their ViewManagers should also be loaded here
// inside a ReactPackage.
return packages;
}
@Override
protected String getJSMainModuleName() {
return "index";
}
@NonNull
@Override
protected ReactPackageTurboModuleManagerDelegate.Builder
getReactPackageTurboModuleManagerDelegateBuilder() {
// Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary
// for the new architecture and to use TurboModules correctly.
return new MainApplicationTurboModuleManagerDelegate.Builder();
}
@Override
protected JSIModulePackage getJSIModulePackage() {
return new JSIModulePackage() {
@Override
public List<JSIModuleSpec> getJSIModules(
final ReactApplicationContext reactApplicationContext,
final JavaScriptContextHolder jsContext) {
final List<JSIModuleSpec> specs = new ArrayList<>();
// Here we provide a new JSIModuleSpec that will be responsible of providing the
// custom Fabric Components.
specs.add(
new JSIModuleSpec() {
@Override
public JSIModuleType getJSIModuleType() {
return JSIModuleType.UIManager;
}
@Override
public JSIModuleProvider<UIManager> getJSIModuleProvider() {
final ComponentFactory componentFactory = new ComponentFactory();
CoreComponentsRegistry.register(componentFactory);
// Here we register a Components Registry.
// The one that is generated with the template contains no components
// and just provides you the one from React Native core.
MainComponentsRegistry.register(componentFactory);
final ReactInstanceManager reactInstanceManager = getReactInstanceManager();
ViewManagerRegistry viewManagerRegistry =
new ViewManagerRegistry(
reactInstanceManager.getOrCreateViewManagers(reactApplicationContext));
return new FabricJSIModuleProvider(
reactApplicationContext,
componentFactory,
new EmptyReactNativeConfig(),
viewManagerRegistry);
}
});
return specs;
}
};
}
}
@@ -1,36 +0,0 @@
package xyz.blueskyweb.app.newarchitecture.components;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.fabric.ComponentFactory;
import com.facebook.soloader.SoLoader;
/**
* Class responsible to load the custom Fabric Components. This class has native methods and needs a
* corresponding C++ implementation/header file to work correctly (already placed inside the jni/
* folder for you).
*
* <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
* `newArchEnabled` property). Is ignored otherwise.
*/
@DoNotStrip
public class MainComponentsRegistry {
static {
SoLoader.loadLibrary("fabricjni");
}
@DoNotStrip private final HybridData mHybridData;
@DoNotStrip
private native HybridData initHybrid(ComponentFactory componentFactory);
@DoNotStrip
private MainComponentsRegistry(ComponentFactory componentFactory) {
mHybridData = initHybrid(componentFactory);
}
@DoNotStrip
public static MainComponentsRegistry register(ComponentFactory componentFactory) {
return new MainComponentsRegistry(componentFactory);
}
}
@@ -1,48 +0,0 @@
package xyz.blueskyweb.app.newarchitecture.modules;
import com.facebook.jni.HybridData;
import com.facebook.react.ReactPackage;
import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.soloader.SoLoader;
import java.util.List;
/**
* Class responsible to load the TurboModules. This class has native methods and needs a
* corresponding C++ implementation/header file to work correctly (already placed inside the jni/
* folder for you).
*
* <p>Please note that this class is used ONLY if you opt-in for the New Architecture (see the
* `newArchEnabled` property). Is ignored otherwise.
*/
public class MainApplicationTurboModuleManagerDelegate
extends ReactPackageTurboModuleManagerDelegate {
private static volatile boolean sIsSoLibraryLoaded;
protected MainApplicationTurboModuleManagerDelegate(
ReactApplicationContext reactApplicationContext, List<ReactPackage> packages) {
super(reactApplicationContext, packages);
}
protected native HybridData initHybrid();
native boolean canCreateTurboModule(String moduleName);
public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder {
protected MainApplicationTurboModuleManagerDelegate build(
ReactApplicationContext context, List<ReactPackage> packages) {
return new MainApplicationTurboModuleManagerDelegate(context, packages);
}
}
@Override
protected synchronized void maybeLoadOtherSoLibraries() {
if (!sIsSoLibraryLoaded) {
// If you change the name of your application .so file in the Android.mk file,
// make sure you update the name here as well.
SoLoader.loadLibrary("app_appmodules");
sIsSoLibraryLoaded = true;
}
}
}
-49
View File
@@ -1,49 +0,0 @@
THIS_DIR := $(call my-dir)
include $(REACT_ANDROID_DIR)/Android-prebuilt.mk
# If you wish to add a custom TurboModule or Fabric component in your app you
# will have to include the following autogenerated makefile.
# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk
include $(CLEAR_VARS)
LOCAL_PATH := $(THIS_DIR)
# You can customize the name of your application .so file here.
LOCAL_MODULE := app_appmodules
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
# If you wish to add a custom TurboModule or Fabric component in your app you
# will have to uncomment those lines to include the generated source
# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni)
#
# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp)
# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
# Here you should add any native library you wish to depend on.
LOCAL_SHARED_LIBRARIES := \
libfabricjni \
libfbjni \
libfolly_futures \
libfolly_json \
libglog \
libjsi \
libreact_codegen_rncore \
libreact_debug \
libreact_nativemodule_core \
libreact_render_componentregistry \
libreact_render_core \
libreact_render_debug \
libreact_render_graphics \
librrc_view \
libruntimeexecutor \
libturbomodulejsijni \
libyoga
LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall
include $(BUILD_SHARED_LIBRARY)
@@ -1,24 +0,0 @@
#include "MainApplicationModuleProvider.h"
#include <rncore.h>
namespace facebook {
namespace react {
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
const std::string moduleName,
const JavaTurboModule::InitParams &params) {
// Here you can provide your own module provider for TurboModules coming from
// either your application or from external libraries. The approach to follow
// is similar to the following (for a library called `samplelibrary`:
//
// auto module = samplelibrary_ModuleProvider(moduleName, params);
// if (module != nullptr) {
// return module;
// }
// return rncore_ModuleProvider(moduleName, params);
return rncore_ModuleProvider(moduleName, params);
}
} // namespace react
} // namespace facebook
@@ -1,16 +0,0 @@
#pragma once
#include <memory>
#include <string>
#include <ReactCommon/JavaTurboModule.h>
namespace facebook {
namespace react {
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
const std::string moduleName,
const JavaTurboModule::InitParams &params);
} // namespace react
} // namespace facebook
@@ -1,45 +0,0 @@
#include "MainApplicationTurboModuleManagerDelegate.h"
#include "MainApplicationModuleProvider.h"
namespace facebook {
namespace react {
jni::local_ref<MainApplicationTurboModuleManagerDelegate::jhybriddata>
MainApplicationTurboModuleManagerDelegate::initHybrid(
jni::alias_ref<jhybridobject>) {
return makeCxxInstance();
}
void MainApplicationTurboModuleManagerDelegate::registerNatives() {
registerHybrid({
makeNativeMethod(
"initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
makeNativeMethod(
"canCreateTurboModule",
MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
});
}
std::shared_ptr<TurboModule>
MainApplicationTurboModuleManagerDelegate::getTurboModule(
const std::string name,
const std::shared_ptr<CallInvoker> jsInvoker) {
// Not implemented yet: provide pure-C++ NativeModules here.
return nullptr;
}
std::shared_ptr<TurboModule>
MainApplicationTurboModuleManagerDelegate::getTurboModule(
const std::string name,
const JavaTurboModule::InitParams &params) {
return MainApplicationModuleProvider(name, params);
}
bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
std::string name) {
return getTurboModule(name, nullptr) != nullptr ||
getTurboModule(name, {.moduleName = name}) != nullptr;
}
} // namespace react
} // namespace facebook
@@ -1,38 +0,0 @@
#include <memory>
#include <string>
#include <ReactCommon/TurboModuleManagerDelegate.h>
#include <fbjni/fbjni.h>
namespace facebook {
namespace react {
class MainApplicationTurboModuleManagerDelegate
: public jni::HybridClass<
MainApplicationTurboModuleManagerDelegate,
TurboModuleManagerDelegate> {
public:
// Adapt it to the package you used for your Java class.
static constexpr auto kJavaDescriptor =
"Lcom/app/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;";
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject>);
static void registerNatives();
std::shared_ptr<TurboModule> getTurboModule(
const std::string name,
const std::shared_ptr<CallInvoker> jsInvoker) override;
std::shared_ptr<TurboModule> getTurboModule(
const std::string name,
const JavaTurboModule::InitParams &params) override;
/**
* Test-only method. Allows user to verify whether a TurboModule can be
* created by instances of this class.
*/
bool canCreateTurboModule(std::string name);
};
} // namespace react
} // namespace facebook
@@ -1,61 +0,0 @@
#include "MainComponentsRegistry.h"
#include <CoreComponentsRegistry.h>
#include <fbjni/fbjni.h>
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
#include <react/renderer/components/rncore/ComponentDescriptors.h>
namespace facebook {
namespace react {
MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
std::shared_ptr<ComponentDescriptorProviderRegistry const>
MainComponentsRegistry::sharedProviderRegistry() {
auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
// Custom Fabric Components go here. You can register custom
// components coming from your App or from 3rd party libraries here.
//
// providerRegistry->add(concreteComponentDescriptorProvider<
// AocViewerComponentDescriptor>());
return providerRegistry;
}
jni::local_ref<MainComponentsRegistry::jhybriddata>
MainComponentsRegistry::initHybrid(
jni::alias_ref<jclass>,
ComponentFactory *delegate) {
auto instance = makeCxxInstance(delegate);
auto buildRegistryFunction =
[](EventDispatcher::Weak const &eventDispatcher,
ContextContainer::Shared const &contextContainer)
-> ComponentDescriptorRegistry::Shared {
auto registry = MainComponentsRegistry::sharedProviderRegistry()
->createComponentDescriptorRegistry(
{eventDispatcher, contextContainer});
auto mutableRegistry =
std::const_pointer_cast<ComponentDescriptorRegistry>(registry);
mutableRegistry->setFallbackComponentDescriptor(
std::make_shared<UnimplementedNativeViewComponentDescriptor>(
ComponentDescriptorParameters{
eventDispatcher, contextContainer, nullptr}));
return registry;
};
delegate->buildRegistryFunction = buildRegistryFunction;
return instance;
}
void MainComponentsRegistry::registerNatives() {
registerHybrid({
makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
});
}
} // namespace react
} // namespace facebook
@@ -1,32 +0,0 @@
#pragma once
#include <ComponentFactory.h>
#include <fbjni/fbjni.h>
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
namespace facebook {
namespace react {
class MainComponentsRegistry
: public facebook::jni::HybridClass<MainComponentsRegistry> {
public:
// Adapt it to the package you used for your Java class.
constexpr static auto kJavaDescriptor =
"Lcom/app/newarchitecture/components/MainComponentsRegistry;";
static void registerNatives();
MainComponentsRegistry(ComponentFactory *delegate);
private:
static std::shared_ptr<ComponentDescriptorProviderRegistry const>
sharedProviderRegistry();
static jni::local_ref<jhybriddata> initHybrid(
jni::alias_ref<jclass>,
ComponentFactory *delegate);
};
} // namespace react
} // namespace facebook
-11
View File
@@ -1,11 +0,0 @@
#include <fbjni/fbjni.h>
#include "MainApplicationTurboModuleManagerDelegate.h"
#include "MainComponentsRegistry.h"
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
return facebook::jni::initialize(vm, [] {
facebook::react::MainApplicationTurboModuleManagerDelegate::
registerNatives();
facebook::react::MainComponentsRegistry::registerNatives();
});
}
@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
<selector>
<!--
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
-->
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>
</inset>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

@@ -1,3 +0,0 @@
<resources>
<string name="app_name">bsky</string>
</resources>
@@ -1,9 +0,0 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
</style>
</resources>

Some files were not shown because too many files have changed in this diff Show More