allow just showing replies in notifications
This commit is contained in:
parent
291eab6ada
commit
e1ffef8308
api
fragments
pages
@ -5,7 +5,7 @@ import { getInvoice } from './wallet'
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
Query: {
|
Query: {
|
||||||
notifications: async (parent, { cursor }, { me, models }) => {
|
notifications: async (parent, { cursor, filter }, { me, models }) => {
|
||||||
const decodedCursor = decodeCursor(cursor)
|
const decodedCursor = decodeCursor(cursor)
|
||||||
if (!me) {
|
if (!me) {
|
||||||
throw new AuthenticationError('you must be logged in')
|
throw new AuthenticationError('you must be logged in')
|
||||||
@ -64,8 +64,18 @@ export default {
|
|||||||
// HACK to make notifications faster, we only return a limited sub set of the unioned
|
// HACK to make notifications faster, we only return a limited sub set of the unioned
|
||||||
// queries ... we only ever need at most LIMIT+current offset in the child queries to
|
// queries ... we only ever need at most LIMIT+current offset in the child queries to
|
||||||
// have enough items to return in the union
|
// have enough items to return in the union
|
||||||
const notifications = await models.$queryRaw(`
|
const notifications = await models.$queryRaw(
|
||||||
(SELECT DISTINCT "Item".id::TEXT, "Item".created_at AS "sortTime", NULL::BIGINT as "earnedSats",
|
filter === 'replies'
|
||||||
|
? `SELECT DISTINCT "Item".id::TEXT, "Item".created_at AS "sortTime", NULL::BIGINT as "earnedSats",
|
||||||
|
'Reply' AS type
|
||||||
|
FROM "Item"
|
||||||
|
JOIN "Item" p ON "Item".path <@ p.path
|
||||||
|
WHERE p."userId" = $1
|
||||||
|
AND "Item"."userId" <> $1 AND "Item".created_at <= $2
|
||||||
|
ORDER BY "sortTime" DESC
|
||||||
|
OFFSET $3
|
||||||
|
LIMIT ${LIMIT}`
|
||||||
|
: `(SELECT DISTINCT "Item".id::TEXT, "Item".created_at AS "sortTime", NULL::BIGINT as "earnedSats",
|
||||||
'Reply' AS type
|
'Reply' AS type
|
||||||
FROM "Item"
|
FROM "Item"
|
||||||
JOIN "Item" p ON "Item".path <@ p.path
|
JOIN "Item" p ON "Item".path <@ p.path
|
||||||
|
@ -2,7 +2,7 @@ import { gql } from 'apollo-server-micro'
|
|||||||
|
|
||||||
export default gql`
|
export default gql`
|
||||||
extend type Query {
|
extend type Query {
|
||||||
notifications(cursor: String): Notifications
|
notifications(cursor: String, filter: String): Notifications
|
||||||
}
|
}
|
||||||
|
|
||||||
type Votification {
|
type Votification {
|
||||||
|
@ -6,8 +6,8 @@ export const NOTIFICATIONS = gql`
|
|||||||
${ITEM_FIELDS}
|
${ITEM_FIELDS}
|
||||||
${INVITE_FIELDS}
|
${INVITE_FIELDS}
|
||||||
|
|
||||||
query Notifications($cursor: String) {
|
query Notifications($cursor: String, $filter: String) {
|
||||||
notifications(cursor: $cursor) {
|
notifications(cursor: $cursor, filter: $filter) {
|
||||||
cursor
|
cursor
|
||||||
lastChecked
|
lastChecked
|
||||||
notifications {
|
notifications {
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
import { getGetServerSideProps } from '../api/ssrApollo'
|
|
||||||
import Layout from '../components/layout'
|
|
||||||
import Notifications from '../components/notifications'
|
|
||||||
import { NOTIFICATIONS } from '../fragments/notifications'
|
|
||||||
|
|
||||||
export const getServerSideProps = getGetServerSideProps(NOTIFICATIONS)
|
|
||||||
|
|
||||||
export default function NotificationPage ({ data: { notifications: { notifications, cursor, lastChecked } } }) {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<Notifications
|
|
||||||
notifications={notifications} cursor={cursor}
|
|
||||||
lastChecked={lastChecked}
|
|
||||||
/>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
5
pages/notifications/[filter].js
Normal file
5
pages/notifications/[filter].js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import NotificationPage, { getServerSideProps as getSSProps } from './index'
|
||||||
|
|
||||||
|
export const getServerSideProps = getSSProps
|
||||||
|
|
||||||
|
export default NotificationPage
|
55
pages/notifications/index.js
Normal file
55
pages/notifications/index.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import { Nav, Navbar } from 'react-bootstrap'
|
||||||
|
import { getGetServerSideProps } from '../../api/ssrApollo'
|
||||||
|
import Layout from '../../components/layout'
|
||||||
|
import Notifications from '../../components/notifications'
|
||||||
|
import { NOTIFICATIONS } from '../../fragments/notifications'
|
||||||
|
import styles from '../../components/header.module.css'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
export const getServerSideProps = getGetServerSideProps(NOTIFICATIONS)
|
||||||
|
|
||||||
|
export default function NotificationPage ({ data: { notifications: { notifications, cursor, lastChecked } } }) {
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<NotificationHeader />
|
||||||
|
<Notifications
|
||||||
|
notifications={notifications} cursor={cursor}
|
||||||
|
lastChecked={lastChecked} variables={{ filter: router.query?.filter }}
|
||||||
|
/>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function NotificationHeader () {
|
||||||
|
const router = useRouter()
|
||||||
|
return (
|
||||||
|
<Navbar className='pt-0'>
|
||||||
|
<Nav
|
||||||
|
className={`${styles.navbarNav} justify-content-around`}
|
||||||
|
activeKey={router.asPath}
|
||||||
|
>
|
||||||
|
<Nav.Item>
|
||||||
|
<Link href='/notifications' passHref>
|
||||||
|
<Nav.Link
|
||||||
|
className={styles.navLink}
|
||||||
|
>
|
||||||
|
all
|
||||||
|
</Nav.Link>
|
||||||
|
</Link>
|
||||||
|
</Nav.Item>
|
||||||
|
<Nav.Item>
|
||||||
|
<Link href='/notifications/replies' passHref>
|
||||||
|
<Nav.Link
|
||||||
|
className={styles.navLink}
|
||||||
|
>
|
||||||
|
replies
|
||||||
|
</Nav.Link>
|
||||||
|
</Link>
|
||||||
|
</Nav.Item>
|
||||||
|
</Nav>
|
||||||
|
</Navbar>
|
||||||
|
)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user