Modrinth/pages/notifications.vue
Geometrically 20785926e2
Rewrite Parity (#647)
* Rewrite Parity

* Update SEO, fix modals, add dashes to changelog

* Edit create version title

* Cache tags, SEO for search/partial noscript support, notifications fix

* Deploy?

* Fix vercel config

* Fix it again

* Finish user editing

* Remove broken docker build

* Switch reports to modals

* Update project card

* Navbar line animation in most places

* Add chips

* Move to navlink query params

* remove autogen file

* Add copy code

* Fix webkit text box outlines, port report modal

* Update error page

* Switch to avatar component

* Make keyboard nav work

* Fix team member spacing

* improve project ID display (#676)

* Bug fixes

* Update OG site title

* More fixes

* Design tweaks

* Fix card wrapping on mobile

* Darken light theme color a little

* Sidebar navigation for settings, notifications, and moderation

* Change follow icon from a heart to a bell

* Revert "Change follow icon from a heart to a bell"

This reverts commit e30b46ec5d93c57df847be88eba123c7419dd03b.

* Change follows icon in settings

* AaaaUUUUUUUGghghhhhhhhh

* Project sidebar transparent button animations

* Update file input button styling and change icon remove button text

* Fix environments filter condition being inverted

* Remove -> revert

* Improve readability of warning banners on light mode

* Fix mobile menu button colors

* Clean up notifications page more

* Creator dashboard and monetization work

* Add processing fees declarations and acknowledgement box

* Beta badges

* Downgrade Nuxt Vercel Builder

* Update the style of button groups to be more consistent

* More button consistency

* Remove desktop navbar on mobile

* Update home page progress indicators

* Fix page jumping (Thanks @stairman06)

* Make checkbox checked style consistent with other selection indicators

* More home page updates

* Properly reset NavRows

* Move filters menu on mobile

* Stylized checkbox updated to match active styling

* Filters icon

* Respect prefers-reduced-motion

* Add most backend payouts changes (untested)

* Finish tested payouts code

* Allow monetization unenrolling

* No longer use brand color for active highlights on standard nav elements

* More consistent button group on project page

* Rounded tables

* Fix some things (#716)

* Team member fixes + re-add changelog/versions stuff

* Remove dummy data

* The great CSS refactor

* Remove commented out css

* Give modals the legacy label styles and update profile edit labels

* Fix active chip size

* Remove shadow from selected chip

* Require email set for CMP

* Update styles of notifications to universal-card

* Equivalent exchange, trading some jank for some less bad jank

* Fix all gallery buttons being missing when there is only 1 image

* Update project creation modal

* Make beta badge less bright

* Beta badge heading styling

* Update withdraw processing fees info

* Remove redundant label

* be

* Fix inverted logic

* 2% is 0.02

* Add toggle to turn off alpha modpacks banner

* Why warning button?

* Add more footer links (#719)

* Add more footer links

* Move twitter

* Make items on user pages less comically large and move ad above navigation

* Bump text down a little on home page

* Update favicon colors

* Remove task list package and change default description to use bullet points

* I don't remember why I made this important but let's not

* Ah, yes

* this doesn't actually need to be important

* Align items in input groups

* Adjust some spacings and clear creation modal on opening

* Versions now clickable

* Add link to edit page to default description

* Improve monetization information text

* Make wrapped text inputs not shrink

* Make chips work better

* smol margin on clear mod message button

* Allow non-authenticated users to access settings

* Remove settings anchors

* Fix versions page button style on firefox

* Add advanced rendering toggle

* Update slug input and icon card in project edit page

* Legal sidebar

* h1 at beginning of description no longer has top margin

* Use universal card for legal pages

* Update email addresses on legal pages

* Update various page titles and descriptions for consistency

* Various fixes and consolidation to API URL retrieval

Prevents a bug where it's possible to generate the tags under one API, switch the API, and still have tags leftover from the old API

Also finally fixes staging URL being jank

* Make the theme button show regardless of login state

Also remove the change theme from the user dropdown because it's very redundant with the several other ways of changing theme

* Make mobile profile dropdown ordering consistent with desktop

* Change the base url back

* Revert "Change the base url back"

This reverts commit c1da89fddb83776b39f626eab33c8dc67f8a75e4.

* constantize

* Tiny fixes (#722)

* Box-shadow chip outlines

* Show settings when signed out

* mods -> projects

* space

* Beta badge border

* Slug input overflow fix, scrollable

* 🙈 it will all be okay 🙊 this is just temporary 🙉 😭😭 forgive me

* Fix minor bugs

* fix moderation  page

* More fixes

* Temp fix for download button

* BEGONE TABLES

* Fix download button

Co-authored-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com>
Co-authored-by: Prospector <prospectordev@gmail.com>
Co-authored-by: stairman06 <36215135+stairman06@users.noreply.github.com>
Co-authored-by: triphora <emmaffle@modrinth.com>
2022-11-12 17:57:40 -07:00

232 lines
6.1 KiB
Vue

<template>
<div class="normal-page">
<div class="normal-page__sidebar">
<aside class="universal-card">
<h1>Notifications</h1>
<NavStack>
<NavStackItem link="" label="All"> </NavStackItem>
<NavStackItem
v-for="type in notificationTypes"
:key="type"
:link="'?type=' + type"
:label="NOTIFICATION_TYPES[type]"
>
</NavStackItem>
</NavStack>
<h3>Manage</h3>
<div class="input-group">
<NuxtLink class="iconified-button" to="/settings/follows">
<SettingsIcon />
Followed projects
</NuxtLink>
<button
v-if="$user.notifications.length > 0"
class="iconified-button danger-button"
@click="clearNotifications"
>
<ClearIcon />
Clear all
</button>
</div>
</aside>
</div>
<div class="normal-page__content">
<div class="notifications">
<div
v-for="notification in $route.query.type !== undefined
? $user.notifications.filter((x) => x.type === $route.query.type)
: $user.notifications"
:key="notification.id"
class="universal-card adjacent-input"
>
<div class="label">
<span class="label__title">
<nuxt-link :to="notification.link">
<h3 v-html="$xss($md.render(notification.title))" />
</nuxt-link>
</span>
<div class="label__description">
<p>{{ notification.text }}</p>
<span
v-tooltip="
$dayjs(notification.created).format(
'MMMM D, YYYY [at] h:mm:ss A'
)
"
class="date"
>
<CalendarIcon />
Received {{ $dayjs(notification.created).fromNow() }}</span
>
</div>
</div>
<div class="input-group">
<button
v-for="(action, actionIndex) in notification.actions"
:key="actionIndex"
class="iconified-button"
:class="`action-button-${action.title
.toLowerCase()
.replaceAll(' ', '-')}`"
@click="
performAction(notification, notificationIndex, actionIndex)
"
>
{{ action.title }}
</button>
<button
v-if="notification.actions.length === 0"
class="iconified-button"
@click="performAction(notification, notificationIndex, null)"
>
Dismiss
</button>
</div>
</div>
<div v-if="$user.notifications.length === 0" class="error">
<UpToDate class="icon"></UpToDate>
<br />
<span class="text">You are up-to-date!</span>
</div>
</div>
</div>
</div>
</template>
<script>
import ClearIcon from '~/assets/images/utils/clear.svg?inline'
import SettingsIcon from '~/assets/images/utils/settings.svg?inline'
import CalendarIcon from '~/assets/images/utils/calendar.svg?inline'
import UpToDate from '~/assets/images/illustrations/up_to_date.svg?inline'
import NavStack from '~/components/ui/NavStack'
import NavStackItem from '~/components/ui/NavStackItem'
const NOTIFICATION_TYPES = {
team_invite: 'Team invites',
project_update: 'Project updates',
}
export default {
name: 'Notifications',
components: {
NavStack,
NavStackItem,
ClearIcon,
SettingsIcon,
CalendarIcon,
UpToDate,
},
async fetch() {
this.NOTIFICATION_TYPES = NOTIFICATION_TYPES
await this.$store.dispatch('user/fetchNotifications')
},
head: {
title: 'Notifications - Modrinth',
},
computed: {
notificationTypes() {
const obj = {}
for (const notification of this.$user.notifications.filter(
(it) => it.type !== null
)) {
obj[notification.type] = true
}
return Object.keys(obj)
},
},
methods: {
async clearNotifications() {
try {
const ids = this.$user.notifications.map((x) => x.id)
await this.$axios.delete(
`notifications?ids=${JSON.stringify(ids)}`,
this.$defaultHeaders()
)
ids.forEach((x) => this.$store.dispatch('user/deleteNotification', x))
} catch (err) {
this.$notify({
group: 'main',
title: 'An error occurred',
text: err.response.data.description,
type: 'error',
})
}
},
async performAction(notification, notificationIndex, actionIndex) {
this.$nuxt.$loading.start()
try {
await this.$axios.delete(
`notification/${notification.id}`,
this.$defaultHeaders()
)
await this.$store.dispatch('user/deleteNotification', notification.id)
if (actionIndex !== null) {
const config = {
method:
notification.actions[actionIndex].action_route[0].toLowerCase(),
url: `${notification.actions[actionIndex].action_route[1]}`,
headers: {
Authorization: this.$auth.token,
},
}
await this.$axios(config)
}
} catch (err) {
this.$notify({
group: 'main',
title: 'An error occurred',
text: err.response.data.description,
type: 'error',
})
}
this.$nuxt.$loading.finish()
},
},
}
</script>
<style lang="scss" scoped>
.notifications {
.label {
.label__title {
display: flex;
gap: var(--spacing-card-sm);
align-items: baseline;
margin-block-start: 0;
h3 ::v-deep {
margin: 0;
p {
margin: 0;
}
}
}
.label__description {
margin: 0;
.date {
display: flex;
align-items: center;
gap: var(--spacing-card-xs);
color: var(--color-heading);
font-weight: 500;
font-size: 1rem;
width: fit-content;
}
p {
margin-block: 0 var(--spacing-card-md);
}
}
}
}
</style>