-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGate.tsx
37 lines (31 loc) · 1.1 KB
/
Gate.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import React, { useCallback, useEffect } from "react";
import { NodeProps } from "react-flow-renderer";
import Node from "components/Node";
import useConstantSourceNode from "hooks/nodes/useConstantSourceNode";
function Gate({ data, id, type }: NodeProps) {
const { isOn = false, onChange } = data;
// AudioNode
const node = useConstantSourceNode(id, {});
// AudioParam
useEffect(() => void node.offset.setTargetAtTime(isOn ? 1 : 0, node.context.currentTime, 0.015), [node, isOn]);
const toggleOn = useCallback(
(e: React.MouseEvent | React.KeyboardEvent) => {
if ("repeat" in e && e.repeat) {
return;
}
onChange({ isOn: true });
},
[onChange]
);
const toggleOff = useCallback(() => onChange({ isOn: false }), [onChange]);
return (
<Node id={id} outputs={["output"]} title="Gate" type={type}>
<div className="customNode_item">
<button onMouseDown={toggleOn} onMouseUp={toggleOff} onKeyDown={toggleOn} onKeyUp={toggleOff}>
trigger {isOn ? "off" : "on"}
</button>
</div>
</Node>
);
}
export default React.memo(Gate);