import { useState, useEffect } from "react"; import { Modal, ModalOverlay, ModalContent, ModalHeader, HStack, ModalCloseButton, ModalBody, Text, Input, Center, Button, Box, } from "@chakra-ui/react"; import { DeleteIcon } from "@chakra-ui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faSave } from "@fortawesome/free-solid-svg-icons"; import { slicedText } from "../../TransactionRequests"; import { SecureStorage } from "@/utils/encryption"; import { validateAddress } from "@/utils/security"; import { STORAGE_KEYS } from "@/utils/constants"; const secureStorage = new SecureStorage(); interface SavedAddressInfo { address: string; label: string; } interface AddressBookParams { isAddressBookOpen: boolean; closeAddressBook: () => void; showAddress: string; setShowAddress: (value: string) => void; setAddress: (value: string) => void; } function AddressBook({ isAddressBookOpen, closeAddressBook, showAddress, setShowAddress, setAddress, }: AddressBookParams) { const [newAddressInput, setNewAddressInput] = useState(""); const [newLableInput, setNewLabelInput] = useState(""); const [savedAddresses, setSavedAddresses] = useState([]); useEffect(() => { const loadAddresses = async () => { try { const stored = await secureStorage.getItem(STORAGE_KEYS.ADDRESS_BOOK); if (stored) { const parsed = JSON.parse(stored) as SavedAddressInfo[]; setSavedAddresses(parsed); } } catch (error) { console.error("Failed to load address book:", error); // Try to migrate from plain localStorage try { const legacy = localStorage.getItem("address-book"); if (legacy) { const parsed = JSON.parse(legacy) as SavedAddressInfo[]; await secureStorage.setItem(STORAGE_KEYS.ADDRESS_BOOK, legacy); localStorage.removeItem("address-book"); setSavedAddresses(parsed); } } catch (migrationError) { console.error("Failed to migrate address book:", migrationError); } } }; loadAddresses(); }, []); useEffect(() => { setNewAddressInput(showAddress); }, [showAddress]); useEffect(() => { const saveAddresses = async () => { if (savedAddresses.length > 0) { try { await secureStorage.setItem( STORAGE_KEYS.ADDRESS_BOOK, JSON.stringify(savedAddresses) ); } catch (error) { console.error("Failed to save address book:", error); } } else { secureStorage.removeItem(STORAGE_KEYS.ADDRESS_BOOK); } }; saveAddresses(); }, [savedAddresses]); // reset label when modal is reopened useEffect(() => { setNewLabelInput(""); }, [isAddressBookOpen]); return ( Address Book setNewAddressInput(e.target.value)} /> setNewLabelInput(e.target.value)} />
{savedAddresses.length > 0 && ( Select from saved addresses: {savedAddresses.map(({ address, label }, i) => ( ))} )}
); } export default AddressBook;