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

Commit acbdff0

Browse files
feat: storage files refresh and load (#1415)
* feat: add refresh button on storage Signed-off-by: peterpeterparker <[email protected]> * feat: load assets on async login Signed-off-by: peterpeterparker <[email protected]>
1 parent 452f432 commit acbdff0

File tree

4 files changed

+67
-21
lines changed

4 files changed

+67
-21
lines changed

studio/src/app/components/core/storage/app-storage-files/app-storage-files.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import {Component, ComponentInterface, EventEmitter, h, Host, State, Event, Prop, Watch} from '@stencil/core';
1+
import {Component, ComponentInterface, EventEmitter, h, Host, State, Event, Prop, Watch, Method} from '@stencil/core';
22

3-
import {StorageFile, StorageFilesList} from '@deckdeckgo/editor';
3+
import {AuthUser, StorageFile, StorageFilesList} from '@deckdeckgo/editor';
44

55
import store from '../../../../stores/error.store';
66
import i18n from '../../../../stores/i18n.store';
77

88
import {Constants} from '../../../../types/core/constants';
99

1010
import {getFiles} from '../../../../providers/storage/storage.provider';
11+
import authStore from '../../../../stores/auth.store';
1112

1213
@Component({
1314
tag: 'app-storage-files',
@@ -34,15 +35,26 @@ export class AppStorageFiles implements ComponentInterface {
3435
@Event()
3536
selectAsset: EventEmitter<StorageFile>;
3637

37-
componentWillLoad() {
38-
this.search().then(() => {});
38+
private destroyListener;
39+
40+
async componentDidLoad() {
41+
this.destroyListener = authStore.onChange('authUser', async (_authUser: AuthUser | null) => {
42+
await this.search();
43+
});
44+
45+
await this.search();
46+
}
47+
48+
disconnectedCallback() {
49+
this.destroyListener?.();
3950
}
4051

4152
@Watch('folder')
4253
async onFolderChange() {
4354
await this.resetAndSearch();
4455
}
4556

57+
@Method()
4658
async resetAndSearch() {
4759
this.disableInfiniteScroll = false;
4860
this.files = [];
@@ -52,6 +64,10 @@ export class AppStorageFiles implements ComponentInterface {
5264
}
5365

5466
private async search() {
67+
if (!authStore.state.loggedIn) {
68+
return;
69+
}
70+
5571
const {items, nextPageToken}: StorageFilesList = await this.loadFiles();
5672

5773
this.files = [...this.files, ...items];

studio/src/app/pages/core/app-storage/app-storage.scss

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
@use "../../../../global/theme/mixins/button";
2+
13
app-storage {
24
app-storage-files {
35
grid-template-columns: repeat(8, calc((100% - (7 * 32px)) / 8));
@@ -11,12 +13,25 @@ app-storage {
1113
}
1214
}
1315

14-
div.select {
15-
width: fit-content;
16-
margin: 16px 0 8px;
16+
div.filter {
17+
display: flex;
18+
align-items: center;
19+
20+
margin: 16px 16px 4px 0;
21+
22+
div.select {
23+
margin: 0 8px 0 0;
24+
25+
ion-select {
26+
background: white;
27+
}
28+
}
29+
30+
button.refresh {
31+
@include button.action;
1732

18-
ion-select {
19-
background: white;
33+
padding: 6px;
34+
border-radius: 50%;
2035
}
2136
}
2237
}

studio/src/app/pages/core/app-storage/app-storage.tsx

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {renderI18n} from '../../../utils/core/i18n.utils';
99
import {signIn} from '../../../utils/core/signin.utils';
1010

1111
import {ImageEvents} from '../../../events/core/image/image.events';
12+
import {AppIcon} from '../../../components/core/app-icon/app-icon';
1213

1314
@Component({
1415
tag: 'app-storage',
@@ -25,6 +26,8 @@ export class AppStorage implements ComponentInterface {
2526

2627
private imageEvents: ImageEvents = new ImageEvents();
2728

29+
private storageFilesRef: HTMLAppStorageFilesElement | undefined;
30+
2831
constructor() {
2932
this.debounceLoading = debounce(() => (this.loading = false), 750);
3033
}
@@ -76,24 +79,35 @@ export class AppStorage implements ComponentInterface {
7679

7780
{this.renderFilter()}
7881

79-
<app-storage-files class="ion-padding-top ion-padding-bottom" folder={this.folder} admin={true}></app-storage-files>
82+
<app-storage-files
83+
class="ion-padding-top ion-padding-bottom"
84+
folder={this.folder}
85+
admin={true}
86+
ref={(el) => (this.storageFilesRef = el as HTMLAppStorageFilesElement)}></app-storage-files>
8087
</Fragment>
8188
);
8289
}
8390

8491
private renderFilter() {
8592
return (
86-
<div class="select">
87-
<ion-select
88-
value={'images'}
89-
placeholder={i18n.state.editor.list}
90-
onIonChange={($event: CustomEvent) => (this.folder = $event.detail.value)}
91-
interface="popover"
92-
mode="md"
93-
class="ion-padding-start ion-padding-end">
94-
<ion-select-option value="images">Images</ion-select-option>
95-
<ion-select-option value="data">Data</ion-select-option>
96-
</ion-select>
93+
<div class="filter">
94+
<div class="select">
95+
<ion-select
96+
value={'images'}
97+
placeholder={i18n.state.editor.list}
98+
onIonChange={($event: CustomEvent) => (this.folder = $event.detail.value)}
99+
interface="popover"
100+
mode="md"
101+
class="ion-padding-start ion-padding-end">
102+
<ion-select-option value="images">Images</ion-select-option>
103+
<ion-select-option value="data">Data</ion-select-option>
104+
</ion-select>
105+
</div>
106+
107+
<button class="ion-activatable refresh" onClick={async () => await this.storageFilesRef?.resetAndSearch()}>
108+
<ion-ripple-effect></ion-ripple-effect>
109+
<AppIcon name="sync" ariaLabel={i18n.state.core.close}></AppIcon>
110+
</button>
97111
</div>
98112
);
99113
}

studio/src/components.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ export namespace Components {
367367
interface AppStorageFiles {
368368
"admin": boolean;
369369
"folder": 'data' | 'images';
370+
"resetAndSearch": () => Promise<void>;
370371
}
371372
interface AppStorageImages {
372373
}

0 commit comments

Comments
 (0)