Browse Source

Fix gifs blinking

Fix SW registration path
Some prealoders
Fix forwarded by channel to channel
master
morethanwords 4 years ago
parent
commit
0102df4247
  1. 4
      .gitignore
  2. 13
      server.js
  3. 27
      src/components/emoticonsDropdown.ts
  4. 4
      src/components/poll.ts
  5. 8
      src/components/preloader.ts
  6. 109
      src/components/wrappers.ts
  7. 35
      src/lib/appManagers/appDocsManager.ts
  8. 2
      src/lib/appManagers/appDownloadManager.ts
  9. 12
      src/lib/appManagers/appImManager.ts
  10. 4
      src/lib/appManagers/appMediaViewer.ts
  11. 2
      src/lib/appManagers/appMessagesManager.ts
  12. 37
      src/lib/appManagers/appPhotosManager.ts
  13. 5
      src/lib/mtproto/mtprotoworker.ts
  14. 2
      src/lib/richtextprocessor.js
  15. 3
      src/scss/partials/_emojiDropdown.scss
  16. 1
      tsconfig.json

4
.gitignore vendored

@ -5,4 +5,6 @@ dist @@ -5,4 +5,6 @@ dist
.DS_Store
stats.json
certs
src/rlottie.github.io
src/rlottie.github.io
public2
public3

13
server.js

@ -5,16 +5,21 @@ const fs = require('fs'); @@ -5,16 +5,21 @@ const fs = require('fs');
const app = express();
const thirdTour = process.argv[2] == 3;
const publicFolderName = thirdTour ? 'public3' : 'public';
const port = thirdTour ? 8443 : 443;
app.use(compression());
app.use(express.static('public'));
app.use(express.static(publicFolderName));
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public3/index.html');
res.sendFile(__dirname + `/${publicFolderName}/index.html`);
});
https.createServer({
key: fs.readFileSync(__dirname + '/certs/server-key.pem'),
cert: fs.readFileSync(__dirname + '/certs/server-cert.pem')
}, app).listen(443/* 9001 */, () => {
console.log('Listening...');
}, app).listen(port, () => {
console.log('Listening port:', port, 'folder:', publicFolderName);
});

27
src/components/emoticonsDropdown.ts

@ -625,13 +625,15 @@ class GifsTab implements EmoticonsTab { @@ -625,13 +625,15 @@ class GifsTab implements EmoticonsTab {
});
const video = div.querySelector('video');
video.addEventListener('loadeddata', () => {
video.addEventListener('canplay', () => {
div.style.opacity = '';
if(!mouseOut) {
img && img.remove();
img && img.classList.add('hide');
} else {
div.innerHTML = '';
div.append(img);
img && img.classList.remove('hide');
if(div.lastElementChild != img) {
div.lastElementChild.remove();
}
}
}, {once: true});
};
@ -654,9 +656,20 @@ class GifsTab implements EmoticonsTab { @@ -654,9 +656,20 @@ class GifsTab implements EmoticonsTab {
mouseOut = true;
div.innerHTML = '';
div.append(img);
div.addEventListener('mouseover', onMouseOver, {once: true});
const cb = () => {
if(div.lastElementChild != img) {
div.lastElementChild.remove();
}
div.addEventListener('mouseover', onMouseOver, {once: true});
};
img && img.classList.remove('hide');
/* window.requestAnimationFrame(() => {
window.requestAnimationFrame();
}); */
if(img) window.requestAnimationFrame(() => window.requestAnimationFrame(cb));
else cb();
});
};

4
src/components/poll.ts

@ -173,7 +173,7 @@ export default class PollElement extends HTMLElement { @@ -173,7 +173,7 @@ export default class PollElement extends HTMLElement {
if(!lineTotalLength) {
lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();
console.log('line total length:', lineTotalLength);
//console.log('line total length:', lineTotalLength);
}
this.pollID = this.getAttribute('poll-id');
@ -182,7 +182,7 @@ export default class PollElement extends HTMLElement { @@ -182,7 +182,7 @@ export default class PollElement extends HTMLElement {
connectedPolls.push({id: this.pollID, element: this});
console.log('pollElement poll:', poll, results);
//console.log('pollElement poll:', poll, results);
let desc = '';
if(poll.pFlags) {

8
src/components/preloader.ts

@ -50,7 +50,7 @@ export default class ProgressivePreloader { @@ -50,7 +50,7 @@ export default class ProgressivePreloader {
}
public attach(elem: Element, reset = true, promise?: CancellablePromise<any>, append = true) {
if(promise) {
if(promise/* && false */) {
this.promise = promise;
const tempID = --this.tempID;
@ -99,14 +99,14 @@ export default class ProgressivePreloader { @@ -99,14 +99,14 @@ export default class ProgressivePreloader {
this.detached = true;
if(this.preloader.parentElement) {
window.requestAnimationFrame(() => {
/* setTimeout(() => */window.requestAnimationFrame(() => {
if(!this.detached) return;
this.detached = true;
if(this.preloader.parentElement) {
this.preloader.parentElement.removeChild(this.preloader);
this.preloader.remove();
}
});
})/* , 5e3) */;
}
}

109
src/components/wrappers.ts

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
import appPhotosManager from '../lib/appManagers/appPhotosManager';
import appPhotosManager, { MTPhoto } from '../lib/appManagers/appPhotosManager';
import LottieLoader from '../lib/lottieLoader';
import appDocsManager from "../lib/appManagers/appDocsManager";
import { formatBytes, getEmojiToneIndex } from "../lib/utils";
@ -14,7 +14,7 @@ import { mediaSizes, isSafari } from '../lib/config'; @@ -14,7 +14,7 @@ import { mediaSizes, isSafari } from '../lib/config';
import { MTDocument, MTPhotoSize } from '../types';
import animationIntersector from './animationIntersector';
import AudioElement from './audio';
import appDownloadManager, { Download } from '../lib/appManagers/appDownloadManager';
import appDownloadManager, { Download, Progress, DownloadBlob } from '../lib/appManagers/appDownloadManager';
import { webpWorkerController } from '../lib/webp/webpWorkerController';
export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group}: {
@ -50,6 +50,10 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai @@ -50,6 +50,10 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai
}
}
if(doc.mime_type == 'image/gif') {
return wrapPhoto(doc, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware);
}
const video = document.createElement('video');
let img: HTMLImageElement;
@ -61,19 +65,16 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai @@ -61,19 +65,16 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai
if(withTail) {
img = wrapMediaWithTail(doc, message, container, boxWidth, boxHeight, isOut);
} else {
if(!boxWidth && !boxHeight) { // album
let sizes = doc.thumbs;
if(!doc.downloaded && sizes && sizes[0].bytes) {
appPhotosManager.setAttachmentPreview(sizes[0].bytes, container, false);
}
} else {
if(!container.firstElementChild || (container.firstElementChild.tagName != 'IMG' && container.firstElementChild.tagName != 'VIDEO')) {
appPhotosManager.setAttachmentSize(doc, container, boxWidth, boxHeight);
}
if(boxWidth && boxHeight) { // !album
appPhotosManager.setAttachmentSize(doc, container, boxWidth, boxHeight, false, true);
}
if(doc.thumbs && doc.thumbs[0]?.bytes) {
appPhotosManager.setAttachmentPreview(doc.thumbs[0].bytes, container, false);
}
img = container.lastElementChild as HTMLImageElement;
if(!img || img.tagName != 'IMG') {
if(img?.tagName != 'IMG') {
container.append(img = new Image());
}
}
@ -102,17 +103,26 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai @@ -102,17 +103,26 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai
}
const loadVideo = async() => {
if(middleware && !middleware()) {
return;
}
let preloader: ProgressivePreloader;
if(message?.media?.preloader) { // means upload
(message.media.preloader as ProgressivePreloader).attach(container, undefined, undefined, false);
} else if(!doc.downloaded) {
/* const promise = appDocsManager.downloadDoc(doc.id);
//if(!doc.supportsStreaming) {
const preloader = new ProgressivePreloader(container, true);
preloader.attach(container, true, promise, false);
//}
preloader = message.media.preloader as ProgressivePreloader;
preloader.attach(container, undefined, undefined, true);
} else if(!doc.downloaded && !doc.supportsStreaming) {
const promise = appDocsManager.downloadDocNew(doc);
preloader = new ProgressivePreloader(container, true);
preloader.attach(container, true, promise, true);
/* video.addEventListener('canplay', () => {
if(preloader) {
preloader.detach();
}
}, {once: true}); */
await promise; */
await promise;
}
if(middleware && !middleware()) {
@ -121,21 +131,21 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai @@ -121,21 +131,21 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai
//console.log('loaded doc:', doc, doc.url, container);
if(doc.type == 'gif'/* || true */) {
//if(doc.type == 'gif'/* || true */) {
video.addEventListener('canplay', () => {
if(img && img.parentElement) {
if(img?.parentElement) {
img.remove();
}
/* if(!video.paused) {
video.pause();
} */
if(group) {
if(doc.type == 'gif' && group) {
animationIntersector.addAnimation(video, group);
}
}, {once: true});
}
//}
renderImageFromUrl(video, doc.url);
video.setAttribute('playsinline', '');
@ -149,10 +159,9 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai @@ -149,10 +159,9 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai
//video.play();
video.autoplay = true;
} else if(doc.type == 'round') {
//video.dataset.ckin = doc.type == 'round' ? 'circle' : 'default';
video.dataset.ckin = 'circle';
video.dataset.overlay = '1';
let player = new VideoPlayer(video/* , doc.type != 'round' */);
new VideoPlayer(video);
}
};
@ -174,7 +183,7 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai @@ -174,7 +183,7 @@ export function wrapVideo({doc, container, message, boxWidth, boxHeight, withTai
return;
} */
doc.downloaded || !lazyLoadQueue/* && false */ ? loadVideo() : lazyLoadQueue.push({div: container, load: loadVideo/* , wasSeen: true */});
/* doc.downloaded || */!lazyLoadQueue/* && false */ ? loadVideo() : lazyLoadQueue.push({div: container, load: loadVideo/* , wasSeen: true */});
return video;
}
@ -228,7 +237,7 @@ export function wrapDocument(doc: MTDocument, withTime = false, uploading = fals @@ -228,7 +237,7 @@ export function wrapDocument(doc: MTDocument, withTime = false, uploading = fals
if(!uploading) {
let downloadDiv = docDiv.querySelector('.document-download') as HTMLDivElement;
let preloader: ProgressivePreloader;
let download: Download;
let download: DownloadBlob;
docDiv.addEventListener('click', () => {
if(!download) {
@ -271,16 +280,16 @@ export function wrapAudio(doc: MTDocument, withTime = false, mid?: number): HTML @@ -271,16 +280,16 @@ export function wrapAudio(doc: MTDocument, withTime = false, mid?: number): HTML
return elem;
}
function wrapMediaWithTail(photo: any, message: {mid: number, message: string}, container: HTMLDivElement, boxWidth: number, boxHeight: number, isOut: boolean) {
let svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
function wrapMediaWithTail(photo: MTPhoto | MTDocument, message: {mid: number, message: string}, container: HTMLDivElement, boxWidth: number, boxHeight: number, isOut: boolean) {
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');
let foreignObject = document.createElementNS("http://www.w3.org/2000/svg", 'foreignObject');
const foreignObject = document.createElementNS("http://www.w3.org/2000/svg", 'foreignObject');
appPhotosManager.setAttachmentSize(photo._ == 'document' ? photo : photo.id, foreignObject, boxWidth, boxHeight);
appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight/* , false, true */);
let width = +foreignObject.getAttributeNS(null, 'width');
let height = +foreignObject.getAttributeNS(null, 'height');
const width = +foreignObject.getAttributeNS(null, 'width');
const height = +foreignObject.getAttributeNS(null, 'height');
svg.setAttributeNS(null, 'width', '' + width);
svg.setAttributeNS(null, 'height', '' + height);
@ -288,10 +297,10 @@ function wrapMediaWithTail(photo: any, message: {mid: number, message: string}, @@ -288,10 +297,10 @@ function wrapMediaWithTail(photo: any, message: {mid: number, message: string},
svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
svg.setAttributeNS(null, 'preserveAspectRatio', 'none');
let clipID = 'clip' + message.mid;
const clipID = 'clip' + message.mid;
svg.dataset.clipID = clipID;
let defs = document.createElementNS("http://www.w3.org/2000/svg", 'defs');
const defs = document.createElementNS("http://www.w3.org/2000/svg", 'defs');
let clipPathHTML: string = '';
if(message.message) {
@ -326,20 +335,20 @@ function wrapMediaWithTail(photo: any, message: {mid: number, message: string}, @@ -326,20 +335,20 @@ function wrapMediaWithTail(photo: any, message: {mid: number, message: string},
return img;
}
export function wrapPhoto(photoID: any, message: any, container: HTMLDivElement, boxWidth = mediaSizes.active.regular.width, boxHeight = mediaSizes.active.regular.height, withTail = true, isOut = false, lazyLoadQueue: LazyLoadQueue, middleware: () => boolean, size: MTPhotoSize = null) {
const photo = appPhotosManager.getPhoto(photoID);
export function wrapPhoto(photo: MTPhoto | MTDocument, message: any, container: HTMLDivElement, boxWidth = mediaSizes.active.regular.width, boxHeight = mediaSizes.active.regular.height, withTail = true, isOut = false, lazyLoadQueue: LazyLoadQueue, middleware: () => boolean, size: MTPhotoSize = null) {
let image: HTMLImageElement;
if(withTail) {
image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);
} else {
if(size) { // album
let sizes = photo.sizes;
if(!photo.downloaded && sizes && sizes[0].bytes) {
appPhotosManager.setAttachmentPreview(sizes[0].bytes, container, false);
if(boxWidth && boxHeight) { // !album
size = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, false, true);
}
if(photo._ == 'document' || !photo.downloaded) {
const thumbs = (photo as MTPhoto).sizes || (photo as MTDocument).thumbs;
if(thumbs && thumbs[0]?.bytes) {
appPhotosManager.setAttachmentPreview(thumbs[0].bytes, container, false);
}
} else if(boxWidth && boxHeight) { // means webpage's preview
size = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, false);
}
image = container.lastElementChild as HTMLImageElement;
@ -360,7 +369,7 @@ export function wrapPhoto(photoID: any, message: any, container: HTMLDivElement, @@ -360,7 +369,7 @@ export function wrapPhoto(photoID: any, message: any, container: HTMLDivElement,
}
const load = () => {
const promise = appPhotosManager.preloadPhoto(photoID, size);
const promise = photo._ == 'document' && photo.animated ? appDocsManager.downloadDocNew(photo) : appPhotosManager.preloadPhoto(photo, size);
if(preloader) {
preloader.attach(container, true, promise);
@ -378,7 +387,7 @@ export function wrapPhoto(photoID: any, message: any, container: HTMLDivElement, @@ -378,7 +387,7 @@ export function wrapPhoto(photoID: any, message: any, container: HTMLDivElement,
return promise.then(() => {
if(middleware && !middleware()) return;
renderImageFromUrl(image || container, cacheContext.url);
renderImageFromUrl(image || container, cacheContext.url || photo.url);
});
};
@ -697,7 +706,7 @@ export function wrapAlbum({groupID, attachmentDiv, middleware, uploading, lazyLo @@ -697,7 +706,7 @@ export function wrapAlbum({groupID, attachmentDiv, middleware, uploading, lazyLo
if(media._ == 'photo') {
wrapPhoto(
media.id,
media,
message,
div,
0,

35
src/lib/appManagers/appDocsManager.ts

@ -4,7 +4,7 @@ import { isObject, getFileURL, FileURLType } from '../utils'; @@ -4,7 +4,7 @@ import { isObject, getFileURL, FileURLType } from '../utils';
import opusDecodeController from '../opusDecodeController';
import { MTDocument, inputDocumentFileLocation, MTPhotoSize } from '../../types';
import { getFileNameByLocation } from '../bin_utils';
import appDownloadManager, { Download, ResponseMethod } from './appDownloadManager';
import appDownloadManager, { Download, ResponseMethod, DownloadBlob } from './appDownloadManager';
import appPhotosManager from './appPhotosManager';
class AppDocsManager {
@ -60,7 +60,7 @@ class AppDocsManager { @@ -60,7 +60,7 @@ class AppDocsManager {
apiDoc.w = attribute.w;
apiDoc.h = attribute.h;
//apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;
if(apiDoc.thumbs && attribute.pFlags.round_message) {
if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {
apiDoc.type = 'round';
} else /* if(apiDoc.thumbs) */ {
apiDoc.type = 'video';
@ -93,7 +93,7 @@ class AppDocsManager { @@ -93,7 +93,7 @@ class AppDocsManager {
break;
case 'documentAttributeAnimated':
if((apiDoc.mime_type == 'image/gif' || apiDoc.mime_type == 'video/mp4') && apiDoc.thumbs) {
if((apiDoc.mime_type == 'image/gif' || apiDoc.mime_type == 'video/mp4')/* && apiDoc.thumbs */) {
apiDoc.type = 'gif';
}
@ -211,14 +211,19 @@ class AppDocsManager { @@ -211,14 +211,19 @@ class AppDocsManager {
public getThumbURL(doc: MTDocument, useBytes = true) {
if(doc.thumbs?.length) {
if(doc.thumbs[0].bytes && useBytes) {
return appPhotosManager.getPreviewURLFromBytes(doc.thumbs[0].bytes, !!doc.sticker);
let thumb: MTPhotoSize;
if(!useBytes) {
thumb = doc.thumbs.find(t => !t.bytes);
}
if(!thumb) {
thumb = doc.thumbs[0];
}
const thumb = doc.thumbs.find(t => !t.bytes);
if(thumb) {
const url = this.getFileURL(doc, false, thumb);
return url;
if(thumb.bytes) {
return appPhotosManager.getPreviewURLFromBytes(doc.thumbs[0].bytes, !!doc.sticker);
} else {
return this.getFileURL(doc, false, thumb);
}
}
@ -291,7 +296,7 @@ class AppDocsManager { @@ -291,7 +296,7 @@ class AppDocsManager {
return this.downloadPromises[doc.id] = deferred;
}
public downloadDocNew(docID: string | MTDocument/* , method: ResponseMethod = 'blob' */): Download {
public downloadDocNew(docID: string | MTDocument/* , method: ResponseMethod = 'blob' */): DownloadBlob {
const doc = this.getDoc(docID);
if(doc._ == 'documentEmpty') {
@ -300,16 +305,20 @@ class AppDocsManager { @@ -300,16 +305,20 @@ class AppDocsManager {
const fileName = this.getInputFileName(doc);
let download = appDownloadManager.getDownload(fileName);
let download: DownloadBlob = appDownloadManager.getDownload(fileName);
if(download) {
return download;
}
download = appDownloadManager.download(doc.url, fileName, /*method*/);
download = appDownloadManager.download(doc.url, fileName/* , method */);
const originalPromise = download;
originalPromise.then(() => {
originalPromise.then((blob) => {
doc.downloaded = true;
if(!doc.supportsStreaming) {
doc.url = URL.createObjectURL(blob);
}
});
if(doc.type == 'voice' && !opusDecodeController.isPlaySupported()) {

2
src/lib/appManagers/appDownloadManager.ts

@ -40,7 +40,7 @@ export class AppDownloadManager { @@ -40,7 +40,7 @@ export class AppDownloadManager {
public download(url: string, fileName: string, responseMethod?: ResponseMethodBlob): DownloadBlob;
public download(url: string, fileName: string, responseMethod?: ResponseMethodJson): DownloadJson;
public download(url: string, fileName: string, responseMethod: ResponseMethod = 'blob'): Download {
public download(url: string, fileName: string, responseMethod: ResponseMethod = 'blob'): DownloadBlob {
if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];
const deferred = deferredPromise<Blob>();

12
src/lib/appManagers/appImManager.ts

@ -2215,7 +2215,7 @@ export class AppImManager { @@ -2215,7 +2215,7 @@ export class AppImManager {
this.log('will wrap pending photo:', pending, message, appPhotosManager.getPhoto(message.id));
const tailSupported = !isAndroid;
if(tailSupported) bubble.classList.add('with-media-tail');
wrapPhoto(message.id, message, attachmentDiv, undefined, undefined, tailSupported, true, this.lazyLoadQueue, null);
wrapPhoto(appPhotosManager.getPhoto(message.id), message, attachmentDiv, undefined, undefined, tailSupported, true, this.lazyLoadQueue, null);
bubble.classList.add('hide-name', 'photo');
//}
@ -2304,7 +2304,7 @@ export class AppImManager { @@ -2304,7 +2304,7 @@ export class AppImManager {
}
}
wrapPhoto(photo.id, message, attachmentDiv, undefined, undefined, tailSupported, isOut, this.lazyLoadQueue, this.getMiddleware());
wrapPhoto(photo, message, attachmentDiv, undefined, undefined, tailSupported, isOut, this.lazyLoadQueue, this.getMiddleware());
break;
}
@ -2401,7 +2401,7 @@ export class AppImManager { @@ -2401,7 +2401,7 @@ export class AppImManager {
bubble.classList.add('is-vertical-photo');
}
wrapPhoto(webpage.photo.id, message, preview, mediaSizes.active.webpage.width, mediaSizes.active.webpage.height, false, null, this.lazyLoadQueue, this.getMiddleware());
wrapPhoto(webpage.photo, message, preview, mediaSizes.active.webpage.width, mediaSizes.active.webpage.height, false, null, this.lazyLoadQueue, this.getMiddleware());
}
box.append(quote);
@ -2566,6 +2566,8 @@ export class AppImManager { @@ -2566,6 +2566,8 @@ export class AppImManager {
if((this.peerID < 0 && !our) || message.fwd_from || message.reply_to_mid) { // chat
let title = appPeersManager.getPeerTitle(message.fwdFromID || message.fromID);
const isForwardFromChannel = !message.fromID && message.fwd_from;
let isHidden = message.fwd_from && !message.fwd_from.from_id && !message.fwd_from.channel_id;
if(isHidden) {
@ -2594,7 +2596,7 @@ export class AppImManager { @@ -2594,7 +2596,7 @@ export class AppImManager {
nameDiv.classList.add('name');
nameDiv.dataset.peerID = message.fwdFromID;
if(this.peerID == this.myID) {
if(this.peerID == this.myID || isForwardFromChannel) {
nameDiv.style.color = appPeersManager.getPeerColorByID(message.fwdFromID, false);
nameDiv.innerHTML = title;
} else {
@ -2650,7 +2652,7 @@ export class AppImManager { @@ -2650,7 +2652,7 @@ export class AppImManager {
avatarElem.setAttribute('peer-title', message.fwd_from.from_name);
}
avatarElem.setAttribute('peer', '' + ((message.fwd_from && this.peerID == this.myID ? message.fwdFromID : message.fromID) || 0));
avatarElem.setAttribute('peer', '' + (((message.fwd_from && this.peerID == this.myID) || isForwardFromChannel ? message.fwdFromID : message.fromID) || 0));
avatarElem.update();
//this.log('exec loadDialogPhoto', message);

4
src/lib/appManagers/appMediaViewer.ts

@ -132,7 +132,7 @@ export class AppMediaViewer { @@ -132,7 +132,7 @@ export class AppMediaViewer {
const download = (e: MouseEvent) => {
let message = appMessagesManager.getMessage(this.currentMessageID);
if(message.media.photo) {
appPhotosManager.savePhotoFile(message.media.photo.id);
appPhotosManager.savePhotoFile(message.media.photo);
} else {
let document: any = null;
@ -759,7 +759,7 @@ export class AppMediaViewer { @@ -759,7 +759,7 @@ export class AppMediaViewer {
//const maxWidth = appPhotosManager.windowW - 16;
const maxWidth = mediaSizes.isMobile ? this.pageEl.scrollWidth : this.pageEl.scrollWidth - 16;
const maxHeight = appPhotosManager.windowH - 100;
const size = appPhotosManager.setAttachmentSize(isVideo ? media : media.id, container, maxWidth, maxHeight);
const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight);
// need after setAttachmentSize
/* if(useContainerAsTarget) {

2
src/lib/appManagers/appMessagesManager.ts

@ -1572,7 +1572,7 @@ export class AppMessagesManager { @@ -1572,7 +1572,7 @@ export class AppMessagesManager {
if(messageMedia.photo) {
let photo = messageMedia.photo;
appPhotosManager.savePhoto(photo);
inputMedia = appPhotosManager.getInputByID(photo.id);
inputMedia = appPhotosManager.getInput(photo);
} else {
let doc = messageMedia.document;
appDocsManager.saveDoc(doc);

37
src/lib/appManagers/appPhotosManager.ts

@ -1,12 +1,12 @@ @@ -1,12 +1,12 @@
import { calcImageInBox, isObject, getFileURL } from "../utils";
import { bytesFromHex, getFileNameByLocation } from "../bin_utils";
import { MTPhotoSize, inputPhotoFileLocation, inputDocumentFileLocation, FileLocation } from "../../types";
import { MTPhotoSize, inputPhotoFileLocation, inputDocumentFileLocation, FileLocation, MTDocument } from "../../types";
import appDownloadManager, { Download } from "./appDownloadManager";
import { deferredPromise, CancellablePromise } from "../polyfill";
import { isSafari } from "../../helpers/userAgent";
export type MTPhoto = {
_: 'photo' | 'photoEmpty' | string,
_: 'photo' | 'photoEmpty',
pFlags: any,
flags: number,
id: string,
@ -61,7 +61,7 @@ export class AppPhotosManager { @@ -61,7 +61,7 @@ export class AppPhotosManager {
return photo;
}
public choosePhotoSize(photo: any, width = 0, height = 0) {
public choosePhotoSize(photo: MTPhoto | MTDocument, width = 0, height = 0) {
//if(Config.Navigator.retina) {
if(window.devicePixelRatio > 1) {
width *= 2;
@ -80,14 +80,14 @@ export class AppPhotosManager { @@ -80,14 +80,14 @@ export class AppPhotosManager {
d crop 1280x1280 */
let bestPhotoSize: MTPhotoSize = {_: 'photoSizeEmpty'};
let sizes = (photo.sizes || photo.thumbs) as typeof bestPhotoSize[];
const sizes = ((photo as MTPhoto).sizes || (photo as MTDocument).thumbs) as typeof bestPhotoSize[];
if(sizes) {
for(let photoSize of sizes) {
for(const photoSize of sizes) {
if(!photoSize.w || !photoSize.h) continue;
bestPhotoSize = photoSize;
let {w, h} = calcImageInBox(photoSize.w, photoSize.h, width, height);
const {w, h} = calcImageInBox(photoSize.w, photoSize.h, width, height);
if(w == width || h == height) {
break;
}
@ -142,7 +142,7 @@ export class AppPhotosManager { @@ -142,7 +142,7 @@ export class AppPhotosManager {
return URL.createObjectURL(blob);
}
public getPreviewURLFromThumb(thumb: any, isSticker = false) {
public getPreviewURLFromThumb(thumb: MTPhotoSize, isSticker = false) {
return thumb.url ?? (thumb.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));
}
@ -171,21 +171,12 @@ export class AppPhotosManager { @@ -171,21 +171,12 @@ export class AppPhotosManager {
}
}
public setAttachmentSize(photoID: any, element: HTMLElement | SVGForeignObjectElement, boxWidth: number, boxHeight: number, isSticker = false) {
let photo: /* MTDocument | MTPhoto */any = null;
if(typeof(photoID) === 'string') {
photo = this.photos[photoID];
if(!photo) return {_: 'photoEmpty'};
} else {
photo = photoID;
}
public setAttachmentSize(photo: MTPhoto | MTDocument, element: HTMLElement | SVGForeignObjectElement, boxWidth: number, boxHeight: number, isSticker = false, dontRenderPreview = false) {
let photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight);
//console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);
let sizes = photo.sizes || photo.thumbs;
if(!photo.downloaded && !isSticker && sizes && sizes[0].bytes) {
let sizes = (photo as MTPhoto).sizes || (photo as MTDocument).thumbs;
if((!photo.downloaded || (photo as MTDocument).type == 'video' || (photo as MTDocument).type == 'gif') && !isSticker && sizes && sizes[0].bytes && !dontRenderPreview) {
this.setAttachmentPreview(sizes[0].bytes, element, isSticker);
}
@ -213,7 +204,7 @@ export class AppPhotosManager { @@ -213,7 +204,7 @@ export class AppPhotosManager {
return photoSize;
}
public getPhotoURL(photo: MTPhoto, photoSize: MTPhotoSize) {
public getPhotoURL(photo: MTPhoto | MTDocument, photoSize: MTPhotoSize) {
const isDocument = photo._ == 'document';
if(!photoSize || photoSize._ == 'photoSizeEmpty') {
@ -285,8 +276,7 @@ export class AppPhotosManager { @@ -285,8 +276,7 @@ export class AppPhotosManager {
return isObject(photoID) ? photoID : this.photos[photoID];
}
public getInputByID(photoID: any) {
let photo = this.getPhoto(photoID);
public getInput(photo: MTPhoto) {
return {
_: 'inputMediaPhoto',
flags: 0,
@ -300,8 +290,7 @@ export class AppPhotosManager { @@ -300,8 +290,7 @@ export class AppPhotosManager {
};
}
public savePhotoFile(photoID: string) {
const photo = this.photos[photoID];
public savePhotoFile(photo: MTPhoto | MTDocument) {
const fullWidth = this.windowW;
const fullHeight = this.windowH;
const fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);

5
src/lib/mtproto/mtprotoworker.ts

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
import {isObject, $rootScope} from '../utils';
import AppStorage from '../storage';
import CryptoWorkerMethods from '../crypto/crypto_methods';
import runtime from 'serviceworker-webpack-plugin/lib/runtime';
//import runtime from 'serviceworker-webpack-plugin/lib/runtime';
import { logger } from '../logger';
import { webpWorkerController } from '../webp/webpWorkerController';
@ -33,7 +33,8 @@ class ApiManagerProxy extends CryptoWorkerMethods { @@ -33,7 +33,8 @@ class ApiManagerProxy extends CryptoWorkerMethods {
/**
* Service worker
*/
(runtime.register({ scope: '/' }) as Promise<ServiceWorkerRegistration>).then(registration => {
//(runtime.register({ scope: './' }) as Promise<ServiceWorkerRegistration>).then(registration => {
navigator.serviceWorker.register('./sw.js', {scope: './'}).then(registration => {
}, (err) => {
this.log.error('SW registration failed!', err);

2
src/lib/richtextprocessor.js

@ -8,7 +8,7 @@ var EmojiHelper = { @@ -8,7 +8,7 @@ var EmojiHelper = {
};
var emojiData = Config.Emoji;
var emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) != -1/* && false */,
var emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) != -1/* && false *//* || true */,
emojiCode;
// added * to (?:[©®\\u2122\\u265f]\\ufe0f) and removed \\ufe0f from end

3
src/scss/partials/_emojiDropdown.scss

@ -341,6 +341,9 @@ @@ -341,6 +341,9 @@
object-fit: cover;
width: 100%;
height: 100%;
}
img {
position: absolute;
left: 0;
top: 0;

1
tsconfig.json

@ -71,5 +71,6 @@ @@ -71,5 +71,6 @@
"./src/lib/*.js",
"./src/*.js",
"*.js",
"public3"
]
}

Loading…
Cancel
Save