├── vue.config.js ├── .all-contributorsrc ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public ├── favicon.png └── index.html └── src ├── App.vue ├── assets ├── logo.png └── logo.svg ├── firebase.js ├── main.js ├── plugins └── vuetify.js ├── router.js ├── store.js └── views ├── Account.vue ├── Auth.vue ├── Dashboard.vue ├── DeleteIdea.vue ├── EditIdea.vue ├── Idea.vue ├── Loading.vue ├── MyIdeas.vue ├── Navbar.vue └── PublicIdeas.vue / vue.config.js: -------------------------------------------------------------------------------- 1 | // vue.config.js 2 | 3 | module.exports = { 4 | css: { 5 | loaderOptions: { 6 | sass: { 7 | data: `@import "~@/sass/main.scss"` 8 | } 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "MuhaddiMu", 10 | "name": "Muhammad Muhaddis", 11 | "avatar_url": "https://avatars3.githubusercontent.com/u/26611847?v=4", 12 | "profile": "http://Http://www.Muhaddis.Info", 13 | "contributions": [ 14 | "infra", 15 | "code", 16 | "business" 17 | ] 18 | }, 19 | { 20 | "login": "DiegoPette", 21 | "name": "DiegoPette", 22 | "avatar_url": "https://avatars3.githubusercontent.com/u/31654084?v=4", 23 | "profile": "https://github.com/DiegoPette", 24 | "contributions": [ 25 | "code" 26 | ] 27 | }, 28 | { 29 | "login": "humarh-dharnarh", 30 | "name": "Umar Farouq Mohammed", 31 | "avatar_url": "https://avatars3.githubusercontent.com/u/24873093?v=4", 32 | "profile": "https://umarfarouq.website", 33 | "contributions": [ 34 | "design" 35 | ] 36 | }, 37 | { 38 | "login": "markrmessmore", 39 | "name": "Mark", 40 | "avatar_url": "https://avatars1.githubusercontent.com/u/25889617?v=4", 41 | "profile": "https://MarkMessmore.us", 42 | "contributions": [ 43 | "code", 44 | "design" 45 | ] 46 | }, 47 | { 48 | "login": "Kasulejoseph", 49 | "name": "kasulejoseph", 50 | "avatar_url": "https://avatars2.githubusercontent.com/u/32167860?v=4", 51 | "profile": "https://github.com/Kasulejoseph", 52 | "contributions": [ 53 | "code" 54 | ] 55 | } 56 | ], 57 | "contributorsPerLine": 7, 58 | "projectName": "Idea-ReVue", 59 | "projectOwner": "MuhaddiMu", 60 | "repoType": "github", 61 | "repoHost": "https://github.com" 62 | } 63 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Additional context** 27 | Add any other context about the problem here. 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Muhammad Muhaddis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Idea Re-Vue 💡

2 |

Social ideation platform that helps you brainstorm Ideas. Create, edit, collaborate & share ideas in a fun, visual way 🥳 3 |
4 | TRY IT FREE 🤩

5 |

6 | 7 | ## Inspiration 😍 8 | > When you write down 10 ideas a day as James Altucher recommends, you will have thousands of ways you can make money and improve your life by the end of the year. Even if 90% of your ideas are total crap, you’ll still have 365 high quality and actionable ideas that can change your life. 9 | 10 | ## Technology Stack 👓 11 | **Backend** 12 | - Firebase 13 | 14 | **Frontend** 15 | - Vue.Js 16 | - Vuetify (Material Design Vue Framework) 17 | 18 | ## Setup on Local Environment 💻 19 | - Clone the repository `git clone https://github.com/MuhaddiMu/Idea-ReVue.git`
20 | - Install node modules `npm install` or `yarn install`
21 | - Serve `npm run serve` or `yarn serve` 22 | 23 | ## I want to Contribute 🙏 24 | (Glad to see Pull Request Flooded 🤓)
25 | Pull requests and potential features are welcome. 26 | 27 | 1. Make all changes to your forked branch. 28 | 2. Update this README if necessary. 29 | 3. Submit a Pull Request and make sure to reference the issue. 30 | 31 | ## Todos 📋 32 | - [x] Authentication 33 | - [x] Display My Ideas 34 | - [x] Display Public Ideas 35 | - [x] Love Count 36 | - [x] Update Account 37 | - [x] Edit, Delete Personal Ideas 38 | - [x] Idea Search 39 | - [x] Mark Favourite Idea 40 | - [x] Idea Favourite Count 41 | - [ ] Replace Content Loaders with Vuetify Content Loaders 42 | - [ ] Report Public Idea 43 | - [ ] Single Idea Sharable Link 44 | - [ ] Idea Collaboration 45 | - [ ] Reactive Page Title 46 | - [ ] Idea Love Count 47 | - [ ] Idea board comments 48 | - [ ] Idea Board Prioritization 49 | - [ ] Customize Dashboard 50 | - [ ] Server Side Rendering with Nuxt.Js 51 | - [ ] Mailing 52 | - [ ] Notifications 53 | - [ ] PWA Support 54 | 55 | Feel free to come up with your intuition and update Todo list or let me welcome your PR 🎉 56 | 57 | ## Submit Issues 🐛 58 | Facing any Issues or weird behavior(yes, apps behave)? Feel free to open a [new issue](https://github.com/MuhaddiMu/Idea-ReVue/issues/new) and I will ideate on it where I went wrong. 59 | 60 | ## Contributors ✨ 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
Muhammad Muhaddis
Muhammad Muhaddis

🚇 💻 💼
DiegoPette
DiegoPette

💻
Umar Farouq Mohammed
Umar Farouq Mohammed

🎨
Mark
Mark

💻 🎨
kasulejoseph
kasulejoseph

💻
72 | 73 | 74 | 75 | ## About The Author 😎 76 | Cyber Security Researcher and Full Stack Developer. Vue, AWS & Laravel are my favorite weapons. Make sure to check out my [GitHub](https://github.com/MuhaddiMu) I am on a journey to #365DaysOfCode
77 | Feel free to say 👋 on Twitter [@MuhaddiMu](https://twitter.com/MuhaddiMu) and don't forget to land on [Muhaddis.Info](http://www.Muhaddis.Info)
78 | Interested more about me? [Read 50 Random Facts About Me 😅](https://www.muhaddis.info/50-random-facts-about-me/) 79 | 80 | ## License 81 | [MIT](http://opensource.org/licenses/MIT) 82 | Copyright © 2019, [Muhammad Muhaddis](https://www.Muhaddis.Info). All rights reserved. 83 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/app'] 3 | } 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "idearevue", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "core-js": "^2.6.5", 12 | "date-fns": "^1.30.1", 13 | "firebase": "^6.2.4", 14 | "moment": "^2.24.0", 15 | "vue": "^2.6.10", 16 | "vue-bus": "^1.2.1", 17 | "vue-content-loading": "^1.6.0", 18 | "vue-gravatar": "^1.3.0", 19 | "vue-headful": "^2.0.1", 20 | "vue-masonry": "^0.11.8", 21 | "vue-router": "^3.0.3", 22 | "vuetify": "^2.0.0", 23 | "vuex": "^3.0.1", 24 | "webfontloader": "^1.6.28" 25 | }, 26 | "devDependencies": { 27 | "@mdi/font": "^4.4.95", 28 | "@vue/cli-plugin-babel": "^3.11.0", 29 | "@vue/cli-plugin-eslint": "^3.11.0", 30 | "@vue/cli-service": "^3.11.0", 31 | "@vue/eslint-config-standard": "^4.0.0", 32 | "babel-eslint": "^10.0.1", 33 | "deepmerge": "^4.0.0", 34 | "eslint": "^5.16.0", 35 | "eslint-plugin-vue": "^5.0.0", 36 | "fibers": "^4.0.1", 37 | "sass": "^1.17.4", 38 | "sass-loader": "^7.1.0", 39 | "vue-cli-plugin-vuetify": "^0.6.3", 40 | "vue-template-compiler": "^2.6.10", 41 | "vuetify-loader": "^1.2.2" 42 | }, 43 | "eslintConfig": { 44 | "root": true, 45 | "env": { 46 | "node": true 47 | }, 48 | "extends": [ 49 | "plugin:vue/essential", 50 | "@vue/standard" 51 | ], 52 | "rules": {}, 53 | "parserOptions": { 54 | "parser": "babel-eslint" 55 | } 56 | }, 57 | "postcss": { 58 | "plugins": { 59 | "autoprefixer": {} 60 | } 61 | }, 62 | "browserslist": [ 63 | "> 1%", 64 | "last 2 versions" 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MuhaddiMu/Idea-ReVue/852b3618f4880dba95879193b722d035e5f3f622/public/favicon.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Idea Re-Vue 11 | 12 | 13 | 14 | 15 | 18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 60 | 82 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MuhaddiMu/Idea-ReVue/852b3618f4880dba95879193b722d035e5f3f622/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 46 2 | -------------------------------------------------------------------------------- /src/firebase.js: -------------------------------------------------------------------------------- 1 | import * as firebase from 'firebase/app' 2 | import 'firebase/auth' 3 | import 'firebase/firestore' 4 | 5 | const firebaseConfig = { 6 | apiKey: 'AIzaSyDZpVVmh6M0yKqY-vH8hGl47lsvDCtBeTU', 7 | authDomain: 'vue-druc.firebaseapp.com', 8 | databaseURL: 'https://vue-druc.firebaseio.com', 9 | projectId: 'vue-druc', 10 | storageBucket: 'vue-druc.appspot.com', 11 | messagingSenderId: '115182039616', 12 | appId: '1:115182039616:web:e7187bc0ecc238bc' 13 | } 14 | 15 | firebase.initializeApp(firebaseConfig) 16 | 17 | export default { firebase } 18 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import vuetify from './plugins/vuetify' 3 | import App from './App.vue' 4 | import router from './router' 5 | import store from './store' 6 | import vueHeadful from 'vue-headful' 7 | import firebase from './firebase' 8 | import Gravatar from 'vue-gravatar' 9 | import { VueMasonryPlugin } from 'vue-masonry' 10 | 11 | Vue.use(VueMasonryPlugin) 12 | 13 | Vue.component('v-gravatar', Gravatar) 14 | 15 | Vue.prototype.$eventBus = new Vue() 16 | 17 | Vue.component('vue-headful', vueHeadful) 18 | 19 | router.beforeEach((to, from, next) => { 20 | const currentUser = firebase.firebase.auth().currentUser 21 | const requiresAuth = to.matched.some(record => record.meta.requiresAuth) 22 | if (requiresAuth && !currentUser) { 23 | next('/Auth') 24 | } else if (requiresAuth && currentUser) { 25 | next() 26 | } else { 27 | next() 28 | } 29 | }) 30 | 31 | Vue.config.productionTip = false 32 | firebase.firebase.auth().onAuthStateChanged(function (user) { 33 | new Vue({ 34 | router, 35 | store, 36 | vuetify, 37 | render: h => h(App) 38 | }).$mount('#app') 39 | }) 40 | -------------------------------------------------------------------------------- /src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | // src/plugins/vuetify.js 2 | 3 | import '@mdi/font/css/materialdesignicons.css' // Ensure you are using css-loader 4 | import Vue from 'vue' 5 | import Vuetify from 'vuetify/lib' 6 | 7 | Vue.use(Vuetify) 8 | 9 | export default new Vuetify({ 10 | icons: { 11 | iconfont: 'mdi' // default - only for display purposes 12 | } 13 | }) 14 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import Dashboard from './views/Dashboard.vue' 4 | import Auth from './views/Auth.vue' 5 | import MyIdeas from './views/MyIdeas.vue' 6 | import PublicIdeas from './views/PublicIdeas' 7 | 8 | Vue.use(Router) 9 | 10 | export default new Router({ 11 | mode: 'history', 12 | base: process.env.BASE_URL, 13 | routes: [ 14 | { 15 | path: '/', 16 | name: 'Dashboard', 17 | component: Dashboard, 18 | meta: { 19 | requiresAuth: true 20 | } 21 | }, 22 | { 23 | path: '/Auth', 24 | name: 'Auth', 25 | component: Auth 26 | }, 27 | { 28 | path: '/Ideas', 29 | name: 'MyIdeas', 30 | component: MyIdeas, 31 | meta: { 32 | requiresAuth: true 33 | } 34 | }, 35 | { 36 | path: '/Public', 37 | name: 'PublicIdeas', 38 | component: PublicIdeas, 39 | meta: { 40 | requiresAuth: true 41 | } 42 | } 43 | ] 44 | }) 45 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import firebase from './firebase' 4 | 5 | Vue.use(Vuex) 6 | 7 | export default new Vuex.Store({ 8 | state: { 9 | user: null, 10 | Favorites: [], 11 | loading: false, 12 | LoveCount: null, 13 | UserName: null, 14 | UserEmail: null 15 | }, 16 | 17 | getters: { 18 | getLoading (state) { 19 | return state.loading 20 | }, 21 | getUser: state => { 22 | return state.user 23 | }, 24 | getFavorites: state => { 25 | return state.Favorites 26 | }, 27 | GetLoveCount: state => { 28 | return state.LoveCount 29 | }, 30 | 31 | GetUserName: state => { 32 | return state.UserName 33 | }, 34 | 35 | GetEmail: state => { 36 | return state.UserEmail 37 | } 38 | }, 39 | 40 | mutations: { 41 | setUser: state => { 42 | state.user = firebase.firebase.auth().currentUser 43 | }, 44 | setFavorite (state, payload) { 45 | let favs = state.Favorites 46 | if (favs.includes(payload)) { 47 | let itemToRemove = favs.indexOf(payload) 48 | favs.splice(itemToRemove, 1) 49 | } else { 50 | favs.push(payload) 51 | } 52 | firebase.firebase.firestore().collection('Users').doc(state.user.uid).update({ 53 | Favorites: favs 54 | }) 55 | .then(() => console.log('Success!')) 56 | .catch(() => console.log('Error :(')) 57 | }, 58 | setLoading (state, payload) { 59 | state.loading = payload 60 | }, 61 | SetLoveCount: state => { 62 | var LoveCount = firebase.firebase 63 | .firestore() 64 | .collection('Love') 65 | .doc('Counter') 66 | LoveCount.get().then(function (doc) { 67 | if (doc.exists) { 68 | var Data = doc.data() 69 | state.LoveCount = Data.Count 70 | } 71 | }) 72 | }, 73 | 74 | UpdateLoveCount: state => { 75 | state.LoveCount++ 76 | firebase.firebase 77 | .firestore() 78 | .collection('Love') 79 | .doc('Counter') 80 | .set({ 81 | Count: state.LoveCount 82 | }) 83 | .then(function () { 84 | // DONE 85 | }) 86 | .catch(function (error) { 87 | console.error('Error writing document: ', error) 88 | }) 89 | }, 90 | 91 | UserName: state => { 92 | var docRef = firebase.firebase 93 | .firestore() 94 | .collection('Users') 95 | .doc(state.user.uid) 96 | docRef.get().then(function (doc) { 97 | if (doc.exists) { 98 | state.UserName = doc.data().Name 99 | // ADDING THE USER'S FAVORITES WHILE WE'RE HERE 100 | if (doc.data().Favorites) { 101 | state.Favorites = doc.data().Favorites 102 | } 103 | } else { 104 | console.log('No User Name') 105 | } 106 | }) 107 | }, 108 | 109 | UserEmail: state => { 110 | state.UserEmail = firebase.firebase.auth().currentUser.email // User Login State 111 | }, 112 | 113 | UpdateUsername (state, Username) { 114 | firebase.firebase 115 | .firestore() 116 | .collection('Users') 117 | .doc(state.user.uid) 118 | .update({ 119 | Name: Username 120 | }) 121 | .then(function () { 122 | state.UserName = Username 123 | }) 124 | }, 125 | 126 | UpdateEmail (state, Email) { 127 | state.UserEmail = Email 128 | } 129 | }, 130 | 131 | actions: { 132 | setUser: context => { 133 | context.commit('setUser') 134 | }, 135 | setFavorite ({ commit }, payload) { 136 | commit('setFavorite', payload) 137 | }, 138 | setLoading ({ commit }, payload) { 139 | commit('setLoading', payload) 140 | }, 141 | SetLoveCount: context => { 142 | context.commit('SetLoveCount') 143 | }, 144 | 145 | UpdateLoveCount: context => { 146 | context.commit('UpdateLoveCount') 147 | }, 148 | 149 | UserName: context => { 150 | context.commit('UserName') 151 | }, 152 | UserEmail: context => { 153 | context.commit('UserEmail') 154 | } 155 | } 156 | }) 157 | -------------------------------------------------------------------------------- /src/views/Account.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | 191 | 192 | 195 | -------------------------------------------------------------------------------- /src/views/Auth.vue: -------------------------------------------------------------------------------- 1 | 102 | 103 | 177 | 182 | -------------------------------------------------------------------------------- /src/views/Dashboard.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 88 | 89 | 98 | -------------------------------------------------------------------------------- /src/views/DeleteIdea.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 41 | 42 | 44 | -------------------------------------------------------------------------------- /src/views/EditIdea.vue: -------------------------------------------------------------------------------- 1 | 96 | 97 | 186 | 187 | 197 | -------------------------------------------------------------------------------- /src/views/Idea.vue: -------------------------------------------------------------------------------- 1 | 90 | 91 | 159 | 160 | 170 | -------------------------------------------------------------------------------- /src/views/Loading.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 33 | 34 | 36 | -------------------------------------------------------------------------------- /src/views/MyIdeas.vue: -------------------------------------------------------------------------------- 1 | 131 | 262 | 263 | 268 | -------------------------------------------------------------------------------- /src/views/Navbar.vue: -------------------------------------------------------------------------------- 1 | 96 | 97 | 164 | -------------------------------------------------------------------------------- /src/views/PublicIdeas.vue: -------------------------------------------------------------------------------- 1 | 140 | 283 | 284 | 330 | --------------------------------------------------------------------------------