mirror of
https://github.com/hay-kot/mealie.git
synced 2025-08-22 22:43:34 -07:00
user image fixes
This commit is contained in:
parent
3bddb54631
commit
d95914cfc8
7 changed files with 76 additions and 19 deletions
|
@ -113,6 +113,11 @@ export const userAPI = {
|
||||||
const response = await apiReq.delete(API_ROUTES.usersIdFavoritesSlug(id, slug));
|
const response = await apiReq.delete(API_ROUTES.usersIdFavoritesSlug(id, slug));
|
||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
userProfileImage(id) {
|
||||||
|
if (!id || id === undefined) return;
|
||||||
|
return `/api/users/${id}/image`;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteErrorText = response => {
|
const deleteErrorText = response => {
|
||||||
|
|
|
@ -91,7 +91,7 @@ export default {
|
||||||
this.hideImage == false;
|
this.hideImage == false;
|
||||||
},
|
},
|
||||||
getProfileImage(id) {
|
getProfileImage(id) {
|
||||||
return `api/users/${id}/image`;
|
return api.users.userProfileImage(id);
|
||||||
},
|
},
|
||||||
editComment(id) {
|
editComment(id) {
|
||||||
this.$set(this.editKeys, id, true);
|
this.$set(this.editKeys, id, true);
|
||||||
|
|
|
@ -2,19 +2,7 @@
|
||||||
<div class="d-print-none no-print">
|
<div class="d-print-none no-print">
|
||||||
<v-navigation-drawer v-model="showSidebar" width="180px" clipped app>
|
<v-navigation-drawer v-model="showSidebar" width="180px" clipped app>
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
<v-list-item two-line v-if="isLoggedIn" to="/admin/profile">
|
<UserAvatar v-if="isLoggedIn" :user="user" />
|
||||||
<v-list-item-avatar color="accent" class="white--text">
|
|
||||||
<img :src="userProfileImage" v-if="!hideImage" @error="hideImage = true" />
|
|
||||||
<div v-else>
|
|
||||||
{{ initials }}
|
|
||||||
</div>
|
|
||||||
</v-list-item-avatar>
|
|
||||||
|
|
||||||
<v-list-item-content>
|
|
||||||
<v-list-item-title> {{ user.fullName }}</v-list-item-title>
|
|
||||||
<v-list-item-subtitle> {{ user.admin ? $t("user.admin") : $t("user.user") }}</v-list-item-subtitle>
|
|
||||||
</v-list-item-content>
|
|
||||||
</v-list-item>
|
|
||||||
|
|
||||||
<v-list-item dense v-if="isLoggedIn" :to="`/user/${user.id}/favorites`">
|
<v-list-item dense v-if="isLoggedIn" :to="`/user/${user.id}/favorites`">
|
||||||
<v-list-item-icon>
|
<v-list-item-icon>
|
||||||
|
@ -46,7 +34,7 @@
|
||||||
mdi-heart
|
mdi-heart
|
||||||
</v-icon>
|
</v-icon>
|
||||||
</v-list-item-icon>
|
</v-list-item-icon>
|
||||||
<v-list-item-title> {{$t('about.support')}} </v-list-item-title>
|
<v-list-item-title> {{ $t("about.support") }} </v-list-item-title>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item to="/admin/about">
|
<v-list-item to="/admin/about">
|
||||||
<v-list-item-icon class="mr-3 pt-1">
|
<v-list-item-icon class="mr-3 pt-1">
|
||||||
|
@ -78,10 +66,14 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import UserAvatar from "@/components/User/UserAvatar";
|
||||||
import { initials } from "@/mixins/initials";
|
import { initials } from "@/mixins/initials";
|
||||||
import { user } from "@/mixins/user";
|
import { user } from "@/mixins/user";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
export default {
|
export default {
|
||||||
|
components: {
|
||||||
|
UserAvatar,
|
||||||
|
},
|
||||||
mixins: [initials, user],
|
mixins: [initials, user],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
61
frontend/src/components/User/UserAvatar.vue
Normal file
61
frontend/src/components/User/UserAvatar.vue
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
<template>
|
||||||
|
<v-list-item two-line to="/admin/profile">
|
||||||
|
<v-list-item-avatar color="accent" class="white--text">
|
||||||
|
<v-img :src="profileImage" v-if="!noImage" />
|
||||||
|
<div v-else>
|
||||||
|
{{ initials }}
|
||||||
|
</div>
|
||||||
|
</v-list-item-avatar>
|
||||||
|
|
||||||
|
<v-list-item-content>
|
||||||
|
<v-list-item-title> {{ user.fullName }}</v-list-item-title>
|
||||||
|
<v-list-item-subtitle> {{ user.admin ? $t("user.admin") : $t("user.user") }}</v-list-item-subtitle>
|
||||||
|
</v-list-item-content>
|
||||||
|
</v-list-item>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { initials } from "@/mixins/initials";
|
||||||
|
import axios from "axios";
|
||||||
|
import { api } from "@/api";
|
||||||
|
export default {
|
||||||
|
mixins: [initials],
|
||||||
|
props: {
|
||||||
|
user: {
|
||||||
|
type: Object,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
noImage: false,
|
||||||
|
profileImage: "",
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
async user() {
|
||||||
|
this.setImage();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async setImage() {
|
||||||
|
const userImageURL = api.users.userProfileImage(this.user.id);
|
||||||
|
if (await this.imageExists(userImageURL)) {
|
||||||
|
this.noImage = false;
|
||||||
|
this.profileImage = userImageURL;
|
||||||
|
} else {
|
||||||
|
this.noImage = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async imageExists(url) {
|
||||||
|
const response = await axios.get(url).catch(() => {
|
||||||
|
this.noImage = true;
|
||||||
|
return { status: 404 };
|
||||||
|
});
|
||||||
|
return response.status !== 404;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
</style>
|
|
@ -73,8 +73,7 @@
|
||||||
</v-virtual-scroll>
|
</v-virtual-scroll>
|
||||||
<v-divider></v-divider>
|
<v-divider></v-divider>
|
||||||
<v-card-actions>
|
<v-card-actions>
|
||||||
<v-spacer></v-spacer>
|
<TheButton class="ml-auto mt-1 mb-n1" create @click="createTheme" />
|
||||||
<TheButton class="mt-1 mb-n1" create @click="createTheme" />
|
|
||||||
</v-card-actions>
|
</v-card-actions>
|
||||||
</template>
|
</template>
|
||||||
</StatCard>
|
</StatCard>
|
||||||
|
|
|
@ -134,7 +134,7 @@ export default {
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
userProfileImage() {
|
userProfileImage() {
|
||||||
return `api/users/${this.user.id}/image`;
|
return api.users.userProfileImage(this.user.id);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ async def get_user_image(id: str):
|
||||||
for recipe_image in user_dir.glob("profile_image.*"):
|
for recipe_image in user_dir.glob("profile_image.*"):
|
||||||
return FileResponse(recipe_image)
|
return FileResponse(recipe_image)
|
||||||
else:
|
else:
|
||||||
return False
|
raise HTTPException(status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
|
||||||
@router.post("/{id}/image", dependencies=[Depends(get_current_user)])
|
@router.post("/{id}/image", dependencies=[Depends(get_current_user)])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue