Skip to content

Instantly share code, notes, and snippets.

@VanTanev
Last active September 27, 2024 11:15
Show Gist options
  • Save VanTanev/ab448f9ec128996f46bc2441b4001f8b to your computer and use it in GitHub Desktop.
Save VanTanev/ab448f9ec128996f46bc2441b4001f8b to your computer and use it in GitHub Desktop.
import React from 'react';
const App = () => {
return (
<div className="content">
<Header/>
{Array.from({ length: 1000 }, (_, i) => (
<Hoverable key={i} />
))}
</div>
);
};
function Header() {
const isCtrlPressed = useIsCtrlPressed();
return (<h1>Is Ctrl Pressed: {isCtrlPressed ? "Yes" : "No"}</h1>);
}
function Hoverable() {
const [isHovered, setIsHovered] = React.useState(false);
const isCtrlPressed = useIsCtrlPressed();
const isHoveredAndCtrlPressed = isHovered && isCtrlPressed;
const children = React.useMemo(() => {
return isHoveredAndCtrlPressed ? <Hovered /> : <NotHovered />;
}, [isHoveredAndCtrlPressed]);
return <div
style={{ padding: 10, border: "1px solid black" }}
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
>{children}</div>;
}
class CtrlStore {
private isCtrlPressed: boolean;
private listeners: Set<() => void>
constructor() {
this.isCtrlPressed = false;
this.listeners = new Set();
window.addEventListener("keydown", (e) => {
if (e.ctrlKey) {
this.isCtrlPressed = true;
this.listeners.forEach((listener) => listener());
}
})
window.addEventListener("keyup", (e) => {
this.isCtrlPressed = false;
this.listeners.forEach((listener) => listener());
})
}
subscribe = (listener: () => void) => {
this.listeners.add(listener);
return () => {
this.listeners.delete(listener);
};
}
getSnapshot = () => {
return this.isCtrlPressed;
}
}
const store = new CtrlStore();
function useIsCtrlPressed() {
return React.useSyncExternalStore(store.subscribe, store.getSnapshot);
}
function Hovered() {
return <div style={{ color: "green" }}>Yes</div>;
}
function NotHovered() {
return <div style={{ color: "red" }}>No</div>;
}
export default App;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment