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

feat: access client side logging from Test Tools Modal #38803

Merged

Conversation

TMisiukiewicz
Copy link
Contributor

@TMisiukiewicz TMisiukiewicz commented Mar 22, 2024

Details

Fixed Issues

$ #38456
PROPOSAL:

Tests

iOS/Android:

Open dev menu and select "Open Test Preferences"

iOS Web/Android Web

Use physical device and use four-finger tap or switch isVisible={!!isTestToolsModalOpen} to isVisible in src/components/TestToolsModal.tsx

  1. Enable "Client side logging"
  2. Wait a while and disable "Client side logging"

iOS/Android
3. Verify path of the file is visible
4. Press "Share" and verify sharing modal appeared
5. Go to the Files on the device and verify it was saved

iOS Web/Android Web
3. Verify file was downloaded on the device

All platforms - access from Troubleshoot page

  1. Go to Profile -> About -> Troubleshoot
  2. Enable Client Side Logging
  3. Disable Client Side Logging

iOS/Android
4. Verify the filepath is displayed and Share button is visible
5. Press "Share" and verify the Share menu is visible

Other platforms
4. Verify file was downloaded to the device

  • Verify that no errors appear in the JS console

Offline tests

QA Steps

  1. Open the app
  2. Tap any area of the app with four fingers simultaneously.
  3. Verify "Client side logging" is available
  4. Enable Client Side logging
  5. Disable Client Side logging

iOS/Android
8. Verify path of the file is visible
9. Press "Share" and verify sharing modal appeared
10. Go to the Files on the device and verify it was saved

iOS Web/Android Web
6. Verify file was downloaded on the device

All platforms - access from Troubleshoot page

  1. Go to Profile -> About -> Troubleshoot
  2. Enable Client Side Logging
  3. Disable Client Side Logging

iOS/Android
4. Verify the filepath is displayed and Share button is visible
5. Press "Share" and verify the Share menu is visible

Other platforms
4. Verify file was downloaded to the device

  • 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 the expected offline behavior in the Offline steps 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 tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
    • 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 the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • 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 is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • 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
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • 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(theme.componentBG))
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • 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.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
ANDROID.mp4
Android: mWeb Chrome
ANDROID_WEB.mov
iOS: Native
IOS.mov
iOS: mWeb Safari
IOS-WEB.mov
MacOS: Chrome / Safari
Screen.Recording.2024-03-26.at.12.38.17.mov
MacOS: Desktop
Screen.Recording.2024-03-26.at.12.40.08.mov

@TMisiukiewicz TMisiukiewicz marked this pull request as ready for review March 22, 2024 14:18
@TMisiukiewicz TMisiukiewicz requested a review from a team as a code owner March 22, 2024 14:18
@melvin-bot melvin-bot bot removed the request for review from a team March 22, 2024 14:18
Copy link

melvin-bot bot commented Mar 22, 2024

@s77rt Please 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]

@melvin-bot melvin-bot bot requested a review from s77rt March 22, 2024 14:18
if (!shouldStoreLogs) {
Console.setShouldStoreLogs(true);
} else {
if (capturedLogs) {
Copy link
Contributor

Choose a reason for hiding this comment

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

these could be simplified with early returns on all the edge cases (like no logs captured)

Comment on lines 137 to 140
<Switch
accessibilityLabel="Client side logging"
isOn={!!shouldStoreLogs}
onToggle={() => (shouldStoreLogs ? Console.disableLoggingAndFlushLogs() : Console.setShouldStoreLogs(true))}
onToggle={onToggleClientSideLogging}
Copy link
Contributor

Choose a reason for hiding this comment

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

Use <ClientSideLoggingToolMenu />

Comment on lines 34 to 41
export default withOnyx<ClientSideLoggingToolProps, ClientSideLoggingToolMenuOnyxProps>({
capturedLogs: {
key: ONYXKEYS.LOGS,
},
shouldStoreLogs: {
key: ONYXKEYS.SHOULD_STORE_LOGS,
},
})(ClientSideLoggingToolMenu);
Copy link
Contributor

Choose a reason for hiding this comment

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

We don't need to subscribe to onyx keys twice. Only subscribe in BaseClientSideLoggingToolMenu and pass the required values through the props. (or the other way around)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

thanks, now i am subscribing to Onyx only in ClientSideLogginToolMenu and passing it down to base component

Copy link
Contributor

Choose a reason for hiding this comment

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

Due to recent change I see no use in subscribing in ClientSideLogginToolMenu. Let's subscribe in the base component instead

const logs = Object.values(capturedLogs as Log[]);
const logsWithParsedMessages = parseStringifyMessages(logs);
localFileCreate('logs', JSON.stringify(logsWithParsedMessages, null, 2)).then((localFile) => {
if (getOperatingSystem() === CONST.OS.ANDROID) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Avoid platform specific code. Instead write a index.android.tsx file

import type {OnyxEntry} from 'react-native-onyx';
import type {Log} from '@libs/Console';

type CapturedLogs = Record<number, Log>;
Copy link
Contributor

Choose a reason for hiding this comment

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

In ONYXKEYS please use that type

Copy link
Contributor

Choose a reason for hiding this comment

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

Change

[ONYXKEYS.LOGS]: Record<number, OnyxTypes.Log>;

to:

[ONYXKEYS.LOGS]: OnyxTypes.CapturedLogs;

Console.disableLoggingAndFlushLogs();
return;
}
const logs = Object.values(capturedLogs as Log[]);
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const logs = Object.values(capturedLogs as Log[]);
const logs = Object.values(capturedLogs);

<Button
small
text="Share"
onPress={onShareLogs}
Copy link
Contributor

Choose a reason for hiding this comment

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

Pass file as a param in onShareLogs

Copy link
Contributor

Choose a reason for hiding this comment

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

Or better remove the onShareLogs prop and let the button always call Share.open

Copy link
Contributor Author

Choose a reason for hiding this comment

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

this has to be platform-specific, as there is no share option for web/desktop

Copy link
Contributor

Choose a reason for hiding this comment

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

Let's pass the file prop through onShareLogs for now

Copy link
Contributor

Choose a reason for hiding this comment

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

Actually there is no benefit in doing this.

@TMisiukiewicz
Copy link
Contributor Author

@s77rt thanks for your review, I have addressed all of your comments

function ClientSideLoggingToolMenu({capturedLogs, shouldStoreLogs}: ClientSideLoggingToolProps) {
const onToggle = (logs: Log[]) => {
localFileDownload('logs', JSON.stringify(logs, null, 2));
Console.disableLoggingAndFlushLogs();
Copy link
Contributor

Choose a reason for hiding this comment

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

Move this line to BaseClientSideLoggingToolMenu.onToggle

* @param logs Logs captured on the current device
* @returns CapturedLogs with parsed messages
*/
const parseStringifyMessages = (logs: Log[]) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
const parseStringifyMessages = (logs: Log[]) => {
function parseStringifyMessages(logs: Log[]): Log[] {

Comment on lines 34 to 41
export default withOnyx<ClientSideLoggingToolProps, ClientSideLoggingToolMenuOnyxProps>({
capturedLogs: {
key: ONYXKEYS.LOGS,
},
shouldStoreLogs: {
key: ONYXKEYS.SHOULD_STORE_LOGS,
},
})(ClientSideLoggingToolMenu);
Copy link
Contributor

Choose a reason for hiding this comment

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

Due to recent change I see no use in subscribing in ClientSideLogginToolMenu. Let's subscribe in the base component instead

import type {OnyxEntry} from 'react-native-onyx';
import type {Log} from '@libs/Console';

type CapturedLogs = Record<number, Log>;
Copy link
Contributor

Choose a reason for hiding this comment

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

Change

[ONYXKEYS.LOGS]: Record<number, OnyxTypes.Log>;

to:

[ONYXKEYS.LOGS]: OnyxTypes.CapturedLogs;

Comment on lines +17 to +25
RNFetchBlob.MediaCollection.copyToMediaStore(
{
name: localFile.newFileName,
parentFolder: '',
mimeType: 'text/plain',
},
'Download',
localFile.path,
);
Copy link
Contributor

Choose a reason for hiding this comment

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

Is there a reason to copy the files to the media store?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes, on Android it is required to copy the file to media store to make it available in the public download directory

Copy link
Contributor

Choose a reason for hiding this comment

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

hi @TMisiukiewicz was there a reason to first save the file in RNFetchBlob.fs.dirs.DocumentDir and then copy in downloads, Can we save it directly in DownloadDir, is there a catch I am missing ?

<Button
small
text="Share"
onPress={onShareLogs}
Copy link
Contributor

Choose a reason for hiding this comment

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

Let's pass the file prop through onShareLogs for now

@s77rt
Copy link
Contributor

s77rt commented Mar 25, 2024

Not sure I can test on Android. It does not seem to be working (file not being saved?)

Screen.Recording.2024-03-25.at.3.03.12.PM.mov

@s77rt
Copy link
Contributor

s77rt commented Mar 25, 2024

On toggle on I think we need to hide the previous path and share buttons

Screen.Recording.2024-03-25.at.3.00.58.PM.mov

@s77rt
Copy link
Contributor

s77rt commented Mar 25, 2024

Pressing Share causes the illustration to disappear

Screen.Recording.2024-03-25.at.2.42.38.PM.mov

@s77rt
Copy link
Contributor

s77rt commented Mar 25, 2024

I'm not sure if this design is pre-approved, the spacing looks like they can be improved cc @Expensify/design

Screenshot 2024-03-25 at 2 42 19 PM

@shawnborton
Copy link
Contributor

Spacing of what exactly? Looks pretty good to me personally.

@s77rt
Copy link
Contributor

s77rt commented Mar 25, 2024

@shawnborton The path (in muted text) and the Logs menu item

@shawnborton
Copy link
Contributor

Got it - yeah, I think it works.

@quinthar
Copy link
Contributor

Who is this waiting on -- @s77rt ? what is the next step and when will it happen?

@TMisiukiewicz
Copy link
Contributor Author

@TMisiukiewicz Can you please address this too #38803 (comment)

@s77rt could you elaborate more on that? because I'm not sure I understand what exactly needs to be done, do you want to use both file prop and pass file through onShareLog param?

@s77rt
Copy link
Contributor

s77rt commented Mar 26, 2024

@TMisiukiewicz Can you please unify the testing steps? I think this is testable on all platforms

@s77rt
Copy link
Contributor

s77rt commented Mar 26, 2024

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:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
    • 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 the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
    • 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 is localized by adding it to src/languages/* files and using the translation method
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • 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 any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • 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(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • 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.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: Native
android.mov
Android: mWeb Chrome
mweb-chrome.mov
iOS: Native
ios.mov
iOS: mWeb Safari
mweb-safari.mov
MacOS: Chrome / Safari
web.mov
MacOS: Desktop
desktop.mov

@TMisiukiewicz
Copy link
Contributor Author

I think it might be an emulator thing, here's the video from Android device

Can you confirm if the file is actually there? e.g. was able to read the content or share it

I just tested it by sending it with an email, seems like a file is visible as an attachment and once sent, it's possible to open it and read the content:

Record_2024-03-26-12-24-14.mp4
Record_2024-03-26-12-24-33.mp4

I've updated test steps for Web & desktop for all platforms together with missing recordings for web & desktop based on Troubleshoot section

@s77rt
Copy link
Contributor

s77rt commented Mar 26, 2024

@TMisiukiewicz Thank you!

Copy link

melvin-bot bot commented Mar 26, 2024

We did not find an internal engineer to review this PR, trying to assign a random engineer to #38456 as well as to this PR... Please reach out for help on Slack if no one gets assigned!

@melvin-bot melvin-bot bot requested a review from amyevans March 26, 2024 11:47
Copy link
Contributor

@amyevans amyevans left a comment

Choose a reason for hiding this comment

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

Love this feature improvement, and tests well! Just a few minor thoughts on the code

const styles = useThemeStyles();
return (
<>
<TestToolRow title="Client side logging">
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we add a translation for this phrase? I see that it's consistent with other titles in Tools (all are hardcoded English) so NAB, but curious if there's a reason for not translating

<TestToolRow title="Logs">
<Button
small
text="Share"
Copy link
Contributor

Choose a reason for hiding this comment

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

There's an existing translation for this, let's use it

<TestToolRow title="Profile trace">
<Button
small
text="Share"
Copy link
Contributor

Choose a reason for hiding this comment

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

Same comment as above

* @param logs Logs captured on the current device
* @returns CapturedLogs with parsed messages
*/
function parseStringifyMessages(logs: Log[]): Log[] {
Copy link
Contributor

Choose a reason for hiding this comment

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

Perhaps Stringified instead?

Suggested change
function parseStringifyMessages(logs: Log[]): Log[] {
function parseStringifiedMessages(logs: Log[]): Log[] {

@TMisiukiewicz
Copy link
Contributor Author

@amyevans thanks for you comments! I have updated the translations, I think it makes sense to use translation for Client side logging as well, would be good to remove all existing hard-coded phrases in the future

@amyevans
Copy link
Contributor

Okay great! I've requested translations from our Spanish speakers and will update here once I've got them

@amyevans
Copy link
Contributor

amyevans commented Apr 1, 2024

Here are the translations:

en: 'No logs to share'
es: 'No hay logs que compartir'

en: 'There are no logs to share'
es: 'No hay logs que compartir'

en: 'Use profiling'
es: 'Usar el trazado'

en: 'Profile trace'
es: 'Traza de ejecución'

en: 'Release options'
es: 'Opciones de publicación'

en: 'Client side logging'
es: 'Logs del cliente'

en: 'Logs'
es: 'Logs'

Let's get those in and then we should be set to 🚀

@TMisiukiewicz
Copy link
Contributor Author

@amyevans thank you, updated!

@OSBotify
Copy link
Contributor

OSBotify commented Apr 8, 2024

🚀 Deployed to production by https://github.com/Julesssss in version: 1.4.60-13 🚀

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

@jayeshmangwani
Copy link
Contributor

Hi 👋 @TMisiukiewicz @s77rt ,For Client side logging, Why are we showing the share option for Android and iOS only? I am reviewing a PR that captures profiling data for web/desktop, and there we are showing the share button, but it downloads the file on the web. Moving forward with that PR, I need to understand why we hide the Share button for web/desktop for Client side logging.

@s77rt
Copy link
Contributor

s77rt commented Jul 10, 2024

@jayeshmangwani On web there is no share functionality. The log file is downloaded automatically after you stop capturing the logs.

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.

9 participants