Skip to content

Commit ac94d4c

Browse files
authored
Merge pull request #82 from BuidlGuidl/feat/order-previous-searches
Feat/order previous searches
2 parents f50dfcc + 41d9d6a commit ac94d4c

File tree

5 files changed

+67
-247
lines changed

5 files changed

+67
-247
lines changed

packages/nextjs/.env.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
# To access the values stored in this env file you can use: process.env.VARIABLENAME
77
# You'll need to prefix the variables names with NEXT_PUBLIC_ if you want to access them on the client side.
88
# More info: https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables
9-
NEXT_PUBLIC_COVALENT_API_KEY=
109
NEXT_PUBLIC_OPENSEA_API_KEY=
10+
NEXT_PUBLIC_ALCHEMY_API_KEY=
11+
NEXT_PUBLIC_MORALIS_API_KEY=

packages/nextjs/components/address-vision/Navbar.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import { QrCodeIcon, XMarkIcon } from "@heroicons/react/24/outline";
1010
import { useAddressStore, useNetworkBalancesStore } from "~~/services/store/store";
1111
import { notification } from "~~/utils/scaffold-eth";
1212

13+
interface AddressEntry {
14+
address: Address;
15+
timestamp: number;
16+
}
17+
1318
export const Navbar = () => {
1419
const [inputValue, setInputValue] = useState("");
1520
const [isScannerVisible, setIsScannerVisible] = useState(false);
@@ -23,13 +28,19 @@ export const Navbar = () => {
2328
const { resetBalances } = useNetworkBalancesStore();
2429

2530
useEffect(() => {
26-
if (resolvedAddress && !inputChanged) {
31+
if (resolvedAddress) {
2732
const savedAddresses = localStorage.getItem("searchedAddresses");
28-
const addresses = savedAddresses ? JSON.parse(savedAddresses) : [];
29-
if (!addresses.includes(resolvedAddress)) {
30-
addresses.unshift(resolvedAddress);
31-
localStorage.setItem("searchedAddresses", JSON.stringify(addresses));
32-
}
33+
const addresses: AddressEntry[] = savedAddresses ? JSON.parse(savedAddresses) : [];
34+
35+
const filteredAddresses = addresses.filter(entry => entry.address !== resolvedAddress);
36+
37+
const newEntry = {
38+
address: resolvedAddress,
39+
timestamp: Date.now(),
40+
};
41+
42+
const updatedAddresses = [newEntry, ...filteredAddresses];
43+
localStorage.setItem("searchedAddresses", JSON.stringify(updatedAddresses));
3344
}
3445
}, [resolvedAddress]);
3546

packages/nextjs/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
"vercel:yolo": "vercel --build-env NEXT_PUBLIC_IGNORE_BUILD_ERROR=true"
1515
},
1616
"dependencies": {
17-
"@covalenthq/client-sdk": "^0.4.2",
1817
"@ethersproject/providers": "^5.7.2",
1918
"@heroicons/react": "^2.0.11",
2019
"@tanstack/react-query": "^5.49.0",

packages/nextjs/pages/index.tsx

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,49 @@ import { Navbar } from "~~/components/address-vision/";
77
import { SmallAddressComp } from "~~/components/scaffold-eth";
88

99
const Home: NextPage = () => {
10-
const [previousAddresses, setPreviousAddresses] = useState<Address[]>([]);
10+
interface AddressEntry {
11+
address: Address;
12+
timestamp: number;
13+
}
14+
15+
const [previousAddresses, setPreviousAddresses] = useState<AddressEntry[]>([]);
1116

1217
useEffect(() => {
1318
const savedAddresses = localStorage.getItem("searchedAddresses");
1419
if (savedAddresses) {
15-
setPreviousAddresses(JSON.parse(savedAddresses));
20+
try {
21+
const parsed = JSON.parse(savedAddresses);
22+
23+
// Handle both old format (array of strings) and new format (array of AddressEntry)
24+
const addresses: AddressEntry[] = Array.isArray(parsed)
25+
? parsed.map(item => {
26+
if (typeof item === "string") {
27+
// Convert old format to new format
28+
return {
29+
address: item as Address,
30+
timestamp: Date.now(),
31+
};
32+
}
33+
return item;
34+
})
35+
: [];
36+
37+
const sortedAddresses = addresses.sort((a, b) => b.timestamp - a.timestamp);
38+
setPreviousAddresses(sortedAddresses);
39+
40+
// Save in new format
41+
localStorage.setItem("searchedAddresses", JSON.stringify(sortedAddresses));
42+
} catch (error) {
43+
console.error("Error parsing saved addresses:", error);
44+
localStorage.removeItem("searchedAddresses"); // Clear invalid data
45+
}
1646
}
1747
}, []);
1848

1949
const removeAddress = (addressToRemove: string) => {
20-
const updatedAddresses = previousAddresses.filter(address => address !== addressToRemove);
50+
const updatedAddresses = previousAddresses.filter(
51+
entry => entry.address.toLowerCase() !== addressToRemove.toLowerCase(),
52+
);
2153
setPreviousAddresses(updatedAddresses);
2254
localStorage.setItem("searchedAddresses", JSON.stringify(updatedAddresses));
2355
};
@@ -27,11 +59,15 @@ const Home: NextPage = () => {
2759
<MetaHeader />
2860
<Navbar />
2961
{previousAddresses.length > 0 && (
30-
<div className="w-full flex flex-grow flex-col items-center md:mt-10 h-52 md:h-8">
62+
<div className="w-full flex flex-grow flex-col items-center md:mt-10 h-52">
3163
<h2 className="text-2xl mb-4">Previous Searches</h2>
3264
<div className="w-full md:w-1/2 flex flex-wrap justify-center items-center gap-4 overflow-y-auto">
33-
{previousAddresses.map(address => (
34-
<SmallAddressComp key={address} address={address} removeAddress={() => removeAddress(address)} />
65+
{previousAddresses.map(entry => (
66+
<SmallAddressComp
67+
key={entry.address}
68+
address={entry.address as Address}
69+
removeAddress={() => removeAddress(entry.address)}
70+
/>
3571
))}
3672
</div>
3773
</div>

0 commit comments

Comments
 (0)