+
+
@@ -538,7 +544,7 @@
-
+
@@ -632,6 +638,9 @@
+
@@ -653,13 +662,37 @@ export default {
sidebarToggled: false,
}
},
+ computed: {
+ currentUser() {
+ return {
+ isLoggedIn: this.$store.state.auth.loggedIn,
+ token: this.$store.state.auth.token,
+ profile: this.$store.state.auth.profile || {picture: ''},
+ }
+ },
+ },
async mounted() {
- const loggedIn = await this.$magic.user.isLoggedIn()
- const token = await this.$magic.user.getIdToken()
+ const loggedIn = await this.$magic.user.isLoggedIn().catch((error) => {
+ console.error(error)
+ return false
+ })
+ const token = await this.$magic.user.getIdToken().catch((error) => {
+ console.error(error)
+ return null
+ })
+ if (loggedIn) {
+ const profile = await this.$api.$get('/api/profiles/1').catch(err => {
+ console.error(err)
+ return null;
+ })
+ if (profile) {
+ this.$store.commit('auth/setProfile', profile)
+ } else {
+ await this.$router.push('/profile/setup')
+ }
+ }
this.$store.commit('auth/setToken', token)
this.$store.commit('auth/setLoggedIn', loggedIn)
- const d = await this.$api.$get('/api/movies')
- console.log({ d })
},
methods: {
toggleUserMenu() {
@@ -673,6 +706,12 @@ export default {
this.$store.commit('auth/setToken', null)
this.$store.commit('auth/setLoggedIn', false)
},
+ async login() {
+ const token = await this.$magic.auth.loginWithMagicLink({
+ email: this.email,
+ })
+ this.$store.commit('auth/setToken', token)
+ },
},
}
diff --git a/middleware/authenticated.js b/middleware/authenticated.js
new file mode 100644
index 0000000..f19a800
--- /dev/null
+++ b/middleware/authenticated.js
@@ -0,0 +1,6 @@
+export default function ({ store, redirect }) {
+ // If the user is not authenticated
+ if (!store.state.auth.loggedIn) {
+ return redirect('/login')
+ }
+}
diff --git a/middleware/guest.js b/middleware/guest.js
new file mode 100644
index 0000000..022be88
--- /dev/null
+++ b/middleware/guest.js
@@ -0,0 +1,6 @@
+export default function ({ store, redirect }) {
+ // If the user is not authenticated
+ if (store.state.auth.loggedIn) {
+ return redirect('/')
+ }
+}
diff --git a/nuxt.config.js b/nuxt.config.js
index 9304303..237a2c9 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -1,7 +1,7 @@
export default {
// Global page headers (https://go.nuxtjs.dev/config-head)
head: {
- title: 'comedy-video',
+ titleTemplate: 'ComedyLib: %s',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
diff --git a/package-lock.json b/package-lock.json
index 1aae84b..03e1ec0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2932,6 +2932,11 @@
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
+ "blueimp-md5": {
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz",
+ "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q=="
+ },
"bn.js": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
@@ -3612,6 +3617,46 @@
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
"integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
},
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
"coa": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
@@ -4299,6 +4344,11 @@
"ms": "2.1.2"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -4614,6 +4664,11 @@
}
}
},
+ "email-validator": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz",
+ "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ=="
+ },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -6262,6 +6317,11 @@
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
},
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
"get-intrinsic": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
@@ -6371,6 +6431,17 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
+ "gravatar": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/gravatar/-/gravatar-1.8.1.tgz",
+ "integrity": "sha512-18frnfVp4kRYkM/eQW32Mfwlsh/KMbwd3S6nkescBZHioobflFEFHsvM71qZAkUSLNifyi2uoI+TuGxJAnQIOA==",
+ "requires": {
+ "blueimp-md5": "^2.16.0",
+ "email-validator": "^2.0.4",
+ "querystring": "0.2.0",
+ "yargs": "^15.4.1"
+ }
+ },
"gzip-size": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
@@ -10997,6 +11068,16 @@
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -11251,6 +11332,11 @@
"resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
"integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0="
},
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
"set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -13439,6 +13525,11 @@
"isexe": "^2.0.0"
}
},
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
"which-pm-runs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
@@ -13672,6 +13763,93 @@
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
"integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
"dev": true
+ },
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
}
}
}
diff --git a/package.json b/package.json
index 3018598..5611e4b 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"@splidejs/vue-splide": "^0.3.5",
"@tailwindcss/ui": "^0.7.2",
"core-js": "^3.6.5",
+ "gravatar": "^1.8.1",
"magic-sdk": "^3.0.1",
"nuxt": "^2.14.6"
},
diff --git a/pages/index.vue b/pages/index.vue
index 0faef86..a9ad102 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -190,12 +190,13 @@ export default {
splideOptions: {
lazyLoad: 'nearby',
cover: true,
- type: 'loop',
+ // type: 'loop',
// padding: {
// right: '5rem',
// left: '5rem',
// },
perPage: 4,
+ perMove: 1,
// rewind: false,
breakpoints: {
640: {
diff --git a/pages/login.vue b/pages/login.vue
new file mode 100644
index 0000000..ebaf8ea
--- /dev/null
+++ b/pages/login.vue
@@ -0,0 +1,188 @@
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+ Or continue with
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/profile/setup.vue b/pages/profile/setup.vue
new file mode 100644
index 0000000..eaf1d11
--- /dev/null
+++ b/pages/profile/setup.vue
@@ -0,0 +1,92 @@
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/axios.js b/plugins/axios.js
index e720ef3..25a5cc9 100644
--- a/plugins/axios.js
+++ b/plugins/axios.js
@@ -1,4 +1,4 @@
-export default function ({ $axios }, inject) {
+export default function ({ $axios, store }, inject) {
// Create a custom axios instance
const api = $axios.create({
headers: {
@@ -11,6 +11,28 @@ export default function ({ $axios }, inject) {
// Set baseURL to something different
api.setBaseURL(process.env.baseApiUrl)
+ api.onRequest(config => {
+ config.headers = {
+ ...config.headers,
+ Authorization: store.state.auth.token
+ }
+ })
+
// Inject to context as $api
inject('api', api)
}
+
+
+// export default function ({ $axios, redirect }) {
+// $axios.s
+// $axios.onRequest(config => {
+// console.log('Making request to ' + config.url)
+// })
+//
+// $axios.onError(error => {
+// const code = parseInt(error.response && error.response.status)
+// if (code === 400) {
+// redirect('/400')
+// }
+// })
+// }
diff --git a/plugins/mirage.js b/plugins/mirage.js
index 9618460..7864817 100644
--- a/plugins/mirage.js
+++ b/plugins/mirage.js
@@ -1,22 +1,54 @@
-import { createServer } from 'miragejs'
+import { createServer, Model } from 'miragejs'
+const gravatar = require('gravatar')
if (process.env.NODE_ENV === 'development') {
- startServer(0)
+ // startServer()
}
function startServer() {
createServer({
+ models: {
+ video: Model,
+ profile: Model,
+ category: Model
+ },
+
+ seeds(server) {
+ server.create("video", {title: "Awesome video", thumbnail: "https://images.unsplash.com/photo-1517841905240-472988babdf9?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=1024&h=1024&q=80"})
+ server.createList("video", 10, {thumbnail: "https://images.unsplash.com/photo-1517841905240-472988babdf9?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=8&w=1024&h=1024&q=80"})
+
+ server.create("category", {name: "Sports"})
+ server.createList("category", 21)
+ },
+
routes() {
this.namespace = 'api'
- this.get('/movies', () => {
- return {
- movies: [
- { id: 1, name: 'Inception', year: 2010 },
- { id: 2, name: 'Interstellar', year: 2014 },
- { id: 3, name: 'Dunkirk', year: 2017 },
- ],
- }
+ this.get('/videos', (schema) => {
+ return schema.videos.all()
+ })
+
+ this.get('/profiles', (schema) => {
+ return schema.profiles.all()
+ })
+
+ this.get('/profiles/:id', (schema, request) => {
+ let id = request.params.id
+
+ return schema.profiles.find(id)
+ })
+
+ this.post('/profiles', (schema, request) => {
+ let attrs = JSON.parse(request.requestBody)
+ attrs.id = schema.profiles.all().length + 1
+ attrs.email = 'testEmail@yopmail.com'
+ attrs.picture = gravatar.url(attrs.email)
+
+ return { profile: attrs }
+ })
+
+ this.get('/categories', (schema, request) => {
+ return schema.categories.all()
})
},
})
diff --git a/store/routing.js b/store/routing.js
new file mode 100644
index 0000000..d80154f
--- /dev/null
+++ b/store/routing.js
@@ -0,0 +1,9 @@
+export const state = () => ({
+ redirectedFrom: null
+})
+
+export const mutations = {
+ setRedirectedFrom(state, from) {
+ state.redirectedFrom = from
+ }
+}