snl live banner
This commit is contained in:
parent
59ee15b551
commit
747371a4e4
|
@ -0,0 +1,18 @@
|
|||
export default {
|
||||
Query: {
|
||||
snl: async (parent, _, { models }) => {
|
||||
const { live } = await models.snl.findFirst()
|
||||
return live
|
||||
}
|
||||
},
|
||||
Mutation: {
|
||||
onAirToggle: async (parent, _, { models, me }) => {
|
||||
if (me.id !== 616) {
|
||||
throw new Error('not an admin')
|
||||
}
|
||||
const { id, live } = await models.snl.findFirst()
|
||||
await models.snl.update({ where: { id }, data: { live: !live } })
|
||||
return !live
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,6 +13,7 @@ import rewards from './rewards'
|
|||
import referrals from './referrals'
|
||||
import price from './price'
|
||||
import { GraphQLJSONObject } from 'graphql-type-json'
|
||||
import admin from './admin'
|
||||
|
||||
export default [user, item, message, wallet, lnurl, notifications, invite, sub,
|
||||
upload, search, growth, rewards, referrals, price, { JSONObject: GraphQLJSONObject }]
|
||||
upload, search, growth, rewards, referrals, price, admin, { JSONObject: GraphQLJSONObject }]
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
import { gql } from 'apollo-server-micro'
|
||||
|
||||
export default gql`
|
||||
extend type Query {
|
||||
snl: Boolean!
|
||||
}
|
||||
|
||||
extend type Mutation {
|
||||
onAirToggle: Boolean!
|
||||
}
|
||||
`
|
|
@ -13,6 +13,7 @@ import growth from './growth'
|
|||
import rewards from './rewards'
|
||||
import referrals from './referrals'
|
||||
import price from './price'
|
||||
import admin from './admin'
|
||||
|
||||
const link = gql`
|
||||
type Query {
|
||||
|
@ -29,4 +30,4 @@ const link = gql`
|
|||
`
|
||||
|
||||
export default [link, user, item, message, wallet, lnurl, notifications, invite,
|
||||
sub, upload, growth, rewards, referrals, price]
|
||||
sub, upload, growth, rewards, referrals, price, admin]
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
import { Alert } from 'react-bootstrap'
|
||||
import YouTube from '../svgs/youtube-line.svg'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { gql, useQuery } from '@apollo/client'
|
||||
|
||||
export default function Snl () {
|
||||
const [show, setShow] = useState()
|
||||
const { data } = useQuery(gql`{ snl }`, {
|
||||
fetchPolicy: 'cache-and-network'
|
||||
})
|
||||
|
||||
useEffect(() => {
|
||||
const dismissed = localStorage.getItem('snl')
|
||||
if (dismissed && dismissed > new Date(dismissed) < new Date(new Date().setDate(new Date().getDate() - 6))) {
|
||||
return
|
||||
}
|
||||
|
||||
if (data?.snl) {
|
||||
setShow(true)
|
||||
}
|
||||
}, [data])
|
||||
|
||||
if (!show) return null
|
||||
|
||||
return (
|
||||
<div className='d-flex'>
|
||||
<Alert
|
||||
variant='info' className='font-weight-bold mb-3 d-flex py-2 flex-shrink align-items-center'
|
||||
onClose={() => {
|
||||
setShow(undefined)
|
||||
localStorage.setItem('snl', new Date())
|
||||
}}
|
||||
dismissible
|
||||
>
|
||||
<a href='https://www.youtube.com/@stackernews/live'>
|
||||
<YouTube width={24} height={24} className='mr-2 fill-info' />Stacker News Live is streaming this week's top stories
|
||||
</a>
|
||||
</Alert>
|
||||
</div>
|
||||
)
|
||||
}
|
|
@ -2,12 +2,14 @@ import Layout from '../components/layout'
|
|||
import Items from '../components/items'
|
||||
import { getGetServerSideProps } from '../api/ssrApollo'
|
||||
import { ITEMS } from '../fragments/items'
|
||||
import Snl from '../components/snl'
|
||||
|
||||
export const getServerSideProps = getGetServerSideProps(ITEMS)
|
||||
|
||||
export default function Index ({ data: { items: { items, pins, cursor } } }) {
|
||||
return (
|
||||
<Layout>
|
||||
<Snl />
|
||||
<Items
|
||||
items={items} pins={pins} cursor={cursor}
|
||||
rank
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
import { Button } from 'react-bootstrap'
|
||||
import LayoutCenter from '../components/layout-center'
|
||||
import Snl from '../components/snl'
|
||||
import { gql } from 'apollo-server-micro'
|
||||
import { useMutation, useQuery } from '@apollo/client'
|
||||
|
||||
export default function Index () {
|
||||
const [toggle] = useMutation(
|
||||
gql`
|
||||
mutation onAirToggle {
|
||||
onAirToggle
|
||||
}`, {
|
||||
update (cache, { data: { onAirToggle } }) {
|
||||
cache.modify({
|
||||
id: 'ROOT_QUERY',
|
||||
fields: {
|
||||
snl: () => onAirToggle
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const { data } = useQuery(gql`{ snl }`, {
|
||||
fetchPolicy: 'cache-only'
|
||||
})
|
||||
|
||||
return (
|
||||
<LayoutCenter>
|
||||
<Snl />
|
||||
<Button variant={data?.snl ? 'primary' : 'danger'} onClick={toggle}>go: {data?.snl ? 'off' : 'on'} air</Button>
|
||||
</LayoutCenter>
|
||||
)
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
-- CreateTable
|
||||
CREATE TABLE "Snl" (
|
||||
"id" SERIAL NOT NULL,
|
||||
"live" BOOLEAN NOT NULL DEFAULT false,
|
||||
|
||||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
INSERT INTO "Snl" ("live") VALUES (false);
|
||||
INSERT INTO "users" ("name") VALUES ('live');
|
|
@ -10,6 +10,11 @@ generator client {
|
|||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
model Snl {
|
||||
id Int @id @default(autoincrement())
|
||||
live Boolean @default(false)
|
||||
}
|
||||
|
||||
model User {
|
||||
id Int @id @default(autoincrement())
|
||||
createdAt DateTime @default(now()) @map(name: "created_at")
|
||||
|
@ -86,7 +91,7 @@ model User {
|
|||
greeterMode Boolean @default(false)
|
||||
|
||||
Earn Earn[]
|
||||
Upload Upload[] @relation(name: "Uploads")
|
||||
Upload Upload[] @relation(name: "Uploads")
|
||||
PollVote PollVote[]
|
||||
Donation Donation[]
|
||||
ReferralAct ReferralAct[]
|
||||
|
@ -301,11 +306,11 @@ model Item {
|
|||
// fields for polls
|
||||
pollCost Int?
|
||||
|
||||
User User[]
|
||||
PollOption PollOption[]
|
||||
PollVote PollVote[]
|
||||
Bookmark Bookmark[]
|
||||
ThreadSubscription ThreadSubscription[]
|
||||
User User[]
|
||||
PollOption PollOption[]
|
||||
PollVote PollVote[]
|
||||
Bookmark Bookmark[]
|
||||
ThreadSubscription ThreadSubscription[]
|
||||
|
||||
@@index([weightedVotes])
|
||||
@@index([weightedDownVotes])
|
||||
|
@ -573,4 +578,4 @@ model ThreadSubscription {
|
|||
|
||||
@@id([userId, itemId])
|
||||
@@index([createdAt])
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.6069 6.99482C19.5307 6.69695 19.3152 6.47221 19.0684 6.40288C18.6299 6.28062 16.501 6 12.001 6C7.50098 6 5.37252 6.28073 4.93225 6.40323C4.68776 6.47123 4.4723 6.69593 4.3951 6.99482C4.2863 7.41923 4.00098 9.19595 4.00098 12C4.00098 14.804 4.2863 16.5808 4.3954 17.0064C4.47126 17.3031 4.68676 17.5278 4.93251 17.5968C5.37252 17.7193 7.50098 18 12.001 18C16.501 18 18.6299 17.7194 19.0697 17.5968C19.3142 17.5288 19.5297 17.3041 19.6069 17.0052C19.7157 16.5808 20.001 14.8 20.001 12C20.001 9.2 19.7157 7.41923 19.6069 6.99482ZM21.5442 6.49818C22.001 8.28 22.001 12 22.001 12C22.001 12 22.001 15.72 21.5442 17.5018C21.2897 18.4873 20.547 19.2618 19.6056 19.5236C17.8971 20 12.001 20 12.001 20C12.001 20 6.10837 20 4.39637 19.5236C3.45146 19.2582 2.70879 18.4836 2.45774 17.5018C2.00098 15.72 2.00098 12 2.00098 12C2.00098 12 2.00098 8.28 2.45774 6.49818C2.71227 5.51273 3.45495 4.73818 4.39637 4.47636C6.10837 4 12.001 4 12.001 4C12.001 4 17.8971 4 19.6056 4.47636C20.5505 4.74182 21.2932 5.51636 21.5442 6.49818ZM10.001 15.5V8.5L16.001 12L10.001 15.5Z"></path></svg>
|
After Width: | Height: | Size: 1.1 KiB |
Loading…
Reference in New Issue