diff --git a/public/embico/telegram.png b/public/embico/telegram.png
new file mode 100644
index 00000000..00450dce
Binary files /dev/null and b/public/embico/telegram.png differ
diff --git a/src/components/MdLink.jsx b/src/components/MdLink.jsx
index 374e5899..3c2c7343 100644
--- a/src/components/MdLink.jsx
+++ b/src/components/MdLink.jsx
@@ -15,6 +15,7 @@ const titleAllowed = [
'matrix.pixelplanet.fun',
'youtube',
'youtu.be',
+ 't.me',
];
const MdLink = ({ href, title }) => {
diff --git a/src/components/Modtools.jsx b/src/components/Modtools.jsx
index 2156b1a0..eb8adb68 100644
--- a/src/components/Modtools.jsx
+++ b/src/components/Modtools.jsx
@@ -7,7 +7,7 @@ import React, { useState, useEffect } from 'react';
import { useSelector, shallowEqual } from 'react-redux';
import { t } from 'ttag';
-import useInterval from './hooks/useInterval';
+import useInterval from './hooks/interval';
import { getToday, dateToString } from '../core/utils';
const keptState = {
diff --git a/src/components/embeds/Telegram.jsx b/src/components/embeds/Telegram.jsx
new file mode 100644
index 00000000..21d1e41d
--- /dev/null
+++ b/src/components/embeds/Telegram.jsx
@@ -0,0 +1,84 @@
+import React, { useState, useEffect, useRef } from 'react';
+
+import usePostMessage from '../hooks/postMessage';
+
+const urlStr = 't.me/';
+
+function getUserPostFromUrl(url) {
+ let aPos = url.indexOf(urlStr);
+ if (aPos === -1) {
+ return url;
+ }
+ aPos += urlStr.length;
+ if (aPos >= url.length) {
+ return url;
+ }
+ let bPos = url.indexOf('/', aPos);
+ if (bPos === -1) {
+ bPos = url.length;
+ return url.substring(aPos);
+ }
+ const user = url.substring(aPos, bPos);
+ bPos += 1;
+ if (bPos >= url.length) {
+ return user;
+ }
+ aPos = url.indexOf('/', bPos);
+ if (aPos === -1) {
+ aPos = url.length;
+ }
+ const post = url.substring(bPos, aPos);
+ return `${user} | ${post}`;
+}
+
+const Telegram = ({ url }) => {
+ const [frameHeight, setFrameHeight] = useState(200);
+ const iFrameRef = useRef(null);
+
+ usePostMessage(iFrameRef,
+ (data) => {
+ try {
+ const pdata = JSON.parse(data);
+ if (pdata.event === 'resize') {
+ if (pdata.height) {
+ setFrameHeight(pdata.height);
+ }
+ }
+ } catch {
+ console.error(`Could not read postMessage from frame: ${data}`);
+ }
+ },
+ );
+
+ const userPost = url.substring(url.indexOf(urlStr) + urlStr.length)
+ const embedCode =
+ // eslint-disable-next-line max-len
+ ``;
+
+// srcDoc={embedCode}
+ return (
+
+ );
+};
+
+export default [
+ React.memo(Telegram),
+ (url) => url.includes(urlStr),
+ (url) => getUserPostFromUrl(url),
+ `${window.ssv.assetserver}/embico/telegram.png`,
+];
diff --git a/src/components/embeds/index.js b/src/components/embeds/index.js
index d3424e77..846ab4cc 100644
--- a/src/components/embeds/index.js
+++ b/src/components/embeds/index.js
@@ -1,10 +1,12 @@
/*
* Embeds for external content like youtube, etc.
+ * Usage for Markdown is in ../MdLink.js
*
*/
import TikTok from './TikTok';
import YouTube from './YouTube';
import Matrix from './Matrix';
+import Telegram from './Telegram';
// import Odysee from './Odysee';
import DirectLinkMedia from './DirectLinkMedia';
@@ -15,6 +17,8 @@ import DirectLinkMedia from './DirectLinkMedia';
* ReactElement: takes url as prop,
* isEmbedAvailable: function that takes url as argument and returns boolean
* whether embed is available for this url of this domain
+ * title: function that returns the title for a link, gets url as argument
+ * icon: link to icon
* ]
*/
export default {
@@ -28,5 +32,6 @@ export default {
'files.catbox.moe': DirectLinkMedia,
'i.redd.it': DirectLinkMedia,
'media.consumeproduct.win': DirectLinkMedia,
+ 't.me': Telegram,
// 'odysee': Odysee,
};
diff --git a/src/components/hooks/drag.js b/src/components/hooks/drag.js
index 62eba03e..6ea252c5 100644
--- a/src/components/hooks/drag.js
+++ b/src/components/hooks/drag.js
@@ -49,7 +49,7 @@ function useDrag(elRef, startHandler, diffHandler) {
}, [startHandler]);
useEffect(() => {
- if (elRef && elRef.current) {
+ if (elRef.current) {
elRef.current.addEventListener('mousedown', startDrag, {
passive: false,
});
@@ -58,7 +58,7 @@ function useDrag(elRef, startHandler, diffHandler) {
});
}
return () => {
- if (elRef && elRef.current) {
+ if (elRef.current) {
elRef.current.removeEventListener('mousedown', startDrag);
elRef.current.removeEventListener('touchstart', startDrag);
}
diff --git a/src/components/hooks/useInterval.js b/src/components/hooks/interval.js
similarity index 100%
rename from src/components/hooks/useInterval.js
rename to src/components/hooks/interval.js
diff --git a/src/components/hooks/postMessage.js b/src/components/hooks/postMessage.js
new file mode 100644
index 00000000..8068a4cf
--- /dev/null
+++ b/src/components/hooks/postMessage.js
@@ -0,0 +1,25 @@
+import { useEffect, useRef } from 'react';
+
+function usePostMessage(iFrameRef, callback) {
+ const savedCallback = useRef();
+
+ // Remember the latest callback.
+ useEffect(() => {
+ savedCallback.current = callback;
+ }, [callback]);
+
+ useEffect(() => {
+ function handleMessage(evt) {
+ if (evt.source !== iFrameRef.current.contentWindow) {
+ return;
+ }
+ savedCallback.current(evt.data);
+ }
+
+ window.addEventListener('message', handleMessage, false);
+
+ return () => window.removeEventListener('message', handleMessage);
+ }, []);
+}
+
+export default usePostMessage;
diff --git a/src/components/telegram-widget.js b/src/components/telegram-widget.js
new file mode 100644
index 00000000..6d930252
--- /dev/null
+++ b/src/components/telegram-widget.js
@@ -0,0 +1,528 @@
+(function(window) {
+ (function(window){
+ window.__parseFunction = function(__func, __attrs) {
+ __attrs = __attrs || [];
+ __func = '(function(' + __attrs.join(',') + '){' + __func + '})';
+ return window.execScript ? window.execScript(__func) : eval(__func);
+ }
+ }(window));
+ (function(window){
+
+ function addEvent(el, event, handler) {
+ var events = event.split(/\s+/);
+ for (var i = 0; i < events.length; i++) {
+ if (el.addEventListener) {
+ el.addEventListener(events[i], handler);
+ } else {
+ el.attachEvent('on' + events[i], handler);
+ }
+ }
+ }
+ function removeEvent(el, event, handler) {
+ var events = event.split(/\s+/);
+ for (var i = 0; i < events.length; i++) {
+ if (el.removeEventListener) {
+ el.removeEventListener(events[i], handler);
+ } else {
+ el.detachEvent('on' + events[i], handler);
+ }
+ }
+ }
+ function getCssProperty(el, prop) {
+ if (window.getComputedStyle) {
+ return window.getComputedStyle(el, '').getPropertyValue(prop) || null;
+ } else if (el.currentStyle) {
+ return el.currentStyle[prop] || null;
+ }
+ return null;
+ }
+ function geById(el_or_id) {
+ if (typeof el_or_id == 'string' || el_or_id instanceof String) {
+ return document.getElementById(el_or_id);
+ } else if (el_or_id instanceof HTMLElement) {
+ return el_or_id;
+ }
+ return null;
+ }
+
+ var getWidgetsOrigin = function(default_origin, dev_origin) {
+ var link = document.createElement('A'), origin;
+ link.href = document.currentScript && document.currentScript.src || default_origin;
+ origin = link.origin || link.protocol + '//' + link.hostname;
+ if (origin == 'https://telegram.org') {
+ origin = default_origin;
+ } else if (origin == 'https://telegram-js.azureedge.net' || origin == 'https://tg.dev') {
+ origin = dev_origin;
+ }
+ return origin;
+ };
+
+ var getPageCanonical = function() {
+ var a = document.createElement('A'), link, href;
+ if (document.querySelector) {
+ link = document.querySelector('link[rel="canonical"]');
+ if (link && (href = link.getAttribute('href'))) {
+ a.href = href;
+ return a.href;
+ }
+ } else {
+ var links = document.getElementsByTagName('LINK');
+ for (var i = 0; i < links.length; i++) {
+ if ((link = links[i]) &&
+ (link.getAttribute('rel') == 'canonical') &&
+ (href = link.getAttribute('href'))) {
+ a.href = href;
+ return a.href;
+ }
+ }
+ }
+ return false;
+ };
+
+ function getXHR() {
+ if (navigator.appName == "Microsoft Internet Explorer"){
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ } else {
+ return new XMLHttpRequest();
+ }
+ }
+
+ if (!window.Telegram) {
+ window.Telegram = {};
+ }
+ if (!window.Telegram.__WidgetUuid) {
+ window.Telegram.__WidgetUuid = 0;
+ }
+ if (!window.Telegram.__WidgetLastId) {
+ window.Telegram.__WidgetLastId = 0;
+ }
+ if (!window.Telegram.__WidgetCallbacks) {
+ window.Telegram.__WidgetCallbacks = {};
+ }
+
+ function postMessageToIframe(iframe, event, data, callback) {
+ if (!iframe._ready) {
+ if (!iframe._readyQueue) iframe._readyQueue = [];
+ iframe._readyQueue.push([event, data, callback]);
+ return;
+ }
+ try {
+ data = data || {};
+ data.event = event;
+ if (callback) {
+ data._cb = ++window.Telegram.__WidgetLastId;
+ window.Telegram.__WidgetCallbacks[data._cb] = {
+ iframe: iframe,
+ callback: callback
+ };
+ }
+ iframe.contentWindow.postMessage(JSON.stringify(data), '*');
+ } catch(e) {}
+ }
+
+ function initWidget(widgetEl) {
+ var widgetId, widgetElId, widgetsOrigin, existsEl,
+ src, styles = {}, allowedAttrs = [],
+ defWidth, defHeight, scrollable = false, onInitAuthUser, onAuthUser, onUnauth;
+ if (!widgetEl.tagName ||
+ !(widgetEl.tagName.toUpperCase() == 'SCRIPT' ||
+ widgetEl.tagName.toUpperCase() == 'BLOCKQUOTE' &&
+ widgetEl.classList.contains('telegram-post'))) {
+ return null;
+ }
+ if (widgetEl._iframe) {
+ return widgetEl._iframe;
+ }
+ if (widgetId = widgetEl.getAttribute('data-telegram-post')) {
+ var comment = widgetEl.getAttribute('data-comment') || '';
+ widgetsOrigin = getWidgetsOrigin('https://t.me', 'https://post.tg.dev');
+ widgetElId = 'telegram-post-' + widgetId.replace(/[^a-z0-9_]/ig, '-') + (comment ? '-comment' + comment : '');
+ src = widgetsOrigin + '/' + widgetId + '?embed=1';
+ allowedAttrs = ['comment', 'userpic', 'tme_mode?', 'single?', 'color', 'dark', 'dark_color'];
+ defWidth = widgetEl.getAttribute('data-width') || '100%';
+ defHeight = '';
+ styles.minWidth = '320px';
+ }
+ else if (widgetId = widgetEl.getAttribute('data-telegram-discussion')) {
+ widgetsOrigin = getWidgetsOrigin('https://t.me', 'https://post.tg.dev');
+ widgetElId = 'telegram-discussion-' + widgetId.replace(/[^a-z0-9_]/ig, '-') + '-' + (++window.Telegram.__WidgetUuid);
+ var websitePageUrl = widgetEl.getAttribute('data-page-url');
+ if (!websitePageUrl) {
+ websitePageUrl = getPageCanonical();
+ }
+ src = widgetsOrigin + '/' + widgetId + '?embed=1&discussion=1' + (websitePageUrl ? '&page_url=' + encodeURIComponent(websitePageUrl) : '');
+ allowedAttrs = ['comments_limit', 'color', 'colorful', 'dark', 'dark_color', 'width', 'height'];
+ defWidth = widgetEl.getAttribute('data-width') || '100%';
+ defHeight = widgetEl.getAttribute('data-height') || 0;
+ styles.minWidth = '320px';
+ if (defHeight > 0) {
+ scrollable = true;
+ }
+ }
+ else if (widgetEl.hasAttribute('data-telegram-login')) {
+ widgetId = widgetEl.getAttribute('data-telegram-login');
+ widgetsOrigin = getWidgetsOrigin('https://oauth.telegram.org', 'https://oauth.tg.dev');
+ widgetElId = 'telegram-login-' + widgetId.replace(/[^a-z0-9_]/ig, '-');
+ src = widgetsOrigin + '/embed/' + widgetId + '?origin=' + encodeURIComponent(location.origin || location.protocol + '//' + location.hostname);
+ allowedAttrs = ['size', 'userpic', 'init_auth', 'request_access', 'radius', 'min_width', 'max_width', 'lang'];
+ defWidth = 186;
+ defHeight = 28;
+ if (widgetEl.hasAttribute('data-size')) {
+ var size = widgetEl.getAttribute('data-size');
+ if (size == 'small') defWidth = 148, defHeight = 20;
+ else if (size == 'large') defWidth = 238, defHeight = 40;
+ }
+ if (widgetEl.hasAttribute('data-onauth')) {
+ onInitAuthUser = onAuthUser = __parseFunction(widgetEl.getAttribute('data-onauth'), ['user']);
+ }
+ else if (widgetEl.hasAttribute('data-auth-url')) {
+ var a = document.createElement('A');
+ a.href = widgetEl.getAttribute('data-auth-url');
+ onAuthUser = function(user) {
+ var authUrl = a.href;
+ authUrl += (authUrl.indexOf('?') >= 0) ? '&' : '?';
+ var params = [];
+ for (var key in user) {
+ params.push(key + '=' + encodeURIComponent(user[key]));
+ }
+ authUrl += params.join('&');
+ location.href = authUrl;
+ };
+ }
+ if (widgetEl.hasAttribute('data-onunauth')) {
+ onUnauth = __parseFunction(widgetEl.getAttribute('data-onunauth'));
+ }
+ }
+ else if (widgetId = widgetEl.getAttribute('data-telegram-share-url')) {
+ widgetsOrigin = getWidgetsOrigin('https://t.me', 'https://post.tg.dev');
+ widgetElId = 'telegram-share-' + window.btoa(widgetId);
+ src = widgetsOrigin + '/share/embed?origin=' + encodeURIComponent(location.origin || location.protocol + '//' + location.hostname);
+ allowedAttrs = ['telegram-share-url', 'comment', 'size', 'text'];
+ defWidth = 60;
+ defHeight = 20;
+ if (widgetEl.getAttribute('data-size') == 'large') {
+ defWidth = 76;
+ defHeight = 28;
+ }
+ }
+ else {
+ return null;
+ }
+ existsEl = document.getElementById(widgetElId);
+ if (existsEl) {
+ return existsEl;
+ }
+ for (var i = 0; i < allowedAttrs.length; i++) {
+ var attr = allowedAttrs[i];
+ var novalue = attr.substr(-1) == '?';
+ if (novalue) {
+ attr = attr.slice(0, -1);
+ }
+ var data_attr = 'data-' + attr.replace(/_/g, '-');
+ if (widgetEl.hasAttribute(data_attr)) {
+ var attr_value = novalue ? '1' : encodeURIComponent(widgetEl.getAttribute(data_attr));
+ src += '&' + attr + '=' + attr_value;
+ }
+ }
+ function getCurCoords(iframe) {
+ var docEl = document.documentElement;
+ var frect = iframe.getBoundingClientRect();
+ return {
+ frameTop: frect.top,
+ frameBottom: frect.bottom,
+ frameLeft: frect.left,
+ frameRight: frect.right,
+ frameWidth: frect.width,
+ frameHeight: frect.height,
+ scrollTop: window.pageYOffset,
+ scrollLeft: window.pageXOffset,
+ clientWidth: docEl.clientWidth,
+ clientHeight: docEl.clientHeight
+ };
+ }
+ function visibilityHandler() {
+ if (isVisible(iframe, 50)) {
+ postMessageToIframe(iframe, 'visible', {frame: widgetElId});
+ }
+ }
+ function focusHandler() {
+ postMessageToIframe(iframe, 'focus', {has_focus: document.hasFocus()});
+ }
+ function postMessageHandler(event) {
+ if (event.source !== iframe.contentWindow ||
+ event.origin != widgetsOrigin) {
+ return;
+ }
+ try {
+ var data = JSON.parse(event.data);
+ } catch(e) {
+ var data = {};
+ }
+ if (data.event == 'resize') {
+ if (data.height) {
+ iframe.style.height = data.height + 'px';
+ }
+ if (data.width) {
+ iframe.style.width = data.width + 'px';
+ }
+ }
+ else if (data.event == 'ready') {
+ iframe._ready = true;
+ focusHandler();
+ for (var i = 0; i < iframe._readyQueue.length; i++) {
+ var queue_item = iframe._readyQueue[i];
+ postMessageToIframe(iframe, queue_item[0], queue_item[1], queue_item[2]);
+ }
+ iframe._readyQueue = [];
+ }
+ else if (data.event == 'visible_off') {
+ removeEvent(window, 'scroll', visibilityHandler);
+ removeEvent(window, 'resize', visibilityHandler);
+ }
+ else if (data.event == 'get_coords') {
+ postMessageToIframe(iframe, 'callback', {
+ _cb: data._cb,
+ value: getCurCoords(iframe)
+ });
+ }
+ else if (data.event == 'scroll_to') {
+ try {
+ window.scrollTo(data.x || 0, data.y || 0);
+ } catch(e) {}
+ }
+ else if (data.event == 'auth_user') {
+ if (data.init) {
+ onInitAuthUser && onInitAuthUser(data.auth_data);
+ } else {
+ onAuthUser && onAuthUser(data.auth_data);
+ }
+ }
+ else if (data.event == 'unauthorized') {
+ onUnauth && onUnauth();
+ }
+ else if (data.event == 'callback') {
+ var cb_data = null;
+ if (cb_data = window.Telegram.__WidgetCallbacks[data._cb]) {
+ if (cb_data.iframe === iframe) {
+ cb_data.callback(data.value);
+ delete window.Telegram.__WidgetCallbacks[data._cb];
+ }
+ } else {
+ console.warn('Callback #' + data._cb + ' not found');
+ }
+ }
+ }
+ var iframe = document.createElement('iframe');
+ iframe.id = widgetElId;
+ iframe.src = src;
+ iframe.width = defWidth;
+ iframe.height = defHeight;
+ iframe.setAttribute('frameborder', '0');
+ if (!scrollable) {
+ iframe.setAttribute('scrolling', 'no');
+ iframe.style.overflow = 'hidden';
+ }
+ iframe.style.border = 'none';
+ for (var prop in styles) {
+ iframe.style[prop] = styles[prop];
+ }
+ if (widgetEl.parentNode) {
+ widgetEl.parentNode.insertBefore(iframe, widgetEl);
+ if (widgetEl.tagName.toUpperCase() == 'BLOCKQUOTE') {
+ widgetEl.parentNode.removeChild(widgetEl);
+ }
+ }
+ iframe._ready = false;
+ iframe._readyQueue = [];
+ widgetEl._iframe = iframe;
+ addEvent(iframe, 'load', function() {
+ removeEvent(iframe, 'load', visibilityHandler);
+ addEvent(window, 'scroll', visibilityHandler);
+ addEvent(window, 'resize', visibilityHandler);
+ visibilityHandler();
+ });
+ addEvent(window, 'focus blur', focusHandler);
+ addEvent(window, 'message', postMessageHandler);
+ return iframe;
+ }
+ function isVisible(el, padding) {
+ var node = el, val;
+ var visibility = getCssProperty(node, 'visibility');
+ if (visibility == 'hidden') return false;
+ while (node) {
+ if (node === document.documentElement) break;
+ var display = getCssProperty(node, 'display');
+ if (display == 'none') return false;
+ var opacity = getCssProperty(node, 'opacity');
+ if (opacity !== null && opacity < 0.1) return false;
+ node = node.parentNode;
+ }
+ if (el.getBoundingClientRect) {
+ padding = +padding || 0;
+ var rect = el.getBoundingClientRect();
+ var html = document.documentElement;
+ if (rect.bottom < padding ||
+ rect.right < padding ||
+ rect.top > (window.innerHeight || html.clientHeight) - padding ||
+ rect.left > (window.innerWidth || html.clientWidth) - padding) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function getAllWidgets() {
+ var widgets = [];
+ if (document.querySelectorAll) {
+ widgets = document.querySelectorAll('script[data-telegram-post],blockquote.telegram-post,script[data-telegram-discussion],script[data-telegram-login],script[data-telegram-share-url]');
+ } else {
+ widgets = Array.prototype.slice.apply(document.getElementsByTagName('SCRIPT'));
+ widgets = widgets.concat(Array.prototype.slice.apply(document.getElementsByTagName('BLOCKQUOTE')));
+ }
+ return widgets;
+ }
+
+ function getWidgetInfo(el_or_id, callback) {
+ var e = null, iframe = null;
+ if (el = geById(el_or_id)) {
+ if (el.tagName &&
+ el.tagName.toUpperCase() == 'IFRAME') {
+ iframe = el;
+ } else if (el._iframe) {
+ iframe = el._iframe;
+ }
+ if (iframe && callback) {
+ postMessageToIframe(iframe, 'get_info', {}, callback);
+ }
+ }
+ }
+
+ function setWidgetOptions(options, el_or_id) {
+ var e = null, iframe = null;
+ if (typeof el_or_id === 'undefined') {
+ var widgets = getAllWidgets();
+ for (var i = 0; i < widgets.length; i++) {
+ if (iframe = widgets[i]._iframe) {
+ postMessageToIframe(iframe, 'set_options', {options: options});
+ }
+ }
+ } else {
+ if (el = geById(el_or_id)) {
+ if (el.tagName &&
+ el.tagName.toUpperCase() == 'IFRAME') {
+ iframe = el;
+ } else if (el._iframe) {
+ iframe = el._iframe;
+ }
+ if (iframe) {
+ postMessageToIframe(iframe, 'set_options', {options: options});
+ }
+ }
+ }
+ }
+
+ if (!document.currentScript ||
+ !initWidget(document.currentScript)) {
+ var widgets = getAllWidgets();
+ for (var i = 0; i < widgets.length; i++) {
+ initWidget(widgets[i]);
+ }
+ }
+
+ var TelegramLogin = {
+ popups: {},
+ auth: function(options, callback) {
+ var bot_id = parseInt(options.bot_id);
+ if (!bot_id) {
+ throw new Error('Bot id required');
+ }
+ var width = 550;
+ var height = 470;
+ var left = Math.max(0, (screen.width - width) / 2) + (screen.availLeft | 0),
+ top = Math.max(0, (screen.height - height) / 2) + (screen.availTop | 0);
+ var onMessage = function (event) {
+ try {
+ var data = JSON.parse(event.data);
+ } catch(e) {
+ var data = {};
+ }
+ if (!TelegramLogin.popups[bot_id]) return;
+ if (event.source !== TelegramLogin.popups[bot_id].window) return;
+ if (data.event == 'auth_result') {
+ onAuthDone(data.result);
+ }
+ };
+ var onAuthDone = function (authData) {
+ if (!TelegramLogin.popups[bot_id]) return;
+ if (TelegramLogin.popups[bot_id].authFinished) return;
+ callback && callback(authData);
+ TelegramLogin.popups[bot_id].authFinished = true;
+ removeEvent(window, 'message', onMessage);
+ };
+ var checkClose = function(bot_id) {
+ if (!TelegramLogin.popups[bot_id]) return;
+ if (!TelegramLogin.popups[bot_id].window ||
+ TelegramLogin.popups[bot_id].window.closed) {
+ return TelegramLogin.getAuthData(options, function(origin, authData) {
+ onAuthDone(authData);
+ });
+ }
+ setTimeout(checkClose, 100, bot_id);
+ }
+ var popup_url = Telegram.Login.widgetsOrigin + '/auth?bot_id=' + encodeURIComponent(options.bot_id) + '&origin=' + encodeURIComponent(location.origin || location.protocol + '//' + location.hostname) + (options.request_access ? '&request_access=' + encodeURIComponent(options.request_access) : '') + (options.lang ? '&lang=' + encodeURIComponent(options.lang) : '');
+ var popup = window.open(popup_url, 'telegram_oauth_bot' + bot_id, 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + ',status=0,location=0,menubar=0,toolbar=0');
+ TelegramLogin.popups[bot_id] = {
+ window: popup,
+ authFinished: false
+ };
+ if (popup) {
+ addEvent(window, 'message', onMessage);
+ popup.focus();
+ checkClose(bot_id);
+ }
+ },
+ getAuthData: function(options, callback) {
+ var bot_id = parseInt(options.bot_id);
+ if (!bot_id) {
+ throw new Error('Bot id required');
+ }
+ var xhr = getXHR();
+ var url = Telegram.Login.widgetsOrigin + '/auth/get';
+ xhr.open('POST', url);
+ xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ if (typeof xhr.responseBody == 'undefined' && xhr.responseText) {
+ try {
+ var result = JSON.parse(xhr.responseText);
+ } catch(e) {
+ var result = {};
+ }
+ if (result.user) {
+ callback(result.origin, result.user);
+ } else {
+ callback(result.origin, false);
+ }
+ } else {
+ callback('*', false);
+ }
+ }
+ };
+ xhr.onerror = function() {
+ callback('*', false);
+ };
+ xhr.withCredentials = true;
+ xhr.send('bot_id=' + encodeURIComponent(options.bot_id) + (options.lang ? '&lang=' + encodeURIComponent(options.lang) : ''));
+ }
+ };
+
+ window.Telegram.getWidgetInfo = getWidgetInfo;
+ window.Telegram.setWidgetOptions = setWidgetOptions;
+ window.Telegram.Login = {
+ auth: TelegramLogin.auth,
+ widgetsOrigin: getWidgetsOrigin('https://oauth.telegram.org', 'https://oauth.tg.dev')
+ };
+
+ }(window));
+})(window);