My Blog

My WordPress Blog

My Blog

My WordPress Blog

Update the App to Use React Native Paper

First, let’s integrate React Native Paper components into our app.

Install Dependencies

If you haven’t already, ensure you have the dependencies installed:

bashCopy codenpm install react-native-paper

You’ll also need to set up react-native-vector-icons for icons used in React Native Paper:

bashCopy codenpm install react-native-vector-icons

Update App.js

Here’s an updated version of App.js that uses React Native Paper components:

javascriptCopy codeimport React, { useEffect, useState } from 'react';
import { StyleSheet, View, FlatList, Alert } from 'react-native';
import { Provider as PaperProvider, TextInput, Button, List, Picker, Appbar } from 'react-native-paper';
import AsyncStorage from '@react-native-async-storage/async-storage';

const App = () => {
  const [items, setItems] = useState([]);
  const [textInput, setTextInput] = useState('');
  const [editIndex, setEditIndex] = useState(null);
  const [filter, setFilter] = useState('all');
  const [searchQuery, setSearchQuery] = useState('');

  useEffect(() => {
const loadItems = async () => {
  try {
    const storedItems = await AsyncStorage.getItem('items');
    if (storedItems) {
      setItems(JSON.parse(storedItems));
    }
  } catch (error) {
    console.error(error);
  }
};
loadItems();
}, []); useEffect(() => {
const saveItems = async () => {
  try {
    await AsyncStorage.setItem('items', JSON.stringify(items));
  } catch (error) {
    console.error(error);
  }
};
saveItems();
}, [items]); const addItem = () => {
if (textInput.trim()) {
  const newItem = { key: textInput, completed: false };
  if (editIndex !== null) {
    const updatedItems = items.map((item, index) =>
      index === editIndex ? newItem : item
    );
    setItems(updatedItems);
    setEditIndex(null);
  } else {
    setItems([...items, newItem]);
  }
  setTextInput('');
}
}; const deleteItem = (itemToDelete) => {
setItems(items.filter(item => item.key !== itemToDelete));
}; const confirmDelete = (item) => {
Alert.alert(
  'Delete Item',
  Are you sure you want to delete "${item.key}"?,
  [
    { text: 'Cancel', style: 'cancel' },
    { text: 'OK', onPress: () => deleteItem(item.key) },
  ],
  { cancelable: true }
);
}; const toggleCompletion = (item) => {
const updatedItems = items.map(i =>
  i.key === item.key ? { ...i, completed: !i.completed } : i
);
setItems(updatedItems);
}; const startEditing = (item, index) => {
setTextInput(item.key);
setEditIndex(index);
}; // Filtering items based on the selected filter const filteredItems = items.filter(item => {
const matchesFilter = (filter === 'all' || (filter === 'completed' && item.completed) || (filter === 'uncompleted' && !item.completed));
const matchesSearch = item.key.toLowerCase().includes(searchQuery.toLowerCase());
return matchesFilter && matchesSearch;
}); return (
<PaperProvider>
  <Appbar.Header>
    <Appbar.Content title="My Item List" />
  </Appbar.Header>
  <View style={styles.container}>
    <TextInput
      label="Add or edit an item"
      value={textInput}
      onChangeText={setTextInput}
      style={styles.input}
    />
    <Button mode="contained" onPress={addItem}>
      {editIndex !== null ? "Update Item" : "Add Item"}
    </Button>
    <TextInput
      label="Search items"
      value={searchQuery}
      onChangeText={setSearchQuery}
      style={styles.input}
    />
    <Picker
      selectedValue={filter}
      style={styles.picker}
      onValueChange={(itemValue) => setFilter(itemValue)}
    >
      <Picker.Item label="All" value="all" />
      <Picker.Item label="Completed" value="completed" />
      <Picker.Item label="Uncompleted" value="uncompleted" />
    </Picker>
    <FlatList
      data={filteredItems}
      renderItem={({ item }) => (
        <List.Item
          title={item.key}
          onPress={() => toggleCompletion(item)}
          right={props => (
            <Button onPress={() => startEditing(item)}>Edit</Button>
          )}
          onLongPress={() => confirmDelete(item)}
          style={[styles.item, item.completed && styles.completedItem]}
        />
      )}
      keyExtractor={(item) => item.key}
    />
  </View>
</PaperProvider>
); }; const styles = StyleSheet.create({ container: {
flex: 1,
padding: 20,
backgroundColor: '#fff',
}, input: {
marginBottom: 10,
}, picker: {
height: 50,
width: 150,
marginBottom: 10,
}, item: {
padding: 10,
}, completedItem: {
textDecorationLine: 'line-through',
color: 'gray',
}, }); export default App;
Update the App to Use React Native Paper

Leave a Reply

Your email address will not be published. Required fields are marked *

Scroll to top