* Prototype of toast system * More toast adoption * share * flag * bookmark * subscribe * delete * More toast usage: * forms * settings save * Log error during flag failure * Incorporate PR feedback: 1. return `toaster` from `useToast` hook, with simplified `success` and `danger` methods 2. remove toast header, move close button to body 3. change how toast ids are generated to use a global incrementing int 4. update toast messages * PR feedback: * reduce width of toast on narrow screens * dynamic delete success toast message based on deleted type * add toasts to auth methods deletion operations * Dismiss all toasts upon page navigation * refine style and use delay prop * more styling --------- Co-authored-by: Keyan <34140557+huumn@users.noreply.github.com> Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
		
			
				
	
	
		
			41 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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 SubscribeDropdownItem ({ item: { id, meSubscription } }) {
 | |
|   const toaster = useToast()
 | |
|   const [subscribeItem] = useMutation(
 | |
|     gql`
 | |
|       mutation subscribeItem($id: ID!) {
 | |
|         subscribeItem(id: $id) {
 | |
|           meSubscription
 | |
|         }
 | |
|       }`, {
 | |
|       update (cache, { data: { subscribeItem } }) {
 | |
|         cache.modify({
 | |
|           id: `Item:${id}`,
 | |
|           fields: {
 | |
|             meSubscription: () => subscribeItem.meSubscription
 | |
|           }
 | |
|         })
 | |
|       }
 | |
|     }
 | |
|   )
 | |
|   return (
 | |
|     <Dropdown.Item
 | |
|       onClick={async () => {
 | |
|         try {
 | |
|           await subscribeItem({ 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>
 | |
|   )
 | |
| }
 |