2 Commits

Author SHA1 Message Date
f9518a9164 Scrolling bug fix 2026-04-27 18:12:18 +02:00
3ed025ee61 UI Hotfix 2026-04-19 16:12:59 +02:00
9 changed files with 43 additions and 26 deletions

View File

@@ -1,5 +1,5 @@
{ {
"version": "Chatenium Nexum 3.0 Beta 9 (April 19, 2026)", "version": "Chatenium Nexum 3.0 Beta 10 (April 27, 2026)",
"ok": "Ok", "ok": "Ok",
"back": "Back", "back": "Back",
"aChatProgram": "A messaging platform that you can trust.", "aChatProgram": "A messaging platform that you can trust.",
@@ -218,8 +218,7 @@
"changeLogDialog": { "changeLogDialog": {
"label": "Chatenium has been updated", "label": "Chatenium has been updated",
"changeLog": { "changeLog": {
"1": "Started implementing user settings, Privacy & Security is now available.", "1": "Fixed scrolling issues when sending or receiving new messages."
"2": "Enabled Chatenium Pictures on mobile devices."
} }
}, },
"chatnav": { "chatnav": {

View File

@@ -3,7 +3,6 @@
<h3>{{ "version"|translate }}</h3> <h3>{{ "version"|translate }}</h3>
<ul> <ul>
<li>{{ "chat.changeLogDialog.changeLog.1"|translate }}</li> <li>{{ "chat.changeLogDialog.changeLog.1"|translate }}</li>
<li>{{ "chat.changeLogDialog.changeLog.2"|translate }}</li>
</ul> </ul>
<button tuiButton iconStart="@tui.check" <button tuiButton iconStart="@tui.check"

View File

@@ -43,7 +43,6 @@ export class Dm implements OnInit {
async sendMessage(message: string, files: FileDataWithPreview[] | null) { async sendMessage(message: string, files: FileDataWithPreview[] | null) {
if (!files && message.trim() == "") return if (!files && message.trim() == "") return
this.scrollToBottom("smooth")
const session = this.serviceManager.currentSession(); const session = this.serviceManager.currentSession();
if (session != null) { if (session != null) {
@@ -102,14 +101,13 @@ export class Dm implements OnInit {
forwardedFromName: "" forwardedFromName: ""
}]) }])
this.scrollToBottom("smooth")
const respMessage = await this.store.service.sendMessage(tempMsgId, message, null, null, files, <FileUploadProgressListener>{ const respMessage = await this.store.service.sendMessage(tempMsgId, message, null, null, files, <FileUploadProgressListener>{
fileProgressUpdate: (tempMsgId, fileId, allChunks, chunksDone) => { fileProgressUpdate: (tempMsgId, fileId, allChunks, chunksDone) => {
this.uploadProgressUpdate(tempMsgId, fileId, allChunks, chunksDone) this.uploadProgressUpdate(tempMsgId, fileId, allChunks, chunksDone)
} }
}) })
this.updateTempMessage(tempMsgId, respMessage) this.updateTempMessage(tempMsgId, respMessage)
this.scrollToBottom("smooth")
} }
} }
@@ -126,13 +124,13 @@ export class Dm implements OnInit {
} }
} }
scrollToBottom(anim: 'instant' | 'smooth'): void { restoreScrollState(): void {
setTimeout(() => { setTimeout(() => {
const scrollContainer = <HTMLDivElement>document.querySelector("#scrollContainer") const scrollContainer = <HTMLDivElement>document.querySelector("#scrollContainer")
scrollContainer.scroll({ scrollContainer.scroll({
top: this.store.messagesVm.scrollBarStatus() == -1 ? scrollContainer.scrollHeight : this.store.messagesVm.scrollBarStatus(), top: this.store.messagesVm.scrollBarStatus() == -1 ? scrollContainer.scrollHeight : this.store.messagesVm.scrollBarStatus(),
left: 0, left: 0,
behavior: anim behavior: "instant"
}); });
if (this.store.messagesVm.scrollBarStatus() == -1) { if (this.store.messagesVm.scrollBarStatus() == -1) {
@@ -141,6 +139,17 @@ export class Dm implements OnInit {
}, 0) }, 0)
} }
scrollToBottom(anim: 'instant' | 'smooth'): void {
setTimeout(() => {
const scrollContainer = <HTMLDivElement>document.querySelector("#scrollContainer")
scrollContainer.scroll({
top: scrollContainer.scrollHeight,
left: 0,
behavior: anim
});
}, 0)
}
handleMessagesScroll(e: any) { handleMessagesScroll(e: any) {
this.store.messagesVm.scrollBarStatus.set(e.target.scrollTop) this.store.messagesVm.scrollBarStatus.set(e.target.scrollTop)
} }
@@ -241,18 +250,18 @@ export class Dm implements OnInit {
const messagesCache = await currentStore.service.getQuick(); const messagesCache = await currentStore.service.getQuick();
currentStore.messages.set(messagesCache); currentStore.messages.set(messagesCache);
this.store.messagesStatus.set(LoadStatus.updating) this.store.messagesStatus.set(LoadStatus.updating)
this.scrollToBottom("instant") this.restoreScrollState()
} catch (e) { } catch (e) {
console.warn(`Cache load failed: ${e}. Skipping cache load...`) console.warn(`Cache load failed: ${e}. Skipping cache load...`)
} }
const messages = await currentStore.service.get(); const messages = await currentStore.service.get();
currentStore.messages.set(messages); currentStore.messages.set(messages);
this.store.messagesStatus.set(LoadStatus.loaded) this.store.messagesStatus.set(LoadStatus.loaded)
this.scrollToBottom("instant") this.restoreScrollState()
await currentStore.service.joinWebSocketRoom(); await currentStore.service.joinWebSocketRoom();
} else { } else {
this.scrollToBottom("instant") this.restoreScrollState()
} }
}); });
} }

View File

@@ -116,14 +116,13 @@ export class Text {
forwardedFromName: "" forwardedFromName: ""
}]) }])
this.scrollToBottom("smooth")
const respMessage = await this.store.service.sendMessage(tempMsgId, message, null, null, files, <FileUploadProgressListener>{ const respMessage = await this.store.service.sendMessage(tempMsgId, message, null, null, files, <FileUploadProgressListener>{
fileProgressUpdate: (tempMsgId, fileId, allChunks, chunksDone) => { fileProgressUpdate: (tempMsgId, fileId, allChunks, chunksDone) => {
this.uploadProgressUpdate(tempMsgId, fileId, allChunks, chunksDone) this.uploadProgressUpdate(tempMsgId, fileId, allChunks, chunksDone)
} }
}) })
this.updateTempMessage(tempMsgId, respMessage) this.updateTempMessage(tempMsgId, respMessage)
this.scrollToBottom("smooth")
} }
} }
@@ -141,7 +140,7 @@ export class Text {
} }
} }
scrollToBottom(anim: 'instant' | 'smooth'): void { restoreScrollState() {
setTimeout(() => { setTimeout(() => {
if (!this.store) { if (!this.store) {
return return
@@ -150,7 +149,7 @@ export class Text {
scrollContainer.scroll({ scrollContainer.scroll({
top: this.store.messagesVm.scrollBarStatus() == -1 ? scrollContainer.scrollHeight : this.store.messagesVm.scrollBarStatus(), top: this.store.messagesVm.scrollBarStatus() == -1 ? scrollContainer.scrollHeight : this.store.messagesVm.scrollBarStatus(),
left: 0, left: 0,
behavior: anim behavior: "instant"
}); });
if (this.store.messagesVm.scrollBarStatus() == -1) { if (this.store.messagesVm.scrollBarStatus() == -1) {
@@ -159,6 +158,17 @@ export class Text {
}, 0) }, 0)
} }
scrollToBottom(anim: 'instant' | 'smooth'): void {
setTimeout(() => {
const scrollContainer = <HTMLDivElement>document.querySelector("#scrollContainer")
scrollContainer.scroll({
top: scrollContainer.scrollHeight,
left: 0,
behavior: anim
});
}, 0)
}
handleMessagesScroll(e: any) { handleMessagesScroll(e: any) {
if (!this.store) return if (!this.store) return
this.store.messagesVm.scrollBarStatus.set(e.target.scrollTop) this.store.messagesVm.scrollBarStatus.set(e.target.scrollTop)
@@ -282,7 +292,7 @@ export class Text {
try { try {
const messagesCache = await currentStore.service.getQuick(); const messagesCache = await currentStore.service.getQuick();
currentStore.messages.set(messagesCache); currentStore.messages.set(messagesCache);
this.scrollToBottom("instant") this.restoreScrollState()
currentStore.messagesStatus.set(LoadStatus.updating) currentStore.messagesStatus.set(LoadStatus.updating)
} catch (e) { } catch (e) {
console.warn(`Cache load failed: ${e}. Skipping cache load...`) console.warn(`Cache load failed: ${e}. Skipping cache load...`)
@@ -290,11 +300,11 @@ export class Text {
const messages = await currentStore.service.get(); const messages = await currentStore.service.get();
currentStore.messages.set(messages); currentStore.messages.set(messages);
currentStore.messagesStatus.set(LoadStatus.loaded) currentStore.messagesStatus.set(LoadStatus.loaded)
this.scrollToBottom("instant") this.restoreScrollState()
await currentStore.service.joinWebSocketRoom(); await currentStore.service.joinWebSocketRoom();
} else { } else {
this.scrollToBottom("instant") this.restoreScrollState()
} }
}); });
} }

View File

@@ -43,7 +43,7 @@ export class Network implements OnInit {
breakpoint = inject(TUI_BREAKPOINT) breakpoint = inject(TUI_BREAKPOINT)
router = inject(Router) router = inject(Router)
tabActiveIndex = 2 tabActiveIndex = 0
routerOutletActive = signal(false) routerOutletActive = signal(false)

View File

@@ -90,7 +90,7 @@
</button> </button>
@if (serviceManager.currentSession()!.userData.emailSet) { @if (serviceManager.currentSession()!.userData.emailSet) {
<button tuiButton appearance="outline" tuiAppearanceMode="invalid" iconStart="@tui.x" [disabled]="!serviceManager.currentSession()!.userData.phoneSet && !serviceManager.currentSession()!.userData.phoneSet" <button tuiButton appearance="outline" tuiAppearanceMode="invalid" iconStart="@tui.x" [disabled]="!serviceManager.currentSession()!.userData.phoneSet && !serviceManager.currentSession()!.userData.passwordSet"
(click)="openChangeEmailDialog(true)" (click)="openChangeEmailDialog(true)"
style="color: var(--tui-text-negative)"> style="color: var(--tui-text-negative)">
{{ "chat.userSettingsDialog.security.removeMail"|translate }} {{ "chat.userSettingsDialog.security.removeMail"|translate }}

View File

@@ -3,7 +3,7 @@
{{ "chat.userSettingsDialog.security.label"|translate }} {{ "chat.userSettingsDialog.security.label"|translate }}
</p> </p>
<div id="options" tuiGroup orientation="vertical"> <div id="options" tuiGroup orientation="vertical">
<user-settings-security-password/> <user-settings-security-password style="overflow: hidden"/>
<user-settings-security-email/> <user-settings-security-email style="overflow: hidden"/>
<user-settings-security-phone/> <user-settings-security-phone style="overflow: hidden"/>
</div> </div>

View File

@@ -1,5 +1,5 @@
export const environment = { export const environment = {
version: "3.0-beta9", version: "3.0-beta10",
api_url: "http://localhost:3000", api_url: "http://localhost:3000",
cdn_url: "http://localhost:4000", cdn_url: "http://localhost:4000",
ws_url: "ws://localhost:3000", ws_url: "ws://localhost:3000",

View File

@@ -1,5 +1,5 @@
export const environment = { export const environment = {
version: "3.0-beta9", version: "3.0-beta10",
api_url: "https://api.chatenium.hu", api_url: "https://api.chatenium.hu",
cdn_url: "https://cdn.chatenium.hu", cdn_url: "https://cdn.chatenium.hu",
ws_url: "wss://api.chatenium.hu", ws_url: "wss://api.chatenium.hu",