From 1930190c8d859ebe16d5587b51708ccaaa2605d4 Mon Sep 17 00:00:00 2001 From: 230419 <230419@epvc.pt> Date: Wed, 3 Jun 2026 16:55:01 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20atalhos=20de=20navega=C3=A7=C3=A3o=20Q/?= =?UTF-8?q?E=20e=20corre=C3=A7=C3=B5es=20no=20i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- add_shortcuts.cjs | 118 ++++ dist/assets/index-DFJLltIj.css | 1 + .../{index-xEo-fC2P.js => index-SfxBfoF_.js} | 606 +++++++++--------- dist/assets/index-olys378F.css | 1 - dist/index.html | 4 +- fix_i18n.cjs | 41 ++ fix_i18n_all.cjs | 10 + src/App.jsx | 76 ++- src/lib/i18n.js | 50 ++ translate_app.cjs | 107 ++++ 10 files changed, 700 insertions(+), 314 deletions(-) create mode 100644 add_shortcuts.cjs create mode 100644 dist/assets/index-DFJLltIj.css rename dist/assets/{index-xEo-fC2P.js => index-SfxBfoF_.js} (51%) delete mode 100644 dist/assets/index-olys378F.css create mode 100644 fix_i18n.cjs create mode 100644 fix_i18n_all.cjs create mode 100644 translate_app.cjs diff --git a/add_shortcuts.cjs b/add_shortcuts.cjs new file mode 100644 index 0000000..32696fd --- /dev/null +++ b/add_shortcuts.cjs @@ -0,0 +1,118 @@ +const fs = require('fs'); + +let content = fs.readFileSync('src/App.jsx', 'utf8'); + +// 1. State +content = content.replace( + /const \[isPrivate, setIsPrivate\] = useState\(false\);/, + `const [isPrivate, setIsPrivate] = useState(false);\n const [shortcutsEnabled, setShortcutsEnabled] = useState(false);` +); + +// 2. Toggle and Nav handle +const toggleInsert = ` + const handlePrivacyToggle = (newVal) => { + setIsPrivate(newVal); + saveUserSetting('isPrivate', newVal); + }; + + const handleShortcutsToggle = (newVal) => { + setShortcutsEnabled(newVal); + saveUserSetting('shortcutsEnabled', newVal); + }; + + const handleNavShortcut = (direction) => { + const navItems = ['dashboard', 'closet', 'wishlist', 'laundry', 'outfits', 'planner', 'community', 'settings']; + const currentIndex = navItems.indexOf(view); + if (currentIndex === -1) return; + + let nextIndex; + if (direction === 'up') { + nextIndex = currentIndex === 0 ? navItems.length - 1 : currentIndex - 1; + } else { + nextIndex = currentIndex === navItems.length - 1 ? 0 : currentIndex + 1; + } + setView(navItems[nextIndex]); + if (window.innerWidth < 768) setSidebarOpen(false); + }; +`; + +content = content.replace( + /const handlePrivacyToggle = \(newVal\) => \{[\s\S]*?saveUserSetting\('isPrivate', newVal\);\n \};/, + toggleInsert.trim() +); + +// 3. Load from Firebase +content = content.replace( + /if \(data\.settings\.isPrivate !== undefined\) setIsPrivate\(data\.settings\.isPrivate\);/, + `if (data.settings.isPrivate !== undefined) setIsPrivate(data.settings.isPrivate);\n if (data.settings.shortcutsEnabled !== undefined) setShortcutsEnabled(data.settings.shortcutsEnabled);` +); + +// 4. UseEffect +const useEffectInsert = ` + useEffect(() => { + if (!shortcutsEnabled) return; + + const handleKeyDown = (e) => { + if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return; + + if (e.key.toLowerCase() === 'q') { + handleNavShortcut('up'); + } else if (e.key.toLowerCase() === 'e') { + handleNavShortcut('down'); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [shortcutsEnabled, view]); + + useEffect(() => { + if (editingItem && editingItem.color) {`; + +content = content.replace( + /useEffect\(\(\) => \{\n if \(editingItem && editingItem\.color\) \{/, + useEffectInsert.trim() +); + +// 5. Settings UI +const settingsUI = ` +
+
+

Atalhos de Teclado

+

Ativar navegação com Q e E

+
+ +
+`; +content = content.replace( + /(
[\s\S]*?t\('lookReminders'\)}<\/p>[\s\S]*?<\/div>[\s\S]*?<\/button>[\s\S]*?<\/div>)/, + `$1\n${settingsUI}` +); + +// 6. Sidebar UI Top +const sidebarTop = ` + {shortcutsEnabled && ( + + )} +