From fa3329abf29ed9eb002382ba5368758eb9d62d70 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Fri, 7 Mar 2025 13:18:08 -0700 Subject: [PATCH] remove duplicate dir with pages --- .../pages/server-routes/acme/acme.module.ts | 18 -- .../pages/server-routes/acme/acme.page.html | 53 ------ .../pages/server-routes/acme/acme.page.scss | 0 .../app/pages/server-routes/acme/acme.page.ts | 179 ------------------ .../pages/server-routes/email/email.module.ts | 42 ---- .../pages/server-routes/email/email.page.html | 70 ------- .../pages/server-routes/email/email.page.scss | 9 - .../pages/server-routes/email/email.page.ts | 83 -------- 8 files changed, 454 deletions(-) delete mode 100644 web/projects/ui/src/app/pages/server-routes/acme/acme.module.ts delete mode 100644 web/projects/ui/src/app/pages/server-routes/acme/acme.page.html delete mode 100644 web/projects/ui/src/app/pages/server-routes/acme/acme.page.scss delete mode 100644 web/projects/ui/src/app/pages/server-routes/acme/acme.page.ts delete mode 100644 web/projects/ui/src/app/pages/server-routes/email/email.module.ts delete mode 100644 web/projects/ui/src/app/pages/server-routes/email/email.page.html delete mode 100644 web/projects/ui/src/app/pages/server-routes/email/email.page.scss delete mode 100644 web/projects/ui/src/app/pages/server-routes/email/email.page.ts diff --git a/web/projects/ui/src/app/pages/server-routes/acme/acme.module.ts b/web/projects/ui/src/app/pages/server-routes/acme/acme.module.ts deleted file mode 100644 index f00171f05..000000000 --- a/web/projects/ui/src/app/pages/server-routes/acme/acme.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { IonicModule } from '@ionic/angular' -import { RouterModule, Routes } from '@angular/router' -import { ACMEPage } from './acme.page' - -const routes: Routes = [ - { - path: '', - component: ACMEPage, - }, -] - -@NgModule({ - imports: [CommonModule, IonicModule, RouterModule.forChild(routes)], - declarations: [ACMEPage], -}) -export class ACMEPageModule {} diff --git a/web/projects/ui/src/app/pages/server-routes/acme/acme.page.html b/web/projects/ui/src/app/pages/server-routes/acme/acme.page.html deleted file mode 100644 index ab7ad3a01..000000000 --- a/web/projects/ui/src/app/pages/server-routes/acme/acme.page.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - ACME - - - - - - - - -

- Register with one or more ACME providers such as Let's Encrypt in - order to generate SSL (https) certificates on-demand for clearnet - hosting - - View instructions - -

-
-
- - Saved Providers - - - - - - Add Provider - - - - - - -

{{ toAcmeName(provider.url) }}

-

Contact: {{ provider.contactString }}

-
- - - - - - - - -
-
-
-
diff --git a/web/projects/ui/src/app/pages/server-routes/acme/acme.page.scss b/web/projects/ui/src/app/pages/server-routes/acme/acme.page.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/web/projects/ui/src/app/pages/server-routes/acme/acme.page.ts b/web/projects/ui/src/app/pages/server-routes/acme/acme.page.ts deleted file mode 100644 index 5416194aa..000000000 --- a/web/projects/ui/src/app/pages/server-routes/acme/acme.page.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { Component } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { PatchDB } from 'patch-db-client' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { DataModel } from '../../../services/patch-db/data-model' -import { FormDialogService } from '../../../services/form-dialog.service' -import { FormComponent } from '../../../components/form.component' -import { configBuilderToSpec } from '../../../util/configBuilderToSpec' -import { ISB, utils } from '@start9labs/start-sdk' -import { knownACME, toAcmeName } from 'src/app/util/acme' -import { map } from 'rxjs' - -@Component({ - selector: 'acme', - templateUrl: 'acme.page.html', - styleUrls: ['acme.page.scss'], -}) -export class ACMEPage { - readonly docsUrl = 'https://docs.start9.com/0.3.6/user-manual/acme' - - acme$ = this.patch.watch$('serverInfo', 'acme').pipe( - map(acme => { - const providerUrls = Object.keys(acme) - return providerUrls.map(url => { - const contact = acme[url].contact.map(mailto => - mailto.replace('mailto:', ''), - ) - return { - url, - contact, - contactString: contact.join(', '), - } - }) - }), - ) - - toAcmeName = toAcmeName - - constructor( - private readonly loader: LoadingService, - private readonly errorService: ErrorService, - private readonly api: ApiService, - private readonly patch: PatchDB, - private readonly formDialog: FormDialogService, - ) {} - - async addAcme( - providers: { - url: string - contact: string[] - contactString: string - }[], - ) { - this.formDialog.open(FormComponent, { - label: 'Add ACME Provider', - data: { - spec: await configBuilderToSpec( - getAddAcmeSpec(providers.map(p => p.url)), - ), - buttons: [ - { - text: 'Save', - handler: async ( - val: ReturnType['_TYPE'], - ) => { - const providerUrl = - val.provider.selection === 'other' - ? val.provider.value.url - : val.provider.selection - - return this.saveAcme(providerUrl, val.contact) - }, - }, - ], - }, - }) - } - - async editAcme(provider: string, contact: string[]) { - this.formDialog.open(FormComponent, { - label: 'Edit ACME Provider', - data: { - spec: await configBuilderToSpec(editAcmeSpec), - buttons: [ - { - text: 'Save', - handler: async (val: typeof editAcmeSpec._TYPE) => - this.saveAcme(provider, val.contact), - }, - ], - value: { contact }, - }, - }) - } - - async removeAcme(provider: string) { - const loader = this.loader.open('Removing').subscribe() - - try { - await this.api.removeAcme({ provider }) - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - private async saveAcme(providerUrl: string, contact: string[]) { - console.log(providerUrl, contact) - const loader = this.loader.open('Saving').subscribe() - - try { - await this.api.initAcme({ - provider: new URL(providerUrl).href, - contact: contact.map(address => `mailto:${address}`), - }) - return true - } catch (e: any) { - this.errorService.handleError(e) - return false - } finally { - loader.unsubscribe() - } - } -} - -const emailListSpec = ISB.Value.list( - ISB.List.text( - { - name: 'Contact Emails', - description: - 'Needed to obtain a certificate from a Certificate Authority', - minLength: 1, - }, - { - inputmode: 'email', - patterns: [utils.Patterns.email], - }, - ), -) - -function getAddAcmeSpec(providers: string[]) { - const availableAcme = knownACME.filter(acme => !providers.includes(acme.url)) - - return ISB.InputSpec.of({ - provider: ISB.Value.union( - { name: 'Provider', default: (availableAcme[0]?.url as any) || 'other' }, - ISB.Variants.of({ - ...availableAcme.reduce( - (obj, curr) => ({ - ...obj, - [curr.url]: { - name: curr.name, - spec: ISB.InputSpec.of({}), - }, - }), - {}, - ), - other: { - name: 'Other', - spec: ISB.InputSpec.of({ - url: ISB.Value.text({ - name: 'URL', - default: null, - required: true, - inputmode: 'url', - patterns: [utils.Patterns.url], - }), - }), - }, - }), - ), - contact: emailListSpec, - }) -} - -const editAcmeSpec = ISB.InputSpec.of({ - contact: emailListSpec, -}) diff --git a/web/projects/ui/src/app/pages/server-routes/email/email.module.ts b/web/projects/ui/src/app/pages/server-routes/email/email.module.ts deleted file mode 100644 index f6b0c735d..000000000 --- a/web/projects/ui/src/app/pages/server-routes/email/email.module.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { NgModule } from '@angular/core' -import { CommonModule } from '@angular/common' -import { Routes, RouterModule } from '@angular/router' -import { TuiInputModule } from '@taiga-ui/kit' -import { - TuiNotificationModule, - TuiTextfieldControllerModule, -} from '@taiga-ui/core' -import { FormsModule, ReactiveFormsModule } from '@angular/forms' -import { EmailPage } from './email.page' -import { FormModule } from 'src/app/components/form/form.module' -import { IonicModule } from '@ionic/angular' -import { TuiErrorModule, TuiModeModule } from '@taiga-ui/core' -import { TuiAppearanceModule, TuiButtonModule } from '@taiga-ui/experimental' - -const routes: Routes = [ - { - path: '', - component: EmailPage, - }, -] - -@NgModule({ - imports: [ - CommonModule, - IonicModule, - RouterModule.forChild(routes), - CommonModule, - FormsModule, - ReactiveFormsModule, - TuiButtonModule, - TuiInputModule, - FormModule, - TuiNotificationModule, - TuiTextfieldControllerModule, - TuiAppearanceModule, - TuiModeModule, - TuiErrorModule, - ], - declarations: [EmailPage], -}) -export class EmailPageModule {} diff --git a/web/projects/ui/src/app/pages/server-routes/email/email.page.html b/web/projects/ui/src/app/pages/server-routes/email/email.page.html deleted file mode 100644 index 5e0e58fa4..000000000 --- a/web/projects/ui/src/app/pages/server-routes/email/email.page.html +++ /dev/null @@ -1,70 +0,0 @@ - - - Email - - - - - - - - - Fill out the form below to connect to an external SMTP server. With your - permission, installed services can use the SMTP server to send emails. To - grant permission to a particular service, visit that service's "Actions" - page. Not all services support sending emails. - - View instructions - - - -
-

SMTP Credentials

- - - -
-
-

Send Test Email

- - To Address - - - -
-
-
diff --git a/web/projects/ui/src/app/pages/server-routes/email/email.page.scss b/web/projects/ui/src/app/pages/server-routes/email/email.page.scss deleted file mode 100644 index b15986fc9..000000000 --- a/web/projects/ui/src/app/pages/server-routes/email/email.page.scss +++ /dev/null @@ -1,9 +0,0 @@ -form { - padding-top: 24px; - margin: auto; - max-width: 30rem; -} - -h3 { - display: flex; -} \ No newline at end of file diff --git a/web/projects/ui/src/app/pages/server-routes/email/email.page.ts b/web/projects/ui/src/app/pages/server-routes/email/email.page.ts deleted file mode 100644 index e52bf32dd..000000000 --- a/web/projects/ui/src/app/pages/server-routes/email/email.page.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { ChangeDetectionStrategy, Component, inject } from '@angular/core' -import { ErrorService, LoadingService } from '@start9labs/shared' -import { IST, inputSpec } from '@start9labs/start-sdk' -import { TuiDialogService } from '@taiga-ui/core' -import { PatchDB } from 'patch-db-client' -import { switchMap, tap } from 'rxjs' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { FormService } from 'src/app/services/form.service' -import { DataModel } from 'src/app/services/patch-db/data-model' -import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' - -@Component({ - selector: 'email-page', - templateUrl: './email.page.html', - styleUrls: ['./email.page.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class EmailPage { - private readonly dialogs = inject(TuiDialogService) - private readonly loader = inject(LoadingService) - private readonly errorService = inject(ErrorService) - private readonly formService = inject(FormService) - private readonly patch = inject>(PatchDB) - private readonly api = inject(ApiService) - - isSaved = false - testAddress = '' - - readonly spec: Promise = configBuilderToSpec( - inputSpec.constants.customSmtp, - ) - readonly form$ = this.patch.watch$('serverInfo', 'smtp').pipe( - tap(value => (this.isSaved = !!value)), - switchMap(async value => - this.formService.createForm(await this.spec, value), - ), - ) - - async save( - value: typeof inputSpec.constants.customSmtp._TYPE | null, - ): Promise { - const loader = this.loader.open('Saving...').subscribe() - - try { - if (value) { - await this.api.setSmtp(value) - this.isSaved = true - } else { - await this.api.clearSmtp({}) - this.isSaved = false - } - } catch (e: any) { - this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - } - - async sendTestEmail(value: typeof inputSpec.constants.customSmtp._TYPE) { - const loader = this.loader.open('Sending email...').subscribe() - - try { - await this.api.testSmtp({ - to: this.testAddress, - ...value, - }) - } catch (e: any) { - return this.errorService.handleError(e) - } finally { - loader.unsubscribe() - } - - this.dialogs - .open( - `A test email has been sent to ${this.testAddress}.

Check your spam folder and mark as not spam`, - { - label: 'Success', - size: 's', - }, - ) - .subscribe() - } -}