diff --git a/web/src/at_record_web/effects.gleam b/web/src/at_record_web/effects.gleam index 26b86ea..546a3a9 100644 --- a/web/src/at_record_web/effects.gleam +++ b/web/src/at_record_web/effects.gleam @@ -12,11 +12,11 @@ import at_record/gen/shelf/list_entries import at_record_web/appview import at_record_web/browser import at_record_web/model.{ - type AmendDraft, type BrowseRelease, type DiscogsResult, type Display, - type EditProposal, type Form, type ImportRun, type NetworkMatch, - type ReleaseInfo, type Suggestion, type Theme, BrowseRelease, DiscogsResult, - DiscogsSearchPage, EditProposal, HandleSuggestion, ImportRun, NetworkMatch, - ProposalFields, ReleaseInfo, Suggestion, + type AmendDraft, type DiscogsResult, type Display, type EditProposal, + type Form, type ImportRun, type NetworkMatch, type ReleaseInfo, + type Suggestion, type Theme, DiscogsResult, DiscogsSearchPage, EditProposal, + HandleSuggestion, ImportRun, NetworkMatch, ProposalFields, ReleaseInfo, + Suggestion, } import at_record_web/money import at_record_web/msg.{ @@ -572,7 +572,7 @@ pub fn load_browse() -> Effect(Msg) { rsvp.expect_json( decode.field( "releases", - decode.list(browse_release_decoder()), + decode.list(list_releases.release_row_decoder()), decode.success, ), GotBrowse, @@ -601,7 +601,7 @@ pub fn search_browse(query: String, genre: String) -> Effect(Msg) { rsvp.expect_json( decode.field( "releases", - decode.list(browse_release_decoder()), + decode.list(list_releases.release_row_decoder()), decode.success, ), GotBrowseSearch, @@ -609,32 +609,6 @@ pub fn search_browse(query: String, genre: String) -> Effect(Msg) { ) } -fn browse_release_decoder() -> decode.Decoder(BrowseRelease) { - decode.map(list_releases.release_row_decoder(), fn(row) { - BrowseRelease( - uri: row.uri, - cid: row.cid, - title: row.title, - genres: row.genres, - styles: row.styles, - publisher_did: row.publisher_did, - publisher_handle: row.publisher_handle, - owned: row.owned, - wanted: row.wanted, - artist_display: row.artist_display, - cover_url: row.cover_url, - thumb_url: row.thumb_url, - released: row.released, - country: row.country, - adoption_count: row.adoption_count, - variant_count: row.variant_count, - format: row.format, - label: row.label, - master: row.master, - ) - }) -} - /// Direct-load hydration for the pressing detail page: only fired when the /// uri isn't already sitting in `model.browse` from a browse-page click (see /// `OnRouteChange(PressingDetail(..))`). @@ -642,7 +616,11 @@ pub fn load_pressing(release_uri: String) -> Effect(Msg) { rsvp.get( xrpc("catalog.getRelease", [#("uri", release_uri)]), rsvp.expect_json( - decode.field("release", browse_release_decoder(), decode.success), + decode.field( + "release", + list_releases.release_row_decoder(), + decode.success, + ), GotPressing, ), ) diff --git a/web/src/at_record_web/model.gleam b/web/src/at_record_web/model.gleam index c40fb8c..25cd32b 100644 --- a/web/src/at_record_web/model.gleam +++ b/web/src/at_record_web/model.gleam @@ -1,3 +1,4 @@ +import at_record/gen/catalog/list_releases import at_record/gen/catalog/release as catalog_release import at_record/gen/defs.{type Snapshot} import at_record/gen/feed/get_feed_skeleton.{type FeedItem} @@ -536,32 +537,10 @@ pub fn blank_amend() -> AmendDraft { } /// One catalog release as shown on the browse grid, folded against the -/// viewer's own crate (`owned`/`wanted`). -pub type BrowseRelease { - BrowseRelease( - uri: String, - cid: String, - title: String, - genres: List(String), - styles: List(String), - publisher_did: String, - publisher_handle: String, - owned: Bool, - wanted: Bool, - artist_display: Option(String), - cover_url: Option(String), - thumb_url: Option(String), - released: Option(String), - country: Option(String), - // Adoption/variant-set stats; both None only if a future row source hydrates without them. - adoption_count: Option(Int), - variant_count: Option(Int), - format: Option(String), - label: Option(String), - // The at:// uri of the work/album-level release this pressing belongs to. - master: Option(String), - ) -} +/// viewer's own crate (`owned`/`wanted`): the `catalog.listReleases` row, +/// generated from the lexicon and adopted directly as the web model. +pub type BrowseRelease = + list_releases.ReleaseRow /// Split a `catalog.release` at:// uri into its did/rkey, the shape the /// `PressingDetail` route needs. Any uri not shaped like diff --git a/web/src/at_record_web/update/browse.gleam b/web/src/at_record_web/update/browse.gleam index 76da318..eb695c1 100644 --- a/web/src/at_record_web/update/browse.gleam +++ b/web/src/at_record_web/update/browse.gleam @@ -1,10 +1,11 @@ +import at_record/gen/catalog/list_releases import at_record_web/effects.{ browse_add, follow_user, load_browse, load_crate_overlap, search_browse, unfollow_user, } import at_record_web/model.{ - type BrowseRelease, type Model, BrowseRelease, CrateOverlap, LoggedIn, - LoggedOut, Model, Own, OwnCrate, PressingFailed, PressingLoaded, ShelfLoaded, + type BrowseRelease, type Model, CrateOverlap, LoggedIn, LoggedOut, Model, Own, + OwnCrate, PressingFailed, PressingLoaded, ShelfLoaded, } import at_record_web/msg.{type Msg} import at_record_web/update/common.{failed, write_error} @@ -270,7 +271,7 @@ fn mark_browse_row( list.map(rows, fn(row) { case row.uri == uri { True -> - BrowseRelease( + list_releases.ReleaseRow( ..row, owned: row.owned || status == "owned", wanted: row.wanted || status == "wanted", @@ -294,7 +295,7 @@ fn mark_pressing( if adding_uri == uri && row.uri == uri -> PressingLoaded( - BrowseRelease( + list_releases.ReleaseRow( ..row, owned: row.owned || status == "owned", wanted: row.wanted || status == "wanted", diff --git a/web/test/browse_test.gleam b/web/test/browse_test.gleam index 8539d54..db5f3f6 100644 --- a/web/test/browse_test.gleam +++ b/web/test/browse_test.gleam @@ -1,4 +1,5 @@ -import at_record_web/model.{type BrowseRelease, BrowseRelease, Model} +import at_record/gen/catalog/list_releases.{ReleaseRow} +import at_record_web/model.{type BrowseRelease, Model} import at_record_web/msg.{ BrowseAdd, BrowseClearFilters, GotBrowse, GotBrowseAdd, ToggleBrowseFilters, } @@ -18,7 +19,7 @@ fn a_browse_release_with_genres( uri: String, genres: List(String), ) -> BrowseRelease { - BrowseRelease( + ReleaseRow( uri:, cid: "cid-1", title: "Spiderland", diff --git a/web/test/pressing_test.gleam b/web/test/pressing_test.gleam index 0b4bdb0..740b69f 100644 --- a/web/test/pressing_test.gleam +++ b/web/test/pressing_test.gleam @@ -2,9 +2,10 @@ //// off an already-loaded browse row vs. a fresh `catalog.getRelease` fetch, //// and the shared adopt flow's owned/wanted flip. +import at_record/gen/catalog/list_releases.{ReleaseRow} import at_record_web/model.{ - type BrowseRelease, BrowseRelease, Model, PressingDetail, PressingFailed, - PressingLoaded, PressingLoading, + type BrowseRelease, Model, PressingDetail, PressingFailed, PressingLoaded, + PressingLoading, } import at_record_web/msg.{GotBrowseAdd, GotPressing, OnRouteChange} import at_record_web/route @@ -18,7 +19,7 @@ import rsvp import support.{base, empty_effect, logged_in} fn a_pressing(uri: String) -> BrowseRelease { - BrowseRelease( + ReleaseRow( uri:, cid: "cid-1", title: "Spiderland", @@ -96,7 +97,7 @@ pub fn browse_add_success_flips_the_pressing_row_too_test() { ) let #(model, _) = update(seeded, GotBrowseAdd(uri, Ok(Nil))) assert model.pressing - == PressingLoaded(BrowseRelease(..a_pressing(uri), owned: True)) + == PressingLoaded(ReleaseRow(..a_pressing(uri), owned: True)) } pub fn pressing_page_renders_the_loaded_release_test() { @@ -128,7 +129,7 @@ pub fn pressing_page_omits_the_album_line_without_a_master_ref_test() { Model( ..logged_in(), route: PressingDetail("did:plc:abc", "3jz"), - pressing: PressingLoaded(BrowseRelease(..a_pressing(uri), master: None)), + pressing: PressingLoaded(ReleaseRow(..a_pressing(uri), master: None)), ) |> view.view |> element.to_string @@ -141,7 +142,7 @@ pub fn pressing_page_renders_owned_state_test() { Model( ..logged_in(), route: PressingDetail("did:plc:abc", "3jz"), - pressing: PressingLoaded(BrowseRelease(..a_pressing(uri), owned: True)), + pressing: PressingLoaded(ReleaseRow(..a_pressing(uri), owned: True)), ) |> view.view |> element.to_string