Skip to content

Commit

Permalink
archived
Browse files Browse the repository at this point in the history
  • Loading branch information
sammwyy committed Aug 9, 2023
1 parent 8e7adf4 commit 8b303d8
Show file tree
Hide file tree
Showing 14 changed files with 197 additions and 38 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "openmc-launcher",
"version": "0.0.3",
"version": "0.0.4",
"description": "An open source Minecraft launcher and mod manager",
"homepage": "https://github.com/sammwyy/openmc#readme",
"bugs": {
Expand Down
4 changes: 2 additions & 2 deletions release/app/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion release/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "openmc-launcher",
"version": "0.0.1",
"version": "0.0.3",
"description": "Open source Minecraft launcher and mod manager.",
"license": "MIT",
"author": {
Expand Down
4 changes: 4 additions & 0 deletions src/common/instances/instance-settings.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
export default interface InstanceSettings {
manifest: string;
memory: {
min: 1024;
max: 1024;
};
}
3 changes: 3 additions & 0 deletions src/common/settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default interface Settings {
selectedAccount: number;
}
17 changes: 17 additions & 0 deletions src/main/manager.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
import Instance from 'common/instances/instance';
import Settings from 'common/settings';
import Version from 'common/versions/version';
import { IpcMain } from 'electron';
import Logger from './logger';
import IconsProvider from './providers/icons.provider';
import InstanceProvider from './providers/instance.provider';
import LauncherProvider from './providers/launcher.provider';
import SettingsProvider from './providers/settings.provider';
import VersionsProvider from './providers/versions.provider';

export default class Manager {
private readonly icons: IconsProvider;
private readonly instances: InstanceProvider;
private readonly launcher: LauncherProvider;
private readonly settings: SettingsProvider;
private readonly versions: VersionsProvider;

constructor() {
this.icons = new IconsProvider();
this.instances = new InstanceProvider();
this.launcher = new LauncherProvider();
this.settings = new SettingsProvider();
this.versions = new VersionsProvider(this.launcher);
}

Expand Down Expand Up @@ -66,6 +70,19 @@ export default class Manager {
event.sender.send('launcher:launch', null);
});

ipc.on('settings:load', async (event) => {
Logger.debug(`Renderer call IPC function "settings:load"`);
const loadedSettings = await this.settings.loadConfig();
event.sender.send('settings:load', loadedSettings);
});

ipc.on('settings:save', async (event, args) => {
Logger.debug(`Renderer call IPC function "settings:save"`);
const toSave = args[0] as Settings;
await this.settings.saveConfig(toSave);
event.sender.send('settings:save', toSave);
});

ipc.on('versions:download', async (event, args) => {
Logger.debug(`Renderer call IPC function "versions:download"`);
const version = args[0] as Version;
Expand Down
2 changes: 2 additions & 0 deletions src/main/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export type Channels =
| 'versions:download_end'
| 'versions:download_manifest'
| 'versions:list'
| 'settings:load'
| 'settings:save'
| 'window:close'
| 'window:minimize'
| 'window:maximize';
Expand Down
55 changes: 55 additions & 0 deletions src/main/providers/settings.provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import fs from 'fs/promises';
import fsSync from 'fs';

import Settings from '../../common/settings';
import { getLauncherFile } from '../utils/dir.utils';
import Logger from '../logger';

const DEFAULT_SETTINGS: Settings = {
selectedAccount: -1,
};

export default class SettingsProvider {
private configFile: string;
private settings: Settings | null;

constructor() {
this.configFile = getLauncherFile('settings.json');
this.settings = null;
}

async saveConfig(toSave?: Settings): Promise<void> {
if (toSave) {
this.settings = toSave;
}

if (this.settings != null) {
const raw = JSON.stringify(this.settings);
await fs.writeFile(this.configFile, raw, { encoding: 'utf-8' });
Logger.info(`Saved launcher configuration file.`);
} else {
Logger.warn(`Prvent config save due to null object.`);
}
}

async createDefaultConfig(overwrites = false): Promise<boolean> {
const exist = fsSync.existsSync(this.configFile);
if (exist && !overwrites) {
return false;
}

this.settings = DEFAULT_SETTINGS;
await this.saveConfig();
return true;
}

async loadConfig(): Promise<Settings> {
await this.createDefaultConfig(false);

const raw = await fs.readFile(this.configFile, { encoding: 'utf-8' });
const loadedConfig = JSON.parse(raw) as Settings;
this.settings = { ...DEFAULT_SETTINGS, ...loadedConfig };
Logger.info(`Loaded launcher configuration file.`);
return this.settings;
}
}
60 changes: 33 additions & 27 deletions src/renderer/App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { ChakraProvider } from '@chakra-ui/react';
import { MemoryRouter as Router, Routes, Route } from 'react-router-dom';

// Contexts.
import DownloadProvider from './contexts/download/download-provider';
import LogsProvider from './contexts/logging/logs-provider';
import InstancesProvider from './contexts/instances/instance-provider';
import SettingsProvider from './contexts/settings/settings-provider';
import VersionsProvider from './contexts/versions/versions-provider';

// Components
Expand All @@ -17,38 +21,40 @@ import CreateInstance from './screens/instances/create_instance';

// Theming
import theme from './theme';
import './styles/scroll.css';
import Logs from './screens/logs';
import DownloadProvider from './contexts/download/download-provider';

import './styles/scroll.css';

export default function App() {
return (
<LogsProvider>
<VersionsProvider>
<DownloadProvider>
<InstancesProvider>
<ChakraProvider theme={theme}>
<Router>
<TitleBar title="OpenMC" />
<Navbar />

<Routes>
<Route path="/" element={<Main />} />
<Route path="/logs" element={<Logs />} />

<Route path="/instances" element={<Instances />} />
<Route
path="/instances/create"
element={<CreateInstance />}
/>
</Routes>

<DownloadBar />
</Router>
</ChakraProvider>
</InstancesProvider>
</DownloadProvider>
</VersionsProvider>
<SettingsProvider>
<VersionsProvider>
<DownloadProvider>
<InstancesProvider>
<ChakraProvider theme={theme}>
<Router>
<TitleBar title="OpenMC" />
<Navbar />

<Routes>
<Route path="/" element={<Main />} />
<Route path="/logs" element={<Logs />} />

<Route path="/instances" element={<Instances />} />
<Route
path="/instances/create"
element={<CreateInstance />}
/>
</Routes>

<DownloadBar />
</Router>
</ChakraProvider>
</InstancesProvider>
</DownloadProvider>
</VersionsProvider>
</SettingsProvider>
</LogsProvider>
);
}
11 changes: 11 additions & 0 deletions src/renderer/contexts/settings/settings-context.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react';
import Settings from 'common/settings';
import SettingsHook from './settings-hook';

const SettingsContext = React.createContext<SettingsHook>({
settings: null,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
setSettings: (settings: Settings): void => {},
});

export default SettingsContext;
6 changes: 6 additions & 0 deletions src/renderer/contexts/settings/settings-hook.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import Settings from 'common/settings';

export default interface SettingsHook {
settings: Settings | null;
setSettings: (settings: Settings) => void;
}
41 changes: 41 additions & 0 deletions src/renderer/contexts/settings/settings-provider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { PropsWithChildren, useEffect, useState } from 'react';

import Settings from 'common/settings';
import { loadSettings, saveSettings } from 'renderer/services/settings.service';
import useLogs from 'renderer/hooks/useLogs';
import VersionsContext from './settings-context';

export default function SettingsProvider({ children }: PropsWithChildren) {
const [settings, setSettings] = useState<Settings | null>(null);
const [firstLoad, setFirstLoad] = useState(true);
const logger = useLogs();

useEffect(() => {
loadSettings()
// eslint-disable-next-line promise/always-return
.then((loadedSettings: Settings) => {
setSettings(loadedSettings);
setFirstLoad(true);
})
.catch(logger.crit);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

useEffect(() => {
if (settings && !firstLoad) {
saveSettings(settings);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [settings]);

return (
<VersionsContext.Provider
value={{
setSettings,
settings,
}}
>
{children}
</VersionsContext.Provider>
);
}
7 changes: 0 additions & 7 deletions src/renderer/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,3 @@ root.render(
<App />
</>
);

/*
window.electron.ipcRenderer.once('ipc-example', (arg) => {
console.log(arg);
});
window.electron.ipcRenderer.sendMessage('ipc-example', ['ping']);
*/
21 changes: 21 additions & 0 deletions src/renderer/services/settings.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Settings from 'common/settings';

export function loadSettings(): Promise<Settings> {
return new Promise((resolve) => {
window.electron.ipcRenderer.once('settings:load', (settings: unknown) => {
resolve(settings as Settings);
});

window.electron.ipcRenderer.sendMessage('settings:load', []);
});
}

export function saveSettings(settingstoSave: Settings): Promise<Settings> {
return new Promise((resolve) => {
window.electron.ipcRenderer.once('settings:save', (settings: unknown) => {
resolve(settings as Settings);
});

window.electron.ipcRenderer.sendMessage('settings:save', [settingstoSave]);
});
}

0 comments on commit 8b303d8

Please sign in to comment.