<!DOCTYPE html>
<html class="no-js">
<head>
<meta charset="utf-8" />
<title></title>
<meta name="description" content="" />
<meta name="viewport" content="width=device-width" />
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body ng-app="app">
<!--[if lt IE 7]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<!-- Add your site or application content here -->
<div class="navbar" ui-view="navbar"></div>
<div class="container" ui-view=""></div>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular-resource.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular-cookies.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular-sanitize.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular-animate.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular-touch.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0/angular-route.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.11/angular-ui-router.js"></script>
<script src="https://cdn.firebase.com/js/client/1.1.2/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/0.8.2/angularfire.min.js"></script>
<script src="https://cdn.firebase.com/js/simple-login/1.6.4/firebase-simple-login.js"></script>
<!-- App files -->
<script src="app.js"></script>
<script src="posts.ctrl.js"></script>
<script src="postview.ctrl.js"></script>
<script src="auth.ctrl.js"></script>
<script src="profile.ctrl.js"></script>
<script src="nav.ctrl.js"></script>
<script src="post.serv.js"></script>
<script src="auth.serv.js"></script>
<script src="url.fltr.js"></script>
</body>
</html>
var app = angular.module('app', [
'ui.router',
'ngAnimate',
'ngCookies',
'ngResource',
'ngRoute',
'ngSanitize',
'ngTouch',
'firebase'
])
.constant('FIREBASE_URL', 'https://angfirenews.firebaseio.com/')
.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/');
var posts = {
name: 'posts',
url: '/posts',
views: {
'navbar': {
templateUrl: 'nav.tpl.html',
controller: 'NavCtrl'
},
'': {
templateUrl: 'posts.tpl.html',
controller: 'PostsCtrl'
}
}
};
var profile = {
name: 'profile',
url: '/users/:userId',
views: {
'navbar@': {
templateUrl: 'nav.tpl.html',
controller: 'NavCtrl'
},
'': {
templateUrl: 'profile.tpl.html',
controller: 'ProfileCtrl'
}
}
};
var postView = {
name: 'posts.postview',
parent: posts,
url: '/:postId',
views: {
'navbar@': {
templateUrl: 'nav.tpl.html',
controller: 'NavCtrl'
},
'@posts.postview': {
templateUrl: 'postview.tpl.html',
controller: 'PostViewCtrl'
}
}
};
$stateProvider
.state(posts)
.state(postView)
.state(profile);
}]);
app.controller('PostsCtrl', function ($scope, $location, Post, Auth) {
$scope.posts = Post.all;
$scope.user = Auth.user;
$scope.post = {url: 'http://', title: ''};
$scope.deletePost = function (post) {
Post.delete(post);
};
});
app.controller('PostViewCtrl', function ($scope, $routeParams, Post, Auth) {
$scope.post = Post.get($routeParams.postId);
$scope.comments = Post.comments($routeParams.postId);
$scope.user = Auth.user;
$scope.signedIn = Auth.signedIn;
$scope.addComment = function () {
if(!$scope.commentText || $scope.commentText === '') {
return;
}
var comment = {
text: $scope.commentText,
creator: $scope.user.profile.username,
creatorUID: $scope.user.uid
};
$scope.comments.$add(comment);
$scope.commentText = '';
};
$scope.deleteComment = function (comment) {
$scope.comments.$remove(comment);
};
});
app.controller('AuthCtrl', function ($scope, $location, Auth, user) {
if (user) {
$location.path('/');
}
$scope.login = function () {
Auth.login($scope.user).then(function () {
$location.path('/');
}, function (error) {
$scope.error = error.toString();
});
};
$scope.register = function () {
Auth.register($scope.user).then(function(user) {
return Auth.login($scope.user).then(function() {
user.username = $scope.user.username;
return Auth.createProfile(user);
}).then(function() {
$location.path('/');
});
}, function(error) {
$scope.error = error.toString();
});
};
});
app.controller('ProfileCtrl', function ($scope, $routeParams, Profile) {
var uid = $routeParams.userId;
$scope.profile = Profile.get(uid);
Profile.getPosts(uid).then(function(posts) {
$scope.posts = posts;
});
});
app.controller('NavCtrl', function ($scope, $location, Post, Auth) {
$scope.post = {url: 'http://', title: ''};
$scope.user = Auth.user;
$scope.submitPost = function () {
console.log($scope.user);
$scope.post.creator = $scope.user.profile.username;
$scope.post.creatorUID = $scope.user.uid;
Post.create($scope.post).then(function (ref) {
$location.path('/posts/' + ref.name());
$scope.post = {url: 'http://', title: ''};
});
};
$scope.signedIn = Auth.signedIn;
$scope.logout = Auth.logout;
});
app.factory('Post', function ($firebase, FIREBASE_URL) {
var ref = new Firebase(FIREBASE_URL);
var posts = $firebase(ref.child('posts')).$asArray();
// console.log($firebase(ref.child('posts')).$asArray());
var Post = {
all: posts,
create: function (post) {
return posts.$add(post).then(function(postRef) {
$firebase(ref.child('user_posts').child(post.creatorUID))
.$push(postRef.name());
return postRef;
});
},
get: function (postId) {
return $firebase(ref.child('posts').child(postId)).$asObject();
},
delete: function (post) {
return posts.$remove(post);
},
comments: function (postId) {
return $firebase(ref.child('comments').child(postId)).$asArray();
}
};
return Post;
});
app.factory('Auth', function ($firebaseSimpleLogin, FIREBASE_URL, $rootScope, $firebase) {
var ref = new Firebase(FIREBASE_URL);
var auth = $firebaseSimpleLogin(ref);
var Auth = {
register: function (user) {
return auth.$createUser(user.email, user.password);
},
createProfile: function (user) {
var profile = {
username: user.username,
md5_hash: user.md5_hash
};
var profileRef = $firebase(ref.child('profile'));
return profileRef.$set(user.uid, profile);
},
login: function (user) {
return auth.$login('password', user);
},
logout: function () {
auth.$logout();
},
resolveUser: function() {
return auth.$getCurrentUser();
},
signedIn: function() {
return !!Auth.user.provider;
},
user: {}
};
$rootScope.$on('$firebaseSimpleLogin:login', function(e, user) {
angular.copy(user, Auth.user);
Auth.user.profile = $firebase(ref.child('profile').child(Auth.user.uid)).$asObject();
console.log(Auth.user);
});
$rootScope.$on('$firebaseSimpleLogin:logout', function() {
console.log('logged out');
if(Auth.user && Auth.user.profile) {
Auth.user.profile.$destroy();
}
angular.copy({}, Auth.user);
});
return Auth;
});
app.filter('hostnameFromUrl', function () {
return function (str) {
var url = document.createElement('a');
url.href = str;
return url.hostname;
};
});
<div class="container posts-page">
<div class="post row" ng-repeat="post in posts">
<div class="col-xs-1">
</div>
<div class="col-md-9 col-xs-11">
<div class="info">
<a ng-href="{{post.url}}">
{{ post.title }}
<span class="url">{{ post.url | hostnameFromUrl }}</span>
</a>
</div>
<div>
<span>submitted by <a ui-sref="profile({userId:post.creatorUID})">{{ post.creator }}</a></span>
<!-- <p>{{ post.creatorUID }}</p> -->
—
<a ui-sref="posts({postId:post.$id})">comments</a>
<a ng-click="deletePost(post)" ng-show="user.uid === post.creatorUID">delete</a>
</div>
</div>
</div>
</div>
<div class="container posts-page">
<div class="post row">
<div class="col-xs-1">
</div>
<div class="col-md-9 col-xs-11">
<div class="info">
<a ng-href="{{post.url}}">
{{ post.title }}
<span class="url">{{ post.url | hostnameFromUrl }}</span>
</a>
</div>
<div>
<span>
submitted by
<a ui-sref="users({post.creatorUID})">
{{ post.creator }}
</a>
</span>
</div>
</div>
<div class="col-md-2">
</div>
</div>
<div ng-repeat="comment in comments" class="row cmt">
<div class="col-md-12">
<p>{{ comment.text }}</p>
<p class="author">posted by
<a ui-sref="users({comment.creatorUID})">
{{ comment.creator }}
</a>
<a ng-href=""
ng-click="deleteComment(comment)"
ng-show="signedIn() && comment.creatorUID === user.uid"
>
(delete)
</a>
</p>
</div>
</div>
<div class="cmt-form">
<div ng-hide="signedIn()">
<p><a href="#/login">Sign in</a> to post a comment</p>
</div>
<form ng-show="signedIn()" ng-submit="addComment()">
<textarea
ng-model="commentText"
placeholder="Post a Comment"
class="form-control"></textarea><br />
<input type="submit" value="Post Comment" class="btn btn-primary" />
</form>
</div>
</div>
<div class="container profile">
<div class="row">
<div class="col-sm-1">
<img ng-src="http://www.gravatar.com/avatar/{{ profile.md5_hash }}" class="prof-img" />
</div>
<div class="col-sm-10">
<span class="name">
{{ profile.username }}
</span>
</div>
</div>
<div class="post row" ng-repeat="(key,post) in posts">
<div class="col-md-8 col-xs-10">
<div class="info">
<a ng-href="{{ post.url }}">
{{ post.title }}
<span class="url">({{ post.url | hostnameFromUrl }})</span>
</a>
</div>
<div>
<a ui-sref="posts({postID:post.$id})">comments</a>
</div>
</div>
</div>
</div>
<nav class="navbar navbar-default" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" ui-sref="home">ng-news</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div ng-controller="NavCtrl" class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<form class="navbar-form navbar-left" role="search" ng-submit="submitPost()" ng-show="signedIn()">
<div class="form-group">
<input type="text" class="form-control" placeholder="Title" ng-model="post.title">
</div>
<div class="form-group">
<input type="text" class="form-control" placeholder="Link" ng-model="post.url">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
<ul class="nav navbar-nav navbar-right" >
<li ng-show="signedIn()">
<p class="navbar-text">{{ user.profile.username }}</p>
</li>
<li ng-show="signedIn()">
<a ui-sref="profile({userProfile:user.profile.uid})">
<img ng-src="http://www.gravatar.com/avatar/{{ user.profile.md5_hash }}" class="nav-pic" />
{{ currentUser.username }}
</a>
</li>
<li ng-show="signedIn()">
<a ui-sref="home" ng-click="logout()">Logout</a>
</li>
<li ng-hide="signedIn()">
<a ui-sref="login">Login</a>
</li>
<li ng-hide="signedIn()">
<a ui-sref="register">Register</a>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>