@adventurelabs/scout-core 1.4.52 → 1.4.54

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.
@@ -1,6 +1,6 @@
1
1
  import { ISessionSummary } from "../types/db";
2
2
  import { IWebResponseCompatible } from "../types/requests";
3
3
  import { SupabaseClient } from "@supabase/supabase-js";
4
- export declare function server_get_session_summaries_by_herd(herd_id: number, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionSummary>>;
5
- export declare function server_get_session_summaries_by_device(device_id: number, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionSummary>>;
6
- export declare function server_get_session_summaries_with_filters(herd_id?: number, device_id?: number, start_date?: string, end_date?: string, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionSummary>>;
4
+ export declare function server_get_session_summaries_by_herd(herd_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionSummary>>;
5
+ export declare function server_get_session_summaries_by_device(device_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionSummary>>;
6
+ export declare function server_get_session_summaries_with_filters(herd_id?: number, device_id?: number, start_date?: string, end_date?: string, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionSummary>>;
@@ -1,13 +1,15 @@
1
1
  "use server";
2
2
  import { newServerClient } from "../supabase/server";
3
3
  import { IWebResponse, } from "../types/requests";
4
- export async function server_get_session_summaries_by_herd(herd_id, client) {
4
+ export async function server_get_session_summaries_by_herd(herd_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
5
5
  const supabase = client || (await newServerClient());
6
6
  const { data, error } = await supabase.rpc("get_session_summaries", {
7
7
  start_date_caller: undefined,
8
8
  end_date_caller: undefined,
9
9
  device_id_caller: undefined,
10
10
  herd_id_caller: herd_id,
11
+ min_duration_minutes_caller,
12
+ min_distance_meters_caller,
11
13
  });
12
14
  if (error) {
13
15
  return IWebResponse.error(error.message).to_compatible();
@@ -17,13 +19,15 @@ export async function server_get_session_summaries_by_herd(herd_id, client) {
17
19
  }
18
20
  return IWebResponse.success(data).to_compatible();
19
21
  }
20
- export async function server_get_session_summaries_by_device(device_id, client) {
22
+ export async function server_get_session_summaries_by_device(device_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
21
23
  const supabase = client || (await newServerClient());
22
24
  const { data, error } = await supabase.rpc("get_session_summaries", {
23
25
  start_date_caller: undefined,
24
26
  end_date_caller: undefined,
25
27
  device_id_caller: device_id,
26
28
  herd_id_caller: undefined,
29
+ min_duration_minutes_caller,
30
+ min_distance_meters_caller,
27
31
  });
28
32
  if (error) {
29
33
  return IWebResponse.error(error.message).to_compatible();
@@ -33,13 +37,15 @@ export async function server_get_session_summaries_by_device(device_id, client)
33
37
  }
34
38
  return IWebResponse.success(data).to_compatible();
35
39
  }
36
- export async function server_get_session_summaries_with_filters(herd_id, device_id, start_date, end_date, client) {
40
+ export async function server_get_session_summaries_with_filters(herd_id, device_id, start_date, end_date, client, min_duration_minutes_caller, min_distance_meters_caller) {
37
41
  const supabase = client || (await newServerClient());
38
42
  const { data, error } = await supabase.rpc("get_session_summaries", {
39
43
  start_date_caller: start_date || undefined,
40
44
  end_date_caller: end_date || undefined,
41
45
  device_id_caller: device_id || undefined,
42
46
  herd_id_caller: herd_id || undefined,
47
+ min_duration_minutes_caller,
48
+ min_distance_meters_caller,
43
49
  });
44
50
  if (error) {
45
51
  return IWebResponse.error(error.message).to_compatible();
@@ -2,8 +2,8 @@ import { ISessionWithCoordinates, ISessionUsageOverTime, IEventAndTagsPrettyLoca
2
2
  import { IWebResponseCompatible } from "../types/requests";
3
3
  import { SupabaseClient } from "@supabase/supabase-js";
4
4
  export declare function server_get_session_by_id(sessionId: number, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionWithCoordinates | null>>;
5
- export declare function server_get_session_usage_over_time_by_herd(herd_id: number, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
6
- export declare function server_get_session_usage_over_time_by_device(device_id: number, client?: SupabaseClient): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
5
+ export declare function server_get_session_usage_over_time_by_herd(herd_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
6
+ export declare function server_get_session_usage_over_time_by_device(device_id: number, client?: SupabaseClient, min_duration_minutes_caller?: number, min_distance_meters_caller?: number): Promise<IWebResponseCompatible<ISessionUsageOverTime>>;
7
7
  export declare function server_get_events_and_tags_by_session_id(sessionId: number, limit?: number, offset?: number): Promise<IWebResponseCompatible<IEventAndTagsPrettyLocation[]>>;
8
8
  export declare function server_insert_session(sessions: SessionInsert | SessionInsert[], client?: SupabaseClient): Promise<IWebResponseCompatible<ISession[]>>;
9
9
  export declare function server_update_session(sessions: (SessionUpdate & {
@@ -21,13 +21,15 @@ export async function server_get_session_by_id(sessionId, client) {
21
21
  return IWebResponse.success(session).to_compatible();
22
22
  }
23
23
  // Get session usage over time by herd
24
- export async function server_get_session_usage_over_time_by_herd(herd_id, client) {
24
+ export async function server_get_session_usage_over_time_by_herd(herd_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
25
25
  const supabase = client || (await newServerClient());
26
26
  const { data, error } = await supabase.rpc("get_session_usage_over_time", {
27
27
  start_date_caller: undefined,
28
28
  end_date_caller: undefined,
29
29
  device_id_caller: undefined,
30
30
  herd_id_caller: herd_id,
31
+ min_duration_minutes_caller,
32
+ min_distance_meters_caller,
31
33
  });
32
34
  if (error) {
33
35
  return IWebResponse.error(error.message).to_compatible();
@@ -38,13 +40,15 @@ export async function server_get_session_usage_over_time_by_herd(herd_id, client
38
40
  return IWebResponse.success(data).to_compatible();
39
41
  }
40
42
  // Get session usage over time by device
41
- export async function server_get_session_usage_over_time_by_device(device_id, client) {
43
+ export async function server_get_session_usage_over_time_by_device(device_id, client, min_duration_minutes_caller, min_distance_meters_caller) {
42
44
  const supabase = client || (await newServerClient());
43
45
  const { data, error } = await supabase.rpc("get_session_usage_over_time", {
44
46
  start_date_caller: undefined,
45
47
  end_date_caller: undefined,
46
48
  device_id_caller: device_id,
47
49
  herd_id_caller: undefined,
50
+ min_duration_minutes_caller,
51
+ min_distance_meters_caller,
48
52
  });
49
53
  if (error) {
50
54
  return IWebResponse.error(error.message).to_compatible();
@@ -6,26 +6,24 @@ export function useScoutRealtimePlans(scoutSupabase) {
6
6
  const channels = useRef([]);
7
7
  const [latestPlanUpdate, setLatestPlanUpdate] = useState(null);
8
8
  const activeHerdId = useSelector((state) => state.scout.active_herd_id);
9
- // Plan broadcast handler - just pass data, don't mutate state
10
- const handlePlanBroadcast = useCallback((payload) => {
11
- console.log("[Plans] Broadcast received:", payload.payload.operation);
12
- const data = payload.payload;
13
- const planData = data.record || data.old_record;
9
+ const handlePlanBroadcast = useCallback((message) => {
10
+ const { payload: data } = message;
11
+ if (data.table !== "plans" || data.schema !== "public") {
12
+ return;
13
+ }
14
+ const planData = data.record ?? data.old_record;
14
15
  if (!planData)
15
16
  return;
16
17
  let operation;
17
18
  switch (data.operation) {
18
19
  case "INSERT":
19
20
  operation = EnumRealtimeOperation.INSERT;
20
- console.log("[Plans] New plan received:", data.record);
21
21
  break;
22
22
  case "UPDATE":
23
23
  operation = EnumRealtimeOperation.UPDATE;
24
- console.log("[Plans] Plan updated:", data.record);
25
24
  break;
26
25
  case "DELETE":
27
26
  operation = EnumRealtimeOperation.DELETE;
28
- console.log("[Plans] Plan deleted:", data.old_record);
29
27
  break;
30
28
  default:
31
29
  return;
@@ -34,40 +32,35 @@ export function useScoutRealtimePlans(scoutSupabase) {
34
32
  data: planData,
35
33
  operation,
36
34
  };
37
- console.log(`[scout-core realtime] PLAN ${data.operation} received:`, JSON.stringify(realtimeData));
38
35
  setLatestPlanUpdate(realtimeData);
39
36
  }, []);
40
- // Clear latest update
41
37
  const clearLatestUpdate = useCallback(() => {
42
38
  setLatestPlanUpdate(null);
43
39
  }, []);
44
- const cleanupChannels = () => {
40
+ useEffect(() => {
41
+ if (!scoutSupabase)
42
+ return;
45
43
  channels.current.forEach((channel) => scoutSupabase.removeChannel(channel));
46
44
  channels.current = [];
47
- };
48
- const createPlansChannel = (herdId) => {
49
- return scoutSupabase
50
- .channel(`${herdId}-plans`, { config: { private: true } })
51
- .on("broadcast", { event: "*" }, handlePlanBroadcast)
52
- .subscribe((status) => {
53
- if (status === "SUBSCRIBED") {
54
- console.log(`[Plans] ✅ Connected to herd ${herdId}`);
55
- }
56
- else if (status === "CHANNEL_ERROR") {
57
- console.warn(`[Plans] 🟡 Failed to connect to herd ${herdId}`);
58
- }
59
- });
60
- };
61
- useEffect(() => {
62
- cleanupChannels();
63
- // Clear previous update when switching herds
64
45
  clearLatestUpdate();
65
- // Create plans channel for active herd
66
46
  if (activeHerdId) {
67
- const channel = createPlansChannel(activeHerdId);
47
+ const channel = scoutSupabase
48
+ .channel(`${activeHerdId}-plans`, { config: { private: true } })
49
+ .on("broadcast", { event: "*" }, handlePlanBroadcast)
50
+ .subscribe((status) => {
51
+ if (status === "SUBSCRIBED") {
52
+ console.log(`[Plans] ✅ Connected to herd ${activeHerdId}`);
53
+ }
54
+ else if (status === "CHANNEL_ERROR") {
55
+ console.warn(`[Plans] 🟡 Failed to connect to herd ${activeHerdId}`);
56
+ }
57
+ });
68
58
  channels.current.push(channel);
69
59
  }
70
- return cleanupChannels;
71
- }, [activeHerdId, clearLatestUpdate]);
60
+ return () => {
61
+ channels.current.forEach((ch) => scoutSupabase.removeChannel(ch));
62
+ channels.current = [];
63
+ };
64
+ }, [scoutSupabase, activeHerdId, handlePlanBroadcast, clearLatestUpdate]);
72
65
  return [latestPlanUpdate, clearLatestUpdate];
73
66
  }
@@ -2461,6 +2461,8 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
2461
2461
  device_id_caller?: number;
2462
2462
  end_date_caller?: string;
2463
2463
  herd_id_caller?: number;
2464
+ min_distance_meters_caller?: number;
2465
+ min_duration_minutes_caller?: number;
2464
2466
  start_date_caller?: string;
2465
2467
  };
2466
2468
  Returns: import("../types/supabase").Json;
@@ -2470,6 +2472,8 @@ export declare function useSupabase(): SupabaseClient<Database, "public", "publi
2470
2472
  device_id_caller?: number;
2471
2473
  end_date_caller?: string;
2472
2474
  herd_id_caller?: number;
2475
+ min_distance_meters_caller?: number;
2476
+ min_duration_minutes_caller?: number;
2473
2477
  start_date_caller?: string;
2474
2478
  };
2475
2479
  Returns: import("../types/supabase").Json;
@@ -62,6 +62,8 @@ export interface ISessionSummary {
62
62
  end_date: string | null;
63
63
  device_id: number | null;
64
64
  herd_id: number | null;
65
+ min_duration_minutes: number | null;
66
+ min_distance_meters: number | null;
65
67
  };
66
68
  }
67
69
  export type ISessionUsageOverTime = Database["public"]["Functions"]["get_session_usage_over_time"]["Returns"];
@@ -2546,6 +2546,8 @@ export type Database = {
2546
2546
  device_id_caller?: number;
2547
2547
  end_date_caller?: string;
2548
2548
  herd_id_caller?: number;
2549
+ min_distance_meters_caller?: number;
2550
+ min_duration_minutes_caller?: number;
2549
2551
  start_date_caller?: string;
2550
2552
  };
2551
2553
  Returns: Json;
@@ -2555,6 +2557,8 @@ export type Database = {
2555
2557
  device_id_caller?: number;
2556
2558
  end_date_caller?: string;
2557
2559
  herd_id_caller?: number;
2560
+ min_distance_meters_caller?: number;
2561
+ min_duration_minutes_caller?: number;
2558
2562
  start_date_caller?: string;
2559
2563
  };
2560
2564
  Returns: Json;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adventurelabs/scout-core",
3
- "version": "1.4.52",
3
+ "version": "1.4.54",
4
4
  "description": "Core utilities and helpers for Adventure Labs Scout applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",