* Convert lightbox to get/set
* Work around software-mansion/react-native-reanimated#6613
* Use get/set in more places
* Port MainScrollProvider to get/set
* Port more to get/set
* Port composer to get/set
* Remove unnecessary thread hops in composer
* Port more things to get/set
* Convert more to get/set, remove redundant runOnJS
* Convert remaining cases to get/set
* [Web] Clicking root link twice refreshes the screen
* Scope it to navigation action
In practice this means -- just for the bottom mobile web tab bar.
* Fix minor localization issues in Spanish:
- Use 'pack de inicio' instead of 'paquete de inicio'
- Use 'Inténtalo' instead of 'Intenta'
- Fix 'Por favor'
- Do not use 'una' as article for 'posts'
- Use 'Eliminado' instead of 'Removido'
* Update src/locale/locales/es/messages.po
Co-authored-by: oledfish <88390729+oledfish@users.noreply.github.com>
* Use 'paquete de inicio' and fix typos
---------
Co-authored-by: oledfish <88390729+oledfish@users.noreply.github.com>
* Remove legacy strings in FR localisation file
* Update French translations
* Fix typos and inconsistent French translations
* Get rid of a few 'Veuillez' in French locale to appear less formal
* Update catalan messages.po
back to 100%
Please have a look at it @jordimas @darccio @surfdude29 @rortan134
* Update catalan messages.po
aplying @jordimas corrections
* Update messages.po
* Reduce page size for request
* Remove refetch interval entirely
* Add comment
* Optimistically mark as read
* Drop default active poll interval to 60s from 5min
* Only optimistically update unread count if success
* Update Node.js to 20.x in Dockerfile
* Update Node.js types and engines entry to 20.x
* Update Node.js version in .nvmrc
* Use node version from .nvmrc in linting job
* Use Type Assertion for clearTimeout
* Inline useImageAspectRatio
* Switch AutoSizedImage to read dimensions from Expo Image cache
* Include thumbnail dimensions in image data
* Use dims from Expo Image cache in lightbox
* Fix wiring so all thumbnails get dimensions
* Fix type
* Oops
* Measure all rects for embeds
* Measure avi rects too
* Animate lightbox in and out
* Account for safe area in the animation
* Tune spring times
* Remove null checks for measurements
* Remove superfluous view
* Block swipe while opening
* Interpolate width/height on native side for Android
* Make it fast by animating only affine transforms
* Fix tall image final state
The initial animation frame is still off on both platforms.
* Try to squeeze perf
* Avoid blank images during animation on iOS
* Fix bad rebase
* Fix a huge memory issue due to expo/expo#24894
* Fix last frame flash
* Fix thum dim calculation for tall images
* move out avatarstack to own file
* improved settings switch
* prefix with @
* fix types
* up chevron
* respect reduced motion setting
* respect reduced motion in other place
* Preserve shape in lightbox
* Rename shapes to semantic meanings
It looks like after all I do want to fork based on those.
* Round avatars on the web
* Oops
* Make iOS scrollview bounded to the image
I've had to remove the dismiss handling because the scroll view no longer scrolls at rest.
* Fix double-tap not working right after a vertical swipe
It seems like for some reason the vertical swipe is still being handled by the scroll view, so double tap gets eaten while it's "coming back". But you don't really see it moving. Weird.
* Add an intermediate LightboxImage component
* Hoist useImageDimensions up
* Implement xplat dismiss gesture
This is now shared between platforms, letting us animate the backdrop and add a consistent "fly away" behavior.
* Optimize Android compositing perf
* Fix supertall images
For example, https://bsky.app/profile/schlagteslinks.bsky.social/post/3l7y4l6yur72e
* Fix oopsie
* Assign an ID to lightbox and use it as a key
* Consolidate lightbox props into an object
* Remove unused prop
* Move SafeAreaView declaration
* Keep SafeAreaView always mounted
When exploring Android animation, I noticed its content jumps on the first frame. I think this should help prevent that.
* Pass safe area down for measurement
* Remove dependency on SCREEN in Android event handlers
* Remove dependency on SCREEN in iOS event handlers
* Remove dependency on SCREEN on iOS
* Remove dependency on SCREEN on Android
* Remove dependency on JS calc in controls
* Use flex for iOS layout
* Remove useless memo
* Use explicit values when useImageAspectRatio doesn't know
It's not very good that you can't distingiush when we haven't loaded vs when we're certain. This shifts the burden of dealing with missing values to the caller.
* Check cache early
* Handle src change
* Rewrite image-sizes.fetch to avoid mixing async styles
* Make image-sizes LRU
Code is copy paste from useImageDimensions.ts
* Rm unused fields
* Derive aspect on the fly
* Factor useImageDimensions out of useImageAspectRatio
* Move useImageDimensions into image-sizes
* Make lightbox use the same cache
* Wire up known dimensions to the lightbox
* Handle division by zero in the hook
* Use safe aspect for lightbox calculations
* Extract function to read contentHeight later
* Remove autoscroll to bottom
We're going to implement this in the UI layer instead.
* Remove worklet from non-worklets to avoid confusion
* Rename and invert hasScrolled* variables
Their naming was too ambiguous (they used to represent "has scrolled _away_ from X"). I inverted them and clarified the naming. No functional changes.
* This should not be necessary
It's already called not just from UI thread. And it only sets shared values, which can be done from either thread.
* Make hasScrolledTo* derived values
It wasn't always correct to derive them manually because reading from .value is stale on JS thread. We could fix that by using the local variables but it makes more conceptualy sense to treat these as derived anyway.
* Reimplement autoscroll-to-bottom in UI layer
Doing it here ensures we also do it when you add an image at the end of the thread. Otherwise it's very confusing where it went.
* Use fancy ScrollView
This seems to fix ScrollView getting stuck after inserting images at the thread end on Android.
* More aggressive scroll-to-bottom
* "Fix" cursor getting stuck on Android
* Revert "Use fancy ScrollView"
This reverts commit 04e34a54e3b75f8a77de5062bff5fe6e76420bbb.
* Basic adding of posts
* Switch active post on focus
* Conditionally show plus button
* Insert posts midthread
* Track active/inactive post
* Delete posts in a thread
* Focus after deletion
* Tweak empty post detection
* Mix height for active only
* Move toolbar with post on web
* Fix footer positioning
* Post All button
* Fix reply to positioning
* Improve memoization
* Improve memoization for clearVideo
* Remove unnecessary argument
* Add some manual memoization to fix re-renders
* Scroll to bottom on add new
* Fix opacity on Android
* Add backdrop
* Fix videos
* Check alt for video too
* Clear pending publish on error
* Fork alt message by type
* Separate placeholder for next posts
* Limit hitslop to avoid clashes
* Switch to using post ID for post actions
* Pass post-bound dispatch to ComposerPost
* Check video state for entire thread
* Always bind post actions to an ID
* Rename variable for consistency
* Fix clashing keys
* start building storybook
* add title
* add some styles
* try out new icons
* more settings list component parts
* make text do the spacing
* clean up storybook
* gated new settings screen
* switch account
* add current profile
* use Layout.Screen
* Layout.Header and Layout.Content
* translate helpdesk text
thanks @surfdude29!
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
* add account settings
* undo changes to export car dialog
* privacy and security screen
* Translate protect account stuff
Thanks @surfdude29!
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
* content and media settings
* about settings
* 2fa copy
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
* a11y and appearance
* use new components for appearance settings
* redesign accessibility settings
* Update ContentAndMediaSettings.tsx
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
* add divider
* remove a11y and appearance middleman screen
* fix web settingslist styles
* new SettingsList.Group component
* explain how portal magic works
* hide pwioptout in old location
* Update Settings.tsx
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
* replace gate with `IS_INTERNAL`
* add IS_INTERNAL to app-info.web
* fix profile area growing
* add close button to switch account
---------
Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com>
* Plumb thumbUri down to the lightbox
* Remove onLoad tracking from lightbox
* Hook up placeholder URI to the image
* Fix NaN causing crash on double tap while offline
* Protect against NaNs in the future
* Added translations for new strings
* Fixed some translations: made them more natural and consistent
---------
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
* Update catalana messages.po
Just a few lines, including pending corrections from @surfdude29
Please have a look at it @jordimas @darccio @surfdude29 @rortan134
* Update messages.po
correct typo
* Update messages.po
little typo
* fix feed reorder test
* fix feed reorder test pt 2
* fix edit profile test
* fix mod list test
* fix fab
* add assert
* one more assertVisible
* fix search test
* tap now now if it shows up
* Display non-post embeds in composer preview
* Remove starter pack special case from ExternalLinkEmbed
This should not be needed because starter pack composer preview now goes through the record preview codepath, just like in the feed/post view.
* Hide record ext links if quote is present
* Align remove buttons
Remove the implicit top padding in record embeds and make it conditional, which is similar to how we treat external link embeds. This makes the X button appear in the same place for record embeds as with links.
* move self label button?
* rm
* make sure its usable on large font sizes
* tweak wording
* update icon
* tweaks
* change button label and change opacity when no media (#5794)
* Tweak it moar (#5807)
* Tweak it moar
* Pluralize
* Labels
---------
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: Eric Bailey <git@esb.lol>
* fetch all accounts in one go
* delete unused component
* add safeareaview to logged out layout
* add safe area insets to LoggedOut view
* add safe area insets to the error boundary
* sanitize displaynames/handles
* use button for X
* increase spacing
* clean up drawer
* add a lil bit of padding
* Drawer nits (#5778)
* Avi stuff
* Rm SafeAreaView, not working on Android
* Dividers and spacing
* Fix count on android, ended up refactoring the whole MenuItem
* Litttttle more space
* Improve NavSignupCard
* format nit
---------
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* New link card styles
* Cleanup of consituent parts, add hover state
* Fix gif alt text view
* Fix alt text view more
* Remove dupe
* Update remove button
* Remove added margin on gif
* Update catalan messages.po
Here we go again, just a few lines, if you would be so kind as to take a look @jordimas @darccio @surfdude29 @rortan134
* Update messages.po
@jordimas corrections
* Rework SavedFeeds editor to make changes transactionally
* Fix hit slops
* Add layout animations
* Fix: dont let down go too far down
* Speed up layout transitions
* Use Redix FocusTrap (#5638)
* Use Redix FocusTrap
* force resolutions on radix libs
* add focus guards
* use @radix-ui/dismissable-layer for escape handling
* fix banner menu keypress by using `Pressable`
* add menu in dialog example to storybook
---------
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
* use DismissableLayer/FocusScope for composer
* fix storybook dialog
* thread Portal through Prompt and avatar/banner
* fix dialog style regression
* remove tamagui
---------
Co-authored-by: Eric Bailey <git@esb.lol>
* Update translation
* Fixed
* Update translation
* Update translation
* Update translation
* Update translation
* Suggested fix by Hima-Zinn
* Update translation
* Update translation
* Update translation
* Translate "pinned"
* Update translation
* Refactor video uploads (#5570)
* Remove unused video field
* Stop exposing video dispatch
* Move cancellation out of the reducer
* Make useUploadStatusQuery controlled by jobId
* Rename SetStatus to SetProcessing
This action only has one callsite and it's always passing "processing".
* Move jobId into video reducer state
* Make cancellation scoped
* Inline useCompressVideoMutation
* Move processVideo down the file
* Extract getErrorMessage
* useServiceAuthToken -> getServiceAuthToken
* useVideoAgent -> createVideoAgent
* useVideoUploadLimits -> getVideoUploadLimits
* useUploadVideoMutation -> uploadVideo
* Use async/await in processVideo
* Inline onVideoCompressed into processVideo
* Use async/await for uploadVideo
* Factor out error messages
* Guard dispatch with signal
This lets us remove the scattered signal checks around dispatch.
* Move job polling out of RQ
* Handle poll failures
* Remove unnecessary guards
* Slightly more accurate condition
* Move initVideoUri handling out of the hook
* Remove dead argument
It wasn't being used before either.
* Remove unused detailed status
This isn't being used because we're only respecting that state variable when isProcessing=true, but isProcessing is always false during video upload.
If we want to re-add this later, it should really just be derived from the reducer state.
* Harden the video reducer
* Tie all spawned work to a signal
* Preserve asset/media for nicer error state
* Rename actions to match states
* Inline useUploadVideo
This abstraction is getting in the way of some future work.
* Move MIME check to the only place that handles it
* Manage video reducer from composer reducer (#5573)
* Move video state into composer state
* Represent video as embed
This is slightly broken. In particular, we can't remove video yet because there's no action that results in video embed being removed.
* Properly represent video as embed
This aligns the video state lifetime with the embed lifetime. Video can now be properly added and removed.
* Disable Add Video when we have images
* Ignore empty image pick
* Rename some files and variables (#5587)
* Move composer reducers together
* videoUploadState -> videoState
* Inline videoDispatch
* 🪵📌 (#5594)
* [🐴] Reduce amount that message sent date is shown (#4228)
* Fix profile header buttons (#5558)
* Fix profile header buttons
* Adjust labeler buttons too
* Fix load state jumps
* Small tweak for web
* Remove log
* Update
* Revert "Update"
This reverts commit b073c04830.
* Revert "Fix profile header buttons (#5558)"
This reverts commit c00c5fa495.
* Revert "[🐴] Reduce amount that message sent date is shown (#4228)"
This reverts commit af8e3422a6.
* Revert "🪵📌 (#5594)"
This reverts commit 3ab5190aca.
* Revert "Rename some files and variables (#5587)"
This reverts commit 475708ea30.
* Revert "Manage video reducer from composer reducer (#5573)"
This reverts commit 59589e34a3.
* Revert "Refactor video uploads (#5570)"
This reverts commit f74f9bc1d9.
* Update translation
* Update translation
* Delete unused entries
* Restored the trailing dot by #5622
---------
Co-authored-by: dan <dan.abramov@gmail.com>
Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: Eric Bailey <git@esb.lol>
* Update and inconsistency fixes to pt-br translation
* Update and inconsistency fixes to pt-br translation
Updated last translator
* More tr
* More translations updated
* Reduce post reason icon size & offset (#5522)
* Make x margin within pin icon the same
* Reduce post reason icon size and offset
* Use existing pin
---------
Co-authored-by: futur <me@futuristick.ca>
* Add alt text limit to image dialog
* GIF alt text too
* Fix
* tweaks, save alt on dialog dismiss
* simplify close behavior
* use state in gif alt
* state
---------
Co-authored-by: Hailey <me@haileyok.com>
* Scaffold embed draft types
These don't map 1:1 to the record structure. Rather, we select data from the draft on posting.
* Prefill initial quote
* Implement the reducer
* Move video state into composer state
* Represent video as embed
This is slightly broken. In particular, we can't remove video yet because there's no action that results in video embed being removed.
* Properly represent video as embed
This aligns the video state lifetime with the embed lifetime. Video can now be properly added and removed.
* Disable Add Video when we have images
* Ignore empty image pick
* Remove unused video field
* Stop exposing video dispatch
* Move cancellation out of the reducer
* Make useUploadStatusQuery controlled by jobId
* Rename SetStatus to SetProcessing
This action only has one callsite and it's always passing "processing".
* Move jobId into video reducer state
* Make cancellation scoped
* Inline useCompressVideoMutation
* Move processVideo down the file
* Extract getErrorMessage
* useServiceAuthToken -> getServiceAuthToken
* useVideoAgent -> createVideoAgent
* useVideoUploadLimits -> getVideoUploadLimits
* useUploadVideoMutation -> uploadVideo
* Use async/await in processVideo
* Inline onVideoCompressed into processVideo
* Use async/await for uploadVideo
* Factor out error messages
* Guard dispatch with signal
This lets us remove the scattered signal checks around dispatch.
* Move job polling out of RQ
* Handle poll failures
* Remove unnecessary guards
* Slightly more accurate condition
* Move initVideoUri handling out of the hook
* Remove dead argument
It wasn't being used before either.
* Remove unused detailed status
This isn't being used because we're only respecting that state variable when isProcessing=true, but isProcessing is always false during video upload.
If we want to re-add this later, it should really just be derived from the reducer state.
* Harden the video reducer
* Tie all spawned work to a signal
* Preserve asset/media for nicer error state
* Rename actions to match states
* Inline useUploadVideo
This abstraction is getting in the way of some future work.
* Move MIME check to the only place that handles it
* Add composer reducer
* Support adding images
Co-authored-by: Mary <git@mary.my.id>
* Support updating and deleting images
Co-authored-by: Mary <git@mary.my.id>
* Derive images state from composer state
Co-authored-by: Mary <git@mary.my.id>
---------
Co-authored-by: Mary <git@mary.my.id>
* Remove unsafe type coercions from posting embed
* Extract resolveEmbed into a separate function
* Refactor to if-else because these are mutually exclusive
* Refactor resolveEmbed to early returns
* Separate resolving embed and media
* Parallelize image upload
* Prioritize not dropping media
* add to dropdown menu
* use normal profile mutation hook
* add pin as reason
* request pins
* shadow update
* rm logs
* get prev pinned from getProfile
* fix toasts
* invalidate after appview ready
* don't mutate params
* rm log
* use checkCommited rather than manual whenAppViewReady
* move to mutation
* even more optimistic optimistic update
* allow pins in `posts_and_author_threads`
* update @atproto/api
* add reasonPin type
* fix strange type error in unrelated query
* another missing type
description:"Create a report for an issue you have experience in the app."
labels:["bug"]
body:
- type:markdown
attributes:
value:|
Thanks for taking the time to report an issue you've found in the app! Before you submit this issue, please make sure you've searched for similar issues that are already open and being tracked. If you find an open issue that seems relevant to yours, it is best to leave a response there with your information instead of opening a new issue, since it helps to consolidate the info in one place.
- type:textarea
attributes:
label:Steps to Reproduce
description:|
Please provide the steps that may reproduce the issue that you are experiencing. The more concise of a
reproduction that you provide, the easier it will be for us to identify the issue and fix it in a timely manner.
placeholder:|
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required:true
- type:textarea
attributes:
label:Attachments
description:|
If possible, please provide any images or videos that may help us understand the issue you are experiencing.
validations:
required:false
- type:dropdown
attributes:
label:What platform(s) does this occur on?
multiple:true
options:
- iOS
- Android
- Web (Desktop)
- Web (Mobile)
validations:
required:true
- type:input
attributes:
label:Device Info
description:|
Please provide the device information that you are using when experiencing this issue. This can include the
device model, operating system version, and any other relevant information.
validations:
required:false
- type:input
attributes:
label:What version of the app are you using?
description:|
You can easily find this information by visting the Settings screen in the app, and tapping on the version info
at the bottom of the screen. All the relevant information will be copied to your clipboard, and you will be
able to share it here.
validations:
required:true
- type:textarea
attributes:
label:Additional Information
description:|
Please provide any additional information that you think may be helpful in identifying the issue you are
experiencing. This can include any error messages, logs, or other information that you think may be relevant.
description:"Create a bug report for builds using the New Architecture. If you are not sure what that means, don't use this template, and instead use the default bug report template."
labels:["bug","fabric"]
body:
- type:checkboxes
attributes:
label:You're running a build that uses the React Native New Architecture, right?
description:This template is specifically for issues related to builds that use the React Native New Architecture. If you are not sure what that means, this template is probably not relevant to you, and you should use the default Bug Report template.
options:
- label:I am running a build that uses the New Architecture
required:true
- type:markdown
attributes:
value:|
Thanks for taking the time to report an issue you've found in the app! Before you submit this issue, please make sure you've searched for similar issues that are already open and being tracked. If you find an open issue that seems relevant to yours, it is best to leave a response there with your information instead of opening a new issue, since it helps to consolidate the info in one place.
- type:textarea
attributes:
label:Steps to Reproduce
description:|
Please provide the steps that may reproduce the issue that you are experiencing. The more concise of a
reproduction that you provide, the easier it will be for us to identify the issue and fix it in a timely manner.
placeholder:|
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required:true
- type:textarea
attributes:
label:Attachments
description:|
If possible, please provide any images or videos that may help us understand the issue you are experiencing.
validations:
required:false
- type:dropdown
attributes:
label:What platform(s) does this occur on?
multiple:true
options:
- iOS
- Android
validations:
required:true
- type:input
attributes:
label:Device Info
description:|
Please provide the device information that you are using when experiencing this issue. This can include the
device model, operating system version, and any other relevant information.
validations:
required:false
- type:input
attributes:
label:What version of the app are you using?
description:|
You can easily find this information by visting the Settings screen in the app, and tapping on the version info
at the bottom of the screen. All the relevant information will be copied to your clipboard, and you will be
able to share it here.
validations:
required:true
- type:textarea
attributes:
label:Additional Information
description:|
Please provide any additional information that you think may be helpful in identifying the issue you are
experiencing. This can include any error messages, logs, or other information that you think may be relevant.
description:"Suggest an idea for the Bluesky app."
labels:["feature-request"]
body:
- type:markdown
attributes:
value:|
Thanks for submitting a feature request! Before you submit this request, please make sure you've searched for similar requests that are already open and being tracked. If you find an open request that seems relevant to yours, it is best to leave a response there with your information instead of opening a new request, since it helps to consolidate the info in one place.
- type:textarea
attributes:
label:Describe the Feature
description:|
Please provide a detailed description of the feature you would like to see implemented in the app. The more
information you provide, the easier it will be for us to understand the feature you are requesting and to
implement it in a timely manner.
validations:
required:true
- type:textarea
attributes:
label:Attachments
description:|
If helpful, provide some images or videos of similar features in other apps that you think would be helpful
for us to understand the feature you are requesting, or places within the app that you think the feature belongs
in or is missing from.
validations:
required:false
- type:textarea
attributes:
label:Describe Alternatives
description:|
If there are any alternative solutions or features that you think would be helpful to implement in place of the
feature you are requesting, please provide a description of those as well.
validations:
required:false
- type:textarea
attributes:
label:Additional Context
description:|
If there is any additional context or information that you think would be helpful for us to know about the
feature you are requesting, please provide that information here.
- Set up your environment [using the expo instructions](https://docs.expo.dev/guides/local-app-development/).
- make sure that the JAVA_HOME points to the zulu-17 directory in your `.zshrc` or `.bashrc` file: `export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home`. DO NOT use another JDK or you will encounter build errors.
@@ -22,7 +33,68 @@
- After initial setup:
- Copy `google-services.json.example` to `google-services.json` or provide your own `google-services.json`. (A real firebase project is NOT required)
-`npx expo prebuild` -> you will also need to run this anytime `app.json` or native `package.json` deps change
-`yarn intl:build` -> you will also need to run this anytime `./src/locale/{locale}/messages.po` change
### Running the Native App
- iOS: `yarn ios`
- Xcode must be installed for this to run.
- A simulator must be preconfigured in Xcode settings.
- if no iOS versions are available, install the iOS runtime at `Xcode > Settings > Platforms`.
- if the simulator download keeps failing you can download it from the developer website.
-`xcrun simctl runtime add "~/Downloads/iOS_17.4_Simulator_Runtime.dmg"` (adapt the path to the downloaded file)
- In addition, ensure Xcode Command Line Tools are installed using `xcode-select --install`.
- Expo will require you to configure Xcode Signing. Follow the linked instructions. Error messages in Xcode related to the signing process can be safely ignored when installing on the iOS Simulator; Expo merely requires the profile to exist in order to install the app on the Simulator.
- Make sure you do have a certificate: open Xcode > Settings > Accounts > (sign-in) > Manage Certificates > + > Apple Development > Done.
- If you still encounter issues, try `rm -rf ios` before trying to build again (`yarn ios`)
- Android: `yarn android`
- Install "Android Studio"
- Make sure you have the Android SDK installed (Android Studio > Tools > Android SDK).
- In "SDK Platforms": "Android x" (where x is Android's current version).
- In "SDK Tools": "Android SDK Build-Tools" and "Android Emulator" are required.
- Add `export ANDROID_HOME=/Users/<your_username>/Library/Android/sdk` to your `.zshrc` or `.bashrc` (and restart your terminal).
- Setup an emulator (Android Studio > Tools > Device Manager).
- Web: `yarn web` (see the top of this file).
After you do `yarn ios` and `yarn android` once, you can later just run `yarn web` and then press either `i` or `a` to open iOS and Android emulators respectively which is much faster. However, if you make native changes, you'll have to do `yarn prebuild -p ios` and `yarn prebuild -p android` and then `yarn ios` and `yarn android` again before you can continue with the same workflow.
### Tips
- Copy the `.env.example` to `.env` and fill in any necessary tokens. (The Sentry token is NOT required; see instructions below if you want to enable Sentry.)
- To run on the device, add `--device` to the command (e.g. `yarn android --device`). To build in production mode (slower build, faster app), also add `--variant release`.
- If you want to use Expo EAS on your own builds without ejecting from Expo, make sure to change the `owner` and `extra.eas.projectId` properties. If you do not have an Expo account, you may remove these properties.
-`npx react-native info` Checks what has been installed.
- If the Android simulator frequently hangs or is very sluggish, [bump its memory limit](https://stackoverflow.com/a/40068396)
- The Android simulator won't be able to access localhost services unless you run `adb reverse tcp:{PORT} tcp:{PORT}`
- For instance, the locally-hosted 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 that doesn't use a platform specifier, and that should be the Web version. ([More info](https://stackoverflow.com/questions/44001050/platform-specific-import-component-in-react-native-with-typescript).)
### Running E2E Tests
- Start in various console tabs:
-`yarn e2e:mock-server`
-`yarn e2e:metro`
- Run once: `yarn e2e:build`
- Each test run: `yarn e2e:run`
### Adding Sentry
Adding Sentry is NOT required. You can keep `SENTRY_AUTH_TOKEN=` in `.env` which will build the app without Sentry.
However, if you're a part of the Bluesky team and want to enable Sentry, fill in `SENTRY_AUTH_TOKEN` in your `.env`. It can be created on the Sentry dashboard using [these instructions](https://docs.expo.dev/guides/using-sentry/#sign-up-for-a-sentry-account-and-create-a-project).
If you change `SENTRY_AUTH_TOKEN`, you need to do `yarn prebuild` before running `yarn ios` or `yarn android` again.
### Adding and Updating Locales
-`yarn intl:build` -> you will also need to run this anytime `./src/locale/{locale}/messages.po` change
## Running the Backend Locally
This is NOT required for app development but if you also want to develop the Bluesky *backend* locally too, you'll need this.
-`xcrun simctl runtime add "~/Downloads/iOS_17.4_Simulator_Runtime.dmg"` (adapt the path to the downloaded file)
- In addition, ensure Xcode Command Line Tools are installed using `xcode-select --install`.
- Expo will require you to configure Xcode Signing. Follow the linked instructions. Error messages in Xcode related to the signing process can be safely ignored when installing on the iOS Simulator; Expo merely requires the profile to exist in order to install the app on the Simulator.
- Make sure you do have a certificate: open Xcode > Settings > Accounts > (sign-in) > Manage Certificates > + > Apple Development > Done.
- If you still encounter issues, try `rm -rf ios` before trying to build again (`yarn ios`)
- Android: `yarn android`
- Install "Android Studio"
- Make sure you have the Android SDK installed (Android Studio > Tools > Android SDK).
- In "SDK Platforms": "Android x" (where x is Android's current version).
- In "SDK Tools": "Android SDK Build-Tools" and "Android Emulator" are required.
- Add `export ANDROID_HOME=/Users/<your_username>/Library/Android/sdk` to your `.zshrc` or `.bashrc` (and restart your terminal).
- Setup an emulator (Android Studio > Tools > Device Manager).
- Web: `yarn web`
- If you are cloning or forking this repo as an open-source developer, please check the tips below as well
- Run e2e tests
- Start in various console tabs:
-`yarn e2e:mock-server`
-`yarn e2e:metro`
- Run once: `yarn e2e:build`
- Each test run: `yarn e2e:run`
- Tips
- Copy the `.env.example` to `.env` and fill in any necessary tokens. (The Sentry token is NOT required; see instructions below if you want to enable Sentry.)
- To run on the device, add `--device` to the command (e.g. `yarn android --device`). To build in production mode (slower build, faster app), also add `--variant release`.
- If you want to use Expo EAS on your own builds without ejecting from Expo, make sure to change the `owner` and `extra.eas.projectId` properties. If you do not have an Expo account, you may remove these properties.
-`npx react-native info` Checks what has been installed.
- If the Android simulator frequently hangs or is very sluggish, [bump its memory limit](https://stackoverflow.com/a/40068396)
- The Android simulator won't be able to access localhost services unless you run `adb reverse tcp:{PORT} tcp:{PORT}`
- For instance, the locally-hosted 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 that doesn't use a platform specifier, and that should be the Web version. ([More info](https://stackoverflow.com/questions/44001050/platform-specific-import-component-in-react-native-with-typescript).)
### Adding Sentry
Adding Sentry is NOT required. You can keep `SENTRY_AUTH_TOKEN=` in `.env` which will build the app without Sentry.
However, if you're a part of the Bluesky team and want to enable Sentry, fill in `SENTRY_AUTH_TOKEN` in your `.env`. It can be created on the Sentry dashboard using [these instructions](https://docs.expo.dev/guides/using-sentry/#sign-up-for-a-sentry-account-and-create-a-project).
If you change `SENTRY_AUTH_TOKEN`, you need to do `yarn prebuild` before running `yarn ios` or `yarn android` again.
Then, when logging in or creating an account, point it to the localhost port of the devserver.
## Go-Server Build
The Go server in this repository is only used for serving the web app in production. Usually you won't need to touch it.
// SEE https://github.com/facebook/react-native/blob/309cdea337101cfe2212cfb6abebf1e783e43282/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt#L378
/**
* DialogRootViewGroup is the ViewGroup which contains all the children of a Modal. It gets all
* child information forwarded from [ReactModalHostView] and uses that to create children. It is
* also responsible for acting as a RootView and handling touch events. It does this the same way
* as ReactRootView.
*
* To get layout to work properly, we need to layout all the elements within the Modal as if they
* can fill the entire window. To do that, we need to explicitly set the styleWidth and
* styleHeight on the LayoutShadowNode to be the window size. This is done through the
* UIManagerModule, and will then cause the children to layout as if they can fill the window.
thrownewError('BottomSheetNativeComponent is not available on web')
}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.