From e6f1115c6c8a6872285b1773a72041c49073bfc5 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Mon, 13 Jun 2016 01:31:59 +0300 Subject: [PATCH] Added post export link --- app/index.html | 1 + app/js/controllers.js | 12 +- app/js/directives.js | 56 +- app/js/filters.js | 9 + app/js/locales/en-us.json | 6 +- app/js/messages_manager.js | 20 + app/js/services.js | 10 +- app/less/desktop.less | 4 + .../desktop/chat_invite_link_modal.html | 4 +- app/partials/desktop/peer_select.html | 8 +- app/vendor/clipboard/clipboard.js | 745 ++++++++++++++++++ app/webogram.appcache | 2 +- 12 files changed, 855 insertions(+), 22 deletions(-) create mode 100755 app/vendor/clipboard/clipboard.js diff --git a/app/index.html b/app/index.html index 5f76cf23..41ef9785 100644 --- a/app/index.html +++ b/app/index.html @@ -73,6 +73,7 @@ + diff --git a/app/js/controllers.js b/app/js/controllers.js index 618dfd75..2f60e5d2 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -1723,7 +1723,8 @@ angular.module('myApp.controllers', ['myApp.i18n']) function quickForward(msgID) { PeersSelectService.selectPeers({ canSend: true, - confirm_type: 'FORWARD_PEER' + confirm_type: 'FORWARD_PEER', + shareLinkPromise: AppMessagesManager.getMessageShareLink(msgID) }).then(function (peerStrings) { angular.forEach(peerStrings, function (peerString) { var peerID = AppPeersManager.getPeerID(peerString); @@ -4483,6 +4484,15 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.selectedPeerIDs = []; $scope.selectedCount = 0; + if ($scope.shareLinkPromise) { + $scope.shareLink = {loading: true}; + $scope.shareLinkPromise.then(function (url) { + $scope.shareLink = {url: url}; + }, function () { + delete $scope.shareLink; + }); + } + $scope.dialogSelect = function (peerString) { if (!$scope.multiSelect) { var promise; diff --git a/app/js/directives.js b/app/js/directives.js index 29ccd5cb..e230d7e2 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -3217,28 +3217,58 @@ angular.module('myApp.directives', ['myApp.filters']) }; }) - .directive('myCopyField', function () { + .directive('myCopyElement', function (toaster, _) { return { scope: { - selectEvent: '=myCopyField' + selectEvent: '=myCopyElement' }, link: link }; function link($scope, element, attrs) { - element.attr('readonly', 'true'); - element[0].readonly = true; - element.on('click', function () { - this.select(); - }); + if (element[0].tagName == 'INPUT') { + element.attr('readonly', 'true'); + element[0].readonly = true; + element.on('click', function () { + this.select(); + }); - if ($scope.selectEvent) { - $scope.$on($scope.selectEvent, function () { - setTimeout(function () { - element[0].focus(); - element[0].select(); - }, 100); + if ($scope.selectEvent) { + $scope.$on($scope.selectEvent, function () { + setTimeout(function () { + element[0].focus(); + element[0].select(); + }, 100); + }); + } + } else { + var clipboard = new Clipboard(element[0]); + + clipboard.on('success', function(e) { + toaster.pop({ + type: 'info', + timeout: 2000, + body: _('clipboard_copied'), + bodyOutputType: 'trustedHtml', + showCloseButton: false + }); + e.clearSelection(); + }); + + clipboard.on('error', function(e) { + var langKey = Config.Navigator.osX ? 'clipboard_press_cmd_c' : 'clipboard_press_ctrl_c'; + toaster.pop({ + type: 'info', + timeout: 4000, + body: _(langKey), + bodyOutputType: 'trustedHtml', + showCloseButton: false + }); + }); + + $scope.$on('$destroy', function () { + clipboard.destroy(); }); } }; diff --git a/app/js/filters.js b/app/js/filters.js index 857801fc..758f8f90 100644 --- a/app/js/filters.js +++ b/app/js/filters.js @@ -231,6 +231,15 @@ angular.module('myApp.filters', ['myApp.i18n']) } }]) + .filter('shortUrl', [function () { + return function (text) { + if (typeof text !== 'string') { + return text; + } + return text.replace(/^https?:\/\//, '').replace(/^www\./, ''); + } + }]) + .filter('richText', function ($filter) { var linkyFilter = $filter('linky'); return function (text) { diff --git a/app/js/locales/en-us.json b/app/js/locales/en-us.json index 0e10aec9..20de8ec7 100644 --- a/app/js/locales/en-us.json +++ b/app/js/locales/en-us.json @@ -206,6 +206,10 @@ "group_invite_revoke_active": "Revoking...", "group_invite_revoke": "Revoke", + "clipboard_copied": "Copied!", + "clipboard_press_ctrl_c": "Press Ctrl+C to copy", + "clipboard_press_cmd_c": "Press ⌘ + C to copy", + "confirm_modal_logout": "Are you sure you want to log out?", "confirm_modal_update_reload": "A new version of Telegram Web has been downloaded. Launch it?", "confirm_modal_history_flush": "Are you sure? This can not be undone!", @@ -270,7 +274,7 @@ "conversations_modal_forward_submit": "Forward", "conversations_modal_select_recipients": "Select recipients", "conversations_modal_recipients": "Recipients:", - + "conversations_modal_share_url_loading": "Loading{dots}", "contact_edit_modal_first_name": "First name", "contact_edit_modal_last_name": "Last name", diff --git a/app/js/messages_manager.js b/app/js/messages_manager.js index f1c9c9db..104cba59 100644 --- a/app/js/messages_manager.js +++ b/app/js/messages_manager.js @@ -1016,6 +1016,25 @@ angular.module('myApp.services') return $q.all(promises); } + function getMessageShareLink(fullMsgID) { + var info = getMessageIDInfo(fullMsgID); + var msgID = info[0]; + var channelID = info[1]; + if (!channelID) { + return $q.reject(); + } + var message = getMessage(fullMsgID); + if (!message || !message.pFlags || !message.pFlags.post) { + return $q.reject(); + } + return MtpApiManager.invokeApi('channels.exportMessageLink', { + channel: AppChatsManager.getChannelInput(channelID), + id: msgID + }).then(function (exportedMessageLink) { + return exportedMessageLink.link; + }); + } + function readHistory (peerID) { // console.trace('start read'); var isChannel = AppPeersManager.isChannel(peerID), @@ -3137,6 +3156,7 @@ angular.module('myApp.services') getMessagePeer: getMessagePeer, getFullMessageID: getFullMessageID, getMessageThumb: getMessageThumb, + getMessageShareLink: getMessageShareLink, clearDialogCache: clearDialogCache, wrapForDialog: wrapForDialog, wrapForHistory: wrapForHistory, diff --git a/app/js/services.js b/app/js/services.js index a867e2f1..d16efcf0 100755 --- a/app/js/services.js +++ b/app/js/services.js @@ -4223,7 +4223,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }) -.service('LocationParamsService', function ($rootScope, $routeParams, AppPeersManager, AppUsersManager, AppMessagesManager, PeersSelectService, AppStickersManager, ErrorService) { +.service('LocationParamsService', function (qSync, $rootScope, $routeParams, AppPeersManager, AppUsersManager, AppMessagesManager, PeersSelectService, AppStickersManager, ErrorService) { var tgAddrRegExp = /^(web\+)?tg:(\/\/)?(.+)/; @@ -4432,8 +4432,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) checkLocationTgAddr(); }; - function shareUrl (url, text) { - PeersSelectService.selectPeer().then(function (toPeerString) { + function shareUrl (url, text, shareLink) { + var options = {}; + if (shareLink) { + options.shareLinkPromise = qSync.when(url); + } + PeersSelectService.selectPeer(options).then(function (toPeerString) { $rootScope.$broadcast('history_focus', { peerString: toPeerString, attachment: { diff --git a/app/less/desktop.less b/app/less/desktop.less index e7111269..629e1171 100644 --- a/app/less/desktop.less +++ b/app/less/desktop.less @@ -1033,6 +1033,10 @@ a.footer_link.active:active { } } +a.peer_select_modal_share_link { + color: #999 !important; +} + @media (max-height: 600px), (max-width: 1010px) { .im_page_wrap { border-bottom: 0; diff --git a/app/partials/desktop/chat_invite_link_modal.html b/app/partials/desktop/chat_invite_link_modal.html index 3d70634a..3ebd6374 100644 --- a/app/partials/desktop/chat_invite_link_modal.html +++ b/app/partials/desktop/chat_invite_link_modal.html @@ -10,14 +10,14 @@
- +
- +
diff --git a/app/partials/desktop/peer_select.html b/app/partials/desktop/peer_select.html index 5864b416..0037d364 100644 --- a/app/partials/desktop/peer_select.html +++ b/app/partials/desktop/peer_select.html @@ -74,7 +74,13 @@
- + + + + + + + diff --git a/app/vendor/clipboard/clipboard.js b/app/vendor/clipboard/clipboard.js new file mode 100755 index 00000000..b554d7cf --- /dev/null +++ b/app/vendor/clipboard/clipboard.js @@ -0,0 +1,745 @@ +/*! + * clipboard.js v1.5.12 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Clipboard = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o