@adventurelabs/scout-core 1.0.131 → 1.0.132

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,26 +1,39 @@
1
1
  "use client";
2
+ import { useAppDispatch } from "../store/hooks";
2
3
  import { useEffect, useRef, useCallback, useState } from "react";
4
+ import { upsertVersionSoftware, deleteVersionSoftwareById, } from "../store/scout";
3
5
  import { EnumRealtimeOperation } from "../types/realtime";
4
6
  export function useScoutRealtimeVersionsSoftware(scoutSupabase) {
5
7
  const channels = useRef([]);
8
+ const dispatch = useAppDispatch();
6
9
  const [newVersionsItems, setNewVersionsItems] = useState([]);
7
10
  // Handle versions software broadcasts
8
11
  const handleVersionsSoftwareBroadcast = useCallback((payload) => {
9
- const { event, payload: data } = payload;
12
+ console.log("[VersionsSoftware] Broadcast received:", payload.payload.operation);
13
+ const data = payload.payload;
10
14
  const versionData = data.record || data.old_record;
11
- if (!versionData) {
15
+ if (!versionData)
12
16
  return;
13
- }
14
17
  let operation;
15
18
  switch (data.operation) {
16
19
  case "INSERT":
17
20
  operation = EnumRealtimeOperation.INSERT;
21
+ if (data.record) {
22
+ console.log("[VersionsSoftware] New version received:", data.record);
23
+ dispatch(upsertVersionSoftware(data.record));
24
+ }
18
25
  break;
19
26
  case "UPDATE":
20
27
  operation = EnumRealtimeOperation.UPDATE;
28
+ if (data.record) {
29
+ dispatch(upsertVersionSoftware(data.record));
30
+ }
21
31
  break;
22
32
  case "DELETE":
23
33
  operation = EnumRealtimeOperation.DELETE;
34
+ if (data.old_record) {
35
+ dispatch(deleteVersionSoftwareById(data.old_record.id));
36
+ }
24
37
  break;
25
38
  default:
26
39
  return;
@@ -31,7 +44,7 @@ export function useScoutRealtimeVersionsSoftware(scoutSupabase) {
31
44
  operation,
32
45
  };
33
46
  setNewVersionsItems((prev) => [realtimeData, ...prev]);
34
- }, []);
47
+ }, [dispatch]);
35
48
  // Clear new items
36
49
  const clearNewItems = useCallback(() => {
37
50
  setNewVersionsItems([]);
@@ -1,9 +1,10 @@
1
1
  import { useEffect, useCallback, useRef, useMemo } from "react";
2
2
  import { useAppDispatch } from "../store/hooks";
3
3
  import { useStore } from "react-redux";
4
- import { EnumScoutStateStatus, setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiServerProcessingDuration, setHerdModulesApiTotalRequestDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setUser, setDataSource, setDataSourceInfo, } from "../store/scout";
4
+ import { EnumScoutStateStatus, setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiServerProcessingDuration, setHerdModulesApiTotalRequestDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setUser, setDataSource, setDataSourceInfo, setVersionsSoftware, } from "../store/scout";
5
5
  import { EnumHerdModulesLoadingState } from "../types/herd_module";
6
6
  import { server_load_herd_modules } from "../helpers/herds";
7
+ import { server_get_versions_software } from "../helpers/versions_software";
7
8
  import { scoutCache } from "../helpers/cache";
8
9
  import { EnumDataSource } from "../types/data_source";
9
10
  import { createBrowserClient } from "@supabase/ssr";
@@ -87,7 +88,10 @@ export function useScoutRefresh(options = {}) {
87
88
  if (cacheFirst) {
88
89
  const cacheStartTime = Date.now();
89
90
  try {
90
- const cacheResult = await scoutCache.getHerdModules();
91
+ const [cacheResult, versionsCacheResult] = await Promise.all([
92
+ scoutCache.getHerdModules(),
93
+ scoutCache.getVersionsSoftware(),
94
+ ]);
91
95
  cacheLoadDuration = Date.now() - cacheStartTime;
92
96
  timingRefs.current.cacheLoadDuration = cacheLoadDuration;
93
97
  dispatch(setCacheLoadDuration(cacheLoadDuration));
@@ -106,13 +110,18 @@ export function useScoutRefresh(options = {}) {
106
110
  console.log(`[useScoutRefresh] Updating store with cached herd modules`);
107
111
  dispatch(setHerdModules(cachedHerdModules));
108
112
  dispatch(setHerdModulesLoadingState(EnumHerdModulesLoadingState.SUCCESSFULLY_LOADED));
113
+ // Load cached software versions if available
114
+ if (versionsCacheResult.data && !versionsCacheResult.isStale) {
115
+ console.log(`[useScoutRefresh] Loaded ${versionsCacheResult.data.length} software versions from cache`);
116
+ dispatch(setVersionsSoftware(versionsCacheResult.data));
117
+ }
109
118
  // If cache is fresh, we still background fetch but don't wait
110
119
  if (!cacheResult.isStale) {
111
120
  // Background fetch fresh data without blocking
112
121
  (async () => {
113
122
  try {
114
123
  const backgroundStartTime = Date.now();
115
- const [backgroundHerdModulesResult, backgroundUserResult] = await Promise.all([
124
+ const [backgroundHerdModulesResult, backgroundUserResult, backgroundVersionsResult,] = await Promise.all([
116
125
  (async () => {
117
126
  const start = Date.now();
118
127
  const result = await server_load_herd_modules();
@@ -136,22 +145,45 @@ export function useScoutRefresh(options = {}) {
136
145
  dispatch(setUserApiDuration(duration));
137
146
  return { data: data.user, status: "success" };
138
147
  })(),
148
+ (async () => {
149
+ const start = Date.now();
150
+ const result = await server_get_versions_software();
151
+ const duration = Date.now() - start;
152
+ return { ...result, duration };
153
+ })(),
139
154
  ]);
140
155
  const backgroundDuration = Date.now() - backgroundStartTime;
141
156
  // Validate background responses
142
- if (backgroundHerdModulesResult.data &&
157
+ if (backgroundHerdModulesResult.status === "success" &&
158
+ backgroundHerdModulesResult.data &&
143
159
  Array.isArray(backgroundHerdModulesResult.data) &&
144
160
  backgroundUserResult &&
145
161
  backgroundUserResult.data) {
146
162
  // Update cache with fresh data
147
163
  try {
148
- await scoutCache.setHerdModules(backgroundHerdModulesResult.data, cacheTtlMs);
164
+ await Promise.all([
165
+ scoutCache.setHerdModules(backgroundHerdModulesResult.data, cacheTtlMs),
166
+ backgroundVersionsResult &&
167
+ backgroundVersionsResult.status === "success" &&
168
+ backgroundVersionsResult.data
169
+ ? scoutCache.setVersionsSoftware(backgroundVersionsResult.data, cacheTtlMs)
170
+ : Promise.resolve(),
171
+ ]);
149
172
  }
150
173
  catch (cacheError) {
151
174
  console.warn("[useScoutRefresh] Background cache save failed:", cacheError);
152
175
  await handleIndexedDbError(cacheError, "background cache save", async () => {
176
+ const promises = [];
153
177
  if (backgroundHerdModulesResult.data) {
154
- await scoutCache.setHerdModules(backgroundHerdModulesResult.data, cacheTtlMs);
178
+ promises.push(scoutCache.setHerdModules(backgroundHerdModulesResult.data, cacheTtlMs));
179
+ }
180
+ if (backgroundVersionsResult &&
181
+ backgroundVersionsResult.status === "success" &&
182
+ backgroundVersionsResult.data) {
183
+ promises.push(scoutCache.setVersionsSoftware(backgroundVersionsResult.data, cacheTtlMs));
184
+ }
185
+ if (promises.length > 0) {
186
+ await Promise.all(promises);
155
187
  }
156
188
  });
157
189
  }
@@ -162,6 +194,13 @@ export function useScoutRefresh(options = {}) {
162
194
  console.log(`[useScoutRefresh] Updating store with background user data`);
163
195
  dispatch(setUser(backgroundUserResult.data));
164
196
  }
197
+ // Update software versions if successful
198
+ if (backgroundVersionsResult &&
199
+ backgroundVersionsResult.status === "success" &&
200
+ backgroundVersionsResult.data) {
201
+ console.log(`[useScoutRefresh] Updating store with background software versions`);
202
+ dispatch(setVersionsSoftware(backgroundVersionsResult.data));
203
+ }
165
204
  // Update data source to DATABASE
166
205
  dispatch(setDataSource(EnumDataSource.DATABASE));
167
206
  dispatch(setDataSourceInfo({
@@ -195,7 +234,7 @@ export function useScoutRefresh(options = {}) {
195
234
  }
196
235
  // Step 2: Load fresh data from API
197
236
  const parallelStartTime = Date.now();
198
- const [herdModulesResult, userResult] = await Promise.all([
237
+ const [herdModulesResult, userResult, versionsResult] = await Promise.all([
199
238
  (async () => {
200
239
  const start = Date.now();
201
240
  const result = await server_load_herd_modules();
@@ -213,6 +252,16 @@ export function useScoutRefresh(options = {}) {
213
252
  start,
214
253
  };
215
254
  })(),
255
+ (async () => {
256
+ const start = Date.now();
257
+ const result = await server_get_versions_software();
258
+ const duration = Date.now() - start;
259
+ return {
260
+ result,
261
+ duration,
262
+ start,
263
+ };
264
+ })(),
216
265
  ]);
217
266
  const parallelDuration = Date.now() - parallelStartTime;
218
267
  console.log(`[useScoutRefresh] Parallel API requests completed in ${parallelDuration}ms`);
@@ -256,7 +305,15 @@ export function useScoutRefresh(options = {}) {
256
305
  // Step 3: Update cache with fresh data
257
306
  const cacheSaveStartTime = Date.now();
258
307
  try {
259
- await scoutCache.setHerdModules(compatible_new_herd_modules, cacheTtlMs);
308
+ const cachePromises = [
309
+ scoutCache.setHerdModules(compatible_new_herd_modules, cacheTtlMs),
310
+ ];
311
+ // Cache software versions if available
312
+ if (versionsResult.result.status === "success" &&
313
+ versionsResult.result.data) {
314
+ cachePromises.push(scoutCache.setVersionsSoftware(versionsResult.result.data, cacheTtlMs));
315
+ }
316
+ await Promise.all(cachePromises);
260
317
  const cacheSaveDuration = Date.now() - cacheSaveStartTime;
261
318
  timingRefs.current.cacheSaveDuration = cacheSaveDuration;
262
319
  console.log(`[useScoutRefresh] Cache updated in ${cacheSaveDuration}ms with TTL: ${Math.round(cacheTtlMs / 1000)}s`);
@@ -264,7 +321,14 @@ export function useScoutRefresh(options = {}) {
264
321
  catch (cacheError) {
265
322
  console.warn("[useScoutRefresh] Cache save failed:", cacheError);
266
323
  await handleIndexedDbError(cacheError, "cache save", async () => {
267
- await scoutCache.setHerdModules(compatible_new_herd_modules, cacheTtlMs);
324
+ const retryPromises = [
325
+ scoutCache.setHerdModules(compatible_new_herd_modules, cacheTtlMs),
326
+ ];
327
+ if (versionsResult.result.status === "success" &&
328
+ versionsResult.result.data) {
329
+ retryPromises.push(scoutCache.setVersionsSoftware(versionsResult.result.data, cacheTtlMs));
330
+ }
331
+ await Promise.all(retryPromises);
268
332
  });
269
333
  }
270
334
  // Step 4: Conditionally update store with fresh data, skip timestamp-only changes
@@ -274,6 +338,12 @@ export function useScoutRefresh(options = {}) {
274
338
  dispatch(setHerdModules(compatible_new_herd_modules));
275
339
  console.log(`[useScoutRefresh] Updating store with fresh user data`);
276
340
  dispatch(setUser(res_new_user.data));
341
+ // Update software versions
342
+ if (versionsResult.result.status === "success" &&
343
+ versionsResult.result.data) {
344
+ console.log(`[useScoutRefresh] Updating store with fresh software versions`);
345
+ dispatch(setVersionsSoftware(versionsResult.result.data));
346
+ }
277
347
  dispatch(setHerdModulesLoadingState(EnumHerdModulesLoadingState.SUCCESSFULLY_LOADED));
278
348
  const dataProcessingDuration = Date.now() - dataProcessingStartTime;
279
349
  timingRefs.current.dataProcessingDuration = dataProcessingDuration;
@@ -1,4 +1,4 @@
1
- import { IUser } from "../types/db";
1
+ import { IUser, IVersionsSoftware } from "../types/db";
2
2
  import { IHerdModule, EnumHerdModulesLoadingState } from "../types/herd_module";
3
3
  import { EnumDataSource, IDataSourceInfo } from "../types/data_source";
4
4
  import { MapDeviceIdToConnectivity } from "../types/connectivity";
@@ -23,6 +23,7 @@ export interface ScoutState {
23
23
  data_source: EnumDataSource;
24
24
  data_source_info: IDataSourceInfo | null;
25
25
  active_herd_gps_trackers_connectivity: MapDeviceIdToConnectivity;
26
+ versions_software: IVersionsSoftware[];
26
27
  }
27
28
  export interface RootState {
28
29
  scout: ScoutState;
@@ -172,7 +173,19 @@ export declare const scoutSlice: import("@reduxjs/toolkit").Slice<ScoutState, {
172
173
  payload: any;
173
174
  type: string;
174
175
  }) => void;
176
+ setVersionsSoftware: (state: import("immer").WritableDraft<ScoutState>, action: {
177
+ payload: any;
178
+ type: string;
179
+ }) => void;
180
+ upsertVersionSoftware: (state: import("immer").WritableDraft<ScoutState>, action: {
181
+ payload: any;
182
+ type: string;
183
+ }) => void;
184
+ deleteVersionSoftwareById: (state: import("immer").WritableDraft<ScoutState>, action: {
185
+ payload: any;
186
+ type: string;
187
+ }) => void;
175
188
  }, "scout", "scout", import("@reduxjs/toolkit").SliceSelectors<ScoutState>>;
176
- export declare const setHerdModules: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModules">, setStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setStatus">, setHerdModulesLoadingState: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadingState">, setHerdModulesLoadedInMs: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadedInMs">, setHerdModulesApiServerProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiServerProcessingDuration">, setHerdModulesApiTotalRequestDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiTotalRequestDuration">, setUserApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUserApiDuration">, setDataProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataProcessingDuration">, setCacheLoadDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setCacheLoadDuration">, setActiveHerdId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdId">, setActiveDeviceId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveDeviceId">, setDataSource: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSource">, setDataSourceInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSourceInfo">, appendEventsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendEventsToHerdModule">, replaceEventsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceEventsForHerdModule">, appendArtifactsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendArtifactsToHerdModule">, replaceArtifactsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceArtifactsForHerdModule">, updateEventValuesForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateEventValuesForHerdModule">, updatePageIndexForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePageIndexForHerdModule">, appendPlansToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendPlansToHerdModule">, setUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUser">, addTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addTag">, deleteTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteTag">, updateTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateTag">, addNewDeviceToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addNewDeviceToHerdModule">, updateDeviceForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDeviceForHerdModule">, addDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addDevice">, deleteDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteDevice">, updateDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDevice">, addPlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addPlan">, deletePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deletePlan">, updatePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePlan">, addSessionToStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addSessionToStore">, deleteSessionFromStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteSessionFromStore">, updateSessionInStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateSessionInStore">, setActiveHerdGpsTrackersConnectivity: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdGpsTrackersConnectivity">;
189
+ export declare const setHerdModules: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModules">, setStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setStatus">, setHerdModulesLoadingState: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadingState">, setHerdModulesLoadedInMs: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesLoadedInMs">, setHerdModulesApiServerProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiServerProcessingDuration">, setHerdModulesApiTotalRequestDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setHerdModulesApiTotalRequestDuration">, setUserApiDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUserApiDuration">, setDataProcessingDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataProcessingDuration">, setCacheLoadDuration: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setCacheLoadDuration">, setActiveHerdId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdId">, setActiveDeviceId: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveDeviceId">, setDataSource: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSource">, setDataSourceInfo: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setDataSourceInfo">, appendEventsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendEventsToHerdModule">, replaceEventsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceEventsForHerdModule">, appendArtifactsToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendArtifactsToHerdModule">, replaceArtifactsForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/replaceArtifactsForHerdModule">, updateEventValuesForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateEventValuesForHerdModule">, updatePageIndexForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePageIndexForHerdModule">, appendPlansToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/appendPlansToHerdModule">, setUser: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setUser">, addTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addTag">, deleteTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteTag">, updateTag: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateTag">, addNewDeviceToHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addNewDeviceToHerdModule">, updateDeviceForHerdModule: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDeviceForHerdModule">, addDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addDevice">, deleteDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteDevice">, updateDevice: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateDevice">, addPlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addPlan">, deletePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deletePlan">, updatePlan: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updatePlan">, addSessionToStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/addSessionToStore">, deleteSessionFromStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteSessionFromStore">, updateSessionInStore: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/updateSessionInStore">, setActiveHerdGpsTrackersConnectivity: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setActiveHerdGpsTrackersConnectivity">, setVersionsSoftware: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/setVersionsSoftware">, upsertVersionSoftware: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/upsertVersionSoftware">, deleteVersionSoftwareById: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "scout/deleteVersionSoftwareById">;
177
190
  declare const _default: import("redux").Reducer<ScoutState>;
178
191
  export default _default;
@@ -25,6 +25,7 @@ const initialState = {
25
25
  data_source: EnumDataSource.UNKNOWN,
26
26
  data_source_info: null,
27
27
  active_herd_gps_trackers_connectivity: {},
28
+ versions_software: [],
28
29
  };
29
30
  export const scoutSlice = createSlice({
30
31
  name: "scout",
@@ -284,8 +285,27 @@ export const scoutSlice = createSlice({
284
285
  setActiveHerdGpsTrackersConnectivity: (state, action) => {
285
286
  state.active_herd_gps_trackers_connectivity = action.payload;
286
287
  },
288
+ setVersionsSoftware: (state, action) => {
289
+ state.versions_software = action.payload;
290
+ },
291
+ upsertVersionSoftware: (state, action) => {
292
+ const version = action.payload;
293
+ const existingIndex = state.versions_software.findIndex((v) => v.id === version.id);
294
+ if (existingIndex !== -1) {
295
+ // Update existing version
296
+ state.versions_software[existingIndex] = version;
297
+ }
298
+ else {
299
+ // Add new version
300
+ state.versions_software = [version, ...state.versions_software];
301
+ }
302
+ },
303
+ deleteVersionSoftwareById: (state, action) => {
304
+ const versionId = action.payload;
305
+ state.versions_software = state.versions_software.filter((version) => version.id !== versionId);
306
+ },
287
307
  },
288
308
  });
289
309
  // Action creators are generated for each case reducer function
290
- export const { setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiServerProcessingDuration, setHerdModulesApiTotalRequestDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setActiveHerdId, setActiveDeviceId, setDataSource, setDataSourceInfo, appendEventsToHerdModule, replaceEventsForHerdModule, appendArtifactsToHerdModule, replaceArtifactsForHerdModule, updateEventValuesForHerdModule, updatePageIndexForHerdModule, appendPlansToHerdModule, setUser, addTag, deleteTag, updateTag, addNewDeviceToHerdModule, updateDeviceForHerdModule, addDevice, deleteDevice, updateDevice, addPlan, deletePlan, updatePlan, addSessionToStore, deleteSessionFromStore, updateSessionInStore, setActiveHerdGpsTrackersConnectivity, } = scoutSlice.actions;
310
+ export const { setHerdModules, setStatus, setHerdModulesLoadingState, setHerdModulesLoadedInMs, setHerdModulesApiServerProcessingDuration, setHerdModulesApiTotalRequestDuration, setUserApiDuration, setDataProcessingDuration, setCacheLoadDuration, setActiveHerdId, setActiveDeviceId, setDataSource, setDataSourceInfo, appendEventsToHerdModule, replaceEventsForHerdModule, appendArtifactsToHerdModule, replaceArtifactsForHerdModule, updateEventValuesForHerdModule, updatePageIndexForHerdModule, appendPlansToHerdModule, setUser, addTag, deleteTag, updateTag, addNewDeviceToHerdModule, updateDeviceForHerdModule, addDevice, deleteDevice, updateDevice, addPlan, deletePlan, updatePlan, addSessionToStore, deleteSessionFromStore, updateSessionInStore, setActiveHerdGpsTrackersConnectivity, setVersionsSoftware, upsertVersionSoftware, deleteVersionSoftwareById, } = scoutSlice.actions;
291
311
  export default scoutSlice.reducer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adventurelabs/scout-core",
3
- "version": "1.0.131",
3
+ "version": "1.0.132",
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",