Skip to content
This repository has been archived by the owner on Aug 11, 2024. It is now read-only.

Commit

Permalink
Lift color assignment to root
Browse files Browse the repository at this point in the history
Refresh views when color assigned
  • Loading branch information
bfollington committed Jan 9, 2024
1 parent 9104500 commit 8159f6d
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 67 deletions.
61 changes: 54 additions & 7 deletions xcode/Subconscious/Shared/Components/AppView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -302,18 +302,21 @@ enum AppAction: Hashable {
case mergeEntry(parent: Slashlink, child: Slashlink)
case moveEntry(from: Slashlink, to: Slashlink)
case updateAudience(address: Slashlink, audience: Audience)
case assignColor(addess: Slashlink, color: NoteColor)

// These notifications will be passe down to child stores to update themselves accordingly.
case succeedSaveEntry(address: Slashlink, modified: Date)
case succeedDeleteEntry(Slashlink)
case succeedMoveEntry(from: Slashlink, to: Slashlink)
case succeedMergeEntry(parent: Slashlink, child: Slashlink)
case succeedUpdateAudience(MoveReceipt)
case succeedAssignNoteColor(address: Slashlink, color: NoteColor)
case failSaveEntry(address: Slashlink, error: String)
case failDeleteMemo(String)
case failMoveEntry(from: Slashlink, to: Slashlink, error: String)
case failMergeEntry(parent: Slashlink, child: Slashlink, error: String)
case failUpdateAudience(address: Slashlink, audience: Audience, error: String)
case failAssignNoteColor(address: Slashlink, error: String)

case setSelectedAppTab(AppTab)
case requestNotebookRoot
Expand Down Expand Up @@ -1217,13 +1220,8 @@ struct AppModel: ModelProtocol {
state: state,
environment: environment
)
case .succeedMoveEntry(from: let from, to: let to):
return Update(state: state)
case .succeedMergeEntry(parent: let parent, child: let child):
return Update(state: state)
case .succeedSaveEntry(address: let address, modified: let modified):
return Update(state: state)
case .succeedUpdateAudience(_):
case .succeedSaveEntry, .succeedMoveEntry, .succeedMergeEntry, .succeedUpdateAudience,
.succeedAssignNoteColor:
return Update(state: state)
case let .saveEntry(entry):
return saveEntry(
Expand Down Expand Up @@ -1252,6 +1250,13 @@ struct AppModel: ModelProtocol {
address: address,
audience: audience
)
case let .assignColor(address, color):
return assignNoteColor(
state: state,
environment: environment,
address: address,
color: color
)
case .failSaveEntry(address: let address, error: let error):
logger.warning(
"""
Expand Down Expand Up @@ -1309,6 +1314,20 @@ struct AppModel: ModelProtocol {
),
environment: environment
)
case let .failAssignNoteColor(address, error):
logger.warning(
"""
Failed to assign color for entry: \(address)
\(error)
"""
)
return update(
state: state,
action: .pushToast(
message: "Could not set color"
),
environment: environment
)
}
}

Expand Down Expand Up @@ -3043,6 +3062,34 @@ struct AppModel: ModelProtocol {
fx: fx
)
}

static func assignNoteColor(
state: Self,
environment: Environment,
address: Slashlink,
color: NoteColor
) -> Update<Self> {
let fx: Fx<Action> = Future.detached {
try await environment.data.assignNoteColor(
address: address,
color: color
)

return .succeedAssignNoteColor(
address: address,
color: color
)
}
.recover { error in
return .failAssignNoteColor(
address: address,
error: error.localizedDescription
)
}
.eraseToAnyPublisher()

return Update(state: state, fx: fx)
}
}

// MARK: Environment
Expand Down
23 changes: 21 additions & 2 deletions xcode/Subconscious/Shared/Components/Deck/DeckView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ enum DeckAction: Hashable {
case succeedMergeEntry(parent: Slashlink, child: Slashlink)
case requestUpdateAudience(_ address: Slashlink, _ audience: Audience)
case succeedUpdateAudience(_ receipt: MoveReceipt)
case requestAssignNoteColor(_ address: Slashlink, _ color: NoteColor)
case succeedAssignNoteColor(_ address: Slashlink, _ color: NoteColor)
}

extension AppAction {
Expand All @@ -134,6 +136,8 @@ extension AppAction {
return .mergeEntry(parent: parent, child: child)
case let .requestUpdateAudience(address, audience):
return .updateAudience(address: address, audience: audience)
case let .requestAssignNoteColor(address, color):
return .assignColor(addess: address, color: color)
default:
return nil
}
Expand All @@ -155,6 +159,8 @@ extension DeckAction {
return .succeedMoveEntry(from: from, to: to)
case let .succeedUpdateAudience(receipt):
return .succeedUpdateAudience(receipt)
case let .succeedAssignNoteColor(address, color):
return .succeedAssignNoteColor(address, color)
default:
return nil
}
Expand Down Expand Up @@ -215,6 +221,8 @@ struct DeckDetailStackCursor: CursorProtocol {
return .requestMergeEntry(parent: parent, child: child)
case let .requestUpdateAudience(address, audience):
return .requestUpdateAudience(address, audience)
case let .requestAssignNoteColor(address, color):
return .requestAssignNoteColor(address, color)
case _:
return .detailStack(action)
}
Expand Down Expand Up @@ -382,8 +390,19 @@ struct DeckModel: ModelProtocol {
],
environment: environment
)
case let .succeedAssignNoteColor(address, color):
return update(
state: state,
actions: [
.detailStack(
.succeedAssignNoteColor(address, color)
),
.refreshUpcomingCards
],
environment: environment
)
case .requestDeleteEntry, .requestSaveEntry, .requestMoveEntry,
.requestMergeEntry, .requestUpdateAudience:
.requestMergeEntry, .requestUpdateAudience, .requestAssignNoteColor:
return Update(state: state)
}

Expand Down Expand Up @@ -524,7 +543,7 @@ struct DeckModel: ModelProtocol {
var model = state
model.deck = deck
model.seen = Set(deck.compactMap { card in card.entry })
model.pointer = startIndex.clamp(min: 0, max: deck.count - 1)
model.pointer = startIndex.clamp(min: 0, max: max(0, deck.count - 1))

if let topCard = deck.first {
return update(
Expand Down
29 changes: 20 additions & 9 deletions xcode/Subconscious/Shared/Components/Detail/DetailStackView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ enum DetailStackAction: Hashable {
case succeedMergeEntry(parent: Slashlink, child: Slashlink)
case requestUpdateAudience(_ address: Slashlink, _ audience: Audience)
case succeedUpdateAudience(_ receipt: MoveReceipt)
case requestAssignNoteColor(_ address: Slashlink, _ color: NoteColor)
case succeedAssignNoteColor(_ address: Slashlink, _ color: NoteColor)

/// Synonym for `.pushDetail` that wraps editor detail in `.editor()`
static func pushDetail(
Expand Down Expand Up @@ -271,8 +273,15 @@ struct DetailStackModel: Hashable, ModelProtocol {
environment: environment,
receipt: receipt
)
case let .succeedAssignNoteColor(address, color):
return succeedAssignNoteColor(
state: state,
environment: environment,
address: address,
color: color
)
case .requestDeleteEntry, .requestSaveEntry, .requestMoveEntry,
.requestMergeEntry, .requestUpdateAudience:
.requestMergeEntry, .requestUpdateAudience, .requestAssignNoteColor:
return Update(state: state)
}
}
Expand Down Expand Up @@ -587,6 +596,14 @@ struct DetailStackModel: Hashable, ModelProtocol {
)
}

static func succeedAssignNoteColor(
state: Self,
environment: Environment,
address: Slashlink,
color: NoteColor
) -> Update<Self> {
return Update(state: state)
}
}

extension DetailStackAction {
Expand All @@ -602,19 +619,13 @@ extension DetailStackAction {
return .requestMergeEntry(parent: parent, child: child)
case let .requestUpdateAudience(address, audience):
return .requestUpdateAudience(address, audience)
case let .requestAssignNoteColor(address, color):
return .requestAssignNoteColor(address, color)

case let .requestDetail(detail):
return .pushDetail(detail)
case let .requestFindLinkDetail(link):
return .findAndPushLinkDetail(link)
case let .succeedMoveEntry(from, to):
return .succeedMoveEntry(from: from, to: to)
case let .succeedMergeEntry(parent, child):
return .succeedMergeEntry(parent: parent, child: child)
case let .succeedSaveEntry(address, modified):
return .succeedSaveEntry(address, modified)
case let .succeedUpdateAudience(receipt):
return .succeedUpdateAudience(receipt)
}
}

Expand Down
85 changes: 74 additions & 11 deletions xcode/Subconscious/Shared/Components/Detail/MemoEditorDetail.swift
Original file line number Diff line number Diff line change
Expand Up @@ -283,19 +283,12 @@ enum MemoEditorDetailNotification: Hashable {
/// Request detail from any audience scope
case requestFindLinkDetail(EntryLink)

case requestSaveEntry(MemoEntry)
case requestDelete(Slashlink?)

case requestMoveEntry(from: Slashlink, to: Slashlink)
case succeedMoveEntry(from: Slashlink, to: Slashlink)

case requestMergeEntry(parent: Slashlink, child: Slashlink)
case succeedMergeEntry(parent: Slashlink, child: Slashlink)

case requestSaveEntry(MemoEntry)
case succeedSaveEntry(address: Slashlink, modified: Date)

case requestUpdateAudience(address: Slashlink, audience: Audience)
case succeedUpdateAudience(_ receipt: MoveReceipt)
case requestAssignNoteColor(_ address: Slashlink, _ color: NoteColor)
}

extension MemoEditorDetailNotification {
Expand All @@ -311,6 +304,8 @@ extension MemoEditorDetailNotification {
return .requestMergeEntry(parent: parent, child: child)
case let .forwardRequestUpdateAudience(address, audience):
return .requestUpdateAudience(address: address, audience: audience)
case let .forwardRequestAssignNoteColor(address, color):
return .requestAssignNoteColor(address, color)
default:
return nil
}
Expand Down Expand Up @@ -427,6 +422,10 @@ enum MemoEditorDetailAction: Hashable {
case requestUpdateAudience(_ audience: Audience)
case forwardRequestUpdateAudience(address: Slashlink, _ audience: Audience)
case succeedUpdateAudience(_ receipt: MoveReceipt)
case requestAssignNoteColor(_ color: NoteColor)
case forwardRequestAssignNoteColor(address: Slashlink, _ color: NoteColor)
case succeedAssignNoteColor(_ address: Slashlink, _ color: NoteColor)


// Editor
/// Update editor dom and mark if this state is saved or not
Expand Down Expand Up @@ -514,6 +513,8 @@ extension MemoEditorDetailAction {
return .succeedMergeEntry(parent: parent, child: child)
case let .succeedUpdateAudience(receipt):
return .succeedUpdateAudience(receipt)
case let .succeedAssignNoteColor(address, color):
return .succeedAssignNoteColor(address, color)

case .succeedIndexOurSphere(_),
.completeIndexPeers:
Expand Down Expand Up @@ -586,6 +587,8 @@ struct DetailMetaSheetCursor: CursorProtocol {
return .selectRenameSuggestion(suggestion)
case let .requestUpdateAudience(audience):
return .requestUpdateAudience(audience)
case let .requestAssignNoteColor(color):
return .requestAssignNoteColor(color)
case .requestDelete(let address):
return .requestDelete(address)
default:
Expand Down Expand Up @@ -884,13 +887,25 @@ struct MemoEditorDetailModel: ModelProtocol {
environment: environment,
audience: audience
)

case let .succeedUpdateAudience(receipt):
return succeedUpdateAudience(
state: state,
environment: environment,
receipt: receipt
)
case let .requestAssignNoteColor(color):
return requestAssignNoteColor(
state: state,
environment: environment,
color: color
)
case let .succeedAssignNoteColor(address, color):
return succeedAssignNoteColor(
state: state,
environment: environment,
address: address,
color: color
)
case let .selectRenameSuggestion(suggestion):
return selectRenameSuggestion(
state: state,
Expand Down Expand Up @@ -959,7 +974,7 @@ struct MemoEditorDetailModel: ModelProtocol {
environment: environment
)
case .forwardRequestSaveEntry, .forwardRequestDelete, .forwardRequestMoveEntry,
.forwardRequestMergeEntry, .forwardRequestUpdateAudience:
.forwardRequestMergeEntry, .forwardRequestUpdateAudience, .forwardRequestAssignNoteColor:
return Update(state: state)
}
}
Expand Down Expand Up @@ -1913,6 +1928,54 @@ struct MemoEditorDetailModel: ModelProtocol {
return Update(state: state, fx: fx)
}

static func requestAssignNoteColor(
state: MemoEditorDetailModel,
environment: AppEnvironment,
color: NoteColor
) -> Update<MemoEditorDetailModel> {
guard let address = state.address else {
return Update(state: state)
}

let saveFx: Fx<MemoEditorDetailAction> = Just(
.autosave
).eraseToAnyPublisher()

let audienceFx: Fx<MemoEditorDetailAction> = Just(
.forwardRequestAssignNoteColor(
address: address,
color
)
).eraseToAnyPublisher()

// Save before updating color
let fx = saveFx.merge(with: audienceFx).eraseToAnyPublisher()

return Update(state: state, fx: fx)
}

static func succeedAssignNoteColor(
state: MemoEditorDetailModel,
environment: AppEnvironment,
address: Slashlink,
color: NoteColor
) -> Update<MemoEditorDetailModel> {
guard state.address != nil else {
return Update(state: state)
}

guard state.address == address else {
return Update(state: state)
}

return update(
state: state,
// Forward success down to meta sheet
action: .metaSheet(.succeedAssignNoteColor(color)),
environment: environment
)
}

/// Insert wikilink markup into editor, begining at previous range
/// and wrapping the contents of previous range
static func insertTaggedMarkup<T>(
Expand Down
Loading

0 comments on commit 8159f6d

Please sign in to comment.