Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 19 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ Forsiden viser en hero-karusell med trending filmer, og seksjoner for populære
3. [api](#api)
4. [testing](#testing)
5. [prosjektstruktur](#prosjektstruktur-komponenter-hooks-layout-types)
6. [Valg?](#Valg-vi-har-gjordt-i-prosessen)
7. [Bruk av Ki](#bruk-av-ki)
6. [valg](#Valg-vi-har-gjordt-i-prosessen)
7. [bruk av Ki](#bruk-av-ki)

## oppsett

Expand Down Expand Up @@ -151,8 +151,9 @@ pnpm test
#watch-modus som kjører blir stående å kjøre tester i bakgrunnen mens du lager nye
pnpm test:run # 1 gjennomkjørign
pnpm test:run
# 1 gjennomkjøring
```

Expand Down Expand Up @@ -252,6 +253,13 @@ TreningPreview, SortfilterBar og MovieDetails har ingen egne tester som det stå
│   ├── SortFilterBar.tsx
│   ├── TrendingPreview.css
│   └── TrendingPreview.tsx
│   ├── MovieCard.test.tsx
│   ├── MovieList.test.tsx
│   ├── SearchField.test.tsx
│   ├── Sidebar.test.tsx
│   ├── sortAndFilterMovies.test.ts
│   └── __snapshots__/
│   └── Movieard.test.tsx.snap
├── hooks
│   ├── useDebouncedValue.ts
│   ├── useFavorites.ts
Expand All @@ -264,6 +272,7 @@ TreningPreview, SortfilterBar og MovieDetails har ingen egne tester som det stå
│   ├── MainLayout.tsx
│   └── SearchLayout.tsx
├── test
│   ├── utils.tsx
│   └── setup.ts
├── types
│   └── tmdb.ts
Expand Down Expand Up @@ -307,21 +316,14 @@ Overskriften rendres bare hvis title faktisk har innhold. Banner-seksjonen øver

En liten, selvutviklet komponent (ingen tredjepartsbibliotek for UI, i tråd med kravet) med en nedtrekksmeny for sortering og en range-slider for minimumsvurdering. Komponenten er "dum" — den mottar verdier og callbacks som props, og eier ingen egen state selv.

##### FavoriteButton.tsx + FavoriteButton.css
###### FavoriteButton.tsx + FavoriteButton.css

Hjerteknappen som markerer en film som favoritt. Eier ingen state selv, men får isFavorite og onToggleFavorite inn som props, slik at samme knapp kan brukes både på filmkortet og i detaljvisning.

###### MovieDetails.tsx + MovieDetails.css

Detaljvisningen som legger seg over siden når man åpner en film. Viser backdrop, tittel, utgivelsesdato, vurdering, sammendrag og skuespillere, og henter skuespillerne via `useMovieCredits` på samme måte som kortet — så cachen deles og det blir ikke et nytt kall.

###### SortFilterBar.tsx + SortFilterBar.css

Raden med sorteringsvalg og minimumsvurdering, vises på søkesiden. En
nedtrekksmeny og en slider, begge egenutviklet uten tredjepartsbibliotek.
Komponenten eier ingen state selv, den får verdier og callbacks som props fra
App.tsx. Selve sorteringen skjer i sortAndFilterMovies, ikke her.

###### TrendingPreview.tsx + TrendingPreview.css

Banneret øverst på forsiden. Viser én film om gangen med pil til venstre og
Expand Down Expand Up @@ -488,7 +490,7 @@ KI er brukt til:
- Forklaring av ting jeg ikke hadde mye kunnskap til før, da dette er første gang jeg bruker mange av ressursene vi skulle i prosjektet. Jeg stilte spørsmål om hooks, hvordan man benytter seg av komponenter og hvordan mange av de forksjellige filene henger og holder sammen.
- Diskutering av løsninger før jeg begynte å skrive kode. For eksmepel var det å lage en mobillayout litt mer krevende og hjalp med å bestemme hvilke mengde pixler som hadde passet bra til f.eks knappe størrelser.
- Feilsøking av diverse problemer. 401 mot TMDB, CSS som ikke virket eller så veldig rar ut. Det var veldig nyttig da mye av koden man skriver her ikke nødvendigvis er "feil", men bare ikke er veldig intuitiv eller ikke er best practice. Da kunne Claude fortelle om alternativer og andre muligheter man kunne prøve seg på.
- Tilgjengelighet på mobil, som f.eks hvilke aria-attributter som trengs og hvorfor. Her var det igjen hjelpelig med noen som fortalte meg hvor stor kanpper måtte være for å kunne trykkes på med tommelen på mobil før jeg kunne teste det selv på serveren.
- Tilgjengelighet på mobil, som f.eks hvilke aria-attributter som trengs og hvorfor. Her var det igjen hjelpelig med at claude fortalte meg hvor stor knapper måtte være for å kunne trykkes på mobil før jeg kunne teste det selv på serveren.
- Oppsett av Vitest og de første testene. Claude gidde også en god forklaring hva de forskjellige testene gjorde og hvorfor de var nyttige å benytte seg av.

Erfaringer:
Expand All @@ -499,15 +501,17 @@ Jeg tok med først god tid til å fortså kode som KI foreslo slik at jeg fikk u

Claude var en stor hjelp i spesielt CSS. Dette merket jeg da vi alle skulle gjøre våre egen CSS som ikke laget veldig fin sammenhengende CSS gjennom nettsiden. Jeg kunne da benytte meg av å screenshotte endringer som noen andre gjorde på nettsiden og få claude til å gi en forklaring til CSS som kunne passe. Dette brukte jeg til å kopiere CSS fra MovieCard til å lage CSS på Sidebar.

Det som ikke var like bra ved bruk av KI var når den ville gjøre veldig store endringer og den ville endre kode til mine gruppe medlemmer. Her måtte jeg gjøre flere små endringer istedet og passe på at den holdt seg innenfor rammene til "issuet" som jeg skulle løse på den branchen og ikke bare gi meg masse tips til ting som ikke var relevant til det jeg jobbet med.
Det som ikke var like bra ved bruk av KI var når den ville gjøre veldig store endringer og den ville endre kode til mine gruppemedlemmer. Her måtte jeg gjøre flere små endringer istedet og passe på at den holdt seg innenfor rammene til "issuet" som jeg skulle løse på den branchen, og ikke bare gi meg masse tips til ting som ikke var relevant til det jeg jobbet med.

Når jeg hadde problemer med min personlige kode, spurte jeg Claude også om å gi meg flere alternativ til problemet og ikke bare ett sett med kode. Dette lærte meg nyansene og de forskjellige måtene jeg kunne håndtere feil i koden på, uten å føle at KI gjorde alt for meg.
Når jeg hadde problemer med min personlige kode, spurte jeg Claude også om å gi meg flere alternativer til problemet og ikke bare ett sett med kode. Dette lærte meg nyansene og de forskjellige måtene jeg kunne håndtere feil i koden på, uten å føle at KI gjorde alt for meg.

Ki hjalp også med testene. Det å la KI hjelpe ved lagingen hjalp oss også med å finne ekte feil i koden. Vi merket da at MovieList manglet key, og MovieCard sender en tom streng som src når en film ikke har plakat. Begge ga advarsler som var nyttige for å feilsøke og fikse.

Oppsummert: KI er brukt som en sammarbeidspartner som foreslår, hjelper og endrer kode der nødvendig. Det er blitt tatt tiltak i bruken for å passe på at det hovedsak holder seg til å lære av og ikke for å bli en erstattning til kritisk tenking og læring.

#### Albert

Oversikten under er generert av Claude basert på all chat-historikken min fra autust-september (17.09.2026). Utover det Claude har lagt inn i oversikten er KI generelt brukt til feilsøking, forklaring av teknologier vi bruker som react og typescript. I tillegg er KI brukt for å effektivisere enkelte oppgaver slik som å søke gjennom historikk i github, o.l.
Oversikten under er generert av Claude basert på all chat-historikken min fra august-september (17.09.2026). Utover det Claude har lagt inn i oversikten er KI generelt brukt til feilsøking, forklaring av teknologier vi bruker som react og typescript. I tillegg er KI brukt for å effektivisere enkelte oppgaver slik som å søke gjennom historikk i github, o.l.

_Bruk av KI_:

Expand Down
2 changes: 1 addition & 1 deletion src/App.css
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,4 @@
padding: 16px;
margin-top: auto;
font-size: 0.75em;
}
}
101 changes: 48 additions & 53 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,70 +60,65 @@ function App() {

return (
<>
<div className="page">
<Sidebar
onSearch={setQuery}
searchValue={query}
view={view}
onViewChange={setView}
/>

<main>
{isSearching ? (
<SearchLayout
query={query}
search={search}
sortBy={sortBy}
onSortChange={setSortBy}
onMinRatingChange={setMinRating}
minRating={minRating}
isFavorite={isFavorite}
toggleFavorite={toggleFavorite}
onSelectMovie={handleSelectMovie}
/>
) : view === 'favoritter' ? (
<FavoritesLayout
favoriteIds={favoriteIds}
isFavorite={isFavorite}
toggleFavorite={toggleFavorite}
onSelectMovie={handleSelectMovie}
/>
) : (
<MainLayout
isFavorite={isFavorite}
toggleFavorite={toggleFavorite}
onSelectMovie={handleSelectMovie}
<div className="page">
<Sidebar
onSearch={setQuery}
searchValue={query}
view={view}
onViewChange={setView}
/>

<main>
{isSearching ? (
<SearchLayout
query={query}
search={search}
sortBy={sortBy}
onSortChange={setSortBy}
onMinRatingChange={setMinRating}
minRating={minRating}
isFavorite={isFavorite}
toggleFavorite={toggleFavorite}
onSelectMovie={handleSelectMovie}
/>
) : view === 'favoritter' ? (
<FavoritesLayout
favoriteIds={favoriteIds}
isFavorite={isFavorite}
toggleFavorite={toggleFavorite}
onSelectMovie={handleSelectMovie}
/>
) : (
<MainLayout
isFavorite={isFavorite}
toggleFavorite={toggleFavorite}
onSelectMovie={handleSelectMovie}
/>
)}
</main>

{selectedMovie && (
<MovieDetails
movie={selectedMovie}
movies={selectedList}
onNavigate={handleNavigate}
isFavorite={isFavorite(selectedMovie.id)}
onToggleFavorite={toggleFavorite}
onClose={() => setSelectedMovie(null)}
/>
)}
</main>

{selectedMovie && (
<MovieDetails
movie={selectedMovie}
movies={selectedList}
onNavigate={handleNavigate}
isFavorite={isFavorite(selectedMovie.id)}
onToggleFavorite={toggleFavorite}
onClose={() => setSelectedMovie(null)}
/>
)}

<div className="page-spacer" aria-hidden="true"></div>
</div>
<div className="page-spacer" aria-hidden="true"></div>
</div>

<footer className="footer">
<footer className="footer">
Filmdata hentet fra{' '}
<a href="https://www.themoviedb.org/" target="_blank" rel="noreferrer">
TMDB
</a>
</footer>
</>



);

}


export default App;
Binary file removed src/assets/hero.png
Binary file not shown.
1 change: 0 additions & 1 deletion src/assets/react.svg

This file was deleted.

Loading