143 lines
3.4 KiB
TypeScript
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" },
|
|
});
|