From d68c17c77f762963ac02be31e95b406506ad0893 Mon Sep 17 00:00:00 2001 From: Pepper Muangmingsuk <33099029+HLXII@users.noreply.github.com> Date: Thu, 24 Jun 2021 20:48:24 -0500 Subject: [PATCH 1/4] Add onChange handler --- .../features/settings/BooleanSetting.ts | 2 +- src/ig-template/features/settings/Setting.ts | 11 +++++++++++ .../features/settings/Settings.spec.ts | 16 +++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/ig-template/features/settings/BooleanSetting.ts b/src/ig-template/features/settings/BooleanSetting.ts index ef89593..6069dd7 100644 --- a/src/ig-template/features/settings/BooleanSetting.ts +++ b/src/ig-template/features/settings/BooleanSetting.ts @@ -17,6 +17,6 @@ export class BooleanSetting extends Setting { } public toggle(): void { - this.value = !this.value; + this.set(!this.value); } } diff --git a/src/ig-template/features/settings/Setting.ts b/src/ig-template/features/settings/Setting.ts index 05281ac..dd0aee8 100644 --- a/src/ig-template/features/settings/Setting.ts +++ b/src/ig-template/features/settings/Setting.ts @@ -3,6 +3,7 @@ import {Requirement} from "@/ig-template/tools/requirements/Requirement"; import {NoRequirement} from "@/ig-template/tools/requirements/NoRequirement"; import {SettingOption} from "@/ig-template/features/settings/SettingOption"; import {SettingsValue} from "@/ig-template/features/settings/SettingsValueType"; +import { ISimpleEvent, SimpleEventDispatcher } from "strongly-typed-events"; export abstract class Setting { @@ -14,6 +15,8 @@ export abstract class Setting { requirement: Requirement; + protected _onChange = new SimpleEventDispatcher(); + protected constructor(id: SettingId, displayName: string, options: SettingOption[], defaultValue: SettingsValue, requirement: Requirement = new NoRequirement()) { this.id = id; this.displayName = displayName; @@ -25,12 +28,20 @@ export abstract class Setting { this.requirement = requirement; } + /** + * Emitted whenever the setting is changed. + */ + public get onChange(): ISimpleEvent { + return this._onChange.asEvent(); + } + set(value: SettingsValue): void { if (!this.canAccess) { return; } if (this.validValue(value)) { this.value = value; + this._onChange.dispatch(value); } else { console.warn(`${value} is not a valid value for setting ${this.id}. It could be that the option is not yet unlocked.`); } diff --git a/tests/unit/ig-template/features/settings/Settings.spec.ts b/tests/unit/ig-template/features/settings/Settings.spec.ts index b1d6324..21d9b41 100644 --- a/tests/unit/ig-template/features/settings/Settings.spec.ts +++ b/tests/unit/ig-template/features/settings/Settings.spec.ts @@ -18,7 +18,7 @@ describe('Settings', () => { new SettingOption("Option 2", 2), new SettingOption("Option 3", 3), ], 2) - ) + ); }); test('adding same setting multiple times', () => { @@ -62,6 +62,20 @@ describe('Settings', () => { }).not.toThrow() }); + test('test change event', () => { + expect.assertions(3); + + const setting = settings.getSetting(id); + setting?.onChange.subscribe(value => { + expect(value).toBe(2); + }); + + settings.setSetting(id, 2); + + expect(setting).toBeDefined(); + expect(setting?.value).toBe(2); + }); + test('save empty', () => { // Arrange const expectedSaveData: SettingsSaveData = { From ddac6dd8d545bf50e77bbc60198b9bf0a0e530b4 Mon Sep 17 00:00:00 2001 From: Pepper Muangmingsuk <33099029+HLXII@users.noreply.github.com> Date: Sun, 25 Jul 2021 12:37:09 -0500 Subject: [PATCH 2/4] Update to send previous value as well --- src/ig-template/features/settings/Setting.ts | 7 ++++--- .../ig-template/features/settings/Settings.spec.ts | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/ig-template/features/settings/Setting.ts b/src/ig-template/features/settings/Setting.ts index dd0aee8..013101a 100644 --- a/src/ig-template/features/settings/Setting.ts +++ b/src/ig-template/features/settings/Setting.ts @@ -15,7 +15,7 @@ export abstract class Setting { requirement: Requirement; - protected _onChange = new SimpleEventDispatcher(); + protected _onChange = new SimpleEventDispatcher(); protected constructor(id: SettingId, displayName: string, options: SettingOption[], defaultValue: SettingsValue, requirement: Requirement = new NoRequirement()) { this.id = id; @@ -31,7 +31,7 @@ export abstract class Setting { /** * Emitted whenever the setting is changed. */ - public get onChange(): ISimpleEvent { + public get onChange(): ISimpleEvent { return this._onChange.asEvent(); } @@ -40,8 +40,9 @@ export abstract class Setting { return; } if (this.validValue(value)) { + const prevValue = this.value; this.value = value; - this._onChange.dispatch(value); + this._onChange.dispatch([prevValue, value]); } else { console.warn(`${value} is not a valid value for setting ${this.id}. It could be that the option is not yet unlocked.`); } diff --git a/tests/unit/ig-template/features/settings/Settings.spec.ts b/tests/unit/ig-template/features/settings/Settings.spec.ts index 21d9b41..ee3668d 100644 --- a/tests/unit/ig-template/features/settings/Settings.spec.ts +++ b/tests/unit/ig-template/features/settings/Settings.spec.ts @@ -63,17 +63,18 @@ describe('Settings', () => { }); test('test change event', () => { - expect.assertions(3); + expect.assertions(4); const setting = settings.getSetting(id); - setting?.onChange.subscribe(value => { - expect(value).toBe(2); + setting?.onChange.subscribe(([prevValue, value]) => { + expect(prevValue).toBe(2); + expect(value).toBe(3); }); - settings.setSetting(id, 2); + settings.setSetting(id, 3); expect(setting).toBeDefined(); - expect(setting?.value).toBe(2); + expect(setting?.value).toBe(3); }); test('save empty', () => { From 0f6983dfa8cc85416903f497725f334edb8bbbf2 Mon Sep 17 00:00:00 2001 From: Pepper Muangmingsuk <33099029+HLXII@users.noreply.github.com> Date: Sun, 25 Jul 2021 14:35:30 -0500 Subject: [PATCH 3/4] Fix indent for travis --- src/ig-template/features/settings/Setting.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ig-template/features/settings/Setting.ts b/src/ig-template/features/settings/Setting.ts index 013101a..47010e7 100644 --- a/src/ig-template/features/settings/Setting.ts +++ b/src/ig-template/features/settings/Setting.ts @@ -28,7 +28,7 @@ export abstract class Setting { this.requirement = requirement; } - /** + /** * Emitted whenever the setting is changed. */ public get onChange(): ISimpleEvent { From 9148a7edd17e1d90b1f37da7090c1cfad869362f Mon Sep 17 00:00:00 2001 From: Pepper Muangmingsuk <33099029+HLXII@users.noreply.github.com> Date: Sun, 25 Jul 2021 14:41:32 -0500 Subject: [PATCH 4/4] Switch to tuple definition --- src/ig-template/features/settings/Setting.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ig-template/features/settings/Setting.ts b/src/ig-template/features/settings/Setting.ts index 47010e7..9f1322c 100644 --- a/src/ig-template/features/settings/Setting.ts +++ b/src/ig-template/features/settings/Setting.ts @@ -15,7 +15,7 @@ export abstract class Setting { requirement: Requirement; - protected _onChange = new SimpleEventDispatcher(); + protected _onChange = new SimpleEventDispatcher<[SettingsValue, SettingsValue]>(); protected constructor(id: SettingId, displayName: string, options: SettingOption[], defaultValue: SettingsValue, requirement: Requirement = new NoRequirement()) { this.id = id; @@ -31,7 +31,7 @@ export abstract class Setting { /** * Emitted whenever the setting is changed. */ - public get onChange(): ISimpleEvent { + public get onChange(): ISimpleEvent<[SettingsValue, SettingsValue]> { return this._onChange.asEvent(); }