@tellescope/react-components 1.224.0 → 1.226.0

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.
Files changed (46) hide show
  1. package/lib/cjs/CMS/ContentViewer.d.ts.map +1 -1
  2. package/lib/cjs/CMS/ContentViewer.js +28 -11
  3. package/lib/cjs/CMS/ContentViewer.js.map +1 -1
  4. package/lib/cjs/Forms/form_responses.d.ts.map +1 -1
  5. package/lib/cjs/Forms/form_responses.js +2 -2
  6. package/lib/cjs/Forms/form_responses.js.map +1 -1
  7. package/lib/cjs/Forms/forms.d.ts.map +1 -1
  8. package/lib/cjs/Forms/forms.js +81 -9
  9. package/lib/cjs/Forms/forms.js.map +1 -1
  10. package/lib/cjs/Forms/hooks.d.ts +6 -1
  11. package/lib/cjs/Forms/hooks.d.ts.map +1 -1
  12. package/lib/cjs/Forms/hooks.js +66 -12
  13. package/lib/cjs/Forms/hooks.js.map +1 -1
  14. package/lib/cjs/Forms/inputs.d.ts +1 -1
  15. package/lib/cjs/Forms/inputs.js +3 -3
  16. package/lib/cjs/Forms/inputs.js.map +1 -1
  17. package/lib/cjs/state.d.ts.map +1 -1
  18. package/lib/cjs/state.js +50 -25
  19. package/lib/cjs/state.js.map +1 -1
  20. package/lib/esm/CMS/ContentViewer.d.ts.map +1 -1
  21. package/lib/esm/CMS/ContentViewer.js +28 -11
  22. package/lib/esm/CMS/ContentViewer.js.map +1 -1
  23. package/lib/esm/Forms/form_responses.d.ts.map +1 -1
  24. package/lib/esm/Forms/form_responses.js +2 -2
  25. package/lib/esm/Forms/form_responses.js.map +1 -1
  26. package/lib/esm/Forms/forms.d.ts.map +1 -1
  27. package/lib/esm/Forms/forms.js +82 -10
  28. package/lib/esm/Forms/forms.js.map +1 -1
  29. package/lib/esm/Forms/hooks.d.ts +6 -1
  30. package/lib/esm/Forms/hooks.d.ts.map +1 -1
  31. package/lib/esm/Forms/hooks.js +66 -12
  32. package/lib/esm/Forms/hooks.js.map +1 -1
  33. package/lib/esm/Forms/inputs.d.ts +1 -1
  34. package/lib/esm/Forms/inputs.js +3 -3
  35. package/lib/esm/Forms/inputs.js.map +1 -1
  36. package/lib/esm/state.d.ts.map +1 -1
  37. package/lib/esm/state.js +50 -25
  38. package/lib/esm/state.js.map +1 -1
  39. package/lib/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +9 -9
  41. package/src/CMS/ContentViewer.tsx +38 -10
  42. package/src/Forms/form_responses.tsx +16 -14
  43. package/src/Forms/forms.tsx +129 -15
  44. package/src/Forms/hooks.tsx +77 -9
  45. package/src/Forms/inputs.tsx +3 -3
  46. package/src/state.tsx +57 -29
package/src/state.tsx CHANGED
@@ -887,32 +887,29 @@ export const useListStateHook = <T extends { id: string | number }, ADD extends
887
887
  // prevent frequent refetches
888
888
  if (value && options?.reload && didFetch('findById' + modelName + id, true)) return value
889
889
 
890
- if (options?.reload || (value === undefined && !didFetch('findById' + modelName + id))) {
891
- setFetched('findById' + modelName + id, true) // prevent multiple API calls
892
-
893
- if (options?.batch) {
894
- // ensure duplicate ids are not provided
895
- if (!batchRef.current.nextBatch.includes(id.toString()) && !batchRef.current.ids.includes(id.toString())) {
896
- if (batchRef.current.fetching) {
897
- batchRef.current.nextBatch.push(id.toString()) // fetch in next batch if currently fetching
898
- } else {
899
- batchRef.current.ids.push(id.toString())
900
- }
890
+ // Handle batch requests separately - always allow queueing for batch
891
+ if (options?.batch) {
892
+ if (!batchRef.current.nextBatch.includes(id.toString()) && !batchRef.current.ids.includes(id.toString())) {
893
+ if (batchRef.current.fetching) {
894
+ batchRef.current.nextBatch.push(id.toString()) // fetch in next batch if currently fetching
895
+ } else {
896
+ batchRef.current.ids.push(id.toString())
901
897
  }
902
- } else {
903
- findOne?.(id.toString())
904
- .then(found => {
905
- // prevent unnecessary re-renders by calling addLocalElement, when the exact value already exists
906
- const existingUnchanged = value_is_loaded(state) && state.value.find(v => v.id === id && objects_equivalent(v, found))
907
- if (existingUnchanged) return
908
-
909
- addLocalElement(found, { replaceIfMatch: true })
910
- })
911
- .catch(e => {
912
- setFetched('recordNotFound' + modelName + id, true) // mark record not found for id
913
- console.error(e)
914
- })
915
898
  }
899
+ } else if (options?.reload || (value === undefined && !didFetch('findById' + modelName + id))) {
900
+ setFetched('findById' + modelName + id, true) // prevent multiple API calls
901
+ findOne?.(id.toString())
902
+ .then(found => {
903
+ // prevent unnecessary re-renders by calling addLocalElement, when the exact value already exists
904
+ const existingUnchanged = value_is_loaded(state) && state.value.find(v => v.id === id && objects_equivalent(v, found))
905
+ if (existingUnchanged) return
906
+
907
+ addLocalElement(found, { replaceIfMatch: true })
908
+ })
909
+ .catch(e => {
910
+ setFetched('recordNotFound' + modelName + id, true) // mark record not found for id
911
+ console.error(e)
912
+ })
916
913
  }
917
914
 
918
915
  return value
@@ -931,30 +928,61 @@ export const useListStateHook = <T extends { id: string | number }, ADD extends
931
928
  }
932
929
 
933
930
  batchRef.current.fetching = true
931
+ const currentBatchIds = batchRef.current.ids.slice(0, BULK_READ_DEFAULT_LIMIT)
932
+
933
+ // Filter out IDs that are already loaded to prevent unnecessary fetching
934
+ const idsToFetch = currentBatchIds.filter(id => {
935
+ const alreadyLoaded = state.status === LoadingStatus.Loaded &&
936
+ state.value.find(v => v.id.toString() === id.toString())
937
+ return !alreadyLoaded
938
+ })
939
+
940
+ // Only make API call if there are actually IDs to fetch
941
+ if (idsToFetch.length === 0) {
942
+ // Mark all IDs as processed even though they were already loaded
943
+ currentBatchIds.forEach(id => {
944
+ setFetched('findById' + modelName + id, true)
945
+ })
946
+
947
+ // Continue to next batch
948
+ batchRef.current.ids = batchRef.current.nextBatch
949
+ batchRef.current.nextBatch = []
950
+ batchRef.current.fetching = false
951
+ return
952
+ }
953
+
934
954
  findByIds({
935
- ids: batchRef.current.ids.slice(0, BULK_READ_DEFAULT_LIMIT), // ensure limited to 1000 entries
955
+ ids: idsToFetch,
936
956
  })
937
957
  .then(({ matches }) => {
938
- if (matches.length) {
958
+ if (matches.length) {
939
959
  addLocalElements(matches, { replaceIfMatch: true })
940
- options?.onBulkRead?.(matches)
960
+ options?.onBulkRead?.(matches)
941
961
  }
962
+ // Mark all fetched IDs as complete (both successful and failed)
963
+ currentBatchIds.forEach(id => {
964
+ setFetched('findById' + modelName + id, true)
965
+ })
942
966
  })
943
967
  .catch(err => {
944
968
  console.error(err)
969
+ // Mark failed IDs as not found
970
+ currentBatchIds.forEach(id => {
971
+ setFetched('recordNotFound' + modelName + id, true)
972
+ })
945
973
  })
946
974
  .finally(() => {
947
975
  // ensure we make progress to prevent looping on an error
948
976
  batchRef.current.ids = batchRef.current.nextBatch
949
977
  batchRef.current.nextBatch = []
950
-
978
+
951
979
  // allow next fetch
952
980
  batchRef.current.fetching = false
953
981
  })
954
982
  }, 333)
955
983
 
956
984
  return () => { clearInterval(i) }
957
- }, [findByIds, addLocalElements, options?.onBulkRead])
985
+ }, [findByIds, addLocalElements, options?.onBulkRead, setFetched, modelName])
958
986
 
959
987
  const findByFilter: ListUpdateMethods<T, ADD>['findByFilter'] = useCallback((filter, options) => {
960
988
  const loadFilter = options?.loadFilter