Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow multiple avatar image types #12549

Merged
merged 7 commits into from
Dec 1, 2022

Conversation

Beamanator
Copy link
Contributor

@Beamanator Beamanator commented Nov 8, 2022

Details

The main purpose of this PR is to allow users to upload multiple types of images as avatars (workspace & user avatars). Ideally we'd support at least jpg, jpeg (which are the same as jpg), gif, png, and bmp. However, I investigated some errors found by @Santhosh-Sellavel here (my investigation here) where I found that RNImageManipulator currently only supports png and jpg image types so on native we can currently only upload those types of avatar images on native.

In order to not let this PR stay open for too long, I'm proposing we don't worry about those cases for now, and we create follow up issues to support those image types in that Library, or at least investigate what we should do for those image types (maybe we'd be ok just saving them as jpgs? To be discussed later).

Fixed Issues

$ #11063

Tests

  1. Download sample jpg, jpeg, gif, and bmp files from this site: https://filesamples.com/formats/bmp (or use your own if you have any). Also get a png file with some transparent part (use this image if you need: https://user-images.githubusercontent.com/3885503/196921487-45bf3d63-7e42-4f4c-83d1-e8b40e519bf6.png)
  2. On Web / Desktop / iOS Safari / Android Chrome, try uploading each of them as your profile avatar or a workspace avatar, one at a time
  3. For each, verify the upload succeeds & the URL for the image has the correct extension (ex: for the png image, the image URL should end with .png)
    • For the png, make sure the image has some transparent part, and that the transparency is preserved.
    • Note: jpg and jpeg are the same so uploading a jpg file will change to a jpeg file extension
    • Note: You can view the server response easily by searching the console for messages with onyxApiUpdate
  4. On Native devices / Apps, gif and bmp files have issues (see investigation) so please don't worry about testing those image types on those platforms, we'll handle them in a follow-up issue. For this PR, follow steps 2 & 3 for Native devices, trying to upload jpg, jpeg, and png images only

Offline

  1. Have two devices logged in to the same account
  2. On one device, disconnect from the internet
  3. Upload a new avatar (user or workspace)
  4. Verify the avatar appears grayed out
  5. Connect to internet, verify the avatar uploads & updates on both devices
  6. Verify the uploaded image URL has the correct file extension (via tips above)
  • Verify that no errors appear in the JS console

QA Steps

Same as above tests - Note: after uploading on mobile, you can use Chrome to check that the uploaded image URL is correct (has the correct extension at the end) like this:

  1. Open the chrome developer tools (Command + Option + I)
  2. Open "Application" -> IndexedDB -> OnyxDB (click "Refresh Database")
    • Screen Shot 2022-11-08 at 1 51 06 PM
  3. Expand OnyxDB, click keyvaluepairs, search for key personalDetails, expand your username, find avatar
  4. Verify the URL has the same extension at the end as the image type you just uploaded. Example:
    • Screen Shot 2022-11-08 at 1 53 03 PM
    • Note: jpg and jpeg are the same so uploading a jpg file will change to a jpeg file extension
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • iOS / native
    • Android / native
    • iOS / Safari
    • Android / Chrome
    • MacOS / Chrome
    • MacOS / Desktop
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product was added in all src/languages/* files
    • I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

PR Reviewer Checklist

The reviewer will copy/paste it into a new comment and complete it after the author checklist is completed

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified tests pass on all platforms & I tested again on:
    • iOS / native
    • Android / native
    • iOS / Safari
    • Android / Chrome
    • MacOS / Chrome
    • MacOS / Desktop
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product was added in all src/languages/* files
    • I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots

Web & iOS App

Screen.Recording.2022-11-11.at.12.02.09.PM.mov

Mobile Web - Chrome & Mobile Web - Safari

Screen.Recording.2022-11-11.at.12.26.09.PM.mov

Desktop & Android

Screen.Recording.2022-11-11.at.3.11.48.PM.mov

@Beamanator Beamanator self-assigned this Nov 8, 2022
@Beamanator Beamanator changed the title Allow multiple avatar image types [HOLD Web-E#35489] Allow multiple avatar image types Nov 8, 2022
@Beamanator
Copy link
Contributor Author

Will add screenshots once https://github.com/Expensify/Web-Expensify/pull/35489 is merged

isAvatarCropModalOpen: true,
imageUri: image.uri,
imageName: image.name,
imageType: image.type,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI this (image type) is the main "new thing" that we're passing down to cropOrRotateImage

@@ -89,7 +89,7 @@ function cropCanvas(canvas, options) {
function convertCanvasToFile(canvas, options = {}) {
return new Promise((resolve) => {
canvas.toBlob((blob) => {
const file = new File([blob], `${options.name || 'fileName'}.jpg`, {type: 'image/jpeg'});
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idk why we were appending .jpg to every file name before 😅

@Beamanator Beamanator marked this pull request as ready for review November 11, 2022 23:15
@Beamanator Beamanator requested a review from a team as a code owner November 11, 2022 23:15
@melvin-bot melvin-bot bot requested review from jasperhuangg and Santhosh-Sellavel and removed request for a team November 11, 2022 23:15
@melvin-bot
Copy link

melvin-bot bot commented Nov 11, 2022

@Santhosh-Sellavel @jasperhuangg One of you needs to copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@Beamanator Beamanator changed the title [HOLD Web-E#35489] Allow multiple avatar image types Allow multiple avatar image types Nov 11, 2022
@Beamanator
Copy link
Contributor Author

Ready for review! Have fun testing uploading images :D

@Santhosh-Sellavel
Copy link
Collaborator

@Beamanator jpg is shown jpeg refer to the video below!

Initially, I checked jpeg extension, looks correct. Started recording from there testing in the following order gif, jpg, bmp.

Look at the timestamp 0:22 to 0:40 in the video below, that's where I'm checking .jpg extension.

Screen.Recording.2022-11-14.at.11.03.27.PM.mov

Copy link
Collaborator

@Santhosh-Sellavel Santhosh-Sellavel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Beamanator
Copy link
Contributor Author

@Santhosh-Sellavel interesting catch, I'll check that out now!

@Beamanator
Copy link
Contributor Author

@Santhosh-Sellavel apparently JPG and JPEG are the same actually 😅

I found lots of articles explaining, here's just one: https://www.howtogeek.com/796389/jpg-vs.-jpeg-are-they-the-same-thing/

So I don't think this is a blocker 👍

@Santhosh-Sellavel
Copy link
Collaborator

Let's update that in pr description jpg/jpeg will shown as jpeg in url

@Beamanator
Copy link
Contributor Author

Ok I'll update the OP @Santhosh-Sellavel but can you please finish your review & add the checklist?? 🙏

@Santhosh-Sellavel
Copy link
Collaborator

Will test today, but this PR is time-consuming 😅

@Santhosh-Sellavel
Copy link
Collaborator

avatarHighResolution is not set properly while changing the image, but on force reload it gets updated.

Screen.Recording.2022-11-16.at.10.36.42.PM.mov

@Santhosh-Sellavel
Copy link
Collaborator

@Beamanator

Offline case does not work as expected

Offline_Desktop_Web.mov

@Santhosh-Sellavel
Copy link
Collaborator

Error is thrown while uploading BMP in iOS

Simulator.Screen.Recording.-.iPhone.14.-.2022-11-16.at.23.35.16.mp4

GIF extension not maintained while testing in iOS refer here

MObile_Test.mov

Console error is thrown while uploading gif in Android, unable to upload here.

Screenshot_1668621805

cc: @Beamanator

@Beamanator
Copy link
Contributor Author

Wow thanks so much for the thorough tests @Santhosh-Sellavel - I'd definitely recommend requested increased compensation for this review :D

Sadly I'm going OOO till Monday so I won't be able to fix the items you mentioned till early next week

@Santhosh-Sellavel
Copy link
Collaborator

@Beamanator 😞 Sorry, I was waiting for the discussion outcome! Will add it soon!

@Santhosh-Sellavel
Copy link
Collaborator

Santhosh-Sellavel commented Nov 30, 2022

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified tests pass on all platforms & I tested again on:
    • iOS / native
    • Android / native
    • iOS / Safari
    • Android / Chrome
    • MacOS / Chrome
    • MacOS / Desktop
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product was added in all src/languages/* files
    • I verified any copy / text that was added to the app is correct English and approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately and each prop has a /** comment above it */
    • The file is named correctly
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
    • Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
    • All JSX used for rendering exists in the render method
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Web
Web.mov
Mobile Web - Chrome
Android.mWeb.mov
Mobile Web - Safari
iOS_All_Files_as_JPEG.mov
Desktop
Desktop.mov
iOS
iOS.mov
Android
Android.mov

@Beamanator
Copy link
Contributor Author

No worries @Santhosh-Sellavel thanks for sticking with me 😅

@Santhosh-Sellavel
Copy link
Collaborator

Santhosh-Sellavel commented Nov 30, 2022

AH Finally completed, After double-checking multiple times, crazy PR!

Tested Formats PNG, GIF, JPEG, and BMP.

Web, Desktop - all works fine maintained file typed even after uploading. Uploaded Images Loading fine on all platforms.

Android & iOS - Only tested PNG and JPEG. All is good here too.

Mobile Web things went crazy here, after verifying multiple times

Android mWeb

Old Story, Android Chrome uploading works after updating the chrome from the play store.

PNG, GIF, JPEG - Formats works as expected file types are maintained after upload.
BMP - Able to upload, but seems converted as JPEG and uploaded.

Android_Mweb_bmp.mov

iOS mWeb

Able to upload all formats, but all are converted as JPEG and uploaded.

Is converting to jPEG an issue? @Beamanator

iOS_All_Files_as_JPEG.mov

Copy link
Collaborator

@Santhosh-Sellavel Santhosh-Sellavel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checklist: #12549 (comment)

Need clarification on this #12549 (comment), otherwise looks good!

@Beamanator
Copy link
Contributor Author

Thanks again for the comprehensive notes & review @Santhosh-Sellavel - the one thing I don't like about turning all image types into jpeg is if we get rid of the transparency of PNGs - I think that's my only "concern" / blocker. I'll test that on android Chrome & iOS safari - if that works fine I think we're good to move forward, otherwise maybeeeee not

@Beamanator
Copy link
Contributor Author

Beamanator commented Dec 1, 2022

Hmm so I just tested iPhone 13 simulator (iOS v15.5), Safari - and I successfully uploaded a .png, a.k.a. the file type in the avatar URL remained .png - sorry to be super annoying but are you 100% sure your image that says .png is actually a .png?

Actually the funny thing is on the same iPhone ^ sim, I uploaded bmp & gifs, and the URL extensions were correct 🤷 (same as what I reported here). Maybe @jasperhuangg can help us test just on this platform to see what results he gets?

Tested Android Chrome (updated my simulator's Chrome app & SDK version too): Got same result as you (everything worked, except .bmp got converted to .jpeg - which is fine for now

@Beamanator
Copy link
Contributor Author

Beamanator commented Dec 1, 2022

So I'd say the next steps should be:

  1. @jasperhuangg (or someone else if you don't have time) test uploading png, bmp & gif images as user or workspace avatars on iOS Safari (note: this site can help you download images of specific file types: https://filesamples.com/formats/bmp)
  2. If at least png files can be uploaded fine & have the correct extension after upload, we're good to merge
  3. If not, we might have to figure out why it works for me & doesn't work for others 😅

@Santhosh-Sellavel
Copy link
Collaborator

Please try in latest iOS Version. I tested on 16.1

@Santhosh-Sellavel
Copy link
Collaborator

We are in a never ending loop here.

@Beamanator
Copy link
Contributor Author

Lol! Ok I'll work on getting upgraded sims 👍

@Beamanator
Copy link
Contributor Author

Hah I don't see iOS v16.1 available for my simulators - maybe I need to update xcode?

Screen Shot 2022-12-01 at 5 39 12 PM

@Beamanator
Copy link
Contributor Author

@Santhosh-Sellavel are you testing on a simulator with iOS 16.1 or a physical device? Please let me know which device as well

@Santhosh-Sellavel
Copy link
Collaborator

Santhosh-Sellavel commented Dec 1, 2022

@Beamanator NVM it's working as expected for me now on iOS mWEB, I'm not sure what I did wrong yesterday. I did the same thing today but verified it on the actual device's local storage of iOS mWeb. As updating in one platform should update in another platform I used desktop app storage, which worked right for all other platforms. Maybe it had some sync issues, as my network was also unstable yesterday. So All looks good!

PNG_BMP

BMP_PNG_iOS_mWEB.mov

JPEG_GIF

JPEG_GIF_iOSMWeb.mov

@Santhosh-Sellavel
Copy link
Collaborator

@Beamanator But BMP to JPEG on Android mWEB still occurring for me though, I believe we are okay with it!

Screen.Recording.2022-12-01.at.9.38.32.PM.mov

Copy link
Collaborator

@Santhosh-Sellavel Santhosh-Sellavel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me!

@jasperhuangg
Copy link
Contributor

jasperhuangg commented Dec 1, 2022

Hey @Beamanator! I was able to successfully upload a png image on iOS Safari, and I was able to verify that the file extension of the uploaded file is still png. I think the transparency is preserved?

I also repeated with bmp and gif and it seems to be working fine.

The only issue I'm seeing is that the background of the cropping modal is black, which can conflict with transparent images that have black elements (as in the recording). This can probably be fixed in a followup issue.

Untitled.mov

Copy link
Contributor

@jasperhuangg jasperhuangg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@jasperhuangg
Copy link
Contributor

Merging via [2] from #12549 (comment)

@jasperhuangg jasperhuangg merged commit ff497b0 into main Dec 1, 2022
@jasperhuangg jasperhuangg deleted the beaman-passDynamicAvatarImageTypes branch December 1, 2022 18:02
@OSBotify
Copy link
Contributor

OSBotify commented Dec 1, 2022

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@Beamanator
Copy link
Contributor Author

Niceee thanks y'all 👍 Will look at the other weird things y'all mentioned tomorrow 😅

@Beamanator
Copy link
Contributor Author

@jasperhuangg - FYI i made a new issue about the black background when editing images here: #13266

Feel free to add your thoughts, I referenced your vid!

@OSBotify
Copy link
Contributor

OSBotify commented Dec 2, 2022

🚀 Deployed to staging by @jasperhuangg in version: 1.2.36-0 🚀

platform result
🤖 android 🤖 success ✅
🖥 desktop 🖥 success ✅
🍎 iOS 🍎 success ✅
🕸 web 🕸 success ✅

@OSBotify
Copy link
Contributor

OSBotify commented Dec 8, 2022

🚀 Deployed to production by @francoisl in version: 1.2.36-4 🚀

platform result
🤖 android 🤖 success ✅
🖥 desktop 🖥 success ✅
🍎 iOS 🍎 success ✅
🕸 web 🕸 success ✅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants