Add button for re-importing contacts from phone
Add a section under settings for performing a contact sync from your mobile device. This just re-runs the same import operation that occurs at install/link time. // FREEBIE
This commit is contained in:
parent
c01722c31b
commit
8e1d884a10
6 changed files with 152 additions and 0 deletions
|
@ -284,5 +284,29 @@
|
||||||
"unregisteredUser": {
|
"unregisteredUser": {
|
||||||
"message": "Number is not registered",
|
"message": "Number is not registered",
|
||||||
"description": "Error message displayed when sending to an unregistered user."
|
"description": "Error message displayed when sending to an unregistered user."
|
||||||
|
},
|
||||||
|
"sync": {
|
||||||
|
"message": "Contacts",
|
||||||
|
"description": "Label for contact and group sync settings"
|
||||||
|
},
|
||||||
|
"syncExplanation": {
|
||||||
|
"message": "Import all Signal groups and contacts from your mobile device.",
|
||||||
|
"description": "Explanatory text for sync settings"
|
||||||
|
},
|
||||||
|
"lastSynced": {
|
||||||
|
"message": "Last import at",
|
||||||
|
"description": "Label for date and time of last sync operation"
|
||||||
|
},
|
||||||
|
"syncNow": {
|
||||||
|
"message": "Import now",
|
||||||
|
"description": "Label for a button that syncs contacts and groups from your phone"
|
||||||
|
},
|
||||||
|
"syncing": {
|
||||||
|
"message": "Importing...",
|
||||||
|
"description": "Label for a disabled sync button while sync is in progress."
|
||||||
|
},
|
||||||
|
"syncFailed": {
|
||||||
|
"message": "Import failed. Make sure your computer and your phone are connected to the internet.",
|
||||||
|
"description": "Informational text displayed if a sync operation times out."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -382,6 +382,8 @@
|
||||||
<script type='text/x-tmpl-mustache' id='settings'>
|
<script type='text/x-tmpl-mustache' id='settings'>
|
||||||
<div class='content'>
|
<div class='content'>
|
||||||
<a class='x close' alt='close settings' href='#'></a>
|
<a class='x close' alt='close settings' href='#'></a>
|
||||||
|
<h2>{{ settings }}</h2>
|
||||||
|
<hr>
|
||||||
<h3>{{ notifications }}</h3>
|
<h3>{{ notifications }}</h3>
|
||||||
<p>{{ notificationSettingsDialog }}</p>
|
<p>{{ notificationSettingsDialog }}</p>
|
||||||
<div>
|
<div>
|
||||||
|
@ -402,6 +404,20 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</script>
|
</script>
|
||||||
|
<script type='text/x-tmpl-mustache' id='syncSettings'>
|
||||||
|
<hr>
|
||||||
|
<h3>{{ sync }}</h3>
|
||||||
|
<div>
|
||||||
|
<button class='sync'>{{ syncNow }}</button>
|
||||||
|
<p>
|
||||||
|
{{ syncExplanation }}
|
||||||
|
<div class='synced_at'>
|
||||||
|
{{ lastSynced }} {{ syncDate }} {{ syncTime }}
|
||||||
|
</div>
|
||||||
|
<div class='sync_failed'>{{ syncFailed }}</div>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
<script type='text/javascript' src='js/components.js'></script>
|
<script type='text/javascript' src='js/components.js'></script>
|
||||||
<script type='text/javascript' src='js/database.js'></script>
|
<script type='text/javascript' src='js/database.js'></script>
|
||||||
<script type='text/javascript' src='js/debugLog.js'></script>
|
<script type='text/javascript' src='js/debugLog.js'></script>
|
||||||
|
|
|
@ -83,6 +83,10 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.getSyncRequest = function() {
|
||||||
|
return new textsecure.SyncRequest(textsecure.messaging, messageReceiver);
|
||||||
|
};
|
||||||
|
|
||||||
function init(firstRun) {
|
function init(firstRun) {
|
||||||
window.removeEventListener('online', init);
|
window.removeEventListener('online', init);
|
||||||
if (!textsecure.registration.isDone()) { return; }
|
if (!textsecure.registration.isDone()) { return; }
|
||||||
|
@ -112,6 +116,7 @@
|
||||||
var syncRequest = new textsecure.SyncRequest(textsecure.messaging, messageReceiver);
|
var syncRequest = new textsecure.SyncRequest(textsecure.messaging, messageReceiver);
|
||||||
syncRequest.addEventListener('success', function() {
|
syncRequest.addEventListener('success', function() {
|
||||||
console.log('sync successful');
|
console.log('sync successful');
|
||||||
|
storage.put('synced_at', Date.now());
|
||||||
window.dispatchEvent(new Event('textsecure:contactsync'));
|
window.dispatchEvent(new Event('textsecure:contactsync'));
|
||||||
});
|
});
|
||||||
syncRequest.addEventListener('timeout', function() {
|
syncRequest.addEventListener('timeout', function() {
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
setting = 'message';
|
setting = 'message';
|
||||||
}
|
}
|
||||||
this.$('#notification-setting-' + setting).attr('checked','checked');
|
this.$('#notification-setting-' + setting).attr('checked','checked');
|
||||||
|
if (textsecure.storage.user.getDeviceId() != '1') {
|
||||||
|
var syncView = new SyncView().render();
|
||||||
|
this.$('.content').append(syncView.el);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
render_attributes: function() {
|
render_attributes: function() {
|
||||||
return {
|
return {
|
||||||
|
@ -36,4 +40,59 @@
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var SyncView = Whisper.View.extend({
|
||||||
|
templateName: 'syncSettings',
|
||||||
|
className: 'syncSettings',
|
||||||
|
events: {
|
||||||
|
'click .sync': 'sync'
|
||||||
|
},
|
||||||
|
enable: function() {
|
||||||
|
this.$('.sync').text(i18n('syncNow'));
|
||||||
|
this.$('.sync').removeAttr('disabled');
|
||||||
|
},
|
||||||
|
disable: function() {
|
||||||
|
this.$('.sync').attr('disabled', 'disabled');
|
||||||
|
this.$('.sync').text(i18n('syncing'));
|
||||||
|
},
|
||||||
|
onsuccess: function() {
|
||||||
|
storage.put('synced_at', Date.now());
|
||||||
|
console.log('sync successful');
|
||||||
|
this.enable();
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
ontimeout: function() {
|
||||||
|
console.log('sync timed out');
|
||||||
|
this.$('.synced_at').hide();
|
||||||
|
this.$('.sync_failed').show();
|
||||||
|
this.enable();
|
||||||
|
},
|
||||||
|
sync: function() {
|
||||||
|
this.$('.sync_failed').hide();
|
||||||
|
if (textsecure.storage.user.getDeviceId() != '1') {
|
||||||
|
this.disable();
|
||||||
|
var syncRequest = window.getSyncRequest();
|
||||||
|
syncRequest.addEventListener('success', this.onsuccess.bind(this));
|
||||||
|
syncRequest.addEventListener('timeout', this.ontimeout.bind(this));
|
||||||
|
} else {
|
||||||
|
console.log("Tried to sync from device 1");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render_attributes: function() {
|
||||||
|
var attrs = {
|
||||||
|
sync: i18n('sync'),
|
||||||
|
syncNow: i18n('syncNow'),
|
||||||
|
syncExplanation: i18n('syncExplanation'),
|
||||||
|
syncFailed: i18n('syncFailed')
|
||||||
|
};
|
||||||
|
var date = storage.get('synced_at');
|
||||||
|
if (date) {
|
||||||
|
date = new Date(date);
|
||||||
|
attrs.lastSynced = i18n('lastSynced');
|
||||||
|
attrs.syncDate = date.toLocaleDateString();
|
||||||
|
attrs.syncTime = date.toLocaleTimeString();
|
||||||
|
}
|
||||||
|
return attrs;
|
||||||
|
}
|
||||||
|
});
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -253,3 +253,30 @@ input.search {
|
||||||
top: -30px;
|
top: -30px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.syncSettings {
|
||||||
|
button {
|
||||||
|
float: right;
|
||||||
|
border: none;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 36px;
|
||||||
|
padding: 0 20px;
|
||||||
|
background: $blue;
|
||||||
|
margin-left: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
&[disabled=disabled] {
|
||||||
|
background: $grey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.synced_at {
|
||||||
|
font-size: small;
|
||||||
|
color: $grey;
|
||||||
|
}
|
||||||
|
.sync_failed {
|
||||||
|
display: none;
|
||||||
|
font-size: small;
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -698,6 +698,27 @@ input.search {
|
||||||
border-color: transparent transparent #2eace0 transparent;
|
border-color: transparent transparent #2eace0 transparent;
|
||||||
top: -30px; }
|
top: -30px; }
|
||||||
|
|
||||||
|
.syncSettings button {
|
||||||
|
float: right;
|
||||||
|
border: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 36px;
|
||||||
|
padding: 0 20px;
|
||||||
|
background: #2090ea;
|
||||||
|
margin-left: 20px;
|
||||||
|
margin-bottom: 20px; }
|
||||||
|
.syncSettings button[disabled=disabled] {
|
||||||
|
background: #616161; }
|
||||||
|
.syncSettings .synced_at {
|
||||||
|
font-size: small;
|
||||||
|
color: #616161; }
|
||||||
|
.syncSettings .sync_failed {
|
||||||
|
display: none;
|
||||||
|
font-size: small;
|
||||||
|
color: red; }
|
||||||
|
|
||||||
.conversation-title {
|
.conversation-title {
|
||||||
display: block;
|
display: block;
|
||||||
line-height: 36px;
|
line-height: 36px;
|
||||||
|
|
Loading…
Reference in a new issue