top cowboys
This commit is contained in:
parent
a5b2de64d3
commit
97f74da0fd
@ -90,6 +90,20 @@ export default {
|
|||||||
|
|
||||||
return user.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } }))
|
return user.name?.toUpperCase() === name?.toUpperCase() || !(await models.user.findUnique({ where: { name } }))
|
||||||
},
|
},
|
||||||
|
topCowboys: async (parent, { cursor }, { models, me }) => {
|
||||||
|
const decodedCursor = decodeCursor(cursor)
|
||||||
|
const users = await models.$queryRaw(`
|
||||||
|
SELECT users.*
|
||||||
|
FROM users
|
||||||
|
WHERE NOT "hideFromTopUsers" AND streak IS NOT NULL
|
||||||
|
ORDER BY streak DESC, created_at ASC
|
||||||
|
OFFSET $1
|
||||||
|
LIMIT ${LIMIT}`, decodedCursor.offset)
|
||||||
|
return {
|
||||||
|
cursor: users.length === LIMIT ? nextCursorEncoded(decodedCursor) : null,
|
||||||
|
users
|
||||||
|
}
|
||||||
|
},
|
||||||
topUsers: async (parent, { cursor, when, sort }, { models, me }) => {
|
topUsers: async (parent, { cursor, when, sort }, { models, me }) => {
|
||||||
const decodedCursor = decodeCursor(cursor)
|
const decodedCursor = decodeCursor(cursor)
|
||||||
let users
|
let users
|
||||||
@ -151,7 +165,7 @@ export default {
|
|||||||
LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset)
|
LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset)
|
||||||
} else {
|
} else {
|
||||||
users = await models.$queryRaw(`
|
users = await models.$queryRaw(`
|
||||||
SELECT u.id, u.name, u."photoId", floor(sum(amount)/1000) as stacked
|
SELECT u.id, u.name, u.streak, u."photoId", floor(sum(amount)/1000) as stacked
|
||||||
FROM
|
FROM
|
||||||
((SELECT users.*, "ItemAct".msats as amount
|
((SELECT users.*, "ItemAct".msats as amount
|
||||||
FROM "ItemAct"
|
FROM "ItemAct"
|
||||||
@ -172,7 +186,7 @@ export default {
|
|||||||
JOIN users on users.id = "ReferralAct"."referrerId"
|
JOIN users on users.id = "ReferralAct"."referrerId"
|
||||||
WHERE "ReferralAct".msats > 0 ${within('ReferralAct', when)}
|
WHERE "ReferralAct".msats > 0 ${within('ReferralAct', when)}
|
||||||
AND NOT users."hideFromTopUsers")) u
|
AND NOT users."hideFromTopUsers")) u
|
||||||
GROUP BY u.id, u.name, u.created_at, u."photoId"
|
GROUP BY u.id, u.name, u.created_at, u."photoId", u.streak
|
||||||
ORDER BY stacked DESC NULLS LAST, created_at DESC
|
ORDER BY stacked DESC NULLS LAST, created_at DESC
|
||||||
OFFSET $2
|
OFFSET $2
|
||||||
LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset)
|
LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset)
|
||||||
|
@ -8,6 +8,7 @@ export default gql`
|
|||||||
users: [User!]
|
users: [User!]
|
||||||
nameAvailable(name: String!): Boolean!
|
nameAvailable(name: String!): Boolean!
|
||||||
topUsers(cursor: String, when: String, sort: String): Users
|
topUsers(cursor: String, when: String, sort: String): Users
|
||||||
|
topCowboys(cursor: String): Users
|
||||||
searchUsers(q: String!, limit: Int, similarity: Float): [User!]!
|
searchUsers(q: String!, limit: Int, similarity: Float): [User!]!
|
||||||
hasNewNotes: Boolean!
|
hasNewNotes: Boolean!
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,13 @@ export default function TopHeader ({ cat }) {
|
|||||||
const top = async values => {
|
const top = async values => {
|
||||||
const { what, when, ...query } = values
|
const { what, when, ...query } = values
|
||||||
|
|
||||||
|
if (what === 'cowboys') {
|
||||||
|
await router.push({
|
||||||
|
pathname: `/top/${what}`
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof query.sort !== 'undefined') {
|
if (typeof query.sort !== 'undefined') {
|
||||||
if (query.sort === '' ||
|
if (query.sort === '' ||
|
||||||
(what === 'users' && !USER_SORTS.includes(query.sort)) ||
|
(what === 'users' && !USER_SORTS.includes(query.sort)) ||
|
||||||
@ -19,7 +26,7 @@ export default function TopHeader ({ cat }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await router.push({
|
await router.push({
|
||||||
pathname: `/top/${what}/${when}`,
|
pathname: `/top/${what}/${when || 'day'}`,
|
||||||
query
|
query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -42,8 +49,10 @@ export default function TopHeader ({ cat }) {
|
|||||||
onChange={(formik, e) => top({ ...formik?.values, what: e.target.value })}
|
onChange={(formik, e) => top({ ...formik?.values, what: e.target.value })}
|
||||||
name='what'
|
name='what'
|
||||||
size='sm'
|
size='sm'
|
||||||
items={['posts', 'comments', 'users']}
|
items={['posts', 'comments', 'users', 'cowboys']}
|
||||||
/>
|
/>
|
||||||
|
{cat !== 'cowboys' &&
|
||||||
|
<>
|
||||||
by
|
by
|
||||||
<Select
|
<Select
|
||||||
groupClassName='mx-2 mb-0'
|
groupClassName='mx-2 mb-0'
|
||||||
@ -60,6 +69,8 @@ export default function TopHeader ({ cat }) {
|
|||||||
size='sm'
|
size='sm'
|
||||||
items={['day', 'week', 'month', 'year', 'forever']}
|
items={['day', 'week', 'month', 'year', 'forever']}
|
||||||
/>
|
/>
|
||||||
|
</>}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</Form>
|
</Form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -151,6 +151,24 @@ export const TOP_USERS = gql`
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
export const TOP_COWBOYS = gql`
|
||||||
|
query TopCowboys($cursor: String) {
|
||||||
|
topCowboys(cursor: $cursor) {
|
||||||
|
users {
|
||||||
|
name
|
||||||
|
streak
|
||||||
|
photoId
|
||||||
|
stacked(when: "forever")
|
||||||
|
spent(when: "forever")
|
||||||
|
ncomments(when: "forever")
|
||||||
|
nitems(when: "forever")
|
||||||
|
referrals(when: "forever")
|
||||||
|
}
|
||||||
|
cursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
export const USER_FULL = gql`
|
export const USER_FULL = gql`
|
||||||
${USER_FIELDS}
|
${USER_FIELDS}
|
||||||
${ITEM_WITH_COMMENTS}
|
${ITEM_WITH_COMMENTS}
|
||||||
|
@ -49,6 +49,19 @@ function getClient (uri) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
topCowboys: {
|
||||||
|
keyArgs: [],
|
||||||
|
merge (existing, incoming) {
|
||||||
|
if (isFirstPage(incoming.cursor, existing?.users)) {
|
||||||
|
return incoming
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
cursor: incoming.cursor,
|
||||||
|
users: [...(existing?.users || []), ...incoming.users]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
items: {
|
items: {
|
||||||
keyArgs: ['sub', 'sort', 'type', 'name', 'within'],
|
keyArgs: ['sub', 'sort', 'type', 'name', 'within'],
|
||||||
merge (existing, incoming) {
|
merge (existing, incoming) {
|
||||||
|
25
pages/top/cowboys.js
Normal file
25
pages/top/cowboys.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import Layout from '../../components/layout'
|
||||||
|
import { getGetServerSideProps } from '../../api/ssrApollo'
|
||||||
|
import TopHeader from '../../components/top-header'
|
||||||
|
import { TOP_COWBOYS } from '../../fragments/users'
|
||||||
|
import { useQuery } from '@apollo/client'
|
||||||
|
import MoreFooter from '../../components/more-footer'
|
||||||
|
import UserList, { UsersSkeleton } from '../../components/user-list'
|
||||||
|
|
||||||
|
export const getServerSideProps = getGetServerSideProps(TOP_COWBOYS)
|
||||||
|
|
||||||
|
export default function Index ({ data: { topCowboys: { users, cursor } } }) {
|
||||||
|
const { data, fetchMore } = useQuery(TOP_COWBOYS)
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
({ topCowboys: { users, cursor } } = data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<TopHeader cat='cowboys' />
|
||||||
|
<UserList users={users} />
|
||||||
|
<MoreFooter cursor={cursor} fetchMore={fetchMore} Skeleton={UsersSkeleton} />
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user