Author
diff --git a/studio/src/app/services/data/user/user.service.tsx b/studio/src/app/services/data/user/user.service.tsx
index c09dbed61..d49898240 100644
--- a/studio/src/app/services/data/user/user.service.tsx
+++ b/studio/src/app/services/data/user/user.service.tsx
@@ -1,14 +1,12 @@
import * as firebase from 'firebase/app';
import 'firebase/firestore';
-import {Observable, ReplaySubject} from 'rxjs';
+import store from '../../../stores/user.store';
import {AuthUser} from '../../../models/auth/auth.user';
import {User, UserData} from '../../../models/data/user';
export class UserService {
- private userSubject: ReplaySubject = new ReplaySubject(1);
-
private static instance: UserService;
private constructor() {
@@ -37,16 +35,16 @@ export class UserService {
if (!snapshot.exists) {
const user: User = await this.createUser(authUser);
- this.userSubject.next(user);
+ store.state.user = {...user};
} else {
const user: UserData = snapshot.data() as UserData;
const updatedUser: UserData = await this.updateUserWithAuthData(authUser, user);
- this.userSubject.next({
+ store.state.user = {
id: authUser.uid,
data: updatedUser,
- });
+ };
}
resolve();
@@ -143,10 +141,6 @@ export class UserService {
}
}
- watch(): Observable {
- return this.userSubject.asObservable();
- }
-
update(user: User): Promise {
return new Promise(async (resolve, reject) => {
const firestore: firebase.firestore.Firestore = firebase.firestore();
@@ -157,7 +151,7 @@ export class UserService {
try {
await firestore.collection('users').doc(user.id).set(user.data, {merge: true});
- this.userSubject.next(user);
+ store.state.user = {...user};
resolve(user);
} catch (err) {
@@ -173,7 +167,7 @@ export class UserService {
await firestore.collection('users').doc(userId).delete();
- this.userSubject.next(null);
+ store.reset();
resolve();
} catch (err) {
diff --git a/studio/src/app/services/editor/publish/publish.service.tsx b/studio/src/app/services/editor/publish/publish.service.tsx
index 666f00c55..4275fd867 100644
--- a/studio/src/app/services/editor/publish/publish.service.tsx
+++ b/studio/src/app/services/editor/publish/publish.service.tsx
@@ -1,22 +1,19 @@
import * as firebase from 'firebase/app';
import 'firebase/firestore';
-import {take} from 'rxjs/operators';
-
import deckStore from '../../../stores/deck.store';
import publishStore from '../../../stores/publish.store';
+import userStore from '../../../stores/user.store';
import {Deck, DeckMetaAuthor} from '../../../models/data/deck';
import {ApiDeck} from '../../../models/api/api.deck';
import {Slide, SlideAttributes, SlideTemplate} from '../../../models/data/slide';
-import {User} from '../../../models/data/user';
import {ApiPresentation} from '../../../models/api/api.presentation';
import {ApiSlide} from '../../../models/api/api.slide';
import {DeckService} from '../../data/deck/deck.service';
import {SlideService} from '../../data/slide/slide.service';
-import {UserService} from '../../data/user/user.service';
import {ApiPresentationService} from '../../api/presentation/api.presentation.service';
import {ApiPresentationFactoryService} from '../../api/presentation/api.presentation.factory.service';
@@ -33,8 +30,6 @@ export class PublishService {
private deckService: DeckService;
private slideService: SlideService;
- private userService: UserService;
-
private fontsService: FontsService;
private constructor() {
@@ -43,8 +38,6 @@ export class PublishService {
this.deckService = DeckService.getInstance();
this.slideService = SlideService.getInstance();
- this.userService = UserService.getInstance();
-
this.fontsService = FontsService.getInstance();
}
@@ -379,62 +372,62 @@ export class PublishService {
return;
}
- this.userService
- .watch()
- .pipe(take(1))
- .subscribe(async (user: User) => {
- const url: URL = new URL(publishedUrl);
- const now: firebase.firestore.Timestamp = firebase.firestore.Timestamp.now();
-
- if (!deck.data.meta) {
- deck.data.meta = {
- title: deck.data.name,
- pathname: url.pathname,
- published: true,
- published_at: now,
- feed: true,
- updated_at: now,
- };
- } else {
- deck.data.meta.title = deck.data.name;
- deck.data.meta.pathname = url.pathname;
- deck.data.meta.updated_at = now;
- }
-
- if (description && description !== undefined && description !== '') {
- deck.data.meta.description = description;
- } else {
- deck.data.meta.description = firebase.firestore.FieldValue.delete();
- }
-
- if (!tags || tags.length <= 0) {
- deck.data.meta.tags = firebase.firestore.FieldValue.delete();
- } else {
- deck.data.meta.tags = tags;
- }
-
- if (user && user.data && user.data.name) {
- if (!deck.data.meta.author) {
- deck.data.meta.author = {
- name: user.data.name,
- };
- } else {
- (deck.data.meta.author as DeckMetaAuthor).name = user.data.name;
- }
-
- if (user.data.photo_url) {
- (deck.data.meta.author as DeckMetaAuthor).photo_url = user.data.photo_url;
- }
- } else {
- if (deck.data.meta.author) {
- deck.data.meta.author = firebase.firestore.FieldValue.delete();
- }
- }
-
- await this.deckService.update(deck);
-
- resolve();
- });
+ if (!userStore.state.user || !userStore.state.user.data) {
+ reject('No user');
+ return;
+ }
+
+ const url: URL = new URL(publishedUrl);
+ const now: firebase.firestore.Timestamp = firebase.firestore.Timestamp.now();
+
+ if (!deck.data.meta) {
+ deck.data.meta = {
+ title: deck.data.name,
+ pathname: url.pathname,
+ published: true,
+ published_at: now,
+ feed: true,
+ updated_at: now,
+ };
+ } else {
+ deck.data.meta.title = deck.data.name;
+ deck.data.meta.pathname = url.pathname;
+ deck.data.meta.updated_at = now;
+ }
+
+ if (description && description !== undefined && description !== '') {
+ deck.data.meta.description = description;
+ } else {
+ deck.data.meta.description = firebase.firestore.FieldValue.delete();
+ }
+
+ if (!tags || tags.length <= 0) {
+ deck.data.meta.tags = firebase.firestore.FieldValue.delete();
+ } else {
+ deck.data.meta.tags = tags;
+ }
+
+ if (userStore.state.user && userStore.state.user.data && userStore.state.user.data.name) {
+ if (!deck.data.meta.author) {
+ deck.data.meta.author = {
+ name: userStore.state.user.data.name,
+ };
+ } else {
+ (deck.data.meta.author as DeckMetaAuthor).name = userStore.state.user.data.name;
+ }
+
+ if (userStore.state.user.data.photo_url) {
+ (deck.data.meta.author as DeckMetaAuthor).photo_url = userStore.state.user.data.photo_url;
+ }
+ } else {
+ if (deck.data.meta.author) {
+ deck.data.meta.author = firebase.firestore.FieldValue.delete();
+ }
+ }
+
+ await this.deckService.update(deck);
+
+ resolve();
} catch (err) {
reject(err);
}
diff --git a/studio/src/app/stores/user.store.ts b/studio/src/app/stores/user.store.ts
new file mode 100644
index 000000000..b00a98160
--- /dev/null
+++ b/studio/src/app/stores/user.store.ts
@@ -0,0 +1,25 @@
+import {createStore} from '@stencil/store';
+
+import {User} from '../models/data/user';
+
+interface UserStore {
+ user: User | undefined;
+ photoUrl: string | undefined;
+ loaded: boolean;
+ name: string | undefined;
+}
+
+const {state, onChange, reset} = createStore({
+ user: undefined,
+ photoUrl: undefined,
+ loaded: false,
+ name: undefined,
+} as UserStore);
+
+onChange('user', (user: User | undefined) => {
+ state.photoUrl = user && user.data ? user.data.photo_url : undefined;
+ state.name = user && user.data ? user.data.name : undefined;
+ state.loaded = true;
+});
+
+export default {state, onChange, reset};
From 92a584fef65cd92ac91c2207a8bdf080ba369f97 Mon Sep 17 00:00:00 2001
From: peterpeterparker
Date: Tue, 30 Jun 2020 18:53:13 +0200
Subject: [PATCH 19/32] feat(#773): add loggedIn information to store
---
studio/src/app/components/core/app-menu/app-menu.tsx | 10 ++++------
.../app-navigation-actions/app-navigation-actions.tsx | 8 +++-----
studio/src/app/stores/auth.store.ts | 3 +++
studio/src/app/utils/core/utils.tsx | 8 +-------
4 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/studio/src/app/components/core/app-menu/app-menu.tsx b/studio/src/app/components/core/app-menu/app-menu.tsx
index 8223719d3..7bdbfcd60 100644
--- a/studio/src/app/components/core/app-menu/app-menu.tsx
+++ b/studio/src/app/components/core/app-menu/app-menu.tsx
@@ -3,8 +3,6 @@ import {Component, Element, h} from '@stencil/core';
import navStore from '../../../stores/nav.store';
import authStore from '../../../stores/auth.store';
-import {Utils} from '../../../utils/core/utils';
-
import {AuthService} from '../../../services/auth/auth.service';
import {NavDirection} from '../../../stores/nav.store';
@@ -53,7 +51,7 @@ export class AppMenu {
}
private renderUser() {
- if (Utils.isLoggedIn(authStore.state.authUser)) {
+ if (authStore.state.loggedIn) {
return (
@@ -65,7 +63,7 @@ export class AppMenu {
}
private renderDashboard() {
- if (Utils.isLoggedIn(authStore.state.authUser)) {
+ if (authStore.state.loggedIn) {
return (
@@ -78,7 +76,7 @@ export class AppMenu {
}
private renderSignInOut() {
- if (Utils.isLoggedIn(authStore.state.authUser)) {
+ if (authStore.state.loggedIn) {
return (
this.signOut()}>
@@ -105,7 +103,7 @@ export class AppMenu {
}
private renderDiscover() {
- if (Utils.isLoggedIn(authStore.state.authUser)) {
+ if (authStore.state.loggedIn) {
return undefined;
}
diff --git a/studio/src/app/components/core/app-navigation-actions/app-navigation-actions.tsx b/studio/src/app/components/core/app-navigation-actions/app-navigation-actions.tsx
index fd7bc7f02..53e0c75f0 100644
--- a/studio/src/app/components/core/app-navigation-actions/app-navigation-actions.tsx
+++ b/studio/src/app/components/core/app-navigation-actions/app-navigation-actions.tsx
@@ -7,8 +7,6 @@ import navStore, {NavDirection} from '../../../stores/nav.store';
import authStore from '../../../stores/auth.store';
import userStore from '../../../stores/user.store';
-import {Utils} from '../../../utils/core/utils';
-
@Component({
tag: 'app-navigation-actions',
styleUrl: 'app-navigation-actions.scss',
@@ -51,7 +49,7 @@ export class AppNavigationActions {
}
private renderFeed() {
- if (Utils.isLoggedIn(authStore.state.authUser) || !this.signIn) {
+ if (authStore.state.loggedIn || !this.signIn) {
return undefined;
} else if (this.presentation || this.publish) {
return (
@@ -63,7 +61,7 @@ export class AppNavigationActions {
}
private renderSignIn() {
- if (Utils.isLoggedIn(authStore.state.authUser) || !this.signIn) {
+ if (authStore.state.loggedIn || !this.signIn) {
return undefined;
} else if (this.presentation || this.publish) {
return (
@@ -75,7 +73,7 @@ export class AppNavigationActions {
}
private renderLoggedIn() {
- if (Utils.isLoggedIn(authStore.state.authUser) && userStore.state.loaded) {
+ if (authStore.state.loggedIn && userStore.state.loaded) {
return (
-
+
Sensibility (detect acceleration above velocity {this.accelerometerSensibility})
@@ -141,12 +139,12 @@ export class AppExperimentalSettings {
max={30}
value={this.accelerometerSensibility}
mode="md"
- disabled={!this.accelerometerEnabled}
+ disabled={!accStore.state.enable}
color="switcher"
onIonChange={(e: CustomEvent) => this.updateAccelerometerSensibility(e)}>
-
+
Delay (after swipe, detect again after {this.accelerometerDelay}ms)
@@ -156,11 +154,11 @@ export class AppExperimentalSettings {
max={2500}
value={this.accelerometerDelay}
mode="md"
- disabled={!this.accelerometerEnabled}
+ disabled={!accStore.state.enable}
color="switcher"
onIonChange={(e: CustomEvent) => this.updateAccelerometerDelay(e)}>
-
+ ,
];
}
}
diff --git a/remote/src/app/pages/app-remote/app-remote.tsx b/remote/src/app/pages/app-remote/app-remote.tsx
index 9608a0ca9..07514084a 100644
--- a/remote/src/app/pages/app-remote/app-remote.tsx
+++ b/remote/src/app/pages/app-remote/app-remote.tsx
@@ -3,10 +3,9 @@ import {alertController, modalController, OverlayEventDetail} from '@ionic/core'
import {isMobile} from '@deckdeckgo/utils';
-import {Subscription} from 'rxjs';
-
import notesStores from '../../stores/notes.store';
import remoteStore from '../../stores/remote.store';
+import accStore from '../../stores/accelerometer.store';
// Types
import {
@@ -66,8 +65,8 @@ export class AppRemote {
@State()
private clientId: string;
- private acceleratorSubscription: Subscription;
- private acceleratorInitSubscription: Subscription;
+ private destroyAcceleratorListener;
+ private destroyAcceleratorInitListener;
private communicationService: CommunicationService;
private accelerometerService: AccelerometerService;
@@ -125,7 +124,7 @@ export class AppRemote {
}
});
- this.acceleratorSubscription = this.accelerometerService.watch().subscribe(async (prev: boolean) => {
+ this.destroyAcceleratorListener = accStore.onChange('trigger', async (prev: boolean) => {
await this.prevNextSlide(prev, false);
setTimeout(async () => {
@@ -133,7 +132,7 @@ export class AppRemote {
}, this.accelerometerService.delay);
});
- this.acceleratorInitSubscription = this.accelerometerService.watchInitialized().subscribe(async (initialized: boolean) => {
+ this.destroyAcceleratorInitListener = accStore.onChange('initialized', async (initialized: boolean) => {
if (initialized) {
const deck: HTMLElement = this.el.querySelector('deckgo-deck');
@@ -194,12 +193,12 @@ export class AppRemote {
this.eventDestroyListener();
}
- if (this.acceleratorSubscription) {
- this.acceleratorSubscription.unsubscribe();
+ if (this.destroyAcceleratorListener) {
+ this.destroyAcceleratorListener();
}
- if (this.acceleratorInitSubscription) {
- this.acceleratorInitSubscription.unsubscribe();
+ if (this.destroyAcceleratorInitListener) {
+ this.destroyAcceleratorInitListener();
}
}
diff --git a/remote/src/app/services/accelerometer/accelerometer.service.tsx b/remote/src/app/services/accelerometer/accelerometer.service.tsx
index 704622f79..be332021b 100644
--- a/remote/src/app/services/accelerometer/accelerometer.service.tsx
+++ b/remote/src/app/services/accelerometer/accelerometer.service.tsx
@@ -1,4 +1,4 @@
-import {BehaviorSubject, Observable, Subject} from 'rxjs';
+import store from '../../stores/accelerometer.store';
import {get, set} from 'idb-keyval';
@@ -13,7 +13,6 @@ interface AccelerometerValues {
export class AccelerometerService {
private static instance: AccelerometerService;
- private enableSubject: BehaviorSubject = new BehaviorSubject(false);
private enable: boolean = false;
private permissionGranted: boolean = false;
@@ -32,10 +31,6 @@ export class AccelerometerService {
private sumAccelerationNext: number = 0;
private sumAccelerationPrev: number = 0;
- private triggerSubject: Subject = new Subject();
-
- private initializedSubject: BehaviorSubject = new BehaviorSubject(false);
-
private constructor() {
// Private constructor, singleton
}
@@ -98,7 +93,7 @@ export class AccelerometerService {
if (this.sensor.x > this.sensibility || this.sensor.x < this.sensibility * -1) {
// We are emitting the direction after a bit of time
if (this.takeValues >= this.takeUntil) {
- this.triggerSubject.next(this.sumAccelerationNext > this.sumAccelerationPrev);
+ store.state.trigger = this.sumAccelerationNext > this.sumAccelerationPrev;
// We are stopping to listen and will start again once the slide transition is done
this.stop();
@@ -123,28 +118,23 @@ export class AccelerometerService {
}
}
- toggle(): Promise {
- return new Promise(async (resolve, reject) => {
- try {
- if (this.enable) {
- this.stop();
- } else {
- await this.askPermission();
- }
-
- this.toggleEnabled(!this.enable);
-
- resolve(this.enable);
- } catch (err) {
- this.toggleEnabled(false);
- reject(err);
+ async toggle() {
+ try {
+ if (this.enable) {
+ this.stop();
+ } else {
+ await this.askPermission();
}
- });
+
+ this.toggleEnabled(!this.enable);
+ } catch (err) {
+ this.toggleEnabled(false);
+ }
}
private toggleEnabled(enabled: boolean) {
this.enable = enabled;
- this.enableSubject.next(this.enable);
+ store.state.enable = this.enable;
}
private askPermission(): Promise {
@@ -172,17 +162,13 @@ export class AccelerometerService {
);
}
- watch(): Observable {
- return this.triggerSubject.asObservable();
- }
-
async save() {
await set('deckdeckgo_accelerometer', {
enable: this.enable,
frequency: this.frequency,
sensibility: this.sensibility,
takeUntil: this.takeUntil,
- delay: this.delay
+ delay: this.delay,
});
}
@@ -199,17 +185,9 @@ export class AccelerometerService {
await this.askPermission();
}
- this.enableSubject.next(this.enable);
+ store.state.enable = this.enable;
}
- this.initializedSubject.next(true);
- }
-
- watchInitialized(): Observable {
- return this.initializedSubject.asObservable();
- }
-
- watchEnabled(): Observable {
- return this.enableSubject.asObservable();
+ store.state.initialized = true;
}
}
diff --git a/remote/src/app/stores/accelerometer.store.ts b/remote/src/app/stores/accelerometer.store.ts
new file mode 100644
index 000000000..e89dd72b1
--- /dev/null
+++ b/remote/src/app/stores/accelerometer.store.ts
@@ -0,0 +1,15 @@
+import {createStore} from '@stencil/store';
+
+interface AccelerometerStore {
+ enable: boolean;
+ initialized: boolean;
+ trigger: boolean | undefined;
+}
+
+const {state, onChange} = createStore({
+ enable: false,
+ initialized: false,
+ trigger: undefined,
+} as AccelerometerStore);
+
+export default {state, onChange};
From 1a19f244cf8f08b32b3e473f5fabdb09f59ebf6a Mon Sep 17 00:00:00 2001
From: peterpeterparker
Date: Tue, 30 Jun 2020 21:18:04 +0200
Subject: [PATCH 31/32] feat(#773): remote rxjs from remote
---
remote/package-lock.json | 8 --------
remote/package.json | 1 -
2 files changed, 9 deletions(-)
diff --git a/remote/package-lock.json b/remote/package-lock.json
index 7a5c8ec90..5c1d55cb7 100644
--- a/remote/package-lock.json
+++ b/remote/package-lock.json
@@ -3926,14 +3926,6 @@
}
}
},
- "rxjs": {
- "version": "6.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
- "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
diff --git a/remote/package.json b/remote/package.json
index 761c7bda0..0282824f3 100644
--- a/remote/package.json
+++ b/remote/package.json
@@ -47,7 +47,6 @@
"date-fns": "^2.14.0",
"idb-keyval": "^3.2.0",
"remarkable": "^2.0.1",
- "rxjs": "^6.5.5",
"socket.io-client": "^2.3.0",
"uuid": "^8.2.0"
},
From 7d9e2d339c9e8065662cf031629f82d208a329f7 Mon Sep 17 00:00:00 2001
From: peterpeterparker
Date: Tue, 30 Jun 2020 21:20:33 +0200
Subject: [PATCH 32/32] feat(#773): remote rxjs from docs
---
docs/package-lock.json | 8 --------
docs/package.json | 3 +--
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/docs/package-lock.json b/docs/package-lock.json
index 3d00cbcdb..f0a8647fb 100644
--- a/docs/package-lock.json
+++ b/docs/package-lock.json
@@ -1535,14 +1535,6 @@
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
},
- "rxjs": {
- "version": "6.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
- "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
"select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
diff --git a/docs/package.json b/docs/package.json
index 9a2770e96..84441d370 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -43,8 +43,7 @@
"@deckdeckgo/social": "^1.0.1",
"@deckdeckgo/youtube": "^1.1.2",
"@ionic/core": "^5.2.2",
- "idb-keyval": "^3.2.0",
- "rxjs": "^6.5.5"
+ "idb-keyval": "^3.2.0"
},
"devDependencies": {
"@deckdeckgo/types": "^1.1.0",