@@ -12,31 +12,36 @@ import {
12
12
confirmAlert ,
13
13
Alert ,
14
14
} from "@raycast/api" ;
15
- import tempData from "./tempData" ;
15
+ import { debugTracks , debugPackages } from "./tempData" ;
16
16
import providers from "./providers" ;
17
- import Package from "./package" ;
17
+ import { Package } from "./package" ;
18
18
import { Track } from "./track" ;
19
19
import AddCommand from "./add-package-to-track" ;
20
- import { useLocalStorage } from "@raycast/utils" ;
20
+ import { useCachedState , useLocalStorage } from "@raycast/utils" ;
21
21
22
22
export default function TrackCommand ( ) {
23
23
const {
24
24
value : tracking ,
25
25
setValue : setTracking ,
26
26
isLoading,
27
- } = useLocalStorage < Track [ ] > ( "tracking" , environment . isDevelopment ? sortTracking ( tempData ) : [ ] ) ;
27
+ } = useLocalStorage < Track [ ] > ( "tracking" , environment . isDevelopment ? debugTracks : [ ] ) ;
28
+
29
+ const [ packages ] = useCachedState < Map < string , Package [ ] > > (
30
+ "packages" ,
31
+ environment . isDevelopment ? debugPackages : new Map < string , Package [ ] > ( ) ,
32
+ ) ;
28
33
29
34
return (
30
35
< List isLoading = { isLoading } >
31
- { tracking ? .map ( ( item ) => (
36
+ { sortTracking ( tracking ?? [ ] , packages ) . map ( ( item ) => (
32
37
< List . Item
33
38
key = { item . id }
34
39
id = { item . id . toString ( ) }
35
- icon = { deliveryIcon ( item . packages ) }
40
+ icon = { deliveryIcon ( packages . get ( item . id ) ) }
36
41
title = { item . name }
37
42
subtitle = { item . trackingNumber }
38
43
accessories = { [
39
- { text : deliveryAccessory ( item . packages ) } ,
44
+ { text : deliveryAccessory ( packages . get ( item . id ) ) } ,
40
45
{ text : { value : item . carrier , color : providers . get ( item . carrier ) ?. color } } ,
41
46
] }
42
47
actions = {
@@ -103,21 +108,24 @@ async function deleteTracking(
103
108
} ) ;
104
109
}
105
110
106
- function sortTracking ( tracks : Track [ ] ) : Track [ ] {
111
+ function sortTracking ( tracks : Track [ ] , packages : Map < string , Package [ ] > ) : Track [ ] {
107
112
return tracks . toSorted ( ( aTrack , bTrack ) => {
108
- if ( aTrack . packages . length > 0 && bTrack . packages . length == 0 ) {
113
+ const aPackages = packages . get ( aTrack . id ) ?? [ ] ;
114
+ const bPackages = packages . get ( bTrack . id ) ?? [ ] ;
115
+
116
+ if ( aPackages . length > 0 && bPackages . length == 0 ) {
109
117
// a has packages, and b doesn't
110
118
return - 1 ;
111
- } else if ( aTrack . packages . length == 0 && bTrack . packages . length > 0 ) {
119
+ } else if ( aPackages . length == 0 && bPackages . length > 0 ) {
112
120
// a doesn't have any packages, and b does
113
121
return 1 ;
114
- } else if ( aTrack . packages . length == 0 && bTrack . packages . length == 0 ) {
122
+ } else if ( aPackages . length == 0 && bPackages . length == 0 ) {
115
123
//a doesn't have any packages, and b doesn't either
116
124
return 0 ;
117
125
}
118
126
119
- const aAllPackagesDelivered = aTrack . packages . every ( ( aPackage ) => aPackage . delivered ) ;
120
- const bAllPackagesDelivered = bTrack . packages . every ( ( bPackage ) => bPackage . delivered ) ;
127
+ const aAllPackagesDelivered = aPackages . every ( ( aPackage ) => aPackage . delivered ) ;
128
+ const bAllPackagesDelivered = bPackages . every ( ( bPackage ) => bPackage . delivered ) ;
121
129
122
130
if ( aAllPackagesDelivered && ! bAllPackagesDelivered ) {
123
131
// a has all packages delivered, and b doesn't
@@ -127,8 +135,8 @@ function sortTracking(tracks: Track[]): Track[] {
127
135
return 1 ;
128
136
}
129
137
130
- const aEarliestDeliveryDate = getPackageWithEarliestDeliveryDate ( aTrack . packages ) . deliveryDate ;
131
- const bEarliestDeliveryDate = getPackageWithEarliestDeliveryDate ( bTrack . packages ) . deliveryDate ;
138
+ const aEarliestDeliveryDate = getPackageWithEarliestDeliveryDate ( aPackages ) . deliveryDate ;
139
+ const bEarliestDeliveryDate = getPackageWithEarliestDeliveryDate ( bPackages ) . deliveryDate ;
132
140
133
141
if ( aEarliestDeliveryDate && ! bEarliestDeliveryDate ) {
134
142
// a has a delivery date, and b doesn't
@@ -139,8 +147,8 @@ function sortTracking(tracks: Track[]): Track[] {
139
147
} else if ( ! aEarliestDeliveryDate && ! bEarliestDeliveryDate ) {
140
148
// a doesn't have a delivery date, and b doesn't either
141
149
142
- const aSomePackagesDelivered = aTrack . packages . some ( ( aPackage ) => aPackage . delivered ) ;
143
- const bSomePackagesDelivered = bTrack . packages . some ( ( bPackage ) => bPackage . delivered ) ;
150
+ const aSomePackagesDelivered = aPackages . some ( ( aPackage ) => aPackage . delivered ) ;
151
+ const bSomePackagesDelivered = bPackages . some ( ( bPackage ) => bPackage . delivered ) ;
144
152
145
153
if ( aSomePackagesDelivered && ! bSomePackagesDelivered ) {
146
154
// a has some packages delivered, and b doesn't
@@ -159,8 +167,8 @@ function sortTracking(tracks: Track[]): Track[] {
159
167
if ( dayDifferenceDifference == 0 ) {
160
168
// both tracks tie for earliest delivery
161
169
162
- const aSomePackagesDelivered = aTrack . packages . some ( ( aPackage ) => aPackage . delivered ) ;
163
- const bSomePackagesDelivered = bTrack . packages . some ( ( bPackage ) => bPackage . delivered ) ;
170
+ const aSomePackagesDelivered = aPackages . some ( ( aPackage ) => aPackage . delivered ) ;
171
+ const bSomePackagesDelivered = bPackages . some ( ( bPackage ) => bPackage . delivered ) ;
164
172
165
173
if ( aSomePackagesDelivered && ! bSomePackagesDelivered ) {
166
174
// a has some packages delivered, and b doesn't
@@ -178,8 +186,8 @@ function sortTracking(tracks: Track[]): Track[] {
178
186
} ) ;
179
187
}
180
188
181
- function deliveryIcon ( packages : Package [ ] ) : Icon {
182
- if ( packages . length == 0 ) {
189
+ function deliveryIcon ( packages ? : Package [ ] ) : Icon {
190
+ if ( ! packages || packages . length == 0 ) {
183
191
// there are no packages for this tracking, possible before data has been gotten from API
184
192
return Icon . QuestionMarkCircle ;
185
193
}
@@ -199,10 +207,10 @@ function deliveryIcon(packages: Package[]): Icon {
199
207
return Icon . CircleProgress ;
200
208
}
201
209
202
- function deliveryAccessory ( packages : Package [ ] ) : { value : string ; color ?: Color } {
210
+ function deliveryAccessory ( packages ? : Package [ ] ) : { value : string ; color ?: Color } {
203
211
// check whether all, some, or no packages in a track are delivered
204
212
205
- if ( packages . length == 0 ) {
213
+ if ( ! packages || packages . length == 0 ) {
206
214
return {
207
215
value : "No packages" ,
208
216
color : Color . Orange ,
0 commit comments