Don't redirect to login page if we have no account

This commit is contained in:
N Pex 2023-01-09 14:21:08 +00:00
parent e0b2dcbbda
commit 192707d8f0
3 changed files with 119 additions and 72 deletions

View file

@ -18,18 +18,41 @@
</div> </div>
<hr class="my-10 join-line" /> <hr class="my-10 join-line" />
<div class="font-weight-black mb-2" v-if="!currentUser">Choose a name to use.</div> <div class="font-weight-black mb-4" v-if="!currentUser">Choose a name to use.</div>
<v-row v-if="canEditProfile"> <v-row v-if="canEditProfile">
<v-col cols="10" sm="7"> <v-col cols="10" sm="7" class="py-0">
<v-select
ref="avatar"
:items="availableAvatars"
cache-items
outlined
dense
@change="selectAvatar"
:value="availableAvatars[0]"
single-line
autofocus
>
<template v-slot:selection>
<v-text-field <v-text-field
background-color="transparent"
solo solo
flat
hide-details
@click.native.stop=" @click.native.stop="
{ {
} }
" "
v-model="selectedProfile.name" v-model="selectedProfile.name"
></v-text-field> ></v-text-field>
</template>
<template v-slot:item="data">
<v-avatar size="32">
<v-img :src="data.item.image" />
</v-avatar>
<div class="ms-2">{{ data.item.name }}</div>
</template>
</v-select>
<v-checkbox <v-checkbox
id="chk-remember-me" id="chk-remember-me"
class="mt-0" class="mt-0"
@ -38,8 +61,8 @@
@change="onRememberMe" @change="onRememberMe"
/> />
</v-col> </v-col>
<v-col cols="2" sm="5"> <v-col cols="2" sm="5" class="py-0">
<v-avatar @click="showAvatarPickerList"> <v-avatar @click="showAvatarPicker">
<v-img v-if="selectedProfile" :src="selectedProfile.image" /> <v-img v-if="selectedProfile" :src="selectedProfile.image" />
</v-avatar> </v-avatar>
</v-col> </v-col>
@ -68,6 +91,16 @@
</div> </div>
</div> </div>
<input
id="room-avatar-picker"
ref="avatar"
type="file"
name="avatar"
@change="handlePickedAvatar($event)"
accept="image/*"
class="d-none"
/>
<div class="join-lang"> <div class="join-lang">
<h3 class="mb-2">{{ $t("profile.select_language") }}</h3> <h3 class="mb-2">{{ $t("profile.select_language") }}</h3>
<v-row class="align-center"> <v-row class="align-center">
@ -232,8 +265,10 @@ export default {
}, },
methods: { methods: {
removeHomeServer(roomName) { removeHomeServer(roomName) {
let lastIndexDash = roomName.lastIndexOf("-"); let lastIndex = roomName.lastIndexOf(":");
let lastIndex = lastIndexDash > 0 ? lastIndexDash : roomName.lastIndexOf(":"); if (roomName && roomName.startsWith("@")) {
return roomName.substring(roomName.indexOf("@") + 1, lastIndex);
}
return roomName ? roomName.substring(roomName.indexOf("#") + 1, lastIndex) : ""; return roomName ? roomName.substring(roomName.indexOf("#") + 1, lastIndex) : "";
}, },
getRoomInfo() { getRoomInfo() {
@ -375,8 +410,14 @@ export default {
this.selectedProfile = Object.assign({}, value); // Make a copy, so editing does not destroy data this.selectedProfile = Object.assign({}, value); // Make a copy, so editing does not destroy data
}, },
showAvatarPickerList() { showAvatarPicker() {
this.$refs.avatar.$refs.input.click(); this.$refs.avatar.click();
},
handlePickedAvatar(event) {
util.loadAvatarFromFile(event, (image) => {
this.selectedProfile.image = image;
});
}, },
}, },
mounted() { mounted() {

View file

@ -197,11 +197,7 @@
<script> <script>
import SelectLanguageDialog from "./SelectLanguageDialog.vue"; import SelectLanguageDialog from "./SelectLanguageDialog.vue";
import dataUriToBuffer from "data-uri-to-buffer";
import ActionRow from "./ActionRow.vue"; import ActionRow from "./ActionRow.vue";
import ImageResize from "image-resize";
const sizeOf = require("image-size");
//const dataUriToBuffer = require("data-uri-to-buffer");
import util from "../plugins/utils"; import util from "../plugins/utils";
import profileInfoMixin from "./profileInfoMixin"; import profileInfoMixin from "./profileInfoMixin";
import LogoutRoomDialog from './LogoutRoomDialog.vue'; import LogoutRoomDialog from './LogoutRoomDialog.vue';
@ -318,58 +314,9 @@ export default {
}, },
handlePickedAvatar(event) { handlePickedAvatar(event) {
const self = this; util.loadAvatarFromFile(event, (image) => {
if (event.target.files && event.target.files[0]) { this.setAvatar(image);
var reader = new FileReader();
reader.onload = (e) => {
const file = event.target.files[0];
if (file.type.startsWith("image/")) {
try {
var image = e.target.result;
var dimens = sizeOf(dataUriToBuffer(e.target.result));
// Need to resize?
const w = dimens.width;
const h = dimens.height;
if (w > 640 || h > 640) {
var aspect = w / h;
var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed());
var newHeight = parseInt(
(w > h ? 640 / aspect : 640).toFixed()
);
var imageResize = new ImageResize({
format: "png",
width: newWidth,
height: newHeight,
outputType: "blob",
}); });
imageResize
.play(event.target)
.then((img) => {
var resizedImageFile = new File([img], file.name, {
type: img.type,
lastModified: Date.now(),
});
var reader2 = new FileReader();
reader2.onload = (e) => {
self.setAvatar(e.target.result);
};
reader2.readAsDataURL(resizedImageFile);
})
.catch((err) => {
console.error("Resize failed:", err);
});
} else {
self.setAvatar(image);
}
} catch (error) {
console.error("Failed to get image dimensions: " + error);
}
}
};
reader.readAsDataURL(event.target.files[0]);
}
}, },
setAvatar(image) { setAvatar(image) {
const self = this; const self = this;

View file

@ -1,5 +1,10 @@
import axios from 'axios'; import axios from 'axios';
import * as ContentHelpers from "matrix-js-sdk/lib/content-helpers"; import * as ContentHelpers from "matrix-js-sdk/lib/content-helpers";
import dataUriToBuffer from "data-uri-to-buffer";
import ImageResize from "image-resize";
const sizeOf = require("image-size");
var dayjs = require('dayjs'); var dayjs = require('dayjs');
var sha256 = require('js-sha256').sha256; var sha256 = require('js-sha256').sha256;
var aesjs = require('aes-js'); var aesjs = require('aes-js');
@ -597,6 +602,60 @@ class Util {
}); });
} }
loadAvatarFromFile(event, onLoad) {
if (event.target.files && event.target.files[0]) {
var reader = new FileReader();
reader.onload = (e) => {
const file = event.target.files[0];
if (file.type.startsWith("image/")) {
try {
var image = e.target.result;
var dimens = sizeOf(dataUriToBuffer(e.target.result));
// Need to resize?
const w = dimens.width;
const h = dimens.height;
if (w > 640 || h > 640) {
var aspect = w / h;
var newWidth = parseInt((w > h ? 640 : 640 * aspect).toFixed());
var newHeight = parseInt(
(w > h ? 640 / aspect : 640).toFixed()
);
var imageResize = new ImageResize({
format: "png",
width: newWidth,
height: newHeight,
outputType: "blob",
});
imageResize
.play(event.target)
.then((img) => {
var resizedImageFile = new File([img], file.name, {
type: img.type,
lastModified: Date.now(),
});
var reader2 = new FileReader();
reader2.onload = (e) => {
onLoad(e.target.result);
};
reader2.readAsDataURL(resizedImageFile);
})
.catch((err) => {
console.error("Resize failed:", err);
});
} else {
onLoad(image);
}
} catch (error) {
console.error("Failed to get image dimensions: " + error);
}
}
};
reader.readAsDataURL(event.target.files[0]);
}
}
/** /**
* Return number of whole days between the timestamps, at end of that day. * Return number of whole days between the timestamps, at end of that day.
* @param {*} ts1 * @param {*} ts1