From 17735744f80a3b2bbdda4139784d009c0e80df38 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Thu, 8 Jun 2023 14:56:56 +0800 Subject: [PATCH] Call bulk actions API --- .../templates/homeFeed/HomeFeedContainer.tsx | 38 ++++++++++++++++--- .../mutations/bulkActionMutation.ts | 23 ++++++----- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx index 3b9b3be41..56e5270c4 100644 --- a/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx +++ b/packages/web/components/templates/homeFeed/HomeFeedContainer.tsx @@ -44,6 +44,7 @@ import { LibraryHeader, MultiSelectMode } from './LibraryHeader' import { UploadModal } from '../UploadModal' import { BulkAction } from '../../../lib/networking/mutations/bulkActionMutation' import { bulkActionMutation } from '../../../lib/networking/mutations/bulkActionMutation' +import { showErrorToast, showSuccessToast } from '../../../lib/toastHelpers' export type LayoutType = 'LIST_LAYOUT' | 'GRID_LAYOUT' export type LibraryMode = 'reads' | 'highlights' @@ -349,7 +350,7 @@ export function HomeFeedContainer(): JSX.Element { if (activeItem) { if (multiSelectMode === 'off') { console.log('setting ') - setMultiSelectMode('none') + setMultiSelectMode('some') } const itemId = activeItem.node.id const isChecked = itemIsChecked(itemId) @@ -608,6 +609,12 @@ export function HomeFeedContainer(): JSX.Element { const performMultiSelectAction = useCallback( (action: BulkAction) => { + if (multiSelectMode === 'off') { + return + } + if (multiSelectMode !== 'search' && checkedItems.length < 1) { + return + } console.log( 'performing bulk action: ', action, @@ -615,12 +622,31 @@ export function HomeFeedContainer(): JSX.Element { multiSelectMode, checkedItems ) - try { - // const query = multiSelectMode === 'some' ? - // const res = await bulkActionMutation(action, query) - } catch (err) {} + ;(async () => { + const query = + multiSelectMode === 'some' + ? `includes:${checkedItems.join(',')}` + : queryInputs.searchQuery || 'in:inbox' + try { + const res = await bulkActionMutation(action, query) + if (res) { + switch (action) { + case BulkAction.ARCHIVE: + showSuccessToast('Items archived') + break + case BulkAction.DELETE: + showSuccessToast('Items deleted') + break + } + } else { + showErrorToast('Error performing bulk action') + } + } catch (err) { + showErrorToast('Error performing bulk action') + } + })() }, - [checkedItems] + [multiSelectMode, checkedItems] ) return ( diff --git a/packages/web/lib/networking/mutations/bulkActionMutation.ts b/packages/web/lib/networking/mutations/bulkActionMutation.ts index 935e5a8e6..df76ab6a8 100644 --- a/packages/web/lib/networking/mutations/bulkActionMutation.ts +++ b/packages/web/lib/networking/mutations/bulkActionMutation.ts @@ -15,24 +15,27 @@ type BulkActionResponse = { bulkAction?: BulkActionResponseData } -export async function bulkActionMutation(action: BulkAction): Promise { +export async function bulkActionMutation( + action: BulkAction, + query: string +): Promise { const mutation = gql` - mutation { - bulkAction (action: ${action}) { - ... on BulkActionSuccess { - success - } - ... on BulkActionError { - errorCodes + mutation { + bulkAction(action: $action, query: $query) { + ... on BulkActionSuccess { + success + } + ... on BulkActionError { + errorCodes + } } } - } ` console.log('bulkActionbulkActionMutation', mutation) try { - const response = await gqlFetcher(mutation, { action }) + const response = await gqlFetcher(mutation, { action, query }) console.log('response', response) const data = response as BulkActionResponse | undefined return data?.bulkAction?.success ?? false