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

Fix stale decorations #4876

Merged
merged 7 commits into from
Mar 9, 2022
Merged

Conversation

nemanja-tosic
Copy link
Contributor

@nemanja-tosic nemanja-tosic commented Mar 8, 2022

Description

Given that all relevant functions used to memoize an element do not change, when the editor re-renders no new decorations will be applied unless the entire tree from root to element contains a change. This leads to "decorate" being called only on the top elements, not any nested ones.

This PR resolves that by generating all decorations upfront instead of lazily as the tree is walked.

Context

The decorations prior to this PR are generated lazily, as the tree is walked. First we generate decoration for the editor, then the children of editor, then the children of children etc... Traversal is stopped however unless the following memo is invalidated:

const MemoizedElement = React.memo(Element, (prev, next) => {
  return (
    prev.element === next.element &&
    prev.renderElement === next.renderElement &&
    prev.renderLeaf === next.renderLeaf &&
    isDecoratorRangeListEqual(prev.decorations, next.decorations) &&
    (prev.selection === next.selection ||
      (!!prev.selection &&
        !!next.selection &&
        Range.equals(prev.selection, next.selection)))
  )
})

If only looking at the decorations of the current node, and not the children, the memo will not be invalidated and decorations will not be updated. This is resolved by generating everything upfront. The memo is then invalidated by providing the decorations for the intersection for the current range, as follows:

const ds = decorations.filter(dec => Range.intersection(dec, range))

which contain both the current element and children.

Checks

  • The new code matches the existing patterns and styles.
  • The tests pass with yarn test.
  • The linter passes with yarn lint. (Fix errors with yarn fix.)
  • The relevant examples still work. (Run examples with yarn start.)
  • You've added a changeset if changing functionality. (Add one with yarn changeset add.)

@changeset-bot
Copy link

changeset-bot bot commented Mar 8, 2022

🦋 Changeset detected

Latest commit: ad1b94f

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

This PR includes changesets to release 1 package
Name Type
slate-react 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

nemanja-tosic and others added 4 commits March 8, 2022 22:09
The base typescript config uses ESNext as target, so presumably the
latest node should be used.
@dylans dylans merged commit 1b205c0 into ianstormtaylor:main Mar 9, 2022
@github-actions github-actions bot mentioned this pull request Mar 9, 2022
@jasonphillips jasonphillips mentioned this pull request Mar 23, 2022
5 tasks
DougReeder pushed a commit to DougReeder/slate that referenced this pull request Apr 3, 2022
* test changes

* fix decoration not updating

* Add changeset

* Fix lint issues

* Tests with earlier version of Node.js

* Bump node version on CI

The base typescript config uses ESNext as target, so presumably the
latest node should be used.

Co-authored-by: Dylan Schiemann <dylan@dojotoolkit.org>
jasonphillips added a commit to jasonphillips/slate that referenced this pull request May 25, 2022
dylans pushed a commit that referenced this pull request May 25, 2022
* Revert "Fix child element decorations (#4910)"

This reverts commit 2a8d86f.

* Revert "Fix stale decorations (#4876)"

This reverts commit 1b205c0.

* chore: add changeset
@github-actions github-actions bot mentioned this pull request May 25, 2022
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