aix 0.0.15 → 0.1.0-alpha.1
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.
- package/Aix.podspec +32 -0
- package/LICENSE +2 -2
- package/README.md +165 -33
- package/android/CMakeLists.txt +32 -0
- package/android/build.gradle +148 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +6 -0
- package/android/src/main/java/com/aix/AixPackage.kt +29 -0
- package/android/src/main/java/com/aix/HybridAix.kt +27 -0
- package/ios/Bridge.h +8 -0
- package/ios/HybridAix.swift +1072 -0
- package/ios/HybridAixCellView.swift +174 -0
- package/ios/HybridAixComposer.swift +119 -0
- package/lib/commonjs/aix.js +25 -0
- package/lib/commonjs/aix.js.map +1 -0
- package/lib/commonjs/fade-in/createUsePool.js +50 -0
- package/lib/commonjs/fade-in/createUsePool.js.map +1 -0
- package/lib/commonjs/fade-in/createUseStaggered.js +82 -0
- package/lib/commonjs/fade-in/createUseStaggered.js.map +1 -0
- package/lib/commonjs/fade-in/index.js +78 -0
- package/lib/commonjs/fade-in/index.js.map +1 -0
- package/lib/commonjs/footer.js +28 -0
- package/lib/commonjs/footer.js.map +1 -0
- package/lib/commonjs/index.js +48 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/views/aix.nitro.js +6 -0
- package/lib/commonjs/views/aix.nitro.js.map +1 -0
- package/lib/module/aix.js +20 -0
- package/lib/module/aix.js.map +1 -0
- package/lib/module/fade-in/createUsePool.js +46 -0
- package/lib/module/fade-in/createUsePool.js.map +1 -0
- package/lib/module/fade-in/createUseStaggered.js +79 -0
- package/lib/module/fade-in/createUseStaggered.js.map +1 -0
- package/lib/module/fade-in/index.js +74 -0
- package/lib/module/fade-in/index.js.map +1 -0
- package/lib/module/footer.js +23 -0
- package/lib/module/footer.js.map +1 -0
- package/lib/module/index.js +13 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/views/aix.nitro.js +4 -0
- package/lib/module/views/aix.nitro.js.map +1 -0
- package/lib/typescript/src/aix.d.ts +14 -0
- package/lib/typescript/src/aix.d.ts.map +1 -0
- package/lib/typescript/src/fade-in/createUsePool.d.ts +5 -0
- package/lib/typescript/src/fade-in/createUsePool.d.ts.map +1 -0
- package/lib/typescript/src/fade-in/createUseStaggered.d.ts +2 -0
- package/lib/typescript/src/fade-in/createUseStaggered.d.ts.map +1 -0
- package/lib/typescript/src/fade-in/index.d.ts +5 -0
- package/lib/typescript/src/fade-in/index.d.ts.map +1 -0
- package/lib/typescript/src/footer.d.ts +5 -0
- package/lib/typescript/src/footer.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +10 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/views/aix.nitro.d.ts +101 -0
- package/lib/typescript/src/views/aix.nitro.d.ts.map +1 -0
- package/nitro.json +26 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/Aix+autolinking.cmake +91 -0
- package/nitrogen/generated/android/Aix+autolinking.gradle +27 -0
- package/nitrogen/generated/android/AixOnLoad.cpp +70 -0
- package/nitrogen/generated/android/AixOnLoad.hpp +25 -0
- package/nitrogen/generated/android/c++/JAixAdditionalContentInsets.hpp +61 -0
- package/nitrogen/generated/android/c++/JAixAdditionalContentInsetsProp.hpp +63 -0
- package/nitrogen/generated/android/c++/JAixScrollIndicatorInsetValue.hpp +61 -0
- package/nitrogen/generated/android/c++/JAixScrollIndicatorInsets.hpp +63 -0
- package/nitrogen/generated/android/c++/JAixScrollOnFooterSizeUpdate.hpp +65 -0
- package/nitrogen/generated/android/c++/JHybridAixCellViewSpec.cpp +65 -0
- package/nitrogen/generated/android/c++/JHybridAixCellViewSpec.hpp +68 -0
- package/nitrogen/generated/android/c++/JHybridAixComposerSpec.cpp +48 -0
- package/nitrogen/generated/android/c++/JHybridAixComposerSpec.hpp +65 -0
- package/nitrogen/generated/android/c++/JHybridAixSpec.cpp +137 -0
- package/nitrogen/generated/android/c++/JHybridAixSpec.hpp +79 -0
- package/nitrogen/generated/android/c++/views/JHybridAixCellViewStateUpdater.cpp +60 -0
- package/nitrogen/generated/android/c++/views/JHybridAixCellViewStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/c++/views/JHybridAixComposerStateUpdater.cpp +53 -0
- package/nitrogen/generated/android/c++/views/JHybridAixComposerStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/c++/views/JHybridAixStateUpdater.cpp +80 -0
- package/nitrogen/generated/android/c++/views/JHybridAixStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/AixAdditionalContentInsets.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/AixAdditionalContentInsetsProp.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/AixOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/AixScrollIndicatorInsetValue.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/AixScrollIndicatorInsets.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/AixScrollOnFooterSizeUpdate.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/HybridAixCellViewSpec.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/HybridAixComposerSpec.kt +55 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/HybridAixSpec.kt +101 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/views/HybridAixCellViewManager.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/views/HybridAixCellViewStateUpdater.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/views/HybridAixComposerManager.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/views/HybridAixComposerStateUpdater.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/views/HybridAixManager.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/aix/views/HybridAixStateUpdater.kt +23 -0
- package/nitrogen/generated/ios/Aix+autolinking.rb +60 -0
- package/nitrogen/generated/ios/Aix-Swift-Cxx-Bridge.cpp +67 -0
- package/nitrogen/generated/ios/Aix-Swift-Cxx-Bridge.hpp +222 -0
- package/nitrogen/generated/ios/Aix-Swift-Cxx-Umbrella.hpp +70 -0
- package/nitrogen/generated/ios/AixAutolinking.mm +49 -0
- package/nitrogen/generated/ios/AixAutolinking.swift +55 -0
- package/nitrogen/generated/ios/c++/HybridAixCellViewSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridAixCellViewSpecSwift.hpp +80 -0
- package/nitrogen/generated/ios/c++/HybridAixComposerSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridAixComposerSpecSwift.hpp +69 -0
- package/nitrogen/generated/ios/c++/HybridAixSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridAixSpecSwift.hpp +142 -0
- package/nitrogen/generated/ios/c++/views/HybridAixCellViewComponent.mm +101 -0
- package/nitrogen/generated/ios/c++/views/HybridAixComponent.mm +126 -0
- package/nitrogen/generated/ios/c++/views/HybridAixComposerComponent.mm +92 -0
- package/nitrogen/generated/ios/swift/AixAdditionalContentInsets.swift +47 -0
- package/nitrogen/generated/ios/swift/AixAdditionalContentInsetsProp.swift +71 -0
- package/nitrogen/generated/ios/swift/AixScrollIndicatorInsetValue.swift +47 -0
- package/nitrogen/generated/ios/swift/AixScrollIndicatorInsets.swift +71 -0
- package/nitrogen/generated/ios/swift/AixScrollOnFooterSizeUpdate.swift +89 -0
- package/nitrogen/generated/ios/swift/HybridAixCellViewSpec.swift +57 -0
- package/nitrogen/generated/ios/swift/HybridAixCellViewSpec_cxx.swift +151 -0
- package/nitrogen/generated/ios/swift/HybridAixComposerSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridAixComposerSpec_cxx.swift +131 -0
- package/nitrogen/generated/ios/swift/HybridAixSpec.swift +63 -0
- package/nitrogen/generated/ios/swift/HybridAixSpec_cxx.swift +292 -0
- package/nitrogen/generated/shared/c++/AixAdditionalContentInsets.hpp +79 -0
- package/nitrogen/generated/shared/c++/AixAdditionalContentInsetsProp.hpp +81 -0
- package/nitrogen/generated/shared/c++/AixScrollIndicatorInsetValue.hpp +79 -0
- package/nitrogen/generated/shared/c++/AixScrollIndicatorInsets.hpp +81 -0
- package/nitrogen/generated/shared/c++/AixScrollOnFooterSizeUpdate.hpp +83 -0
- package/nitrogen/generated/shared/c++/HybridAixCellViewSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridAixCellViewSpec.hpp +65 -0
- package/nitrogen/generated/shared/c++/HybridAixComposerSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridAixComposerSpec.hpp +62 -0
- package/nitrogen/generated/shared/c++/HybridAixSpec.cpp +36 -0
- package/nitrogen/generated/shared/c++/HybridAixSpec.hpp +85 -0
- package/nitrogen/generated/shared/c++/views/HybridAixCellViewComponent.cpp +99 -0
- package/nitrogen/generated/shared/c++/views/HybridAixCellViewComponent.hpp +108 -0
- package/nitrogen/generated/shared/c++/views/HybridAixComponent.cpp +159 -0
- package/nitrogen/generated/shared/c++/views/HybridAixComponent.hpp +117 -0
- package/nitrogen/generated/shared/c++/views/HybridAixComposerComponent.cpp +75 -0
- package/nitrogen/generated/shared/c++/views/HybridAixComposerComponent.hpp +106 -0
- package/nitrogen/generated/shared/json/AixCellViewConfig.json +11 -0
- package/nitrogen/generated/shared/json/AixComposerConfig.json +9 -0
- package/nitrogen/generated/shared/json/AixConfig.json +16 -0
- package/package.json +113 -14
- package/src/aix.tsx +43 -0
- package/src/fade-in/createUsePool.ts +46 -0
- package/src/fade-in/createUseStaggered.ts +82 -0
- package/src/fade-in/index.tsx +97 -0
- package/src/footer.tsx +30 -0
- package/src/index.ts +20 -16
- package/src/views/aix.nitro.ts +148 -0
- package/docs/API.md +0 -288
- package/jest.config.js +0 -17
- package/lib/__tests__/deferredIterable.test.d.ts +0 -1
- package/lib/__tests__/deferredIterable.test.js +0 -108
- package/lib/__tests__/filter.test.d.ts +0 -1
- package/lib/__tests__/filter.test.js +0 -53
- package/lib/__tests__/flatMap.test.d.ts +0 -1
- package/lib/__tests__/flatMap.test.js +0 -77
- package/lib/__tests__/lookahead.test.d.ts +0 -1
- package/lib/__tests__/lookahead.test.js +0 -57
- package/lib/__tests__/map.test.d.ts +0 -1
- package/lib/__tests__/map.test.js +0 -53
- package/lib/__tests__/merge.test.d.ts +0 -1
- package/lib/__tests__/merge.test.js +0 -55
- package/lib/__tests__/reduce.test.d.ts +0 -1
- package/lib/__tests__/reduce.test.js +0 -52
- package/lib/__tests__/spanAll.test.d.ts +0 -1
- package/lib/__tests__/spanAll.test.js +0 -120
- package/lib/concat.d.ts +0 -4
- package/lib/concat.js +0 -126
- package/lib/deferred.d.ts +0 -9
- package/lib/deferred.js +0 -18
- package/lib/deferredIterable.d.ts +0 -22
- package/lib/deferredIterable.js +0 -111
- package/lib/filter.d.ts +0 -7
- package/lib/filter.js +0 -99
- package/lib/flatMap.d.ts +0 -1
- package/lib/flatMap.js +0 -119
- package/lib/fromEvent.d.ts +0 -5
- package/lib/fromEvent.js +0 -13
- package/lib/index.d.ts +0 -16
- package/lib/index.js +0 -34
- package/lib/insert.d.ts +0 -4
- package/lib/insert.js +0 -113
- package/lib/interval.d.ts +0 -4
- package/lib/interval.js +0 -64
- package/lib/iterableToArray.d.ts +0 -1
- package/lib/iterableToArray.js +0 -87
- package/lib/iteratorToIterable.d.ts +0 -6
- package/lib/iteratorToIterable.js +0 -70
- package/lib/lookahead.d.ts +0 -10
- package/lib/lookahead.js +0 -78
- package/lib/map.d.ts +0 -4
- package/lib/map.js +0 -98
- package/lib/merge.d.ts +0 -6
- package/lib/merge.js +0 -21
- package/lib/of.d.ts +0 -3
- package/lib/of.js +0 -5
- package/lib/reduce.d.ts +0 -4
- package/lib/reduce.js +0 -92
- package/lib/restToIterable.d.ts +0 -4
- package/lib/restToIterable.js +0 -73
- package/lib/spanAll.d.ts +0 -1
- package/lib/spanAll.js +0 -29
- package/lib/tap.d.ts +0 -4
- package/lib/tap.js +0 -96
- package/lib/toCallbacks.d.ts +0 -11
- package/lib/toCallbacks.js +0 -97
- package/lib/zip.d.ts +0 -4
- package/lib/zip.js +0 -75
- package/src/__tests__/deferredIterable.test.ts +0 -22
- package/src/__tests__/filter.test.ts +0 -10
- package/src/__tests__/flatMap.test.ts +0 -12
- package/src/__tests__/lookahead.test.ts +0 -9
- package/src/__tests__/map.test.ts +0 -10
- package/src/__tests__/merge.test.ts +0 -9
- package/src/__tests__/reduce.test.ts +0 -10
- package/src/__tests__/spanAll.test.ts +0 -17
- package/src/concat.ts +0 -13
- package/src/deferred.ts +0 -16
- package/src/deferredIterable.ts +0 -111
- package/src/filter.ts +0 -16
- package/src/flatMap.ts +0 -9
- package/src/fromEvent.ts +0 -16
- package/src/insert.ts +0 -13
- package/src/interval.ts +0 -20
- package/src/iterableToArray.ts +0 -7
- package/src/iteratorToIterable.ts +0 -12
- package/src/lookahead.ts +0 -27
- package/src/map.ts +0 -11
- package/src/merge.ts +0 -18
- package/src/of.ts +0 -4
- package/src/reduce.ts +0 -12
- package/src/restToIterable.ts +0 -8
- package/src/spanAll.ts +0 -26
- package/src/tap.ts +0 -11
- package/src/toCallbacks.ts +0 -27
- package/src/zip.ts +0 -19
- package/tsconfig.json +0 -63
- package/yarn.lock +0 -3514
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { callback, getHostComponent } from 'react-native-nitro-modules';
|
|
4
|
+
import AixConfig from '../nitrogen/generated/shared/json/AixConfig.json';
|
|
5
|
+
import { forwardRef } from 'react';
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
const AixInternal = getHostComponent('Aix', () => AixConfig);
|
|
8
|
+
export const Aix = /*#__PURE__*/forwardRef(function Aix(props, ref) {
|
|
9
|
+
return /*#__PURE__*/_jsx(AixInternal, {
|
|
10
|
+
...props,
|
|
11
|
+
hybridRef: ref ? callback(r => {
|
|
12
|
+
if (typeof ref === 'function') {
|
|
13
|
+
ref(r);
|
|
14
|
+
} else {
|
|
15
|
+
ref.current = r;
|
|
16
|
+
}
|
|
17
|
+
}) : undefined
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=aix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["callback","getHostComponent","AixConfig","forwardRef","jsx","_jsx","AixInternal","Aix","props","ref","hybridRef","r","current","undefined"],"sourceRoot":"../../src","sources":["aix.tsx"],"mappings":";;AAAA,SACEA,QAAQ,EACRC,gBAAgB,QAEX,4BAA4B;AACnC,OAAOC,SAAS,MAAM,kDAAkD;AAExE,SAASC,UAAU,QAAQ,OAAO;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAIlC,MAAMC,WAAW,GAAGL,gBAAgB,CAClC,KAAK,EACL,MAAMC,SACR,CAAC;AAED,OAAO,MAAMK,GAAG,gBAAGJ,UAAU,CAC3B,SAASI,GAAGA,CAACC,KAAK,EAAEC,GAAG,EAAE;EACvB,oBACEJ,IAAA,CAACC,WAAW;IAAA,GACNE,KAAK;IACTE,SAAS,EACPD,GAAG,GACCT,QAAQ,CAAEW,CAAC,IAAK;MACd,IAAI,OAAOF,GAAG,KAAK,UAAU,EAAE;QAC7BA,GAAG,CAACE,CAAC,CAAC;MACR,CAAC,MAAM;QACLF,GAAG,CAACG,OAAO,GAAGD,CAAC;MACjB;IACF,CAAC,CAAC,GACFE;EACL,CACF,CAAC;AAEN,CACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
4
|
+
export function createUsePool(maxPoolSize) {
|
|
5
|
+
// Use parallel arrays instead of one array for fast array operations
|
|
6
|
+
const items = [];
|
|
7
|
+
const setters = [];
|
|
8
|
+
const removeItem = (item, setInactive) => {
|
|
9
|
+
const index = items.indexOf(item);
|
|
10
|
+
if (index !== -1) {
|
|
11
|
+
if (setInactive) {
|
|
12
|
+
setters[index](false);
|
|
13
|
+
}
|
|
14
|
+
items.splice(index, 1);
|
|
15
|
+
setters.splice(index, 1);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const usePool = () => {
|
|
19
|
+
// Use a stable object reference as the key
|
|
20
|
+
const item = useRef({}).current;
|
|
21
|
+
const [isActive, setIsActive] = useState(true);
|
|
22
|
+
|
|
23
|
+
// A function that is stable and only changes when the item changes
|
|
24
|
+
const evict = useCallback(() => removeItem(item, true), [item]);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
items.push(item);
|
|
27
|
+
setters.push(setIsActive);
|
|
28
|
+
|
|
29
|
+
// Evict oldest item if over capacity
|
|
30
|
+
if (maxPoolSize && items.length > maxPoolSize) {
|
|
31
|
+
items.shift();
|
|
32
|
+
const evictedListener = setters.shift();
|
|
33
|
+
evictedListener(false);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Remove from pool when unmounting
|
|
37
|
+
return () => removeItem(item);
|
|
38
|
+
}, [item]);
|
|
39
|
+
return {
|
|
40
|
+
isActive,
|
|
41
|
+
evict
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
return usePool;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=createUsePool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useState","useRef","useEffect","useCallback","createUsePool","maxPoolSize","items","setters","removeItem","item","setInactive","index","indexOf","splice","usePool","current","isActive","setIsActive","evict","push","length","shift","evictedListener"],"sourceRoot":"../../../src","sources":["fade-in/createUsePool.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,SAAS,EAAEC,WAAW,QAAQ,OAAO;AAEhE,OAAO,SAASC,aAAaA,CAACC,WAAoB,EAAE;EAClD;EACA,MAAMC,KAAe,GAAG,EAAE;EAC1B,MAAMC,OAAqC,GAAG,EAAE;EAEhD,MAAMC,UAAU,GAAGA,CAACC,IAAY,EAAEC,WAAqB,KAAK;IAC1D,MAAMC,KAAK,GAAGL,KAAK,CAACM,OAAO,CAACH,IAAI,CAAC;IACjC,IAAIE,KAAK,KAAK,CAAC,CAAC,EAAE;MAChB,IAAID,WAAW,EAAE;QACfH,OAAO,CAACI,KAAK,CAAC,CAAE,KAAK,CAAC;MACxB;MACAL,KAAK,CAACO,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC;MACtBJ,OAAO,CAACM,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC;IAC1B;EACF,CAAC;EAED,MAAMG,OAAO,GAAGA,CAAA,KAAM;IACpB;IACA,MAAML,IAAI,GAAGR,MAAM,CAAC,CAAC,CAAC,CAAC,CAACc,OAAO;IAC/B,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGjB,QAAQ,CAAC,IAAI,CAAC;;IAE9C;IACA,MAAMkB,KAAK,GAAGf,WAAW,CAAC,MAAMK,UAAU,CAACC,IAAI,EAAE,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;IAE/DP,SAAS,CAAC,MAAM;MACdI,KAAK,CAACa,IAAI,CAACV,IAAI,CAAC;MAChBF,OAAO,CAACY,IAAI,CAACF,WAAW,CAAC;;MAEzB;MACA,IAAIZ,WAAW,IAAIC,KAAK,CAACc,MAAM,GAAGf,WAAW,EAAE;QAC7CC,KAAK,CAACe,KAAK,CAAC,CAAC;QACb,MAAMC,eAAe,GAAGf,OAAO,CAACc,KAAK,CAAC,CAAE;QACxCC,eAAe,CAAC,KAAK,CAAC;MACxB;;MAEA;MACA,OAAO,MAAMd,UAAU,CAACC,IAAI,CAAC;IAC/B,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;IAEV,OAAO;MAAEO,QAAQ;MAAEE;IAAM,CAAC;EAC5B,CAAC;EAED,OAAOJ,OAAO;AAChB","ignoreList":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
|
|
5
|
+
// Creates a staggered animation system - only one animation starts per frame/delay
|
|
6
|
+
export function createUseStaggered(delay) {
|
|
7
|
+
const animationQueue = [];
|
|
8
|
+
let isProcessing = false;
|
|
9
|
+
|
|
10
|
+
// Schedule next animation with delay or requestAnimationFrame
|
|
11
|
+
const scheduleNext = () => {
|
|
12
|
+
if (delay && delay > 0) {
|
|
13
|
+
setTimeout(processNextAnimation, delay);
|
|
14
|
+
} else {
|
|
15
|
+
requestAnimationFrame(processNextAnimation);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const processNextAnimation = () => {
|
|
19
|
+
if (animationQueue.length === 0) {
|
|
20
|
+
isProcessing = false;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Calculate how many animations to process this cycle
|
|
25
|
+
const queueLength = animationQueue.length;
|
|
26
|
+
let animationsToProcess = 1;
|
|
27
|
+
|
|
28
|
+
// Catch-up logic: process more animations when queue is long
|
|
29
|
+
if (queueLength > 10) {
|
|
30
|
+
animationsToProcess = Math.min(5, Math.ceil(queueLength / 4));
|
|
31
|
+
} else if (queueLength > 5) {
|
|
32
|
+
animationsToProcess = 2;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Process the calculated number of animations
|
|
36
|
+
for (let i = 0; i < animationsToProcess && animationQueue.length > 0; i++) {
|
|
37
|
+
const startAnimation = animationQueue.shift();
|
|
38
|
+
startAnimation();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Continue processing or mark as idle
|
|
42
|
+
if (animationQueue.length > 0) {
|
|
43
|
+
scheduleNext();
|
|
44
|
+
} else {
|
|
45
|
+
isProcessing = false;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const queueAnimation = startFn => {
|
|
49
|
+
animationQueue.push(startFn);
|
|
50
|
+
if (!isProcessing) {
|
|
51
|
+
isProcessing = true;
|
|
52
|
+
scheduleNext();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const useStaggered = animationFn => {
|
|
56
|
+
const animationRef = useRef(animationFn);
|
|
57
|
+
|
|
58
|
+
// Queue animation on mount
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (animationRef.current) {
|
|
61
|
+
queueAnimation(animationRef.current);
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
const animation = animationRef.current;
|
|
66
|
+
return () => {
|
|
67
|
+
// Clean up pending animation on unmount
|
|
68
|
+
if (animation) {
|
|
69
|
+
const index = animationQueue.indexOf(animation);
|
|
70
|
+
if (index !== -1) {
|
|
71
|
+
animationQueue.splice(index, 1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}, []);
|
|
76
|
+
};
|
|
77
|
+
return useStaggered;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=createUseStaggered.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","createUseStaggered","delay","animationQueue","isProcessing","scheduleNext","setTimeout","processNextAnimation","requestAnimationFrame","length","queueLength","animationsToProcess","Math","min","ceil","i","startAnimation","shift","queueAnimation","startFn","push","useStaggered","animationFn","animationRef","current","animation","index","indexOf","splice"],"sourceRoot":"../../../src","sources":["fade-in/createUseStaggered.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;;AAEzC;AACA,OAAO,SAASC,kBAAkBA,CAACC,KAAa,EAAE;EAChD,MAAMC,cAA8B,GAAG,EAAE;EACzC,IAAIC,YAAY,GAAG,KAAK;;EAExB;EACA,MAAMC,YAAY,GAAGA,CAAA,KAAM;IACzB,IAAIH,KAAK,IAAIA,KAAK,GAAG,CAAC,EAAE;MACtBI,UAAU,CAACC,oBAAoB,EAAEL,KAAK,CAAC;IACzC,CAAC,MAAM;MACLM,qBAAqB,CAACD,oBAAoB,CAAC;IAC7C;EACF,CAAC;EAED,MAAMA,oBAAoB,GAAGA,CAAA,KAAM;IACjC,IAAIJ,cAAc,CAACM,MAAM,KAAK,CAAC,EAAE;MAC/BL,YAAY,GAAG,KAAK;MACpB;IACF;;IAEA;IACA,MAAMM,WAAW,GAAGP,cAAc,CAACM,MAAM;IACzC,IAAIE,mBAAmB,GAAG,CAAC;;IAE3B;IACA,IAAID,WAAW,GAAG,EAAE,EAAE;MACpBC,mBAAmB,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,IAAI,CAACJ,WAAW,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC,MAAM,IAAIA,WAAW,GAAG,CAAC,EAAE;MAC1BC,mBAAmB,GAAG,CAAC;IACzB;;IAEA;IACA,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,mBAAmB,IAAIR,cAAc,CAACM,MAAM,GAAG,CAAC,EAAEM,CAAC,EAAE,EAAE;MACzE,MAAMC,cAAc,GAAGb,cAAc,CAACc,KAAK,CAAC,CAAE;MAC9CD,cAAc,CAAC,CAAC;IAClB;;IAEA;IACA,IAAIb,cAAc,CAACM,MAAM,GAAG,CAAC,EAAE;MAC7BJ,YAAY,CAAC,CAAC;IAChB,CAAC,MAAM;MACLD,YAAY,GAAG,KAAK;IACtB;EACF,CAAC;EAED,MAAMc,cAAc,GAAIC,OAAmB,IAAK;IAC9ChB,cAAc,CAACiB,IAAI,CAACD,OAAO,CAAC;IAE5B,IAAI,CAACf,YAAY,EAAE;MACjBA,YAAY,GAAG,IAAI;MACnBC,YAAY,CAAC,CAAC;IAChB;EACF,CAAC;EAED,MAAMgB,YAAY,GAAIC,WAAuB,IAAK;IAChD,MAAMC,YAAY,GAAGvB,MAAM,CAAsBsB,WAAW,CAAC;;IAE7D;IACAvB,SAAS,CAAC,MAAM;MACd,IAAIwB,YAAY,CAACC,OAAO,EAAE;QACxBN,cAAc,CAACK,YAAY,CAACC,OAAO,CAAC;MACtC;IACF,CAAC,EAAE,EAAE,CAAC;IAENzB,SAAS,CAAC,MAAM;MACd,MAAM0B,SAAS,GAAGF,YAAY,CAACC,OAAO;MACtC,OAAO,MAAM;QACX;QACA,IAAIC,SAAS,EAAE;UACb,MAAMC,KAAK,GAAGvB,cAAc,CAACwB,OAAO,CAACF,SAAS,CAAC;UAC/C,IAAIC,KAAK,KAAK,CAAC,CAAC,EAAE;YAChBvB,cAAc,CAACyB,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC;UACjC;QACF;MACF,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;EACR,CAAC;EAED,OAAOL,YAAY;AACrB","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated';
|
|
4
|
+
import { createUsePool } from './createUsePool';
|
|
5
|
+
import { createUseStaggered } from './createUseStaggered';
|
|
6
|
+
import Animated from 'react-native-reanimated';
|
|
7
|
+
import { Children, memo, useState } from 'react';
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
const useIsAnimatedInPool = createUsePool();
|
|
10
|
+
const useStaggeredAnimation = createUseStaggered(32);
|
|
11
|
+
function FadeIn({
|
|
12
|
+
children,
|
|
13
|
+
onFadedIn,
|
|
14
|
+
Component = Animated.Text
|
|
15
|
+
}) {
|
|
16
|
+
const progress = useSharedValue(0);
|
|
17
|
+
const startAnimation = () => {
|
|
18
|
+
progress.set(withTiming(1, {
|
|
19
|
+
duration: 500
|
|
20
|
+
}));
|
|
21
|
+
setTimeout(onFadedIn, 500);
|
|
22
|
+
};
|
|
23
|
+
useStaggeredAnimation(startAnimation);
|
|
24
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
25
|
+
opacity: progress.get()
|
|
26
|
+
}));
|
|
27
|
+
return /*#__PURE__*/_jsx(Component, {
|
|
28
|
+
style: animatedStyle,
|
|
29
|
+
children: children
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const AnimatedFadeInText = /*#__PURE__*/memo(function AnimatedFadeInText(props) {
|
|
33
|
+
const chunks = props.text.split(' ');
|
|
34
|
+
return chunks.map((chunk, i) => {
|
|
35
|
+
if (i < chunks.length - 1) chunk += ' ';
|
|
36
|
+
return /*#__PURE__*/_jsx(TextFadeInStaggered, {
|
|
37
|
+
text: chunk
|
|
38
|
+
}, i);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
export const TextFadeInStaggeredIfStreaming = /*#__PURE__*/memo(function TextFadeInStaggeredIfStreaming({
|
|
42
|
+
children: childrenProp,
|
|
43
|
+
disabled
|
|
44
|
+
}) {
|
|
45
|
+
const [enabled] = useState(!disabled);
|
|
46
|
+
let children = childrenProp;
|
|
47
|
+
if (enabled && children) {
|
|
48
|
+
if (Array.isArray(children)) {
|
|
49
|
+
children = Children.map(children, (child, i) => typeof child === 'string' ? /*#__PURE__*/_jsx(AnimatedFadeInText, {
|
|
50
|
+
text: child
|
|
51
|
+
}, i) : child);
|
|
52
|
+
} else if (typeof children === 'string') {
|
|
53
|
+
children = /*#__PURE__*/_jsx(AnimatedFadeInText, {
|
|
54
|
+
text: children
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return children;
|
|
59
|
+
});
|
|
60
|
+
const TextFadeInStaggered = /*#__PURE__*/memo(function TextFadeInStaggered({
|
|
61
|
+
text
|
|
62
|
+
}) {
|
|
63
|
+
const {
|
|
64
|
+
isActive,
|
|
65
|
+
evict
|
|
66
|
+
} = useIsAnimatedInPool();
|
|
67
|
+
return isActive ? /*#__PURE__*/_jsx(FadeIn, {
|
|
68
|
+
onFadedIn: () => {
|
|
69
|
+
evict();
|
|
70
|
+
},
|
|
71
|
+
children: text
|
|
72
|
+
}) : text;
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useAnimatedStyle","useSharedValue","withTiming","createUsePool","createUseStaggered","Animated","Children","memo","useState","jsx","_jsx","useIsAnimatedInPool","useStaggeredAnimation","FadeIn","children","onFadedIn","Component","Text","progress","startAnimation","set","duration","setTimeout","animatedStyle","opacity","get","style","AnimatedFadeInText","props","chunks","text","split","map","chunk","i","length","TextFadeInStaggered","TextFadeInStaggeredIfStreaming","childrenProp","disabled","enabled","Array","isArray","child","isActive","evict"],"sourceRoot":"../../../src","sources":["fade-in/index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getHostComponent } from 'react-native-nitro-modules';
|
|
4
|
+
import AixComposerConfig from '../nitrogen/generated/shared/json/AixComposerConfig.json';
|
|
5
|
+
import { StyleSheet } from 'react-native';
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
const AixFooterInternal = getHostComponent('AixComposer', () => AixComposerConfig);
|
|
8
|
+
export function AixFooter(props) {
|
|
9
|
+
if (__DEV__) {
|
|
10
|
+
const flat = StyleSheet.flatten(props.style);
|
|
11
|
+
const broken = Object.keys({
|
|
12
|
+
paddingBottom: flat.paddingBottom,
|
|
13
|
+
padding: flat.padding
|
|
14
|
+
}).filter(key => flat[key] !== undefined);
|
|
15
|
+
if (broken.length) {
|
|
16
|
+
console.error(`<AixFooter /> You used ${broken.join(', ')} in the style prop. Vertical padding is not supported on AixFooter directly. Please apply it to a child view instead.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return /*#__PURE__*/_jsx(AixFooterInternal, {
|
|
20
|
+
...props
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getHostComponent","AixComposerConfig","StyleSheet","jsx","_jsx","AixFooterInternal","AixFooter","props","__DEV__","flat","flatten","style","broken","Object","keys","paddingBottom","padding","filter","key","undefined","length","console","error","join"],"sourceRoot":"../../src","sources":["footer.tsx"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,4BAA4B;AAC7D,OAAOC,iBAAiB,MAAM,0DAA0D;AAExF,SAASC,UAAU,QAAQ,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzC,MAAMC,iBAAiB,GAAGL,gBAAgB,CACxC,aAAa,EACb,MAAMC,iBACR,CAAC;AAED,OAAO,SAASK,SAASA,CACvBC,KAAqD,EACrD;EACA,IAAIC,OAAO,EAAE;IACX,MAAMC,IAAI,GAAGP,UAAU,CAACQ,OAAO,CAACH,KAAK,CAACI,KAAK,CAAC;IAC5C,MAAMC,MAAM,GAAGC,MAAM,CAACC,IAAI,CAAC;MACzBC,aAAa,EAAEN,IAAI,CAACM,aAAa;MACjCC,OAAO,EAAEP,IAAI,CAACO;IAChB,CAAC,CAAC,CAACC,MAAM,CAAEC,GAAG,IAAKT,IAAI,CAACS,GAAG,CAAsB,KAAKC,SAAS,CAAC;IAEhE,IAAIP,MAAM,CAACQ,MAAM,EAAE;MACjBC,OAAO,CAACC,KAAK,CACX,0BAA0BV,MAAM,CAACW,IAAI,CACnC,IACF,CAAC,uHACH,CAAC;IACH;EACF;EACA,oBAAOnB,IAAA,CAACC,iBAAiB;IAAA,GAAKE;EAAK,CAAG,CAAC;AACzC","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getHostComponent } from 'react-native-nitro-modules';
|
|
4
|
+
import AixCellViewConfig from '../nitrogen/generated/shared/json/AixCellViewConfig.json';
|
|
5
|
+
import { useRef } from 'react';
|
|
6
|
+
export * from './fade-in';
|
|
7
|
+
export { Aix } from './aix';
|
|
8
|
+
export { AixFooter } from './footer';
|
|
9
|
+
export const AixCell = getHostComponent('AixCellView', () => AixCellViewConfig);
|
|
10
|
+
export function useAixRef() {
|
|
11
|
+
return useRef(null);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getHostComponent","AixCellViewConfig","useRef","Aix","AixFooter","AixCell","useAixRef"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAwB,4BAA4B;AAC7E,OAAOC,iBAAiB,MAAM,0DAA0D;AAExF,SAASC,MAAM,QAAQ,OAAO;AAE9B,cAAc,WAAW;AAEzB,SAASC,GAAG,QAAqB,OAAO;AACxC,SAASC,SAAS,QAAQ,UAAU;AAEpC,OAAO,MAAMC,OAAO,GAAGL,gBAAgB,CACrC,aAAa,EACb,MAAMC,iBACR,CAAC;AAID,OAAO,SAASK,SAASA,CAAA,EAAG;EAC1B,OAAOJ,MAAM,CAAgB,IAAI,CAAC;AACpC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["views/aix.nitro.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type HybridRef } from 'react-native-nitro-modules';
|
|
2
|
+
import type { AixProps, AixMethods } from './views/aix.nitro';
|
|
3
|
+
export type AixRef = HybridRef<AixProps, AixMethods>;
|
|
4
|
+
export declare const Aix: import("react").ForwardRefExoticComponent<{
|
|
5
|
+
hybridRef?: import("react-native-nitro-modules").NitroViewWrappedCallback<((ref: import("react-native-nitro-modules").HybridView<AixProps, AixMethods>) => void) | undefined> | undefined;
|
|
6
|
+
shouldStartAtEnd: boolean;
|
|
7
|
+
scrollOnFooterSizeUpdate?: import("./views/aix.nitro").AixScrollOnFooterSizeUpdate | undefined;
|
|
8
|
+
scrollEndReachedThreshold?: number | undefined;
|
|
9
|
+
additionalContentInsets?: import("./views/aix.nitro").AixAdditionalContentInsetsProp | undefined;
|
|
10
|
+
additionalScrollIndicatorInsets?: import("./views/aix.nitro").AixScrollIndicatorInsets | undefined;
|
|
11
|
+
mainScrollViewID?: string | undefined;
|
|
12
|
+
penultimateCellIndex?: number | undefined;
|
|
13
|
+
} & import("react-native").ViewProps & import("react").RefAttributes<AixRef>>;
|
|
14
|
+
//# sourceMappingURL=aix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aix.d.ts","sourceRoot":"","sources":["../../../src/aix.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,4BAA4B,CAAA;AAEnC,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG7D,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;AAOpD,eAAO,MAAM,GAAG;;;;;;;;;6EAmBf,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createUsePool.d.ts","sourceRoot":"","sources":["../../../../src/fade-in/createUsePool.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM;;;EA2CjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createUseStaggered.d.ts","sourceRoot":"","sources":["../../../../src/fade-in/createUseStaggered.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,iBAqDX,MAAM,IAAI,UAyB9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fade-in/index.tsx"],"names":[],"mappings":"AAkDA,eAAO,MAAM,8BAA8B;cAK7B,KAAK,CAAC,SAAS;cACf,OAAO;EAqBpB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AixComposerProps } from './views/aix.nitro';
|
|
2
|
+
declare const AixFooterInternal: import("react-native-nitro-modules").ReactNativeView<AixComposerProps, {}>;
|
|
3
|
+
export declare function AixFooter(props: React.ComponentProps<typeof AixFooterInternal>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../src/footer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,QAAA,MAAM,iBAAiB,4EAGtB,CAAA;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,iBAAiB,CAAC,2CAkBtD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type HybridRef } from 'react-native-nitro-modules';
|
|
2
|
+
import type { AixCellViewProps } from './views/aix.nitro';
|
|
3
|
+
import type { AixRef } from './aix';
|
|
4
|
+
export * from './fade-in';
|
|
5
|
+
export { Aix, type AixRef } from './aix';
|
|
6
|
+
export { AixFooter } from './footer';
|
|
7
|
+
export declare const AixCell: import("react-native-nitro-modules").ReactNativeView<AixCellViewProps, {}>;
|
|
8
|
+
export type AixCellViewRef = HybridRef<AixCellViewProps, {}>;
|
|
9
|
+
export declare function useAixRef(): import("react").RefObject<AixRef | null>;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACnC,cAAc,WAAW,CAAA;AAEzB,OAAO,EAAE,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,eAAO,MAAM,OAAO,4EAGnB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;AAE5D,wBAAgB,SAAS,6CAExB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { HybridView, HybridViewProps, HybridViewMethods } from 'react-native-nitro-modules';
|
|
2
|
+
export interface AixAdditionalContentInsets {
|
|
3
|
+
whenKeyboardOpen: number;
|
|
4
|
+
whenKeyboardClosed: number;
|
|
5
|
+
}
|
|
6
|
+
export interface AixAdditionalContentInsetsProp {
|
|
7
|
+
top?: AixAdditionalContentInsets;
|
|
8
|
+
bottom?: AixAdditionalContentInsets;
|
|
9
|
+
}
|
|
10
|
+
export interface AixScrollIndicatorInsetValue {
|
|
11
|
+
whenKeyboardOpen: number;
|
|
12
|
+
whenKeyboardClosed: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AixScrollIndicatorInsets {
|
|
15
|
+
top?: AixScrollIndicatorInsetValue;
|
|
16
|
+
bottom?: AixScrollIndicatorInsetValue;
|
|
17
|
+
}
|
|
18
|
+
export interface AixScrollOnFooterSizeUpdate {
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
scrolledToEndThreshold?: number;
|
|
21
|
+
animated?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface AixProps extends HybridViewProps {
|
|
24
|
+
shouldStartAtEnd: boolean;
|
|
25
|
+
scrollOnFooterSizeUpdate?: AixScrollOnFooterSizeUpdate;
|
|
26
|
+
/**
|
|
27
|
+
* The number of pixels from the bottom of the scroll view to the end of the content that is considered "near the end".
|
|
28
|
+
*
|
|
29
|
+
* If the scroll view is scrolled to the end of the content, and the content is less than this threshold, the content will be shifted up when the keyboard is opened.
|
|
30
|
+
*
|
|
31
|
+
* By default, it will be the greater of the current blank size, or 200.
|
|
32
|
+
*
|
|
33
|
+
* TODO make this a more adaptive prop, like { strategy: 'blank-size', min: 200 } | { strategy: 'fixed', value: 200 }
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
scrollEndReachedThreshold?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Scroll end blank size threshold.
|
|
39
|
+
*
|
|
40
|
+
* If the blank size is less than this threshold, then the content will collapse to the keyboard when the keyboard is opened.
|
|
41
|
+
*
|
|
42
|
+
* You likely don't need to customize this much.
|
|
43
|
+
*
|
|
44
|
+
* Default: 0
|
|
45
|
+
*
|
|
46
|
+
* TODO we might want to implement this, but i'm not sure.
|
|
47
|
+
*
|
|
48
|
+
* By default, the content will collapse to the keyboard on opening if the blank size is less than half the size of the scroll view parent, and greater than the keyboard height.
|
|
49
|
+
*/
|
|
50
|
+
additionalContentInsets?: AixAdditionalContentInsetsProp;
|
|
51
|
+
/**
|
|
52
|
+
* Additional insets for the scroll indicator, added to existing safe area insets.
|
|
53
|
+
* Applied to verticalScrollIndicatorInsets on iOS.
|
|
54
|
+
*/
|
|
55
|
+
additionalScrollIndicatorInsets?: AixScrollIndicatorInsets;
|
|
56
|
+
/**
|
|
57
|
+
* The nativeID of the scroll view to use.
|
|
58
|
+
*
|
|
59
|
+
* If provided, will search for a scroll view with this accessibilityIdentifier.
|
|
60
|
+
* If not provided or not found, falls back to the default subview iteration logic.
|
|
61
|
+
*/
|
|
62
|
+
mainScrollViewID?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Used to index of the second-to-last message.
|
|
65
|
+
*
|
|
66
|
+
* For AI chat apps, it should correspond to the index of the last user message.
|
|
67
|
+
*
|
|
68
|
+
* By default, it will simply be the seccond-to-last item. Specifically, it will correspond to the Cell index before the <Cell isLast />.
|
|
69
|
+
*
|
|
70
|
+
* However, if you use custom message types, you can override it with this prop.
|
|
71
|
+
*
|
|
72
|
+
* For example, if you use a "<Timestamp />" row in your LegendList or FlashList implementation, then you can set this value.
|
|
73
|
+
*
|
|
74
|
+
* This indicates which message will be scrolled into view.
|
|
75
|
+
*
|
|
76
|
+
*/
|
|
77
|
+
penultimateCellIndex?: number;
|
|
78
|
+
}
|
|
79
|
+
export interface AixMethods extends HybridViewMethods {
|
|
80
|
+
scrollToEnd(animated?: boolean): void;
|
|
81
|
+
scrollToIndexWhenBlankSizeReady(index: number, animated?: boolean, waitForKeyboardToEnd?: boolean): void;
|
|
82
|
+
}
|
|
83
|
+
export type Aix = HybridView<AixProps, AixMethods, {
|
|
84
|
+
ios: 'swift';
|
|
85
|
+
android: 'kotlin';
|
|
86
|
+
}>;
|
|
87
|
+
export interface AixCellViewProps extends HybridViewProps {
|
|
88
|
+
isLast: boolean;
|
|
89
|
+
index: number;
|
|
90
|
+
}
|
|
91
|
+
export type AixCellView = HybridView<AixCellViewProps, {}, {
|
|
92
|
+
ios: 'swift';
|
|
93
|
+
android: 'kotlin';
|
|
94
|
+
}>;
|
|
95
|
+
export interface AixComposerProps extends HybridViewProps {
|
|
96
|
+
}
|
|
97
|
+
export type AixComposer = HybridView<AixComposerProps, {}, {
|
|
98
|
+
ios: 'swift';
|
|
99
|
+
android: 'kotlin';
|
|
100
|
+
}>;
|
|
101
|
+
//# sourceMappingURL=aix.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aix.nitro.d.ts","sourceRoot":"","sources":["../../../../src/views/aix.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,iBAAiB,EAClB,MAAM,4BAA4B,CAAA;AAEnC,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,EAAE,0BAA0B,CAAA;IAChC,MAAM,CAAC,EAAE,0BAA0B,CAAA;CACpC;AAED,MAAM,WAAW,4BAA4B;IAC3C,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,CAAC,EAAE,4BAA4B,CAAA;IAClC,MAAM,CAAC,EAAE,4BAA4B,CAAA;CACtC;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,QAAS,SAAQ,eAAe;IAC/C,gBAAgB,EAAE,OAAO,CAAA;IACzB,wBAAwB,CAAC,EAAE,2BAA2B,CAAA;IACtD;;;;;;;;;OASG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC;;;;;;;;;;;;OAYG;IAEH,uBAAuB,CAAC,EAAE,8BAA8B,CAAA;IAExD;;;OAGG;IACH,+BAA+B,CAAC,EAAE,wBAAwB,CAAA;IAE1D;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACrC,+BAA+B,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,OAAO,EAClB,oBAAoB,CAAC,EAAE,OAAO,GAC7B,IAAI,CAAA;CACR;AAED,MAAM,MAAM,GAAG,GAAG,UAAU,CAC1B,QAAQ,EACR,UAAU,EACV;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CACpC,CAAA;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAClC,gBAAgB,EAChB,EAAE,EACF;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CACpC,CAAA;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;CAAG;AAE5D,MAAM,MAAM,WAAW,GAAG,UAAU,CAClC,gBAAgB,EAChB,EAAE,EACF;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CACpC,CAAA"}
|
package/nitro.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://nitro.margelo.com/nitro.schema.json",
|
|
3
|
+
"cxxNamespace": ["aix"],
|
|
4
|
+
"ios": {
|
|
5
|
+
"iosModuleName": "Aix"
|
|
6
|
+
},
|
|
7
|
+
"android": {
|
|
8
|
+
"androidNamespace": ["aix"],
|
|
9
|
+
"androidCxxLibName": "Aix"
|
|
10
|
+
},
|
|
11
|
+
"autolinking": {
|
|
12
|
+
"Aix": {
|
|
13
|
+
"swift": "HybridAix",
|
|
14
|
+
"kotlin": "HybridAix"
|
|
15
|
+
},
|
|
16
|
+
"AixCellView": {
|
|
17
|
+
"swift": "HybridAixCellView",
|
|
18
|
+
"kotlin": "HybridAixCellView"
|
|
19
|
+
},
|
|
20
|
+
"AixComposer": {
|
|
21
|
+
"swift": "HybridAixComposer",
|
|
22
|
+
"kotlin": "HybridAixComposer"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"ignorePaths": ["**/node_modules"]
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
** linguist-generated=true
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Aix+autolinking.cmake
|
|
3
|
+
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
# https://github.com/mrousavy/nitro
|
|
5
|
+
# Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
# This is a CMake file that adds all files generated by Nitrogen
|
|
9
|
+
# to the current CMake project.
|
|
10
|
+
#
|
|
11
|
+
# To use it, add this to your CMakeLists.txt:
|
|
12
|
+
# ```cmake
|
|
13
|
+
# include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/Aix+autolinking.cmake)
|
|
14
|
+
# ```
|
|
15
|
+
|
|
16
|
+
# Define a flag to check if we are building properly
|
|
17
|
+
add_definitions(-DBUILDING_AIX_WITH_GENERATED_CMAKE_PROJECT)
|
|
18
|
+
|
|
19
|
+
# Enable Raw Props parsing in react-native (for Nitro Views)
|
|
20
|
+
add_definitions(-DRN_SERIALIZABLE_STATE)
|
|
21
|
+
|
|
22
|
+
# Add all headers that were generated by Nitrogen
|
|
23
|
+
include_directories(
|
|
24
|
+
"../nitrogen/generated/shared/c++"
|
|
25
|
+
"../nitrogen/generated/android/c++"
|
|
26
|
+
"../nitrogen/generated/android/"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Add all .cpp sources that were generated by Nitrogen
|
|
30
|
+
target_sources(
|
|
31
|
+
# CMake project name (Android C++ library name)
|
|
32
|
+
Aix PRIVATE
|
|
33
|
+
# Autolinking Setup
|
|
34
|
+
../nitrogen/generated/android/AixOnLoad.cpp
|
|
35
|
+
# Shared Nitrogen C++ sources
|
|
36
|
+
../nitrogen/generated/shared/c++/HybridAixSpec.cpp
|
|
37
|
+
../nitrogen/generated/shared/c++/views/HybridAixComponent.cpp
|
|
38
|
+
../nitrogen/generated/shared/c++/HybridAixCellViewSpec.cpp
|
|
39
|
+
../nitrogen/generated/shared/c++/views/HybridAixCellViewComponent.cpp
|
|
40
|
+
../nitrogen/generated/shared/c++/HybridAixComposerSpec.cpp
|
|
41
|
+
../nitrogen/generated/shared/c++/views/HybridAixComposerComponent.cpp
|
|
42
|
+
# Android-specific Nitrogen C++ sources
|
|
43
|
+
../nitrogen/generated/android/c++/JHybridAixSpec.cpp
|
|
44
|
+
../nitrogen/generated/android/c++/views/JHybridAixStateUpdater.cpp
|
|
45
|
+
../nitrogen/generated/android/c++/JHybridAixCellViewSpec.cpp
|
|
46
|
+
../nitrogen/generated/android/c++/views/JHybridAixCellViewStateUpdater.cpp
|
|
47
|
+
../nitrogen/generated/android/c++/JHybridAixComposerSpec.cpp
|
|
48
|
+
../nitrogen/generated/android/c++/views/JHybridAixComposerStateUpdater.cpp
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
|
|
52
|
+
# Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
|
|
53
|
+
target_compile_definitions(
|
|
54
|
+
Aix PRIVATE
|
|
55
|
+
-DFOLLY_NO_CONFIG=1
|
|
56
|
+
-DFOLLY_HAVE_CLOCK_GETTIME=1
|
|
57
|
+
-DFOLLY_USE_LIBCPP=1
|
|
58
|
+
-DFOLLY_CFG_NO_COROUTINES=1
|
|
59
|
+
-DFOLLY_MOBILE=1
|
|
60
|
+
-DFOLLY_HAVE_RECVMMSG=1
|
|
61
|
+
-DFOLLY_HAVE_PTHREAD=1
|
|
62
|
+
# Once we target android-23 above, we can comment
|
|
63
|
+
# the following line. NDK uses GNU style stderror_r() after API 23.
|
|
64
|
+
-DFOLLY_HAVE_XSI_STRERROR_R=1
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# Add all libraries required by the generated specs
|
|
68
|
+
find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
|
|
69
|
+
find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
|
|
70
|
+
find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
|
|
71
|
+
|
|
72
|
+
# Link all libraries together
|
|
73
|
+
target_link_libraries(
|
|
74
|
+
Aix
|
|
75
|
+
fbjni::fbjni # <-- Facebook C++ JNI helpers
|
|
76
|
+
ReactAndroid::jsi # <-- RN: JSI
|
|
77
|
+
react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Link react-native (different prefab between RN 0.75 and RN 0.76)
|
|
81
|
+
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
82
|
+
target_link_libraries(
|
|
83
|
+
Aix
|
|
84
|
+
ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
|
|
85
|
+
)
|
|
86
|
+
else()
|
|
87
|
+
target_link_libraries(
|
|
88
|
+
Aix
|
|
89
|
+
ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
|
|
90
|
+
)
|
|
91
|
+
endif()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// Aix+autolinking.gradle
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2026 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
/// This is a Gradle file that adds all files generated by Nitrogen
|
|
9
|
+
/// to the current Gradle project.
|
|
10
|
+
///
|
|
11
|
+
/// To use it, add this to your build.gradle:
|
|
12
|
+
/// ```gradle
|
|
13
|
+
/// apply from: '../nitrogen/generated/android/Aix+autolinking.gradle'
|
|
14
|
+
/// ```
|
|
15
|
+
|
|
16
|
+
logger.warn("[NitroModules] 🔥 Aix is boosted by nitro!")
|
|
17
|
+
|
|
18
|
+
android {
|
|
19
|
+
sourceSets {
|
|
20
|
+
main {
|
|
21
|
+
java.srcDirs += [
|
|
22
|
+
// Nitrogen files
|
|
23
|
+
"${project.projectDir}/../nitrogen/generated/android/kotlin"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|