From 3e78cb7cdc126229f27981644dd24446aee35523 Mon Sep 17 00:00:00 2001 From: adb Date: Fri, 25 Dec 2020 01:50:22 +0100 Subject: [PATCH 01/20] group messages and user thumbnail --- src/components/message.vue | 27 +++++++------- src/components/userThumbnail.vue | 4 +- src/views/chat.vue | 63 +++++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/src/components/message.vue b/src/components/message.vue index 3110f84..0138624 100644 --- a/src/components/message.vue +++ b/src/components/message.vue @@ -1,11 +1,9 @@ From 28b5bea1a1141635f3641427d116ff0b923f2d37 Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 10 Mar 2021 01:46:47 +0100 Subject: [PATCH 02/20] update eslint --- .eslintrc.js | 35 +++++++++++++++++++++++++++++++++++ package.json | 38 +++++++++++--------------------------- 2 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..690ad25 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,35 @@ +module.exports = { + "env": { + "browser": true, + "es6": true + }, + "extends": [ + "eslint:recommended", + "plugin:vue/essential" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": [ + "vue" + ], + "rules": { + "indent": [ + "warn", + 2 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "warn", + "single" + ] + } +} diff --git a/package.json b/package.json index cb985ab..92785a5 100644 --- a/package.json +++ b/package.json @@ -18,38 +18,22 @@ "ws": "^7.3.1" }, "devDependencies": { + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-plugin-pwa": "~4.5.0", "@vue/cli-service": "~4.5.0", + "@vue/compiler-sfc": "^3.0.0", + "babel": "^6.23.0", + "babel-cli": "^6.18.0", "babel-eslint": "^10.1.0", "electron": "^11.0.1", - "eslint": "^7.14.0", - "eslint-config-airbnb-base": "^14.2.1", - "eslint-config-standard": "^16.0.2", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-vue": "^7.2.0", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^7.5.0", + "node-sass": "^5.0.0", + "sass-loader": "^10.1.1", "vue-router": "^3.4.9", "vue-template-compiler": "^2.6.11" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/essential", - "eslint:recommended" - ], - "parserOptions": { - "parser": "babel-eslint" - }, - "rules": {} - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] + } } From 08338551ad6aa75acb42a862693b86d522bee946 Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 10 Mar 2021 01:47:43 +0100 Subject: [PATCH 03/20] move vue router --- src/router.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/router.js diff --git a/src/router.js b/src/router.js new file mode 100644 index 0000000..98f0ff5 --- /dev/null +++ b/src/router.js @@ -0,0 +1,34 @@ +import VueRouter from 'vue-router'; +import login from '@/views/login'; +import chat from '@/views/chat'; +import rooms from '@/views/rooms'; + +export const router = new VueRouter({ + routes: [ + { + path: '/', + name: 'home', + component: login + }, + { + path: '/login', + name: 'login', + component: login + }, + { + path: '/chat/*', + name: 'chat', + component: chat + }, + { + path: '/rooms/*', + name: 'room', + component: rooms + }, + { + path: '/rooms', + name: 'rooms', + component: rooms + } + ] +}) \ No newline at end of file From 22c89e6b2ef66d0a803372232683184bbda916f2 Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 10 Mar 2021 01:49:29 +0100 Subject: [PATCH 04/20] move vue router --- src/main.js | 85 ++++++++++------------------------------------------- 1 file changed, 15 insertions(+), 70 deletions(-) diff --git a/src/main.js b/src/main.js index 78d29e5..7ae9ae9 100644 --- a/src/main.js +++ b/src/main.js @@ -1,81 +1,26 @@ -import Vue from "vue" -import VueRouter from "vue-router" -import App from "./App.vue" -import login from "./views/login.vue" -import chat from "./views/chat.vue" -import rooms from "./views/rooms.vue" +import Vue from 'vue' +import VueRouter from 'vue-router' +import App from './App.vue' +import {router} from './router.js' Vue.config.productionTip = false Vue.use(VueRouter) -const router = new VueRouter({ - routes: [ - { - path: "/", - name: "home", - component: login - }, - { - path: "/login", - name: "login", - component: login - }, - { - path: "/chat/*", - name: "chat", - component: chat - }, - { - path: "/rooms/*", - name: "room", - component: rooms - }, - { - path: "/rooms", - name: "rooms", - component: rooms - } - ] -}) -let chatroom = { - name: "open chat", - user: [], - username: "you", - messages: [] -} export default { - data(){ - return { - chatroom: chatroom - } - }, - methods: { - error(msg){ - show_error(msg) - }, - router(route){router.push(route)} - } + methods: { + router(route){router.push(route)} + } } new Vue({ - el: "#app", - router, - template: "", - components: {App}, - data(){ - return { - chatroom: chatroom - } + el: '#app', + router, + template: '', + components: {App}, + data(){ + return { } -}).$mount("#app") - -function element(id){ return document.getElementById(id)} -function show_error(msg) { - let error_style = element("errorBox").style - element("errorMessage").innerText = msg - error_style.display = "block" - error_style.animation = "slide-from-left alternate 0.2s" - setTimeout(() => {error_style.animation = ""}, 200) -} \ No newline at end of file + } +}).$mount('#app') From c57d32c450f0cf44ad3f2bd09495387f0a0b90bd Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 10 Mar 2021 01:50:38 +0100 Subject: [PATCH 05/20] add matrixHandler and cookieHandler --- src/lib/cookieHandler.js | 36 ++++++++++++++++++++++++++++++++++++ src/lib/matrixHandler.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/lib/cookieHandler.js create mode 100644 src/lib/matrixHandler.js diff --git a/src/lib/cookieHandler.js b/src/lib/cookieHandler.js new file mode 100644 index 0000000..62fa832 --- /dev/null +++ b/src/lib/cookieHandler.js @@ -0,0 +1,36 @@ +export class cookieHandler { + constructor(expires) { + this.expires = expires; + this.reload(); + } + getCookie(key){ + let cookie = this.cookies.find(cookie => cookie.split('=')[0] === key); + return cookie ? cookie.split('=')[1] : false; + } + setCookie(object){ + object.forEach((value, key) => { + this.cookies[key] = value; + }) + } + parseCookie(string){ + let cookies; + string.replace(/ /g, '').split(';').forEach(cookie => { + let arr = cookie.split('='); + cookies[arr[0]] = arr[1]; + }) + return cookies; + } + reload(){ + this.cookies = this.parseCookie(document.cookie) + } + store(){ + document.cookie = this.toString(); + } + toString(cookies = this.cookies){ + let string = ''; + cookies.forEach((value, key) => { + string += `${key}=${value}; `; + }) + return string; + } +} diff --git a/src/lib/matrixHandler.js b/src/lib/matrixHandler.js new file mode 100644 index 0000000..f7f5c45 --- /dev/null +++ b/src/lib/matrixHandler.js @@ -0,0 +1,38 @@ +import matrix from 'matrix-js-sdk'; +import {cookieHandler} from '@/lib/cookieHandler.js'; + +export class MatrixHandler { + constructor(clientDisplayName = 'matrix-chat') { + this.clientDisplayName = clientDisplayName; + this.accessToken; + let cookie = new cookieHandler().getCookie(); + this.client = undefined; + if (cookie.baseUrl && cookie.accessToken && cookie.userId) + this.tokenLogin(cookie.baseUrl, cookie.accessToken, cookie.userId); + } + login(user, password, baseUrl, onError){ + if (this.client){ console.log('there is already an active session'); return; } + this.client = new matrix.createClient({ + baseUrl: baseUrl + }); + this.client.login('m.login.password', { + user: user, + password: password, + initial_device_display_name: this.clientDisplayName, + }).then((response) => { + console.log(`access token => ${response.access_token}`); + if (response.error) { + console.log(`login error => ${response.error}`); + onError(response.error); + } + }) + } + tokenLogin(baseUrl, accessToken, userId){ + if (this.client){ console.log('there is already an active session'); return; } + this.client = new matrix.createClient({baseUrl, accessToken, userId}); + this.client.startClient(); + this.client.once('sync', (state) => { + console.log(state); + }); + } +} \ No newline at end of file From 4821e08b80d6884391667526af3bc3a6bd3b81a9 Mon Sep 17 00:00:00 2001 From: adb Date: Thu, 11 Mar 2021 23:39:26 +0100 Subject: [PATCH 06/20] update login --- src/lib/cookieHandler.js | 3 ++- src/lib/matrixHandler.js | 28 +++++++++++++++++++++------- src/main.js | 23 ++++++++++++----------- src/matrix.js | 28 +++++++++------------------- src/views/login.vue | 40 ++++++++++++++++++++++++++++++---------- 5 files changed, 74 insertions(+), 48 deletions(-) diff --git a/src/lib/cookieHandler.js b/src/lib/cookieHandler.js index 62fa832..e37aaea 100644 --- a/src/lib/cookieHandler.js +++ b/src/lib/cookieHandler.js @@ -4,6 +4,7 @@ export class cookieHandler { this.reload(); } getCookie(key){ + if (!this.cookies) return undefined; let cookie = this.cookies.find(cookie => cookie.split('=')[0] === key); return cookie ? cookie.split('=')[1] : false; } @@ -21,7 +22,7 @@ export class cookieHandler { return cookies; } reload(){ - this.cookies = this.parseCookie(document.cookie) + if (document.cookie) this.cookies = this.parseCookie(document.cookie); } store(){ document.cookie = this.toString(); diff --git a/src/lib/matrixHandler.js b/src/lib/matrixHandler.js index f7f5c45..a435fe1 100644 --- a/src/lib/matrixHandler.js +++ b/src/lib/matrixHandler.js @@ -1,16 +1,15 @@ import matrix from 'matrix-js-sdk'; -import {cookieHandler} from '@/lib/cookieHandler.js'; + +export let client = undefined; export class MatrixHandler { constructor(clientDisplayName = 'matrix-chat') { this.clientDisplayName = clientDisplayName; this.accessToken; - let cookie = new cookieHandler().getCookie(); this.client = undefined; - if (cookie.baseUrl && cookie.accessToken && cookie.userId) - this.tokenLogin(cookie.baseUrl, cookie.accessToken, cookie.userId); + this.rooms = undefined; } - login(user, password, baseUrl, onError){ + login(user, password, baseUrl, onError, callback = ()=>{}){ if (this.client){ console.log('there is already an active session'); return; } this.client = new matrix.createClient({ baseUrl: baseUrl @@ -20,19 +19,34 @@ export class MatrixHandler { password: password, initial_device_display_name: this.clientDisplayName, }).then((response) => { - console.log(`access token => ${response.access_token}`); if (response.error) { + this.logout(); console.log(`login error => ${response.error}`); onError(response.error); } + if (response.access_token){ + console.log(`access token => ${response.access_token}`); + console.log(this.client.getRooms()); + callback(response.access_token); + } + }).catch(error => { + this.logout(); + console.log(error); + onError(error.toString()); }) } tokenLogin(baseUrl, accessToken, userId){ if (this.client){ console.log('there is already an active session'); return; } - this.client = new matrix.createClient({baseUrl, accessToken, userId}); + this.client = new matrix.createClient({baseUrl, accessToken, userId}).then(response => { + console.log(response); + }); this.client.startClient(); this.client.once('sync', (state) => { console.log(state); }); } + logout(){ + this.client.stopClient(); + this.client = undefined; + } } \ No newline at end of file diff --git a/src/main.js b/src/main.js index 7ae9ae9..fe533b2 100644 --- a/src/main.js +++ b/src/main.js @@ -2,16 +2,18 @@ import Vue from 'vue' import VueRouter from 'vue-router' import App from './App.vue' import {router} from './router.js' +import {MatrixHandler} from './lib/matrixHandler.js' +import {cookieHandler} from './lib/cookieHandler.js'; -Vue.config.productionTip = false -Vue.use(VueRouter) +Vue.config.productionTip = false; +Vue.use(VueRouter); +export let matrix = new MatrixHandler(); - -export default { - methods: { - router(route){router.push(route)} - } +let cookie = new cookieHandler().getCookie(); +console.log(`cookie => ${cookie}`) +if (cookie && cookie.baseUrl && cookie.accessToken && cookie.userId) { + matrix.tokenLogin(cookie.baseUrl, cookie.accessToken, cookie.userId); } new Vue({ @@ -19,8 +21,7 @@ new Vue({ router, template: '', components: {App}, - data(){ - return { - } + data() { + return {} } -}).$mount('#app') +}).$mount('#app'); diff --git a/src/matrix.js b/src/matrix.js index f4819df..633cd3c 100644 --- a/src/matrix.js +++ b/src/matrix.js @@ -1,8 +1,8 @@ -import matrix from 'matrix-js-sdk'; +/*import matrix from 'matrix-js-sdk'; import main from '@/main.js'; // import Vue from 'vue'; -let client = matrix.createClient({}); +let client = undefined; let session = { user: '', baseUrl: '', @@ -44,23 +44,12 @@ export default { data() { return { session, + client }; }, methods: { login() { - if (session.accessToken !== '') { - main.methods.error('you are already logged in'); - return; - } if (session.login.user === '') { - main.methods.error('username is empty'); - return; - } if (session.login.password === '') { - main.methods.error('password is empty'); - return; - } if (!(session.login.user.includes('@') && session.login.user.includes(':'))) { - main.methods.error('username is in wrong style'); - return; - } + client = matrix.createClient({ baseUrl: session.login.baseUrl }); @@ -72,6 +61,7 @@ export default { document.cookie = `accessToken=${response.access_token}`; document.cookie = `userId=${session.login.user}`; document.cookie = `baseUrl=${session.login.baseUrl}`; + document.cookie = `SameSite=Strict`; document.cookie = `expires=${new Date(Date.now() + 86400 * 10 * 1000)}`; session = { user: session.login.user, @@ -86,12 +76,12 @@ export default { console.log(`login error => ${response.error}`); } window.location.href = '/#/rooms/'; - window.location.reload(); + window.location.reload();*/ /*client.startClient(); client.once('sync', (state) => { console.log(state); });*/ - }); +/* }); }, logout(){ document.cookie = `accessToken=`; @@ -124,7 +114,7 @@ function getCookie(key) { return cookie ? cookie.split('=')[1] : false; } -client.on('event', (event) => { +/*client.on('event', (event) => { //console.log(event.getType()); //console.log(event); if (event.getType() === 'm.room.name') { @@ -175,4 +165,4 @@ client.on('Room.timeline', (event, room) => { } else document.getElementById('scrollDown').style.display = 'block'; } } -}); +});*/ diff --git a/src/views/login.vue b/src/views/login.vue index ecdc93f..def6f6a 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,15 +1,16 @@