@adventurelabs/scout-core 1.4.40 → 1.4.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +1 -0
- package/dist/helpers/observations.d.ts +9 -0
- package/dist/helpers/observations.js +73 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useInfiniteQuery.d.ts +8 -1
- package/dist/hooks/useInfiniteQuery.js +143 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/providers/ScoutRefreshProvider.d.ts +139 -0
- package/dist/store/api.d.ts +45 -132
- package/dist/store/api.js +28 -8
- package/dist/store/configureStore.d.ts +8 -48
- package/dist/types/db.d.ts +3 -0
- package/dist/types/supabase.d.ts +139 -0
- package/package.json +1 -1
package/dist/helpers/index.d.ts
CHANGED
package/dist/helpers/index.js
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Database } from "../types/supabase";
|
|
2
|
+
import { IObservation, ObservationInsert, ObservationUpdate } from "../types/db";
|
|
3
|
+
import { IWebResponseCompatible } from "../types/requests";
|
|
4
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
5
|
+
export declare function get_observations_for_session(client: SupabaseClient<Database>, session_id: number): Promise<IWebResponseCompatible<IObservation[]>>;
|
|
6
|
+
export declare function get_observation_by_id(client: SupabaseClient<Database>, observation_id: number): Promise<IWebResponseCompatible<IObservation | null>>;
|
|
7
|
+
export declare function create_observation(client: SupabaseClient<Database>, row: ObservationInsert): Promise<IWebResponseCompatible<IObservation | null>>;
|
|
8
|
+
export declare function update_observation(client: SupabaseClient<Database>, observation_id: number, patch: ObservationUpdate): Promise<IWebResponseCompatible<IObservation | null>>;
|
|
9
|
+
export declare function delete_observation(client: SupabaseClient<Database>, observation_id: number): Promise<IWebResponseCompatible<IObservation | null>>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { IWebResponse } from "../types/requests";
|
|
2
|
+
export async function get_observations_for_session(client, session_id) {
|
|
3
|
+
const { data, error } = await client
|
|
4
|
+
.from("observations")
|
|
5
|
+
.select("*")
|
|
6
|
+
.eq("session_id", session_id)
|
|
7
|
+
.order("inserted_at", { ascending: false });
|
|
8
|
+
if (error) {
|
|
9
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
10
|
+
}
|
|
11
|
+
return IWebResponse.success(data ?? []).to_compatible();
|
|
12
|
+
}
|
|
13
|
+
export async function get_observation_by_id(client, observation_id) {
|
|
14
|
+
const { data, error } = await client
|
|
15
|
+
.from("observations")
|
|
16
|
+
.select("*")
|
|
17
|
+
.eq("id", observation_id)
|
|
18
|
+
.single();
|
|
19
|
+
if (error) {
|
|
20
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
21
|
+
}
|
|
22
|
+
if (!data) {
|
|
23
|
+
return IWebResponse.error("Observation not found").to_compatible();
|
|
24
|
+
}
|
|
25
|
+
return IWebResponse.success(data).to_compatible();
|
|
26
|
+
}
|
|
27
|
+
export async function create_observation(client, row) {
|
|
28
|
+
const { data, error } = await client
|
|
29
|
+
.from("observations")
|
|
30
|
+
.insert([row])
|
|
31
|
+
.select("*")
|
|
32
|
+
.single();
|
|
33
|
+
if (error) {
|
|
34
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
35
|
+
}
|
|
36
|
+
if (!data) {
|
|
37
|
+
return IWebResponse.error("Failed to create observation").to_compatible();
|
|
38
|
+
}
|
|
39
|
+
return IWebResponse.success(data).to_compatible();
|
|
40
|
+
}
|
|
41
|
+
export async function update_observation(client, observation_id, patch) {
|
|
42
|
+
const updateData = { ...patch };
|
|
43
|
+
delete updateData.id;
|
|
44
|
+
delete updateData.inserted_at;
|
|
45
|
+
const { data, error } = await client
|
|
46
|
+
.from("observations")
|
|
47
|
+
.update(updateData)
|
|
48
|
+
.eq("id", observation_id)
|
|
49
|
+
.select("*")
|
|
50
|
+
.single();
|
|
51
|
+
if (error) {
|
|
52
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
53
|
+
}
|
|
54
|
+
if (!data) {
|
|
55
|
+
return IWebResponse.error("Observation not found or update failed").to_compatible();
|
|
56
|
+
}
|
|
57
|
+
return IWebResponse.success(data).to_compatible();
|
|
58
|
+
}
|
|
59
|
+
export async function delete_observation(client, observation_id) {
|
|
60
|
+
const { data, error } = await client
|
|
61
|
+
.from("observations")
|
|
62
|
+
.delete()
|
|
63
|
+
.eq("id", observation_id)
|
|
64
|
+
.select("*")
|
|
65
|
+
.single();
|
|
66
|
+
if (error) {
|
|
67
|
+
return IWebResponse.error(error.message).to_compatible();
|
|
68
|
+
}
|
|
69
|
+
if (!data) {
|
|
70
|
+
return IWebResponse.error("Observation not found or deletion failed").to_compatible();
|
|
71
|
+
}
|
|
72
|
+
return IWebResponse.success(data).to_compatible();
|
|
73
|
+
}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -8,5 +8,5 @@ export { useScoutRealtimeSessions } from "./useScoutRealtimeSessions";
|
|
|
8
8
|
export { useScoutRealtimePlans } from "./useScoutRealtimePlans";
|
|
9
9
|
export { useScoutRealtimePins } from "./useScoutRealtimePins";
|
|
10
10
|
export { useScoutRealtimeParts } from "./useScoutRealtimeParts";
|
|
11
|
-
export { useInfiniteSessionsByHerd, useInfiniteSessionsByDevice, useInfiniteEventsByHerd, useInfiniteEventsByDevice, useInfiniteArtifactsByHerd, useInfiniteArtifactsByDevice, useIntersectionObserver, } from "./useInfiniteQuery";
|
|
11
|
+
export { useInfiniteSessionsByHerd, useInfiniteSessionsByDevice, useInfiniteEventsByHerd, useInfiniteEventsByDevice, useInfiniteArtifactsByHerd, useInfiniteArtifactsByDevice, useInfiniteFeedByHerd, useInfiniteFeedByDevice, useIntersectionObserver, type UseInfiniteScrollOptions, } from "./useInfiniteQuery";
|
|
12
12
|
export { useLoadingPerformance, useSessionSummariesByHerd, useHasSessionSummaries, } from "../store/hooks";
|
package/dist/hooks/index.js
CHANGED
|
@@ -9,6 +9,6 @@ export { useScoutRealtimePlans } from "./useScoutRealtimePlans";
|
|
|
9
9
|
export { useScoutRealtimePins } from "./useScoutRealtimePins";
|
|
10
10
|
export { useScoutRealtimeParts } from "./useScoutRealtimeParts";
|
|
11
11
|
// RTK Query infinite scroll hooks
|
|
12
|
-
export { useInfiniteSessionsByHerd, useInfiniteSessionsByDevice, useInfiniteEventsByHerd, useInfiniteEventsByDevice, useInfiniteArtifactsByHerd, useInfiniteArtifactsByDevice, useIntersectionObserver, } from "./useInfiniteQuery";
|
|
12
|
+
export { useInfiniteSessionsByHerd, useInfiniteSessionsByDevice, useInfiniteEventsByHerd, useInfiniteEventsByDevice, useInfiniteArtifactsByHerd, useInfiniteArtifactsByDevice, useInfiniteFeedByHerd, useInfiniteFeedByDevice, useIntersectionObserver, } from "./useInfiniteQuery";
|
|
13
13
|
// Session summaries and performance hooks
|
|
14
14
|
export { useLoadingPerformance, useSessionSummariesByHerd, useHasSessionSummaries, } from "../store/hooks";
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { SupabaseClient } from "@supabase/supabase-js";
|
|
2
2
|
import { IArtifactWithMediaUrl, ISessionWithCoordinates, IEventAndTagsPrettyLocation, IFeedItem } from "../types/db";
|
|
3
|
-
interface UseInfiniteScrollOptions {
|
|
3
|
+
export interface UseInfiniteScrollOptions {
|
|
4
4
|
limit?: number;
|
|
5
5
|
enabled?: boolean;
|
|
6
6
|
supabase: SupabaseClient;
|
|
7
|
+
/** Inclusive time window in iso format */
|
|
8
|
+
rangeStart?: string | null;
|
|
9
|
+
rangeEnd?: string | null;
|
|
10
|
+
/** [Sessions only] minimum flight duration in minutez */
|
|
11
|
+
minFlightTimeMinutes?: number | null;
|
|
12
|
+
/** [Sessions only] minimum distance_total in meterz */
|
|
13
|
+
minFlightDistanceMeters?: number | null;
|
|
7
14
|
}
|
|
8
15
|
interface InfiniteScrollData<T> {
|
|
9
16
|
items: T[];
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { useState, useCallback, useMemo, useEffect, useRef } from "react";
|
|
2
2
|
import { useGetSessionsInfiniteByHerdQuery, useGetSessionsInfiniteByDeviceQuery, useGetEventsInfiniteByHerdQuery, useGetEventsInfiniteByDeviceQuery, useGetArtifactsInfiniteByHerdQuery, useGetArtifactsInfiniteByDeviceQuery, useGetFeedInfiniteByHerdQuery, useGetFeedInfiniteByDeviceQuery, } from "../store/api";
|
|
3
|
+
function useInfiniteFiltersKey(options) {
|
|
4
|
+
return useMemo(() => JSON.stringify({
|
|
5
|
+
rangeStart: options.rangeStart ?? null,
|
|
6
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
7
|
+
minFlightTimeMinutes: options.minFlightTimeMinutes ?? null,
|
|
8
|
+
minFlightDistanceMeters: options.minFlightDistanceMeters ?? null,
|
|
9
|
+
}), [
|
|
10
|
+
options.rangeStart,
|
|
11
|
+
options.rangeEnd,
|
|
12
|
+
options.minFlightTimeMinutes,
|
|
13
|
+
options.minFlightDistanceMeters,
|
|
14
|
+
]);
|
|
15
|
+
}
|
|
3
16
|
// =====================================================
|
|
4
17
|
// SESSIONS INFINITE SCROLL HOOKS
|
|
5
18
|
// =====================================================
|
|
@@ -7,11 +20,17 @@ export const useInfiniteSessionsByHerd = (herdId, options) => {
|
|
|
7
20
|
const [pages, setPages] = useState([]);
|
|
8
21
|
const [currentCursor, setCurrentCursor] = useState(null);
|
|
9
22
|
const prevHerdIdRef = useRef();
|
|
23
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
24
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
10
25
|
const currentQuery = useGetSessionsInfiniteByHerdQuery({
|
|
11
26
|
herdId,
|
|
12
27
|
limit: options.limit || 20,
|
|
13
28
|
cursor: currentCursor,
|
|
14
29
|
supabase: options.supabase,
|
|
30
|
+
rangeStart: options.rangeStart ?? null,
|
|
31
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
32
|
+
minFlightTimeMinutes: options.minFlightTimeMinutes ?? null,
|
|
33
|
+
minFlightDistanceMeters: options.minFlightDistanceMeters ?? null,
|
|
15
34
|
}, {
|
|
16
35
|
skip: !options.enabled || !herdId,
|
|
17
36
|
});
|
|
@@ -26,6 +45,17 @@ export const useInfiniteSessionsByHerd = (herdId, options) => {
|
|
|
26
45
|
}
|
|
27
46
|
prevHerdIdRef.current = herdId;
|
|
28
47
|
}, [herdId, options.enabled]);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
50
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
54
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
55
|
+
setPages([]);
|
|
56
|
+
setCurrentCursor(null);
|
|
57
|
+
}
|
|
58
|
+
}, [infiniteFiltersKey]);
|
|
29
59
|
// Update pages when new data arrives
|
|
30
60
|
useEffect(() => {
|
|
31
61
|
if (currentQuery.data && !currentQuery.isLoading) {
|
|
@@ -75,11 +105,17 @@ export const useInfiniteSessionsByDevice = (deviceId, options) => {
|
|
|
75
105
|
const [pages, setPages] = useState([]);
|
|
76
106
|
const [currentCursor, setCurrentCursor] = useState(null);
|
|
77
107
|
const prevDeviceIdRef = useRef();
|
|
108
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
109
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
78
110
|
const currentQuery = useGetSessionsInfiniteByDeviceQuery({
|
|
79
111
|
deviceId,
|
|
80
112
|
limit: options.limit || 20,
|
|
81
113
|
cursor: currentCursor,
|
|
82
114
|
supabase: options.supabase,
|
|
115
|
+
rangeStart: options.rangeStart ?? null,
|
|
116
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
117
|
+
minFlightTimeMinutes: options.minFlightTimeMinutes ?? null,
|
|
118
|
+
minFlightDistanceMeters: options.minFlightDistanceMeters ?? null,
|
|
83
119
|
}, {
|
|
84
120
|
skip: !options.enabled || !deviceId,
|
|
85
121
|
});
|
|
@@ -94,6 +130,17 @@ export const useInfiniteSessionsByDevice = (deviceId, options) => {
|
|
|
94
130
|
}
|
|
95
131
|
prevDeviceIdRef.current = deviceId;
|
|
96
132
|
}, [deviceId, options.enabled]);
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
135
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
139
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
140
|
+
setPages([]);
|
|
141
|
+
setCurrentCursor(null);
|
|
142
|
+
}
|
|
143
|
+
}, [infiniteFiltersKey]);
|
|
97
144
|
useEffect(() => {
|
|
98
145
|
if (currentQuery.data && !currentQuery.isLoading) {
|
|
99
146
|
setPages((prev) => {
|
|
@@ -144,11 +191,15 @@ export const useInfiniteEventsByHerd = (herdId, options) => {
|
|
|
144
191
|
const [pages, setPages] = useState([]);
|
|
145
192
|
const [currentCursor, setCurrentCursor] = useState(null);
|
|
146
193
|
const prevHerdIdRef = useRef();
|
|
194
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
195
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
147
196
|
const currentQuery = useGetEventsInfiniteByHerdQuery({
|
|
148
197
|
herdId,
|
|
149
198
|
limit: options.limit || 20,
|
|
150
199
|
cursor: currentCursor,
|
|
151
200
|
supabase: options.supabase,
|
|
201
|
+
rangeStart: options.rangeStart ?? null,
|
|
202
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
152
203
|
}, {
|
|
153
204
|
skip: !options.enabled || !herdId,
|
|
154
205
|
});
|
|
@@ -163,6 +214,17 @@ export const useInfiniteEventsByHerd = (herdId, options) => {
|
|
|
163
214
|
}
|
|
164
215
|
prevHerdIdRef.current = herdId;
|
|
165
216
|
}, [herdId, options.enabled]);
|
|
217
|
+
useEffect(() => {
|
|
218
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
219
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
223
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
224
|
+
setPages([]);
|
|
225
|
+
setCurrentCursor(null);
|
|
226
|
+
}
|
|
227
|
+
}, [infiniteFiltersKey]);
|
|
166
228
|
useEffect(() => {
|
|
167
229
|
if (currentQuery.data && !currentQuery.isLoading) {
|
|
168
230
|
setPages((prev) => {
|
|
@@ -210,11 +272,15 @@ export const useInfiniteEventsByDevice = (deviceId, options) => {
|
|
|
210
272
|
const [pages, setPages] = useState([]);
|
|
211
273
|
const [currentCursor, setCurrentCursor] = useState(null);
|
|
212
274
|
const prevDeviceIdRef = useRef();
|
|
275
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
276
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
213
277
|
const currentQuery = useGetEventsInfiniteByDeviceQuery({
|
|
214
278
|
deviceId,
|
|
215
279
|
limit: options.limit || 20,
|
|
216
280
|
cursor: currentCursor,
|
|
217
281
|
supabase: options.supabase,
|
|
282
|
+
rangeStart: options.rangeStart ?? null,
|
|
283
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
218
284
|
}, {
|
|
219
285
|
skip: !options.enabled || !deviceId,
|
|
220
286
|
});
|
|
@@ -229,6 +295,17 @@ export const useInfiniteEventsByDevice = (deviceId, options) => {
|
|
|
229
295
|
}
|
|
230
296
|
prevDeviceIdRef.current = deviceId;
|
|
231
297
|
}, [deviceId, options.enabled]);
|
|
298
|
+
useEffect(() => {
|
|
299
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
300
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
304
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
305
|
+
setPages([]);
|
|
306
|
+
setCurrentCursor(null);
|
|
307
|
+
}
|
|
308
|
+
}, [infiniteFiltersKey]);
|
|
232
309
|
useEffect(() => {
|
|
233
310
|
if (currentQuery.data && !currentQuery.isLoading) {
|
|
234
311
|
setPages((prev) => {
|
|
@@ -279,11 +356,15 @@ export const useInfiniteArtifactsByHerd = (herdId, options) => {
|
|
|
279
356
|
const [pages, setPages] = useState([]);
|
|
280
357
|
const [currentCursor, setCurrentCursor] = useState(null);
|
|
281
358
|
const prevHerdIdRef = useRef();
|
|
359
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
360
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
282
361
|
const currentQuery = useGetArtifactsInfiniteByHerdQuery({
|
|
283
362
|
herdId,
|
|
284
363
|
limit: options.limit || 20,
|
|
285
364
|
cursor: currentCursor,
|
|
286
365
|
supabase: options.supabase,
|
|
366
|
+
rangeStart: options.rangeStart ?? null,
|
|
367
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
287
368
|
}, {
|
|
288
369
|
skip: !options.enabled || !herdId,
|
|
289
370
|
});
|
|
@@ -298,6 +379,17 @@ export const useInfiniteArtifactsByHerd = (herdId, options) => {
|
|
|
298
379
|
}
|
|
299
380
|
prevHerdIdRef.current = herdId;
|
|
300
381
|
}, [herdId, options.enabled]);
|
|
382
|
+
useEffect(() => {
|
|
383
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
384
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
388
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
389
|
+
setPages([]);
|
|
390
|
+
setCurrentCursor(null);
|
|
391
|
+
}
|
|
392
|
+
}, [infiniteFiltersKey]);
|
|
301
393
|
useEffect(() => {
|
|
302
394
|
if (currentQuery.data && !currentQuery.isLoading) {
|
|
303
395
|
setPages((prev) => {
|
|
@@ -345,11 +437,15 @@ export const useInfiniteArtifactsByDevice = (deviceId, options) => {
|
|
|
345
437
|
const [pages, setPages] = useState([]);
|
|
346
438
|
const [currentCursor, setCurrentCursor] = useState(null);
|
|
347
439
|
const prevDeviceIdRef = useRef();
|
|
440
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
441
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
348
442
|
const currentQuery = useGetArtifactsInfiniteByDeviceQuery({
|
|
349
443
|
deviceId,
|
|
350
444
|
limit: options.limit || 20,
|
|
351
445
|
cursor: currentCursor,
|
|
352
446
|
supabase: options.supabase,
|
|
447
|
+
rangeStart: options.rangeStart ?? null,
|
|
448
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
353
449
|
}, {
|
|
354
450
|
skip: !options.enabled || !deviceId,
|
|
355
451
|
});
|
|
@@ -364,6 +460,17 @@ export const useInfiniteArtifactsByDevice = (deviceId, options) => {
|
|
|
364
460
|
}
|
|
365
461
|
prevDeviceIdRef.current = deviceId;
|
|
366
462
|
}, [deviceId, options.enabled]);
|
|
463
|
+
useEffect(() => {
|
|
464
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
465
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
469
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
470
|
+
setPages([]);
|
|
471
|
+
setCurrentCursor(null);
|
|
472
|
+
}
|
|
473
|
+
}, [infiniteFiltersKey]);
|
|
367
474
|
useEffect(() => {
|
|
368
475
|
if (currentQuery.data && !currentQuery.isLoading) {
|
|
369
476
|
setPages((prev) => {
|
|
@@ -428,12 +535,16 @@ export const useInfiniteFeedByHerd = (herdId, options) => {
|
|
|
428
535
|
const pagesLengthRef = useRef(0);
|
|
429
536
|
/** When true, pass null to the query so we don't request (newHerdId, oldCursor) before state commits. */
|
|
430
537
|
const forceNullCursorRef = useRef(false);
|
|
538
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
539
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
431
540
|
const cursorForQuery = forceNullCursorRef.current ? null : currentCursor;
|
|
432
541
|
const currentQuery = useGetFeedInfiniteByHerdQuery({
|
|
433
542
|
herdId,
|
|
434
543
|
limit,
|
|
435
544
|
cursor: cursorForQuery,
|
|
436
545
|
supabase: options.supabase,
|
|
546
|
+
rangeStart: options.rangeStart ?? null,
|
|
547
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
437
548
|
}, { skip: !enabled });
|
|
438
549
|
const isLoading = currentQuery.isLoading;
|
|
439
550
|
useEffect(() => {
|
|
@@ -453,6 +564,20 @@ export const useInfiniteFeedByHerd = (herdId, options) => {
|
|
|
453
564
|
}
|
|
454
565
|
prevHerdIdRef.current = herdId;
|
|
455
566
|
}, [herdId, enabled]);
|
|
567
|
+
useEffect(() => {
|
|
568
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
569
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
573
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
574
|
+
forceNullCursorRef.current = true;
|
|
575
|
+
setPages([]);
|
|
576
|
+
setCurrentCursor(null);
|
|
577
|
+
setCurrentResult(null);
|
|
578
|
+
lastAddedCursorRef.current = undefined;
|
|
579
|
+
}
|
|
580
|
+
}, [infiniteFiltersKey]);
|
|
456
581
|
// When cursor changes, clear ref so we merge the new response
|
|
457
582
|
useEffect(() => {
|
|
458
583
|
lastAddedCursorRef.current = undefined;
|
|
@@ -572,12 +697,16 @@ export const useInfiniteFeedByDevice = (deviceId, options) => {
|
|
|
572
697
|
const lastAddedCursorRef = useRef(undefined);
|
|
573
698
|
const pagesLengthRef = useRef(0);
|
|
574
699
|
const forceNullCursorRef = useRef(false);
|
|
700
|
+
const infiniteFiltersKey = useInfiniteFiltersKey(options);
|
|
701
|
+
const prevInfiniteFiltersKeyRef = useRef(null);
|
|
575
702
|
const cursorForQuery = forceNullCursorRef.current ? null : currentCursor;
|
|
576
703
|
const currentQuery = useGetFeedInfiniteByDeviceQuery({
|
|
577
704
|
deviceId,
|
|
578
705
|
limit: options.limit || 20,
|
|
579
706
|
cursor: cursorForQuery,
|
|
580
707
|
supabase: options.supabase,
|
|
708
|
+
rangeStart: options.rangeStart ?? null,
|
|
709
|
+
rangeEnd: options.rangeEnd ?? null,
|
|
581
710
|
}, { skip: !options.enabled || !deviceId });
|
|
582
711
|
useEffect(() => {
|
|
583
712
|
pagesLengthRef.current = pages.length;
|
|
@@ -594,6 +723,20 @@ export const useInfiniteFeedByDevice = (deviceId, options) => {
|
|
|
594
723
|
}
|
|
595
724
|
prevDeviceIdRef.current = deviceId;
|
|
596
725
|
}, [deviceId]);
|
|
726
|
+
useEffect(() => {
|
|
727
|
+
if (prevInfiniteFiltersKeyRef.current === null) {
|
|
728
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
if (prevInfiniteFiltersKeyRef.current !== infiniteFiltersKey) {
|
|
732
|
+
prevInfiniteFiltersKeyRef.current = infiniteFiltersKey;
|
|
733
|
+
forceNullCursorRef.current = true;
|
|
734
|
+
setPages([]);
|
|
735
|
+
setCurrentCursor(null);
|
|
736
|
+
lastAddedCursorRef.current = undefined;
|
|
737
|
+
setLastResult(null);
|
|
738
|
+
}
|
|
739
|
+
}, [infiniteFiltersKey]);
|
|
597
740
|
// When we request a new page (cursor changed), clear ref so we merge the new response
|
|
598
741
|
useEffect(() => {
|
|
599
742
|
lastAddedCursorRef.current = undefined;
|
package/dist/index.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ export * from "./helpers/cache";
|
|
|
39
39
|
export * from "./helpers/health_metrics";
|
|
40
40
|
export * from "./helpers/heartbeats";
|
|
41
41
|
export * from "./helpers/providers";
|
|
42
|
+
export * from "./helpers/observations";
|
|
42
43
|
export * from "./helpers/operators";
|
|
43
44
|
export * from "./helpers/versions_software";
|
|
44
45
|
export * from "./helpers/versions_software_server";
|
|
@@ -62,5 +63,5 @@ export * from "./supabase/middleware";
|
|
|
62
63
|
export * from "./supabase/server";
|
|
63
64
|
export * from "./api_keys/actions";
|
|
64
65
|
export type { HerdModule, IHerdModule } from "./types/herd_module";
|
|
65
|
-
export type { IDevice, IEvent, IUser, IHerd, IHerdPrettyLocation, IEventWithTags, IZoneWithActions, IUserAndRole, IApiKeyScout, ILayer, IHeartbeat, IProvider, IConnectivity, ISession, ISessionWithCoordinates, IConnectivityWithCoordinates, } from "./types/db";
|
|
66
|
+
export type { IDevice, IEvent, IUser, IHerd, IHerdPrettyLocation, IEventWithTags, IZoneWithActions, IUserAndRole, IApiKeyScout, ILayer, IHeartbeat, IProvider, IConnectivity, ISession, ISessionWithCoordinates, IConnectivityWithCoordinates, IObservation, ObservationInsert, ObservationUpdate, } from "./types/db";
|
|
66
67
|
export { EnumSessionsVisibility } from "./types/events";
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,7 @@ export * from "./helpers/cache";
|
|
|
42
42
|
export * from "./helpers/health_metrics";
|
|
43
43
|
export * from "./helpers/heartbeats";
|
|
44
44
|
export * from "./helpers/providers";
|
|
45
|
+
export * from "./helpers/observations";
|
|
45
46
|
export * from "./helpers/operators";
|
|
46
47
|
export * from "./helpers/versions_software";
|
|
47
48
|
export * from "./helpers/versions_software_server";
|
|
@@ -703,6 +703,7 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
703
703
|
id: number;
|
|
704
704
|
inserted_at: string;
|
|
705
705
|
session_id: number;
|
|
706
|
+
timestamp: string | null;
|
|
706
707
|
updated_at: string | null;
|
|
707
708
|
};
|
|
708
709
|
Insert: {
|
|
@@ -712,6 +713,7 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
712
713
|
id?: number;
|
|
713
714
|
inserted_at?: string;
|
|
714
715
|
session_id: number;
|
|
716
|
+
timestamp?: string | null;
|
|
715
717
|
updated_at?: string | null;
|
|
716
718
|
};
|
|
717
719
|
Update: {
|
|
@@ -721,6 +723,7 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
721
723
|
id?: number;
|
|
722
724
|
inserted_at?: string;
|
|
723
725
|
session_id?: number;
|
|
726
|
+
timestamp?: string | null;
|
|
724
727
|
updated_at?: string | null;
|
|
725
728
|
};
|
|
726
729
|
Relationships: [{
|
|
@@ -1727,6 +1730,37 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
1727
1730
|
isOneToOne: false;
|
|
1728
1731
|
isSetofReturn: true;
|
|
1729
1732
|
};
|
|
1733
|
+
} | {
|
|
1734
|
+
Args: {
|
|
1735
|
+
cursor_id?: number;
|
|
1736
|
+
cursor_timestamp?: string;
|
|
1737
|
+
device_id_caller: number;
|
|
1738
|
+
limit_caller?: number;
|
|
1739
|
+
range_end?: string;
|
|
1740
|
+
range_start?: string;
|
|
1741
|
+
};
|
|
1742
|
+
Returns: {
|
|
1743
|
+
created_at: string;
|
|
1744
|
+
device_id: number;
|
|
1745
|
+
embedded_at: string | null;
|
|
1746
|
+
file_path: string;
|
|
1747
|
+
file_size_bytes: number | null;
|
|
1748
|
+
id: number;
|
|
1749
|
+
modality: string | null;
|
|
1750
|
+
segmented_at: string | null;
|
|
1751
|
+
session_id: number | null;
|
|
1752
|
+
tagged_at: string | null;
|
|
1753
|
+
timestamp_observation: string | null;
|
|
1754
|
+
timestamp_observation_end: string;
|
|
1755
|
+
tracked_at: string | null;
|
|
1756
|
+
updated_at: string | null;
|
|
1757
|
+
}[];
|
|
1758
|
+
SetofOptions: {
|
|
1759
|
+
from: "*";
|
|
1760
|
+
to: "artifacts";
|
|
1761
|
+
isOneToOne: false;
|
|
1762
|
+
isSetofReturn: true;
|
|
1763
|
+
};
|
|
1730
1764
|
};
|
|
1731
1765
|
get_artifacts_infinite_by_herd: {
|
|
1732
1766
|
Args: {
|
|
@@ -1757,6 +1791,37 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
1757
1791
|
isOneToOne: false;
|
|
1758
1792
|
isSetofReturn: true;
|
|
1759
1793
|
};
|
|
1794
|
+
} | {
|
|
1795
|
+
Args: {
|
|
1796
|
+
cursor_id?: number;
|
|
1797
|
+
cursor_timestamp?: string;
|
|
1798
|
+
herd_id_caller: number;
|
|
1799
|
+
limit_caller?: number;
|
|
1800
|
+
range_end?: string;
|
|
1801
|
+
range_start?: string;
|
|
1802
|
+
};
|
|
1803
|
+
Returns: {
|
|
1804
|
+
created_at: string;
|
|
1805
|
+
device_id: number;
|
|
1806
|
+
embedded_at: string | null;
|
|
1807
|
+
file_path: string;
|
|
1808
|
+
file_size_bytes: number | null;
|
|
1809
|
+
id: number;
|
|
1810
|
+
modality: string | null;
|
|
1811
|
+
segmented_at: string | null;
|
|
1812
|
+
session_id: number | null;
|
|
1813
|
+
tagged_at: string | null;
|
|
1814
|
+
timestamp_observation: string | null;
|
|
1815
|
+
timestamp_observation_end: string;
|
|
1816
|
+
tracked_at: string | null;
|
|
1817
|
+
updated_at: string | null;
|
|
1818
|
+
}[];
|
|
1819
|
+
SetofOptions: {
|
|
1820
|
+
from: "*";
|
|
1821
|
+
to: "artifacts";
|
|
1822
|
+
isOneToOne: false;
|
|
1823
|
+
isSetofReturn: true;
|
|
1824
|
+
};
|
|
1760
1825
|
};
|
|
1761
1826
|
get_connectivity_for_artifact: {
|
|
1762
1827
|
Args: {
|
|
@@ -1964,6 +2029,22 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
1964
2029
|
isOneToOne: false;
|
|
1965
2030
|
isSetofReturn: true;
|
|
1966
2031
|
};
|
|
2032
|
+
} | {
|
|
2033
|
+
Args: {
|
|
2034
|
+
cursor_id?: number;
|
|
2035
|
+
cursor_timestamp?: string;
|
|
2036
|
+
device_id_caller: number;
|
|
2037
|
+
limit_caller?: number;
|
|
2038
|
+
range_end?: string;
|
|
2039
|
+
range_start?: string;
|
|
2040
|
+
};
|
|
2041
|
+
Returns: Database["public"]["CompositeTypes"]["event_and_tags_pretty_location"][];
|
|
2042
|
+
SetofOptions: {
|
|
2043
|
+
from: "*";
|
|
2044
|
+
to: "event_and_tags_pretty_location";
|
|
2045
|
+
isOneToOne: false;
|
|
2046
|
+
isSetofReturn: true;
|
|
2047
|
+
};
|
|
1967
2048
|
};
|
|
1968
2049
|
get_events_infinite_by_herd: {
|
|
1969
2050
|
Args: {
|
|
@@ -1979,6 +2060,22 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
1979
2060
|
isOneToOne: false;
|
|
1980
2061
|
isSetofReturn: true;
|
|
1981
2062
|
};
|
|
2063
|
+
} | {
|
|
2064
|
+
Args: {
|
|
2065
|
+
cursor_id?: number;
|
|
2066
|
+
cursor_timestamp?: string;
|
|
2067
|
+
herd_id_caller: number;
|
|
2068
|
+
limit_caller?: number;
|
|
2069
|
+
range_end?: string;
|
|
2070
|
+
range_start?: string;
|
|
2071
|
+
};
|
|
2072
|
+
Returns: Database["public"]["CompositeTypes"]["event_and_tags_pretty_location"][];
|
|
2073
|
+
SetofOptions: {
|
|
2074
|
+
from: "*";
|
|
2075
|
+
to: "event_and_tags_pretty_location";
|
|
2076
|
+
isOneToOne: false;
|
|
2077
|
+
isSetofReturn: true;
|
|
2078
|
+
};
|
|
1982
2079
|
};
|
|
1983
2080
|
get_events_with_tags_for_herd: {
|
|
1984
2081
|
Args: {
|
|
@@ -2009,6 +2106,23 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
2009
2106
|
isOneToOne: false;
|
|
2010
2107
|
isSetofReturn: true;
|
|
2011
2108
|
};
|
|
2109
|
+
} | {
|
|
2110
|
+
Args: {
|
|
2111
|
+
cursor_feed_type?: string;
|
|
2112
|
+
cursor_id?: number;
|
|
2113
|
+
cursor_timestamp?: string;
|
|
2114
|
+
device_id_caller: number;
|
|
2115
|
+
limit_caller?: number;
|
|
2116
|
+
range_end?: string;
|
|
2117
|
+
range_start?: string;
|
|
2118
|
+
};
|
|
2119
|
+
Returns: Database["public"]["CompositeTypes"]["feed_item"][];
|
|
2120
|
+
SetofOptions: {
|
|
2121
|
+
from: "*";
|
|
2122
|
+
to: "feed_item";
|
|
2123
|
+
isOneToOne: false;
|
|
2124
|
+
isSetofReturn: true;
|
|
2125
|
+
};
|
|
2012
2126
|
};
|
|
2013
2127
|
get_feed_infinite_by_herd: {
|
|
2014
2128
|
Args: {
|
|
@@ -2025,6 +2139,23 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
2025
2139
|
isOneToOne: false;
|
|
2026
2140
|
isSetofReturn: true;
|
|
2027
2141
|
};
|
|
2142
|
+
} | {
|
|
2143
|
+
Args: {
|
|
2144
|
+
cursor_feed_type?: string;
|
|
2145
|
+
cursor_id?: number;
|
|
2146
|
+
cursor_timestamp?: string;
|
|
2147
|
+
herd_id_caller: number;
|
|
2148
|
+
limit_caller?: number;
|
|
2149
|
+
range_end?: string;
|
|
2150
|
+
range_start?: string;
|
|
2151
|
+
};
|
|
2152
|
+
Returns: Database["public"]["CompositeTypes"]["feed_item"][];
|
|
2153
|
+
SetofOptions: {
|
|
2154
|
+
from: "*";
|
|
2155
|
+
to: "feed_item";
|
|
2156
|
+
isOneToOne: false;
|
|
2157
|
+
isSetofReturn: true;
|
|
2158
|
+
};
|
|
2028
2159
|
};
|
|
2029
2160
|
get_health_metrics_summary: {
|
|
2030
2161
|
Args: {
|
|
@@ -2113,6 +2244,10 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
2113
2244
|
cursor_timestamp?: string;
|
|
2114
2245
|
device_id_caller: number;
|
|
2115
2246
|
limit_caller?: number;
|
|
2247
|
+
min_flight_distance_meters?: number;
|
|
2248
|
+
min_flight_time_minutes?: number;
|
|
2249
|
+
range_end?: string;
|
|
2250
|
+
range_start?: string;
|
|
2116
2251
|
};
|
|
2117
2252
|
Returns: Database["public"]["CompositeTypes"]["session_with_coordinates"][];
|
|
2118
2253
|
SetofOptions: {
|
|
@@ -2128,6 +2263,10 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
|
|
|
2128
2263
|
cursor_timestamp?: string;
|
|
2129
2264
|
herd_id_caller: number;
|
|
2130
2265
|
limit_caller?: number;
|
|
2266
|
+
min_flight_distance_meters?: number;
|
|
2267
|
+
min_flight_time_minutes?: number;
|
|
2268
|
+
range_end?: string;
|
|
2269
|
+
range_start?: string;
|
|
2131
2270
|
};
|
|
2132
2271
|
Returns: Database["public"]["CompositeTypes"]["session_with_coordinates"][];
|
|
2133
2272
|
SetofOptions: {
|