fix typing indicators
This commit is contained in:
parent
a4fbc0ca6a
commit
dc5b38eb21
6 changed files with 127 additions and 107 deletions
|
@ -9,6 +9,7 @@ import { RoleList } from "./role.js";
|
||||||
import { InfiniteScroller } from "./infiniteScroller.js";
|
import { InfiniteScroller } from "./infiniteScroller.js";
|
||||||
import { SnowFlake } from "./snowflake.js";
|
import { SnowFlake } from "./snowflake.js";
|
||||||
import { MarkDown } from "./markdown.js";
|
import { MarkDown } from "./markdown.js";
|
||||||
|
import { Member } from "./member.js";
|
||||||
class Channel extends SnowFlake {
|
class Channel extends SnowFlake {
|
||||||
editing;
|
editing;
|
||||||
type;
|
type;
|
||||||
|
@ -677,6 +678,7 @@ class Channel extends SnowFlake {
|
||||||
const loading = document.getElementById("loadingdiv");
|
const loading = document.getElementById("loadingdiv");
|
||||||
Channel.regenLoadingMessages();
|
Channel.regenLoadingMessages();
|
||||||
loading.classList.add("loading");
|
loading.classList.add("loading");
|
||||||
|
this.rendertyping();
|
||||||
await this.putmessages();
|
await this.putmessages();
|
||||||
await prom;
|
await prom;
|
||||||
if (id !== Channel.genid) {
|
if (id !== Channel.genid) {
|
||||||
|
@ -687,6 +689,61 @@ class Channel extends SnowFlake {
|
||||||
//loading.classList.remove("loading");
|
//loading.classList.remove("loading");
|
||||||
document.getElementById("typebox").contentEditable = "" + this.canMessage;
|
document.getElementById("typebox").contentEditable = "" + this.canMessage;
|
||||||
}
|
}
|
||||||
|
typingmap = new Map();
|
||||||
|
async typingStart(typing) {
|
||||||
|
const memb = await Member.new(typing.d.member, this.guild);
|
||||||
|
if (!memb)
|
||||||
|
return;
|
||||||
|
if (memb.id === this.localuser.user.id) {
|
||||||
|
console.log("you is typing");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("user is typing and you should see it");
|
||||||
|
this.typingmap.set(memb, Date.now());
|
||||||
|
setTimeout(this.rendertyping.bind(this), 10000);
|
||||||
|
this.rendertyping();
|
||||||
|
}
|
||||||
|
rendertyping() {
|
||||||
|
const typingtext = document.getElementById("typing");
|
||||||
|
let build = "";
|
||||||
|
let showing = false;
|
||||||
|
let i = 0;
|
||||||
|
const curtime = Date.now() - 5000;
|
||||||
|
for (const thing of this.typingmap.keys()) {
|
||||||
|
if (this.typingmap.get(thing) > curtime) {
|
||||||
|
if (i !== 0) {
|
||||||
|
build += ", ";
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
if (thing.nick) {
|
||||||
|
build += thing.nick;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
build += thing.user.username;
|
||||||
|
}
|
||||||
|
showing = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.typingmap.delete(thing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i > 1) {
|
||||||
|
build += " are typing";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
build += " is typing";
|
||||||
|
}
|
||||||
|
if (this.localuser.channelfocus === this) {
|
||||||
|
if (showing) {
|
||||||
|
typingtext.classList.remove("hidden");
|
||||||
|
const typingtext2 = document.getElementById("typingtext");
|
||||||
|
typingtext2.textContent = build;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
typingtext.classList.add("hidden");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
static regenLoadingMessages() {
|
static regenLoadingMessages() {
|
||||||
const loading = document.getElementById("loadingdiv");
|
const loading = document.getElementById("loadingdiv");
|
||||||
loading.innerHTML = "";
|
loading.innerHTML = "";
|
||||||
|
|
|
@ -138,6 +138,7 @@ class Group extends Channel {
|
||||||
const loading = document.getElementById("loadingdiv");
|
const loading = document.getElementById("loadingdiv");
|
||||||
Channel.regenLoadingMessages();
|
Channel.regenLoadingMessages();
|
||||||
loading.classList.add("loading");
|
loading.classList.add("loading");
|
||||||
|
this.rendertyping();
|
||||||
await this.putmessages();
|
await this.putmessages();
|
||||||
await prom;
|
await prom;
|
||||||
if (id !== Channel.genid) {
|
if (id !== Channel.genid) {
|
||||||
|
|
|
@ -28,7 +28,6 @@ class Localuser {
|
||||||
lookingguild;
|
lookingguild;
|
||||||
guildhtml;
|
guildhtml;
|
||||||
ws;
|
ws;
|
||||||
typing = new Map();
|
|
||||||
connectionSucceed = 0;
|
connectionSucceed = 0;
|
||||||
errorBackoff = 0;
|
errorBackoff = 0;
|
||||||
userMap = new Map();
|
userMap = new Map();
|
||||||
|
@ -787,22 +786,15 @@ class Localuser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async typingStart(typing) {
|
async typingStart(typing) {
|
||||||
if (this.channelfocus?.id === typing.d.channel_id) {
|
//
|
||||||
const guild = this.guildids.get(typing.d.guild_id);
|
const guild = this.guildids.get(typing.d.guild_id);
|
||||||
if (!guild)
|
if (!guild)
|
||||||
return;
|
return;
|
||||||
const memb = await Member.new(typing.d.member, guild);
|
const channel = guild.channelids[typing.d.channel_id];
|
||||||
if (!memb)
|
if (!channel)
|
||||||
return;
|
return;
|
||||||
if (memb.id === this.user.id) {
|
channel.typingStart(typing);
|
||||||
console.log("you is typing");
|
//this.typing.set(memb,Date.now());
|
||||||
return;
|
|
||||||
}
|
|
||||||
console.log("user is typing and you should see it");
|
|
||||||
this.typing.set(memb, Date.now());
|
|
||||||
setTimeout(this.rendertyping.bind(this), 10000);
|
|
||||||
this.rendertyping();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
updatepfp(file) {
|
updatepfp(file) {
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
|
@ -848,45 +840,6 @@ class Localuser {
|
||||||
body: JSON.stringify(json)
|
body: JSON.stringify(json)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
rendertyping() {
|
|
||||||
const typingtext = document.getElementById("typing");
|
|
||||||
let build = "";
|
|
||||||
let showing = false;
|
|
||||||
let i = 0;
|
|
||||||
const curtime = Date.now() - 5000;
|
|
||||||
for (const thing of this.typing.keys()) {
|
|
||||||
if (this.typing.get(thing) > curtime) {
|
|
||||||
if (i !== 0) {
|
|
||||||
build += ", ";
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
if (thing.nick) {
|
|
||||||
build += thing.nick;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
build += thing.user.username;
|
|
||||||
}
|
|
||||||
showing = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.typing.delete(thing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i > 1) {
|
|
||||||
build += " are typing";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
build += " is typing";
|
|
||||||
}
|
|
||||||
if (showing) {
|
|
||||||
typingtext.classList.remove("hidden");
|
|
||||||
const typingtext2 = document.getElementById("typingtext");
|
|
||||||
typingtext2.textContent = build;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
typingtext.classList.add("hidden");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async showusersettings() {
|
async showusersettings() {
|
||||||
const settings = new Settings("Settings");
|
const settings = new Settings("Settings");
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,6 +12,7 @@ import{InfiniteScroller}from"./infiniteScroller.js";
|
||||||
import{ SnowFlake }from"./snowflake.js";
|
import{ SnowFlake }from"./snowflake.js";
|
||||||
import{ channeljson, messageCreateJson, messagejson, readyjson }from"./jsontypes.js";
|
import{ channeljson, messageCreateJson, messagejson, readyjson }from"./jsontypes.js";
|
||||||
import{ MarkDown }from"./markdown.js";
|
import{ MarkDown }from"./markdown.js";
|
||||||
|
import { Member } from "./member.js";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface NotificationOptions {
|
interface NotificationOptions {
|
||||||
|
@ -688,6 +689,7 @@ class Channel extends SnowFlake{
|
||||||
const loading=document.getElementById("loadingdiv") as HTMLDivElement;
|
const loading=document.getElementById("loadingdiv") as HTMLDivElement;
|
||||||
Channel.regenLoadingMessages();
|
Channel.regenLoadingMessages();
|
||||||
loading.classList.add("loading");
|
loading.classList.add("loading");
|
||||||
|
this.rendertyping();
|
||||||
await this.putmessages();
|
await this.putmessages();
|
||||||
await prom;
|
await prom;
|
||||||
if(id!==Channel.genid){
|
if(id!==Channel.genid){
|
||||||
|
@ -699,6 +701,56 @@ class Channel extends SnowFlake{
|
||||||
//loading.classList.remove("loading");
|
//loading.classList.remove("loading");
|
||||||
(document.getElementById("typebox") as HTMLDivElement).contentEditable=""+this.canMessage;
|
(document.getElementById("typebox") as HTMLDivElement).contentEditable=""+this.canMessage;
|
||||||
}
|
}
|
||||||
|
typingmap:Map<Member,number>=new Map();
|
||||||
|
async typingStart(typing):Promise<void>{
|
||||||
|
const memb=await Member.new(typing.d.member,this.guild);
|
||||||
|
if(!memb)return;
|
||||||
|
if(memb.id===this.localuser.user.id){
|
||||||
|
console.log("you is typing");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("user is typing and you should see it");
|
||||||
|
this.typingmap.set(memb,Date.now());
|
||||||
|
setTimeout(this.rendertyping.bind(this),10000);
|
||||||
|
this.rendertyping();
|
||||||
|
}
|
||||||
|
rendertyping():void{
|
||||||
|
const typingtext=document.getElementById("typing") as HTMLDivElement;
|
||||||
|
let build="";
|
||||||
|
let showing=false;
|
||||||
|
let i=0;
|
||||||
|
const curtime=Date.now()-5000;
|
||||||
|
for(const thing of this.typingmap.keys()){
|
||||||
|
if(this.typingmap.get(thing) as number>curtime){
|
||||||
|
if(i!==0){
|
||||||
|
build+=", ";
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
if(thing.nick){
|
||||||
|
build+=thing.nick;
|
||||||
|
}else{
|
||||||
|
build+=thing.user.username;
|
||||||
|
}
|
||||||
|
showing=true;
|
||||||
|
}else{
|
||||||
|
this.typingmap.delete(thing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i>1){
|
||||||
|
build+=" are typing";
|
||||||
|
}else{
|
||||||
|
build+=" is typing";
|
||||||
|
}
|
||||||
|
if(this.localuser.channelfocus===this){
|
||||||
|
if(showing){
|
||||||
|
typingtext.classList.remove("hidden");
|
||||||
|
const typingtext2=document.getElementById("typingtext") as HTMLDivElement;
|
||||||
|
typingtext2.textContent=build;
|
||||||
|
}else{
|
||||||
|
typingtext.classList.add("hidden");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
static regenLoadingMessages(){
|
static regenLoadingMessages(){
|
||||||
const loading=document.getElementById("loadingdiv") as HTMLDivElement;
|
const loading=document.getElementById("loadingdiv") as HTMLDivElement;
|
||||||
loading.innerHTML="";
|
loading.innerHTML="";
|
||||||
|
|
|
@ -143,7 +143,7 @@ class Group extends Channel{
|
||||||
const loading=document.getElementById("loadingdiv") as HTMLDivElement;
|
const loading=document.getElementById("loadingdiv") as HTMLDivElement;
|
||||||
Channel.regenLoadingMessages();
|
Channel.regenLoadingMessages();
|
||||||
loading.classList.add("loading");
|
loading.classList.add("loading");
|
||||||
|
this.rendertyping();
|
||||||
await this.putmessages();
|
await this.putmessages();
|
||||||
await prom;
|
await prom;
|
||||||
if(id!==Channel.genid){
|
if(id!==Channel.genid){
|
||||||
|
|
|
@ -32,7 +32,6 @@ class Localuser{
|
||||||
lookingguild:Guild|null;
|
lookingguild:Guild|null;
|
||||||
guildhtml:Map<string, HTMLDivElement>;
|
guildhtml:Map<string, HTMLDivElement>;
|
||||||
ws:WebSocket|undefined;
|
ws:WebSocket|undefined;
|
||||||
typing:Map<Member,number>=new Map();
|
|
||||||
connectionSucceed=0;
|
connectionSucceed=0;
|
||||||
errorBackoff=0;
|
errorBackoff=0;
|
||||||
readonly userMap=new Map<string,User>();
|
readonly userMap=new Map<string,User>();
|
||||||
|
@ -778,20 +777,13 @@ class Localuser{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async typingStart(typing):Promise<void>{
|
async typingStart(typing):Promise<void>{
|
||||||
if(this.channelfocus?.id===typing.d.channel_id){
|
//
|
||||||
const guild=this.guildids.get(typing.d.guild_id);
|
const guild=this.guildids.get(typing.d.guild_id);
|
||||||
if(!guild)return;
|
if(!guild)return;
|
||||||
const memb=await Member.new(typing.d.member,guild);
|
const channel=guild.channelids[typing.d.channel_id];
|
||||||
if(!memb)return;
|
if(!channel) return;
|
||||||
if(memb.id===this.user.id){
|
channel.typingStart(typing);
|
||||||
console.log("you is typing");
|
//this.typing.set(memb,Date.now());
|
||||||
return;
|
|
||||||
}
|
|
||||||
console.log("user is typing and you should see it");
|
|
||||||
this.typing.set(memb,Date.now());
|
|
||||||
setTimeout(this.rendertyping.bind(this),10000);
|
|
||||||
this.rendertyping();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
updatepfp(file:Blob):void{
|
updatepfp(file:Blob):void{
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
|
@ -836,41 +828,6 @@ class Localuser{
|
||||||
body: JSON.stringify(json)
|
body: JSON.stringify(json)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
rendertyping():void{
|
|
||||||
const typingtext=document.getElementById("typing") as HTMLDivElement;
|
|
||||||
let build="";
|
|
||||||
let showing=false;
|
|
||||||
let i=0;
|
|
||||||
const curtime=Date.now()-5000;
|
|
||||||
for(const thing of this.typing.keys()){
|
|
||||||
if(this.typing.get(thing) as number>curtime){
|
|
||||||
if(i!==0){
|
|
||||||
build+=", ";
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
if(thing.nick){
|
|
||||||
build+=thing.nick;
|
|
||||||
}else{
|
|
||||||
build+=thing.user.username;
|
|
||||||
}
|
|
||||||
showing=true;
|
|
||||||
}else{
|
|
||||||
this.typing.delete(thing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(i>1){
|
|
||||||
build+=" are typing";
|
|
||||||
}else{
|
|
||||||
build+=" is typing";
|
|
||||||
}
|
|
||||||
if(showing){
|
|
||||||
typingtext.classList.remove("hidden");
|
|
||||||
const typingtext2=document.getElementById("typingtext") as HTMLDivElement;
|
|
||||||
typingtext2.textContent=build;
|
|
||||||
}else{
|
|
||||||
typingtext.classList.add("hidden");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async showusersettings(){
|
async showusersettings(){
|
||||||
const settings=new Settings("Settings");
|
const settings=new Settings("Settings");
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue