a code review tool

fix(tui): refresh review status after approving a change

+23 -17
+5 -3
lib/tui/lens_tui.ml
··· 61 61 flavor 62 62 (fun (graph @ local) -> 63 63 let route, set_route = Bonsai.state (Log : Route.t) graph in 64 - (* Review progress survives route changes *) 64 + (* Review progress and generation survive route changes *) 65 65 let reviewed_files_map, set_reviewed_files_map = 66 66 Bonsai.state String.Map.empty graph 67 67 in 68 + let review_generation, set_review_generation = Bonsai.state 0 graph in 68 69 let%sub final_view, final_handler = 69 70 match%sub route with 70 71 | Log -> ··· 102 103 else Effect.Ignore 103 104 in 104 105 let ~view, ~handler = 105 - Log_screen.component ~dimensions ~store ~exit ~enter_review graph 106 + Log_screen.component ~dimensions ~store ~exit ~enter_review ~review_generation graph 106 107 in 107 108 let%arr view and handler in 108 109 view, handler ··· 126 127 set_route Log 127 128 in 128 129 let on_approve = 129 - let%arr set_route and change_id and commit_id in 130 + let%arr set_route and change_id and commit_id and set_review_generation and review_generation in 130 131 let open Effect.Let_syntax in 131 132 let%bind () = 132 133 Effect.of_lwt_thunk (fun () -> 133 134 Lens_backend.Store.approve store change_id user_id commit_id) 134 135 in 136 + let%bind () = set_review_generation (review_generation + 1) in 135 137 set_route Log 136 138 in 137 139 let ~view, ~handler =
+3 -2
lib/tui/log_screen.ml
··· 120 120 ~(store : Lens_backend.Store.t) 121 121 ~(exit : unit -> unit Effect.t) 122 122 ~(enter_review : (Jj.Change.t -> unit Effect.t) Bonsai.t) 123 + ~(review_generation : int Bonsai.t) 123 124 (graph @ local) 124 125 = 125 126 let focus, set_focus = Bonsai.state (Log : Focus.t) graph in ··· 148 149 - pad_h 149 150 } 150 151 in 151 - let log_view = Log_view.component ~dimensions:top_dims ~store graph in 152 + let log_view = Log_view.component ~dimensions:top_dims ~store ~review_generation graph in 152 153 let editor = Editor.component ~dimensions graph in 153 154 let selected_change = 154 155 let%arr selected_row = log_view.selected_row in 155 156 Option.map selected_row ~f:Graph_layout.Row.change 156 157 in 157 158 let bottom_view = Diff_view.component ~dimensions:bottom_dims ~selected_change graph in 158 - let review_view = Review_view.component ~selected_change ~store graph in 159 + let review_view = Review_view.component ~selected_change ~store ~review_generation graph in 159 160 let textbox_focused = 160 161 let%arr focus in 161 162 match focus with
+6 -6
lib/tui/log_view.ml
··· 134 134 View.vcat [ line1; line2 ] 135 135 ;; 136 136 137 - let component ~dimensions ~(store : Lens_backend.Store.t) (graph @ local) = 137 + let component ~dimensions ~(store : Lens_backend.Store.t) ~review_generation (graph @ local) = 138 138 let selected_idx, set_selected_idx = Bonsai.state' 0 graph in 139 139 let changes, refresh_changes = 140 140 Bonsai.Edge.Poll.manual_refresh ··· 149 149 Graph_layout.layout changes 150 150 in 151 151 (* Review counts: poll when changes update or when manually refreshed *) 152 - let review_generation, set_review_generation = Bonsai.state' 0 graph in 152 + let internal_review_gen, set_internal_review_gen = Bonsai.state' 0 graph in 153 153 let review_poll_input = 154 - let%arr changes and review_generation in 155 - changes, review_generation 154 + let%arr changes and internal_review_gen and review_generation in 155 + changes, internal_review_gen + review_generation 156 156 in 157 157 let review_counts = 158 158 Bonsai.Edge.Poll.effect_on_change ··· 180 180 graph 181 181 in 182 182 let refresh_reviews = 183 - let%arr set_review_generation in 184 - set_review_generation (fun n -> n + 1) 183 + let%arr set_internal_review_gen in 184 + set_internal_review_gen (fun n -> n + 1) 185 185 in 186 186 let less_keybindings = 187 187 Navigation_key_bindings.component
+1
lib/tui/log_view.mli
··· 14 14 val component 15 15 : dimensions:Dimensions.t Bonsai.t 16 16 -> store:Lens_backend.Store.t 17 + -> review_generation:int Bonsai.t 17 18 -> Bonsai.graph @ local 18 19 -> t
+8 -6
lib/tui/review_view.ml
··· 36 36 ([ View.text ~attrs:[ Attr.fg (c Subtext0) ] "Reviews: " ] @ reviewer_views) 37 37 ;; 38 38 39 - let component ~selected_change ~(store : Lens_backend.Store.t) (graph @ local) = 40 - let generation, set_generation = Bonsai.state' 0 graph in 39 + let component ~selected_change ~(store : Lens_backend.Store.t) ~review_generation 40 + (graph @ local) 41 + = 42 + let internal_gen, set_internal_gen = Bonsai.state' 0 graph in 41 43 let poll_input = 42 - let%arr selected_change and generation in 43 - selected_change, generation 44 + let%arr selected_change and internal_gen and review_generation in 45 + selected_change, internal_gen + review_generation 44 46 in 45 47 let review_data = 46 48 Bonsai.Edge.Poll.effect_on_change ··· 84 86 render_reviews ~flavor statuses 85 87 in 86 88 let refresh = 87 - let%arr set_generation in 88 - set_generation (fun n -> n + 1) 89 + let%arr set_internal_gen in 90 + set_internal_gen (fun n -> n + 1) 89 91 in 90 92 { view; refresh } 91 93 ;;