diff --git a/plugins/Commands/settings.tsx b/plugins/Commands/settings.tsx index c3292d4..20a3be7 100644 --- a/plugins/Commands/settings.tsx +++ b/plugins/Commands/settings.tsx @@ -127,8 +127,10 @@ function Header() { ); } -// Facts Commands Settings Page +// Facts Commands Settings Page - FIXED with proper storage proxy function FactsSettingsPage({ forceRerender }: { forceRerender: () => void }) { + useProxy(storage); // Add storage proxy to this page + const styles = stylesheet.createThemedStyleSheet({ container: { flex: 1, @@ -136,6 +138,17 @@ function FactsSettingsPage({ forceRerender }: { forceRerender: () => void }) { }, }); + const handleToggle = (key: string, value: boolean) => { + storage.enabledCommands[key] = value; + storage.pendingRestart = true; + forceRerender(); // Force parent to rerender + }; + + const handleSettingToggle = (setting: string, value: boolean) => { + storage.factSettings[setting] = value; + forceRerender(); // Force parent to rerender + }; + return ( @@ -145,20 +158,14 @@ function FactsSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Send facts as a reply to the command message" leading={} value={storage.factSettings?.sendAsReply ?? true} - onValueChange={(v: boolean) => { - storage.factSettings.sendAsReply = v; - forceRerender(); - }} + onValueChange={(v: boolean) => handleSettingToggle("sendAsReply", v)} /> } value={storage.factSettings?.includeCitation ?? false} - onValueChange={(v: boolean) => { - storage.factSettings.includeCitation = v; - forceRerender(); - }} + onValueChange={(v: boolean) => handleSettingToggle("includeCitation", v)} /> @@ -168,33 +175,21 @@ function FactsSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Get random cat facts" leading={} value={storage.enabledCommands?.catfact ?? true} - onValueChange={(v) => { - storage.enabledCommands.catfact = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("catfact", v)} /> } value={storage.enabledCommands?.dogfact ?? true} - onValueChange={(v) => { - storage.enabledCommands.dogfact = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("dogfact", v)} /> } value={storage.enabledCommands?.useless ?? true} - onValueChange={(v) => { - storage.enabledCommands.useless = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("useless", v)} /> @@ -202,8 +197,12 @@ function FactsSettingsPage({ forceRerender }: { forceRerender: () => void }) { ); } +// COMPLETELY FIXED Gary API Settings Page function GaryAPIPage({ forceRerender }: { forceRerender: () => void }) { - useProxy(storage); + useProxy(storage); // Storage proxy for reactivity + + // Force component re-render when storage changes + const [, localForceRerender] = React.useReducer((x) => x + 1, 0); const styles = stylesheet.createThemedStyleSheet({ container: { @@ -314,7 +313,21 @@ function GaryAPIPage({ forceRerender }: { forceRerender: () => void }) { const handleOptionPress = (value: string) => { console.log(`[Gary Settings] Changing API from ${currentSource} to ${value}`); + + // Update storage directly storage.garySettings.imageSource = value; + + // Force both local and parent re-renders + localForceRerender(); + forceRerender(); + + console.log(`[Gary Settings] Updated to: ${storage.garySettings.imageSource}`); + }; + + const handleGaryToggle = (value: boolean) => { + storage.enabledCommands.gary = value; + storage.pendingRestart = true; + localForceRerender(); forceRerender(); }; @@ -374,11 +387,7 @@ function GaryAPIPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Send random Gary images to channel" leading={} value={storage.enabledCommands?.gary ?? true} - onValueChange={(v) => { - storage.enabledCommands.gary = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={handleGaryToggle} /> @@ -410,8 +419,10 @@ function GaryAPIPage({ forceRerender }: { forceRerender: () => void }) { ); } -// List Commands Settings Page +// List Commands Settings Page - FIXED with proper storage proxy function ListSettingsPage({ forceRerender }: { forceRerender: () => void }) { + useProxy(storage); // Add storage proxy + const styles = stylesheet.createThemedStyleSheet({ container: { flex: 1, @@ -419,6 +430,17 @@ function ListSettingsPage({ forceRerender }: { forceRerender: () => void }) { }, }); + const handleToggle = (key: string, value: boolean) => { + storage.enabledCommands[key] = value; + storage.pendingRestart = true; + forceRerender(); // Force parent to rerender + }; + + const handleSettingToggle = (setting: string, value: boolean) => { + storage.listSettings[setting] = value; + forceRerender(); // Force parent to rerender + }; + return ( @@ -428,20 +450,14 @@ function ListSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Always use detailed mode when listing plugins" leading={} value={storage.listSettings?.pluginListAlwaysDetailed ?? false} - onValueChange={(v: boolean) => { - storage.listSettings.pluginListAlwaysDetailed = v; - forceRerender(); - }} + onValueChange={(v: boolean) => handleSettingToggle("pluginListAlwaysDetailed", v)} /> } value={storage.listSettings?.themeListAlwaysDetailed ?? false} - onValueChange={(v: boolean) => { - storage.listSettings.themeListAlwaysDetailed = v; - forceRerender(); - }} + onValueChange={(v: boolean) => handleSettingToggle("themeListAlwaysDetailed", v)} /> @@ -451,22 +467,14 @@ function ListSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="List all installed plugins" leading={} value={storage.enabledCommands?.pluginList ?? true} - onValueChange={(v) => { - storage.enabledCommands.pluginList = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("pluginList", v)} /> } value={storage.enabledCommands?.themeList ?? true} - onValueChange={(v) => { - storage.enabledCommands.themeList = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("themeList", v)} /> @@ -474,8 +482,10 @@ function ListSettingsPage({ forceRerender }: { forceRerender: () => void }) { ); } -// Image Commands Settings Page +// Image Commands Settings Page - FIXED with proper storage proxy function ImageSettingsPage({ forceRerender }: { forceRerender: () => void }) { + useProxy(storage); // Add storage proxy + const styles = stylesheet.createThemedStyleSheet({ container: { flex: 1, @@ -483,20 +493,22 @@ function ImageSettingsPage({ forceRerender }: { forceRerender: () => void }) { }, }); + const handleToggle = (key: string, value: boolean) => { + storage.enabledCommands[key] = value; + storage.pendingRestart = true; + forceRerender(); // Force parent to rerender + }; + return ( - + } value={storage.enabledCommands?.petpet ?? true} - onValueChange={(v) => { - storage.enabledCommands.petpet = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("petpet", v)} /> @@ -506,22 +518,14 @@ function ImageSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Get random image from KonoChan (private)" leading={} value={storage.enabledCommands?.konoself ?? true} - onValueChange={(v) => { - storage.enabledCommands.konoself = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("konoself", v)} /> } value={storage.enabledCommands?.konosend ?? true} - onValueChange={(v) => { - storage.enabledCommands.konosend = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("konosend", v)} /> @@ -529,8 +533,10 @@ function ImageSettingsPage({ forceRerender }: { forceRerender: () => void }) { ); } -// Spotify Commands Settings Page +// Spotify Commands Settings Page - FIXED with proper storage proxy function SpotifySettingsPage({ forceRerender }: { forceRerender: () => void }) { + useProxy(storage); // Add storage proxy + const styles = stylesheet.createThemedStyleSheet({ container: { flex: 1, @@ -544,6 +550,12 @@ function SpotifySettingsPage({ forceRerender }: { forceRerender: () => void }) { }, }); + const handleToggle = (key: string, value: boolean) => { + storage.enabledCommands[key] = value; + storage.pendingRestart = true; + forceRerender(); // Force parent to rerender + }; + return ( @@ -553,44 +565,28 @@ function SpotifySettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Share your current Spotify track" leading={} value={storage.enabledCommands?.spotifyTrack ?? true} - onValueChange={(v) => { - storage.enabledCommands.spotifyTrack = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("spotifyTrack", v)} /> } value={storage.enabledCommands?.spotifyAlbum ?? true} - onValueChange={(v) => { - storage.enabledCommands.spotifyAlbum = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("spotifyAlbum", v)} /> } value={storage.enabledCommands?.spotifyArtists ?? true} - onValueChange={(v) => { - storage.enabledCommands.spotifyArtists = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("spotifyArtists", v)} /> } value={storage.enabledCommands?.spotifyCover ?? true} - onValueChange={(v) => { - storage.enabledCommands.spotifyCover = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("spotifyCover", v)} /> @@ -604,8 +600,10 @@ function SpotifySettingsPage({ forceRerender }: { forceRerender: () => void }) { ); } -// Other Commands Settings Page +// Other Commands Settings Page - FIXED with proper storage proxy function OtherSettingsPage({ forceRerender }: { forceRerender: () => void }) { + useProxy(storage); // Add storage proxy + const styles = stylesheet.createThemedStyleSheet({ container: { flex: 1, @@ -613,6 +611,12 @@ function OtherSettingsPage({ forceRerender }: { forceRerender: () => void }) { }, }); + const handleToggle = (key: string, value: boolean) => { + storage.enabledCommands[key] = value; + storage.pendingRestart = true; + forceRerender(); // Force parent to rerender + }; + return ( @@ -622,11 +626,7 @@ function OtherSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Get the first message in a channel" leading={} value={storage.enabledCommands?.firstmessage ?? true} - onValueChange={(v) => { - storage.enabledCommands.firstmessage = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("firstmessage", v)} /> @@ -636,11 +636,7 @@ function OtherSettingsPage({ forceRerender }: { forceRerender: () => void }) { subLabel="Display system information" leading={} value={storage.enabledCommands?.sysinfo ?? true} - onValueChange={(v) => { - storage.enabledCommands.sysinfo = v; - storage.pendingRestart = true; - forceRerender(); - }} + onValueChange={(v) => handleToggle("sysinfo", v)} /> @@ -648,6 +644,7 @@ function OtherSettingsPage({ forceRerender }: { forceRerender: () => void }) { ); } +// Credits Page with proper spacing and correct GitHub links function CreditsPage() { const styles = stylesheet.createThemedStyleSheet({ container: { @@ -771,7 +768,8 @@ function CreditsPage() { - Thanks to all this developers for creating this amazing commands!{'\n'} + Thanks to all the amazing developers who contributed to this plugin collection!{'\n'} + Tap on any contributor to visit their GitHub profile. @@ -798,6 +796,8 @@ function CreditsPage() { Commands Plugin Collection{'\n'} Version 1.0.0{'\n'} + Built on 2025-10-01{'\n'} + Made with ❤️ for the community @@ -850,9 +850,9 @@ if (!storage.pendingRestart) { storage.pendingRestart = false; } -// Main Settings Component +// Main Settings Component - ENHANCED with better reactivity export default function Settings() { - useProxy(storage); + useProxy(storage); // Main storage proxy const [rerender, forceRerender] = React.useReducer((x) => x + 1, 0); const navigation = NavigationNative.useNavigation(); @@ -948,7 +948,7 @@ export default function Settings() { } trailing={} onPress={() => navigateToPage("Credits", CreditsPage)}