Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 22adc91c1e | |||
| 61cf8e3bcc |
@@ -79,8 +79,8 @@ android {
|
|||||||
applicationId "com.ariacockpit"
|
applicationId "com.ariacockpit"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 10500
|
versionCode 10501
|
||||||
versionName "0.1.5.0"
|
versionName "0.1.5.1"
|
||||||
// Fallback fuer Libraries mit Product Flavors
|
// Fallback fuer Libraries mit Product Flavors
|
||||||
missingDimensionStrategy 'react-native-camera', 'general'
|
missingDimensionStrategy 'react-native-camera', 'general'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aria-cockpit",
|
"name": "aria-cockpit",
|
||||||
"version": "0.1.5.0",
|
"version": "0.1.5.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
|
|||||||
@@ -1425,6 +1425,11 @@ const ChatScreen: React.FC = () => {
|
|||||||
// Den aktuellen Snapshot von invertedMessages holen wir via Ref.
|
// Den aktuellen Snapshot von invertedMessages holen wir via Ref.
|
||||||
const invertedMessagesRef = useRef(invertedMessages);
|
const invertedMessagesRef = useRef(invertedMessages);
|
||||||
invertedMessagesRef.current = invertedMessages;
|
invertedMessagesRef.current = invertedMessages;
|
||||||
|
// Schaetzwert fuer durchschnittliche Bubble-Hoehe. Wird fuer den
|
||||||
|
// ersten Pre-Scroll genutzt wenn FlatList noch keine Layouts hat.
|
||||||
|
// 150 px ist Mittel zwischen kurzen Voice-Bubbles (~70) und langen
|
||||||
|
// ARIA-Antworten (~250).
|
||||||
|
const AVG_BUBBLE_HEIGHT = 150;
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!searchMatchIds.length) {
|
if (!searchMatchIds.length) {
|
||||||
lastSearchScrollKey.current = '';
|
lastSearchScrollKey.current = '';
|
||||||
@@ -1442,12 +1447,27 @@ const ChatScreen: React.FC = () => {
|
|||||||
clearPendingScrollRetry();
|
clearPendingScrollRetry();
|
||||||
const idx = invertedMessagesRef.current.findIndex(m => m.id === id);
|
const idx = invertedMessagesRef.current.findIndex(m => m.id === id);
|
||||||
if (idx < 0 || !flatListRef.current) return;
|
if (idx < 0 || !flatListRef.current) return;
|
||||||
|
// Pre-Scroll: erst grob mit konstanter Hoehe in die Naehe springen.
|
||||||
|
// Damit hat FlatList ueberhaupt die Chance die Layouts der Bubbles in
|
||||||
|
// der Naehe zu rendern — sonst basiert info.averageItemLength im
|
||||||
|
// Failed-Handler nur auf den ersten 10 Items (Default initialNumToRender)
|
||||||
|
// und liefert beim ersten Such-Versuch nach App-Start einen voellig
|
||||||
|
// falschen Sprung.
|
||||||
|
try {
|
||||||
|
flatListRef.current?.scrollToOffset({
|
||||||
|
offset: idx * AVG_BUBBLE_HEIGHT,
|
||||||
|
animated: false,
|
||||||
|
});
|
||||||
|
} catch {}
|
||||||
|
// Nach kurzer Render-Pause praezise nachsetzen
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
||||||
try {
|
setTimeout(() => {
|
||||||
flatListRef.current?.scrollToIndex({ index: idx, animated: true, viewPosition: 0 });
|
try {
|
||||||
} catch {
|
flatListRef.current?.scrollToIndex({ index: idx, animated: true, viewPosition: 0 });
|
||||||
// onScrollToIndexFailed-Handler uebernimmt den Fallback
|
} catch {
|
||||||
}
|
// onScrollToIndexFailed-Handler uebernimmt den Fallback
|
||||||
|
}
|
||||||
|
}, 80);
|
||||||
});
|
});
|
||||||
}, [searchIndex, searchMatchIds]);
|
}, [searchIndex, searchMatchIds]);
|
||||||
|
|
||||||
@@ -2159,6 +2179,13 @@ const ChatScreen: React.FC = () => {
|
|||||||
ref={flatListRef}
|
ref={flatListRef}
|
||||||
inverted
|
inverted
|
||||||
data={invertedMessages}
|
data={invertedMessages}
|
||||||
|
// Mehr Items beim Mount messen → bessere averageItemLength fuer
|
||||||
|
// Such-Sprung gleich nach App-Start. Default sind 10 Items, das
|
||||||
|
// ist bei 300+ Bubbles im Backup viel zu wenig.
|
||||||
|
initialNumToRender={30}
|
||||||
|
// Mehr Items im Speicher halten (Default 21 = 10 oben + 10 unten).
|
||||||
|
// Macht scroll-to-far-away weniger anfaellig fuer Layout-Holes.
|
||||||
|
windowSize={41}
|
||||||
onScroll={(e) => {
|
onScroll={(e) => {
|
||||||
// Bei inverted FlatList: contentOffset.y > 0 = weg von "unten"
|
// Bei inverted FlatList: contentOffset.y > 0 = weg von "unten"
|
||||||
// (= aelter scrollen). Wir zeigen den Jump-Down-Button ab ~250px.
|
// (= aelter scrollen). Wir zeigen den Jump-Down-Button ab ~250px.
|
||||||
|
|||||||
Reference in New Issue
Block a user