Skip to content
Snippets Groups Projects
Verified Commit 3cf9fed8 authored by João Magalhães's avatar João Magalhães :rocket:
Browse files

feat: new unregister of events

parent 3e45b715
No related branches found
No related tags found
1 merge request!9Version 0.4.0 🍾
Pipeline #1412 passed
...@@ -45,6 +45,14 @@ export class Observable { ...@@ -45,6 +45,14 @@ export class Observable {
this.events[event] = callbacks; this.events[event] = callbacks;
} }
unbind(event: string, callback: Callback<this>) {
const callbacks = this.events[event] ?? [];
if (!callbacks.includes(callback)) return;
const index = callbacks.indexOf(callback);
callbacks.splice(index, 1);
this.events[event] = callbacks;
}
trigger(event: string, params?: Record<string, any>) { trigger(event: string, params?: Record<string, any>) {
const callbacks = this.events[event] ?? []; const callbacks = this.events[event] ?? [];
callbacks.forEach((c) => c(this, params)); callbacks.forEach((c) => c(this, params));
...@@ -67,6 +75,7 @@ export type BenchmarkResult = { ...@@ -67,6 +75,7 @@ export type BenchmarkResult = {
export interface ObservableI { export interface ObservableI {
bind(event: string, callback: Callback<this>): void; bind(event: string, callback: Callback<this>): void;
unbind(event: string, callback: Callback<this>): void;
trigger(event: string): void; trigger(event: string): void;
} }
...@@ -237,7 +246,7 @@ export const App: FC<AppProps> = ({ emulator, backgrounds = ["264653"] }) => { ...@@ -237,7 +246,7 @@ export const App: FC<AppProps> = ({ emulator, backgrounds = ["264653"] }) => {
} }
}, [keyaction]); }, [keyaction]);
useEffect(() => { useEffect(() => {
document.addEventListener("keydown", (event) => { const onKeyDown = (event: KeyboardEvent) => {
if (event.key === "Escape") { if (event.key === "Escape") {
setKeyaction("Escape"); setKeyaction("Escape");
event.stopPropagation(); event.stopPropagation();
...@@ -248,14 +257,25 @@ export const App: FC<AppProps> = ({ emulator, backgrounds = ["264653"] }) => { ...@@ -248,14 +257,25 @@ export const App: FC<AppProps> = ({ emulator, backgrounds = ["264653"] }) => {
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
} }
}); };
emulator.bind("booted", () => { const onBooted = () => {
const romInfo = emulator.getRomInfo(); const romInfo = emulator.getRomInfo();
setRomInfo(romInfo); setRomInfo(romInfo);
}); };
emulator.bind("message", (_, params = {}) => { const onMessage = (
emulator: Emulator,
params: Record<string, any> = {}
) => {
showToast(params.text, params.error, params.timeout); showToast(params.text, params.error, params.timeout);
}); };
document.addEventListener("keydown", onKeyDown);
emulator.bind("booted", onBooted);
emulator.bind("message", onMessage);
return () => {
document.removeEventListener("keydown", onKeyDown);
emulator.unbind("booted", onBooted);
emulator.unbind("message", onMessage);
};
}, []); }, []);
const getPauseText = () => (paused ? "Resume" : "Pause"); const getPauseText = () => (paused ? "Resume" : "Pause");
......
...@@ -25,11 +25,15 @@ export const Modal: FC<ModalProps> = ({ ...@@ -25,11 +25,15 @@ export const Modal: FC<ModalProps> = ({
const classes = () => const classes = () =>
["modal", visible ? "visible" : "", ...style].join(" "); ["modal", visible ? "visible" : "", ...style].join(" ");
useEffect(() => { useEffect(() => {
document.addEventListener("keydown", (event) => { const onKeyDown = (event: KeyboardEvent) => {
if (event.key === "Escape") { if (event.key === "Escape") {
onCancel && onCancel(); onCancel && onCancel();
} }
}); };
document.addEventListener("keydown", onKeyDown);
return () => {
document.removeEventListener("keydown", onKeyDown);
};
}, []); }, []);
const getTextHtml = (separator = /\n/g) => ({ const getTextHtml = (separator = /\n/g) => ({
__html: text.replace(separator, "<br/>") __html: text.replace(separator, "<br/>")
......
...@@ -15,7 +15,7 @@ export const Overlay: FC<OverlayProps> = ({ text, style = [], onFile }) => { ...@@ -15,7 +15,7 @@ export const Overlay: FC<OverlayProps> = ({ text, style = [], onFile }) => {
const classes = () => const classes = () =>
["overlay", visible ? "visible" : "", ...style].join(" "); ["overlay", visible ? "visible" : "", ...style].join(" ");
useEffect(() => { useEffect(() => {
document.addEventListener("drop", async (event) => { const onDrop = async (event: DragEvent) => {
if ( if (
!event.dataTransfer!.files || !event.dataTransfer!.files ||
event.dataTransfer!.files.length === 0 event.dataTransfer!.files.length === 0
...@@ -30,25 +30,37 @@ export const Overlay: FC<OverlayProps> = ({ text, style = [], onFile }) => { ...@@ -30,25 +30,37 @@ export const Overlay: FC<OverlayProps> = ({ text, style = [], onFile }) => {
const file = event.dataTransfer!.files[0]; const file = event.dataTransfer!.files[0];
onFile && onFile(file); onFile && onFile(file);
}); };
document.addEventListener("dragover", async (event) => { const onDragOver = async (event: DragEvent) => {
if (!event.dataTransfer!.items || event.dataTransfer!.items[0].type) if (!event.dataTransfer!.items || event.dataTransfer!.items[0].type)
return; return;
event.preventDefault(); event.preventDefault();
setVisible(true); setVisible(true);
}); };
document.addEventListener("dragenter", async (event) => { const onDragEnter = async (event: DragEvent) => {
if (!event.dataTransfer!.items || event.dataTransfer!.items[0].type) if (!event.dataTransfer!.items || event.dataTransfer!.items[0].type)
return; return;
setVisible(true); setVisible(true);
}); };
document.addEventListener("dragleave", async (event) => { const onDragLeave = async (event: DragEvent) => {
if (!event.dataTransfer!.items || event.dataTransfer!.items[0].type) if (
return; !event.dataTransfer!.items ||
event.dataTransfer!.items[0].type
) {
}
return;
setVisible(false); setVisible(false);
}); };
document.addEventListener("drop", onDrop);
document.addEventListener("dragover", onDragOver);
document.addEventListener("dragenter", onDragEnter);
document.addEventListener("dragleave", onDragLeave);
return () => {
document.removeEventListener("drop", onDrop);
document.removeEventListener("dragover", onDragOver);
document.removeEventListener("dragenter", onDragEnter);
document.removeEventListener("dragleave", onDragLeave);
};
}, []); }, []);
return ( return (
<div className={classes()}> <div className={classes()}>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment