Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit b58f464

Browse files
feat(#773): use stencil/store for accelerometer
1 parent c6ea1f6 commit b58f464

File tree

4 files changed

+66
-76
lines changed

4 files changed

+66
-76
lines changed

remote/src/app/components/settings/app-experimental-settings/app-experimental-settings.tsx

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
import {Component, Element, State, h} from '@stencil/core';
22
import {RangeChangeEventDetail} from '@ionic/core';
33

4-
import {take} from 'rxjs/operators';
4+
import accStore from '../../../stores/accelerometer.store';
55

66
// Services
77
import {AccelerometerService} from '../../../services/accelerometer/accelerometer.service';
88

99
@Component({
10-
tag: 'app-experimental-settings'
10+
tag: 'app-experimental-settings',
1111
})
1212
export class AppExperimentalSettings {
1313
@Element() el: HTMLElement;
1414

15-
@State()
16-
private accelerometerEnabled: boolean = false;
17-
1815
@State()
1916
private accelerometerFrequency: number = 0;
2017

@@ -34,28 +31,29 @@ export class AppExperimentalSettings {
3431
}
3532

3633
componentWillLoad() {
37-
this.accelerometerService
38-
.watchEnabled()
39-
.pipe(take(1))
40-
.subscribe((enabled: boolean) => {
41-
this.accelerometerEnabled = enabled;
42-
});
43-
4434
this.accelerometerFrequency = this.accelerometerService.frequency;
4535
this.accelerometerSensibility = this.accelerometerService.sensibility;
4636
this.accelerometerTakeUntil = this.accelerometerService.takeUntil;
4737
this.accelerometerDelay = this.accelerometerService.delay;
4838
}
4939

5040
private async toggleAccelerometerSupport() {
51-
try {
52-
this.accelerometerEnabled = await this.accelerometerService.toggle();
41+
let destroyListener;
5342

54-
if (this.accelerometerEnabled) {
43+
try {
44+
destroyListener = accStore.onChange('enable', async () => {
5545
await this.accelerometerService.start();
56-
}
46+
47+
destroyListener();
48+
});
49+
50+
await this.accelerometerService.toggle();
5751
} catch (err) {
58-
this.accelerometerEnabled = false;
52+
accStore.state.enable = false;
53+
54+
if (destroyListener) {
55+
destroyListener();
56+
}
5957
}
6058
}
6159

@@ -98,10 +96,10 @@ export class AppExperimentalSettings {
9896

9997
<ion-item>
10098
<ion-label>Swipe like a Jedi</ion-label>
101-
<ion-toggle slot="end" color="switcher" checked={this.accelerometerEnabled} onIonChange={() => this.toggleAccelerometerSupport()}></ion-toggle>
99+
<ion-toggle slot="end" color="switcher" checked={accStore.state.enable} onIonChange={() => this.toggleAccelerometerSupport()}></ion-toggle>
102100
</ion-item>
103101

104-
<p style={{color: this.accelerometerEnabled ? 'inherit' : 'var(--ion-color-medium)'}}>
102+
<p style={{color: accStore.state.enable ? 'inherit' : 'var(--ion-color-medium)'}}>
105103
<ion-label>Accelerometer's frequency ({this.accelerometerFrequency} measures/seconds)</ion-label>
106104
</p>
107105

@@ -111,12 +109,12 @@ export class AppExperimentalSettings {
111109
max={300}
112110
value={this.accelerometerFrequency}
113111
mode="md"
114-
disabled={!this.accelerometerEnabled}
112+
disabled={!accStore.state.enable}
115113
color="switcher"
116114
onIonChange={(e: CustomEvent<RangeChangeEventDetail>) => this.updateAccelerometerFrequency(e)}></ion-range>
117115
</ion-item>
118116

119-
<p style={{color: this.accelerometerEnabled ? 'inherit' : 'var(--ion-color-medium)'}}>
117+
<p style={{color: accStore.state.enable ? 'inherit' : 'var(--ion-color-medium)'}}>
120118
<ion-label>Debounce (trigger swipe after {(this.accelerometerTakeUntil / this.accelerometerFrequency).toFixed(2)} seconds)</ion-label>
121119
</p>
122120

@@ -126,12 +124,12 @@ export class AppExperimentalSettings {
126124
max={30}
127125
value={this.accelerometerTakeUntil}
128126
mode="md"
129-
disabled={!this.accelerometerEnabled}
127+
disabled={!accStore.state.enable}
130128
color="switcher"
131129
onIonChange={(e: CustomEvent<RangeChangeEventDetail>) => this.updateAccelerometerTakeUntil(e)}></ion-range>
132130
</ion-item>
133131

134-
<p style={{color: this.accelerometerEnabled ? 'inherit' : 'var(--ion-color-medium)'}}>
132+
<p style={{color: accStore.state.enable ? 'inherit' : 'var(--ion-color-medium)'}}>
135133
<ion-label>Sensibility (detect acceleration above velocity {this.accelerometerSensibility})</ion-label>
136134
</p>
137135

@@ -141,12 +139,12 @@ export class AppExperimentalSettings {
141139
max={30}
142140
value={this.accelerometerSensibility}
143141
mode="md"
144-
disabled={!this.accelerometerEnabled}
142+
disabled={!accStore.state.enable}
145143
color="switcher"
146144
onIonChange={(e: CustomEvent<RangeChangeEventDetail>) => this.updateAccelerometerSensibility(e)}></ion-range>
147145
</ion-item>
148146

149-
<p style={{color: this.accelerometerEnabled ? 'inherit' : 'var(--ion-color-medium)'}}>
147+
<p style={{color: accStore.state.enable ? 'inherit' : 'var(--ion-color-medium)'}}>
150148
<ion-label>Delay (after swipe, detect again after {this.accelerometerDelay}ms)</ion-label>
151149
</p>
152150

@@ -156,11 +154,11 @@ export class AppExperimentalSettings {
156154
max={2500}
157155
value={this.accelerometerDelay}
158156
mode="md"
159-
disabled={!this.accelerometerEnabled}
157+
disabled={!accStore.state.enable}
160158
color="switcher"
161159
onIonChange={(e: CustomEvent<RangeChangeEventDetail>) => this.updateAccelerometerDelay(e)}></ion-range>
162160
</ion-item>
163-
</ion-list>
161+
</ion-list>,
164162
];
165163
}
166164
}

remote/src/app/pages/app-remote/app-remote.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ import {alertController, modalController, OverlayEventDetail} from '@ionic/core'
33

44
import {isMobile} from '@deckdeckgo/utils';
55

6-
import {Subscription} from 'rxjs';
7-
86
import notesStores from '../../stores/notes.store';
97
import remoteStore from '../../stores/remote.store';
8+
import accStore from '../../stores/accelerometer.store';
109

1110
// Types
1211
import {
@@ -66,8 +65,8 @@ export class AppRemote {
6665
@State()
6766
private clientId: string;
6867

69-
private acceleratorSubscription: Subscription;
70-
private acceleratorInitSubscription: Subscription;
68+
private destroyAcceleratorListener;
69+
private destroyAcceleratorInitListener;
7170

7271
private communicationService: CommunicationService;
7372
private accelerometerService: AccelerometerService;
@@ -125,15 +124,15 @@ export class AppRemote {
125124
}
126125
});
127126

128-
this.acceleratorSubscription = this.accelerometerService.watch().subscribe(async (prev: boolean) => {
127+
this.destroyAcceleratorListener = accStore.onChange('trigger', async (prev: boolean) => {
129128
await this.prevNextSlide(prev, false);
130129

131130
setTimeout(async () => {
132131
await this.startAccelerometer();
133132
}, this.accelerometerService.delay);
134133
});
135134

136-
this.acceleratorInitSubscription = this.accelerometerService.watchInitialized().subscribe(async (initialized: boolean) => {
135+
this.destroyAcceleratorInitListener = accStore.onChange('initialized', async (initialized: boolean) => {
137136
if (initialized) {
138137
const deck: HTMLElement = this.el.querySelector('deckgo-deck');
139138

@@ -194,12 +193,12 @@ export class AppRemote {
194193
this.eventDestroyListener();
195194
}
196195

197-
if (this.acceleratorSubscription) {
198-
this.acceleratorSubscription.unsubscribe();
196+
if (this.destroyAcceleratorListener) {
197+
this.destroyAcceleratorListener();
199198
}
200199

201-
if (this.acceleratorInitSubscription) {
202-
this.acceleratorInitSubscription.unsubscribe();
200+
if (this.destroyAcceleratorInitListener) {
201+
this.destroyAcceleratorInitListener();
203202
}
204203
}
205204

remote/src/app/services/accelerometer/accelerometer.service.tsx

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {BehaviorSubject, Observable, Subject} from 'rxjs';
1+
import store from '../../stores/accelerometer.store';
22

33
import {get, set} from 'idb-keyval';
44

@@ -13,7 +13,6 @@ interface AccelerometerValues {
1313
export class AccelerometerService {
1414
private static instance: AccelerometerService;
1515

16-
private enableSubject: BehaviorSubject<boolean> = new BehaviorSubject(false);
1716
private enable: boolean = false;
1817

1918
private permissionGranted: boolean = false;
@@ -32,10 +31,6 @@ export class AccelerometerService {
3231
private sumAccelerationNext: number = 0;
3332
private sumAccelerationPrev: number = 0;
3433

35-
private triggerSubject: Subject<boolean> = new Subject();
36-
37-
private initializedSubject: BehaviorSubject<boolean> = new BehaviorSubject(false);
38-
3934
private constructor() {
4035
// Private constructor, singleton
4136
}
@@ -98,7 +93,7 @@ export class AccelerometerService {
9893
if (this.sensor.x > this.sensibility || this.sensor.x < this.sensibility * -1) {
9994
// We are emitting the direction after a bit of time
10095
if (this.takeValues >= this.takeUntil) {
101-
this.triggerSubject.next(this.sumAccelerationNext > this.sumAccelerationPrev);
96+
store.state.trigger = this.sumAccelerationNext > this.sumAccelerationPrev;
10297

10398
// We are stopping to listen and will start again once the slide transition is done
10499
this.stop();
@@ -123,28 +118,23 @@ export class AccelerometerService {
123118
}
124119
}
125120

126-
toggle(): Promise<boolean> {
127-
return new Promise<boolean>(async (resolve, reject) => {
128-
try {
129-
if (this.enable) {
130-
this.stop();
131-
} else {
132-
await this.askPermission();
133-
}
134-
135-
this.toggleEnabled(!this.enable);
136-
137-
resolve(this.enable);
138-
} catch (err) {
139-
this.toggleEnabled(false);
140-
reject(err);
121+
async toggle() {
122+
try {
123+
if (this.enable) {
124+
this.stop();
125+
} else {
126+
await this.askPermission();
141127
}
142-
});
128+
129+
this.toggleEnabled(!this.enable);
130+
} catch (err) {
131+
this.toggleEnabled(false);
132+
}
143133
}
144134

145135
private toggleEnabled(enabled: boolean) {
146136
this.enable = enabled;
147-
this.enableSubject.next(this.enable);
137+
store.state.enable = this.enable;
148138
}
149139

150140
private askPermission(): Promise<any> {
@@ -172,17 +162,13 @@ export class AccelerometerService {
172162
);
173163
}
174164

175-
watch(): Observable<boolean> {
176-
return this.triggerSubject.asObservable();
177-
}
178-
179165
async save() {
180166
await set('deckdeckgo_accelerometer', {
181167
enable: this.enable,
182168
frequency: this.frequency,
183169
sensibility: this.sensibility,
184170
takeUntil: this.takeUntil,
185-
delay: this.delay
171+
delay: this.delay,
186172
});
187173
}
188174

@@ -199,17 +185,9 @@ export class AccelerometerService {
199185
await this.askPermission();
200186
}
201187

202-
this.enableSubject.next(this.enable);
188+
store.state.enable = this.enable;
203189
}
204190

205-
this.initializedSubject.next(true);
206-
}
207-
208-
watchInitialized(): Observable<boolean> {
209-
return this.initializedSubject.asObservable();
210-
}
211-
212-
watchEnabled(): Observable<boolean> {
213-
return this.enableSubject.asObservable();
191+
store.state.initialized = true;
214192
}
215193
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import {createStore} from '@stencil/store';
2+
3+
interface AccelerometerStore {
4+
enable: boolean;
5+
initialized: boolean;
6+
trigger: boolean | undefined;
7+
}
8+
9+
const {state, onChange} = createStore({
10+
enable: false,
11+
initialized: false,
12+
trigger: undefined,
13+
} as AccelerometerStore);
14+
15+
export default {state, onChange};

0 commit comments

Comments
 (0)