-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Add the ability to discard history more flexibly #5778
base: main
Are you sure you want to change the base?
Add the ability to discard history more flexibly #5778
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
Hi @hanselabreu! Thank you for your pull request and welcome to our community. Action RequiredIn order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you. ProcessIn order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA. Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with If you have received this in error or have any questions, please contact us at [email protected]. Thanks! |
I don't think you need a PR to do this, I haven't tested this or thought too much about what the current or redoStack should be but something along these lines ought to work import { useState, useRef } from 'react';
import {createEmptyHistoryState, HistoryPlugin} from '@lexical/history';
export default function DiscardHistoryPlugin({ discard = false }: { discard: boolean }) {
const [history, setHistory] = useState(createEmptyHistoryState);
const historyRef = useRef(history);
useEffect(() => {
if (discard) {
// save a copy of the history from before discard=true
historyRef.current = {...history};
} else {
// restore the history redoStack & undoStack unless the initial state was discard=false
setHistory((curHistory) => curHistory === historyRef.current ? curHistory : { ...historyRef.current, current: curHistory.current });
}
}, [discard]);
return (<HistoryPlugin history={history} />);
} |
Honestly, not sure I follow you here. That snippet is not accomplishing the goal of this PR. Also, it should probably trigger an infinite loop once you pass The problem is that there is no way to intercept editor changes when |
@@ -244,7 +248,7 @@ function createMergeActionGetter( | |||
|
|||
// If applying changes from history stack there's no need | |||
// to run history logic again, as history entries already calculated | |||
if (tags.has('historic')) { | |||
if (options.discardHistory || tags.has('historic')) { | |||
prevChangeType = OTHER; | |||
prevChangeTime = changeTime; | |||
return DISCARD_HISTORY_CANDIDATE; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Got the discardHistory
name from here.
Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks! |
Currently the only way to discard history is via the
historic
tag. One problem with this approach is that sometimes you do not have control over the update being sent to the editor, thus making it impossible to append anytags
to the change.My proposal is to allow a
discardHistory
option to be passed toregisterHistory
which allows a more dynamic way to prevent history from being pushed.Example below:
https://github.com/facebook/lexical/assets/27902567/1cacdc9a-0dec-4244-80c5-9f2c30361e4e