diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index c56c5da..04c1b11 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -15,6 +15,7 @@ import { FilterSidebar } from './components/FilterSidebar/FilterSidebar'; import { FILTER_OPTIONS } from './graphql/filterOptions'; import { useDebounce } from './hooks/useDebounce'; import { defaultFilters, toFilterInput, type GameFilters } from './types/filters'; +import { Login } from './pages/Login/Login'; //dette er antall spill per side const PAGE_SIZE = 20; @@ -271,6 +272,8 @@ function App() { element={} /> + } /> + {/* Ukjente adresser sendes til forsiden */} } /> diff --git a/frontend/src/apollo.ts b/frontend/src/apollo.ts index 418c1c5..e85a9dc 100644 --- a/frontend/src/apollo.ts +++ b/frontend/src/apollo.ts @@ -1,4 +1,6 @@ -import { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client'; +import { ApolloClient, ApolloLink, HttpLink, InMemoryCache } from '@apollo/client'; +import { SetContextLink } from '@apollo/client/link/context'; +import { getToken } from './auth/token'; /** * Felles GraphQL-klient for hele appen. Svar caches i minnet, så samme søk @@ -6,8 +8,23 @@ import { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client'; * Se vite.config.ts. */ +// Sender selve forespørselen til backend +const httpLink = new HttpLink({ uri: `${import.meta.env.BASE_URL}graphql` }); + +// Legger tokenet i headeren på hver forespørsel, hvis brukeren er innlogget +const authLink = new SetContextLink((prevContext) => { + const token = getToken(); + return { + headers: { + ...prevContext.headers, + ...(token ? { authorization: `Bearer ${token}` } : {}), + }, + }; +}); + export const client = new ApolloClient({ - link: new HttpLink({ uri: `${import.meta.env.BASE_URL}graphql` }), + // Rekkefølgen betyr noe: først legges tokenet på, så sendes forespørselen + link: ApolloLink.from([authLink, httpLink]), cache: new InMemoryCache({ typePolicies: { // Sjangre og plattformer er begge "Facet" og kan ha samme id. diff --git a/frontend/src/auth/token.ts b/frontend/src/auth/token.ts new file mode 100644 index 0000000..2a3334d --- /dev/null +++ b/frontend/src/auth/token.ts @@ -0,0 +1,8 @@ +/** + * Henter nøkkel, og legger inn mulighet for å lagre og slette nøkkelen + */ + +const KEY = 'token'; +export const getToken = () => localStorage.getItem(KEY); +export const saveToken = (token: string) => localStorage.setItem(KEY, token); +export const removeToken = () => localStorage.removeItem(KEY); diff --git a/frontend/src/components/Header/Header.tsx b/frontend/src/components/Header/Header.tsx index c9dd7f3..5a7405e 100644 --- a/frontend/src/components/Header/Header.tsx +++ b/frontend/src/components/Header/Header.tsx @@ -3,6 +3,8 @@ import { GameSearch } from '../GameSearch/GameSearch'; import type { Suggestion } from '../../graphql/searchSuggestions'; import { ThemeToggle } from '../ThemeToggle/ThemeToggle'; import './Header.css'; +import { useAuth } from '../../hooks/useAuth'; +import { Link } from 'react-router'; interface HeaderProps { onSearch: (term: string) => void; @@ -27,6 +29,7 @@ export function Header({ showFavorites, onToggleFavorites, }: HeaderProps) { + const { user, logOut } = useAuth(); return (
@@ -34,6 +37,16 @@ export function Header({