File size: 2,884 Bytes
2cd1b38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""Event handlers: session actions → render updates."""

from __future__ import annotations

import gradio as gr

from app.db import SupabaseReviewStore
from app.models import EvaluationTask
from app.render import ReviewRenderer
from app.review_session import (
    ReviewContext,
    bootstrap_review,
    go_back_from_complete,
    go_complete,
    go_previous,
    save_and_advance,
)


class ReviewController:
    """Maps Gradio events to review session logic and UI updates."""

    def __init__(self, store: SupabaseReviewStore, renderer: ReviewRenderer) -> None:
        self._store = store
        self._renderer = renderer

    def render(
        self,
        ctx: ReviewContext,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        return self._renderer.render(ctx, task, selections)

    def on_load(
        self,
        request: gr.Request,
        ctx: ReviewContext | None,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        ctx, task, selections = bootstrap_review(
            self._store, request.query_params.get("invite", "")
        )
        return self.render(ctx, task, selections)

    def on_toggle(
        self,
        index: int,
        ctx: ReviewContext | None,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        if task is None or ctx is None:
            return self.render(ctx, task, selections)
        selections = self._renderer.toggle_selection(selections, index)
        return self._renderer.render_toggle(index, ctx, selections)

    def on_primary(
        self,
        ctx: ReviewContext | None,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        if task is None or ctx is None:
            return self.render(ctx, task, selections)
        ctx, task, selections = save_and_advance(self._store, ctx, task, selections)
        return self.render(ctx, task, selections)

    def on_previous(
        self,
        ctx: ReviewContext | None,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        if ctx is None:
            return self.render(ctx, task, selections)
        return self.render(*go_previous(self._store, ctx))

    def on_complete(
        self,
        ctx: ReviewContext | None,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        if ctx is None:
            return self.render(ctx, task, selections)
        return self.render(*go_complete(self._store, ctx))

    def on_back_from_complete(
        self,
        ctx: ReviewContext | None,
        task: EvaluationTask | None,
        selections: list[bool],
    ) -> tuple:
        if ctx is None:
            return self.render(ctx, task, selections)
        return self.render(*go_back_from_complete(self._store, ctx))