Skip to content

Commit 7c0e2f1

Browse files
committed
feat: Collect topic and view topic collections
1 parent 6f17a49 commit 7c0e2f1

File tree

12 files changed

+141
-5
lines changed

12 files changed

+141
-5
lines changed

app/css/app/_topic.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,8 @@
4040
background: rgba(0, 0, 0, 0);
4141
}
4242
}
43+
.bar.bar-header {
44+
.topic-collected {
45+
color: $node-green;
46+
}
47+
}

app/css/app/_topics.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
background-color: $node-green;
3131
color: #fff;
3232
}
33+
.item {
34+
left: 0;
35+
right: 0;
36+
}
3337
}
3438
.topic-content {
3539
img {

app/css/modules/_items.scss

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
.item {
2-
left: 0;
3-
right: 0;
4-
}
51
.item-divider {
62
color: #555;
73
font-weight: normal;

app/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
<script src="js/controllers/topics.js"></script>
4141
<script src="js/controllers/topic.js"></script>
4242
<script src="js/controllers/user.js"></script>
43+
<script src="js/controllers/user_collections.js"></script>
4344
<script src="js/controllers/messages.js"></script>
4445
<script src="js/controllers/settings.js"></script>
4546
<script src="js/services/tabs.js"></script>

app/js/app.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ angular.module('cnodejs', [
110110
}
111111
}
112112
})
113+
.state('app.user_collections', {
114+
url: '/user/:loginname/collections',
115+
views: {
116+
'menuContent': {
117+
templateUrl: 'templates/user_collections.html',
118+
controller: 'UserCollectionsCtrl'
119+
}
120+
}
121+
})
113122
.state('app.messages', {
114123
url: '/my/messages',
115124
views: {

app/js/controllers/topic.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,19 @@
99
*/
1010

1111
angular.module('cnodejs.controllers')
12-
.controller('TopicCtrl', function($scope, $rootScope, $stateParams, $timeout, $ionicLoading, $ionicActionSheet, $ionicScrollDelegate, $log, Topics, Topic, User) {
12+
.controller('TopicCtrl', function(
13+
$scope,
14+
$rootScope,
15+
$stateParams,
16+
$timeout,
17+
$ionicLoading,
18+
$ionicActionSheet,
19+
$ionicScrollDelegate,
20+
$log,
21+
Topics,
22+
Topic,
23+
User
24+
) {
1325
$log.debug('topic ctrl', $stateParams);
1426
var id = $stateParams.id;
1527
var topic = Topics.getById(id);
@@ -42,6 +54,15 @@ angular.module('cnodejs.controllers')
4254
};
4355
$scope.loadTopic();
4456

57+
// detect if user has collected this topic
58+
var currentUser = User.getCurrentUser();
59+
$scope.isCollected = false;
60+
angular.forEach(currentUser.collect_topics, function(topics) {
61+
if (topics.id === id) {
62+
$scope.isCollected = true;
63+
}
64+
});
65+
4566
// do refresh
4667
$scope.doRefresh = function() {
4768
return $scope.loadTopic(true).then(function(response) {
@@ -119,4 +140,23 @@ angular.module('cnodejs.controllers')
119140
}
120141
});
121142
};
143+
144+
// collect topic
145+
$scope.collectTopic = function () {
146+
if ($scope.isCollected) {
147+
Topic.deCollectTopic(id).$promise.then(function(response) {
148+
if (response.success) {
149+
$scope.isCollected = false;
150+
User.deCollectTopic(id);
151+
}
152+
});
153+
} else {
154+
Topic.collectTopic(id).$promise.then(function(response) {
155+
if (response.success) {
156+
$scope.isCollected = true;
157+
User.collectTopic(id);
158+
}
159+
});
160+
}
161+
};
122162
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
3+
/**
4+
* @ngdoc function
5+
* @name cnodejs.controllers:UserCollectionsCtrl
6+
* @description
7+
* # UserCollectionsCtrl
8+
* Main Controller of the cnodejs app
9+
*/
10+
11+
angular.module('cnodejs.controllers')
12+
.controller('UserCollectionsCtrl', function($scope, $rootScope, $log, $stateParams, $state, User) {
13+
$log.log('user ctrl');
14+
var loginName = $stateParams.loginname;
15+
16+
// before enter view event
17+
$scope.$on('$ionicView.beforeEnter', function() {
18+
// track view
19+
if (window.analytics) {
20+
window.analytics.trackView('user collections view');
21+
}
22+
});
23+
24+
$scope.user = User.getCurrentUser();
25+
});

app/js/services/topic.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ angular.module('cnodejs.services')
1414
var resource = $resource(ENV.api + '/topic/:id', {
1515
id: '@id',
1616
}, {
17+
collect: {
18+
method: 'post',
19+
url: ENV.api + '/topic/collect'
20+
},
21+
deCollect: {
22+
method: 'post',
23+
url: ENV.api + '/topic/de_collect'
24+
},
1725
reply: {
1826
method: 'post',
1927
url: ENV.api + '/topic/:topicId/replies'
@@ -73,6 +81,20 @@ angular.module('cnodejs.services')
7381
}
7482
}
7583
);
84+
},
85+
collectTopic: function(topicId) {
86+
var currentUser = User.getCurrentUser();
87+
return resource.collect({
88+
topic_id: topicId,
89+
accesstoken: currentUser.accesstoken
90+
});
91+
},
92+
deCollectTopic: function(topicId) {
93+
var currentUser = User.getCurrentUser();
94+
return resource.deCollect({
95+
topic_id: topicId,
96+
accesstoken: currentUser.accesstoken
97+
});
7698
}
7799
};
78100
});

app/js/services/user.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,20 @@ angular.module('cnodejs.services')
7272
Storage.set(storageKey, user);
7373
}
7474
});
75+
},
76+
collectTopic: function(topicId) {
77+
user.collect_topics.push({
78+
id: topicId
79+
});
80+
Storage.set(storageKey, user);
81+
},
82+
deCollectTopic: function(topicId) {
83+
angular.forEach(user.collect_topics, function(topic, key) {
84+
if (topic.id === topicId) {
85+
user.collect_topics.splice(key, 1);
86+
}
87+
});
88+
Storage.set(storageKey, user);
7589
}
7690
};
7791
});

app/templates/topic.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
<ion-view view-title="详情">
2+
<ion-nav-buttons side="right">
3+
<button class="button button-icon icon ion-star" ng-class="{'topic-collected': isCollected}" ng-click="collectTopic()"></button>
4+
</ion-nav-buttons>
25
<ion-content class="has-header">
36
<ion-refresher pulling-text="下拉刷新..." on-refresh="doRefresh()" refreshing-icon="ion-loading-c">
47
</ion-refresher>

app/templates/user.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
<p>
1616
注册于:{{user.create_at | amDateFormat:'YYYY-MM-DD hh:mm:ss'}}
1717
</p>
18+
<p>
19+
<a href="#/user/{{user.loginname}}/collections">{{user.collect_topics.length}}话题收藏</a>
20+
</p>
1821
</ion-item>
1922
<ion-item class="item-divider">
2023
最近主题

app/templates/user_collections.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<ion-view view-title="话题收藏">
2+
<ion-content class="has-header user-collections">
3+
<ion-list>
4+
<ion-item ng-repeat="topic in user.collect_topics" href="#/topic/{{topic.id}}">
5+
<h2>{{topic.title}}</h2>
6+
<p>
7+
{{topic.author.loginname}}
8+
<span class="item-note" am-time-ago="topic.last_reply_at">
9+
</span>
10+
</p>
11+
</ion-item>
12+
</ion-list>
13+
</ion-content>
14+
</ion-view>

0 commit comments

Comments
 (0)