Skip to content

Commit 81fc06f

Browse files
committedJan 9, 2025·
correct UI for header; grid UI for filters; refactoring
1 parent 7a8ed9b commit 81fc06f

5 files changed

+57
-48
lines changed
 

‎components/notifications-filter.js

+3-31
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { useState, useCallback, useMemo } from 'react'
2-
import { useShowModal } from './modal'
32
import { useRouter } from 'next/router'
43
import { NOTIFICATION_CATEGORIES } from '../lib/constants'
54
import { Checkbox, Form, SubmitButton } from './form'
6-
import FilterIcon from '@/svgs/equalizer-line.svg'
7-
import styles from './notifications-filter.module.css'
5+
import styles from './notifications.module.css'
86

97
export const getFiltersFromInc = (inc) => {
108
const filters = new Set(inc?.split(',') || [])
@@ -17,7 +15,7 @@ export const getSavedFilters = () => {
1715
return savedFilters ? new Set(savedFilters) : new Set()
1816
}
1917

20-
export function NotificationsFilter ({ onClose }) {
18+
export default function NotificationsFilter ({ onClose }) {
2119
const router = useRouter()
2220

2321
const appliedFilters = useMemo(() => {
@@ -65,7 +63,7 @@ export function NotificationsFilter ({ onClose }) {
6563
onClose?.()
6664
}}
6765
>
68-
<div className='d-flex flex-row flex-wrap mt-4'>
66+
<div className={styles.filterContainer}>
6967
{NOTIFICATION_CATEGORIES.map((category) => (
7068
<Checkbox
7169
key={category}
@@ -85,29 +83,3 @@ export function NotificationsFilter ({ onClose }) {
8583
</div>
8684
)
8785
}
88-
89-
export default function NotificationsHeader () {
90-
const showModal = useShowModal()
91-
const router = useRouter()
92-
93-
const hasActiveFilters = useMemo(() => {
94-
const incFilters = getFiltersFromInc(router.query.inc)
95-
return incFilters.size > 0
96-
})
97-
98-
return (
99-
<div className='d-flex align-items-center gap-2'>
100-
<h2 className='mt-1 text-start'>notifications</h2>
101-
<FilterIcon
102-
width={20}
103-
height={20}
104-
className={hasActiveFilters ? styles.filterIconActive : styles.filterIcon}
105-
onClick={() => {
106-
showModal((onClose) => (
107-
<NotificationsFilter onClose={onClose} />
108-
))
109-
}}
110-
/>
111-
</div>
112-
)
113-
}

‎components/notifications-filter.module.css

-14
This file was deleted.

‎components/notifications.js

+32-1
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@ import { paidActionCacheMods } from './use-paid-mutation'
4040
import { useRetryCreateItem } from './use-item-submit'
4141
import { payBountyCacheMods } from './pay-bounty'
4242
import { useToast } from './toast'
43+
import { useShowModal } from './modal'
44+
import NotificationsFilter, { getFiltersFromInc } from './notifications-filter'
4345
import classNames from 'classnames'
4446
import HolsterIcon from '@/svgs/holster.svg'
4547
import SaddleIcon from '@/svgs/saddle.svg'
46-
import NotificationsHeader from './notifications-filter'
48+
import FilterIcon from '@/svgs/equalizer-line.svg'
4749

4850
function Notification ({ n, fresh }) {
4951
const type = n.__typename
@@ -741,6 +743,35 @@ export function NotificationAlert () {
741743
)
742744
}
743745

746+
export function NotificationsHeader () {
747+
const showModal = useShowModal()
748+
const router = useRouter()
749+
750+
const hasActiveFilters = useMemo(() => {
751+
const incFilters = getFiltersFromInc(router.query.inc)
752+
return incFilters.size > 0
753+
})
754+
755+
return (
756+
<div className='d-flex align-items-center gap-2 justify-content-between'>
757+
<div className='d-flex align-items-center gap-2'>
758+
<h2 className='mt-1 text-start'>notifications</h2>
759+
<FilterIcon
760+
width={20}
761+
height={20}
762+
className={hasActiveFilters ? styles.filterIconActive : styles.filterIcon}
763+
onClick={() => {
764+
showModal((onClose) => (
765+
<NotificationsFilter onClose={onClose} />
766+
))
767+
}}
768+
/>
769+
</div>
770+
<NotificationAlert />
771+
</div>
772+
)
773+
}
774+
744775
const nid = n => n.__typename + n.id + n.sortTime
745776

746777
export default function Notifications ({ ssrData }) {

‎components/notifications.module.css

+21
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,25 @@
7373
font-weight: 800;
7474
line-height: 1.25;
7575
vertical-align: middle;
76+
}
77+
78+
.filterIcon {
79+
cursor: pointer;
80+
fill: var(--theme-grey);
81+
}
82+
.filterIcon:hover {
83+
fill: var(--theme-brandColor);
84+
filter: drop-shadow(0 0 2px var(--bs-primary));
85+
}
86+
87+
.filterIconActive {
88+
cursor: pointer;
89+
fill: var(--theme-brandColor);
90+
filter: drop-shadow(0 0 2px var(--bs-primary));
91+
}
92+
93+
.filterContainer {
94+
display: grid;
95+
grid-template-columns: repeat(3, 1fr);
96+
gap: 0.5rem;
7697
}

‎pages/notifications.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useEffect } from 'react'
22
import { getGetServerSideProps } from '@/api/ssrApollo'
33
import Layout from '@/components/layout'
4-
import Notifications, { NotificationAlert } from '@/components/notifications'
4+
import Notifications from '@/components/notifications'
55
import { HAS_NOTIFICATIONS, NOTIFICATIONS } from '@/fragments/notifications'
66
import { useApolloClient } from '@apollo/client'
77
import { clearNotifications } from '@/lib/badge'
@@ -23,7 +23,6 @@ export default function NotificationPage ({ ssrData }) {
2323

2424
return (
2525
<Layout>
26-
<NotificationAlert />
2726
<Notifications ssrData={ssrData} />
2827
</Layout>
2928
)

0 commit comments

Comments
 (0)