├── .bowerrc ├── app └── src │ ├── partials │ ├── user-detail.html │ ├── me.html │ ├── followers.html │ └── friends.html │ ├── controllers │ ├── FriendsCtrl.es6.js │ ├── UserDetailCtrl.es6.js │ ├── FollowersCtrl.es6.js │ ├── main.es6.js │ └── MainCtrl.es6.js │ ├── services │ ├── main.es6.js │ └── VkApiProvider.es6.js │ ├── directives │ ├── main.es6.js │ ├── UserItem.es6.js │ └── UserList.es6.js │ ├── components │ ├── UserList.es6.js │ └── UserItem.es6.js │ ├── animations │ └── main.es6.js │ └── app.es6.js ├── .gitignore ├── README.md ├── bower.json ├── package.json ├── index.html └── gulpfile.js /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "vendors" 3 | } -------------------------------------------------------------------------------- /app/src/partials/user-detail.html: -------------------------------------------------------------------------------- 1 |

User profile

-------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .idea 3 | node_modules 4 | vendors 5 | app/dist -------------------------------------------------------------------------------- /app/src/partials/me.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /app/src/partials/followers.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /app/src/controllers/FriendsCtrl.es6.js: -------------------------------------------------------------------------------- 1 | class FriendsCtrl { 2 | constructor($scope, friends) { 3 | var self = this; 4 | self.$scope = $scope; 5 | self.friends = friends; 6 | } 7 | } 8 | 9 | export default FriendsCtrl; -------------------------------------------------------------------------------- /app/src/controllers/UserDetailCtrl.es6.js: -------------------------------------------------------------------------------- 1 | class UserDetailCtrl { 2 | constructor($scope, user) { 3 | var self = this; 4 | self.$scope = $scope; 5 | self.user = user; 6 | } 7 | } 8 | 9 | export default UserDetailCtrl; -------------------------------------------------------------------------------- /app/src/controllers/FollowersCtrl.es6.js: -------------------------------------------------------------------------------- 1 | class FollowersCtrl { 2 | constructor($scope, followers) { 3 | var self = this; 4 | self.$scope = $scope; 5 | self.followers = followers; 6 | } 7 | } 8 | 9 | export default FollowersCtrl; -------------------------------------------------------------------------------- /app/src/services/main.es6.js: -------------------------------------------------------------------------------- 1 | import * as angular from 'angular'; 2 | import VkApiProvider from './VkApiProvider.es6'; 3 | 4 | angular.module('app.services', []) 5 | .factory('VK', ['$window', $window => angular.isDefined($window.VK) ? $window.VK : null]) 6 | .provider('VKApi', VkApiProvider); -------------------------------------------------------------------------------- /app/src/directives/main.es6.js: -------------------------------------------------------------------------------- 1 | import * as angular from 'angular'; 2 | import UserItem from './UserItem.es6'; 3 | import UserList from './UserList.es6'; 4 | 5 | angular.module('app.directives', []) 6 | .directive('userItem', ['$timeout', UserItem]) 7 | .directive('userList', ['$timeout', UserList]); -------------------------------------------------------------------------------- /app/src/components/UserList.es6.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @jsx React.DOM 3 | */ 4 | import * as React from 'react'; 5 | import UserItem from './UserItem.es6'; 6 | import { map } from 'lodash'; 7 | 8 | var UserList = React.createClass({ 9 | 10 | render() { 11 | var userItems = map(this.props.users, user => ); 12 | 13 | return ; 14 | } 15 | }); 16 | 17 | export default UserList; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### This project use [Gulp](http://gulpjs.com), [Webpack](http://webpack.github.io), [6to5](https://github.com/sebmck/6to5), [ReactJS](http://facebook.github.io/react) and also ES6 features. It's just a very easy starterkit :D ### 2 | 3 | ####You need execute several commands: #### 4 | - npm install or npm i 5 | - bower install or bower i 6 | - gulp or gulp webpack 7 | 8 | ###[A new version with more better functional available here](https://github.com/xgrommx/angular-vk-app/tree/babel) -------------------------------------------------------------------------------- /app/src/components/UserItem.es6.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @jsx React.DOM 3 | */ 4 | 5 | import * as React from 'react'; 6 | 7 | var UserItem = React.createClass({ 8 | render() { 9 | return (
  • 10 |
    11 | 12 |
    13 |
    {this.props.user.first_name}
    14 |
    {this.props.user.last_name}
    15 |
  • ); 16 | } 17 | }); 18 | 19 | export default UserItem; -------------------------------------------------------------------------------- /app/src/partials/friends.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    -------------------------------------------------------------------------------- /app/src/directives/UserItem.es6.js: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import UserItemComponent from '../components/UserItem.es6'; 3 | 4 | var UserItem = ($timeout) => ({ 5 | restrict: "AE", 6 | scope: { 7 | user: '@' 8 | }, 9 | link: (scope, element, attributes) => { 10 | attributes.$observe('user', user => { 11 | $timeout(() => { 12 | React.renderComponent(UserItemComponent({user: angular.fromJson(user)}), element[0]); 13 | }, 0); 14 | }); 15 | } 16 | }); 17 | 18 | 19 | export default UserItem; -------------------------------------------------------------------------------- /app/src/controllers/main.es6.js: -------------------------------------------------------------------------------- 1 | import * as angular from 'angular'; 2 | import MainCtrl from './MainCtrl.es6'; 3 | import FriendsCtrl from './FriendsCtrl.es6'; 4 | import FollowersCtrl from './FollowersCtrl.es6'; 5 | import UserDetailCtrl from './UserDetailCtrl.es6'; 6 | 7 | angular.module('app.controllers', []).controller({ 8 | 'MainCtrl': ['$scope', 'VKApi', MainCtrl], 9 | 'FriendsCtrl': ['$scope', 'friends', FriendsCtrl], 10 | 'FollowersCtrl': ['$scope', 'followers', FollowersCtrl], 11 | 'UserDetailCtrl': ['$scope', 'user', UserDetailCtrl] 12 | }); -------------------------------------------------------------------------------- /app/src/directives/UserList.es6.js: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import UserItemComponent from '../components/UserItem.es6'; 3 | import UserListComponent from '../components/UserList.es6'; 4 | 5 | var UserList = ($timeout) => ({ 6 | restrict: "AE", 7 | scope: { 8 | users: '@' 9 | }, 10 | link: (scope, element, attributes) => { 11 | attributes.$observe('users', users => { 12 | $timeout(() => { 13 | React.renderComponent(UserListComponent({users: angular.fromJson(users)}), element[0]); 14 | }, 0); 15 | }); 16 | } 17 | }); 18 | 19 | 20 | export default UserList; -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-vk-app", 3 | "version": "0.0.0", 4 | "homepage": "https://github.com/xgrommx/angular-vk-app", 5 | "authors": [ 6 | "Denis Stoyanov " 7 | ], 8 | "license": "MIT", 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "app/vendors", 14 | "test", 15 | "tests" 16 | ], 17 | "dependencies": { 18 | "angular": "latest", 19 | "angular-ui-router": "latest", 20 | "react": "latest", 21 | "angular-animate": "latest", 22 | "angular-messages": "latest", 23 | "jquery": "latest", 24 | "angular-breadcrumb": "latest" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/controllers/MainCtrl.es6.js: -------------------------------------------------------------------------------- 1 | class MainCtrl { 2 | constructor($scope, VKApi) { 3 | var self = this; 4 | var fields = ['uid', 'first_name', 'last_name', 'nickname', 'sex', 5 | 'birthdate', 'city', 'country', 'timezone', 'photo', 'photo_medium', 6 | 'photo_big', 'domain', 'has_mobile', 'rate', 'contacts', 'education', 'online', 'counters']; 7 | 8 | self.$scope = $scope; 9 | self.VKApi = VKApi; 10 | 11 | VKApi.getUser(fields).then(user => { 12 | self.user = user; 13 | self.countFriends = user.counters.friends; 14 | self.countFollowers = user.counters.followers; 15 | }); 16 | } 17 | } 18 | 19 | export default MainCtrl; -------------------------------------------------------------------------------- /app/src/animations/main.es6.js: -------------------------------------------------------------------------------- 1 | import * as angular from 'angular'; 2 | import * as $ from 'jquery'; 3 | import 'angular-animate'; 4 | 5 | angular.module('app.animations', []) 6 | .animation('.view-animation', () => ({ 7 | enter: (element, done) => { 8 | $(element).css("display", "none"); 9 | $(element).fadeIn(2000, done); 10 | 11 | return function() { 12 | $(element).stop(); 13 | } 14 | }, 15 | leave: (element, done) => { 16 | $(element).css("display", "none"); 17 | 18 | return function() { 19 | $(element).stop(); 20 | } 21 | } 22 | })); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-vk-app", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "gulpfile.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/xgrommx/angular-vk-app.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/xgrommx/angular-vk-app/issues" 17 | }, 18 | "homepage": "https://github.com/xgrommx/angular-vk-app", 19 | "dependencies": { 20 | "lodash": "^2.4.1", 21 | "rx": "latest", 22 | "rx-angular": "latest" 23 | }, 24 | "devDependencies": { 25 | "6to5": "latest", 26 | "6to5-loader": "latest", 27 | "exports-loader": "latest", 28 | "gulp": "latest", 29 | "gulp-load-plugins": "latest", 30 | "gulp-webpack": "latest", 31 | "gulp-webserver": "latest", 32 | "run-sequence": "latest", 33 | "webpack": "latest" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AngularJS VK application 6 | 7 | 8 | 9 | 10 | 11 |
    12 |
    13 | 16 | 26 |
    27 |
    28 |
    29 |
    30 |
    31 | 32 | -------------------------------------------------------------------------------- /app/src/app.es6.js: -------------------------------------------------------------------------------- 1 | import * as angular from 'angular'; 2 | import 'angular-animate'; 3 | import 'ui-router'; 4 | import 'angular-breadcrumb'; 5 | 6 | import './controllers/main.es6'; 7 | import './services/main.es6'; 8 | import './directives/main.es6'; 9 | import './animations/main.es6'; 10 | 11 | var app = angular.module('app', ['ui.router', 'ncy-angular-breadcrumb', 'ngAnimate', 'app.controllers', 'app.services', 'app.directives', 'app.animations']); 12 | 13 | app.constant('fields', ['uid', 'first_name', 'last_name', 'nickname', 'sex', 14 | 'birthdate', 'city', 'country', 'timezone', 'photo', 'photo_medium', 15 | 'photo_big', 'domain', 'has_mobile', 'rate', 'contacts', 'education', 'online', 'counters']); 16 | 17 | app.config(['VKApiProvider', VKApiProvider => { 18 | VKApiProvider.setSettings({ 19 | apiId: 4150267, 20 | apiVersion: '5.10' 21 | }); 22 | }]).config(['$stateProvider', '$urlRouterProvider', 'fields', ($stateProvider, $urlRouterProvider, fields) => { 23 | $urlRouterProvider.otherwise('/me'); 24 | 25 | $stateProvider.state('me', { 26 | url: '/me', 27 | templateUrl: './app/src/partials/me.html', 28 | data: { 29 | ncyBreadcrumbLabel: 'Home page' 30 | } 31 | }); 32 | $stateProvider.state('friends', { 33 | url: '/friends', 34 | templateUrl: './app/src/partials/friends.html', 35 | controller: 'FriendsCtrl as f', 36 | resolve: { 37 | friends: VKApi => VKApi.getFriends(fields) 38 | }, 39 | data: { 40 | ncyBreadcrumbLabel: 'Friends page' 41 | } 42 | }); 43 | $stateProvider.state('followers', { 44 | url: '/followers', 45 | templateUrl: './app/src/partials/followers.html', 46 | controller: 'FollowersCtrl as f', 47 | resolve: { 48 | followers: VKApi => VKApi.getFollowers().then(response => VKApi.getUser(fields, response.items)) 49 | }, 50 | data: { 51 | ncyBreadcrumbLabel: 'Followers page' 52 | } 53 | }) 54 | }]); -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require("gulp"); 2 | var webpack = require("webpack"); 3 | 4 | var $ = require('gulp-load-plugins')({ 5 | camelize: true 6 | }); 7 | 8 | gulp.task('webserver', function() { 9 | gulp.src(['./', '!./node_modules/**', '!./vendors/**']) 10 | .pipe($.webserver({ 11 | livereload: true, 12 | directoryListing: false, 13 | open:false, 14 | fallback: 'index.html' 15 | })); 16 | }); 17 | 18 | gulp.task("webpack", function() { 19 | return gulp.src("./app/src/app.es6.js") 20 | .pipe($.webpack({ 21 | cache: true, 22 | target: "web", 23 | debug: true, 24 | watch: true, 25 | devtool: "#inline-source-map", 26 | resolve: { 27 | modulesDirectories: ["vendors", "node_modules"], 28 | alias: { 29 | "angular": "angular/angular.min", 30 | "ui-router": "angular-ui-router/release/angular-ui-router.min", 31 | "angular-animate": "angular-animate/angular-animate.min", 32 | "angular-messages": "angular-messages/angular-messages.min", 33 | "angular-breadcrumb": "angular-breadcrumb/dist/angular-breadcrumb.min", 34 | "jquery": "jquery/dist/jquery.min", 35 | "react": "react/react.min" 36 | } 37 | }, 38 | plugins: [ 39 | new webpack.ResolverPlugin([ 40 | new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"]) 41 | ]) 42 | ], 43 | module: { 44 | loaders: [ 45 | {test: /angular.min.js$/, loader: "exports?angular"}, 46 | {test: /.es6.js$/, loader: '6to5-loader'}, 47 | ] 48 | }, 49 | output: { 50 | filename: "bundle.js" 51 | } 52 | })) 53 | .pipe(gulp.dest('./app/dist/')); 54 | }); 55 | 56 | gulp.task("default", ["webserver", "webpack"]); 57 | -------------------------------------------------------------------------------- /app/src/services/VkApiProvider.es6.js: -------------------------------------------------------------------------------- 1 | function VKApi() { 2 | var settings = {}; 3 | 4 | this.setSettings = (vkSettings) => { 5 | settings = vkSettings; 6 | }; 7 | 8 | this.$get = ['$rootScope', '$q', '$log', '$timeout', 'VK', ($rootScope, $q, $log, $timeout, VK) => { 9 | if(typeof VK === "undefined") 10 | throw new Error("You forgot include VK script"); 11 | if(typeof settings.apiId === "undefined" && typeof settings.apiVersion === "undefined") 12 | throw new Error("You forgot initialize settings in a config function"); 13 | VK.init({ apiId: settings.apiId, apiVersion: settings.apiVersion }); 14 | 15 | var authenticate = () => 16 | $q((resolve, reject) => { 17 | VK.Auth.getLoginStatus(response => { 18 | if(response.session) { 19 | var mid = response.session.mid; 20 | $timeout(() => resolve(mid), 0); 21 | } else { 22 | VK.Auth.login(response => $log.info(response, 'response'), 2 + 4 + 8 + 16); 23 | } 24 | }); 25 | }); 26 | 27 | var getMid = () => authenticate().then(mid => mid); 28 | 29 | var getSession = () => authenticate().then(mid => 30 | $q((resolve, reject) => { 31 | if(VK.Auth.getSession() != null) { 32 | var session = VK.Auth.getSession(); 33 | 34 | if(session.mid === mid) { 35 | resolve(session); 36 | } else { 37 | reject(new Error("This session does not correct for current user")); 38 | } 39 | } 40 | }) 41 | ); 42 | 43 | var getUser = (fields, uid) => authenticate().then(mid => 44 | $q((resolve, reject) => { 45 | VK.api('users.get', { 46 | user_ids: typeof uid === 'undefined' ? mid: uid.join(","), 47 | fields: fields.join(',') 48 | }, response => { 49 | if(response.response) { 50 | $timeout(() => resolve(typeof uid !== 'undefined' ? response.response: response.response[0]), 0); 51 | } 52 | }); 53 | }) 54 | ); 55 | 56 | var getFollowers = params => authenticate().then(mid => { 57 | params = params || {}; 58 | params.mid = mid; 59 | 60 | return $q((resolve, reject) => { 61 | VK.api('users.getFollowers', params, response => { 62 | if(response.response) { 63 | $timeout(() => resolve(response.response), 0); 64 | } 65 | }); 66 | }) 67 | }); 68 | 69 | var getFriends = fields => authenticate().then(mid => 70 | $q((resolve, reject) => { 71 | VK.api('friends.get', { 72 | user_id: mid, 73 | fields: fields.join(',') 74 | }, response => { 75 | if (response.response) { 76 | $timeout(() => resolve(response.response), 0); 77 | } 78 | }); 79 | }) 80 | ); 81 | 82 | var photosSearch = (lat, long) => authenticate().then(mid => 83 | $q((resolve, reject) => { 84 | VK.api('photos.search', { lat, long }, (response) => { 85 | if (response.response) { 86 | $timeout(() => resolve(response.response), 0); 87 | } 88 | }); 89 | }) 90 | ); 91 | 92 | return { 93 | authenticate, 94 | getMid, 95 | getUser, 96 | getSession, 97 | getFollowers, 98 | getFriends, 99 | photosSearch 100 | }; 101 | }]; 102 | } 103 | 104 | export default VKApi; --------------------------------------------------------------------------------