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

Commit 77749d4

Browse files
Merge pull request #291 from deckgo/slide-delete-if-published
fix(#243): if deck is published, delete slide in the API too
2 parents 3bca814 + 3f97205 commit 77749d4

File tree

2 files changed

+47
-34
lines changed

2 files changed

+47
-34
lines changed

studio/src/app/components/editor/app-editor-toolbar/app-editor-toolbar.tsx

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import {isFullscreen} from '@deckdeckgo/utils';
88

99
import {IonControllerUtils} from '../../../utils/core/ion-controller-utils';
1010

11-
import {Deck} from '../../../models/data/deck';
12-
1311
import {ImageHelper} from '../../../helpers/editor/image.helper';
1412

1513
import {ToggleSlotUtils} from '../../../utils/editor/toggle-slot.utils';
@@ -21,7 +19,6 @@ import {ImageAction} from '../../../popovers/editor/app-image/image-action';
2119

2220
import {BusyService} from '../../../services/editor/busy/busy.service';
2321
import {AnonymousService} from '../../../services/editor/anonymous/anonymous.service';
24-
import {DeckEditorService} from '../../../services/editor/deck/deck-editor.service';
2522

2623
@Component({
2724
tag: 'app-editor-toolbar',
@@ -84,16 +81,9 @@ export class AppEditorToolbar {
8481

8582
@Event() signIn: EventEmitter<void>;
8683

87-
private deckEditorSubscription: Subscription;
88-
private deckEditorService: DeckEditorService;
89-
90-
@State()
91-
private deckPublished: boolean = false;
92-
9384
constructor() {
9485
this.busyService = BusyService.getInstance();
9586
this.anonymousService = AnonymousService.getInstance();
96-
this.deckEditorService = DeckEditorService.getInstance();
9787
}
9888

9989
async componentWillLoad() {
@@ -104,10 +94,6 @@ export class AppEditorToolbar {
10494
this.moveToolbarSubscription = this.moveToolbarSubject.pipe(debounceTime(250)).subscribe(async () => {
10595
await this.moveToolbar();
10696
});
107-
108-
this.deckEditorSubscription = this.deckEditorService.watch().subscribe(async (deck: Deck) => {
109-
this.deckPublished = deck && deck.data && deck.data.meta && deck.data.meta.published;
110-
});
11197
}
11298

11399
async componentDidLoad() {
@@ -123,10 +109,6 @@ export class AppEditorToolbar {
123109
this.moveToolbarSubscription.unsubscribe();
124110
}
125111

126-
if (this.deckEditorSubscription) {
127-
this.deckEditorSubscription.unsubscribe();
128-
}
129-
130112
this.removeWindowResize();
131113
}
132114

@@ -908,15 +890,10 @@ export class AppEditorToolbar {
908890
}
909891

910892
private renderDelete() {
911-
if (this.deckOrSlide && this.deckPublished) {
912-
// TODO: (#243) Currently we can't delete a published slide
913-
return <span style={{"margin-left": "auto"}}></span>;
914-
} else {
915-
return <a onClick={() => this.deleteElement()} title="Delete"
916-
class={this.deckBusy && this.deckOrSlide ? "delete disabled" : "delete"}>
917-
<ion-icon name="trash"></ion-icon>
918-
</a>
919-
}
893+
return <a onClick={() => this.deleteElement()} title="Delete"
894+
class={this.deckBusy && this.deckOrSlide ? "delete disabled" : "delete"}>
895+
<ion-icon name="trash"></ion-icon>
896+
</a>
920897
}
921898

922899
private renderColor() {

studio/src/app/handlers/editor/events/deck/deck-events.handler.tsx

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {DeckEditorService} from '../../../../services/editor/deck/deck-editor.se
1818
import {AuthService} from '../../../../services/auth/auth.service';
1919
import {DeckService} from '../../../../services/data/deck/deck.service';
2020
import {SlideService} from '../../../../services/data/slide/slide.service';
21+
import {ApiSlideService} from '../../../../services/api/slide/api.slide.service';
2122

2223
export class DeckEventsHandler {
2324

@@ -39,6 +40,8 @@ export class DeckEventsHandler {
3940
private deckService: DeckService;
4041
private slideService: SlideService;
4142

43+
private apiSlideService: ApiSlideService;
44+
4245
constructor() {
4346
this.errorService = ErrorService.getInstance();
4447
this.busyService = BusyService.getInstance();
@@ -49,6 +52,8 @@ export class DeckEventsHandler {
4952

5053
this.deckService = DeckService.getInstance();
5154
this.slideService = SlideService.getInstance();
55+
56+
this.apiSlideService = ApiSlideService.getInstance();
5257
}
5358

5459
init(el: HTMLElement): Promise<void> {
@@ -457,15 +462,24 @@ export class DeckEventsHandler {
457462

458463
this.deckEditorService.watch().pipe(take(1)).subscribe(async (deck: Deck) => {
459464
if (deck && deck.data) {
460-
await this.slideService.delete(deck.id, slideId);
465+
const slide: Slide = await this.slideService.get(deck.id, slideId);
466+
467+
if (slide && slide.data) {
468+
// 1. If needed, delete slide in the API
469+
await this.deleteApiSlide(deck, slide);
461470

462-
// TODO: Ultimately should be moved in a Cloud Function
463-
// Update list of slide in the deck
464-
if (deck.data.slides && deck.data.slides.indexOf(slideId) > -1) {
465-
deck.data.slides.splice(deck.data.slides.indexOf(slideId), 1);
471+
// TODO: no rush but ultimately maybe should we move step 2. and 3. below in a cloud function?
466472

467-
const updatedDeck: Deck = await this.deckService.update(deck);
468-
this.deckEditorService.next(updatedDeck);
473+
// 2. Delete the slide in Firestore
474+
await this.slideService.delete(deck.id, slideId);
475+
476+
// 3. Update list of slide in the deck (in Firestore)
477+
if (deck.data.slides && deck.data.slides.indexOf(slideId) > -1) {
478+
deck.data.slides.splice(deck.data.slides.indexOf(slideId), 1);
479+
480+
const updatedDeck: Deck = await this.deckService.update(deck);
481+
this.deckEditorService.next(updatedDeck);
482+
}
469483
}
470484
}
471485

@@ -483,6 +497,28 @@ export class DeckEventsHandler {
483497
});
484498
}
485499

500+
private deleteApiSlide(deck: Deck, slide: Slide): Promise<void> {
501+
return new Promise<void>(async (resolve, reject) => {
502+
if (!deck.data.api_id || deck.data.api_id === undefined || deck.data.api_id === '') {
503+
resolve();
504+
return;
505+
}
506+
507+
if (!slide.data.api_id || slide.data.api_id === undefined || slide.data.api_id === '') {
508+
resolve();
509+
return;
510+
}
511+
512+
try {
513+
await this.apiSlideService.delete(deck.data.api_id, slide.data.api_id);
514+
515+
resolve();
516+
} catch (err) {
517+
reject(err);
518+
}
519+
});
520+
}
521+
486522
private deleteSlideElement(): Promise<void> {
487523
return new Promise<void>(async (resolve) => {
488524
const deck: HTMLElement = this.el.querySelector('deckgo-deck');

0 commit comments

Comments
 (0)