Skip to content

Commit

Permalink
Notifications (#52)
Browse files Browse the repository at this point in the history
* Notifications

* fix docs
  • Loading branch information
Geometrically authored May 22, 2023
1 parent 625511d commit 097a1cc
Show file tree
Hide file tree
Showing 13 changed files with 207 additions and 4 deletions.
3 changes: 2 additions & 1 deletion docs/.vitepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,13 @@ export default {
{ text: 'Promotion', link: '/components/promotion' },
{ text: 'Markdown', link: '/components/markdown' },
{ text: 'Copy Code', link: '/components/copy-code' },
{ text: 'Notifications', link: '/components/notifications' },
],
},
],
footer: {
message:
'Released under the <a href="https://github.com/modrinth/omoprhia/blob/main/LICENSE">GPLv3 License</a>.',
'Released under the <a href="https://github.com/modrinth/omoprhia/blob/main/LICENSE">AGPLv3 License</a>.',
copyright: 'Copyright © 2023-present <a href="https://modrinth.com">Rinth, Inc.</a>',
},
},
Expand Down
46 changes: 46 additions & 0 deletions docs/components/notifications.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Notifications

<script setup>
import { ref } from "vue";

const notifsContainer = ref(null);

function addNotification(type) {
console.log(notifsContainer);
notifsContainer.value.addNotification({
title: 'Test Notification',
text: 'This is a test! Random number: ' + Math.random(),
type,
});
}
</script>
<DemoContainer>
<Notifications ref="notifsContainer" />
<Button color="primary" @click="addNotification('success')">Success</Button>
<Button color="highlight" @click="addNotification('warn')">Warning</Button>
<Button color="danger" @click="addNotification('error')">Error</Button>
<Button @click="addNotification('info')">Info</Button>
</DemoContainer>

```vue
<script setup>
import { ref } from "vue";
const notifsContainer = ref(null);
function addNotification(type) {
console.log(notifsContainer);
notifsContainer.value.addNotification({
title: 'Test Notification',
text: 'This is a test! Random number: ' + Math.random(),
type,
});
}
</script>
<Notifications ref="notifsContainer" />
<Button color="primary" @click="addNotification('success')">Success</Button>
<Button color="highlight" @click="addNotification('warn')">Warning</Button>
<Button color="danger" @click="addNotification('error')">Error</Button>
<Button @click="addNotification('info')">Info</Button>
```
1 change: 0 additions & 1 deletion lib/assets/icons/exit.svg

This file was deleted.

4 changes: 4 additions & 0 deletions lib/assets/icons/folder-open.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions lib/assets/icons/folder-search.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lib/assets/icons/hammer.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lib/assets/icons/log-in.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lib/assets/icons/stop-circle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions lib/assets/icons/terminal-square.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions lib/assets/icons/x-circle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
129 changes: 129 additions & 0 deletions lib/components/base/Notifications.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
<template>
<div class="vue-notification-group">
<transition-group name="notifs">
<div
v-for="(item, index) in notifications"
:key="item.id"
class="vue-notification-wrapper"
@click="notifications.splice(index, 1)"
@mouseenter="stopTimer(item)"
@mouseleave="setNotificationTimer(item)"
>
<div class="vue-notification-template vue-notification" :class="{ [item.type]: true }">
<div class="notification-title" v-html="item.title"></div>
<div class="notification-content" v-html="item.text"></div>
</div>
</div>
</transition-group>
</div>
</template>
<script setup>
import { ref } from 'vue'
const notifications = ref([])
defineExpose({
addNotification: (notification) => {
const existingNotif = notifications.value.find(
(x) =>
x.text === notification.text &&
x.title === notification.title &&
x.type === notification.type
)
if (existingNotif) {
setNotificationTimer(existingNotif)
return
}
notification.id = new Date()
setNotificationTimer(notification)
notifications.value.push(notification)
},
})
function setNotificationTimer(notification) {
if (!notification) return
if (notification.timer) {
clearTimeout(notification.timer)
}
notification.timer = setTimeout(() => {
notifications.value.splice(notifications.value.indexOf(notification), 1)
}, 30000)
}
function stopTimer(notif) {
clearTimeout(notif.timer)
}
</script>
<style lang="scss" scoped>
.vue-notification {
background: var(--color-blue) !important;
color: var(--color-accent-contrast) !important;
box-sizing: border-box;
text-align: left;
font-size: 12px;
padding: 10px;
margin: 0 5px 5px;
&.success {
background: var(--color-green) !important;
}
&.warn {
background: var(--color-orange) !important;
}
&.error {
background: var(--color-red) !important;
}
}
.vue-notification-group {
position: fixed;
right: 25px;
bottom: 25px;
z-index: 99999999;
width: 300px;
.vue-notification-wrapper {
width: 100%;
overflow: hidden;
margin-bottom: 10px;
.vue-notification-template {
border-radius: var(--radius-md);
margin: 0;
.notification-title {
font-size: var(--font-size-lg);
margin-right: auto;
font-weight: 600;
}
.notification-content {
margin-right: auto;
font-size: var(--font-size-md);
}
}
&:last-child {
margin: 0;
}
}
}
.notifs-enter-active,
.notifs-leave-active,
.notifs-move {
transition: all 0.5s;
}
.notifs-enter-from,
.notifs-leave-to {
opacity: 0;
}
</style>
10 changes: 9 additions & 1 deletion lib/components/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export { default as FileInput } from './base/FileInput.vue'
export { default as DropArea } from './base/DropArea.vue'
export { default as Toggle } from './base/Toggle.vue'
export { default as CopyCode } from './base/CopyCode.vue'
export { default as Notifications } from './base/Notifications.vue'

export { default as Categories } from './search/Categories.vue'
export { default as SearchFilter } from './search/SearchFilter.vue'
Expand Down Expand Up @@ -52,19 +53,22 @@ export { default as DashboardIcon } from '@/assets/icons/dashboard.svg'
export { default as DownloadIcon } from '@/assets/icons/download.svg'
export { default as DropdownIcon } from '@/assets/icons/dropdown.svg'
export { default as EditIcon } from '@/assets/icons/edit.svg'
export { default as ExitIcon } from '@/assets/icons/exit.svg'
export { default as ExitIcon } from '@/assets/icons/x.svg'
export { default as ExpandIcon } from '@/assets/icons/expand.svg'
export { default as ExternalIcon } from '@/assets/icons/external.svg'
export { default as EyeIcon } from '@/assets/icons/eye.svg'
export { default as EyeOffIcon } from '@/assets/icons/eye-off.svg'
export { default as FileIcon } from '@/assets/icons/file.svg'
export { default as FileTextIcon } from '@/assets/icons/file-text.svg'
export { default as FilterIcon } from '@/assets/icons/filter.svg'
export { default as FolderOpenIcon } from '@/assets/icons/folder-open.svg'
export { default as FolderSearchIcon } from '@/assets/icons/folder-search.svg'
export { default as GapIcon } from '@/assets/icons/gap.svg'
export { default as GitHubIcon } from '@/assets/icons/github.svg'
export { default as GlobeIcon } from '@/assets/icons/globe.svg'
export { default as GridIcon } from '@/assets/icons/grid.svg'
export { default as HamburgerIcon } from '@/assets/icons/hamburger.svg'
export { default as HammerIcon } from '@/assets/icons/hammer.svg'
export { default as HashIcon } from '@/assets/icons/hash.svg'
export { default as HeartIcon } from '@/assets/icons/heart.svg'
export { default as HeartHandshakeIcon } from '@/assets/icons/heart-handshake.svg'
Expand All @@ -78,6 +82,7 @@ export { default as LightBulbIcon } from '@/assets/icons/light-bulb.svg'
export { default as LinkIcon } from '@/assets/icons/link.svg'
export { default as ListIcon } from '@/assets/icons/list.svg'
export { default as LockIcon } from '@/assets/icons/lock.svg'
export { default as LogInIcon } from '@/assets/icons/log-in.svg'
export { default as LogOutIcon } from '@/assets/icons/log-out.svg'
export { default as MoonIcon } from '@/assets/icons/moon.svg'
export { default as OmorphiaIcon } from '@/assets/icons/omorphia.svg'
Expand All @@ -95,10 +100,12 @@ export { default as SettingsIcon } from '@/assets/icons/settings.svg'
export { default as ShieldIcon } from '@/assets/icons/shield.svg'
export { default as SlashIcon } from '@/assets/icons/slash.svg'
export { default as StarIcon } from '@/assets/icons/star.svg'
export { default as StopCircleIcon } from '@/assets/icons/stop-circle.svg'
export { default as SunIcon } from '@/assets/icons/sun.svg'
export { default as SunriseIcon } from '@/assets/icons/sunrise.svg'
export { default as TagIcon } from '@/assets/icons/tag.svg'
export { default as TagsIcon } from '@/assets/icons/tags.svg'
export { default as TerminalSquareIcon } from '@/assets/icons/terminal-square.svg'
export { default as TransferIcon } from '@/assets/icons/transfer.svg'
export { default as TrashIcon } from '@/assets/icons/trash.svg'
export { default as UndoIcon } from '@/assets/icons/undo.svg'
Expand All @@ -113,5 +120,6 @@ export { default as UsersIcon } from '@/assets/icons/users.svg'
export { default as VersionIcon } from '@/assets/icons/version.svg'
export { default as WikiIcon } from '@/assets/icons/wiki.svg'
export { default as XIcon } from '@/assets/icons/x.svg'
export { default as XCircleIcon } from '@/assets/icons/x-circle.svg'

export { default as ModrinthIcon } from '@/assets/branding/logo.svg'
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "omorphia",
"type": "module",
"version": "0.4.16",
"version": "0.4.17",
"files": [
"dist"
],
Expand Down

0 comments on commit 097a1cc

Please sign in to comment.