So now we will add an ability to add a user profile image using the device's camera (e.g. phone or laptop).
The first part is to add the Meteor
package that provides us this ability:
$ meteor add okland:camera-ui
We will add now a server method for updating the user's profile image, which is just like updating any other string field of the user's profile:
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Messages.remove({ chatId: chatId });
return Chats.remove({ _id: chatId });
},
updatePicture(data) {
if (!this.userId) {
throw new Meteor.Error('not-logged-in',
'Must be logged in to update his picture.');
}
check(data, String);
return Meteor.users.update(this.userId, { $set: { 'profile.picture': data } });
}
});
The next step is adding the button for adding/editing the user's profile image, we will add it in the profile
state, so update the view first:
4
5
6
7
8
9
10
11
12
13
14
15
</ion-nav-buttons>
<ion-content class="profile">
<a class="profile-picture positive" ng-click="profile.updatePicture()">
<div ng-if="profile.currentUser.profile.picture">
<img ng-src="{{ profile.currentUser.profile.picture }}" alt="profile picture">
edit
</div>
<div ng-if="!profile.currentUser.profile.picture" class="upload-placehoder">
Add photo
</div>
</a>
And now we will implement the controller methods, which will use Camera-UI
API for getting the image from the device, and then we will use that image and run the server method for updating the image:
1
2
3
4
5
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
35
36
37
38
39
40
41
47
48
49
50
import { _ } from 'meteor/underscore';
import { MeteorCameraUI } from 'meteor/okland:camera-ui';
import { Controller } from 'angular-ecmascript/module-helpers';
export default class ProfileCtrl extends Controller {
...some lines skipped...
this.name = profile ? profile.name : '';
}
updatePicture () {
MeteorCameraUI.getPicture({ width: 60, height: 60 }, (err, data) => {
if (err) return this.handleError(err);
this.$ionicLoading.show({
template: 'Updating picture...'
});
this.callMethod('updatePicture', data, (err) => {
this.$ionicLoading.hide();
this.handleError(err);
});
});
}
updateName() {
if (_.isEmpty(this.name)) return;
...some lines skipped...
}
handleError(err) {
if (err.error == 'cancel') return;
this.$log.error('Profile save error ', err);
this.$ionicPopup.alert({
...some lines skipped...
}
ProfileCtrl.$name = 'ProfileCtrl';
ProfileCtrl.$inject = ['$state', '$ionicLoading', '$ionicPopup', '$log'];
We will add now some css
for better layout of the profile page:
11
12
13
14
15
16
17
18
display: block;
max-width: 50px;
max-height: 50px;
min-width: 50px;
min-height: 50px;
width: 100%;
height: 100%;
border-radius: 50%;
Now to ease the access to the profile page, we will add a link in the settings view:
3
4
5
6
7
8
9
10
11
12
13
<div class="padding text-center">
<button ng-click="settings.logout()" class="button button-clear button-assertive">Logout</button>
</div>
<ion-list>
<ion-item href="#/profile" class="item-icon-right">
Profile
<i class="icon ion-chevron-right icon-accessory"></i>
</ion-item>
</ion-list>
</ion-content>
</ion-view>