diff --git a/declaration.d.ts b/declaration.d.ts index 0292a33..92bdf7d 100644 --- a/declaration.d.ts +++ b/declaration.d.ts @@ -1 +1,9 @@ declare module "*.scss"; +declare var __CONFIG__: SettingType; + +type SettingType = { + apiUrl: string; + apiVersion: string; + ssl: string; + appName: string; +}; diff --git a/src/common/core/BaseElement/BaseElement.ts b/src/common/core/BaseElement/BaseElement.ts index 9c66ff8..a4abdc4 100644 --- a/src/common/core/BaseElement/BaseElement.ts +++ b/src/common/core/BaseElement/BaseElement.ts @@ -1,5 +1,10 @@ import { html, render, TemplateResult } from "@github/jtml"; -import { AppMainElement, AppModalElement, AppRootElement } from "components/"; +import { + AppLoaderElement, + AppMainElement, + AppModalElement, + AppRootElement, +} from "components/"; import { AppService, RouterService } from "core/services"; import { AuthStore } from "core/store"; import { closest } from "core/utils"; @@ -33,6 +38,9 @@ class BaseElement extends HTMLElement { public get mainRoot(): AppRootElement { return this.appMain?.mainRoot; } + public get appLoader(): AppLoaderElement { + return this.appMain?.appLoader; + } public get isAuth(): boolean { return this.appMain?.isAuth(); diff --git a/src/components/app-loader/AppLoaderElement.ts b/src/components/app-loader/AppLoaderElement.ts new file mode 100644 index 0000000..f2c0bc7 --- /dev/null +++ b/src/components/app-loader/AppLoaderElement.ts @@ -0,0 +1,63 @@ +import { controller, target } from "@github/catalyst"; +import { html } from "@github/jtml"; +import { BaseComponentElement } from "common/"; + +@controller +class AppLoaderElement extends BaseComponentElement { + private finished: boolean = true; + private _loading: number = 0; + + constructor() { + super(); + } + + public start = () => { + this.finished = false; + this._loading++; + this.update(); + }; + + public stop = () => { + if (this._loading > 0) { + this._loading--; + } + console.log(this._loading); + if (this._loading == 0) { + this.finishInitiate(); + } + this.update(); + }; + + public get loading() { + return this._loading > 0; + } + + private finishInitiate = () => { + setTimeout(() => { + this.finished = true; + this.update(); + }, 300); + }; + + elementConnected = (): void => { + this.update(); + }; + + public setFinished = () => {}; + + render = () => { + const renderLoader = (finished: boolean, loading: boolean) => { + if (!finished && !loading) { + console.log("Removing"); + return html`
`; + } else if (loading) { + console.log("loading"); + return html``; + } + return html``; + }; + return html`${renderLoader(this.finished, this.loading)}`; + }; +} + +export type { AppLoaderElement }; diff --git a/src/components/app-main/AppMainElement.ts b/src/components/app-main/AppMainElement.ts index ce9e043..92c4311 100644 --- a/src/components/app-main/AppMainElement.ts +++ b/src/components/app-main/AppMainElement.ts @@ -3,6 +3,7 @@ import { AppService, HttpClient, RouterService } from "core/services"; import { AuthStore } from "core/store"; import { AppModalElement, AppRootElement } from "components/"; import { closest } from "core/utils"; +import { AppLoaderElement } from "components/app-loader/AppLoaderElement"; @controller class AppMainElement extends HTMLElement { @@ -12,6 +13,7 @@ class AppMainElement extends HTMLElement { public appService: AppService; @target appModal: AppModalElement; @target mainRoot: AppRootElement; + @target appLoader: AppLoaderElement; @closest appMain: AppMainElement; public domEvents: any = { routechanged: new Event("routechanged"), @@ -24,6 +26,7 @@ class AppMainElement extends HTMLElement { } connectedCallback() { if (this.appMain !== this) return; + this.createLoader(); const mainRoot = this.createMainRoot(); this.httpClient = new HttpClient(); this.appService = new AppService(this, this.httpClient); @@ -129,6 +132,12 @@ class AppMainElement extends HTMLElement { return _appModal; }; + private createLoader = () => { + const _loader = document.createElement("app-loader"); + _loader.setAttribute("data-target", "app-main.appLoader"); + this.appendChild(_loader); + }; + private createModalContent = (element: string) => { const _modalElement = document.createElement(element); const _divEl = document.createElement("div"); diff --git a/src/components/app-menu/AppMenuElement.ts b/src/components/app-menu/AppMenuElement.ts index e4a6c12..a3bd451 100644 --- a/src/components/app-menu/AppMenuElement.ts +++ b/src/components/app-menu/AppMenuElement.ts @@ -132,7 +132,7 @@ class AppMenuElement extends BaseComponentElement { return html`