-
Notifications
You must be signed in to change notification settings - Fork 0
Main #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Main #11
Conversation
chore: added github action
chore: added github action
chore: added github action
Added pages deploy
uploaded artifact
uploaded artifact
renamed artifact
Feature/add custom controls
Feature/caching improvements
Feature/translationtions
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This pull request represents a significant refactoring and enhancement of the string art generation project. The main changes include restructuring the frontend to use React with Redux state management and Material-UI components, while also refactoring the Rust backend with improved architecture and modularity.
- Complete frontend rewrite using React, Redux, and Material-UI with a stepper interface
- Rust backend refactoring with better separation of concerns and modular architecture
- Addition of internationalization support and configuration improvements
Reviewed Changes
Copilot reviewed 68 out of 95 changed files in this pull request and generated 6 comments.
| File | Description |
|---|---|
| string-art-website/* | New React frontend with Redux state management and Material-UI components |
| StringArtRustImpl/src/* | Refactored Rust backend with traits, factories, and modular architecture |
| build-wasm.sh | Updated build script to target the new frontend directory |
| .github/workflows/build.yml | Modified CI/CD pipeline for the new project structure |
Files not reviewed (1)
- string-art-website/package-lock.json: Language not supported
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| import i18n from './i18n.tsx'; | ||
|
|
||
| (async () => { | ||
| await i18n.init (); |
Copilot
AI
Sep 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove the extra space before the parentheses. Should be i18n.init() instead of i18n.init ().
| await i18n.init (); | |
| await i18n.init(); |
| settings: StringArtConfig; | ||
| } | ||
|
|
||
| interface StrinArtThunkProperties { imageData: Uint8Array; settings: StringArtConfig; } |
Copilot
AI
Sep 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix the typo in the interface name. Should be StringArtThunkProperties instead of StrinArtThunkProperties.
| </div> | ||
| </div> | ||
|
|
||
| <div className="canvas-wrapper"> |
Copilot
AI
Sep 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The CSS class canvas-wrapper is referenced but not defined in the imported CSS module. It should be className={style['canvas-wrapper']} to use the CSS module.
| <div className="canvas-wrapper"> | |
| <div className={style['canvas-wrapper']}> |
| let inited = false; | ||
| init().then(() => { | ||
| inited = true; | ||
| }); | ||
|
|
||
| self.onmessage = async (event: MessageEvent<WorkerMessage>) => { | ||
| const { imageData, config } = event.data; | ||
| if (!inited) { | ||
| throw new Error("WASM module not initialized"); | ||
| } | ||
|
|
Copilot
AI
Sep 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This check is race condition prone. The worker might receive a message before the WASM module finishes initializing. Consider awaiting the initialization promise instead of using a boolean flag.
| match path { | ||
| Ok(path) => { | ||
| console::log_1(&format!("✅ WASM: Path generation complete with {} nails", path.len()).into()); | ||
| // Store the current path | ||
| Ok(path) | ||
| } | ||
| Err(e) => { | ||
| console::log_1(&format!("❌ WASM: Path generation failed: {}", e).into()); | ||
| Err(e) | ||
| } | ||
| } | ||
| } |
Copilot
AI
Sep 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This match expression is unnecessary. You can directly return the path result instead of matching and re-wrapping it.
| match path { | |
| Ok(path) => { | |
| console::log_1(&format!("✅ WASM: Path generation complete with {} nails", path.len()).into()); | |
| // Store the current path | |
| Ok(path) | |
| } | |
| Err(e) => { | |
| console::log_1(&format!("❌ WASM: Path generation failed: {}", e).into()); | |
| Err(e) | |
| } | |
| } | |
| } | |
| path | |
| .inspect(|path| { | |
| console::log_1(&format!("✅ WASM: Path generation complete with {} nails", path.len()).into()); | |
| }) | |
| .inspect_err(|e| { | |
| console::log_1(&format!("❌ WASM: Path generation failed: {}", e).into()); | |
| }) | |
| } | |
| } |
| export type StringArtConfig = Pick<WasmStringArtConfig, keyof { | ||
| num_nails: number; | ||
| image_size: number; | ||
| preserve_eyes: boolean; | ||
| preserve_negative_space: boolean; | ||
| negative_space_penalty: number; | ||
| negative_space_threshold: number; | ||
| }> & { | ||
| max_lines: number, | ||
| line_darkness: number, | ||
| min_improvement_score: number, | ||
| progress_frequency: number, |
Copilot
AI
Sep 18, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] This type definition is complex and fragile. Consider defining a proper interface instead of using Pick with a keyof trick, which makes the code harder to understand and maintain.
| export type StringArtConfig = Pick<WasmStringArtConfig, keyof { | |
| num_nails: number; | |
| image_size: number; | |
| preserve_eyes: boolean; | |
| preserve_negative_space: boolean; | |
| negative_space_penalty: number; | |
| negative_space_threshold: number; | |
| }> & { | |
| max_lines: number, | |
| line_darkness: number, | |
| min_improvement_score: number, | |
| progress_frequency: number, | |
| export interface StringArtConfig { | |
| num_nails: number; | |
| image_size: number; | |
| preserve_eyes: boolean; | |
| preserve_negative_space: boolean; | |
| negative_space_penalty: number; | |
| negative_space_threshold: number; | |
| max_lines: number; | |
| line_darkness: number; | |
| min_improvement_score: number; | |
| progress_frequency: number; |
No description provided.