Skip to content

Commit 0983198

Browse files
committed
Packages are separated from Track and are cached
1 parent e0ffd3c commit 0983198

5 files changed

+97
-94
lines changed

src/add-package-to-track.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export default function AddCommand({
2424
name: trackingForm.name,
2525
trackingNumber: trackingForm.trackingNumber,
2626
carrier: trackingForm.carrier,
27-
packages: [],
2827
};
2928
await setTracking((tracking || []).concat(track));
3029

src/package.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ interface Activity {
44
location: string;
55
}
66

7-
interface Package {
7+
export interface Package {
88
deliveryDate?: Date;
99
delivered: boolean;
1010
activity: Activity[];
1111
}
12-
13-
export default Package;

src/tempData.ts

+65-64
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,105 @@
11
import { Track } from "./track";
2+
import { Package } from "./package";
23

3-
const tracks: Track[] = [
4+
export const debugTracks: Track[] = [
45
{
56
id: "E2836A4F-8BC9-463D-A703-EDFF8D1580D9",
67
name: "undelivered package that is estimated ahead",
78
trackingNumber: "1Zasdf",
89
carrier: "UPS",
9-
packages: [
10-
{
11-
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 4 days ahead
12-
delivered: false,
13-
activity: [],
14-
},
15-
],
1610
},
1711
{
1812
id: "E04FEF49-47DD-4D67-A60B-5D9CC6F78C1E",
1913
name: "delivery date in the past that was delivered",
2014
trackingNumber: "92462346326",
2115
carrier: "FedEx",
22-
packages: [
23-
{
24-
deliveryDate: new Date("2024-11-09"),
25-
delivered: true,
26-
activity: [],
27-
},
28-
],
2916
},
3017
{
3118
id: "D9A04926-2A37-40C1-B2C5-DB2E1924F0A8",
3219
name: "delivery today that is undelivered",
3320
trackingNumber: "156845865089045685454467",
3421
carrier: "USPS",
35-
packages: [
36-
{
37-
deliveryDate: new Date(),
38-
delivered: false,
39-
activity: [],
40-
},
41-
],
4222
},
4323
{
4424
id: "195A6D9E-81BC-4CEC-97B7-DB5D5A96E8BC",
4525
name: "delivery that is unknown",
4626
trackingNumber: "934724536784235786435786",
4727
carrier: "USPS",
48-
packages: [
49-
{
50-
deliveryDate: undefined,
51-
delivered: false,
52-
activity: [],
53-
},
54-
],
5528
},
5629
{
5730
id: "13DCF84F-EEE5-4827-AD08-4C0F336E87BB",
5831
name: "partially delivered",
5932
trackingNumber: "1Zdflgjadlhjfgasdfasdf",
6033
carrier: "UPS",
61-
packages: [
62-
{
63-
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 4 days ahead
64-
delivered: false,
65-
activity: [],
66-
},
67-
{
68-
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 2 days ahead
69-
delivered: false,
70-
activity: [],
71-
},
72-
{
73-
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 1 days ahead
74-
delivered: true,
75-
activity: [],
76-
},
77-
],
7834
},
7935
{
8036
id: "CF022134-EEE4-4AA1-BD74-64BF36B465FD",
8137
name: "partially delivered, with unknown delivery dates",
8238
trackingNumber: "134578458906534",
8339
carrier: "FedEx",
84-
packages: [
85-
{
86-
deliveryDate: undefined,
87-
delivered: false,
88-
activity: [],
89-
},
90-
{
91-
deliveryDate: undefined,
92-
delivered: true,
93-
activity: [],
94-
},
95-
{
96-
deliveryDate: undefined,
97-
delivered: false,
98-
activity: [],
99-
},
100-
],
10140
},
10241
];
10342

104-
export default tracks;
43+
export const debugPackages = new Map<string, Package[]>();
44+
debugPackages.set(debugTracks[0].id, [
45+
{
46+
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 4 days ahead
47+
delivered: false,
48+
activity: [],
49+
},
50+
]);
51+
debugPackages.set(debugTracks[1].id, [
52+
{
53+
deliveryDate: new Date("2024-11-09"),
54+
delivered: true,
55+
activity: [],
56+
},
57+
]);
58+
debugPackages.set(debugTracks[2].id, [
59+
{
60+
deliveryDate: new Date(),
61+
delivered: false,
62+
activity: [],
63+
},
64+
]);
65+
debugPackages.set(debugTracks[3].id, [
66+
{
67+
deliveryDate: undefined,
68+
delivered: false,
69+
activity: [],
70+
},
71+
]);
72+
debugPackages.set(debugTracks[4].id, [
73+
{
74+
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 4 days ahead
75+
delivered: false,
76+
activity: [],
77+
},
78+
{
79+
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 2 days ahead
80+
delivered: false,
81+
activity: [],
82+
},
83+
{
84+
deliveryDate: new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 4), // 1 days ahead
85+
delivered: true,
86+
activity: [],
87+
},
88+
]);
89+
debugPackages.set(debugTracks[5].id, [
90+
{
91+
deliveryDate: undefined,
92+
delivered: false,
93+
activity: [],
94+
},
95+
{
96+
deliveryDate: undefined,
97+
delivered: true,
98+
activity: [],
99+
},
100+
{
101+
deliveryDate: undefined,
102+
delivered: false,
103+
activity: [],
104+
},
105+
]);

src/track-packages.tsx

+31-23
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,36 @@ import {
1212
confirmAlert,
1313
Alert,
1414
} from "@raycast/api";
15-
import tempData from "./tempData";
15+
import { debugTracks, debugPackages } from "./tempData";
1616
import providers from "./providers";
17-
import Package from "./package";
17+
import { Package } from "./package";
1818
import { Track } from "./track";
1919
import AddCommand from "./add-package-to-track";
20-
import { useLocalStorage } from "@raycast/utils";
20+
import { useCachedState, useLocalStorage } from "@raycast/utils";
2121

2222
export default function TrackCommand() {
2323
const {
2424
value: tracking,
2525
setValue: setTracking,
2626
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+
);
2833

2934
return (
3035
<List isLoading={isLoading}>
31-
{tracking?.map((item) => (
36+
{sortTracking(tracking ?? [], packages).map((item) => (
3237
<List.Item
3338
key={item.id}
3439
id={item.id.toString()}
35-
icon={deliveryIcon(item.packages)}
40+
icon={deliveryIcon(packages.get(item.id))}
3641
title={item.name}
3742
subtitle={item.trackingNumber}
3843
accessories={[
39-
{ text: deliveryAccessory(item.packages) },
44+
{ text: deliveryAccessory(packages.get(item.id)) },
4045
{ text: { value: item.carrier, color: providers.get(item.carrier)?.color } },
4146
]}
4247
actions={
@@ -103,21 +108,24 @@ async function deleteTracking(
103108
});
104109
}
105110

106-
function sortTracking(tracks: Track[]): Track[] {
111+
function sortTracking(tracks: Track[], packages: Map<string, Package[]>): Track[] {
107112
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) {
109117
// a has packages, and b doesn't
110118
return -1;
111-
} else if (aTrack.packages.length == 0 && bTrack.packages.length > 0) {
119+
} else if (aPackages.length == 0 && bPackages.length > 0) {
112120
// a doesn't have any packages, and b does
113121
return 1;
114-
} else if (aTrack.packages.length == 0 && bTrack.packages.length == 0) {
122+
} else if (aPackages.length == 0 && bPackages.length == 0) {
115123
//a doesn't have any packages, and b doesn't either
116124
return 0;
117125
}
118126

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);
121129

122130
if (aAllPackagesDelivered && !bAllPackagesDelivered) {
123131
// a has all packages delivered, and b doesn't
@@ -127,8 +135,8 @@ function sortTracking(tracks: Track[]): Track[] {
127135
return 1;
128136
}
129137

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;
132140

133141
if (aEarliestDeliveryDate && !bEarliestDeliveryDate) {
134142
// a has a delivery date, and b doesn't
@@ -139,8 +147,8 @@ function sortTracking(tracks: Track[]): Track[] {
139147
} else if (!aEarliestDeliveryDate && !bEarliestDeliveryDate) {
140148
// a doesn't have a delivery date, and b doesn't either
141149

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);
144152

145153
if (aSomePackagesDelivered && !bSomePackagesDelivered) {
146154
// a has some packages delivered, and b doesn't
@@ -159,8 +167,8 @@ function sortTracking(tracks: Track[]): Track[] {
159167
if (dayDifferenceDifference == 0) {
160168
// both tracks tie for earliest delivery
161169

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);
164172

165173
if (aSomePackagesDelivered && !bSomePackagesDelivered) {
166174
// a has some packages delivered, and b doesn't
@@ -178,8 +186,8 @@ function sortTracking(tracks: Track[]): Track[] {
178186
});
179187
}
180188

181-
function deliveryIcon(packages: Package[]): Icon {
182-
if (packages.length == 0) {
189+
function deliveryIcon(packages?: Package[]): Icon {
190+
if (!packages || packages.length == 0) {
183191
// there are no packages for this tracking, possible before data has been gotten from API
184192
return Icon.QuestionMarkCircle;
185193
}
@@ -199,10 +207,10 @@ function deliveryIcon(packages: Package[]): Icon {
199207
return Icon.CircleProgress;
200208
}
201209

202-
function deliveryAccessory(packages: Package[]): { value: string; color?: Color } {
210+
function deliveryAccessory(packages?: Package[]): { value: string; color?: Color } {
203211
// check whether all, some, or no packages in a track are delivered
204212

205-
if (packages.length == 0) {
213+
if (!packages || packages.length == 0) {
206214
return {
207215
value: "No packages",
208216
color: Color.Orange,

src/track.ts

-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import Package from "./package";
2-
31
export interface Track {
42
id: string;
53
name: string;
64
trackingNumber: string;
75
carrier: string;
8-
packages: Package[];
96
}

0 commit comments

Comments
 (0)