Telegram Web, preconfigured for usage in I2P.
http://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.
208 lines
5.7 KiB
208 lines
5.7 KiB
/*! |
|
* Webogram v0.3.0 - messaging web application for MTProto |
|
* https://github.com/zhukov/webogram |
|
* Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com> |
|
* https://github.com/zhukov/webogram/blob/master/LICENSE |
|
*/ |
|
|
|
'use strict'; |
|
|
|
/* Filters */ |
|
|
|
angular.module('myApp.filters', ['myApp.i18n']) |
|
|
|
.filter('userName', ['_', function(_) { |
|
return function (user) { |
|
if (!user || !user.first_name && !user.last_name) { |
|
return _('user_name_deleted'); |
|
} |
|
return user.first_name + ' ' + user.last_name; |
|
} |
|
}]) |
|
|
|
.filter('userFirstName', ['_', function(_) { |
|
return function (user) { |
|
if (!user || !user.first_name && !user.last_name) { |
|
return _('user_first_name_deleted'); |
|
} |
|
return user.first_name || user.last_name; |
|
} |
|
}]) |
|
|
|
.filter('userStatus', ['$filter', '_', function($filter, _) { |
|
return function (user) { |
|
if (!user || !user.status || user.status._ == 'userStatusEmpty') { |
|
return _('user_status_offline'); |
|
} |
|
if (user.status._ == 'userStatusOnline') { |
|
return _('user_status_online'); |
|
} |
|
|
|
return _('user_status_last_seen', $filter('relativeTime')(user.status.was_online)); |
|
} |
|
}]) |
|
|
|
.filter('chatTitle', ['_', function(_) { |
|
return function (chat) { |
|
if (!chat || !chat.title) { |
|
return _('chat_title_deleted'); |
|
} |
|
return chat.title; |
|
} |
|
}]) |
|
|
|
.filter('dateOrTime', ['$filter', '_', function($filter, _) { |
|
var cachedDates = {}, |
|
dateFilter = $filter('date'); |
|
|
|
return function (timestamp) { |
|
if (!cachedDates.hasOwnProperty(_.locale())) { |
|
cachedDates[_.locale()] = {}; |
|
} |
|
|
|
if (cachedDates[_.locale()][timestamp]) { |
|
return cachedDates[_.locale()][timestamp]; |
|
} |
|
|
|
var ticks = timestamp * 1000, |
|
diff = Math.abs(tsNow() - ticks), |
|
format = 'HH:mm'; |
|
|
|
if (diff > 518400000) { // 6 days |
|
format = 'shortDate'; |
|
} |
|
else if (diff > 43200000) { // 12 hours |
|
format = 'EEE'; |
|
} |
|
return cachedDates[_.locale()][timestamp] = dateFilter(ticks, format); |
|
} |
|
}]) |
|
|
|
.filter('time', ['$filter', '_', function($filter, _) { |
|
var cachedDates = {}, |
|
dateFilter = $filter('date'), |
|
format = Config.Navigator.mobile ? 'HH:mm' : 'HH:mm:ss'; |
|
|
|
return function (timestamp) { |
|
if (!cachedDates.hasOwnProperty(_.locale())) { |
|
cachedDates[_.locale()] = {}; |
|
} |
|
|
|
if (cachedDates[_.locale()][timestamp]) { |
|
return cachedDates[_.locale()][timestamp]; |
|
} |
|
|
|
return cachedDates[_.locale()][timestamp] = dateFilter(timestamp * 1000, format); |
|
} |
|
}]) |
|
|
|
.filter('myDate', ['$filter', '_', function($filter, _) { |
|
var cachedDates = {}, |
|
dateFilter = $filter('date'); |
|
|
|
return function (timestamp) { |
|
if (!cachedDates.hasOwnProperty(_.locale())) { |
|
cachedDates[_.locale()] = {}; |
|
} |
|
|
|
if (cachedDates[_.locale()][timestamp]) { |
|
return cachedDates[_.locale()][timestamp]; |
|
} |
|
|
|
return cachedDates[_.locale()][timestamp] = dateFilter(timestamp * 1000, 'fullDate'); |
|
} |
|
}]) |
|
|
|
.filter('duration', [function() { |
|
return function (duration) { |
|
var secs = duration % 60, |
|
mins = Math.floor((duration - secs) / 60.0); |
|
|
|
if (secs < 10) { |
|
secs = '0' + secs; |
|
} |
|
|
|
return mins + ':' + secs; |
|
} |
|
}]) |
|
|
|
.filter('phoneNumber', [function() { |
|
return function (phoneRaw) { |
|
var nbsp = ' '; |
|
phoneRaw = (phoneRaw || '').replace(/\D/g, ''); |
|
if (phoneRaw.charAt(0) == '7' && phoneRaw.length == 11) { |
|
return '+' + phoneRaw.charAt(0) + nbsp + '(' + phoneRaw.substr(1, 3) + ')' + nbsp + phoneRaw.substr(4, 3) + '-' + phoneRaw.substr(7, 2) + '-' + phoneRaw.substr(9, 2); |
|
} |
|
return '+' + phoneRaw; |
|
} |
|
}]) |
|
|
|
.filter('formatSize', [function () { |
|
return function (size) { |
|
if (!size) { |
|
return '0'; |
|
} |
|
else if (size < 1024) { |
|
return size + ' b'; |
|
} |
|
else if (size < 1048576) { |
|
return (Math.round(size / 1024 * 10) / 10) + ' Kb'; |
|
} |
|
|
|
return (Math.round(size / 1048576 * 100) / 100) + ' Mb'; |
|
} |
|
}]) |
|
|
|
.filter('formatSizeProgress', ['$filter', '_', function ($filter, _) { |
|
return function (progress) { |
|
var done = $filter('formatSize')(progress.done), |
|
doneParts = done.split(' '), |
|
total = $filter('formatSize')(progress.total), |
|
totalParts = total.split(' '); |
|
|
|
if (totalParts[1] === doneParts[1]) { |
|
return _('format_size_progress_mulitple', {done: done, total: total, parts: (doneParts[1] || '')}); |
|
} |
|
return _('format_size_progress', {done: done, total: total}); |
|
} |
|
}]) |
|
|
|
.filter('nl2br', [function () { |
|
return function (text) { |
|
return text.replace(/\n/g, '<br/>'); |
|
} |
|
}]) |
|
|
|
.filter('richText', ['$filter', function ($filter) { |
|
return function (text) { |
|
return $filter('linky')(text, '_blank').replace(/\n| /g, '<br/>'); |
|
} |
|
}]) |
|
|
|
.filter('relativeTime', ['$filter', '_', function($filter, _) { |
|
var langMinutes = { |
|
one: 'relative_time_one_minute', |
|
many: 'relative_time_many_minutes' |
|
}, |
|
langHours = { |
|
one: 'relative_time_one_hour', |
|
many: 'relative_time_many_hours' |
|
}; |
|
return function (timestamp) { |
|
var ticks = timestamp * 1000, |
|
diff = Math.abs(tsNow() - ticks); |
|
|
|
if (diff < 60000) { |
|
return _('relative_time_just_now'); |
|
} |
|
if (diff < 3000000) { |
|
var minutes = Math.ceil(diff / 60000); |
|
return _(langMinutes[minutes > 1 ? 'many' : 'one'], {minutes: minutes}); |
|
} |
|
if (diff < 10000000) { |
|
var hours = Math.ceil(diff / 3600000); |
|
return _(langHours[hours > 1 ? 'many' : 'one'], {hours: hours}); |
|
} |
|
return $filter('dateOrTime')(timestamp); |
|
} |
|
}])
|
|
|