feat: init boring avatars (#3615)

This commit is contained in:
Liyas Thomas
2023-12-04 13:20:26 +05:30
committed by GitHub
parent b43531f200
commit 259cd48dbb
7 changed files with 41 additions and 116 deletions

View File

@@ -134,15 +134,10 @@
:on-shown="() => tippyActions.focus()" :on-shown="() => tippyActions.focus()"
> >
<HoppSmartPicture <HoppSmartPicture
v-if="currentUser.photoURL"
v-tippy="{ v-tippy="{
theme: 'tooltip', theme: 'tooltip',
}" }"
:url="currentUser.photoURL" :name="currentUser.uid"
:alt="
currentUser.displayName ||
t('profile.default_hopp_displayname')
"
:title=" :title="
currentUser.displayName || currentUser.displayName ||
currentUser.email || currentUser.email ||
@@ -153,20 +148,6 @@
network.isOnline ? 'bg-green-500' : 'bg-red-500' network.isOnline ? 'bg-green-500' : 'bg-red-500'
" "
/> />
<HoppSmartPicture
v-else
v-tippy="{ theme: 'tooltip' }"
:title="
currentUser.displayName ||
currentUser.email ||
t('profile.default_hopp_displayname')
"
:initial="currentUser.displayName || currentUser.email"
indicator
:indicator-styles="
network.isOnline ? 'bg-green-500' : 'bg-red-500'
"
/>
<template #content="{ hide }"> <template #content="{ hide }">
<div <div
ref="tippyActions" ref="tippyActions"

View File

@@ -6,19 +6,9 @@
class="inline-flex" class="inline-flex"
> >
<HoppSmartPicture <HoppSmartPicture
v-if="member.user.photoURL"
v-tippy="{ theme: 'tooltip' }" v-tippy="{ theme: 'tooltip' }"
:url="member.user.photoURL" :name="member.user.uid"
:title="getUserName(member)" :title="getUserName(member as TeamMember)"
:alt="getUserName(member)"
class="ring-2 ring-primary"
@click="handleClick()"
/>
<HoppSmartPicture
v-else
v-tippy="{ theme: 'tooltip' }"
:title="getUserName(member)"
:initial="getUserName(member)"
class="ring-2 ring-primary" class="ring-2 ring-primary"
@click="handleClick()" @click="handleClick()"
/> />
@@ -59,7 +49,7 @@ const emit = defineEmits<{
const getUserName = (member: TeamMember): string => const getUserName = (member: TeamMember): string =>
member.user.displayName || member.user.displayName ||
member.user.email || member.user.email ||
t("profile.default_hopp_displayName") t("profile.default_hopp_displayname")
const maxMembersSoftLimit = 4 const maxMembersSoftLimit = 4
const maxMembersHardLimit = 6 const maxMembersHardLimit = 6
@@ -77,7 +67,7 @@ const remainingSlicedMembers = computed(
props.teamMembers props.teamMembers
.slice(maxMembersSoftLimit) .slice(maxMembersSoftLimit)
.slice(0, maxMembersHardLimit) .slice(0, maxMembersHardLimit)
.map((member) => getUserName(member)) .map((member) => getUserName(member as TeamMember))
.join(`,<br>`) + .join(`,<br>`) +
(props.teamMembers.length - (maxMembersSoftLimit + maxMembersHardLimit) > 0 (props.teamMembers.length - (maxMembersSoftLimit + maxMembersHardLimit) > 0
? `,<br>${t("team.more_members", { ? `,<br>${t("team.more_members", {

View File

@@ -21,27 +21,15 @@
</HoppSmartPlaceholder> </HoppSmartPlaceholder>
<div v-else class="space-y-8"> <div v-else class="space-y-8">
<div <div
class="-mb-11 h-24 rounded bg-primaryLight md:h-32" class="-mb-12 h-24 rounded bg-primaryLight md:h-32"
style="background-image: url(/images/cover.svg)" style="background-image: url(/images/cover.svg)"
></div> ></div>
<div class="flex flex-col justify-between space-y-8 px-4 md:flex-row"> <div class="flex flex-col justify-between space-y-8 px-4 md:flex-row">
<div class="flex items-end"> <div class="flex items-end">
<HoppSmartPicture <HoppSmartPicture
v-if="currentUser.photoURL" :name="currentUser.uid"
:url="currentUser.photoURL" class="ring-8 ring-primary"
:alt=" :size="64"
currentUser.displayName || t('profile.default_displayname')
"
class="ring-4 ring-primary"
size="16"
rounded="lg"
/>
<HoppSmartPicture
v-else
:initial="currentUser.displayName || currentUser.email"
rounded="lg"
size="16"
class="ring-4 ring-primary"
/> />
<div class="ml-4"> <div class="ml-4">
<label class="heading"> <label class="heading">

View File

@@ -33,28 +33,16 @@
:on-shown="() => tippyActions!.focus()" :on-shown="() => tippyActions!.focus()"
> >
<HoppSmartPicture <HoppSmartPicture
v-if="currentUser.photoURL"
v-tippy="{ v-tippy="{
theme: 'tooltip', theme: 'tooltip',
}" }"
:url="currentUser.photoURL" :name="currentUser.uid"
:alt="currentUser.displayName ?? `${t('app.no_name')}`"
:title=" :title="
currentUser.displayName ?? currentUser.displayName ??
currentUser.email ?? currentUser.email ??
`${t('app.no_name')}` `${t('app.no_name')}`
" "
/> />
<HoppSmartPicture
v-else
v-tippy="{ theme: 'tooltip' }"
:title="
currentUser.displayName ??
currentUser.email ??
`${t('app.no_name')}`
"
:initial="currentUser.displayName ?? currentUser.email"
/>
<template #content="{ hide }"> <template #content="{ hide }">
<div <div
ref="tippyActions" ref="tippyActions"

View File

@@ -17,6 +17,7 @@
"vue": "^3.2.25" "vue": "^3.2.25"
}, },
"dependencies": { "dependencies": {
"@boringer-avatars/vue3": "^0.2.1",
"@fontsource-variable/inter": "^5.0.5", "@fontsource-variable/inter": "^5.0.5",
"@fontsource-variable/material-symbols-rounded": "^5.0.5", "@fontsource-variable/material-symbols-rounded": "^5.0.5",
"@fontsource-variable/roboto-mono": "^5.0.6", "@fontsource-variable/roboto-mono": "^5.0.6",

View File

@@ -1,72 +1,38 @@
<template> <template>
<div <div
tabindex="0" tabindex="0"
class="relative flex items-center justify-center cursor-pointer focus:outline-none focus-visible:ring focus-visible:ring-primaryDark" class="relative rounded-full flex items-center justify-center cursor-pointer focus:outline-none focus-visible:ring focus-visible:ring-primaryDark"
:class="[`rounded-${rounded}`, `w-${size} h-${size}`]"
> >
<img <Avatar
v-if="url" :size="size"
class="absolute object-cover object-center transition bg-primaryDark" :name="name"
:class="[`rounded-${rounded}`, `w-${size} h-${size}`]" :square="false"
:src="url" :colors="['#FFAD08', '#EDD75A', '#73B06F', '#0C8F8F', '#405059']"
:alt="alt" variant="beam"
loading="lazy"
referrerpolicy="no-referrer"
/> />
<div
v-else
class="absolute flex items-center justify-center object-cover object-center transition bg-primaryDark text-accentContrast"
:class="[`rounded-${rounded}`, `w-${size} h-${size}`]"
:style="`background-color: ${initial ? toHex(initial) : '#480000'}`"
>
<template v-if="initial && initial.charAt(0).toUpperCase()">
{{ initial.charAt(0).toUpperCase() }}
</template>
<icon-lucide-user v-else />
</div>
<span <span
v-if="indicator" v-if="indicator"
class="border-primary border-2 h-2.5 -top-0.5 -right-0.5 w-2.5 absolute" class="border-primary rounded-full border-2 h-2.5 -top-0.5 -right-0.5 w-2.5 absolute"
:class="[`rounded-${rounded}`, indicatorStyles]" :class="indicatorStyles"
></span> ></span>
<!-- w-5 h-5 rounded-lg -->
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Avatar } from "@boringer-avatars/vue3";
withDefaults( withDefaults(
defineProps<{ defineProps<{
url: string name: string
alt: string
indicator: boolean indicator: boolean
indicatorStyles: string indicatorStyles: string
rounded: string size: number
size: string
initial: string | undefined | null
}>(), }>(),
{ {
url: "", name: "",
alt: "Profile picture",
indicator: false, indicator: false,
indicatorStyles: "bg-green-500", indicatorStyles: "bg-green-500",
rounded: "full", size: 24,
size: "5",
initial: "",
} }
) )
const toHex = (initial: string) => {
let hash = 0
if (initial.length === 0) return hash
for (let i = 0; i < initial.length; i++) {
hash = initial.charCodeAt(i) + ((hash << 5) - hash)
hash = hash & hash
}
let color = "#"
for (let i = 0; i < 3; i++) {
const value = (hash >> (i * 8)) & 255
color += `00${value.toString(16)}`.slice(-2)
}
return color
}
</script> </script>

17
pnpm-lock.yaml generated
View File

@@ -1414,6 +1414,9 @@ importers:
packages/hoppscotch-ui: packages/hoppscotch-ui:
dependencies: dependencies:
'@boringer-avatars/vue3':
specifier: ^0.2.1
version: 0.2.1(vue@3.2.45)
'@fontsource-variable/inter': '@fontsource-variable/inter':
specifier: ^5.0.5 specifier: ^5.0.5
version: 5.0.5 version: 5.0.5
@@ -4447,6 +4450,14 @@ packages:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true dev: true
/@boringer-avatars/vue3@0.2.1(vue@3.2.45):
resolution: {integrity: sha512-KzAfh31SDXToTvFL0tBNG5Ur+VzfD1PP4jmY5/GS+eIuObGTIAiUu9eiht0LjuAGI+0xCgnaEgsTrOx8H3vLOQ==}
peerDependencies:
vue: ^3.0.0
dependencies:
vue: 3.2.45
dev: false
/@codemirror/autocomplete@6.10.2(@codemirror/language@6.9.0)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.3): /@codemirror/autocomplete@6.10.2(@codemirror/language@6.9.0)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.3):
resolution: {integrity: sha512-3dCL7b0j2GdtZzWN5j7HDpRAJ26ip07R4NGYz7QYthIYMiX8I4E4TNrYcdTayPJGeVQtd/xe7lWU4XL7THFb/w==} resolution: {integrity: sha512-3dCL7b0j2GdtZzWN5j7HDpRAJ26ip07R4NGYz7QYthIYMiX8I4E4TNrYcdTayPJGeVQtd/xe7lWU4XL7THFb/w==}
peerDependencies: peerDependencies:
@@ -11990,7 +12001,7 @@ packages:
vite: ^3.0.0 vite: ^3.0.0
vue: ^3.2.25 vue: ^3.2.25
dependencies: dependencies:
vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0) vite: 3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
vue: 3.2.45 vue: 3.2.45
dev: true dev: true
@@ -26181,7 +26192,7 @@ packages:
dependencies: dependencies:
fast-glob: 3.2.12 fast-glob: 3.2.12
unplugin: 1.4.0 unplugin: 1.4.0
vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0) vite: 3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
dev: true dev: true
/unplugin-fonts@1.0.3(vite@4.4.9): /unplugin-fonts@1.0.3(vite@4.4.9):
@@ -27177,7 +27188,7 @@ packages:
json5: 2.2.3 json5: 2.2.3
local-pkg: 0.4.3 local-pkg: 0.4.3
picocolors: 1.0.0 picocolors: 1.0.0
vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0) vite: 3.2.4(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)
yaml: 2.3.1 yaml: 2.3.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color