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