Skip to content

Commit 6217de2

Browse files
committed
refactor: Convert remaining visualizers from class to functional components
Converts Turing Machine, Prime Numbers, Recursion Tree, and Binary Search to use useState, useEffect, and useRef. Uses refs for values read inside async animation loops. Removes unused dead files (details.jsx, vertexOriginal.jsx). Cleans up console.logs and commented-out code.
1 parent 11039e8 commit 6217de2

22 files changed

Lines changed: 779 additions & 1325 deletions
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
import { Slider } from "@/components/ui/slider"
22

3-
// interface DualHandleSliderProps {
4-
// min?: number
5-
// max?: number
6-
// step?: number
7-
// defaultValue?: [number, number]
8-
// onValueChange?: (values: [number, number]) => void
9-
// className?: string
10-
// }
11-
12-
const DualHandleSlider = ({lower = 0, upper = 100, max = 100 }) => {
13-
console.log(lower, upper, max)
3+
const DualHandleSlider = ({ lower = 0, upper = 100, max = 100 }) => {
144
return (
155
<Slider
166
value={[lower, upper]}
@@ -22,4 +12,4 @@ const DualHandleSlider = ({lower = 0, upper = 100, max = 100 }) => {
2212
)
2313
}
2414

25-
export default DualHandleSlider;
15+
export default DualHandleSlider;
Lines changed: 24 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,29 @@
11
import { CustomInput } from '@/components/custom-input';
22
import { Button } from '@/components/ui/button';
3-
import { Component } from 'react';
43

4+
export default function EntryPoint({ startGame, upper, setUpper }) {
5+
const setData = (val) => {
6+
if (val === "") val = 0;
7+
setUpper(val);
8+
};
59

6-
class EntryPoint extends Component {
7-
state = {
8-
error: false
9-
}
10-
render() {
11-
return (
12-
<div className='flex flex-col items-center space-y-4'>
13-
<CustomInput
14-
title="Upper Number"
15-
defaultValue={100}
16-
type={"number"}
17-
onChange={this.setData}
18-
placeholder="Enter value..."
19-
/>
20-
<br /><br />
21-
<h1 className='text-3xl'>
22-
Guess a number between 0 and {this.props.upper}
23-
</h1>
24-
<br />
25-
<Button
26-
onClick={this.props.startGame}
27-
>
28-
Start the game
29-
</Button>
30-
</div>
31-
);
32-
}
33-
34-
setData = (val) => {
35-
if (val === "") {
36-
val = 0;
37-
}
38-
this.props.setUpper(val);
39-
}
40-
getData = (e) => {
41-
if (e.target.value !== "") {
42-
console.log(e.target.value);
43-
this.props.setUpper(e.target.value);
44-
}
45-
else {
46-
this.props.setUpper(100)
47-
}
48-
}
49-
validateNumbers = () => {
50-
51-
}
10+
return (
11+
<div className="flex flex-col items-center space-y-4">
12+
<CustomInput
13+
title="Upper Number"
14+
defaultValue={100}
15+
type="number"
16+
onChange={setData}
17+
placeholder="Enter value..."
18+
/>
19+
<br /><br />
20+
<h1 className="text-3xl">
21+
Guess a number between 0 and {upper}
22+
</h1>
23+
<br />
24+
<Button onClick={startGame}>
25+
Start the game
26+
</Button>
27+
</div>
28+
);
5229
}
53-
54-
export default EntryPoint;

src/app/binary-search/guess.jsx

Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,23 @@
11
import { Button } from '@/components/ui/button';
2-
import { Component } from 'react';
32
import DualHandleSlider from "./custom-dual-slider";
4-
class Guess extends Component {
5-
render() {
6-
return (
7-
<div >
8-
{/* <p>
9-
<Button className="btn btn-secondary btn-lg" type="button" data-toggle="collapse"
10-
data-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample">
11-
Toggle Range
12-
</Button>
13-
</p> */}
14-
{/* <div className="collapse" id="collapseExample"> */}
15-
<div className="card card-body">
16-
<center style={{ justifyContent: "center" }}>
17-
<DualHandleSlider
18-
upper={this.props.upper}
19-
lower={this.props.lower}
20-
max={this.props.max}
21-
/>
22-
</center>
23-
</div>
24-
{/* </div> */}
253

26-
<h1 className="text-3xl">
27-
Is you number greater than {this.getMid()}?
28-
</h1> <br />
29-
<Button
30-
onClick={this.props.yesButton}
31-
className="mx-2"
32-
>Yes</Button>
33-
<Button
34-
onClick={this.props.noButton}
35-
className="mx-2"
36-
>No</Button> <br />
4+
export default function Guess({ yesButton, noButton, upper, lower, max }) {
5+
const mid = Math.floor((upper + lower) / 2);
6+
7+
return (
8+
<div>
9+
<div className="card card-body">
10+
<center style={{ justifyContent: "center" }}>
11+
<DualHandleSlider upper={upper} lower={lower} max={max} />
12+
</center>
3713
</div>
38-
);
39-
}
40-
getMid = () => {
41-
const mid = Math.floor((this.props.upper + this.props.lower) / 2);
42-
return mid;
43-
}
14+
<h1 className="text-3xl">
15+
Is you number greater than {mid}?
16+
</h1>
17+
<br />
18+
<Button onClick={yesButton} className="mx-2">Yes</Button>
19+
<Button onClick={noButton} className="mx-2">No</Button>
20+
<br />
21+
</div>
22+
);
4423
}
45-
46-
export default Guess;

src/app/binary-search/page.jsx

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,65 @@
11
"use client";
2-
import React, { Component } from 'react';
2+
import { useState } from 'react';
33
import EntryPoint from "./entryPoint";
44
import Search from "./search";
55
import Navbar from '@/components/navbar';
66

7-
class BinarySearch extends Component {
8-
state = {
9-
upper: 100,
10-
lower: 0,
11-
max: 100,
12-
isRunning: false
13-
}
14-
render() {
15-
return (
16-
<div>
17-
<Navbar title={"Binary Search"} />
18-
<br />
19-
<br />
20-
<br />
21-
<center>
22-
{!this.state.isRunning &&
23-
<EntryPoint
24-
startGame={this.handleStartGame}
25-
upper={this.state.upper}
26-
setUpper={this.handleSetUpper}
27-
/>}
28-
{this.state.isRunning &&
29-
<Search
30-
yesButton={this.handleYes}
31-
noButton={this.handleNo}
32-
upper={this.state.upper}
33-
lower={this.state.lower}
34-
max={this.state.max}
35-
onRestart={this.handleRestart}
36-
/>
37-
}
38-
</center>
39-
</div>
40-
);
41-
}
42-
handleStartGame = () => {
43-
this.setState({ isRunning: true });
44-
}
45-
handleRestart = () => {
46-
this.setState({ isRunning: false, upper: 100, lower: 0 });
47-
}
48-
handleYes = () => {
49-
const mid = Math.floor((this.state.upper + this.state.lower) / 2);
50-
this.setState({ lower: mid + 1 });
51-
}
52-
handleNo = () => {
53-
const mid = Math.floor((this.state.upper + this.state.lower) / 2);
54-
this.setState({ upper: mid });
55-
}
56-
handleSetUpper = (up) => {
7+
export default function BinarySearch() {
8+
const [upper, setUpper] = useState(100);
9+
const [lower, setLower] = useState(0);
10+
const [max, setMax] = useState(100);
11+
const [isRunning, setIsRunning] = useState(false);
12+
13+
const handleStartGame = () => {
14+
setIsRunning(true);
15+
};
16+
17+
const handleRestart = () => {
18+
setIsRunning(false);
19+
setUpper(100);
20+
setLower(0);
21+
};
22+
23+
const handleYes = () => {
24+
const mid = Math.floor((upper + lower) / 2);
25+
setLower(mid + 1);
26+
};
27+
28+
const handleNo = () => {
29+
const mid = Math.floor((upper + lower) / 2);
30+
setUpper(mid);
31+
};
32+
33+
const handleSetUpper = (up) => {
5734
let val = parseInt(up);
58-
if (val <= 0) {
59-
val = 100;
60-
}
61-
this.setState({ upper: val, max: val });
62-
}
63-
}
35+
if (val <= 0) val = 100;
36+
setUpper(val);
37+
setMax(val);
38+
};
6439

65-
export default BinarySearch;
40+
return (
41+
<div>
42+
<Navbar />
43+
<br /><br /><br />
44+
<center>
45+
{!isRunning && (
46+
<EntryPoint
47+
startGame={handleStartGame}
48+
upper={upper}
49+
setUpper={handleSetUpper}
50+
/>
51+
)}
52+
{isRunning && (
53+
<Search
54+
yesButton={handleYes}
55+
noButton={handleNo}
56+
upper={upper}
57+
lower={lower}
58+
max={max}
59+
onRestart={handleRestart}
60+
/>
61+
)}
62+
</center>
63+
</div>
64+
);
65+
}

src/app/binary-search/result.jsx

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
11
import { Button } from '@/components/ui/button';
2-
import React, { Component } from 'react';
3-
class Result extends Component {
4-
render() {
5-
return (
6-
<div>
7-
<span className='text-3xl display-3'>
8-
Your number is {this.props.res}
9-
</span> <br />
10-
<Button
11-
className='btn btn-warning btn-lg'
12-
onClick={this.props.onRestart}
13-
>
14-
Restart
15-
</Button>
16-
</div>
17-
);
18-
}
19-
}
202

21-
export default Result;
3+
export default function Result({ res, onRestart }) {
4+
return (
5+
<div>
6+
<span className="text-3xl display-3">
7+
Your number is {res}
8+
</span>
9+
<br />
10+
<Button className="btn btn-warning btn-lg" onClick={onRestart}>
11+
Restart
12+
</Button>
13+
</div>
14+
);
15+
}

src/app/binary-search/search.jsx

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,21 @@
1-
import React, {Component} from 'react';
21
import Guess from "./guess";
32
import Result from "./result";
43

5-
class Search extends Component {
6-
render() {
7-
return (
8-
<div>
9-
{this.props.upper !== this.props.lower &&
4+
export default function Search({ yesButton, noButton, upper, lower, max, onRestart }) {
5+
return (
6+
<div>
7+
{upper !== lower && (
108
<Guess
11-
yesButton={this.props.yesButton}
12-
noButton={this.props.noButton}
13-
upper={this.props.upper}
14-
lower={this.props.lower}
15-
max={this.props.max}
9+
yesButton={yesButton}
10+
noButton={noButton}
11+
upper={upper}
12+
lower={lower}
13+
max={max}
1614
/>
17-
}
18-
{this.props.upper === this.props.lower &&
19-
<Result
20-
res={this.props.upper}
21-
onRestart={this.props.onRestart}
22-
/>
23-
}
24-
</div>
25-
);
26-
}
27-
15+
)}
16+
{upper === lower && (
17+
<Result res={upper} onRestart={onRestart} />
18+
)}
19+
</div>
20+
);
2821
}
29-
30-
export default Search;

0 commit comments

Comments
 (0)