2022-11-27 02:35:26 +00:00
|
|
|
<script setup lang="ts">
|
2022-12-22 08:31:12 +00:00
|
|
|
const props = withDefaults(defineProps<{
|
2022-11-27 16:59:33 +00:00
|
|
|
text?: string
|
2022-11-27 02:35:26 +00:00
|
|
|
icon: string
|
2022-11-30 17:15:18 +00:00
|
|
|
to: string | Record<string, string>
|
2022-12-22 08:31:12 +00:00
|
|
|
userOnly?: boolean
|
|
|
|
}>(), {
|
|
|
|
userOnly: false,
|
|
|
|
})
|
2022-11-27 16:59:33 +00:00
|
|
|
|
|
|
|
defineSlots<{
|
|
|
|
icon: {}
|
|
|
|
default: {}
|
|
|
|
}>()
|
2022-11-29 08:15:05 +00:00
|
|
|
|
|
|
|
const router = useRouter()
|
|
|
|
|
|
|
|
useCommand({
|
|
|
|
scope: 'Navigation',
|
|
|
|
|
2022-12-01 13:45:13 +00:00
|
|
|
name: () => props.text ?? (typeof props.to === 'string' ? props.to as string : props.to.name),
|
2022-11-29 08:15:05 +00:00
|
|
|
icon: () => props.icon,
|
|
|
|
|
|
|
|
onActivate() {
|
|
|
|
router.push(props.to)
|
|
|
|
},
|
|
|
|
})
|
2022-12-22 08:31:12 +00:00
|
|
|
|
|
|
|
let activeClass = $ref('text-primary')
|
|
|
|
watch(isMastoInitialised, async () => {
|
|
|
|
if (!props.userOnly) {
|
|
|
|
// TODO: force NuxtLink to reevaluate, we now we are in this route though, so we should force it to active
|
|
|
|
// we don't have currentServer defined until later
|
|
|
|
activeClass = ''
|
|
|
|
await nextTick()
|
|
|
|
activeClass = 'text-primary'
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
// Optimize rendering for the common case of being logged in, only show visual feedback for disabled user-only items
|
|
|
|
// when we know there is no user.
|
|
|
|
const noUserDisable = computed(() => !isMastoInitialised.value || (props.userOnly && !currentUser.value))
|
|
|
|
const noUserVisual = computed(() => isMastoInitialised.value && props.userOnly && !currentUser.value)
|
2022-11-27 02:35:26 +00:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
2022-12-22 08:31:12 +00:00
|
|
|
<NuxtLink :to="to" :disabled="noUserDisable" :class="noUserVisual ? 'op25 pointer-events-none ' : ''" :active-class="activeClass" group focus:outline-none @click="$scrollToTop">
|
2022-12-21 00:02:01 +00:00
|
|
|
<CommonTooltip :disabled="!isMediumScreen" :content="text" placement="right">
|
2022-12-28 07:00:49 +00:00
|
|
|
<div
|
|
|
|
flex items-center gap4
|
|
|
|
w-fit rounded-full
|
|
|
|
px2 py2 mx3 sm:mxa
|
|
|
|
lg="mx0 px5"
|
|
|
|
transition-100
|
|
|
|
group-hover:bg-active group-focus-visible:ring="2 current"
|
|
|
|
>
|
2022-12-21 00:02:01 +00:00
|
|
|
<slot name="icon">
|
|
|
|
<div :class="icon" text-xl />
|
|
|
|
</slot>
|
|
|
|
<slot>
|
2022-12-21 12:30:51 +00:00
|
|
|
<span block sm:hidden lg:block>{{ text }}</span>
|
2022-12-21 00:02:01 +00:00
|
|
|
</slot>
|
|
|
|
</div>
|
|
|
|
</CommonTooltip>
|
2022-11-27 02:35:26 +00:00
|
|
|
</NuxtLink>
|
|
|
|
</template>
|