Skip to content

Commit d3b2e4a

Browse files
chore: started creating a workflow
1 parent 8b3bc2a commit d3b2e4a

File tree

4 files changed

+60
-80
lines changed

4 files changed

+60
-80
lines changed

string-art-demo/src/App.tsx

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ import './App.css';
33
import {
44
type StringArtState
55
} from './features/shared/redux/stringArtSlice';
6-
import UploadScreen from './features/1Upload/UploadScreen';
76
import RenderImageScreen from './features/3RenderImage/RenderImageScreen';
8-
import CanvasScreen from './features/3RenderImage/CanvasScreen';
97

108
function App() {
119
const {
12-
imageData,
1310
isLoading,
1411
error,
1512
} = useSelector((state: { stringArt: StringArtState }) => state.stringArt);
@@ -41,17 +38,7 @@ function App() {
4138
<p>Upload an image and watch it transform into beautiful string art in real-time!</p>
4239
</header>
4340

44-
<main className="app-main">
45-
<div className="controls-section">
46-
<UploadScreen/>
47-
48-
{imageData && (
49-
<RenderImageScreen/>
50-
)}
51-
</div>
52-
53-
<CanvasScreen/>
54-
</main>
41+
<RenderImageScreen/>
5542
</div>
5643
);
5744
}

string-art-demo/src/features/3RenderImage/CanvasScreen.tsx

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,72 @@
11
import { useDispatch, useSelector } from "react-redux";
22
import type { AppDispatch } from "../shared/redux/store";
3-
import { generateStringArtThunk, type StringArtState } from "../shared/redux/stringArtSlice";
3+
import {
4+
generateStringArtThunk,
5+
type StringArtState,
6+
} from "../shared/redux/stringArtSlice";
47
import StringArtConfigSection from "./components/StringArtConfig/StringArtConfigSection";
8+
import UploadScreen from "../1Upload/UploadScreen";
9+
import { StringArtCanvas } from "./components/StringArtCanvas/StringArtCanvas";
510

611
export default function RenderImageScreen() {
712
const dispatch = useDispatch<AppDispatch>();
8-
const {
9-
imageData,
10-
isGenerating,
11-
progress,
12-
settings,
13-
} = useSelector((state: { stringArt: StringArtState }) => state.stringArt);
13+
const { imageData, isGenerating, progress, settings } = useSelector(
14+
(state: { stringArt: StringArtState }) => state.stringArt
15+
);
1416

1517
const handleStartGeneration = () => {
1618
if (!imageData) return;
17-
dispatch(
18-
generateStringArtThunk({ imageData, settings })
19-
);
19+
dispatch(generateStringArtThunk({ imageData, settings }));
2020
};
2121

2222
return (
23-
<div className="generation-controls">
24-
<StringArtConfigSection key={"stringArt"} />
23+
<main className="app-main">
24+
<div className="controls-section">
25+
<UploadScreen />
2526

26-
<button
27-
onClick={handleStartGeneration}
28-
disabled={isGenerating}
29-
className="generate-button"
30-
>
31-
{isGenerating ? "Generating..." : "Generate String Art"}
32-
</button>
27+
{imageData && (
28+
<div className="generation-controls">
29+
<StringArtConfigSection key={"stringArt"} />
3330

34-
{progress && (
35-
<div className="progress-section">
36-
<div className="progress-header">
37-
<span>Progress: {progress.completion_percent.toFixed(1)}%</span>
38-
<span>
39-
Lines: {progress.lines_completed}/{progress.total_lines}
40-
</span>
41-
</div>
42-
<div className="progress-bar">
43-
<div
44-
className="progress-fill"
45-
style={{ width: `${progress.completion_percent}%` }}
46-
></div>
31+
<button
32+
onClick={handleStartGeneration}
33+
disabled={isGenerating}
34+
className="generate-button"
35+
>
36+
{isGenerating ? "Generating..." : "Generate String Art"}
37+
</button>
38+
39+
{progress && (
40+
<div className="progress-section">
41+
<div className="progress-header">
42+
<span>
43+
Progress: {progress.completion_percent.toFixed(1)}%
44+
</span>
45+
<span>
46+
Lines: {progress.lines_completed}/{progress.total_lines}
47+
</span>
48+
</div>
49+
<div className="progress-bar">
50+
<div
51+
className="progress-fill"
52+
style={{ width: `${progress.completion_percent}%` }}
53+
></div>
54+
</div>
55+
<div className="progress-details">
56+
<span>Score: {progress.score.toFixed(1)}</span>
57+
</div>
58+
</div>
59+
)}
4760
</div>
48-
<div className="progress-details">
49-
<span>Score: {progress.score.toFixed(1)}</span>
61+
)}
62+
</div>
63+
64+
<div className="canvas-section">
65+
<StringArtCanvas
66+
width={500}
67+
height={500}
68+
/>
5069
</div>
51-
</div>
52-
)}
53-
</div>
70+
</main>
5471
);
5572
}

string-art-demo/src/features/3RenderImage/components/StringArtCanvas/StringArtCanvas.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
import React, { useRef, useEffect, useState } from 'react';
22
import style from './style.module.css'
3+
import type { StringArtState } from '../../../shared/redux/stringArtSlice';
4+
import { useSelector } from 'react-redux';
35

46
interface StringArtCanvasProps {
57
width: number;
68
height: number;
7-
nailCoords: Array<[number, number]>;
8-
currentPath: number[];
9-
isAnimating: boolean;
10-
imageUrl?: string;
119
}
1210

1311
export const StringArtCanvas: React.FC<StringArtCanvasProps> = ({
1412
width,
1513
height,
16-
nailCoords,
17-
currentPath,
18-
isAnimating,
19-
imageUrl
2014
}) => {
15+
const { imageUrl, isGenerating: isAnimating, currentPath, nailCoords } = useSelector(
16+
(state: { stringArt: StringArtState }) => state.stringArt
17+
);
2118
const canvasRef = useRef<HTMLCanvasElement>(null);
2219
const [showOriginal, setShowOriginal] = useState(false);
2320

0 commit comments

Comments
 (0)