Skip to content

Commit

Permalink
v6.9.0
Browse files Browse the repository at this point in the history
  • Loading branch information
ArthurStam committed Sep 20, 2023
1 parent 4e81abd commit c7a8b2b
Show file tree
Hide file tree
Showing 3 changed files with 200 additions and 40 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@twa-dev/sdk",
"version": "6.7.1",
"version": "6.9.0",
"main": "dist/index.js",
"type": "module",
"exports": {
Expand Down Expand Up @@ -53,7 +53,7 @@
"deploy": "yarn build && yarn release - --tag --commit --push --public"
},
"dependencies": {
"@twa-dev/types": "^6.7.0"
"@twa-dev/types": "^6.9.0"
},
"peerDependencies": {
"react": ">=16.0.0"
Expand Down
228 changes: 194 additions & 34 deletions src/telegram-web-apps.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@
if (eventData === undefined) {
eventData = '';
}
console.log('[Telegram.WebView] > postEvent', eventType, eventData);

if (window.TelegramWebviewProxy !== undefined) {
TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));
Expand All @@ -140,23 +141,18 @@
// For now we don't restrict target, for testing purposes
trustedTarget = '*';
window.parent.postMessage(JSON.stringify({eventType: eventType, eventData: eventData}), trustedTarget);
if (initParams.tgWebAppDebug) {
console.log('[Telegram.WebView] postEvent via postMessage', eventType, eventData);
}
callback();
} catch (e) {
callback(e);
}
}
else {
if (initParams.tgWebAppDebug) {
console.log('[Telegram.WebView] postEvent', eventType, eventData);
}
callback({notAvailable: true});
}
};

function receiveEvent(eventType, eventData) {
console.log('[Telegram.WebView] < receiveEvent', eventType, eventData);
callEventCallbacks(eventType, function(callback) {
callback(eventType, eventData);
});
Expand Down Expand Up @@ -408,12 +404,20 @@
Utils.sessionStorageSet('themeParams', themeParams);
}

function generateId(len) {
var id = '', chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', chars_len = chars.length;
for (var i = 0; i < len; i++) {
id += chars[Math.floor(Math.random() * chars_len)];
var webAppCallbacks = {};
function generateCallbackId(len) {
var tries = 100;
while (--tries) {
var id = '', chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', chars_len = chars.length;
for (var i = 0; i < len; i++) {
id += chars[Math.floor(Math.random() * chars_len)];
}
if (!webAppCallbacks[id]) {
webAppCallbacks[id] = {};
return id;
}
}
return id;
throw Error('WebAppCallbackIdGenerateFailed');
}

var viewportHeight = false, viewportStableHeight = false, isExpanded = true;
Expand Down Expand Up @@ -453,37 +457,61 @@
WebView.postEvent('web_app_setup_closing_behavior', false, {need_confirmation: isClosingConfirmationEnabled});
}

var headerColorKey = 'bg_color';
var headerColorKey = 'bg_color', headerColor = null;
function getHeaderColor() {
return themeParams[headerColorKey] || null;
if (headerColorKey == 'secondary_bg_color') {
return themeParams.secondary_bg_color;
} else if (headerColorKey == 'bg_color') {
return themeParams.bg_color;
}
return headerColor;
}
function setHeaderColor(color) {
if (!versionAtLeast('6.1')) {
console.warn('[Telegram.WebApp] Header color is not supported in version ' + webAppVersion);
return;
}
var color_key;
if (color == 'bg_color' || color == 'secondary_bg_color') {
color_key = color;
} else {
color_key = parseColorToHex(color);
if (!versionAtLeast('6.9')) {
if (themeParams.bg_color &&
themeParams.bg_color == color_key) {
color_key = 'bg_color';
themeParams.bg_color == color) {
color = 'bg_color';
} else if (themeParams.secondary_bg_color &&
themeParams.secondary_bg_color == color_key) {
color_key = 'secondary_bg_color';
} else {
color_key = false;
themeParams.secondary_bg_color == color) {
color = 'secondary_bg_color';
}
}
if (color_key != 'bg_color' &&
var head_color = null, color_key = null;
if (color == 'bg_color' || color == 'secondary_bg_color') {
color_key = color;
} else if (versionAtLeast('6.9')) {
head_color = parseColorToHex(color);
if (!head_color) {
console.error('[Telegram.WebApp] Header color format is invalid', color);
throw Error('WebAppHeaderColorInvalid');
}
}
if (!versionAtLeast('6.9') &&
color_key != 'bg_color' &&
color_key != 'secondary_bg_color') {
console.error('[Telegram.WebApp] Header color key should be one of Telegram.WebApp.themeParams.bg_color, Telegram.WebApp.themeParams.secondary_bg_color, \'bg_color\', \'secondary_bg_color\'', color);
throw Error('WebAppHeaderColorKeyInvalid');
}
headerColorKey = color_key;
WebView.postEvent('web_app_set_header_color', false, {color_key: color_key});
headerColor = head_color;
updateHeaderColor();
}
var appHeaderColorKey = null, appHeaderColor = null;
function updateHeaderColor() {
if (appHeaderColorKey != headerColorKey ||
appHeaderColor != headerColor) {
appHeaderColorKey = headerColorKey;
appHeaderColor = headerColor;
if (appHeaderColor) {
WebView.postEvent('web_app_set_header_color', false, {color: headerColor});
} else {
WebView.postEvent('web_app_set_header_color', false, {color_key: headerColorKey});
}
}
}

var backgroundColor = 'bg_color';
Expand Down Expand Up @@ -949,6 +977,42 @@
return hapticFeedback;
})();

var CloudStorage = (function() {
var cloudStorage = {};

function invokeStorageMethod(method, params, callback) {
if (!versionAtLeast('6.9')) {
console.error('[Telegram.WebApp] CloudStorage is not supported in version ' + webAppVersion);
throw Error('WebAppMethodUnsupported');
}
invokeCustomMethod(method, params, callback);
return cloudStorage;
}

cloudStorage.setItem = function(key, value, callback) {
return invokeStorageMethod('saveStorageValue', {key: key, value: value}, callback);
};
cloudStorage.getItem = function(key, callback) {
return cloudStorage.getItems([key], callback ? function(err, res) {
if (err) callback(err);
else callback(null, res[key]);
} : null);
};
cloudStorage.getItems = function(keys, callback) {
return invokeStorageMethod('getStorageValues', {keys: keys}, callback);
};
cloudStorage.removeItem = function(key, callback) {
return cloudStorage.removeItems([key], callback);
};
cloudStorage.removeItems = function(keys, callback) {
return invokeStorageMethod('deleteStorageValues', {keys: keys}, callback);
};
cloudStorage.getKeys = function(callback) {
return invokeStorageMethod('getStorageKeys', {}, callback);
};
return cloudStorage;
})();

var webAppInvoices = {};
function onInvoiceClosed(eventType, eventData) {
if (eventData.slug && webAppInvoices[eventData.slug]) {
Expand Down Expand Up @@ -1005,11 +1069,10 @@
webAppScanQrPopupOpened = false;
}

var webAppClipboardRequests = {};
function onClipboardTextReceived(eventType, eventData) {
if (eventData.req_id && webAppClipboardRequests[eventData.req_id]) {
var requestData = webAppClipboardRequests[eventData.req_id];
delete webAppClipboardRequests[eventData.req_id];
if (eventData.req_id && webAppCallbacks[eventData.req_id]) {
var requestData = webAppCallbacks[eventData.req_id];
delete webAppCallbacks[eventData.req_id];
var data = null;
if (typeof eventData.data !== 'undefined') {
data = eventData.data;
Expand All @@ -1023,6 +1086,64 @@
}
}

var WebAppWriteAccessRequested = false;
function onWriteAccessRequested(eventType, eventData) {
if (WebAppWriteAccessRequested) {
var requestData = WebAppWriteAccessRequested;
WebAppWriteAccessRequested = false;
if (requestData.callback) {
requestData.callback(eventData.status == 'allowed');
}
receiveWebViewEvent('writeAccessRequested', {
status: eventData.status
});
}
}

var WebAppContactRequested = false;
function onPhoneRequested(eventType, eventData) {
if (WebAppContactRequested) {
var requestData = WebAppContactRequested;
WebAppContactRequested = false;
if (requestData.callback) {
requestData.callback(eventData.status == 'sent');
}
receiveWebViewEvent('contactRequested', {
status: eventData.status
});
}
}

function onCustomMethodInvoked(eventType, eventData) {
if (eventData.req_id && webAppCallbacks[eventData.req_id]) {
var requestData = webAppCallbacks[eventData.req_id];
delete webAppCallbacks[eventData.req_id];
var res = null, err = null;
if (typeof eventData.result !== 'undefined') {
res = eventData.result;
}
if (typeof eventData.error !== 'undefined') {
err = eventData.error;
}
if (requestData.callback) {
requestData.callback(err, res);
}
}
}

function invokeCustomMethod(method, params, callback) {
if (!versionAtLeast('6.9')) {
console.error('[Telegram.WebApp] Method invokeCustomMethod is not supported in version ' + webAppVersion);
throw Error('WebAppMethodUnsupported');
}
var req_id = generateCallbackId(16);
var req_params = {req_id: req_id, method: method, params: params || {}};
webAppCallbacks[req_id] = {
callback: callback
};
WebView.postEvent('web_app_invoke_custom_method', false, req_params);
};

if (!window.Telegram) {
window.Telegram = {};
}
Expand Down Expand Up @@ -1090,6 +1211,10 @@
value: HapticFeedback,
enumerable: true
});
Object.defineProperty(WebApp, 'CloudStorage', {
value: CloudStorage,
enumerable: true
});
WebApp.setHeaderColor = function(color_key) {
WebApp.headerColor = color_key;
};
Expand Down Expand Up @@ -1279,7 +1404,7 @@
button_type == 'cancel') {
// no params needed
} else if (button_type == 'default' ||
button_type == 'destructive') {
button_type == 'destructive') {
var text = '';
if (typeof button.text !== 'undefined') {
text = strTrim(button.text);
Expand Down Expand Up @@ -1374,13 +1499,44 @@
console.error('[Telegram.WebApp] Method readTextFromClipboard is not supported in version ' + webAppVersion);
throw Error('WebAppMethodUnsupported');
}
var req_id = generateId(16);
var req_id = generateCallbackId(16);
var req_params = {req_id: req_id};
webAppClipboardRequests[req_id] = {
webAppCallbacks[req_id] = {
callback: callback
};
WebView.postEvent('web_app_read_text_from_clipboard', false, req_params);
};
WebApp.requestWriteAccess = function (callback) {
if (!versionAtLeast('6.9')) {
console.error('[Telegram.WebApp] Method requestWriteAccess is not supported in version ' + webAppVersion);
throw Error('WebAppMethodUnsupported');
}
if (WebAppWriteAccessRequested) {
console.error('[Telegram.WebApp] Write access is already requested');
throw Error('WebAppWriteAccessRequested');
}
WebAppWriteAccessRequested = {
callback: callback
};
WebView.postEvent('web_app_request_write_access');
};
WebApp.requestContact = function (callback) {
if (!versionAtLeast('6.9')) {
console.error('[Telegram.WebApp] Method requestContact is not supported in version ' + webAppVersion);
throw Error('WebAppMethodUnsupported');
}
if (WebAppContactRequested) {
console.error('[Telegram.WebApp] Contact is already requested');
throw Error('WebAppContactRequested');
}
WebAppContactRequested = {
callback: callback
};
WebView.postEvent('web_app_request_phone');
};
WebApp.invokeCustomMethod = function (method, params, callback) {
invokeCustomMethod(method, params, callback);
};
WebApp.ready = function () {
WebView.postEvent('web_app_ready');
};
Expand All @@ -1393,6 +1549,7 @@

window.Telegram.WebApp = WebApp;

updateHeaderColor();
updateBackgroundColor();
setViewportHeight();

Expand All @@ -1408,7 +1565,10 @@
WebView.onEvent('qr_text_received', onQrTextReceived);
WebView.onEvent('scan_qr_popup_closed', onScanQrPopupClosed);
WebView.onEvent('clipboard_text_received', onClipboardTextReceived);
WebView.onEvent('write_access_requested', onWriteAccessRequested);
WebView.onEvent('phone_requested', onPhoneRequested);
WebView.onEvent('custom_method_invoked', onCustomMethodInvoked);
WebView.postEvent('web_app_request_theme');
WebView.postEvent('web_app_request_viewport');

})();
})();
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"

"@twa-dev/types@^6.7.0":
version "6.7.0"
resolved "https://registry.yarnpkg.com/@twa-dev/types/-/types-6.7.0.tgz#0a584202ff376195b46b907bd8348de642a1c103"
integrity sha512-2QtS8oQeHkZvKAsTxqvFGdZOrR7Jc4N9rzJFEIj5e7lC5dqayIatSAh91qmGULjzxOd4sqyWqq1XF6DwZnwldQ==
"@twa-dev/types@^6.9.0":
version "6.9.0"
resolved "https://registry.yarnpkg.com/@twa-dev/types/-/types-6.9.0.tgz#5f978e63dcb8ec507ae2b035774ff568c5ebb69a"
integrity sha512-hBkIuJgVtkLAPPhKsNfgyBpgS+15spzUScy5jgpfPJPqXPaaUVDTaWHbeEUU+lUgHmryeQjWyz+UjS7987Pyaw==

"@types/json-schema@^7.0.9":
version "7.0.11"
Expand Down

0 comments on commit c7a8b2b

Please sign in to comment.