Skip to content

Commit d716cc2

Browse files
committed
Click to pick items
1 parent d9a214d commit d716cc2

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

src/App.tsx

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,43 @@ import { Compare } from "./Compare";
66

77
function App() {
88
const [blobs, setBlobs] = useState<Blob[]>([]);
9+
const [picked, setPicked] = useState<Blob[]>([]);
10+
console.log({ blobs, picked });
911

1012
return (
1113
<>
1214
<h1>Audiovis</h1>
13-
<RecordAudio onCreated={(b) => setBlobs((prev) => [b, ...prev])} />
1415

15-
{blobs.length === 2 ? (
16-
<Compare a={blobs[0]} b={blobs[1]} />
16+
{picked.length === 2 ? (
17+
<>
18+
<h4>
19+
<button onClick={() => setPicked([])}>&larr;</button> Comparing
20+
</h4>
21+
22+
<Compare a={picked[0]} b={picked[1]} />
23+
</>
1724
) : (
18-
blobs.map((blob, i) => <Audiovis key={i} srcObject={blob} />)
25+
<>
26+
<RecordAudio onCreated={(b) => setBlobs((prev) => [b, ...prev])} />
27+
28+
{blobs.map((blob, i) => (
29+
<Audiovis
30+
key={i}
31+
srcObject={blob}
32+
picked={picked.includes(blob)}
33+
onPick={() => setPicked((prev) => toggle(prev, blob))}
34+
/>
35+
))}
36+
</>
1937
)}
2038
</>
2139
);
2240
}
2341

42+
function toggle<T>(list: T[], item: T): T[] {
43+
return list.includes(item)
44+
? list.filter((each) => each !== item)
45+
: [...list, item];
46+
}
47+
2448
export default App;

src/Audiovis.module.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@
77
align-items: center;
88

99
gap: 2em;
10+
padding: 0.5em;
11+
border-radius: 5px;
1012

1113
& audio,
1214
& canvas {
1315
width: 100%;
1416
max-height: 20em;
1517
}
1618
}
19+
20+
.picked {
21+
background-color: #fff1;
22+
}

src/Audiovis.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@ import styles from "./Audiovis.module.css";
33
import { useAudioCtx } from "./AudioCtxCtx";
44
import { spectrum, spectrumToImage } from "./util";
55

6-
export const Audiovis: FC<{ srcObject: Blob }> = ({ srcObject }) => {
6+
export const Audiovis: FC<{
7+
srcObject: Blob;
8+
picked: boolean;
9+
onPick: () => void;
10+
}> = ({ srcObject, picked, onPick }) => {
711
const url = useMemo(() => URL.createObjectURL(srcObject), [srcObject]);
812
const buffer = useAudioBuffer(srcObject);
913

1014
return (
11-
<section className={styles.container}>
15+
<section
16+
className={classes(styles.container, picked && styles.picked)}
17+
onClick={onPick}
18+
>
1219
<audio src={url} controls />
1320

1421
{buffer && <Waveform audio={buffer} />}
@@ -91,3 +98,7 @@ const Sonogram: FC<{ audio: AudioBuffer }> = ({ audio }) => {
9198

9299
return <canvas ref={canvas} className={styles.waveform} />;
93100
};
101+
102+
function classes(...list: (string | false)[]) {
103+
return list.filter(Boolean).join(" ");
104+
}

src/RecordAudio.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ const RecordAudio: FC<{ onCreated: (blob: Blob) => void }> = ({
2727
for (const track of stream.getTracks()) {
2828
track.stop();
2929
}
30-
}, 8000); // Stop recording after 5 seconds
30+
}, 5000); // Stop recording after 5 seconds
3131
};
3232

3333
return (
3434
<div>
3535
<button onClick={startRecording} disabled={isRecording}>
36-
{isRecording ? "Recording..." : "Start Recording"}
36+
{isRecording ? "Recording..." : "Add Recording"}
3737
</button>
3838
</div>
3939
);

0 commit comments

Comments
 (0)