From 0a0e3f23ff1e51abaa9f9f394695d2b27395f5fd Mon Sep 17 00:00:00 2001 From: ItsRiprod Date: Sun, 4 Aug 2024 04:47:57 -0400 Subject: [PATCH] v0.7.0 pre pre release - Added a lot of stuff - Added client abilities - Added settings - Full changelog in release --- AppExamples/discord/manifest.json | 2 +- AppExamples/mediawin/index.js | 9 +- AppExamples/mediawin/mediawin.js | 16 +- AppExamples/spotify/builds/index.js | 27 +++- AppExamples/spotify/index.js | 6 +- AppExamples/spotify/spotify.js | 21 ++- DeskThing/src/Layout.tsx | 10 +- DeskThing/src/components/Footer/Footer.tsx | 5 +- DeskThing/src/helpers/ColorExtractor.ts | 1 - DeskThing/src/helpers/WebSocketService.ts | 2 +- DeskThing/src/store/manifestStore.ts | 5 + DeskThing/src/utils/audioControlActions.ts | 4 +- DeskThing/src/utils/simulateTouch.ts | 39 +++++ DeskThing/src/views/local/index.tsx | 40 ++++- DeskThing/src/views/spotify/index.tsx | 40 ++++- DeskThing/src/views/utility/index.tsx | 9 +- DeskThing/src/views/views.tsx | 2 +- DeskThingServer/build/icon.icns | Bin 85649 -> 76524 bytes DeskThingServer/build/icon.ico | Bin 8004 -> 37811 bytes DeskThingServer/build/icon.png | Bin 8004 -> 38173 bytes DeskThingServer/resources/icon.ico | Bin 766 -> 4286 bytes .../src/main/handlers/authHandler.ts | 2 +- .../src/main/handlers/deviceHandler.ts | 111 +++++++++++++ .../src/main/handlers/websocketServer.ts | 2 +- DeskThingServer/src/main/index.ts | 104 ++++++++++++- .../connectionsStore.ts} | 0 .../src/main/stores/settingsStore.ts | 112 ++++++++++++++ DeskThingServer/src/preload/index.d.ts | 2 + DeskThingServer/src/preload/index.ts | 5 +- DeskThingServer/src/renderer/src/App.tsx | 38 +---- .../renderer/src/components/ADB/Devices.tsx | 21 ++- .../src/renderer/src/components/Apps/Apps.tsx | 50 +++++- .../src/components/ClientSettings.tsx | 87 +++++++++++ .../src/renderer/src/components/Dev/Apps.tsx | 6 +- .../renderer/src/components/Device/Client.tsx | 20 ++- .../renderer/src/components/Device/Tabs.tsx | 2 +- .../src/components/Overlays/AppRequest.tsx | 53 +++---- .../Overlays/ClientSettingsOverlay.tsx | 146 ++++++++++++++++++ .../components/Overlays/DisplayAppData.tsx | 87 +++++++---- .../components/Overlays/DisplayDeviceData.tsx | 21 ++- .../components/Overlays/SettingsOverlay.tsx | 46 ++++-- .../src/components/Overlays/index.tsx | 2 - .../renderer/src/components/ReleaseList.tsx | 4 +- .../src/renderer/src/store/appStore.ts | 6 +- .../src/renderer/src/store/clientStore.ts | 31 ++-- .../src/renderer/src/store/index.ts | 2 +- .../src/renderer/src/store/logStore.ts | 6 + .../src/renderer/src/store/settingsStore.ts | 4 +- 48 files changed, 1012 insertions(+), 196 deletions(-) create mode 100644 DeskThing/src/utils/simulateTouch.ts rename DeskThingServer/src/main/{handlers/settingsHandler.ts => stores/connectionsStore.ts} (100%) create mode 100644 DeskThingServer/src/main/stores/settingsStore.ts create mode 100644 DeskThingServer/src/renderer/src/components/ClientSettings.tsx create mode 100644 DeskThingServer/src/renderer/src/components/Overlays/ClientSettingsOverlay.tsx diff --git a/AppExamples/discord/manifest.json b/AppExamples/discord/manifest.json index 3a328918..0312f461 100644 --- a/AppExamples/discord/manifest.json +++ b/AppExamples/discord/manifest.json @@ -1,5 +1,5 @@ { - "id": "developer-app", + "id": "discord", "isAudioSource": false, "isWebApp": true, "isLocalApp": false, diff --git a/AppExamples/mediawin/index.js b/AppExamples/mediawin/index.js index 5f9590bc..28cc2abb 100644 --- a/AppExamples/mediawin/index.js +++ b/AppExamples/mediawin/index.js @@ -27,7 +27,14 @@ async function onMessageFromMain(event, ...args) { case 'data': if (args[0]?.settings != null) { - mediawin.settings = args[0].settings + ['refresh_interval', 'output_device', 'change_source'].forEach(key => { + if (args[0].settings?.[key]) { + spotify.settings[key] = args[0].settings[key]; + } else { + const settings = { settings: spotify.settings }; + spotify.sendDataToMainFn('add', settings); + } + }); } else { const settings = { settings: mediawin.settings } mediawin.sendDataToMainFn('add', settings) diff --git a/AppExamples/mediawin/mediawin.js b/AppExamples/mediawin/mediawin.js index 8af02741..c9a73a77 100644 --- a/AppExamples/mediawin/mediawin.js +++ b/AppExamples/mediawin/mediawin.js @@ -23,7 +23,21 @@ class MediaWin { "label": "30 seconds" }, ] - } + }, + "change_source": { + "value": 'true', + "label": "Switch Output on Select", + "options": [ + { + "value": "true", + "label": "Switch" + }, + { + "value": "false", + "label": "Dont Switch" + } + ] + }, }; const manifestPath = path.join(__dirname, 'manifest.json'); diff --git a/AppExamples/spotify/builds/index.js b/AppExamples/spotify/builds/index.js index a93bb30a..980a0f43 100644 --- a/AppExamples/spotify/builds/index.js +++ b/AppExamples/spotify/builds/index.js @@ -13606,6 +13606,20 @@ var require_spotify = __commonJS({ "label": "Default" } ] + }, + "change_source": { + "value": "true", + "label": "Switch Output on Select", + "options": [ + { + "value": "true", + "label": "Switch" + }, + { + "value": "false", + "label": "Dont Switch" + } + ] } }; const manifestPath = path.join(__dirname, "manifest.json"); @@ -13897,9 +13911,12 @@ var require_spotify = __commonJS({ } delay *= 1.3; await new Promise((resolve) => setTimeout(resolve, delay)); - } else { + } else if (currentPlayback.currently_playing_type === "show") { currentPlayback = await this.getCurrentEpisode(); this.sendLog("Playing a podcast!"); + } else { + this.sendError("No song is playing or detected!"); + new_id = null; } } while (new_id === id && Date.now() - startTime < timeout && delay < 1e3); if (new_id === id) { @@ -13944,7 +13961,7 @@ var require_spotify = __commonJS({ const imageUrl = currentPlayback.item.album.images[0].url; songData.thumbnail = await getImageData(imageUrl); this.sendDataToMainFn("data", { app: "client", type: "song", data: songData }); - } else { + } else if (currentPlayback.currently_playing_type === "show") { songData = { album: currentPlayback?.item.show.name, artist: currentPlayback?.item.show.publisher, @@ -14054,7 +14071,7 @@ async function onMessageFromMain(event, ...args) { spotify.sendError("No refresh token found, logging in..."); await spotify.login(); } - ["refresh_interval", "output_device"].forEach((key) => { + ["refresh_interval", "output_device", "change_source"].forEach((key) => { if (args[0].settings?.[key]) { spotify.settings[key] = args[0].settings[key]; } else { @@ -14097,7 +14114,6 @@ var handleGet = async (...args) => { switch (args[0].toString()) { case "song": response = await spotify.returnSongData(); - spotify.transfer(); break; case "manifest": response = spotify.manifest; @@ -14150,6 +14166,9 @@ var handleSet = async (...args) => { case "shuffle": response = await spotify.shuffle(args[1]); break; + case "transfer": + response = await spotify.transfer(); + break; case "update_setting": if (args[1] != null) { const { setting, value } = args[1]; diff --git a/AppExamples/spotify/index.js b/AppExamples/spotify/index.js index 40f0fd93..e11cbc37 100644 --- a/AppExamples/spotify/index.js +++ b/AppExamples/spotify/index.js @@ -71,7 +71,7 @@ async function onMessageFromMain(event, ...args) { await spotify.login() } - ['refresh_interval', 'output_device'].forEach(key => { + ['refresh_interval', 'output_device', 'change_source'].forEach(key => { if (args[0].settings?.[key]) { spotify.settings[key] = args[0].settings[key]; } else { @@ -122,7 +122,6 @@ const handleGet = async (...args) => { switch (args[0].toString()) { case 'song': response = await spotify.returnSongData() - spotify.transfer() break case 'manifest': response = spotify.manifest @@ -176,6 +175,9 @@ const handleSet = async (...args) => { case 'shuffle': response = await spotify.shuffle(args[1]) break + case 'transfer': + response = await spotify.transfer() + break case 'update_setting': if (args[1] != null) { const { setting, value } = args[1]; diff --git a/AppExamples/spotify/spotify.js b/AppExamples/spotify/spotify.js index 82d6d843..4a19d7c8 100644 --- a/AppExamples/spotify/spotify.js +++ b/AppExamples/spotify/spotify.js @@ -45,6 +45,20 @@ class SpotifyHandler { } ] }, + "change_source": { + "value": 'true', + "label": "Switch Output on Select", + "options": [ + { + "value": "true", + "label": "Switch" + }, + { + "value": "false", + "label": "Dont Switch" + } + ] + }, }; const manifestPath = path.join(__dirname, 'manifest.json'); @@ -382,9 +396,12 @@ class SpotifyHandler { delay *= 1.3 // how long to increase the delay between attempts await new Promise((resolve) => setTimeout(resolve, delay)) - } else { + } else if (currentPlayback.currently_playing_type === 'show') { currentPlayback = await this.getCurrentEpisode() this.sendLog('Playing a podcast!') + } else { + this.sendError('No song is playing or detected!') + new_id = null } } while (new_id === id && Date.now() - startTime < timeout && delay < 1000) @@ -438,7 +455,7 @@ class SpotifyHandler { songData.thumbnail = await getImageData(imageUrl) this.sendDataToMainFn('data', { app: 'client', type: 'song', data: songData }) - } else { + } else if (currentPlayback.currently_playing_type === 'show') { songData = { album: currentPlayback?.item.show.name, artist: currentPlayback?.item.show.publisher, diff --git a/DeskThing/src/Layout.tsx b/DeskThing/src/Layout.tsx index f0502182..631f76be 100644 --- a/DeskThing/src/Layout.tsx +++ b/DeskThing/src/Layout.tsx @@ -1,10 +1,18 @@ +import { useEffect } from 'react'; import './index.css'; +import { convertMouseToTouch } from './utils/simulateTouch'; export default function RootLayout({ children, }) { + useEffect(() => { + const element = document.getElementById('app'); + if (element) { + convertMouseToTouch(element); + } + }, []); return ( -
+
{children}
) diff --git a/DeskThing/src/components/Footer/Footer.tsx b/DeskThing/src/components/Footer/Footer.tsx index 53afa608..d9c1cab2 100644 --- a/DeskThing/src/components/Footer/Footer.tsx +++ b/DeskThing/src/components/Footer/Footer.tsx @@ -101,7 +101,7 @@ const Footer: React.FC = () => { return () => { document.removeEventListener('touchstart', handleTouchOutside); }; - }, []); + }, [handleTouchOutside]); useEffect(() => { @@ -124,7 +124,8 @@ const Footer: React.FC = () => { return (
+ onTouchStart={handleTouchInside} + onMouseEnter={handleTouchInside}>
-

Current Port: {port}

diff --git a/DeskThingServer/src/renderer/src/components/Apps/Apps.tsx b/DeskThingServer/src/renderer/src/components/Apps/Apps.tsx index 0175613d..0a0bff09 100644 --- a/DeskThingServer/src/renderer/src/components/Apps/Apps.tsx +++ b/DeskThingServer/src/renderer/src/components/Apps/Apps.tsx @@ -3,6 +3,7 @@ import { useAppStore, App } from '../../store/appStore' import { IconX, IconPause, IconPlay, IconDetails, IconPulsing } from '../icons' import DisplayAppData from '../Overlays/DisplayAppData' import RequestStoreInstance, { Request } from '../../store/requestStore' +import AppRequestOverlay from '../Overlays/AppRequest' export type View = 'apps' | 'local' | 'web' @@ -12,6 +13,8 @@ const Apps = (): JSX.Element => { const [enabled, setEnabled] = useState(false) const [appIndex, setAppIndex] = useState(-1) const [appsWithActiveRequests, setAppsWithActiveRequests] = useState([]) + const [currentRequest, setCurrentRequest] = useState<[string, Request | null]>(['', null]) + const [displayRequest, setDisplayRequest] = useState(false) const handleAddAndRunApp = (appName: string): void => { window.electron.ipcRenderer.send('add-app', appName) @@ -55,12 +58,23 @@ const Apps = (): JSX.Element => { }, []) const handleRequestTrigger = (appName: string): void => { - RequestStoreInstance.triggerRequestDisplay(appName) + const request = RequestStoreInstance.getRequestByAppName(appName) + if (request) { + setCurrentRequest([appName, request]) + setDisplayRequest(true) + } } return (
+ {displayRequest && currentRequest[1] && currentRequest[0] && ( + setDisplayRequest(false)} + /> + )} {enabled && } {appsList?.apps?.length > 0 && Object.keys(appsList.apps).length > 0 ? (
@@ -70,11 +84,17 @@ const Apps = (): JSX.Element => { className="border-2 border-zinc-400 p-5 w-11/12 md:w-11/12 2xl:w-96 h-fit flex justify-between rounded-3xl shadow-lg px-5 items-center" >
- -

{app.manifest ? app.manifest.label : app.name}

-

{app.manifest?.version}

+
+

{app.manifest ? app.manifest.label : app.name}

+

{app.manifest?.version}

+
{appsWithActiveRequests.includes(app.name) ? (
@@ -104,7 +124,7 @@ const Apps = (): JSX.Element => {
) : app.enabled ? (
-
+
{tooltips[appIndex] ? (

{tooltips[appIndex]}

) : app.running ? ( @@ -197,6 +217,24 @@ const Apps = (): JSX.Element => { > +
)}
diff --git a/DeskThingServer/src/renderer/src/components/ClientSettings.tsx b/DeskThingServer/src/renderer/src/components/ClientSettings.tsx new file mode 100644 index 00000000..0d574898 --- /dev/null +++ b/DeskThingServer/src/renderer/src/components/ClientSettings.tsx @@ -0,0 +1,87 @@ +import React, { useState, useEffect } from 'react' +import { IconDetails, IconLogoGearLoading, IconRefresh } from './icons' +import settingsStore from '@renderer/store/settingsStore' +import { ServerManifest } from '@renderer/store/clientStore' +import ClientSettingsOverlay from './Overlays/ClientSettingsOverlay' + +const ClientSettings: React.FC = () => { + const [clientManifest, setClientManifest] = useState(null) + const [port, setPort] = useState(-1) + const [tooltip, setTooltip] = useState('') + const [loading, setLoading] = useState(false) + const [details, setDetails] = useState(false) + + useEffect(() => { + settingsStore.getSettings().then((settings) => { + setPort(settings.devicePort) + }) + }, []) + + const handleClientAppRefresh = async (): Promise => { + setLoading(true) + setClientManifest(null) + const newManifest: ServerManifest = await window.electron.getClientManifest() + setClientManifest(newManifest) + setTimeout(() => { + setLoading(false) + }, 200) + } + + return ( +
+ {details && clientManifest && ( + setDetails(false)} + /> + )} + {clientManifest ? ( +
+
+

Staged:

+

{clientManifest.name}

+
+

+ {clientManifest.version} - {clientManifest.ip} +

+
+ ) : ( +
+

+ Staged Client: None +

+

Server Port: {port}

+
+ )} +
+
+

{tooltip}

+
+ + +
+
+ ) +} + +export default ClientSettings diff --git a/DeskThingServer/src/renderer/src/components/Dev/Apps.tsx b/DeskThingServer/src/renderer/src/components/Dev/Apps.tsx index 079994c3..7d533da1 100644 --- a/DeskThingServer/src/renderer/src/components/Dev/Apps.tsx +++ b/DeskThingServer/src/renderer/src/components/Dev/Apps.tsx @@ -38,8 +38,10 @@ const Apps = (): JSX.Element => { const requestAppsList = (): void => window.electron.ipcRenderer.send('get-apps') useEffect(() => { - const developerApp = appsList.apps.find((app) => app.name === 'developer-app') - setApp(developerApp) + if (appsList?.apps?.length > 0) { + const developerApp = appsList.apps.find((app) => app.name === 'developer-app') + setApp(developerApp) + } // Subscribe to changes in request status const onRequestUpdate = (requests: Request[]): void => { const appsWithActiveRequests: string[] = requests.map((request) => request.appName) diff --git a/DeskThingServer/src/renderer/src/components/Device/Client.tsx b/DeskThingServer/src/renderer/src/components/Device/Client.tsx index c5155799..46e40586 100644 --- a/DeskThingServer/src/renderer/src/components/Device/Client.tsx +++ b/DeskThingServer/src/renderer/src/components/Device/Client.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from 'react' import { IconLogoLoading } from '../icons' import githubStore, { GithubRelease, GithubAsset } from '../../store/githubStore' import ReleaseList from '../ReleaseList' +import ClientSettings from '../ClientSettings' const Client = (): JSX.Element => { const [releases, setReleases] = useState([]) @@ -65,7 +66,7 @@ const Client = (): JSX.Element => { return (
-
+
{loading ? (
@@ -78,13 +79,16 @@ const Client = (): JSX.Element => {
) : ( - +
+ + +
)}
diff --git a/DeskThingServer/src/renderer/src/components/Device/Tabs.tsx b/DeskThingServer/src/renderer/src/components/Device/Tabs.tsx index 5ba18ddd..86ce849f 100644 --- a/DeskThingServer/src/renderer/src/components/Device/Tabs.tsx +++ b/DeskThingServer/src/renderer/src/components/Device/Tabs.tsx @@ -30,7 +30,7 @@ const Tabs: React.FC = ({ setCurrentView, currentView }) => { className={`${currentView === 'client' ? 'bg-zinc-900 hover:bg-zinc-700 border-b-2 border-green-500' : 'hover:bg-zinc-800'} flex-grow p-3`} onClick={() => handleClick('client')} > - Client Settings + Client Download
diff --git a/DeskThingServer/src/renderer/src/components/Overlays/AppRequest.tsx b/DeskThingServer/src/renderer/src/components/Overlays/AppRequest.tsx index 27b7f415..a9764286 100644 --- a/DeskThingServer/src/renderer/src/components/Overlays/AppRequest.tsx +++ b/DeskThingServer/src/renderer/src/components/Overlays/AppRequest.tsx @@ -1,10 +1,17 @@ -import { useState, useEffect } from 'react' +import { FC, useState } from 'react' import RequestStore, { Request, AuthScopes } from '../../store/requestStore' +import { IconX } from '../icons' -const appRequest = (): JSX.Element => { - const [requestData, setRequestData] = useState({}) +interface AppRequestProps { + request: Request + requestName: string + onClose: () => void +} + +const AppRequestOverlay: FC = ({ request, onClose, requestName }) => { + const [requestData, setRequestData] = useState(request.scopes) const [formData, setFormData] = useState<{ [key: string]: string }>({}) - const [requestId, setRequestId] = useState(null) + const [requestId, setRequestId] = useState(requestName) const handleInputChange = (field: string, value: string): void => { setFormData({ ...formData, @@ -17,6 +24,7 @@ const appRequest = (): JSX.Element => { setRequestId(null) setRequestData({}) setFormData({}) + onClose() } } @@ -24,33 +32,26 @@ const appRequest = (): JSX.Element => { setRequestId(null) setRequestData({}) setFormData({}) + onClose() } - useEffect(() => { - const handleTriggerRequestDisplay = (request: Request): void => { - setRequestId(request.appName) - setRequestData(request.scopes) - console.log(request) - } - - RequestStore.on('trigger-request-display', handleTriggerRequestDisplay) - - return (): void => { - RequestStore.off('trigger-request-display', handleTriggerRequestDisplay) - } - }, []) - const formFields = Object.keys(requestData) return ( -
+
{formFields.length > 0 && ( -
-

- {requestId} has requested data -

+
+
+

{requestId} request

+ +
{formFields.map((field) => ( -
+
{requestData[field].label && (
+
+
+
+

+ {manifest.name}

{manifest.version}

+

+

ID: {manifest.id}

+
+

{manifest.description}

+
+
+

Modify Settings

+
+ + setIp(e.target.value)} + className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" + /> +
+
+

ADB:

+ +
+
+

Car Thing RNDIS:

+ +
+
+

Local Network:

+ +
+
+
+
+ + setPort(Number(e.target.value))} + className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" + /> +
+
+

Current Port:

+ +
+
+
+
+ + +
+
+
+
+
+ ) +} + +export default ClientSettingsOverlay diff --git a/DeskThingServer/src/renderer/src/components/Overlays/DisplayAppData.tsx b/DeskThingServer/src/renderer/src/components/Overlays/DisplayAppData.tsx index 90e16c7b..d97b2283 100644 --- a/DeskThingServer/src/renderer/src/components/Overlays/DisplayAppData.tsx +++ b/DeskThingServer/src/renderer/src/components/Overlays/DisplayAppData.tsx @@ -1,5 +1,6 @@ import { AppData, App } from '@renderer/store/appStore' import { useState, useEffect } from 'react' +import { IconX } from '../icons' interface DisplayAppDataProps { appIndex: number @@ -25,52 +26,76 @@ const DisplayAppData = ({ appIndex, setEnabled, data, app }: DisplayAppDataProps return ( <> {appData != null ? ( -
-
-

- Data From {appData.manifest ? appData.manifest.label : appData.name} -

+
+
+
+

+ Data From {appData.manifest ? appData.manifest.label : appData.name} +

+ +
{appData.manifest && ( -
-
-

Name:

{appData.name} +
+
+

Name:

{appData.name}

-
-

Enabled:

{appData.enabled ? 'Yes' : 'No'} +
+

Enabled:

{appData.enabled ? 'Yes' : 'No'}

-
-

Pref Index:

{appData.prefIndex} +
+

Pref Index:

{appData.prefIndex}

-
-

Audio Source:

{appData.manifest.isAudioSource ? 'Yes' : 'No'} +
+

Audio Source:

{appData.manifest.isAudioSource ? 'Yes' : 'No'}

-
-

Requires:

{appData.manifest.requires.join(', ')} +
+

Requires:

{appData.manifest.requires.join(', ')}

-
-

Label:

{appData.manifest.label} +
+

Label:

{appData.manifest.label}

-
-

Version:

{appData.manifest.version} +
+

Version:

{appData.manifest.version}

-
-

Description:

{appData.manifest.description} +
+

Description:

{appData.manifest.description}

-
-

Author:

{appData.manifest.author} +
+

Author:

{appData.manifest.author}

-
-

Platforms:

{appData.manifest.platforms.join(', ')} +
+

Platforms:

{appData.manifest.platforms.join(', ')}

-
-

Homepage:

{appData.manifest.homepage} + -
-

Repository:

{appData.manifest.repository} +
)} -
+
+
-
+
diff --git a/DeskThingServer/src/renderer/src/components/Overlays/SettingsOverlay.tsx b/DeskThingServer/src/renderer/src/components/Overlays/SettingsOverlay.tsx index e06d2645..444bce40 100644 --- a/DeskThingServer/src/renderer/src/components/Overlays/SettingsOverlay.tsx +++ b/DeskThingServer/src/renderer/src/components/Overlays/SettingsOverlay.tsx @@ -45,42 +45,56 @@ const SettingsOverlay = ({ setEnabled }: SettingsOverlayProps): JSX.Element => { } return ( -
-
-

Settings

+
+
+
+

Server Settings

+ +
-
-
+
+

Callback Port:

handleSettingChange('callbackPort', Number(e.target.value))} - className="form-input h-10 w-24 text-blue-600" + className="h-10 bg-slate-500 rounded focus:bg-white active:bg-white focus:text-black active:text-black px-2 text-white-600" />
-
+

Device Port:

handleSettingChange('devicePort', Number(e.target.value))} - className="form-input h-10 w-24 text-blue-600" + className="h-10 bg-slate-500 rounded focus:bg-white active:bg-white focus:text-black active:text-black px-2 text-white-600" />
-
+

Address:

handleSettingChange('address', e.target.value)} - className="form-input h-10 w-48 text-blue-600" + className="h-10 bg-slate-500 rounded focus:bg-white active:bg-white focus:text-black active:text-black px-2 text-white-600" />
+
+

Local IP:

+
+

{settings.localIp}

+
+
-
+

Auto Start:

{ />
-
+

Minimize App:

{
diff --git a/DeskThingServer/src/renderer/src/components/Overlays/index.tsx b/DeskThingServer/src/renderer/src/components/Overlays/index.tsx index f95c5617..de366d21 100644 --- a/DeskThingServer/src/renderer/src/components/Overlays/index.tsx +++ b/DeskThingServer/src/renderer/src/components/Overlays/index.tsx @@ -1,10 +1,8 @@ -import AppRequest from './AppRequest' import ToastContainer from './ToastContainer' const Overlays = (): JSX.Element => { return (
-
) diff --git a/DeskThingServer/src/renderer/src/components/ReleaseList.tsx b/DeskThingServer/src/renderer/src/components/ReleaseList.tsx index c6d8cd68..d18ac8df 100644 --- a/DeskThingServer/src/renderer/src/components/ReleaseList.tsx +++ b/DeskThingServer/src/renderer/src/components/ReleaseList.tsx @@ -35,10 +35,10 @@ const ReleaseList: React.FC = ({ {filterAssets(release.assets).map((asset) => ( ))}
diff --git a/DeskThingServer/src/renderer/src/store/appStore.ts b/DeskThingServer/src/renderer/src/store/appStore.ts index 5e0250c9..5a9e3933 100644 --- a/DeskThingServer/src/renderer/src/store/appStore.ts +++ b/DeskThingServer/src/renderer/src/store/appStore.ts @@ -42,6 +42,7 @@ class AppStore extends EventEmitter { this.appsList = { apps: [] } + window.electron.ipcRenderer.on('app-data', this.handleAppData.bind(this)) } static getInstance(): AppStore { @@ -51,6 +52,10 @@ class AppStore extends EventEmitter { return AppStore.instance } + private handleAppData(_event, response): void { + this.setAppList(response.data) + } + public getAppsList(): AppData { return this.appsList } @@ -142,7 +147,6 @@ export const useAppStore = (): AppStoreHook => { if (newAppsList) { setAppsList(newAppsList) } - console.log('Updating things', newAppsList) } appStoreInstance.on('update', handleUpdate) diff --git a/DeskThingServer/src/renderer/src/store/clientStore.ts b/DeskThingServer/src/renderer/src/store/clientStore.ts index 419a95bc..11177df2 100644 --- a/DeskThingServer/src/renderer/src/store/clientStore.ts +++ b/DeskThingServer/src/renderer/src/store/clientStore.ts @@ -1,20 +1,24 @@ -import { useState, useEffect } from 'react' -import { EventEmitter } from '../utility/eventEmitter' +/** + * TODO: Finish setting up clientStore to save client details and data + */ -export interface Manifest { - isAudioSource: boolean - requires: Array - label: string +//import { EventEmitter } from '../utility/eventEmitter' + +export interface ServerManifest { + name: string + id: string + short_name: string + description: string + builtFor: string + reactive: boolean + author: string version: string - description?: string - author?: string - platforms: Array - homepage?: string - repository?: string + port: number + ip: string } - +/* interface ClientStoreEvents { - update: Manifest + manifest: ServerManifest } class ClientStore extends EventEmitter { @@ -92,3 +96,4 @@ class ClientStore extends EventEmitter { } export default ClientStore.getInstance() +*/ diff --git a/DeskThingServer/src/renderer/src/store/index.ts b/DeskThingServer/src/renderer/src/store/index.ts index bd0a1104..26086945 100644 --- a/DeskThingServer/src/renderer/src/store/index.ts +++ b/DeskThingServer/src/renderer/src/store/index.ts @@ -1,3 +1,3 @@ -export { default as AppStore } from './appStore' +export * from './appStore' export { default as LogStore } from './logStore' export { default as RequestStore } from './requestStore' diff --git a/DeskThingServer/src/renderer/src/store/logStore.ts b/DeskThingServer/src/renderer/src/store/logStore.ts index 4b745c47..57ebe9c2 100644 --- a/DeskThingServer/src/renderer/src/store/logStore.ts +++ b/DeskThingServer/src/renderer/src/store/logStore.ts @@ -22,6 +22,11 @@ class LogStore extends EventEmitter { this.logList = [] this.maxLogLength = maxLogLength this.maxNumLogs = 100 + window.electron.ipcRenderer.on('error', (_event, errorData) => this.addLog('error', errorData)) + window.electron.ipcRenderer.on('log', (_event, logData) => this.addLog('log', logData)) + window.electron.ipcRenderer.on('message', (_event, messageData) => + this.addLog('message', messageData) + ) } static getInstance(): LogStore { @@ -91,6 +96,7 @@ class LogStore extends EventEmitter { const logRegex = /^\[(.*?)\]: (\w+) \| (.*)$/ const match = log.match(logRegex) if (match) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, timestamp, type, message] = match return { type: type, diff --git a/DeskThingServer/src/renderer/src/store/settingsStore.ts b/DeskThingServer/src/renderer/src/store/settingsStore.ts index e141dec2..5d8057fc 100644 --- a/DeskThingServer/src/renderer/src/store/settingsStore.ts +++ b/DeskThingServer/src/renderer/src/store/settingsStore.ts @@ -4,6 +4,7 @@ export interface Settings { callbackPort: number devicePort: number address: string + localIp: string autoStart: boolean minimizeApp: boolean } @@ -23,7 +24,8 @@ class SettingsStore extends EventEmitter { devicePort: -1, address: '-.-.-.-', autoStart: true, - minimizeApp: true + minimizeApp: true, + localIp: '-.-.-.-' } window.electron.ipcRenderer.on('settings-updated', this.handleSettingsUpdated.bind(this))