stacker.news/components/subscribeUser.js
SatsAllDay 0d4a225442
Subscribe to a user (#443)
* First pass of user subscriptions

* add new db model to track subscriptions
* update user typedef and api resolver for subscription state
* add subscribe action to user profile page
* add mutation to subscribe to a user

* Update notifications queries, hasNewNotes queries for FollowActivity note type

* Only show items that have been created since subscribing to the user

* Send push notifications to user subscribers for posts and comments

* Rename item dropdown to action dropdown and re-use for item info and user actions

* Don't allow self-follows

* Add index on followee for faster lookups

* Don't show subscribe action if not logged in

* small style enhance

---------

Co-authored-by: Keyan <34140557+huumn@users.noreply.github.com>
Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
2023-08-28 20:27:56 -05:00

41 lines
1.1 KiB
JavaScript

import { useMutation } from '@apollo/client'
import { gql } from 'graphql-tag'
import Dropdown from 'react-bootstrap/Dropdown'
import { useToast } from './toast'
export default function SubscribeUserDropdownItem ({ user: { id, meSubscription } }) {
const toaster = useToast()
const [subscribeUser] = useMutation(
gql`
mutation subscribeUser($id: ID!) {
subscribeUser(id: $id) {
meSubscription
}
}`, {
update (cache, { data: { subscribeUser } }) {
cache.modify({
id: `User:${id}`,
fields: {
meSubscription: () => subscribeUser.meSubscription
}
})
}
}
)
return (
<Dropdown.Item
onClick={async () => {
try {
await subscribeUser({ variables: { id } })
toaster.success(meSubscription ? 'unsubscribed' : 'subscribed')
} catch (err) {
console.error(err)
toaster.danger(meSubscription ? 'failed to unsubscribe' : 'failed to subscribe')
}
}}
>
{meSubscription ? 'remove subscription' : 'subscribe'}
</Dropdown.Item>
)
}