forked from Mirrors/elk
feat: image previews (#104)
Co-authored-by: lihbr <lihbr@users.noreply.github.com>
This commit is contained in:
parent
a812ea098f
commit
9df9c06f64
4 changed files with 36 additions and 13 deletions
|
@ -43,19 +43,27 @@ function getFieldNameIcon(fieldName: string) {
|
||||||
if (fieldNameIcons[name])
|
if (fieldNameIcons[name])
|
||||||
return fieldNameIcons[name]
|
return fieldNameIcons[name]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function previewHeader() {
|
||||||
|
openImagePreviewDialog({ src: account.header, alt: `${account.username}'s profile header` })
|
||||||
|
}
|
||||||
|
|
||||||
|
function previewAvatar() {
|
||||||
|
openImagePreviewDialog({ src: account.avatar, alt: account.username })
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div flex flex-col>
|
<div flex flex-col>
|
||||||
<div border="b base">
|
<button border="b base" z-1>
|
||||||
<img h-50 w-full object-cover :src="account.header">
|
<img h-50 w-full object-cover :src="account.header" @click="previewHeader">
|
||||||
</div>
|
</button>
|
||||||
<div p4 mt--17 flex flex-col gap-6>
|
<div p4 mt--17 flex flex-col gap-6>
|
||||||
<div flex justify-between>
|
<div flex justify-between>
|
||||||
<div flex="~ col gap-2 1" min-w-0>
|
<div flex="~ col gap-2 1">
|
||||||
<NuxtLink w-fit :to="getAccountPath(account)">
|
<button w-30 h-30 rounded-full bg-black z-2 @click="previewAvatar">
|
||||||
<AccountAvatar :account="account" w-30 h-30 />
|
<AccountAvatar :account="account" hover:opacity-90 transition-opacity />
|
||||||
</NuxtLink>
|
</button>
|
||||||
<div flex flex-col>
|
<div flex flex-col>
|
||||||
<ContentRich font-bold text-2xl break-words :content="getDisplayName(account)" :emojis="account.emojis" />
|
<ContentRich font-bold text-2xl break-words :content="getDisplayName(account)" :emojis="account.emojis" />
|
||||||
<p op50>
|
<p op50>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { isPreviewHelpOpen, isPublishDialogOpen, isSigninDialogOpen, isUserSwitcherOpen } from '~/composables/dialog'
|
import { isImagePreviewDialogOpen, isPreviewHelpOpen, isPublishDialogOpen, isSigninDialogOpen, isUserSwitcherOpen } from '~/composables/dialog'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -15,4 +15,7 @@ import { isPreviewHelpOpen, isPublishDialogOpen, isSigninDialogOpen, isUserSwitc
|
||||||
<ModalDialog v-model="isPublishDialogOpen">
|
<ModalDialog v-model="isPublishDialogOpen">
|
||||||
<PublishWidget draft-key="dialog" expanded min-w-180 />
|
<PublishWidget draft-key="dialog" expanded min-w-180 />
|
||||||
</ModalDialog>
|
</ModalDialog>
|
||||||
|
<ModalDialog v-model="isImagePreviewDialogOpen">
|
||||||
|
<img :src="imagePreview.src" :alt="imagePreview.alt" max-w-95vw max-h-95vh>
|
||||||
|
</ModalDialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -64,7 +64,12 @@ const aspectRatio = computed(() => {
|
||||||
aspectRatio,
|
aspectRatio,
|
||||||
}"
|
}"
|
||||||
border="~ base"
|
border="~ base"
|
||||||
object-cover rounded-lg
|
object-cover
|
||||||
|
rounded-lg
|
||||||
|
@click="openImagePreviewDialog({
|
||||||
|
src: attachment.url || attachment.previewUrl!,
|
||||||
|
alt: attachment.description!,
|
||||||
|
})"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import type { Draft } from './statusDrafts'
|
import type { Draft } from './statusDrafts'
|
||||||
import { STORAGE_KEY_FIRST_VISIT, STORAGE_KEY_ZEN_MODE } from '~/constants'
|
import { STORAGE_KEY_FIRST_VISIT, STORAGE_KEY_ZEN_MODE } from '~/constants'
|
||||||
|
|
||||||
|
export const imagePreview = ref({ src: '', alt: '' })
|
||||||
export const isFirstVisit = useLocalStorage(STORAGE_KEY_FIRST_VISIT, true)
|
export const isFirstVisit = useLocalStorage(STORAGE_KEY_FIRST_VISIT, true)
|
||||||
export const isZenMode = useLocalStorage(STORAGE_KEY_ZEN_MODE, false)
|
export const isZenMode = useLocalStorage(STORAGE_KEY_ZEN_MODE, false)
|
||||||
export const toggleZenMode = useToggle(isZenMode)
|
export const toggleZenMode = useToggle(isZenMode)
|
||||||
|
@ -8,6 +9,7 @@ export const toggleZenMode = useToggle(isZenMode)
|
||||||
export const isUserSwitcherOpen = ref(false)
|
export const isUserSwitcherOpen = ref(false)
|
||||||
export const isSigninDialogOpen = ref(false)
|
export const isSigninDialogOpen = ref(false)
|
||||||
export const isPublishDialogOpen = ref(false)
|
export const isPublishDialogOpen = ref(false)
|
||||||
|
export const isImagePreviewDialogOpen = ref(false)
|
||||||
export const isPreviewHelpOpen = ref(isFirstVisit.value)
|
export const isPreviewHelpOpen = ref(isFirstVisit.value)
|
||||||
|
|
||||||
export function openUserSwitcher() {
|
export function openUserSwitcher() {
|
||||||
|
@ -19,10 +21,6 @@ export function openSigninDialog() {
|
||||||
isUserSwitcherOpen.value = false
|
isUserSwitcherOpen.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
export function openPreviewHelp() {
|
|
||||||
isPreviewHelpOpen.value = true
|
|
||||||
}
|
|
||||||
|
|
||||||
export function openPublishDialog(draft?: Draft) {
|
export function openPublishDialog(draft?: Draft) {
|
||||||
if (draft)
|
if (draft)
|
||||||
dialogDraft.draft.value = draft
|
dialogDraft.draft.value = draft
|
||||||
|
@ -34,3 +32,12 @@ if (isPreviewHelpOpen.value) {
|
||||||
isFirstVisit.value = false
|
isFirstVisit.value = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function openImagePreviewDialog(image: { src: string; alt: string }) {
|
||||||
|
imagePreview.value = image
|
||||||
|
isImagePreviewDialogOpen.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
export function openPreviewHelp() {
|
||||||
|
isPreviewHelpOpen.value = true
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue