@go-avro/avro-js 0.0.36 → 0.0.37

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,7 +1,7 @@
1
1
  import io from 'socket.io-client';
2
2
  import { useMutation, useQueryClient } from '@tanstack/react-query';
3
3
  import { v4 as uuidv4 } from "uuid";
4
- import { LoginResponse } from '../types/api';
4
+ import { Job, LoginResponse } from '../types/api';
5
5
  import { AuthState } from '../types/auth';
6
6
  import { StandardError } from '../types/error';
7
7
  function isBulkEvent(c) {
@@ -25,8 +25,8 @@ const SOCKET_EVENT_CONFIG = {
25
25
  user_updated: { invalidateKeys: [['users'], ['user']] },
26
26
  update_users: { invalidateKeys: [['users'], ['user']] },
27
27
  // ── Jobs ──
28
- create_job: { entityKey: 'jobs', action: 'create', fetchPath: (id) => `/job/${id}` },
29
- update_job: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}` },
28
+ create_job: { entityKey: 'jobs', action: 'create', fetchPath: (id) => `/job/${id}`, construct: (d) => new Job(d) },
29
+ update_job: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, construct: (d) => new Job(d) },
30
30
  delete_job: { entityKey: 'jobs', action: 'delete', fetchPath: null },
31
31
  update_jobs: { invalidateKeys: [['jobs'], ['infinite', 'jobs']] },
32
32
  delete_jobs: { invalidateKeys: [['jobs'], ['infinite', 'jobs']] },
@@ -35,9 +35,9 @@ const SOCKET_EVENT_CONFIG = {
35
35
  update_route: { entityKey: 'routes', action: 'update', fetchPath: (id) => `/route/${id}` },
36
36
  delete_route: { entityKey: 'routes', action: 'delete', fetchPath: null },
37
37
  // ── Events (also refetch parent job — overdueness, last_event, etc.) ──
38
- create_event: { entityKey: 'events', action: 'create', fetchPath: (id) => `/event/${id}`, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}` }] },
39
- update_event: { entityKey: 'events', action: 'update', fetchPath: (id) => `/event/${id}`, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}` }] },
40
- delete_event: { entityKey: 'events', action: 'delete', fetchPath: null, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}` }] },
38
+ create_event: { entityKey: 'events', action: 'create', fetchPath: (id) => `/event/${id}`, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}`, construct: (d) => new Job(d) }] },
39
+ update_event: { entityKey: 'events', action: 'update', fetchPath: (id) => `/event/${id}`, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}`, construct: (d) => new Job(d) }] },
40
+ delete_event: { entityKey: 'events', action: 'delete', fetchPath: null, relatedRefetch: [{ entityKey: 'jobs', idField: 'job_id', fetchPath: (id) => `/job/${id}`, construct: (d) => new Job(d) }] },
41
41
  update_events: { invalidateKeys: [['events']] },
42
42
  // ── Teams ──
43
43
  create_team: { entityKey: 'teams', action: 'create', fetchPath: null },
@@ -76,9 +76,9 @@ const SOCKET_EVENT_CONFIG = {
76
76
  update_months: { invalidateKeys: [['months']] },
77
77
  delete_months: { invalidateKeys: [['months']] },
78
78
  // ── Tasks (nested under jobs — target the parent job) ──
79
- create_task: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, idField: 'job_id' },
80
- update_task: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, idField: 'job_id' },
81
- delete_task: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, idField: 'job_id' },
79
+ create_task: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, idField: 'job_id', construct: (d) => new Job(d) },
80
+ update_task: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, idField: 'job_id', construct: (d) => new Job(d) },
81
+ delete_task: { entityKey: 'jobs', action: 'update', fetchPath: (id) => `/job/${id}`, idField: 'job_id', construct: (d) => new Job(d) },
82
82
  // ── Scheduling ──
83
83
  schedule_complete: { invalidateKeys: [['routes'], ['jobs'], ['infinite', 'jobs']] },
84
84
  // ── Location ──
@@ -227,7 +227,8 @@ export class AvroQueryClient {
227
227
  queryFn: () => client.get({ path: fetchPath(id) }),
228
228
  staleTime: 0,
229
229
  });
230
- fetchedItem = item;
230
+ fetchedItem = config.construct ? config.construct(item) : item;
231
+ queryClient.setQueryData([entityKey, id], fetchedItem);
231
232
  queryClient.setQueriesData({ predicate: entityPredicate, type: 'active' }, (old) => {
232
233
  if (!old)
233
234
  return old;
@@ -239,7 +240,7 @@ export class AvroQueryClient {
239
240
  return {
240
241
  ...old,
241
242
  pages: [
242
- [item, ...(old.pages[0] || [])],
243
+ [fetchedItem, ...(old.pages[0] || [])],
243
244
  ...old.pages.slice(1),
244
245
  ],
245
246
  };
@@ -247,7 +248,7 @@ export class AvroQueryClient {
247
248
  if (Array.isArray(old)) {
248
249
  if (old.some((x) => x?.id === id))
249
250
  return old;
250
- return [...old, item];
251
+ return [...old, fetchedItem];
251
252
  }
252
253
  return old;
253
254
  });
@@ -272,7 +273,8 @@ export class AvroQueryClient {
272
273
  queryFn: () => client.get({ path: fetchPath(id) }),
273
274
  staleTime: 0,
274
275
  });
275
- fetchedItem = item;
276
+ fetchedItem = config.construct ? config.construct(item) : item;
277
+ queryClient.setQueryData([entityKey, id], fetchedItem);
276
278
  // Patch it into every active list / infinite-query cache
277
279
  queryClient.setQueriesData({ predicate: entityPredicate, type: 'active' }, (old) => {
278
280
  if (!old)
@@ -280,11 +282,11 @@ export class AvroQueryClient {
280
282
  if (old.pages && Array.isArray(old.pages)) {
281
283
  return {
282
284
  ...old,
283
- pages: old.pages.map((page) => page.map((x) => (x?.id === id ? item : x))),
285
+ pages: old.pages.map((page) => page.map((x) => (x?.id === id ? fetchedItem : x))),
284
286
  };
285
287
  }
286
288
  if (Array.isArray(old)) {
287
- return old.map((x) => (x?.id === id ? item : x));
289
+ return old.map((x) => (x?.id === id ? fetchedItem : x));
288
290
  }
289
291
  return old;
290
292
  });
@@ -330,11 +332,14 @@ export class AvroQueryClient {
330
332
  if (!relatedId || typeof relatedId !== 'string')
331
333
  continue;
332
334
  try {
333
- const item = await queryClient.fetchQuery({
335
+ let relatedItem = await queryClient.fetchQuery({
334
336
  queryKey: [related.entityKey, relatedId],
335
337
  queryFn: () => client.get({ path: related.fetchPath(relatedId) }),
336
338
  staleTime: 0,
337
339
  });
340
+ if (related.construct)
341
+ relatedItem = related.construct(relatedItem);
342
+ queryClient.setQueryData([related.entityKey, relatedId], relatedItem);
338
343
  const relatedPredicate = (q) => matchesEntityKey(q, related.entityKey);
339
344
  queryClient.setQueriesData({ predicate: relatedPredicate, type: 'active' }, (old) => {
340
345
  if (!old)
@@ -342,11 +347,11 @@ export class AvroQueryClient {
342
347
  if (old.pages && Array.isArray(old.pages)) {
343
348
  return {
344
349
  ...old,
345
- pages: old.pages.map((page) => page.map((x) => (x?.id === relatedId ? item : x))),
350
+ pages: old.pages.map((page) => page.map((x) => (x?.id === relatedId ? relatedItem : x))),
346
351
  };
347
352
  }
348
353
  if (Array.isArray(old)) {
349
- return old.map((x) => (x?.id === relatedId ? item : x));
354
+ return old.map((x) => (x?.id === relatedId ? relatedItem : x));
350
355
  }
351
356
  return old;
352
357
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@go-avro/avro-js",
3
- "version": "0.0.36",
3
+ "version": "0.0.37",
4
4
  "description": "JS client for Avro backend integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",