Advanced Search and Filters

To improve the search functionality, we can add multiple filters such as category, completion status, and keyword search.

Implementing Advanced Search

  1. Define Filter States:
javascriptCopy codeconst [completionFilter, setCompletionFilter] = useState('all');
  1. Update the Filter Logic:

When filtering items, check against multiple criteria:

javascriptCopy codeconst filteredItems = items.filter(item => {
  const matchesCompletion = completionFilter === 'all' || (completionFilter === 'completed' && item.completed) || (completionFilter === 'uncompleted' && !item.completed);
  const matchesCategory = item.category === selectedCategory || selectedCategory === 'all';
  const matchesSearch = item.text.toLowerCase().includes(searchQuery.toLowerCase());
  return matchesCompletion && matchesCategory && matchesSearch;
});
  1. Add UI Elements for Filters:

Include dropdowns or pickers for completion status and categories, allowing users to select their filters:

javascriptCopy code<Picker
  selectedValue={completionFilter}
  onValueChange={(itemValue) => setCompletionFilter(itemValue)}
>
  <Picker.Item label="All" value="all" />
  <Picker.Item label="Completed" value="completed" />
  <Picker.Item label="Uncompleted" value="uncompleted" />
</Picker>

Step 2: Offline Support

To implement offline support, you can use libraries like @react-native-async-storage/async-storage or even better, use Firestore’s built-in offline capabilities.

Enable Firestore Offline Persistence

  1. Enable Persistence:

In your firebaseConfig.js, enable persistence like this:

javascriptCopy codeimport { enablePersistence } from 'firebase/firestore';

enablePersistence(db)
  .catch((err) => {
    if (err.code === 'failed-precondition') {
      // Multiple tabs open, persistence can only be enabled in one tab at a time.
    } else if (err.code === 'unimplemented') {
      // The current browser does not support all of the features required to enable persistence
    }
  });
  1. Sync Data:

When users are offline, the app can still function normally, and Firestore will sync data when the user is back online.

Step 3: User Preferences

Allow users to customize their experience by adding a settings screen where they can adjust preferences like theme and default filters.

Implementing User Preferences

  1. Create a Settings Screen:

You can create a new component for settings:

javascriptCopy codeconst Settings = ({ navigation }) => {
  const [theme, setTheme] = useState('light');

  const savePreferences = async () => {
    await AsyncStorage.setItem('userTheme', theme);
  };

  useEffect(() => {
    const loadPreferences = async () => {
      const storedTheme = await AsyncStorage.getItem('userTheme');
      if (storedTheme) {
        setTheme(storedTheme);
      }
    };
    loadPreferences();
  }, []);

  return (
    <View>
      <Text>Choose Theme:</Text>
      <Picker
        selectedValue={theme}
        onValueChange={(itemValue) => setTheme(itemValue)}
      >
        <Picker.Item label="Light" value="light" />
        <Picker.Item label="Dark" value="dark" />
      </Picker>
      <Button onPress={savePreferences}>Save Preferences</Button>
    </View>
  );
};
  1. Navigation:

Add a button in your main app to navigate to the Settings screen.

Step 4: Analytics Dashboard

Provide users with insights into their item lists, such as completion rates, item categories, and trends over time.

Implementing Analytics

  1. Calculate Metrics:

Create functions to calculate metrics based on user data:

javascriptCopy codeconst getCompletionRate = () => {
  const completedItems = items.filter(item => item.completed).length;
  return (completedItems / items.length) * 100;
};

const getCategoryCounts = () => {
  return items.reduce((acc, item) => {
    acc[item.category] = (acc[item.category] || 0) + 1;
    return acc;
  }, {});
};
  1. Display Analytics:

Create a new component to show these metrics:

javascriptCopy codeconst Analytics = () => {
  const completionRate = getCompletionRate();
  const categoryCounts = getCategoryCounts();

  return (
    <View>
      <Text>Completion Rate: {completionRate}%</Text>
      <Text>Category Breakdown:</Text>
      {Object.entries(categoryCounts).map(([category, count]) => (
        <Text key={category}>{`${category}: ${count}`}</Text>
      ))}
    </View>
  );
};

Comments

Leave a Reply

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