scriptable-testlab
Version:
A lightweight, efficient tool designed to manage and update scripts for Scriptable.
62 lines (49 loc) • 1.86 kB
text/typescript
import {EventEmitter} from 'events';
const STATE_CHANGE_EVENT = 'stateChange';
type StateChangeListener = (state: Record<string, any>) => void;
// Use the namespace pattern
export namespace SystemState {
const emitter = new EventEmitter();
let state: Record<string, any> = {};
export function getState(): Record<string, any> {
return {...state};
}
export function setState(newState: Record<string, any>): void {
state = {...state, ...newState};
emitter.emit(STATE_CHANGE_EVENT, getState());
}
export function reset(): void {
state = {};
emitter.emit(STATE_CHANGE_EVENT, getState());
}
export function getAlertResponse(): number | undefined {
return state.alertResponse;
}
export function setAlertResponse(response: number | undefined): void {
setState({alertResponse: response});
}
export function getTextFieldValue(fieldId: string): string | undefined {
return state.textFieldValues?.[fieldId];
}
export function setTextFieldValue(fieldId: string, value: string): void {
const textFieldValues = {...(state.textFieldValues || {})};
textFieldValues[fieldId] = value;
setState({textFieldValues});
}
export function addEventListener(event: 'stateChange', listener: StateChangeListener): void {
if (event !== STATE_CHANGE_EVENT) {
throw new Error(`Invalid event: ${event}`);
}
emitter.addListener(event, listener);
}
export function removeEventListener(event: 'stateChange', listener: StateChangeListener): void {
if (event !== STATE_CHANGE_EVENT) {
throw new Error(`Invalid event: ${event}`);
}
emitter.removeListener(event, listener);
}
export function subscribe(handler: StateChangeListener): () => void {
addEventListener(STATE_CHANGE_EVENT, handler);
return () => removeEventListener(STATE_CHANGE_EVENT, handler);
}
}