From 8afd4a81b092dc0fd5ec771c41fa5429b43a9c93 Mon Sep 17 00:00:00 2001 From: chatenium Date: Fri, 17 Apr 2026 17:55:42 +0200 Subject: [PATCH] 3.0 Beta 8 --- package-lock.json | 8 +- package.json | 2 +- public/i18n/en.json | 67 ++++++- src/app/chat/chat.html | 3 + src/app/chat/chat.scss | 1 + src/app/chat/dm-list/dm-list.html | 18 +- src/app/chat/dm-list/dm-list.ts | 29 +-- src/app/chat/dm/dm.html | 2 +- src/app/chat/dm/dm.ts | 10 +- src/app/chat/elements/messages/messages.html | 174 ++++++++++-------- src/app/chat/elements/messages/messages.scss | 24 ++- src/app/chat/elements/messages/messages.ts | 6 +- src/app/chat/network-list/network-list.ts | 27 +-- src/app/chat/network/channel/text/text.html | 2 +- src/app/chat/network/channel/text/text.ts | 7 +- src/app/chat/network/network.html | 84 ++++++--- src/app/chat/network/network.scss | 12 ++ src/app/chat/network/network.ts | 14 +- .../network/settings/overview/overview.html | 114 ++++++++++++ .../network/settings/overview/overview.scss | 31 ++++ .../settings/overview/overview.spec.ts | 22 +++ .../network/settings/overview/overview.ts | 79 ++++++++ src/app/chat/network/settings/settings.html | 29 +++ src/app/chat/network/settings/settings.scss | 37 ++++ .../chat/network/settings/settings.spec.ts | 22 +++ src/app/chat/network/settings/settings.ts | 150 +++++++++++++++ src/app/chat/picture-list/picture-list.ts | 26 +-- src/app/service-manager.ts | 2 + src/environments/environment.development.ts | 2 +- src/environments/environment.ts | 2 +- 30 files changed, 834 insertions(+), 172 deletions(-) create mode 100644 src/app/chat/network/settings/overview/overview.html create mode 100644 src/app/chat/network/settings/overview/overview.scss create mode 100644 src/app/chat/network/settings/overview/overview.spec.ts create mode 100644 src/app/chat/network/settings/overview/overview.ts create mode 100644 src/app/chat/network/settings/settings.html create mode 100644 src/app/chat/network/settings/settings.scss create mode 100644 src/app/chat/network/settings/settings.spec.ts create mode 100644 src/app/chat/network/settings/settings.ts diff --git a/package-lock.json b/package-lock.json index 6b542bb..a2673cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@angular/platform-browser": "^21.2.0", "@angular/router": "^21.2.0", "@angular/service-worker": "^21.2.0", - "@chatenium/chatenium-sdk": "^1.1.11", + "@chatenium/chatenium-sdk": "^1.2.0", "@fortawesome/angular-fontawesome": "^4.0.0", "@fortawesome/free-brands-svg-icons": "^7.1.0", "@fortawesome/free-solid-svg-icons": "^7.1.0", @@ -1011,9 +1011,9 @@ } }, "node_modules/@chatenium/chatenium-sdk": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@chatenium/chatenium-sdk/-/chatenium-sdk-1.1.11.tgz", - "integrity": "sha512-iwYHyED1AnGcWtyeVo+R1JfxVauuIC5FCX8Rk6RwF+ls/oUIg1aExFgvif2wc0qUyT9mla8ztBt+wBB/cTy4hA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@chatenium/chatenium-sdk/-/chatenium-sdk-1.2.0.tgz", + "integrity": "sha512-myNvjsMbxRji6MEHufhgEbCmltLL+Azb2UUA+ovUDuf5+LcdYiLYcIF4A4/NAxRVYx3IcPB4uOVF2f5SqW2sLA==", "dependencies": { "@faker-js/faker": "^10.4.0", "axios": "^1.14.0", diff --git a/package.json b/package.json index c71fb6c..a31fcd5 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@angular/platform-browser": "^21.2.0", "@angular/router": "^21.2.0", "@angular/service-worker": "^21.2.0", - "@chatenium/chatenium-sdk": "^1.1.11", + "@chatenium/chatenium-sdk": "^1.2.0", "@fortawesome/angular-fontawesome": "^4.0.0", "@fortawesome/free-brands-svg-icons": "^7.1.0", "@fortawesome/free-solid-svg-icons": "^7.1.0", diff --git a/public/i18n/en.json b/public/i18n/en.json index e33d5c0..610661c 100644 --- a/public/i18n/en.json +++ b/public/i18n/en.json @@ -1,5 +1,5 @@ { - "version": "Chatenium Nexum 3.0 Beta 7 (April 15, 2026)", + "version": "Chatenium Nexum 3.0 Beta 8 (April 17, 2026)", "ok": "Ok", "back": "Back", "aChatProgram": "A messaging platform that you can trust.", @@ -103,12 +103,71 @@ "tab3": "Pictures", "tab4": "Settings" }, + "network": { + "tabs": { + "channels": "Channels", + "members": "Members", + "settings": "Settings" + }, + "settings": { + "options": { + "categories": { + "apps": "Apps", + "moderation": "Moderation", + "community": "Community" + }, + "overview": "Overview", + "rank": "Ranks", + "emoji": "Emojis", + "embed": "Embed", + "invite": "Invites", + "webhook": "Webhooks", + "bots": "Bots", + "activityHistory": "Activity history", + "bans": "Bans", + "communityChannels": "Community channels", + "networkIntroducer": "Network introducer", + "members": "Members" + }, + "overviewPage": { + "networkPicture": "Network picture", + "networkName": "Network name", + "networkVisibility": "Network visibility", + "uploadNewPicture": "Upload new picture", + "setNewName": "Set new name", + "changeToPrivate": "Change to private", + "changeToPrivateDialog": { + "label": "You are about to make your network private", + "warn": { + "1": "Your network will be delisted from Network Discovery.", + "2": "Users will no longer be able to freely join your network without an invite.", + "3": "Your broadcasts may be unavailable to users outside your network." + } + }, + "changeToPublic": "Change to public", + "changeToPublicDialog": { + "label": "You are about to make your network public", + "warn": { + "1": "Your network will be listed in Network Discovery.", + "2": "Users will be able to freely join your network without an invite.", + "3": "Your broadcasts will be available to users outside your network." + } + }, + "setNewNameDialog": { + "label": "New name" + } + } + } + }, "changeLogDialog": { "label": "Chatenium has been updated", "changeLog": { - "1": "Added progress bar to files when uploading attachments", - "2": "Bug fixes related to sending messages", - "3": "Fixed scrolling issues when switching chats. Also now the scroll position is now saved" + "1": "Optimized the loading of chats and networks", + "2": "Added skeleton loaders for messages inside DMs and channels", + "3": "Added tabs in networks", + "4": "Added option to edit network name", + "5": "Added option to change network visibility", + "6": "Fixed overflow issues in the mobile UI" } }, "chatnav": { diff --git a/src/app/chat/chat.html b/src/app/chat/chat.html index 9406d90..f262ec7 100644 --- a/src/app/chat/chat.html +++ b/src/app/chat/chat.html @@ -5,6 +5,9 @@
  • {{ "chat.changeLogDialog.changeLog.1"|translate }}
  • {{ "chat.changeLogDialog.changeLog.2"|translate }}
  • {{ "chat.changeLogDialog.changeLog.3"|translate }}
  • +
  • {{ "chat.changeLogDialog.changeLog.4"|translate }}
  • +
  • {{ "chat.changeLogDialog.changeLog.5"|translate }}
  • +
  • {{ "chat.changeLogDialog.changeLog.6"|translate }}
  • @if (serviceManager.chatsStatus() == LoadStatus.updating) {
    - - {{"updating"|translate}} + + {{ "updating"|translate }}
    } @for (chat of serviceManager.chats(); track chat.chatid) { - + + + + -
    - - - - - - - - - + } } + } diff --git a/src/app/chat/elements/messages/messages.scss b/src/app/chat/elements/messages/messages.scss index 92109c1..6484990 100644 --- a/src/app/chat/elements/messages/messages.scss +++ b/src/app/chat/elements/messages/messages.scss @@ -17,6 +17,24 @@ .bubble { background: var(--tui-background-accent-1-hover); } + + &.chained_start { + .bubble { + border-radius: 10px 25px 10px 10px !important; + } + } + + &.chained_middle { + .bubble { + border-radius: 10px !important; + } + } + + &.chained_end { + .bubble { + border-radius: 10px 10px 25px 10px !important; + } + } } &.chained_start { @@ -31,7 +49,7 @@ } .bubble { - border-radius: 10px 25px 10px 10px !important; + border-radius: 25px 10px 10px 10px !important; } } @@ -43,7 +61,7 @@ &.chained_end { .bubble { - border-radius: 10px 10px 25px 10px !important; + border-radius: 10px 10px 10px 25px !important; } } @@ -65,7 +83,7 @@ padding: 10px; .message-text { - white-space: none; + white-space: break-spaces; overflow-wrap: anywhere; } } diff --git a/src/app/chat/elements/messages/messages.ts b/src/app/chat/elements/messages/messages.ts index 104a663..0cfea87 100644 --- a/src/app/chat/elements/messages/messages.ts +++ b/src/app/chat/elements/messages/messages.ts @@ -18,7 +18,7 @@ import {TranslatePipe} from '@ngx-translate/core'; import {MessageBoxViewModel} from '../message-box/message-box-viewmodel'; import {FileDataWithPreview} from '../message-box/message-box'; import {Attachment} from '@chatenium/chatenium-sdk/domain/common.schema'; -import {TuiProgressCircle} from '@taiga-ui/kit'; +import {TuiProgressCircle, TuiSkeleton} from '@taiga-ui/kit'; @Component({ selector: 'messages', @@ -34,7 +34,8 @@ import {TuiProgressCircle} from '@taiga-ui/kit'; TuiDataListComponent, TuiGroup, TuiIcon, - TuiProgressCircle + TuiProgressCircle, + TuiSkeleton ], templateUrl: './messages.html', styleUrl: './messages.scss', @@ -44,6 +45,7 @@ export class Messages { messages = input.required() messageBoxViewModel = input.required() + loading = input(false) @Output() onDelete = new EventEmitter() diff --git a/src/app/chat/network-list/network-list.ts b/src/app/chat/network-list/network-list.ts index 69a88e2..a7a0481 100644 --- a/src/app/chat/network-list/network-list.ts +++ b/src/app/chat/network-list/network-list.ts @@ -3,7 +3,6 @@ import {IndexedDB} from '../../storage/indexed-db'; import {Router, RouterLink} from '@angular/router'; import {LoadStatus, ServiceManager} from '../../service-manager'; import {TUI_BREAKPOINT, TuiButton, TuiLoader} from '@taiga-ui/core'; -import {ChatService} from '@chatenium/chatenium-sdk/services/chatService'; import {NetworkService} from '@chatenium/chatenium-sdk/services/networkService'; import {Oimg} from '../elements/oimg/oimg'; import {TranslatePipe} from '@ngx-translate/core'; @@ -31,18 +30,20 @@ export class NetworkList implements OnInit { async ngOnInit() { this.serviceManager.networkService = new NetworkService(this.userid(), this.token(), "", this.indexedDb.getApi(), () => {}) - try { - this.serviceManager.networks.set(await this.serviceManager.networkService.getQuick()) - this.serviceManager.networksStatus.set(LoadStatus.updating) - } catch (e) { - console.warn(`Cache load failed: ${e}. Skipping cache load...`) - } - try { - this.serviceManager.networks.set(await this.serviceManager.networkService.get()) - this.serviceManager.networksStatus.set(LoadStatus.loaded) - } catch (e) { - console.error(e) - this.serviceManager.networksStatus.set(LoadStatus.error) + if (this.serviceManager.networksStatus() != LoadStatus.loaded) { + try { + this.serviceManager.networks.set(await this.serviceManager.networkService.getQuick()) + this.serviceManager.networksStatus.set(LoadStatus.updating) + } catch (e) { + console.warn(`Cache load failed: ${e}. Skipping cache load...`) + } + try { + this.serviceManager.networks.set(await this.serviceManager.networkService.get()) + this.serviceManager.networksStatus.set(LoadStatus.loaded) + } catch (e) { + console.error(e) + this.serviceManager.networksStatus.set(LoadStatus.error) + } } } diff --git a/src/app/chat/network/channel/text/text.html b/src/app/chat/network/channel/text/text.html index 451bf13..4b5cf00 100644 --- a/src/app/chat/network/channel/text/text.html +++ b/src/app/chat/network/channel/text/text.html @@ -25,7 +25,7 @@ - diff --git a/src/app/chat/network/channel/text/text.ts b/src/app/chat/network/channel/text/text.ts index 0d5e282..38e4778 100644 --- a/src/app/chat/network/channel/text/text.ts +++ b/src/app/chat/network/channel/text/text.ts @@ -1,5 +1,5 @@ import {Component, inject, signal} from '@angular/core'; -import {DmStorage, ServiceManager, TextChannelStorage} from '../../../../service-manager'; +import {DmStorage, LoadStatus, ServiceManager, TextChannelStorage} from '../../../../service-manager'; import {ActivatedRoute} from '@angular/router'; import {IndexedDB} from '../../../../storage/indexed-db'; import {TUI_BREAKPOINT, TuiButton, TuiIcon} from '@taiga-ui/core'; @@ -261,6 +261,7 @@ export class Text { channelData: signal(channelData), messages: signal([]), messagesVm: new MessagesViewModel(), + messagesStatus: signal(LoadStatus.loading), messageBox: new MessageBoxViewModel((msg, files) => this.sendMessage(msg, files)), wsListener: (action, data) => this.onWsListen(action, data, networkId, categoryId), } as TextChannelStorage; @@ -282,11 +283,13 @@ export class Text { const messagesCache = await currentStore.service.getQuick(); currentStore.messages.set(messagesCache); this.scrollToBottom("instant") + currentStore.messagesStatus.set(LoadStatus.updating) } catch (e) { console.warn(`Cache load failed: ${e}. Skipping cache load...`) } const messages = await currentStore.service.get(); currentStore.messages.set(messages); + currentStore.messagesStatus.set(LoadStatus.loaded) this.scrollToBottom("instant") await currentStore.service.joinWebSocketRoom(); @@ -295,4 +298,6 @@ export class Text { } }); } + + protected readonly LoadStatus = LoadStatus; } diff --git a/src/app/chat/network/network.html b/src/app/chat/network/network.html index 87486b0..4e66c60 100644 --- a/src/app/chat/network/network.html +++ b/src/app/chat/network/network.html @@ -13,32 +13,70 @@
    -
    - @for (category of store.networkData().categories; track category) { -
    -

    {{category.name}}

    + + -
    - @for (channel of category.channels; track channel) { - + + + + +
    + + @switch (tabActiveIndex) { + @case (0) { +
    + @for (category of store.networkData().categories; track category) { +
    +

    {{category.name}}

    + +
    + @for (channel of category.channels; track channel) { + } - {{channel.name}} - - } -
    -
    +
    +
    + } +
    } - + @case (2) { +
    + +
    + } + } } diff --git a/src/app/chat/network/network.scss b/src/app/chat/network/network.scss index 84b18f1..10ce4f2 100644 --- a/src/app/chat/network/network.scss +++ b/src/app/chat/network/network.scss @@ -8,6 +8,11 @@ padding: 15px; transition: 0.2s; + #network-data { + display: flex; + flex-direction: column; + } + &.routerOutletActive { overflow-y: hidden; padding: 0; @@ -42,4 +47,11 @@ justify-content: start; } } + + #settings { + width: 100%; + height: 100%; + background: var(--tui-background-base-alt); + border-radius: 20px; + } } diff --git a/src/app/chat/network/network.ts b/src/app/chat/network/network.ts index d3aa406..b53d4ab 100644 --- a/src/app/chat/network/network.ts +++ b/src/app/chat/network/network.ts @@ -11,6 +11,10 @@ import {IndexedDB} from '../../storage/indexed-db'; import {Navbar} from '../elements/navbar/navbar'; import {Oimg} from '../elements/oimg/oimg'; import {TUI_BREAKPOINT, TuiButton, TuiGroup, TuiIcon} from '@taiga-ui/core'; +import {TuiTab, TuiTabsHorizontal, TuiTabsWithMore} from '@taiga-ui/kit'; +import {TuiItem} from '@taiga-ui/cdk'; +import {TranslatePipe} from '@ngx-translate/core'; +import {Settings} from './settings/settings'; @Component({ selector: 'app-network', @@ -21,7 +25,13 @@ import {TUI_BREAKPOINT, TuiButton, TuiGroup, TuiIcon} from '@taiga-ui/core'; TuiGroup, TuiButton, TuiIcon, - RouterLink + RouterLink, + TuiTabsWithMore, + TuiItem, + TuiTab, + TranslatePipe, + TuiTabsHorizontal, + Settings ], templateUrl: './network.html', styleUrl: './network.scss', @@ -33,6 +43,8 @@ export class Network implements OnInit { breakpoint = inject(TUI_BREAKPOINT) router = inject(Router) + tabActiveIndex = 2 + routerOutletActive = signal(false) networkId = "" diff --git a/src/app/chat/network/settings/overview/overview.html b/src/app/chat/network/settings/overview/overview.html new file mode 100644 index 0000000..ad8ab11 --- /dev/null +++ b/src/app/chat/network/settings/overview/overview.html @@ -0,0 +1,114 @@ +
    +
    +
    + + {{ "chat.network.settings.overviewPage.networkPicture"|translate }} + +
    + +
    + +
    +
    +
    + + + + + + + @if (setNewNameError() != "") { + + } + +
    + +
    +
    + +
    + + {{ "chat.network.settings.overviewPage.networkName"|translate }} + {{ networkStore().networkData().name }} +
    +
    + +
    + +
    +
    + +
      +
    • + + {{ "chat.network.settings.overviewPage.changeToPrivateDialog.warn.1"|translate }} +
    • +
    • + + {{ "chat.network.settings.overviewPage.changeToPrivateDialog.warn.2"|translate }} +
    • +
    • + + {{ "chat.network.settings.overviewPage.changeToPrivateDialog.warn.3"|translate }} +
    • +
    +
    + +
    +
    + + +
      +
    • + + {{ "chat.network.settings.overviewPage.changeToPublicDialog.warn.1"|translate }} +
    • +
    • + + {{ "chat.network.settings.overviewPage.changeToPublicDialog.warn.2"|translate }} +
    • +
    • + + {{ "chat.network.settings.overviewPage.changeToPublicDialog.warn.3"|translate }} +
    • +
    +
    + +
    +
    + +
    + @if (networkStore().networkData().visibility == "public") { + + } @else { + + } + {{ "chat.network.settings.overviewPage.networkVisibility"|translate }} +
    + +
    + @if (networkStore().networkData().visibility == "public") { + + } @else { + + } +
    +
    +
    diff --git a/src/app/chat/network/settings/overview/overview.scss b/src/app/chat/network/settings/overview/overview.scss new file mode 100644 index 0000000..34c8fe6 --- /dev/null +++ b/src/app/chat/network/settings/overview/overview.scss @@ -0,0 +1,31 @@ +#options { + display: flex; + flex-direction: column; + + div { + width: 100%; + height: 60px; + background: var(--tui-background-base-alt); + padding: 15px; + display: grid; + grid-template-columns: 1fr 1fr; + align-items: center; + gap: 10px; + + header { + display: flex; + gap: 5px; + align-items: center; + } + + main { + display: flex; + align-items: center; + justify-content: end; + + button { + height: 35px; + } + } + } +} diff --git a/src/app/chat/network/settings/overview/overview.spec.ts b/src/app/chat/network/settings/overview/overview.spec.ts new file mode 100644 index 0000000..9504440 --- /dev/null +++ b/src/app/chat/network/settings/overview/overview.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { Overview } from './overview'; + +describe('Overview', () => { + let component: Overview; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [Overview], + }).compileComponents(); + + fixture = TestBed.createComponent(Overview); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chat/network/settings/overview/overview.ts b/src/app/chat/network/settings/overview/overview.ts new file mode 100644 index 0000000..b9b5ead --- /dev/null +++ b/src/app/chat/network/settings/overview/overview.ts @@ -0,0 +1,79 @@ +import {Component, inject, input, signal} from '@angular/core'; +import {NetworkStorage} from '../../../../service-manager'; +import { + TuiAlertService, + TuiButton, + TuiDialog, + TuiErrorComponent, + TuiGroup, + TuiIcon, + TuiInputDirective +} from '@taiga-ui/core'; +import {TranslatePipe} from '@ngx-translate/core'; +import {Oimg} from '../../../elements/oimg/oimg'; +import {environment} from '../../../../../environments/environment'; +import {TuiButtonLoading, TuiComboBox} from '@taiga-ui/kit'; + +@Component({ + selector: 'network-settings-overview', + imports: [ + TuiGroup, + TranslatePipe, + TuiIcon, + Oimg, + TuiButton, + TuiDialog, + TuiComboBox, + TuiInputDirective, + TuiButtonLoading, + TuiErrorComponent + ], + templateUrl: './overview.html', + styleUrl: './overview.scss', +}) +export class Overview { + networkStore = input.required() + protected readonly environment = environment; + protected readonly localStorage = localStorage; + + setNewNameDialogOpen = signal(false) + setNewNamePending = signal(false) + setNewNameError = signal("") + + makeNetworkPrivateWarnDialogOpen = signal(false) + makeNetworkPublicWarnDialogOpen = signal(false) + networkVisChangePending = signal(false) + + async setNewName(name: string) { + this.setNewNameError.set("") + this.setNewNamePending.set(true) + try { + await this.networkStore().service.editName(name) + this.setNewNamePending.set(false) + this.setNewNameDialogOpen.set(false) + this.networkStore().networkData.update( + value => { + value.name = name + return value + } + ) + } catch (e) { + this.setNewNamePending.set(false) + this.setNewNameError.set(e as string) + } + } + + async changeVisibility(newVisibility: "public" | "private") { + this.networkVisChangePending.set(true) + await this.networkStore().service.changeVisibility(newVisibility) + this.networkStore().networkData.update( + value => { + value.visibility = newVisibility + return value + } + ) + this.networkVisChangePending.set(false) + this.makeNetworkPrivateWarnDialogOpen.set(false) + this.makeNetworkPublicWarnDialogOpen.set(false) + } +} diff --git a/src/app/chat/network/settings/settings.html b/src/app/chat/network/settings/settings.html new file mode 100644 index 0000000..d58f008 --- /dev/null +++ b/src/app/chat/network/settings/settings.html @@ -0,0 +1,29 @@ + + +
    + @switch (selectedOption) { + @case ("overview") { + + } + } +
    diff --git a/src/app/chat/network/settings/settings.scss b/src/app/chat/network/settings/settings.scss new file mode 100644 index 0000000..11ff400 --- /dev/null +++ b/src/app/chat/network/settings/settings.scss @@ -0,0 +1,37 @@ +:host { + height: 100%; + width: 100%; + display: grid; + grid-template-columns: 300px 1fr; + + aside { + height: 100%; + width: 100%; + border-radius: 20px 0 0 20px; + padding: 15px; + + header { + display: flex; + gap: 5px; + align-items: center; + } + div { + display: flex; + flex-direction: column; + gap: 1px; + padding: 5px; + + button { + height: 40px; + display: flex; + justify-content: start; + } + } + } + + main { + background: var(--tui-background-neutral-2); + border-radius: 0 20px 20px 0; + padding: 15px; + } +} diff --git a/src/app/chat/network/settings/settings.spec.ts b/src/app/chat/network/settings/settings.spec.ts new file mode 100644 index 0000000..011fd8f --- /dev/null +++ b/src/app/chat/network/settings/settings.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { Settings } from './settings'; + +describe('Settings', () => { + let component: Settings; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [Settings], + }).compileComponents(); + + fixture = TestBed.createComponent(Settings); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chat/network/settings/settings.ts b/src/app/chat/network/settings/settings.ts new file mode 100644 index 0000000..d42d761 --- /dev/null +++ b/src/app/chat/network/settings/settings.ts @@ -0,0 +1,150 @@ +import {Component, inject, input} from '@angular/core'; +import {TuiButton, TuiGroup, TuiIcon} from '@taiga-ui/core'; +import {permissionGranted, permissions} from '@chatenium/chatenium-sdk/core/permissions'; +import {NetworkStorage, ServiceManager} from '../../../service-manager'; +import {Session} from '@chatenium/chatenium-sdk/domain/sessionManager.schema'; +import {SessionManager} from '@chatenium/chatenium-sdk/services/sessionManager'; +import {TranslatePipe} from '@ngx-translate/core'; +import {Overview} from './overview/overview'; + +@Component({ + selector: 'network-settings', + imports: [ + TuiGroup, + TuiIcon, + TranslatePipe, + TuiButton, + Overview + ], + templateUrl: './settings.html', + styleUrl: './settings.scss', +}) +export class Settings { + serviceManager = inject(ServiceManager) + networkStore = input.required() + + selectedOption = "overview" + + optionRequiredPermissionsGranted(permissions: number, required: number[]) { + if (!this.serviceManager.currentSession) { + return false + } + + let granted = false; + + if (this.networkStore().networkData().createdBy == this.serviceManager.currentSession()!.userData.userid) { + return true + } + + required.forEach((permission) => { + if (permissionGranted(permissions, permission)) { + granted = true + } + }) + + return granted + } + + networkSettingsOptions: { + name: string, + icon: string, + options: { + name: string, // ? channel.settings.[name] + icon: string // ? Class name + requiredAtLeastOneOf?: number[], + implemented: boolean + }[] + }[] = [ + { + name: "networkName", // ? UI Will show network name + icon: "network", + options: [ + { + icon: "eye", + name: "overview", + implemented: true, + requiredAtLeastOneOf: [permissions.changeNetworkNamePictureAndVisibility] + }, + { + name: "rank", + icon: "book", + requiredAtLeastOneOf: [permissions.createAndEditRanks, permissions.deleteRanks], + implemented: false, + }, + { + name: "emoji", + icon: "smile", + implemented: false, + requiredAtLeastOneOf: [permissions.createEmojis] + }, + { + name: "embed", + icon: "code", + implemented: false, + requiredAtLeastOneOf: [permissions.manageEmbed] + }, + { + name: "invite", + icon: "ticket", + implemented: false, + requiredAtLeastOneOf: [permissions.createInvites, permissions.deleteInvites] + } + ] + }, + { + name: "apps", + icon: "layout-panel-left", + options: [ + { + name: "webhook", + icon: "globe", + implemented: false, + requiredAtLeastOneOf: [permissions.deleteWebhooks, permissions.createWebhooks] + }, + { + name: "bots", + icon: "bot", + implemented: false, + } + ] + }, + { + name: "moderation", + icon: "shield-half", + options: [ + { + name: "activityHistory", + icon: "scroll-text", + implemented: false, + }, + { + name: "bans", + icon: "gavel", + implemented: false, + requiredAtLeastOneOf: [permissions.banMembers] + } + ] + }, + { + name: "community", + icon: "users", + options: [ + { + name: "communityChannels", + icon: "hash", + implemented: false, + }, + { + name: "networkIntroducer", + icon: "network", + implemented: false, + }, + { + name: "members", + icon: "users", + implemented: false, + } + ] + } + ] +} diff --git a/src/app/chat/picture-list/picture-list.ts b/src/app/chat/picture-list/picture-list.ts index 590dd45..518c63f 100644 --- a/src/app/chat/picture-list/picture-list.ts +++ b/src/app/chat/picture-list/picture-list.ts @@ -30,18 +30,20 @@ export class PictureList implements OnInit { async ngOnInit() { this.serviceManager.chatService = new ChatService(this.userid(), this.token(), this.indexedDb.getApi(), () => {}) - try { - this.serviceManager.chats.set(await this.serviceManager.chatService.getQuick()) - this.serviceManager.chatsStatus.set(LoadStatus.updating) - } catch (e) { - console.warn(`Cache load failed: ${e}. Skipping cache load...`) - } - try { - this.serviceManager.chats.set(await this.serviceManager.chatService.get()) - this.serviceManager.chatsStatus.set(LoadStatus.loaded) - } catch (e) { - console.error(e) - this.serviceManager.chatsStatus.set(LoadStatus.error) + if (this.serviceManager.chatsStatus() != LoadStatus.loaded) { + try { + this.serviceManager.chats.set(await this.serviceManager.chatService.getQuick()) + this.serviceManager.chatsStatus.set(LoadStatus.updating) + } catch (e) { + console.warn(`Cache load failed: ${e}. Skipping cache load...`) + } + try { + this.serviceManager.chats.set(await this.serviceManager.chatService.get()) + this.serviceManager.chatsStatus.set(LoadStatus.loaded) + } catch (e) { + console.error(e) + this.serviceManager.chatsStatus.set(LoadStatus.error) + } } } } diff --git a/src/app/service-manager.ts b/src/app/service-manager.ts index 3c7ab2d..0aaf9a1 100644 --- a/src/app/service-manager.ts +++ b/src/app/service-manager.ts @@ -53,6 +53,7 @@ export enum LoadStatus { export interface DmStorage { service: DMService messages: WritableSignal + messagesStatus: WritableSignal messagesVm: MessagesViewModel chatData: WritableSignal messageBox: MessageBoxViewModel @@ -76,6 +77,7 @@ export interface TextChannelStorage { service: TextChannelServiceService messages: WritableSignal messagesVm: MessagesViewModel + messagesStatus: WritableSignal channelData: WritableSignal categoryData: WritableSignal messageBox: MessageBoxViewModel diff --git a/src/environments/environment.development.ts b/src/environments/environment.development.ts index 85f0df3..89323a8 100644 --- a/src/environments/environment.development.ts +++ b/src/environments/environment.development.ts @@ -1,5 +1,5 @@ export const environment = { - version: "3.0-beta7", + version: "3.0-beta8", api_url: "http://localhost:3000", cdn_url: "http://localhost:4000", ws_url: "ws://localhost:3000", diff --git a/src/environments/environment.ts b/src/environments/environment.ts index d97a5ac..e4adc75 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,5 +1,5 @@ export const environment = { - version: "3.0-beta7", + version: "3.0-beta8", api_url: "https://api.chatenium.hu", cdn_url: "https://cdn.chatenium.hu", ws_url: "wss://api.chatenium.hu",