import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, FlatList, StyleSheet } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
export default function OfflineNotes() {
const [note, setNote] = useState('');
const [notes, setNotes] = useState([]);
useEffect(() => {
const loadNotes = async () => {
try {
const savedNotes = await AsyncStorage.getItem('notes');
if (savedNotes) {
setNotes(JSON.parse(savedNotes));
}
} catch (e) {
console.error('Failed to load notes.', e);
}
};
loadNotes();
}, []);
const saveNote = async () => {
if (note.trim() === '') return;
const newNotes = [...notes, note.trim()];
try {
await AsyncStorage.setItem('notes', JSON.stringify(newNotes));
setNotes(newNotes);
setNote('');
} catch (e) {
console.error('Failed to save note.', e);
}
};
return (
<View style={styles.container}>
<Text style={styles.title}>Offline Notes</Text>
<TextInput
style={styles.input}
placeholder="Type your note here"
value={note}
onChangeText={setNote}
accessibilityLabel="Note input field"
/>
<Button title="Save Note" onPress={saveNote} accessibilityLabel="Save note button" />
<Text style={styles.subtitle}>Saved Notes:</Text>
<FlatList
data={notes}
keyExtractor={(item, index) => index.toString()}
renderItem={({ item }) => <Text style={styles.noteItem}>- {item}</Text>}
accessibilityLabel="List of saved notes"
/>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 20, backgroundColor: '#fff' },
title: { fontSize: 24, fontWeight: 'bold', marginBottom: 10 },
input: { borderColor: '#ccc', borderWidth: 1, padding: 10, marginBottom: 10, borderRadius: 4 },
subtitle: { fontSize: 18, marginTop: 20, marginBottom: 10 },
noteItem: { fontSize: 16, marginBottom: 5 }
});This app uses AsyncStorage to save notes locally on the device. When the app starts, it loads any saved notes from local storage so the user can see them even without internet.
When the user types a note and taps Save, the note is added to the list and saved back to AsyncStorage. This means the data stays on the device and is available offline.
We use React Native's useEffect to load notes once on mount, and useState to manage the notes list and input. Accessibility labels help screen readers identify inputs and buttons.
This approach shows how local data storage enables offline experience by keeping user data on the device.