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
Mount and unmount Content Script UI with MutationObserver #537
Comments
You'll want to use the awaited element as the Something like this would work. I typed this up in github comments, so it probably isn't valid JS, and I haven't tested it. But hopefully it gives you a better idea of what you're looking for. let anchor;
const ui = createIntegratedUi(ctx, {
position: "inline",
anchor: () => anchor,
append: (anchor, root) => anchor.insertAdjacentElement("afterend", root),
onMount: async (container) => {
const root = ReactDOM.createRoot(container);
root.render(<Toolbar />);
return root;
},
onRemove: (root) => {
root.unmount();
},
});
watchDomChanges(ctx, '[class^="ToolbarContainer__StyledHeader"]', {
onAdd: (newAnchor) => {
anchor = newAnchor;
ui.mount();
},
onRemove: () => {
ui.remove();
},
}); function watchDomChanges(ctx, selector, callbacks) {
const addMountListener = () => {
const observer = new MutationObserver((mutations) => {
const el = document.querySelector(selector)
if (el) {
observer.disconnect();
unwatchCtx();
callbacks.onAdd(el);
addRemoveListener(el);
}
});
const unwatchCtx = ctx.onInvalidated(observer.disconnect);
observer.observe(document.body, {
childList: true,
subtree: true,
});
};
const addRemoveListener = (el) => {
const observer = new MutationObserver((mutations) => {
if (mutations[0].removedNodes.includes(el)) {
observer.disconnect();
unwatchCtx();
callbacks.onRemoved();
addMountListener();
}
});
const unwatchCtx = ctx.onInvalidated(observer.disconnect);
observer.observe(el);
};
const initialEl = document.querySelector(selector);
if (initialEl) {
callbacks.onAdd(initialEl);
addRemoveListener(initialEl);
} else {
addMountListener();
}
} |
@hexpl0it If you get something that works, I'd like to add auto-mounting/unmounting to WXT, if you would like to contribute your implementation. |
Thank you very much for this issue. I have recently encountered a similar problem. |
For my extension I need to mount my app immediately after a precise div. However, this div is not immediately available when the page is loaded.
To do this I used MutationObserver:
However, this div can be removed following certain actions on the page. I would need to reassemble my component as soon as this div reappears. How can I do this?
The text was updated successfully, but these errors were encountered: