+ These are all the currently supported providers that are available
+ to add. Select one to start:
+
+
+ ${this.availableProviders.map(
+ (provider) => html`
+
+ `,
+ )}
+
+ `,
+ ),
+ Match.tag(
+ "WaitingToConnect",
+ ({ metadata }) => html`
+
+ ${this.availableFolders.map(
+ (folder) =>
+ html``,
+ )}
+
`,
- pending: () => html`
+ item: (status) => html`
+
+ ${map(
+ status,
+ ([providerId, providerStatus]) => html`
-
- `,
- ),
+ `,
+ )}
+
+
+ ${this._renderAddProviderModal()}
+ `,
complete: () => nothing,
error: () => nothing,
});
@@ -116,6 +142,22 @@ export class AllProvidersStatusBar extends LitElement {
Match.orElse(() => `Syncing ${providerId}`),
);
}
+
+ private _renderAddProviderModal() {
+ return html`
+
+ `;
+ }
+
+ // --- Event handlers ---
+ private _onAddProviderClick() {
+ this._addProviderDialog.showModal();
+ }
}
declare global {
diff --git a/packages/web/package.json b/packages/web/package.json
index 0710bc2..371b9a7 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -11,7 +11,6 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
- "@echo/components-add-provider": "^1.0.0",
"@echo/components-library": "^1.0.0",
"@echo/components-player": "^1.0.0",
"@echo/components-provider-status": "^1.0.0",
diff --git a/packages/web/src/main.ts b/packages/web/src/main.ts
index f31b1a4..8ca4a9d 100644
--- a/packages/web/src/main.ts
+++ b/packages/web/src/main.ts
@@ -1,11 +1,14 @@
import { LitElement, css, html } from "lit";
-import { customElement } from "lit/decorators.js";
-import { AppInit } from "@echo/core-types";
-import { EffectConsumer } from "@echo/components-shared-controllers";
-import "@echo/components-add-provider";
+import { customElement, query } from "lit/decorators.js";
+import { AppInit, MediaProviderStatus } from "@echo/core-types";
+import {
+ EffectConsumer,
+ StreamConsumer,
+} from "@echo/components-shared-controllers";
import "@echo/components-library";
import "@echo/components-player";
import "@echo/components-provider-status";
+import { cache } from "lit/directives/cache.js";
/**
* Root element of the application.
@@ -13,34 +16,118 @@ import "@echo/components-provider-status";
@customElement("app-root")
export class MyElement extends LitElement {
private _init = new EffectConsumer(this, AppInit.init);
+ private _providerStatus = new StreamConsumer(
+ this,
+ MediaProviderStatus.observe,
+ );
+
+ @query("#add-provider")
+ private _addProviderDialog!: HTMLDialogElement;
static styles = css`
header {
display: flex;
- justify-content: space-between;
+ justify-content: flex-end;
align-items: center;
padding: 0 1rem;
}
+
+ button {
+ margin-top: 10px;
+ padding: 5px 10px;
+ background-color: #fff;
+ color: #000;
+ border: 1px solid #000;
+ cursor: pointer;
+ font-size: 1em;
+ text-transform: uppercase;
+ }
+
+ button:hover {
+ background-color: #000;
+ color: #fff;
+ }
+
+ dialog[open] {
+ display: flex;
+ flex-direction: column;
+ height: 50%;
+ width: 50%;
+ }
+
+ dialog[open]::backdrop {
+ background-color: rgb(0 0 0 / 75%);
+ }
+
+ dialog .dismiss {
+ align-self: flex-end;
+ padding: 0.5rem;
+ font-size: 1.5rem;
+ background: none;
+ border: none;
+ }
`;
render() {
- return this._init.render({
- initial: () => html`
Initializing Echo...
`,
- complete: () => html`
-
- `,
- error: () =>
- html`
- Ooops, something went wrong. Please report it!
-
`,
- });
+ return html`
+ ${this._init.render({
+ initial: () => html`
Initializing Echo...
`,
+ complete: () =>
+ cache(
+ this._providerStatus.render({
+ item: (status) =>
+ status.size > 0
+ ? this._renderMainPage()
+ : html`
+
+
Welcome to Echo!
+
+ Echo is a library manager and music player that can
+ stream from a variety of different sources.
+
+
To get started, add a provider:
+
+
+ `,
+ }),
+ ),
+ error: () =>
+ html`
+ Ooops, something went wrong. Please report it!
+
`,
+ })}
+ ${this._renderAddProviderModal()}
+ `;
+ }
+
+ private _renderMainPage() {
+ return html`
+
+ `;
+ }
+
+ private _renderAddProviderModal() {
+ return html`
+
+ `;
+ }
+
+ // --- Event handlers ---
+ private _onAddProviderClick() {
+ this._addProviderDialog.showModal();
}
}