kopia lustrzana https://github.com/elk-zone/elk
				
				
				
			
		
			
				
	
	
		
			105 wiersze
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			105 wiersze
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
| <script setup lang="ts">
 | |
| import type { mastodon } from 'masto'
 | |
| import { NOTIFICATION_FILTER_TYPES } from '~/constants'
 | |
| import type {
 | |
|   CommonRouteTabMoreOption,
 | |
|   CommonRouteTabOption,
 | |
| } from '~/components/common/CommonRouteTabs.vue'
 | |
| 
 | |
| definePageMeta({
 | |
|   middleware: 'auth',
 | |
| })
 | |
| 
 | |
| const route = useRoute()
 | |
| const { t } = useI18n()
 | |
| const pwaEnabled = useAppConfig().pwaEnabled
 | |
| 
 | |
| const tabs = $computed<CommonRouteTabOption[]>(() => [
 | |
|   {
 | |
|     name: 'all',
 | |
|     to: '/notifications',
 | |
|     display: isHydrated.value ? t('tab.notifications_all') : '',
 | |
|   },
 | |
|   {
 | |
|     name: 'mention',
 | |
|     to: '/notifications/mention',
 | |
|     display: isHydrated.value ? t('tab.notifications_mention') : '',
 | |
|   },
 | |
| ])
 | |
| 
 | |
| const filter = $computed<mastodon.v1.NotificationType | undefined>(() => {
 | |
|   if (!isHydrated.value)
 | |
|     return undefined
 | |
| 
 | |
|   const rawFilter = route.params?.filter
 | |
|   const actualFilter = Array.isArray(rawFilter) ? rawFilter[0] : rawFilter
 | |
|   if (isNotificationFilter(actualFilter))
 | |
|     return actualFilter
 | |
| })
 | |
| 
 | |
| const filterIconMap: Record<mastodon.v1.NotificationType, string> = {
 | |
|   'mention': 'i-ri:at-line',
 | |
|   'status': 'i-ri:account-pin-circle-line',
 | |
|   'reblog': 'i-ri:repeat-fill',
 | |
|   'follow': 'i-ri:user-follow-line',
 | |
|   'follow_request': 'i-ri:user-shared-line',
 | |
|   'favourite': 'i-ri:heart-3-line',
 | |
|   'poll': 'i-ri:chat-poll-line',
 | |
|   'update': 'i-ri:edit-2-line',
 | |
|   'admin.sign_up': 'i-ri:user-add-line',
 | |
|   'admin.report': 'i-ri:flag-line',
 | |
| }
 | |
| 
 | |
| const filterText = $computed(() => (`${t('tab.notifications_more_tooltip')}${filter ? `: ${t(`tab.notifications_${filter}`)}` : ''}`))
 | |
| 
 | |
| const notificationFilterRoutes = $computed<CommonRouteTabOption[]>(() => NOTIFICATION_FILTER_TYPES.map(
 | |
|   name => ({
 | |
|     name,
 | |
|     to: `/notifications/${name}`,
 | |
|     display: isHydrated.value ? t(`tab.notifications_${name}`) : '',
 | |
|     icon: filterIconMap[name],
 | |
|     match: name === filter,
 | |
|   }),
 | |
| ))
 | |
| const moreOptions = $computed<CommonRouteTabMoreOption>(() => ({
 | |
|   options: notificationFilterRoutes,
 | |
|   icon: 'i-ri:filter-2-line',
 | |
|   tooltip: filterText,
 | |
|   match: !!filter,
 | |
| }))
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <MainContent>
 | |
|     <template #title>
 | |
|       <NuxtLink to="/notifications" timeline-title-style flex items-center gap-2 @click="$scrollToTop">
 | |
|         <div i-ri:notification-4-line />
 | |
|         <span>{{ isHydrated ? t('nav.notifications') : '' }}</span>
 | |
|       </NuxtLink>
 | |
|     </template>
 | |
| 
 | |
|     <template #actions>
 | |
|       <NuxtLink
 | |
|         flex rounded-4 p1
 | |
|         hover:bg-active cursor-pointer transition-100
 | |
|         :title="isHydrated ? t('settings.notifications.show_btn') : ''"
 | |
|         to="/settings/notifications"
 | |
|       >
 | |
|         <span aria-hidden="true" i-ri:notification-badge-line />
 | |
|       </NuxtLink>
 | |
|     </template>
 | |
| 
 | |
|     <template #header>
 | |
|       <CommonRouteTabs replace :options="tabs" :more-options="moreOptions" />
 | |
|     </template>
 | |
| 
 | |
|     <slot>
 | |
|       <template v-if="pwaEnabled">
 | |
|         <NotificationPreferences />
 | |
|       </template>
 | |
| 
 | |
|       <NuxtPage />
 | |
|     </slot>
 | |
|   </MainContent>
 | |
| </template>
 |