Telegram Web K with changes to work inside I2P https://web.telegram.i2p/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

214 lines
6.9 KiB

/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import appSidebarLeft, { SettingSection } from "..";
import { InputFile } from "../../../layer";
import appDialogsManager from "../../../lib/appManagers/appDialogsManager";
import InputField from "../../inputField";
import { SliderSuperTab } from "../../slider";
import AvatarEdit from "../../avatarEdit";
import I18n from "../../../lib/langPack";
import ButtonCorner from "../../buttonCorner";
import getUserStatusString from "../../wrappers/getUserStatusString";
import appImManager from "../../../lib/appManagers/appImManager";
interface OpenStreetMapInterface {
place_id?: number;
license?: string;
osm_type?: string;
osm_id?: number;
lat?: string;
lon?: string;
display_name: string;
address?: object;
boundingbox?: object;
}
export default class AppNewGroupTab extends SliderSuperTab {
private avatarEdit: AvatarEdit;
private uploadAvatar: () => Promise<InputFile> = null;
private peerIds: PeerId[];
private isGeoChat: boolean = false;
private nextBtn: HTMLButtonElement;
private groupNameInputField: InputField;
private list: HTMLUListElement;
private groupLocationInputField: InputField;
private userLocationCoords: {lat: number, long: number};
private userLocationAddress: string;
protected init() {
this.container.classList.add('new-group-container');
this.setTitle('NewGroup');
this.avatarEdit = new AvatarEdit((_upload) => {
this.uploadAvatar = _upload;
});
const section = new SettingSection({});
const inputWrapper = document.createElement('div');
inputWrapper.classList.add('input-wrapper');
this.groupNameInputField = new InputField({
label: 'CreateGroup.NameHolder',
maxLength: 128
});
this.groupLocationInputField = new InputField({
label: 'ChatLocation',
name: 'location',
canBeEdited: false
});
inputWrapper.append(
this.groupNameInputField.container,
this.groupLocationInputField.container
);
this.groupNameInputField.input.addEventListener('input', () => {
const value = this.groupNameInputField.value;
let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');
if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;
this.nextBtn.classList.toggle('is-visible', !!valueCheck);
});
this.nextBtn = ButtonCorner({icon: 'arrow_next'});
this.nextBtn.addEventListener('click', () => {
const title = this.groupNameInputField.value;
let promise: Promise<ChatId>;
if(this.isGeoChat) {
if(!this.userLocationAddress || !this.userLocationCoords) return;
promise = this.managers.appChatsManager.createChannel({
title,
about: '',
geo_point: {
_: 'inputGeoPoint',
...this.userLocationCoords,
},
address: this.userLocationAddress,
megagroup: true
}).then((chatId) => {
if(this.uploadAvatar) {
this.uploadAvatar().then((inputFile) => {
this.managers.appChatsManager.editPhoto(chatId, inputFile);
});
}
if(this.peerIds.length) {
this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);
}
return chatId;
});
} else {
this.nextBtn.disabled = true;
promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {
if(this.uploadAvatar) {
this.uploadAvatar().then((inputFile) => {
this.managers.appChatsManager.editPhoto(chatId, inputFile);
});
}
return chatId;
});
}
if(!promise) {
return;
}
promise.then((chatId) => {
appSidebarLeft.removeTabFromHistory(this);
appSidebarLeft.selectTab(0);
appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});
});
});
const chatsSection = new SettingSection({
name: 'Members',
nameArgs: [this.peerIds.length]
});
const list = this.list = appDialogsManager.createChatList({
new: true
});
chatsSection.content.append(list);
section.content.append(this.avatarEdit.container, inputWrapper);
this.content.append(this.nextBtn);
this.scrollable.append(section.container, chatsSection.container);
}
public onCloseAfterTimeout() {
this.avatarEdit.clear();
this.uploadAvatar = null;
this.groupNameInputField.value = '';
this.groupLocationInputField.container.classList.add('hide');
this.nextBtn.disabled = false;
}
public open(peerIds: PeerId[], isGeoChat: boolean = false) {
this.isGeoChat = isGeoChat;
this.peerIds = peerIds;
const result = super.open();
result.then(() => {
if(isGeoChat) {
this.setTitle('NearbyCreateGroup');
this.groupLocationInputField.container.classList.remove('hide');
this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));
this.startLocating();
} else {
this.groupLocationInputField.container.classList.add('hide');
}
return Promise.all(this.peerIds.map(async(userId) => {
const {dom} = appDialogsManager.addDialogNew({
peerId: userId,
container: this.list,
rippleEnabled: false,
avatarSize: 48
});
dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));
}));
});
return result;
}
private startLocating() {
navigator.geolocation.getCurrentPosition((location) => {
this.userLocationCoords = {
lat: location.coords.latitude,
long: location.coords.longitude
};
let uri = "https://nominatim.openstreetmap.org/reverse";
uri += "?lat="+location.coords.latitude;
uri += "&lon="+location.coords.longitude;
uri += "&format=json";
uri += "&addressdetails=1";
uri += "&accept-language=en";
fetch(uri)
.then((response) => response.json())
.then((response: OpenStreetMapInterface) => {
this.userLocationAddress = response.display_name;
this.groupLocationInputField.setValueSilently(response.display_name);
});
}, (error) => {
if(error instanceof GeolocationPositionError) {
this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');
} else {
this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');
}
});
}
}