Electron State
React-like IPC backed state objects for Electron.
Example
You can run this example yourself! Just run yarn start in this repo to play with this dummy login flow. The files live in this repo at /test/app.
UserState.ts
import { ElectronState, main, renderer, State } from 'electron-state';
export default class UserState extends ElectronState {
isLoggedIn: boolean = false;
firstName: string | null = null;
lastName: string | null = null;
email: string | null = null;
@main static async logIn(email: string, password: string): Promise<boolean> {
const { db } = await import('database');
const user = await db.users.getByEmail(email);
if (user?.password !== password) { return false; }
UserState.setState({
isLoggedIn: true,
firstName: user.firstName,
lastName: user.lastName,
email: user.email,
});
return true;
}
@renderer static async logOut(): Promise<void> {
const data: State<UserState> = UserState.toJSON();
if (!data.isLoggedIn) { return; }
UserState.setState({
isLoggedIn: false,
firstName: null,
lastName: null,
email: null,
});
alert("You've been logged out!");
}
}
main.ts
import { app, BrowserWindow } from 'electron';
import UserState from './UserState';
UserState.onChange((user) => {
if (user.isLoggedIn) {
console.log(`${user.firstName} ${user.lastName} has logged in. Auto logging out in 10s.`);
setTimeout(() => UserState.logOut(), 10000);
}
});
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 800, height: 600 });
win.loadFile('/static/index.html'));
});
app.tsx
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { useElectronState } from 'electron-state/hooks';
import UserState from './UserState';
async function handleSubmit(evt: React.FormEvent<HTMLFormElement>) {
evt.preventDefault();
const email = (evt.currentTarget.elements.namedItem('email') as HTMLInputElement)?.value || null;
const password = (evt.currentTarget as HTMLFormElement.elements.namedItem('password') as HTMLInputElement)?.value || null;
if (!email || !password) {
alert('Please provide your email and password');
return;
}
const logInSuccess = await UserState.logIn(email, password);
alert(logInSuccess ? 'Successfully logged in!' : 'Incorrect login information.');
}
function App() {
const [ user, setUser ] = useElectronState(UserState);
if (user.isLoggedIn) {
return <section>
<h1>{user.firstName} {user.lastName} is Logged In</h1>
<button onClick={() => setUser({ isLoggedIn: false })}>Log Out</button>
</section>;
}
return <form onSubmit={handleSubmit}>
<input type="email" name="email" />
<input type="password" name="password" />
<button type="submit">Log In</button>
</form>;
}
ReactDOM.render(<App />, document.body);