@@ -7,7 +7,7 @@ import { FRAGMENT_ITEM_PREVIEW } from '../_fragments/preview'
7
7
import { FRAGMENT_ITEM_SAVED_INFO } from '../_fragments/saved-info'
8
8
9
9
// Types
10
- import type { ResponseError } from '@common/types'
10
+ import type { ResponseError , ExcludesFalse } from '@common/types'
11
11
import type {
12
12
Item ,
13
13
PageInfo ,
@@ -37,6 +37,12 @@ interface UserSavesArguments {
37
37
filter ?: SavedItemsFilter
38
38
}
39
39
40
+ type SavedData = Omit < SavedItem , 'item' >
41
+ type ConvertedEdge = {
42
+ preview : PocketMetadata & { itemId : string }
43
+ savedData : SavedData
44
+ }
45
+
40
46
const getUserSavesQuery = gql `
41
47
query UserSaves($pagination: PaginationInput, $sort: SavedItemsSort, $filter: SavedItemsFilter) {
42
48
user {
@@ -96,32 +102,45 @@ export async function getUserSaves(
96
102
97
103
const { edges, pageInfo, totalCount } = savedItems
98
104
99
- const convertedEdges = edges
100
- ?. map ( ( edge ) => {
105
+ // If there are no edges for some reason, let's just assume no items
106
+ if ( ! edges ) {
107
+ return {
108
+ itemsById : { } ,
109
+ saveDataById : { } ,
110
+ savePageIds : [ ] ,
111
+ savePageInfo : { ...pageInfo , totalCount : 0 }
112
+ }
113
+ }
114
+
115
+ // Let's run a quick consolidation so it's easier to normalize the data
116
+ const convertedEdges : ConvertedEdge [ ] = edges
117
+ . map ( ( edge ) => {
101
118
const { item, ...savedData } = edge ?. node || { }
102
119
103
120
// We are gonna filter pending items out
104
- // ?? NOTE: Pending item was a future pattern to separate parser response
105
- // ?? from metadata. As it stands, this is not fully implemented, but we
106
- // ?? will still handle this case for type safety
107
121
if ( item ?. __typename === 'PendingItem' ) return false
108
122
109
- const { preview, itemId, shareId } = item as Item
110
- return { preview : { ...preview , itemId } , savedData }
123
+ const { preview, itemId } = item as Item
124
+ return { preview : { ...preview , itemId } , savedData } as ConvertedEdge
111
125
} )
112
- . filter ( Boolean )
126
+ . filter ( Boolean as unknown as ExcludesFalse )
127
+
128
+ // If something went wrong, let's abandon ship
129
+ if ( ! convertedEdges ?. length ) throw new PageSavesError ( 'Malformed Edges' )
113
130
114
131
const itemsById = convertedEdges . reduce ( ( previous , current ) => {
115
- const { preview, saveData } = current
132
+ const { preview } = current as ConvertedEdge
116
133
return { ...previous , [ preview . itemId ] : preview }
117
134
} , { } )
118
135
119
136
const saveDataById = convertedEdges . reduce ( ( previous , current ) => {
120
- const { preview, saveData } = current
121
- return { ...previous , [ preview . itemId ] : saveData }
137
+ const { preview, savedData } = current
138
+ return { ...previous , [ preview . itemId ] : savedData }
122
139
} , { } )
123
140
124
- const savePageIds = edges . map ( ( edge ) => edge ?. node ?. item ?. itemId )
141
+ const savePageIds = edges
142
+ . map ( ( edge ) => edge ?. node ?. item ?. itemId ?? false )
143
+ . filter ( Boolean as unknown as ExcludesFalse )
125
144
126
145
return {
127
146
itemsById,
0 commit comments