@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.
@@ -19,6 +19,7 @@ export * from "./users";
19
19
  export * from "./web";
20
20
  export * from "./zones";
21
21
  export * from "./cache";
22
+ export * from "./observations";
22
23
  export * from "./operators";
23
24
  export * from "./parts";
24
25
  export * from "./versions_software";
@@ -19,6 +19,7 @@ export * from "./users";
19
19
  export * from "./web";
20
20
  export * from "./zones";
21
21
  export * from "./cache";
22
+ export * from "./observations";
22
23
  export * from "./operators";
23
24
  export * from "./parts";
24
25
  export * from "./versions_software";
@@ -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
+ }
@@ -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";
@@ -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: {