@flowlist/js-core 4.0.5-beta.0 → 4.0.7-beta.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.
@@ -354,6 +354,7 @@ var FlowList = (function (exports) {
354
354
  field,
355
355
  uniqueKey = enum_default.DEFAULT_UNIQUE_KEY_NAME,
356
356
  query = {},
357
+ is_up = false,
357
358
  type
358
359
  }) => {
359
360
  const result = { ...query };
@@ -366,11 +367,11 @@ var FlowList = (function (exports) {
366
367
  if (type === enum_default.FETCH_TYPE.AUTO) {
367
368
  if (isArray(fieldResultAny)) {
368
369
  result.seen_ids = getSeenIdsString(fieldResultAny, uniqueKey);
369
- const targetIndex = query.is_up ? 0 : fieldResultAny.length - 1;
370
+ const targetIndex = is_up ? 0 : fieldResultAny.length - 1;
370
371
  const targetItem = fieldResultAny[targetIndex];
371
372
  result.since_id = getSafeObjectKey(targetItem);
372
373
  }
373
- result.is_up = query.is_up ? 1 : 0;
374
+ result.is_up = is_up ? 1 : 0;
374
375
  result.page = typeof query.page === "number" ? query.page : field.page + 1;
375
376
  } else if (type === enum_default.FETCH_TYPE.HAS_LOADED_IDS) {
376
377
  if (isArray(fieldResultAny)) {
@@ -378,11 +379,11 @@ var FlowList = (function (exports) {
378
379
  }
379
380
  } else if (type === enum_default.FETCH_TYPE.SINCE_FIRST_OR_END_ID) {
380
381
  if (isArray(fieldResultAny)) {
381
- const targetIndex = query.is_up ? 0 : fieldResultAny.length - 1;
382
+ const targetIndex = is_up ? 0 : fieldResultAny.length - 1;
382
383
  const targetItem = fieldResultAny[targetIndex];
383
384
  result.since_id = getSafeObjectKey(targetItem);
384
385
  }
385
- result.is_up = query.is_up ? 1 : 0;
386
+ result.is_up = is_up ? 1 : 0;
386
387
  } else if (type === enum_default.FETCH_TYPE.PAGINATION) {
387
388
  result.page = typeof query.page === "number" ? query.page : void 0;
388
389
  } else if (type === enum_default.FETCH_TYPE.SCROLL_LOAD_MORE) {
@@ -391,14 +392,14 @@ var FlowList = (function (exports) {
391
392
  } else {
392
393
  if (type === enum_default.FETCH_TYPE.AUTO) {
393
394
  result.seen_ids = "";
394
- result.since_id = isObjectKey(query.sinceId) ? query.sinceId : query.is_up ? 999999999 : 0;
395
- result.is_up = query.is_up ? 1 : 0;
395
+ result.since_id = isObjectKey(query.sinceId) ? query.sinceId : "";
396
+ result.is_up = is_up ? 1 : 0;
396
397
  result.page = typeof query.page === "number" ? query.page : field.page || 1;
397
398
  } else if (type === enum_default.FETCH_TYPE.HAS_LOADED_IDS) {
398
399
  result.seen_ids = "";
399
400
  } else if (type === enum_default.FETCH_TYPE.SINCE_FIRST_OR_END_ID) {
400
- result.since_id = isObjectKey(query.sinceId) ? query.sinceId : query.is_up ? 999999999 : 0;
401
- result.is_up = query.is_up ? 1 : 0;
401
+ result.since_id = isObjectKey(query.sinceId) ? query.sinceId : "";
402
+ result.is_up = is_up ? 1 : 0;
402
403
  } else if (type === enum_default.FETCH_TYPE.PAGINATION) {
403
404
  result.page = typeof query.page === "number" ? query.page : field.page;
404
405
  } else if (type === enum_default.FETCH_TYPE.SCROLL_LOAD_MORE) {
@@ -506,6 +507,39 @@ var FlowList = (function (exports) {
506
507
  };
507
508
 
508
509
  // src/actions.ts
510
+ var generateFieldName2 = ({
511
+ func,
512
+ query
513
+ }) => {
514
+ let result = func.id;
515
+ if (!query) return result;
516
+ const queryObj = query;
517
+ const filteredKeys = Object.keys(queryObj).filter((key) => !func.paramsIgnore.includes(key)).sort();
518
+ for (const key of filteredKeys) {
519
+ const value = queryObj[key];
520
+ const safeValue = typeof value === "object" && value !== null ? stableSerialize(value) : String(value);
521
+ result += `-${key}-${encodeURIComponent(safeValue)}`;
522
+ }
523
+ return result;
524
+ };
525
+ var createApi = (options) => {
526
+ const fn = ((params) => options.fetcher(params));
527
+ const metadata = {
528
+ id: options.id,
529
+ type: options.type || enum_default.FETCH_TYPE.SCROLL_LOAD_MORE,
530
+ uniqueKey: options.uniqueKey || enum_default.DEFAULT_UNIQUE_KEY_NAME,
531
+ is_up: options.is_up || false,
532
+ paramsIgnore: [
533
+ "page",
534
+ "since_id",
535
+ "seen_ids",
536
+ "__refresh__",
537
+ "__reload__",
538
+ ...options.paramsIgnore || []
539
+ ]
540
+ };
541
+ return Object.freeze(Object.assign(fn, metadata));
542
+ };
509
543
  var initState = ({
510
544
  getter,
511
545
  setter,
@@ -515,18 +549,12 @@ var FlowList = (function (exports) {
515
549
  }) => {
516
550
  return new Promise((resolve) => {
517
551
  const fieldName = generateFieldName2({ func, query });
518
- const fieldData = getter(fieldName);
519
- if (fieldData) {
520
- resolve();
521
- return;
522
- }
552
+ if (getter(fieldName)) return resolve();
523
553
  setter({
524
554
  key: fieldName,
525
555
  type: enum_default.SETTER_TYPE.RESET,
526
556
  value: generateDefaultField(opts),
527
- callback: () => {
528
- resolve();
529
- }
557
+ callback: () => resolve()
530
558
  });
531
559
  });
532
560
  };
@@ -546,14 +574,11 @@ var FlowList = (function (exports) {
546
574
  if (fieldData && fieldData.loading) return resolve();
547
575
  if (fieldData && fieldData.fetched && !doRefresh) return resolve();
548
576
  const params = generateRequestParams({
549
- field: generateDefaultField({
550
- ...fieldData,
551
- fetched: false
552
- }),
577
+ field: generateDefaultField({ ...fieldData, fetched: false }),
553
578
  uniqueKey: func.uniqueKey,
554
579
  type: func.type,
580
+ is_up: func.is_up,
555
581
  query
556
- // 内部生成逻辑兼容
557
582
  });
558
583
  const executeFetch = () => {
559
584
  func(params).then((data) => {
@@ -567,11 +592,7 @@ var FlowList = (function (exports) {
567
592
  page: params.page || 0,
568
593
  insertBefore: false
569
594
  }).then(() => {
570
- callback?.({
571
- params,
572
- data,
573
- refresh: doRefresh
574
- });
595
+ callback?.({ params, data, refresh: doRefresh });
575
596
  resolve();
576
597
  });
577
598
  };
@@ -596,11 +617,7 @@ var FlowList = (function (exports) {
596
617
  setter({
597
618
  key: fieldName,
598
619
  type: enum_default.SETTER_TYPE.RESET,
599
- value: {
600
- ...generateDefaultField(),
601
- loading: true,
602
- error: null
603
- },
620
+ value: { ...generateDefaultField(), loading: true, error: null },
604
621
  callback: executeFetch
605
622
  });
606
623
  }
@@ -615,36 +632,21 @@ var FlowList = (function (exports) {
615
632
  }) => new Promise((resolve, reject) => {
616
633
  const fieldName = generateFieldName2({ func, query });
617
634
  const fieldData = getter(fieldName);
618
- const type = func.type;
619
635
  if (!fieldData || fieldData.loading || fieldData.nothing) return resolve();
620
636
  if (fieldData.noMore && !errorRetry) return resolve();
621
- if (type === enum_default.FETCH_TYPE.PAGINATION && query && query.page != null && Number(query.page) === fieldData.page) {
622
- resolve();
623
- return;
624
- }
625
- let loadingState;
626
- if (type === enum_default.FETCH_TYPE.PAGINATION) {
627
- loadingState = {
628
- loading: true,
629
- error: null,
630
- [enum_default.FIELD_DATA.RESULT_KEY]: [],
631
- [enum_default.FIELD_DATA.EXTRA_KEY]: null
632
- };
633
- } else {
634
- loadingState = {
635
- loading: true,
636
- error: null
637
- };
637
+ const type = func.type;
638
+ if (type === enum_default.FETCH_TYPE.PAGINATION && query?.page != null && Number(query.page) === fieldData.page) {
639
+ return resolve();
638
640
  }
641
+ const loadingState = type === enum_default.FETCH_TYPE.PAGINATION ? { loading: true, error: null, result: [], extra: null } : { loading: true, error: null };
639
642
  const params = generateRequestParams({
640
643
  field: fieldData,
641
644
  uniqueKey: func.uniqueKey,
642
645
  type,
646
+ is_up: func.is_up,
643
647
  query
644
648
  });
645
- if (fieldData.extra) {
646
- params[enum_default.FIELD_DATA.EXTRA_KEY] = fieldData.extra;
647
- }
649
+ if (fieldData.extra) params.extra = fieldData.extra;
648
650
  setter({
649
651
  key: fieldName,
650
652
  type: enum_default.SETTER_TYPE.MERGE,
@@ -658,13 +660,9 @@ var FlowList = (function (exports) {
658
660
  type,
659
661
  fieldName,
660
662
  page: params.page || 0,
661
- insertBefore: !!query?.is_up
663
+ insertBefore: func.is_up
662
664
  }).then(() => {
663
- callback?.({
664
- params,
665
- data,
666
- refresh: false
667
- });
665
+ callback?.({ params, data, refresh: false });
668
666
  resolve();
669
667
  });
670
668
  }).catch((error) => {
@@ -697,7 +695,7 @@ var FlowList = (function (exports) {
697
695
  }
698
696
  const _id = id;
699
697
  const _uniqueKey = func.uniqueKey || enum_default.DEFAULT_UNIQUE_KEY_NAME;
700
- changeKey || enum_default.FIELD_DATA.RESULT_KEY;
698
+ const _changeKey = changeKey || enum_default.FIELD_DATA.RESULT_KEY;
701
699
  const beforeLength = computeResultLength(
702
700
  fieldData[enum_default.FIELD_DATA.RESULT_KEY]
703
701
  );
@@ -712,6 +710,121 @@ var FlowList = (function (exports) {
712
710
  const searchResult = resultArray ? searchValueByKey(resultArray, objectKeyId, _uniqueKey) : void 0;
713
711
  resolve(searchResult);
714
712
  return;
713
+ } else if (method === enum_default.CHANGE_TYPE.RESULT_UPDATE_KV) {
714
+ const objectKeyId = toObjectKey(_id);
715
+ if (objectKeyId === void 0) {
716
+ reject(new Error("ID is required for RESULT_UPDATE_KV."));
717
+ return;
718
+ }
719
+ if (resultArray) {
720
+ const matchedIndex = computeMatchedItemIndex(
721
+ objectKeyId,
722
+ resultArray,
723
+ _uniqueKey
724
+ );
725
+ if (matchedIndex >= 0 && isKeyMap(resultArray[matchedIndex])) {
726
+ updateObjectDeepValue(resultArray[matchedIndex], _changeKey, value);
727
+ }
728
+ }
729
+ resolve(null);
730
+ } else if (method === enum_default.CHANGE_TYPE.RESULT_ITEM_MERGE) {
731
+ const objectKeyId = toObjectKey(_id);
732
+ if (objectKeyId === void 0) {
733
+ reject(new Error("ID is required for RESULT_ITEM_MERGE."));
734
+ return;
735
+ }
736
+ if (resultArray && isKeyMap(value)) {
737
+ const matchedIndex = computeMatchedItemIndex(
738
+ objectKeyId,
739
+ resultArray,
740
+ _uniqueKey
741
+ );
742
+ updateArrayItem(resultArray, matchedIndex, (item) => ({
743
+ ...item,
744
+ ...value
745
+ }));
746
+ }
747
+ resolve(null);
748
+ } else if (method === enum_default.CHANGE_TYPE.RESET_FIELD) {
749
+ if (_changeKey === enum_default.FIELD_DATA.RESULT_KEY && isKeyMapArray(value)) {
750
+ newFieldData.result = value;
751
+ } else if (_changeKey === enum_default.FIELD_DATA.EXTRA_KEY && isKeyMap(value)) {
752
+ newFieldData.extra = value;
753
+ }
754
+ resolve(null);
755
+ } else {
756
+ let modifyValue;
757
+ if (_changeKey === enum_default.FIELD_DATA.RESULT_KEY) {
758
+ modifyValue = newFieldData.result;
759
+ } else if (_changeKey === enum_default.FIELD_DATA.EXTRA_KEY) {
760
+ modifyValue = newFieldData.extra;
761
+ } else {
762
+ modifyValue = getObjectDeepValue(newFieldData, _changeKey);
763
+ }
764
+ if (modifyValue == null) {
765
+ modifyValue = [];
766
+ }
767
+ const objectKeyId = toObjectKey(_id);
768
+ const matchedIndex = objectKeyId !== void 0 && isKeyMapArray(modifyValue) ? computeMatchedItemIndex(objectKeyId, modifyValue, _uniqueKey) : -1;
769
+ switch (method) {
770
+ case enum_default.CHANGE_TYPE.RESULT_ADD_AFTER:
771
+ if (isArray(modifyValue)) {
772
+ modifyValue = isArray(value) ? [...modifyValue, ...value] : [...modifyValue, value];
773
+ }
774
+ break;
775
+ case enum_default.CHANGE_TYPE.RESULT_ADD_BEFORE:
776
+ if (isArray(modifyValue)) {
777
+ modifyValue = isArray(value) ? [...value, ...modifyValue] : [value, ...modifyValue];
778
+ }
779
+ break;
780
+ case enum_default.CHANGE_TYPE.RESULT_REMOVE_BY_ID:
781
+ if (isKeyMapArray(modifyValue)) {
782
+ if (matchedIndex >= 0) {
783
+ modifyValue.splice(matchedIndex, 1);
784
+ } else if (isObjectKeyArray(_id)) {
785
+ const idSet = new Set(_id);
786
+ modifyValue = modifyValue.filter((item) => {
787
+ const itemKey = getObjectDeepValue(item, _uniqueKey);
788
+ return !isObjectKey(itemKey) || !idSet.has(itemKey);
789
+ });
790
+ }
791
+ }
792
+ break;
793
+ case enum_default.CHANGE_TYPE.RESULT_INSERT_TO_BEFORE:
794
+ if (isArray(modifyValue) && matchedIndex >= 0) {
795
+ modifyValue.splice(matchedIndex, 0, value);
796
+ }
797
+ break;
798
+ case enum_default.CHANGE_TYPE.RESULT_INSERT_TO_AFTER:
799
+ if (isArray(modifyValue) && matchedIndex >= 0) {
800
+ modifyValue.splice(matchedIndex + 1, 0, value);
801
+ }
802
+ break;
803
+ case enum_default.CHANGE_TYPE.RESULT_LIST_MERGE:
804
+ if (isKeyMapArray(modifyValue)) {
805
+ if (isKeyMapArray(value)) {
806
+ combineArrayData(modifyValue, value, _uniqueKey);
807
+ } else if (isKeyMap(value)) {
808
+ const valueAsRecord = {};
809
+ for (const [k, v] of Object.entries(value)) {
810
+ if (isKeyMap(v)) {
811
+ valueAsRecord[k] = v;
812
+ }
813
+ }
814
+ combineArrayData(modifyValue, valueAsRecord, _uniqueKey);
815
+ }
816
+ }
817
+ break;
818
+ default:
819
+ resolve(null);
820
+ return;
821
+ }
822
+ if (_changeKey === enum_default.FIELD_DATA.RESULT_KEY && isKeyMapArray(modifyValue)) {
823
+ newFieldData.result = modifyValue;
824
+ } else if (_changeKey === enum_default.FIELD_DATA.EXTRA_KEY && isKeyMap(modifyValue)) {
825
+ newFieldData.extra = modifyValue;
826
+ }
827
+ resolve(null);
715
828
  }
716
829
  const afterLength = computeResultLength(
717
830
  newFieldData[enum_default.FIELD_DATA.RESULT_KEY]
@@ -728,47 +841,6 @@ var FlowList = (function (exports) {
728
841
  });
729
842
  });
730
843
  };
731
- var createApi = (options) => {
732
- const fn = (params) => options.fetcher(params);
733
- fn.id = options.id;
734
- fn.type = options.type || enum_default.FETCH_TYPE.SCROLL_LOAD_MORE;
735
- fn.uniqueKey = options.uniqueKey || enum_default.DEFAULT_UNIQUE_KEY_NAME;
736
- fn.paramsIgnore = [
737
- "page",
738
- "is_up",
739
- "since_id",
740
- "seen_ids",
741
- "__refresh__",
742
- "__reload__",
743
- ...options.paramsIgnore || []
744
- ];
745
- return fn;
746
- };
747
- var generateFieldName2 = ({
748
- func,
749
- query
750
- }) => {
751
- let result = func.id;
752
- if (!query) {
753
- return result;
754
- }
755
- const queryObj = query;
756
- const filteredKeys = Object.keys(queryObj).filter((key) => !func.paramsIgnore.includes(key)).sort();
757
- const len = filteredKeys.length;
758
- for (let i = 0; i < len; i++) {
759
- const key = filteredKeys[i];
760
- const value = queryObj[key];
761
- let safeValue;
762
- if (typeof value === "object" && value !== null) {
763
- safeValue = stableSerialize(value);
764
- } else {
765
- safeValue = String(value);
766
- }
767
- const encoded = encodeURIComponent(safeValue);
768
- result += `-${key}-${encoded}`;
769
- }
770
- return result;
771
- };
772
844
 
773
845
  exports.ENUM = enum_default;
774
846
  exports.createApi = createApi;