diff --git a/src/main/index.ts b/src/main/index.ts index 78d2a5d..cd5bb9f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -97,8 +97,15 @@ function createWindow(): void { } app.on('ready', async () => { + if ( + process.env.NODE_ENV === 'development' && + (await getStorageValue('devMode')) === null + ) { + await setStorageValue('devMode', true) + } + log('Welcome!', 'GlanceThing') - if (isDev) log('Running in development mode', 'GlanceThing') + if (await isDev()) log('Running in development mode', 'GlanceThing') electronApp.setAppUserModelId('com.bludood.glancething') const adbPath = await getAdbExecutable().catch(err => ({ err })) @@ -285,8 +292,8 @@ async function setupIpcHandlers() { await updateApps() }) - ipcMain.handle(IPCHandler.IsDevMode, () => { - return isDev + ipcMain.handle(IPCHandler.IsDevMode, async () => { + return await isDev() }) ipcMain.handle(IPCHandler.SetSpotifyToken, async (_event, token) => { diff --git a/src/main/lib/utils.ts b/src/main/lib/utils.ts index ccb66aa..1888c23 100644 --- a/src/main/lib/utils.ts +++ b/src/main/lib/utils.ts @@ -1,7 +1,10 @@ import { exec } from 'child_process' import crypto from 'crypto' -export const isDev = process.env.NODE_ENV === 'development' +import { getStorageValue } from './storage.js' + +export const isDev = async () => + (await getStorageValue('devMode')) === true export const random = (len: number) => crypto.randomBytes(len).toString('hex') diff --git a/src/main/lib/webapp.ts b/src/main/lib/webapp.ts index 1fe056e..c22daa2 100644 --- a/src/main/lib/webapp.ts +++ b/src/main/lib/webapp.ts @@ -6,7 +6,10 @@ import fs from 'fs' import { execAsync, isDev, log } from './utils.js' export async function getWebAppDir() { - if (isDev && fs.existsSync(path.join(process.cwd(), 'client/dist'))) { + if ( + (await isDev()) && + fs.existsSync(path.join(process.cwd(), 'client/dist')) + ) { log('Using local client webapp', 'Client Webapp') return path.join(process.cwd(), 'client/dist') } diff --git a/src/renderer/src/components/Titlebar/Titlebar.tsx b/src/renderer/src/components/Titlebar/Titlebar.tsx index cc55489..fc475c1 100644 --- a/src/renderer/src/components/Titlebar/Titlebar.tsx +++ b/src/renderer/src/components/Titlebar/Titlebar.tsx @@ -1,6 +1,7 @@ -import React, { useContext, useEffect, useState } from 'react' +import React, { useContext } from 'react' import { useNavigate } from 'react-router-dom' +import { DevModeContext } from '@/contexts/DevModeContext.js' import { ModalContext } from '@/contexts/ModalContext.js' import styles from './Titlebar.module.css' @@ -9,8 +10,7 @@ const Titlebar: React.FC = () => { const navigate = useNavigate() const { setSettingsOpen, setShortcutsEditorOpen } = useContext(ModalContext) - - const [devMode, setDevMode] = useState(false) + const { devMode } = useContext(DevModeContext) const buttons = [ ...(devMode @@ -35,10 +35,6 @@ const Titlebar: React.FC = () => { } ] - useEffect(() => { - window.api.isDevMode().then(setDevMode) - }, []) - return (
diff --git a/src/renderer/src/contexts/DevModeContext.tsx b/src/renderer/src/contexts/DevModeContext.tsx new file mode 100644 index 0000000..23bb7c7 --- /dev/null +++ b/src/renderer/src/contexts/DevModeContext.tsx @@ -0,0 +1,51 @@ +import { createContext, useEffect, useState } from 'react' + +interface DevModeContextType { + devMode: boolean + checkDevMode: () => void + setDevMode: (devMode: boolean) => void +} + +const DevModeContext = createContext({ + devMode: false, + checkDevMode: () => {}, + setDevMode: () => {} +}) + +interface DevModeContextProviderProps { + children: React.ReactNode +} + +const DevModeContextProvider = ({ + children +}: DevModeContextProviderProps) => { + const [devMode, _setDevMode] = useState(false) + + async function checkDevMode() { + const isDev = await window.api.isDevMode() + _setDevMode(isDev) + } + + async function setDevMode(dev: boolean) { + await window.api.setStorageValue('devMode', dev) + await checkDevMode() + } + + useEffect(() => { + checkDevMode() + }, []) + + return ( + + {children} + + ) +} + +export { DevModeContext, DevModeContextProvider } diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx index 65933b3..c05eecc 100644 --- a/src/renderer/src/main.tsx +++ b/src/renderer/src/main.tsx @@ -2,6 +2,7 @@ import React from 'react' import ReactDOM from 'react-dom/client' import { MemoryRouter } from 'react-router-dom' +import { DevModeContextProvider } from './contexts/DevModeContext.js' import { ModalContextProvider } from './contexts/ModalContext.js' import App from './App' @@ -17,9 +18,11 @@ const root = ReactDOM.createRoot( root.render( - - - + + + + + ) diff --git a/src/renderer/src/pages/Settings/Settings.tsx b/src/renderer/src/pages/Settings/Settings.tsx index b612631..1002918 100644 --- a/src/renderer/src/pages/Settings/Settings.tsx +++ b/src/renderer/src/pages/Settings/Settings.tsx @@ -1,6 +1,8 @@ import React, { useContext, useEffect, useRef, useState } from 'react' +import { DevModeContext } from '@/contexts/DevModeContext.js' import { ModalContext } from '@/contexts/ModalContext.js' + import Switch from '@/components/Switch/Switch.js' import styles from './Settings.module.css' @@ -17,8 +19,9 @@ enum Tab { const Settings: React.FC = () => { const { settingsOpen, setSettingsOpen } = useContext(ModalContext) + const { devMode } = useContext(DevModeContext) + const [currentTab, setCurrentTab] = useState(Tab.General) - const [devMode, setDevMode] = useState(false) function onClickBackground(e: React.MouseEvent) { if (e.target === e.currentTarget) setSettingsOpen(false) @@ -31,8 +34,8 @@ const Settings: React.FC = () => { }, [settingsOpen, currentTab]) useEffect(() => { - window.api.isDevMode().then(setDevMode) - }, []) + if (!devMode && currentTab === Tab.Advanced) setCurrentTab(Tab.General) + }) return (
{ } const AdvancedTab: React.FC = () => { + const { setDevMode } = useContext(DevModeContext) const [loaded, setLoaded] = useState(false) const settings = useRef<{ disableSocketAuth?: boolean @@ -337,6 +341,12 @@ const AdvancedTab: React.FC = () => { return ( loaded && (
+ setDevMode(false)} + /> { } const AboutTab: React.FC = () => { + const { devMode, setDevMode } = useContext(DevModeContext) const [version, setVersion] = useState(null) + const [timesClicked, setTimesClicked] = useState(0) useEffect(() => { window.api.getVersion().then(setVersion) }, []) + useEffect(() => { + if (timesClicked <= 0) return + + if (devMode) return + + if (timesClicked >= 5) setDevMode(true) + }, [timesClicked]) + return (

GlanceThing

-

Version {version}

+

setTimesClicked(t => (t += 1))} + className={styles.version} + > + Version {version} +

Credits