From 432e4c89937a28fb01768c56d5588d2acbd70e7d Mon Sep 17 00:00:00 2001 From: Niels Mokkenstorm Date: Mon, 10 Aug 2026 14:06:11 +0200 Subject: [PATCH] fix: carry the quick-add request through the write so a retry keeps its status --- web/src/crate_web/effects.gleam | 12 ++-- web/src/crate_web/model.gleam | 27 ++++--- web/src/crate_web/msg.gleam | 7 +- web/src/crate_web/pages/browse.gleam | 27 +++---- web/src/crate_web/update.gleam | 6 +- web/src/crate_web/update/browse.gleam | 83 +++++++++------------ web/test/browse_test.gleam | 100 +++++++++++++++++++------- web/test/crate_test.gleam | 14 ++-- web/test/nav_test.gleam | 13 ++-- web/test/pressing_test.gleam | 8 ++- 10 files changed, 180 insertions(+), 117 deletions(-) diff --git a/web/src/crate_web/effects.gleam b/web/src/crate_web/effects.gleam index 58e76b0..460245d 100644 --- a/web/src/crate_web/effects.gleam +++ b/web/src/crate_web/effects.gleam @@ -12,8 +12,8 @@ import crate/gen/shelf/list_entries import crate_web/appview import crate_web/browser import crate_web/model.{ - type AmendDraft, type Display, type Form, type ReleaseInfo, type Theme, - DiscogsSearchPage, HandleSuggestion, ReleaseInfo, + type AmendDraft, type BrowseAddRequest, type Display, type Form, + type ReleaseInfo, type Theme, DiscogsSearchPage, HandleSuggestion, ReleaseInfo, } import crate_web/money import crate_web/msg.{ @@ -603,14 +603,14 @@ pub fn load_pressing(release_uri: String) -> Effect(Msg) { /// Want-it / I-have-this quick action from the browse grid: the release is /// already known, so this skips straight to a genesis write. -pub fn browse_add(uri: String, cid: String, status: String) -> Effect(Msg) { +pub fn browse_add(request: BrowseAddRequest) -> Effect(Msg) { let body = json.object([ - #("subject", strong_ref(uri, cid)), - #("status", json.string(status)), + #("subject", strong_ref(request.uri, request.cid)), + #("status", json.string(request.status)), ]) bff_post(xrpc("catalog.adoptRelease", []), body, nil_decoder(), GotBrowseAdd( - uri, + request, _, )) } diff --git a/web/src/crate_web/model.gleam b/web/src/crate_web/model.gleam index 9c3a5c2..c982d5f 100644 --- a/web/src/crate_web/model.gleam +++ b/web/src/crate_web/model.gleam @@ -558,6 +558,19 @@ pub fn blank_amend() -> AmendDraft { pub type BrowseRelease = list_releases.ReleaseRow +/// One browse-card quick add: everything `catalog.adoptRelease` needs, carried +/// through the write so neither the response nor a retry has to re-derive the +/// status from a model slot the page may have cleared meanwhile. +pub type BrowseAddRequest { + BrowseAddRequest(uri: String, cid: String, status: String) +} + +/// A quick add that failed, paired with the message its card shows; the +/// request is the one its RETRY re-fires. +pub type BrowseAddFailure { + BrowseAddFailure(request: BrowseAddRequest, message: String) +} + /// Split a `catalog.release` at:// uri into its did/rkey, the shape the /// `PressingDetail` route needs. Any uri not shaped like /// `at:////` yields `Error`. @@ -781,14 +794,12 @@ pub type Model { amend: AmendDraft, avatar: Option(String), browse: List(BrowseRelease), - // The uri/status of the browse row whose add write is in flight; None - // means idle. Carrying the status lets a successful write flip the right - // flag without re-deriving it from the response. - browse_adding: Option(#(String, String)), - // The uri/status/message of the last quick-add that failed, so its card - // alone shows the inline retry instead of relying on the global toast; - // cleared on the next add attempt (any card) or a fresh grid load. - browse_add_error: Option(#(String, String, String)), + // The quick-add write in flight; None means idle. + browse_adding: Option(BrowseAddRequest), + // The last quick-add that failed, so its card alone shows the inline retry + // instead of relying on the global toast; cleared on the next add attempt + // (any card) or a fresh grid load. + browse_add_error: Option(BrowseAddFailure), // The free-text/genre search box above the browse grid; both empty means // the default live grid from `load_browse`, not a search result. browse_query: String, diff --git a/web/src/crate_web/msg.gleam b/web/src/crate_web/msg.gleam index 89318fa..fa5a37c 100644 --- a/web/src/crate_web/msg.gleam +++ b/web/src/crate_web/msg.gleam @@ -2,7 +2,8 @@ import atproto_core/xrpc import crate/gen/feed/get_feed_skeleton.{type FeedItem} import crate/gen/shelf/entry.{type ShelfEntry} import crate_web/model.{ - type ArtistHit, type BrowseRelease, type DiscogsResult, type DiscogsSearchPage, + type ArtistHit, type BrowseAddRequest, type BrowseRelease, + type DiscogsResult, type DiscogsSearchPage, type Display, type EditProposal, type Entry, type HandleSuggestion, type ImportKind, type ImportRun, type NetworkMatch, type ReleaseInfo, type Route, type ScanMode, type Suggestion, type Theme, @@ -171,8 +172,8 @@ pub type Msg { GotBrowseSearch(Result(List(BrowseRelease), ApiError)) ToggleBrowseFilters BrowseClearFilters - BrowseAdd(uri: String, cid: String, status: String) - GotBrowseAdd(uri: String, result: Result(Nil, ApiError)) + BrowseAdd(request: BrowseAddRequest) + GotBrowseAdd(request: BrowseAddRequest, result: Result(Nil, ApiError)) GotEditInbox(Result(List(EditProposal), ApiError)) ApplyProposal(uri: String, cid: String) GotApplyProposal(uri: String, result: Result(AppliedProposal, ApiError)) diff --git a/web/src/crate_web/pages/browse.gleam b/web/src/crate_web/pages/browse.gleam index 268131d..94e5b88 100644 --- a/web/src/crate_web/pages/browse.gleam +++ b/web/src/crate_web/pages/browse.gleam @@ -4,7 +4,8 @@ //// pressing detail page instead. import crate_web/model.{ - type BrowseRelease, type Model, PressingDetail, PublicCrate, + type BrowseAddFailure, type BrowseAddRequest, type BrowseRelease, type Model, + BrowseAddRequest, PressingDetail, PublicCrate, } import crate_web/msg.{ type Msg, BrowseAdd, BrowseClearFilters, BrowseGenre, BrowseQuery, @@ -149,8 +150,8 @@ pub fn genre_suggestions( fn grid( rows: List(BrowseRelease), - adding: Option(#(String, String)), - add_error: Option(#(String, String, String)), + adding: Option(BrowseAddRequest), + add_error: Option(BrowseAddFailure), busy: Bool, ) -> Element(Msg) { case rows, busy { @@ -166,8 +167,8 @@ fn grid( fn card( row: BrowseRelease, - adding: Option(#(String, String)), - add_error: Option(#(String, String, String)), + adding: Option(BrowseAddRequest), + add_error: Option(BrowseAddFailure), ) -> Element(Msg) { let artist = option.unwrap(row.artist_display, "") let color = cov.cover_color(row.title <> artist) @@ -187,11 +188,11 @@ fn card( /// calls it), so the inline retry lives here instead. fn row_error( row: BrowseRelease, - add_error: Option(#(String, String, String)), + add_error: Option(BrowseAddFailure), ) -> Element(Msg) { case add_error { - Some(#(uri, status, message)) if uri == row.uri -> - states.write_error_sticker(message, BrowseAdd(row.uri, row.cid, status)) + Some(failure) if failure.request.uri == row.uri -> + states.write_error_sticker(failure.message, BrowseAdd(failure.request)) _ -> element.none() } } @@ -243,7 +244,7 @@ fn via_handle(row: BrowseRelease) -> Element(Msg) { pub fn actions( row: BrowseRelease, - adding: Option(#(String, String)), + adding: Option(BrowseAddRequest), ) -> Element(Msg) { case row.owned, row.wanted { True, _ -> ctl.badge("IN YOUR CRATE", ctl.Owned) @@ -254,20 +255,20 @@ pub fn actions( fn quick_actions( row: BrowseRelease, - adding: Option(#(String, String)), + adding: Option(BrowseAddRequest), ) -> Element(Msg) { let busy = option.is_some(adding) let clicked = case adding { - Some(#(uri, status)) if uri == row.uri -> Some(status) + Some(request) if request.uri == row.uri -> Some(request.status) _ -> None } html.div([attr.class("browse-card__actions")], [ ctl.button(action_label("WANT IT", clicked, "wanted"), ctl.Ghost, [ - event.on_click(BrowseAdd(row.uri, row.cid, "wanted")), + event.on_click(BrowseAdd(BrowseAddRequest(row.uri, row.cid, "wanted"))), attr.disabled(busy), ]), ctl.button(action_label("I HAVE THIS", clicked, "owned"), ctl.Primary, [ - event.on_click(BrowseAdd(row.uri, row.cid, "owned")), + event.on_click(BrowseAdd(BrowseAddRequest(row.uri, row.cid, "owned"))), attr.disabled(busy), ]), ]) diff --git a/web/src/crate_web/update.gleam b/web/src/crate_web/update.gleam index f72c478..80c4a3e 100644 --- a/web/src/crate_web/update.gleam +++ b/web/src/crate_web/update.gleam @@ -116,9 +116,9 @@ pub fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { msg.GotBrowseSearch(result) -> browse.got_browse_search(model, result) msg.ToggleBrowseFilters -> browse.toggle_browse_filters(model) msg.BrowseClearFilters -> browse.browse_clear_filters(model) - msg.BrowseAdd(uri, cid, status) -> - browse.browse_add_msg(model, uri, cid, status) - msg.GotBrowseAdd(uri, result) -> browse.got_browse_add(model, uri, result) + msg.BrowseAdd(request) -> browse.browse_add_msg(model, request) + msg.GotBrowseAdd(request, result) -> + browse.got_browse_add(model, request, result) msg.GotPressing(result) -> browse.got_pressing(model, result) msg.GotCrateOverlap(result) -> browse.got_crate_overlap(model, result) msg.ToggleFollow -> browse.toggle_follow(model) diff --git a/web/src/crate_web/update/browse.gleam b/web/src/crate_web/update/browse.gleam index b4f5bcf..0442551 100644 --- a/web/src/crate_web/update/browse.gleam +++ b/web/src/crate_web/update/browse.gleam @@ -5,14 +5,14 @@ import crate_web/effects.{ search_browse, unfollow_user, } import crate_web/model.{ - type BrowseRelease, type Model, CrateOverlap, LoggedIn, LoggedOut, Model, Own, - OwnCrate, PressingDetail, PressingFailed, PressingLoaded, PressingLoading, - ShelfLoaded, + type BrowseAddRequest, type BrowseRelease, type Model, BrowseAddFailure, + CrateOverlap, LoggedIn, LoggedOut, Model, Own, OwnCrate, PressingDetail, + PressingFailed, PressingLoaded, PressingLoading, ShelfLoaded, } import crate_web/msg.{type Msg} import crate_web/update/common.{failed, write_error} import gleam/list -import gleam/option.{type Option, None, Some} +import gleam/option.{None, Some} import gleam/string import lustre/effect.{type Effect} @@ -110,48 +110,41 @@ pub fn browse_clear_filters(model: Model) -> #(Model, Effect(Msg)) { /// Guarded so only one browse add can be in flight at a time. pub fn browse_add_msg( model: Model, - uri: String, - cid: String, - status: String, + request: BrowseAddRequest, ) -> #(Model, Effect(Msg)) { case model.browse_adding { Some(_) -> #(model, effect.none()) None -> #( - Model( - ..model, - browse_adding: Some(#(uri, status)), - browse_add_error: None, - ), - browse_add(uri, cid, status), + Model(..model, browse_adding: Some(request), browse_add_error: None), + browse_add(request), ) } } pub fn got_browse_add( model: Model, - uri: String, + request: BrowseAddRequest, result: Result(Nil, msg.ApiError), ) -> #(Model, Effect(Msg)) { case result { Ok(Nil) -> #( Model( ..model, - browse: mark_browse_row(model.browse, uri, model.browse_adding), - pressing: mark_pressing(model.pressing, uri, model.browse_adding), + browse: mark_browse_row(model.browse, request), + pressing: mark_pressing(model.pressing, request), browse_adding: None, browse_add_error: None, ), effect.none(), ) Error(e) -> { - let status = case model.browse_adding { - Some(#(_, s)) -> s - None -> "" - } let fallback = "Could not save that record. Try again." let #(m, eff) = write_error(Model(..model, browse_adding: None), e, fallback) - #(Model(..m, browse_add_error: Some(#(uri, status, fallback))), eff) + #( + Model(..m, browse_add_error: Some(BrowseAddFailure(request, fallback))), + eff, + ) } } } @@ -284,49 +277,41 @@ pub fn got_unfollow( } } -/// Flip the owned/wanted flag on the browse row that was just written, -/// per the status carried in `browse_adding` (set when the write started). +/// Flip the owned/wanted flag on the browse row that was just written, per +/// the status the write itself carried. fn mark_browse_row( rows: List(BrowseRelease), - uri: String, - adding: Option(#(String, String)), + request: BrowseAddRequest, ) -> List(BrowseRelease) { - case adding { - Some(#(adding_uri, status)) if adding_uri == uri -> - list.map(rows, fn(row) { - case row.uri == uri { - True -> - list_releases.ReleaseRow( - ..row, - owned: row.owned || status == "owned", - wanted: row.wanted || status == "wanted", - ) - False -> row - } - }) - _ -> rows - } + list.map(rows, fn(row) { + case row.uri == request.uri { + True -> + list_releases.ReleaseRow( + ..row, + owned: row.owned || request.status == "owned", + wanted: row.wanted || request.status == "wanted", + ) + False -> row + } + }) } /// Same flip as `mark_browse_row`, for the pressing detail page's own copy /// of the row (it isn't necessarily backed by `model.browse` at all). fn mark_pressing( pressing: model.PressingState, - uri: String, - adding: Option(#(String, String)), + request: BrowseAddRequest, ) -> model.PressingState { - case pressing, adding { - PressingLoaded(row), Some(#(adding_uri, status)) - if adding_uri == uri && row.uri == uri - -> + case pressing { + PressingLoaded(row) if row.uri == request.uri -> PressingLoaded( list_releases.ReleaseRow( ..row, - owned: row.owned || status == "owned", - wanted: row.wanted || status == "wanted", + owned: row.owned || request.status == "owned", + wanted: row.wanted || request.status == "wanted", ), ) - _, _ -> pressing + _ -> pressing } } diff --git a/web/test/browse_test.gleam b/web/test/browse_test.gleam index c6fa5e9..21a4714 100644 --- a/web/test/browse_test.gleam +++ b/web/test/browse_test.gleam @@ -1,7 +1,10 @@ import crate/gen/catalog/list_releases.{ReleaseRow} -import crate_web/model.{type BrowseRelease, Model} +import crate_web/model.{ + type BrowseRelease, Browse, BrowseAddFailure, BrowseAddRequest, Crate, Model, +} import crate_web/msg.{ - BrowseAdd, BrowseClearFilters, GotBrowse, GotBrowseAdd, ToggleBrowseFilters, + BrowseAdd, BrowseClearFilters, GotBrowse, GotBrowseAdd, OnRouteChange, + ToggleBrowseFilters, } import crate_web/pages/browse import crate_web/update.{update} @@ -51,15 +54,20 @@ pub fn got_browse_stores_rows_test() { pub fn browse_add_marks_in_flight_test() { let #(model, _) = - update(logged_in(), BrowseAdd("at://uri", "cid-1", "wanted")) - assert model.browse_adding == Some(#("at://uri", "wanted")) + update( + logged_in(), + BrowseAdd(BrowseAddRequest("at://uri", "cid-1", "wanted")), + ) + assert model.browse_adding + == Some(BrowseAddRequest("at://uri", "cid-1", "wanted")) } pub fn browse_add_is_guarded_while_already_adding_test() { - let seeded = - Model(..logged_in(), browse_adding: Some(#("at://other", "owned"))) - let #(model, _) = update(seeded, BrowseAdd("at://uri", "cid-1", "wanted")) - assert model.browse_adding == Some(#("at://other", "owned")) + let running = BrowseAddRequest("at://other", "cid-0", "owned") + let seeded = Model(..logged_in(), browse_adding: Some(running)) + let #(model, _) = + update(seeded, BrowseAdd(BrowseAddRequest("at://uri", "cid-1", "wanted"))) + assert model.browse_adding == Some(running) } pub fn got_browse_add_success_flips_the_matching_row_and_clears_adding_test() { @@ -68,9 +76,13 @@ pub fn got_browse_add_success_flips_the_matching_row_and_clears_adding_test() { Model( ..logged_in(), browse: [a_browse_release(uri)], - browse_adding: Some(#(uri, "owned")), + browse_adding: Some(BrowseAddRequest(uri, "cid-1", "owned")), + ) + let #(model, _) = + update( + seeded, + GotBrowseAdd(BrowseAddRequest(uri, "cid-1", "owned"), Ok(Nil)), ) - let #(model, _) = update(seeded, GotBrowseAdd(uri, Ok(Nil))) assert model.browse_adding == None assert case model.browse { [row] -> row.owned == True && row.wanted == False @@ -78,16 +90,38 @@ pub fn got_browse_add_success_flips_the_matching_row_and_clears_adding_test() { } } +// A route change clears `browse_adding` mid-flight, so the failure that +// lands afterwards has to carry the status the write was setting; deriving +// it from the model at response time hands the card's RETRY an empty one. +pub fn browse_add_failure_keeps_its_status_across_a_route_change_test() { + let uri = "at://did:plc:abc/catalog.release/1" + let request = BrowseAddRequest(uri, "cid-1", "owned") + let seeded = Model(..logged_in(), browse: [a_browse_release(uri)]) + let #(adding, _) = update(seeded, BrowseAdd(request)) + let #(away, _) = update(adding, OnRouteChange(Crate)) + let #(back, _) = update(away, OnRouteChange(Browse)) + let #(failed, _) = + update(back, GotBrowseAdd(request, Error(support.network_error()))) + assert failed.browse_add_error + == Some(BrowseAddFailure(request, "Could not save that record. Try again.")) +} + pub fn got_browse_add_error_clears_adding_with_notice_test() { let uri = "at://did:plc:abc/catalog.release/1" let seeded = Model( ..logged_in(), browse: [a_browse_release(uri)], - browse_adding: Some(#(uri, "owned")), + browse_adding: Some(BrowseAddRequest(uri, "cid-1", "owned")), ) let #(model, _) = - update(seeded, GotBrowseAdd(uri, Error(support.network_error()))) + update( + seeded, + GotBrowseAdd( + BrowseAddRequest(uri, "cid-1", "owned"), + Error(support.network_error()), + ), + ) assert model.browse_adding == None assert model.notice != None assert case model.browse { @@ -96,20 +130,21 @@ pub fn got_browse_add_error_clears_adding_with_notice_test() { } } -// The card-level retry needs the status alongside the uri, so it can re-fire -// the exact same BrowseAdd; only the card that actually failed carries it. +// The card-level retry re-fires the exact request that failed; only the card +// that actually failed carries it. pub fn got_browse_add_error_records_which_card_and_status_failed_test() { let uri = "at://did:plc:abc/catalog.release/1" + let request = BrowseAddRequest(uri, "cid-1", "owned") let seeded = Model( ..logged_in(), browse: [a_browse_release(uri)], - browse_adding: Some(#(uri, "owned")), + browse_adding: Some(request), ) let #(model, _) = - update(seeded, GotBrowseAdd(uri, Error(support.network_error()))) + update(seeded, GotBrowseAdd(request, Error(support.network_error()))) assert case model.browse_add_error { - Some(#(err_uri, status, _message)) -> err_uri == uri && status == "owned" + Some(failure) -> failure.request == request None -> False } } @@ -120,10 +155,17 @@ pub fn a_successful_add_clears_any_earlier_card_error_test() { Model( ..logged_in(), browse: [a_browse_release(uri)], - browse_adding: Some(#(uri, "owned")), - browse_add_error: Some(#(uri, "owned", "boom")), + browse_adding: Some(BrowseAddRequest(uri, "cid-1", "owned")), + browse_add_error: Some(BrowseAddFailure( + BrowseAddRequest(uri, "cid-1", "owned"), + "boom", + )), + ) + let #(model, _) = + update( + seeded, + GotBrowseAdd(BrowseAddRequest(uri, "cid-1", "owned"), Ok(Nil)), ) - let #(model, _) = update(seeded, GotBrowseAdd(uri, Ok(Nil))) assert model.browse_add_error == None } @@ -131,9 +173,13 @@ pub fn a_new_add_attempt_clears_any_earlier_card_error_test() { let seeded = Model( ..logged_in(), - browse_add_error: Some(#("at://uri/1", "owned", "boom")), + browse_add_error: Some(BrowseAddFailure( + BrowseAddRequest("at://uri/1", "cid-1", "owned"), + "boom", + )), ) - let #(model, _) = update(seeded, BrowseAdd("at://uri/2", "cid-2", "wanted")) + let #(model, _) = + update(seeded, BrowseAdd(BrowseAddRequest("at://uri/2", "cid-2", "wanted"))) assert model.browse_add_error == None } @@ -143,7 +189,10 @@ pub fn the_failed_cards_error_region_renders_with_a_retry_test() { Model( ..logged_in(), browse: [a_browse_release(uri)], - browse_add_error: Some(#(uri, "owned", "Could not save that record.")), + browse_add_error: Some(BrowseAddFailure( + BrowseAddRequest(uri, "cid-1", "owned"), + "Could not save that record.", + )), ) let html = seeded |> browse.view |> element.to_string assert string.contains(html, "class=\"error-state\"") @@ -160,7 +209,10 @@ pub fn only_the_failed_card_shows_the_error_region_test() { Model( ..logged_in(), browse: [a_browse_release(other_uri), a_browse_release(failed_uri)], - browse_add_error: Some(#(failed_uri, "owned", "boom")), + browse_add_error: Some(BrowseAddFailure( + BrowseAddRequest(failed_uri, "cid-1", "owned"), + "boom", + )), ) let html = seeded |> browse.view |> element.to_string assert string.contains(html, "class=\"error-state\"") diff --git a/web/test/crate_test.gleam b/web/test/crate_test.gleam index e40a11f..dd96948 100644 --- a/web/test/crate_test.gleam +++ b/web/test/crate_test.gleam @@ -1,8 +1,8 @@ import crate/gen/shelf/list_entries import crate_web/model.{ - type Entry, Failure, Grid, LoggedIn, LoggedOut, Model, Notice, Own, OwnCrate, - Record, Rows, ShelfFailed, ShelfLoaded, ShelfLoading, Warning, blank_form, - crate_of, set_crate, + type Entry, BrowseAddRequest, Failure, Grid, LoggedIn, LoggedOut, Model, + Notice, Own, OwnCrate, Record, Rows, ShelfFailed, ShelfLoaded, ShelfLoading, + Warning, blank_form, crate_of, set_crate, } import crate_web/msg.{ ClearNotice, FormTitle, GotBrowseAdd, GotShelf, GotShelfMore, HandleChanged, @@ -129,7 +129,13 @@ pub fn set_display_back_to_grid_persists_without_a_shelf_reload_test() { pub fn session_expired_is_a_warning_notice_test() { let #(model, _) = - update(logged_in(), GotBrowseAdd("at://x", Error(unauthorized()))) + update( + logged_in(), + GotBrowseAdd( + BrowseAddRequest("at://x", "cid-1", "owned"), + Error(unauthorized()), + ), + ) assert case model.notice { Some(Notice(Warning, _)) -> True _ -> False diff --git a/web/test/nav_test.gleam b/web/test/nav_test.gleam index cc2da9f..583bb6f 100644 --- a/web/test/nav_test.gleam +++ b/web/test/nav_test.gleam @@ -4,10 +4,10 @@ //// an anchor. import crate_web/model.{ - Add, Browse, Crate, Discogs, EditInbox, EditProposalDetail, Feed, InvalidInput, - Model, Own, OwnCrate, PressingDetail, PressingLoading, PublicCrate, - PublicRecord, Record, RecordAmend, Scan, ScanDone, ScanReview, Settings, - ShelfLoaded, blank_discogs, set_crate, + Add, Browse, BrowseAddFailure, BrowseAddRequest, Crate, Discogs, EditInbox, + EditProposalDetail, Feed, InvalidInput, Model, Own, OwnCrate, PressingDetail, + PressingLoading, PublicCrate, PublicRecord, Record, RecordAmend, Scan, + ScanDone, ScanReview, Settings, ShelfLoaded, blank_discogs, set_crate, } import crate_web/msg.{Back, OnRouteChange} import crate_web/route @@ -124,7 +124,10 @@ pub fn every_route_change_clears_the_page_scoped_state_test() { ..logged_in(), form_error: Some(InvalidInput("Title and artist are required.")), amend_error: Some("Could not publish the amendment."), - browse_add_error: Some(#("at://uri/1", "owned", "boom")), + browse_add_error: Some(BrowseAddFailure( + BrowseAddRequest("at://uri/1", "cid-1", "owned"), + "boom", + )), confirm_apply: Some("at://uri/1"), discogs: Discogs( ..blank_discogs(), diff --git a/web/test/pressing_test.gleam b/web/test/pressing_test.gleam index 3ff4c38..9ce8ec3 100644 --- a/web/test/pressing_test.gleam +++ b/web/test/pressing_test.gleam @@ -92,9 +92,13 @@ pub fn browse_add_success_flips_the_pressing_row_too_test() { Model( ..logged_in(), pressing: PressingLoaded(a_pressing(uri)), - browse_adding: Some(#(uri, "owned")), + browse_adding: Some(model.BrowseAddRequest(uri, "cid-1", "owned")), + ) + let #(model, _) = + update( + seeded, + GotBrowseAdd(model.BrowseAddRequest(uri, "cid-1", "owned"), Ok(Nil)), ) - let #(model, _) = update(seeded, GotBrowseAdd(uri, Ok(Nil))) assert model.pressing == PressingLoaded(ReleaseRow(..a_pressing(uri), owned: True)) } -- 2.51.2