import AsyncStorage from "@react-native-async-storage/async-storage"; import * as Notifications from "expo-notifications"; import React, { useEffect, useState } from "react"; import { Linking, ScrollView, Text, TextInput, TouchableOpacity, View } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import { Category, categories, categoryKeys, categoryTitles } from "types/Category"; import { Item } from "types/Item"; import { usePushNotifications } from "../hooks/usePushNotifications"; import { styles } from "../styles/HomeScreen.styles"; const API_URL = "https://notifier.gansejunge.com"; const STORAGE_KEY = "notifications"; const API_KEY_STORAGE = "api_key"; export default function HomeScreen() { const [data, setData] = useState([]); const [selected, setSelected] = useState("home"); const [menuOpen, setMenuOpen] = useState(false); const [apiKey, setApiKey] = useState(null); const [tempKey, setTempKey] = useState(""); const pushToken = usePushNotifications({ apiKey, backendUrl: API_URL, appVersion: "1.0.0", locale: "en-uk", }); // Load API key on startup useEffect(() => { (async () => { const storedKey = await AsyncStorage.getItem(API_KEY_STORAGE); if (storedKey) setApiKey(storedKey); })(); }, []); // Load saved notifications useEffect(() => { (async () => { try { const stored = await AsyncStorage.getItem(STORAGE_KEY); if (stored) setData(JSON.parse(stored)); } catch (err) { console.error("Failed to load stored notifications:", err); } })(); }, []); // Listen for incoming notifications useEffect(() => { const subscription = Notifications.addNotificationReceivedListener(notification => { const rawCategory = notification.request.content.data?.category as Category | undefined; const category: Category = rawCategory && categoryKeys.includes(rawCategory) ? rawCategory : "home"; const item: Item = { timestamp: Date.now(), category, title: notification.request.content.title || "No title", info: notification.request.content.body || "No description", link: (notification.request.content.data?.link as string) || "#", }; setData(prev => { const updated = [...prev, item].sort((a, b) => b.timestamp - a.timestamp); AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(updated)); return updated; }); }); return () => subscription.remove(); }, []); const filteredData = selected === "home" ? data : data.filter(item => item.category === selected); const menuItems = categories; if (!apiKey) { return ( Enter API Key: { await AsyncStorage.setItem(API_KEY_STORAGE, tempKey); setApiKey(tempKey); }} style={{ backgroundColor: "blue", padding: 10 }} > Save ); } return ( {/* Side Menu */} {menuItems.map(item => ( { setSelected(item.key); setMenuOpen(false); }} > {item.label} ))} {/* Main Content */} setMenuOpen(!menuOpen)}> {categoryTitles[selected]} {filteredData.length === 0 ? ( No items yet ) : ( filteredData.map(item => ( {item.title} {item.info} Linking.openURL(item.link)}> Read more )) )} ); }