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

LG-4662: Fix bundle size + other charts improvements #2611

Open
wants to merge 21 commits into
base: main
Choose a base branch
from

Conversation

tsck
Copy link
Collaborator

@tsck tsck commented Dec 18, 2024

✍️ Proposed changes

  • Adds treeshaking of echarts to minimize bundle size.
  • Improves echart initialization logic to better handle race conditions. This appears to fix previously seen offsetWidth bug.
  • Separates echarts logic from our business logic with the creation of useEchart hook.
  • Passes ChartInstance in full via the ChartProvider instead of individual methods.

🎟 Jira tickets:

✅ Checklist

For bug fixes, new features & breaking changes

  • I have added tests that prove my fix is effective or that my feature works
  • I have added necessary documentation (if appropriate)
  • I have run yarn changeset and documented my changes

For new components

  • I have added my new package to the global tsconfig
  • I have added my new package to the Table of Contents on the global README
  • I have verified the Live Example looks as intended on the design website.

🧪 How to test changes

  • All tests are passing
  • Test in storybook

Copy link

changeset-bot bot commented Dec 18, 2024

🦋 Changeset detected

Latest commit: 68595ff

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@lg-charts/core Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Comment on lines 96 to 103
const withInstanceCheck = <T extends (...args: Array<any>) => void>(
fn: T,
) => {
return (...args: Parameters<T>) => {
if (!echartsInstance) {
console.error('Echart instance not initialized');
return;
}
fn(...args);
};
};
Copy link
Collaborator Author

@tsck tsck Dec 18, 2024

Choose a reason for hiding this comment

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

I went back and forth on whether this should actually wait for an instance. In theory, we could store a promise in a ref, and make all of the methods asynchronous. I ultimately decided not to and instead essentially do nothing if the instance doesn't exist yet. But would be curious to hear other thoughts.

Copy link
Collaborator

@TheSonOfThomp TheSonOfThomp Dec 19, 2024

Choose a reason for hiding this comment

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

I'm a little confused why this is necessary. Is it just for the error logging?
Unless I'm missing something, the optional chain check (e.g. L114) should catch if the echartsInstance singleton is undefined/null.
Edit: I guess it's useful to fully abort if the instance isn't defined

Copy link
Collaborator

Choose a reason for hiding this comment

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

If this were to wait for the instance, that would mean all the instance methods (like addSeries) would all be async?

Copy link
Collaborator Author

@tsck tsck Dec 23, 2024

Choose a reason for hiding this comment

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

Edit: I guess it's useful to fully abort if the instance isn't defined

That's correct. This is used as a higher order function to wrap any function that relies on the existence of an instance. This is an extraction of duplicate logic that was being used inline in each of those methods, attempting to handle the case where it doesn't exist yet gracefully.

If this were to wait for the instance, that would mean all the instance methods (like addSeries) would all be async?

That's correct. It would basically wrap the given function in a promise, converting it to an async function that's capable of being awaited, so instead of just (almost) silently ignoring this case, the execution wouldn't occur until the instance did exist.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Fwiw, I don't think I like this. I think the interface of just exposing some way to determine readiness is fine.

@tsck tsck marked this pull request as ready for review December 18, 2024 21:14
@tsck tsck requested a review from a team as a code owner December 18, 2024 21:14
@tsck tsck requested review from TheSonOfThomp and removed request for a team December 18, 2024 21:14
Copy link
Contributor

github-actions bot commented Dec 18, 2024

Size Change: +6.67 kB (+0.48%)

Total Size: 1.4 MB

Filename Size Change
charts/core/dist/esm/index.js 8.62 kB +3.39 kB (+64.67%) 🆘
charts/core/dist/index.js 8.8 kB +3.29 kB (+59.59%) 🆘
ℹ️ View Unchanged
Filename Size
chat/avatar/dist/esm/index.js 1.36 kB
chat/avatar/dist/index.js 1.52 kB
chat/chat-disclaimer/dist/esm/index.js 566 B
chat/chat-disclaimer/dist/index.js 755 B
chat/chat-window/dist/esm/index.js 1.62 kB
chat/chat-window/dist/index.js 1.79 kB
chat/fixed-chat-window/dist/esm/index.js 2.35 kB
chat/fixed-chat-window/dist/index.js 2.54 kB
chat/input-bar/dist/esm/index.js 6.9 kB
chat/input-bar/dist/index.js 7.11 kB
chat/leafygreen-chat-provider/dist/esm/index.js 902 B
chat/leafygreen-chat-provider/dist/index.js 1.06 kB
chat/lg-markdown/dist/esm/index.js 1.44 kB
chat/lg-markdown/dist/index.js 1.59 kB
chat/message-feed/dist/esm/index.js 1.92 kB
chat/message-feed/dist/index.js 2.12 kB
chat/message-feedback/dist/esm/index.js 2.54 kB
chat/message-feedback/dist/index.js 2.78 kB
chat/message-prompts/dist/esm/index.js 1.74 kB
chat/message-prompts/dist/index.js 1.91 kB
chat/message-rating/dist/esm/index.js 2.52 kB
chat/message-rating/dist/index.js 2.71 kB
chat/message/dist/esm/index.js 3.75 kB
chat/message/dist/index.js 3.92 kB
chat/rich-links/dist/esm/index.js 2.68 kB
chat/rich-links/dist/index.js 2.89 kB
chat/title-bar/dist/esm/index.js 1.39 kB
chat/title-bar/dist/index.js 1.6 kB
packages/a11y/dist/esm/index.js 1.74 kB
packages/a11y/dist/index.js 1.87 kB
packages/avatar/dist/esm/index.js 2.35 kB
packages/avatar/dist/index.js 2.53 kB
packages/badge/dist/esm/index.js 1.46 kB
packages/badge/dist/index.js 1.66 kB
packages/banner/dist/esm/index.js 3.13 kB
packages/banner/dist/index.js 3.44 kB
packages/box/dist/esm/index.js 540 B
packages/box/dist/index.js 695 B
packages/button/dist/esm/index.js 4.94 kB
packages/button/dist/index.js 5.14 kB
packages/callout/dist/esm/index.js 1.62 kB
packages/callout/dist/index.js 1.8 kB
packages/card/dist/esm/index.js 1.56 kB
packages/card/dist/index.js 1.75 kB
packages/checkbox/dist/esm/index.js 4.27 kB
packages/checkbox/dist/index.js 4.48 kB
packages/chip/dist/esm/index.js 3.29 kB
packages/chip/dist/index.js 3.51 kB
packages/code/dist/esm/index.js 10.1 kB
packages/code/dist/index.js 10.7 kB
packages/combobox/dist/esm/index.js 12 kB
packages/combobox/dist/index.js 12.3 kB
packages/confirmation-modal/dist/esm/index.js 2.64 kB
packages/confirmation-modal/dist/index.js 2.87 kB
packages/copyable/dist/esm/index.js 2.86 kB
packages/copyable/dist/index.js 3.07 kB
packages/date-picker/dist/esm/index.js 13.8 kB
packages/date-picker/dist/index.js 14.2 kB
packages/date-utils/dist/esm/index.js 3.42 kB
packages/date-utils/dist/index.js 3.53 kB
packages/descendants/dist/esm/index.js 2.81 kB
packages/descendants/dist/index.js 2.9 kB
packages/emotion/dist/esm/index.js 345 B
packages/emotion/dist/index.js 555 B
packages/empty-state/dist/esm/index.js 1.9 kB
packages/empty-state/dist/index.js 2.08 kB
packages/expandable-card/dist/esm/index.js 2.85 kB
packages/expandable-card/dist/index.js 3.03 kB
packages/form-field/dist/esm/index.js 4.31 kB
packages/form-field/dist/index.js 4.46 kB
packages/form-footer/dist/esm/index.js 1.77 kB
packages/form-footer/dist/index.js 1.98 kB
packages/guide-cue/dist/esm/index.js 6.69 kB
packages/guide-cue/dist/index.js 6.92 kB
packages/hooks/dist/esm/index.js 3.36 kB
packages/hooks/dist/index.js 3.47 kB
packages/icon-button/dist/esm/index.js 2.35 kB
packages/icon-button/dist/index.js 2.57 kB
packages/icon/dist/ActivityFeed.js 2.03 kB
packages/icon/dist/AddFile.js 1.8 kB
packages/icon/dist/AllProducts.js 1.87 kB
packages/icon/dist/Apps.js 1.47 kB
packages/icon/dist/Array.js 1.59 kB
packages/icon/dist/ArrowDown.js 1.72 kB
packages/icon/dist/ArrowLeft.js 1.73 kB
packages/icon/dist/ArrowRight.js 1.72 kB
packages/icon/dist/ArrowUp.js 1.72 kB
packages/icon/dist/Beaker.js 2.15 kB
packages/icon/dist/Bell.js 1.68 kB
packages/icon/dist/Biometric.js 2.25 kB
packages/icon/dist/Boolean.js 1.52 kB
packages/icon/dist/Building.js 1.67 kB
packages/icon/dist/Bulb.js 1.72 kB
packages/icon/dist/Calendar.js 1.67 kB
packages/icon/dist/Camera.js 1.76 kB
packages/icon/dist/Cap.js 1.88 kB
packages/icon/dist/CaretDown.js 1.54 kB
packages/icon/dist/CaretLeft.js 1.54 kB
packages/icon/dist/CaretRight.js 1.53 kB
packages/icon/dist/CaretUp.js 1.54 kB
packages/icon/dist/ChartFilled.js 1.64 kB
packages/icon/dist/Charts.js 1.61 kB
packages/icon/dist/Checkmark.js 1.68 kB
packages/icon/dist/CheckmarkWithCircle.js 1.75 kB
packages/icon/dist/ChevronDown.js 1.64 kB
packages/icon/dist/ChevronLeft.js 1.64 kB
packages/icon/dist/ChevronRight.js 1.66 kB
packages/icon/dist/ChevronUp.js 1.63 kB
packages/icon/dist/Clock.js 1.7 kB
packages/icon/dist/ClockWithArrow.js 1.99 kB
packages/icon/dist/Clone.js 1.57 kB
packages/icon/dist/Cloud.js 1.75 kB
packages/icon/dist/Code.js 1.96 kB
packages/icon/dist/CodeBlock.js 1.9 kB
packages/icon/dist/Coin.js 2.01 kB
packages/icon/dist/Colon.js 1.52 kB
packages/icon/dist/Connect.js 2 kB
packages/icon/dist/Copy.js 1.95 kB
packages/icon/dist/CreditCard.js 1.5 kB
packages/icon/dist/CurlyBraces.js 2.1 kB
packages/icon/dist/Cursor.js 1.63 kB
packages/icon/dist/Dashboard.js 1.64 kB
packages/icon/dist/Database.js 2.1 kB
packages/icon/dist/Diagram.js 1.71 kB
packages/icon/dist/Diagram2.js 1.73 kB
packages/icon/dist/Diagram3.js 1.69 kB
packages/icon/dist/Disconnect.js 1.94 kB
packages/icon/dist/Download.js 1.73 kB
packages/icon/dist/Drag.js 1.68 kB
packages/icon/dist/Edit.js 1.58 kB
packages/icon/dist/Ellipsis.js 1.56 kB
packages/icon/dist/Email.js 1.78 kB
packages/icon/dist/EmptyDatabase.js 4.38 kB
packages/icon/dist/EmptyFolder.js 2.17 kB
packages/icon/dist/Eraser.js 1.85 kB
packages/icon/dist/Escalation.js 1.75 kB
packages/icon/dist/esm/ActivityFeed.js 1.79 kB
packages/icon/dist/esm/AddFile.js 1.57 kB
packages/icon/dist/esm/AllProducts.js 1.64 kB
packages/icon/dist/esm/Apps.js 1.25 kB
packages/icon/dist/esm/Array.js 1.37 kB
packages/icon/dist/esm/ArrowDown.js 1.49 kB
packages/icon/dist/esm/ArrowLeft.js 1.5 kB
packages/icon/dist/esm/ArrowRight.js 1.49 kB
packages/icon/dist/esm/ArrowUp.js 1.49 kB
packages/icon/dist/esm/Beaker.js 1.92 kB
packages/icon/dist/esm/Bell.js 1.45 kB
packages/icon/dist/esm/Biometric.js 2.02 kB
packages/icon/dist/esm/Boolean.js 1.29 kB
packages/icon/dist/esm/Building.js 1.44 kB
packages/icon/dist/esm/Bulb.js 1.49 kB
packages/icon/dist/esm/Calendar.js 1.45 kB
packages/icon/dist/esm/Camera.js 1.53 kB
packages/icon/dist/esm/Cap.js 1.65 kB
packages/icon/dist/esm/CaretDown.js 1.31 kB
packages/icon/dist/esm/CaretLeft.js 1.31 kB
packages/icon/dist/esm/CaretRight.js 1.31 kB
packages/icon/dist/esm/CaretUp.js 1.31 kB
packages/icon/dist/esm/ChartFilled.js 1.41 kB
packages/icon/dist/esm/Charts.js 1.39 kB
packages/icon/dist/esm/Checkmark.js 1.45 kB
packages/icon/dist/esm/CheckmarkWithCircle.js 1.51 kB
packages/icon/dist/esm/ChevronDown.js 1.41 kB
packages/icon/dist/esm/ChevronLeft.js 1.42 kB
packages/icon/dist/esm/ChevronRight.js 1.43 kB
packages/icon/dist/esm/ChevronUp.js 1.4 kB
packages/icon/dist/esm/Clock.js 1.47 kB
packages/icon/dist/esm/ClockWithArrow.js 1.75 kB
packages/icon/dist/esm/Clone.js 1.34 kB
packages/icon/dist/esm/Cloud.js 1.53 kB
packages/icon/dist/esm/Code.js 1.73 kB
packages/icon/dist/esm/CodeBlock.js 1.67 kB
packages/icon/dist/esm/Coin.js 1.77 kB
packages/icon/dist/esm/Colon.js 1.3 kB
packages/icon/dist/esm/Connect.js 1.77 kB
packages/icon/dist/esm/Copy.js 1.72 kB
packages/icon/dist/esm/CreditCard.js 1.27 kB
packages/icon/dist/esm/CurlyBraces.js 1.87 kB
packages/icon/dist/esm/Cursor.js 1.4 kB
packages/icon/dist/esm/Dashboard.js 1.41 kB
packages/icon/dist/esm/Database.js 1.87 kB
packages/icon/dist/esm/Diagram.js 1.49 kB
packages/icon/dist/esm/Diagram2.js 1.5 kB
packages/icon/dist/esm/Diagram3.js 1.47 kB
packages/icon/dist/esm/Disconnect.js 1.71 kB
packages/icon/dist/esm/Download.js 1.5 kB
packages/icon/dist/esm/Drag.js 1.46 kB
packages/icon/dist/esm/Edit.js 1.36 kB
packages/icon/dist/esm/Ellipsis.js 1.34 kB
packages/icon/dist/esm/Email.js 1.55 kB
packages/icon/dist/esm/EmptyDatabase.js 4.13 kB
packages/icon/dist/esm/EmptyFolder.js 1.94 kB
packages/icon/dist/esm/Eraser.js 1.62 kB
packages/icon/dist/esm/Escalation.js 1.52 kB
packages/icon/dist/esm/Export.js 1.63 kB
packages/icon/dist/esm/Favorite.js 1.58 kB
packages/icon/dist/esm/Federation.js 1.9 kB
packages/icon/dist/esm/File.js 1.39 kB
packages/icon/dist/esm/Filter.js 1.37 kB
packages/icon/dist/esm/Folder.js 1.28 kB
packages/icon/dist/esm/Format.js 1.71 kB
packages/icon/dist/esm/FullScreenEnter.js 1.53 kB
packages/icon/dist/esm/FullScreenExit.js 1.54 kB
packages/icon/dist/esm/Gauge.js 1.57 kB
packages/icon/dist/esm/GlobeAmericas.js 1.49 kB
packages/icon/dist/esm/GovernmentBuilding.js 1.52 kB
packages/icon/dist/esm/Hash.js 1.68 kB
packages/icon/dist/esm/Highlight.js 1.72 kB
packages/icon/dist/esm/Home.js 1.64 kB
packages/icon/dist/esm/HorizontalDrag.js 1.46 kB
packages/icon/dist/esm/Import.js 1.62 kB
packages/icon/dist/esm/ImportantWithCircle.js 1.38 kB
packages/icon/dist/esm/index.js 29.9 kB
packages/icon/dist/esm/InfoWithCircle.js 1.42 kB
packages/icon/dist/esm/InternalEmployee.js 1.71 kB
packages/icon/dist/esm/InviteUser.js 1.72 kB
packages/icon/dist/esm/Key.js 1.52 kB
packages/icon/dist/esm/Laptop.js 1.51 kB
packages/icon/dist/esm/LightningBolt.js 1.38 kB
packages/icon/dist/esm/Link.js 1.88 kB
packages/icon/dist/esm/List.js 1.53 kB
packages/icon/dist/esm/Lock.js 1.48 kB
packages/icon/dist/esm/LogIn.js 1.55 kB
packages/icon/dist/esm/LogOut.js 1.61 kB
packages/icon/dist/esm/MagnifyingGlass.js 1.45 kB
packages/icon/dist/esm/Megaphone.js 1.43 kB
packages/icon/dist/esm/Menu.js 1.33 kB
packages/icon/dist/esm/Minus.js 1.29 kB
packages/icon/dist/esm/Mobile.js 1.28 kB
packages/icon/dist/esm/Moon.js 1.47 kB
packages/icon/dist/esm/MultiDirectionArrow.js 1.5 kB
packages/icon/dist/esm/MultiLayers.js 2.46 kB
packages/icon/dist/esm/NavCollapse.js 1.52 kB
packages/icon/dist/esm/NavExpand.js 1.53 kB
packages/icon/dist/esm/NoFilter.js 1.51 kB
packages/icon/dist/esm/NotAllowed.js 1.4 kB
packages/icon/dist/esm/Note.js 1.43 kB
packages/icon/dist/esm/OpenNewTab.js 1.71 kB
packages/icon/dist/esm/Pause.js 1.34 kB
packages/icon/dist/esm/Pending.js 1.31 kB
packages/icon/dist/esm/Person.js 1.5 kB
packages/icon/dist/esm/PersonGroup.js 1.71 kB
packages/icon/dist/esm/PersonWithLock.js 1.71 kB
packages/icon/dist/esm/Pin.js 1.45 kB
packages/icon/dist/esm/Play.js 1.32 kB
packages/icon/dist/esm/Plus.js 1.34 kB
packages/icon/dist/esm/PlusWithCircle.js 1.37 kB
packages/icon/dist/esm/Primary.js 1.39 kB
packages/icon/dist/esm/Project.js 1.43 kB
packages/icon/dist/esm/QuestionMarkWithCircle.js 1.75 kB
packages/icon/dist/esm/Read.js 2.04 kB
packages/icon/dist/esm/Recommended.js 2.22 kB
packages/icon/dist/esm/Redo.js 1.68 kB
packages/icon/dist/esm/Refresh.js 1.75 kB
packages/icon/dist/esm/Relationship.js 1.45 kB
packages/icon/dist/esm/ReplicaSet.js 1.6 kB
packages/icon/dist/esm/Resize.js 1.42 kB
packages/icon/dist/esm/Return.js 1.51 kB
packages/icon/dist/esm/Revert.js 1.55 kB
packages/icon/dist/esm/Save.js 1.94 kB
packages/icon/dist/esm/SearchIndex.js 2.07 kB
packages/icon/dist/esm/Secondary.js 1.63 kB
packages/icon/dist/esm/Serverless.js 1.58 kB
packages/icon/dist/esm/Settings.js 2.01 kB
packages/icon/dist/esm/ShardedCluster.js 1.96 kB
packages/icon/dist/esm/Shell.js 1.5 kB
packages/icon/dist/esm/SMS.js 1.46 kB
packages/icon/dist/esm/SortAscending.js 1.54 kB
packages/icon/dist/esm/SortDescending.js 1.53 kB
packages/icon/dist/esm/Sparkle.js 1.87 kB
packages/icon/dist/esm/SplitHorizontal.js 1.31 kB
packages/icon/dist/esm/SplitVertical.js 1.3 kB
packages/icon/dist/esm/Stitch.js 1.34 kB
packages/icon/dist/esm/Stop.js 1.19 kB
packages/icon/dist/esm/String.js 1.45 kB
packages/icon/dist/esm/Sun.js 1.67 kB
packages/icon/dist/esm/Support.js 1.54 kB
packages/icon/dist/esm/Sweep.js 1.56 kB
packages/icon/dist/esm/Table.js 1.33 kB
packages/icon/dist/esm/Tag.js 1.37 kB
packages/icon/dist/esm/ThumbsDown.js 1.66 kB
packages/icon/dist/esm/ThumbsUp.js 1.65 kB
packages/icon/dist/esm/TimeSeries.js 1.7 kB
packages/icon/dist/esm/TimeSeriesCollection.js 1.83 kB
packages/icon/dist/esm/Trash.js 1.36 kB
packages/icon/dist/esm/Undo.js 1.67 kB
packages/icon/dist/esm/University.js 1.86 kB
packages/icon/dist/esm/Unlock.js 1.55 kB
packages/icon/dist/esm/Unsorted.js 1.59 kB
packages/icon/dist/esm/UpDownCarets.js 1.44 kB
packages/icon/dist/esm/Upload.js 1.64 kB
packages/icon/dist/esm/VerticalEllipsis.js 1.35 kB
packages/icon/dist/esm/Visibility.js 1.67 kB
packages/icon/dist/esm/VisibilityOff.js 2.06 kB
packages/icon/dist/esm/Warning.js 1.43 kB
packages/icon/dist/esm/Wizard.js 1.78 kB
packages/icon/dist/esm/Wrench.js 1.77 kB
packages/icon/dist/esm/Write.js 2.05 kB
packages/icon/dist/esm/X.js 1.47 kB
packages/icon/dist/esm/XWithCircle.js 1.41 kB
packages/icon/dist/Export.js 1.86 kB
packages/icon/dist/Favorite.js 1.82 kB
packages/icon/dist/Federation.js 2.14 kB
packages/icon/dist/File.js 1.61 kB
packages/icon/dist/Filter.js 1.6 kB
packages/icon/dist/Folder.js 1.5 kB
packages/icon/dist/Format.js 1.93 kB
packages/icon/dist/FullScreenEnter.js 1.76 kB
packages/icon/dist/FullScreenExit.js 1.77 kB
packages/icon/dist/Gauge.js 1.8 kB
packages/icon/dist/GlobeAmericas.js 1.72 kB
packages/icon/dist/GovernmentBuilding.js 1.75 kB
packages/icon/dist/Hash.js 1.91 kB
packages/icon/dist/Highlight.js 1.95 kB
packages/icon/dist/Home.js 1.87 kB
packages/icon/dist/HorizontalDrag.js 1.69 kB
packages/icon/dist/Import.js 1.85 kB
packages/icon/dist/ImportantWithCircle.js 1.61 kB
packages/icon/dist/index.js 30.2 kB
packages/icon/dist/InfoWithCircle.js 1.64 kB
packages/icon/dist/InternalEmployee.js 1.94 kB
packages/icon/dist/InviteUser.js 1.95 kB
packages/icon/dist/Key.js 1.75 kB
packages/icon/dist/Laptop.js 1.73 kB
packages/icon/dist/LightningBolt.js 1.61 kB
packages/icon/dist/Link.js 2.12 kB
packages/icon/dist/List.js 1.75 kB
packages/icon/dist/Lock.js 1.7 kB
packages/icon/dist/LogIn.js 1.78 kB
packages/icon/dist/LogOut.js 1.84 kB
packages/icon/dist/MagnifyingGlass.js 1.68 kB
packages/icon/dist/Megaphone.js 1.65 kB
packages/icon/dist/Menu.js 1.56 kB
packages/icon/dist/Minus.js 1.51 kB
packages/icon/dist/Mobile.js 1.51 kB
packages/icon/dist/Moon.js 1.7 kB
packages/icon/dist/MultiDirectionArrow.js 1.73 kB
packages/icon/dist/MultiLayers.js 2.7 kB
packages/icon/dist/NavCollapse.js 1.75 kB
packages/icon/dist/NavExpand.js 1.76 kB
packages/icon/dist/NoFilter.js 1.74 kB
packages/icon/dist/NotAllowed.js 1.63 kB
packages/icon/dist/Note.js 1.66 kB
packages/icon/dist/OpenNewTab.js 1.95 kB
packages/icon/dist/Pause.js 1.56 kB
packages/icon/dist/Pending.js 1.54 kB
packages/icon/dist/Person.js 1.73 kB
packages/icon/dist/PersonGroup.js 1.94 kB
packages/icon/dist/PersonWithLock.js 1.94 kB
packages/icon/dist/Pin.js 1.67 kB
packages/icon/dist/Play.js 1.54 kB
packages/icon/dist/Plus.js 1.57 kB
packages/icon/dist/PlusWithCircle.js 1.6 kB
packages/icon/dist/Primary.js 1.62 kB
packages/icon/dist/Project.js 1.66 kB
packages/icon/dist/QuestionMarkWithCircle.js 1.98 kB
packages/icon/dist/Read.js 2.27 kB
packages/icon/dist/Recommended.js 2.46 kB
packages/icon/dist/Redo.js 1.92 kB
packages/icon/dist/Refresh.js 1.98 kB
packages/icon/dist/Relationship.js 1.67 kB
packages/icon/dist/ReplicaSet.js 1.82 kB
packages/icon/dist/Resize.js 1.64 kB
packages/icon/dist/Return.js 1.74 kB
packages/icon/dist/Revert.js 1.78 kB
packages/icon/dist/Save.js 2.17 kB
packages/icon/dist/SearchIndex.js 2.31 kB
packages/icon/dist/Secondary.js 1.86 kB
packages/icon/dist/Serverless.js 1.82 kB
packages/icon/dist/Settings.js 2.25 kB
packages/icon/dist/ShardedCluster.js 2.2 kB
packages/icon/dist/Shell.js 1.73 kB
packages/icon/dist/SMS.js 1.69 kB
packages/icon/dist/SortAscending.js 1.77 kB
packages/icon/dist/SortDescending.js 1.76 kB
packages/icon/dist/Sparkle.js 2.1 kB
packages/icon/dist/SplitHorizontal.js 1.53 kB
packages/icon/dist/SplitVertical.js 1.53 kB
packages/icon/dist/Stitch.js 1.57 kB
packages/icon/dist/Stop.js 1.41 kB
packages/icon/dist/String.js 1.68 kB
packages/icon/dist/Sun.js 1.9 kB
packages/icon/dist/Support.js 1.77 kB
packages/icon/dist/Sweep.js 1.79 kB
packages/icon/dist/Table.js 1.55 kB
packages/icon/dist/Tag.js 1.59 kB
packages/icon/dist/ThumbsDown.js 1.89 kB
packages/icon/dist/ThumbsUp.js 1.89 kB
packages/icon/dist/TimeSeries.js 1.94 kB
packages/icon/dist/TimeSeriesCollection.js 2.07 kB
packages/icon/dist/Trash.js 1.59 kB
packages/icon/dist/Undo.js 1.91 kB
packages/icon/dist/University.js 2.1 kB
packages/icon/dist/Unlock.js 1.78 kB
packages/icon/dist/Unsorted.js 1.82 kB
packages/icon/dist/UpDownCarets.js 1.66 kB
packages/icon/dist/Upload.js 1.87 kB
packages/icon/dist/VerticalEllipsis.js 1.57 kB
packages/icon/dist/Visibility.js 1.9 kB
packages/icon/dist/VisibilityOff.js 2.3 kB
packages/icon/dist/Warning.js 1.66 kB
packages/icon/dist/Wizard.js 2.02 kB
packages/icon/dist/Wrench.js 2 kB
packages/icon/dist/Write.js 2.28 kB
packages/icon/dist/X.js 1.7 kB
packages/icon/dist/XWithCircle.js 1.64 kB
packages/info-sprinkle/dist/esm/index.js 1.94 kB
packages/info-sprinkle/dist/index.js 2.14 kB
packages/inline-definition/dist/esm/index.js 1.74 kB
packages/inline-definition/dist/index.js 1.91 kB
packages/input-option/dist/esm/index.js 2.68 kB
packages/input-option/dist/index.js 2.82 kB
packages/leafygreen-provider/dist/esm/index.js 1.97 kB
packages/leafygreen-provider/dist/index.js 2.15 kB
packages/lib/dist/esm/index.js 2.35 kB
packages/lib/dist/index.js 2.51 kB
packages/loading-indicator/dist/esm/index.js 3.41 kB
packages/loading-indicator/dist/index.js 3.63 kB
packages/logo/dist/esm/index.js 39.1 kB
packages/logo/dist/index.js 39.4 kB
packages/marketing-modal/dist/esm/index.js 3.6 kB
packages/marketing-modal/dist/index.js 3.83 kB
packages/menu/dist/esm/index.js 8.12 kB
packages/menu/dist/index.js 8.41 kB
packages/modal/dist/esm/index.js 3.31 kB
packages/modal/dist/index.js 3.54 kB
packages/number-input/dist/esm/index.js 5.74 kB
packages/number-input/dist/index.js 5.94 kB
packages/ordered-list/dist/esm/index.js 1.36 kB
packages/ordered-list/dist/index.js 1.55 kB
packages/pagination/dist/esm/index.js 1.77 kB
packages/pagination/dist/index.js 1.99 kB
packages/palette/dist/esm/index.js 411 B
packages/palette/dist/index.js 562 B
packages/password-input/dist/esm/index.js 4.7 kB
packages/password-input/dist/index.js 4.94 kB
packages/pipeline/dist/esm/index.js 7.93 kB
packages/pipeline/dist/index.js 8.21 kB
packages/polymorphic/dist/esm/index.js 1.27 kB
packages/polymorphic/dist/index.js 1.4 kB
packages/popover/dist/esm/index.js 5.1 kB
packages/popover/dist/index.js 5.26 kB
packages/portal/dist/esm/index.js 979 B
packages/portal/dist/index.js 1.16 kB
packages/radio-box-group/dist/esm/index.js 2.98 kB
packages/radio-box-group/dist/index.js 3.13 kB
packages/radio-group/dist/esm/index.js 3.37 kB
packages/radio-group/dist/index.js 3.53 kB
packages/ripple/dist/esm/index.js 956 B
packages/ripple/dist/index.js 1.05 kB
packages/search-input/dist/esm/index.js 5.89 kB
packages/search-input/dist/index.js 6.1 kB
packages/segmented-control/dist/esm/index.js 5.52 kB
packages/segmented-control/dist/index.js 5.67 kB
packages/select/dist/esm/index.js 9.23 kB
packages/select/dist/index.js 9.43 kB
packages/side-nav/dist/esm/index.js 7.55 kB
packages/side-nav/dist/index.js 7.81 kB
packages/skeleton-loader/dist/esm/index.js 3.19 kB
packages/skeleton-loader/dist/index.js 3.39 kB
packages/split-button/dist/esm/index.js 3.56 kB
packages/split-button/dist/index.js 3.73 kB
packages/stepper/dist/esm/index.js 3.5 kB
packages/stepper/dist/index.js 3.73 kB
packages/table/dist/esm/index.js 8.4 kB
packages/table/dist/index.js 8.63 kB
packages/tabs/dist/esm/index.js 5.41 kB
packages/tabs/dist/index.js 5.56 kB
packages/testing-lib/dist/esm/index.js 4.52 kB
packages/testing-lib/dist/index.js 4.74 kB
packages/testing-lib/dist/renderHookServer.js 391 B
packages/testing-lib/dist/renderHookServerV17.js 239 B
packages/text-area/dist/esm/index.js 2.43 kB
packages/text-area/dist/index.js 2.6 kB
packages/text-input/dist/esm/index.js 2.79 kB
packages/text-input/dist/index.js 2.97 kB
packages/toast/dist/esm/index.js 8.31 kB
packages/toast/dist/index.js 8.61 kB
packages/toggle/dist/esm/index.js 3.11 kB
packages/toggle/dist/index.js 3.31 kB
packages/tokens/dist/esm/index.js 1.96 kB
packages/tokens/dist/index.js 2.06 kB
packages/tooltip/dist/esm/index.js 4.46 kB
packages/tooltip/dist/index.js 4.76 kB
packages/typography/dist/esm/index.js 5.58 kB
packages/typography/dist/index.js 5.73 kB
tools/build/dist/esm/index.js 5.75 kB
tools/build/dist/index.js 5.97 kB
tools/cli/dist/esm/index.js 1.97 kB
tools/cli/dist/index.js 2.12 kB
tools/codemods/dist/_virtual/_rollupPluginBabelHelpers.js 973 B
tools/codemods/dist/codemods/consolidate-props/transform.js 378 B
tools/codemods/dist/codemods/popover-v12/transform.js 1.11 kB
tools/codemods/dist/codemods/rename-component-prop/transform.js 317 B
tools/codemods/dist/codemods/update-component-prop-value/transform.js 330 B
tools/codemods/dist/constants.js 148 B
tools/codemods/dist/esm/index.js 4.98 kB
tools/codemods/dist/index.js 5.2 kB
tools/codemods/dist/types.js 765 B
tools/codemods/dist/utils/imports/getImportSpecifiersForDeclaration.js 283 B
tools/codemods/dist/utils/jsx/getJSXAttributes.js 165 B
tools/codemods/dist/utils/jsx/insertJSXComment/insertJSXComment.js 373 B
tools/codemods/dist/utils/transformations/addJSXAttributes/addJSXAttributes.js 412 B
tools/codemods/dist/utils/transformations/consolidateJSXAttributes/consolidateJSXAttributes.js 664 B
tools/codemods/dist/utils/transformations/removeJSXAttributes/removeJSXAttributes.js 366 B
tools/codemods/dist/utils/transformations/replaceJSXAttributes/replaceJSXAttributes.js 283 B
tools/create/dist/esm/index.js 2.88 kB
tools/create/dist/index.js 3.05 kB
tools/install/dist/esm/index.js 890 B
tools/install/dist/index.js 1.03 kB
tools/link/dist/esm/index.js 5.03 kB
tools/link/dist/index.js 5.15 kB
tools/lint/dist/esm/index.js 1.02 kB
tools/lint/dist/index.js 1.16 kB
tools/meta/dist/esm/index.js 1.48 kB
tools/meta/dist/index.js 1.61 kB
tools/slackbot/dist/esm/index.js 6.1 kB
tools/slackbot/dist/index.js 6.27 kB
tools/storybook-addon/dist/esm/index.js 4.98 kB
tools/storybook-addon/dist/esm/main.js 4.94 kB
tools/storybook-addon/dist/esm/manager.js 550 B
tools/storybook-addon/dist/esm/preview.js 1.6 kB
tools/storybook-addon/dist/index.js 5.09 kB
tools/storybook-addon/dist/main.js 5.04 kB
tools/storybook-addon/dist/manager.js 681 B
tools/storybook-addon/dist/preview.js 1.69 kB
tools/storybook-decorators/dist/esm/index.js 3.29 kB
tools/storybook-decorators/dist/index.js 3.55 kB
tools/storybook-utils/dist/esm/index.js 1.05 kB
tools/storybook-utils/dist/index.js 1.22 kB
tools/test-harnesses/dist/esm/index.js 1.78 kB
tools/test-harnesses/dist/index.js 1.9 kB
tools/test/dist/esm/index.js 1.65 kB
tools/test/dist/index.js 1.78 kB
tools/update/dist/esm/index.js 730 B
tools/update/dist/index.js 896 B
tools/validate/dist/esm/index.js 6.86 kB
tools/validate/dist/index.js 7.08 kB

compressed-size-action

const { theme } = useDarkMode();

useEffect(() => {
if (!chart.ready) return;
Copy link
Collaborator

Choose a reason for hiding this comment

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

I might be misunderstanding how echarts works, but why can't we check if chart is defined?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

chart in this case is an instance of ChartInstance. In theory, that's actually always defined even when the echart hasn't been initialized. We could check if chart._echartsInstance is defined, but I just added chart.ready as a helper boolean to avoid having to interact directly with the instance outside of useEchart. Does that make sense?

@TheSonOfThomp TheSonOfThomp self-requested a review December 19, 2024 17:50
const [echartsInstance, setEchartsInstance] = useState<any>(null); // has to be any since no types exist until import
const [error, setError] = useState<EChartsInstance['error']>(null);
const [ready, setReady] = useState<EChartsInstance['ready']>(false);
const [options, setOptions] = useState<EChartsInstance['options']>(
Copy link
Collaborator

Choose a reason for hiding this comment

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

remind me, why do we need to keep track of options in state if we can access them via echartsInstance.options?

Copy link
Collaborator

Choose a reason for hiding this comment

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

If we want it more easily accessible from this hook's return object, could we just have

const options = useMemo(() => echartsInstance.options, [...]) // or whatever the correct property is?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I think at one point early on I was tying into changes in order to trigger updates. Since this is no longer the case, I think this is a really good point. Will look into removing this.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Okay I dug into this more and remember why we were holding a copy of the options. This is what made it possible to batch updates. Since we debounce calls to echartsInstance.setOption() via setEchartOptions, when additional updates occur in short order, they don't have an accurate copy of the current options since echartsInstance.getOption() is not necessarily up to date yet.

I know there was some initial disagreement regarding whether this batching was necessary. I tried to run some tests rendering a chart with 100 lines. With batching, the chart appeared after about 4000ms. Without batching, it didn't appear until after the profiler stopped recording which seemed to be around 6000ms. I'm not 100% sure what caused this but I am under the impression that each additional update is supposed to cause a repaint of the canvas, so it would be 1 repaint vs 100+ repaints. Though, I have no idea if that's what caused this, it could be something totally unrelated, at least withe current implementation it caused an inherent slowdown.

Happy to discuss further of course if there are other ideas, but just going to leave as is for now.

Comment on lines +10 to +18
const mockEchartsInstance = {
setOption: jest.fn(),
dispose: jest.fn(),
resize: jest.fn(),
on: jest.fn(),
off: jest.fn(),
dispatchAction: jest.fn(),
group: null,
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

🔥

updateChartOptions: (newOptions: Partial<ChartOptions>) => void;
addChartSeries: (series: SeriesOption) => void;
removeChartSeries: (name: string) => void;
chart: ChartInstance;
Copy link
Collaborator

Choose a reason for hiding this comment

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

could this be undefined?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ChartInstance, the object with the instance methods, I don't believe should be, but props like ChartInstance._echartsInstance could be null.

@tsck tsck force-pushed the terrence/fix-bundle-size branch from 44436b4 to eea4d45 Compare December 19, 2024 20:46
@tsck tsck force-pushed the terrence/fix-bundle-size branch from 1bf408e to 68595ff Compare December 26, 2024 18:24
@tsck tsck requested a review from TheSonOfThomp December 26, 2024 20:17
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.

2 participants