From 487943c6aa7b3c42432b9c89cd3be960dd97c38a Mon Sep 17 00:00:00 2001 From: Kristoffer Fredrik Dahle Melen Date: Sun, 13 Sep 2026 23:09:46 +0200 Subject: [PATCH 1/2] Added Tanstack Query, and made the searchbar actually search on submit --- package-lock.json | 6 --- webdev-prosjekt1/package-lock.json | 27 +++++++++++++ webdev-prosjekt1/package.json | 1 + webdev-prosjekt1/src/App.tsx | 39 +++++++++++++++++-- webdev-prosjekt1/src/components/Searchbar.tsx | 23 +++++++++-- webdev-prosjekt1/src/main.tsx | 7 +++- 6 files changed, 89 insertions(+), 14 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 64b3008..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "T04-Project-1", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/webdev-prosjekt1/package-lock.json b/webdev-prosjekt1/package-lock.json index c8fbc13..d64e3da 100644 --- a/webdev-prosjekt1/package-lock.json +++ b/webdev-prosjekt1/package-lock.json @@ -8,6 +8,7 @@ "name": "webdev-prosjekt1", "version": "0.0.0", "dependencies": { + "@tanstack/react-query": "^5.102.8", "react": "^19.2.8", "react-dom": "^19.2.8" }, @@ -817,6 +818,32 @@ "dev": true, "license": "MIT" }, + "node_modules/@tanstack/query-core": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.8.tgz", + "integrity": "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.8.tgz", + "integrity": "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.102.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", diff --git a/webdev-prosjekt1/package.json b/webdev-prosjekt1/package.json index 00003ce..76c7624 100644 --- a/webdev-prosjekt1/package.json +++ b/webdev-prosjekt1/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@tanstack/react-query": "^5.102.8", "react": "^19.2.8", "react-dom": "^19.2.8" }, diff --git a/webdev-prosjekt1/src/App.tsx b/webdev-prosjekt1/src/App.tsx index 33ddc37..9b1a634 100644 --- a/webdev-prosjekt1/src/App.tsx +++ b/webdev-prosjekt1/src/App.tsx @@ -5,13 +5,33 @@ import { Searchbar } from './components/Searchbar'; import filterIcon from './assets/filter.png'; import musicWizImage from './assets/musicwiz.png'; import logoImage from './assets/music-wiz-logo.png'; +import { useState } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { search } from './api/spotify'; function App() { + const [query, setQuery] = useState(''); + + const handleSearch = (nextQuery: string) => { + setQuery(nextQuery); + }; + + const { + data: results, + isLoading, + isFetching, + isError, + error, + } = useQuery({ + queryKey: ['search', query], + queryFn: () => search(query), + enabled: query.trim().length > 0, + }); + return ( <>
-
- +
+
+ {isLoading || isFetching ? ( +

Searching...

+ ) : isError ? ( +

Search failed: {error instanceof Error ? error.message : 'Unknown error'}

+ ) : results?.tracks.length ? ( + results.tracks.map((track) => ( +

{track.name}

+ )) + ) : query ? ( +

No tracks found.

+ ) : null} +
A musical wizard @@ -40,7 +73,7 @@ function App() {
- ) + ); } export default App; diff --git a/webdev-prosjekt1/src/components/Searchbar.tsx b/webdev-prosjekt1/src/components/Searchbar.tsx index d07b068..d69561b 100644 --- a/webdev-prosjekt1/src/components/Searchbar.tsx +++ b/webdev-prosjekt1/src/components/Searchbar.tsx @@ -1,11 +1,26 @@ import './Searchbar.css'; import '../variables.css'; +import { useState } from 'react'; + +type SearchbarProps = { + onSearch: (query: string) => void; +}; + +export const Searchbar = ({ onSearch }: SearchbarProps) => { + const [query, setQuery] = useState(''); + + const handleSubmit = (event: React.SubmitEvent) => { + event.preventDefault(); + + if (!query.trim()) return; + + onSearch(query.trim()); + }; -export const Searchbar = () => { return ( -