Files
lst/mobileLst/app/index.tsx

143 lines
3.4 KiB
TypeScript

import * as Updates from "expo-updates";
import React, { useState } from "react";
import {
Button,
FlatList,
Pressable,
StyleSheet,
Text,
TextInput,
View,
} from "react-native";
export default function App() {
const [buffer, setBuffer] = useState("");
const [items, setItems] = useState<string[]>([]);
const [status, setStatus] = useState("");
const [updates, setUpdates] = useState("");
const handleChange = (text: string) => {
// Scanner "types" characters then appends Enter (\n)
if (text.endsWith("\n")) {
const code = text.trim(); // Remove newline
handleScan(code);
setBuffer(""); // Reset for next scan
} else {
setBuffer(text);
}
};
async function checkServerUpdate() {
setUpdates("Checking for updates...");
try {
const cacheBuster = `?t=${Date.now()}`;
const res = await Updates.checkForUpdateAsync();
console.log("Update check result:", res);
if (res.isAvailable) {
setUpdates("Update available! Downloading...");
const fetchResult = await Updates.fetchUpdateAsync();
console.log("Fetch result:", fetchResult);
if (fetchResult.isNew) {
setUpdates("Update downloaded! Reloading app...");
// Add a small delay to ensure everything is ready
setTimeout(() => {
Updates.reloadAsync();
}, 1000);
} else {
setUpdates("Update download completed but no new bundle?");
}
} else {
setUpdates("No new update available.");
}
} catch (e: any) {
console.error("Update error:", e);
setUpdates(`Update failed: ${e.message}`);
}
}
const handleScan = (code: string) => {
//console.log("Scanned:", code);
if (code.toUpperCase().startsWith("LOC")) {
console.log("Triggered relocate to lane");
performRelocate(code);
} else {
setItems((prev) => [...prev, code]);
setStatus(`Added: ${code}`);
}
};
const performRelocate = (locationCode: string) => {
if (items.length === 0) {
setStatus(`Relocate to ${locationCode} requested, but no items`);
return;
}
// Do your API call or whatever the "relocate" means
console.log("Relocating", items, "to", locationCode);
setStatus(`Moved ${items.length} items to ${locationCode}`);
setItems([]);
};
return (
<View style={styles.container}>
<Text>But maybe later i will be </Text>
<Button
title="Clear Items"
onPress={() => {
setItems([]);
}}
/>
<Text style={styles.title}>Scan Barcodes</Text>
{/* The working input you already have */}
<TextInput
autoFocus
value={buffer}
onChangeText={handleChange}
showSoftInputOnFocus={false}
keyboardType="visible-password"
style={{
position: "absolute",
opacity: 0, // invisible
height: 0, // takes no space
width: 0,
}}
/>
<Pressable
onPress={checkServerUpdate}
style={{
marginVertical: 12,
padding: 12,
backgroundColor: "#007AFF",
borderRadius: 6,
}}
>
<Text>Check Update</Text>
</Pressable>
<Text>Update Data</Text>
<Text>{updates}</Text>
<FlatList
data={items}
keyExtractor={(_, i) => i.toString()}
renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}
/>
<Text style={styles.status}>{status}</Text>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 16 },
title: { fontWeight: "bold", fontSize: 20 },
item: { paddingVertical: 4, fontSize: 16 },
status: { marginTop: 20, fontStyle: "italic" },
});