File size: 1,760 Bytes
ef78361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""감성 뢄석 Feature Plugin.

API: /api/v1/sentiment
"""
import streamlit as st

from . import run, overview, in_house, competitor, keyword_analysis, feedback, summary
from .data import load_sentiment_data

FEATURE_CONFIG = {
    "key": "sentiment",
    "name": "감성 뢄석",
    "icon": "πŸ“Š",
    "description": "AI ν”Œλž«νΌμ˜ λΈŒλžœλ“œ 감성 뢄석 κ²°κ³Ό",
    "api_base": "/api/v1/sentiment",
    "order": 1,
}


def render(base_ctx):
    """감성 뢄석 feature λ Œλ”λ§."""
    with st.spinner("감성 뢄석 데이터 λ‘œλ”© 쀑..."):
        data = load_sentiment_data(
            base_ctx.get("api_key") or "",
            base_ctx["campaign_id"],
            access_token=base_ctx.get("access_token") or "",
        )

    if data is None:
        st.error("감성 뢄석 데이터 λ‘œλ”© μ‹€νŒ¨")
        return

    # Inject base_ctx fields into data
    data["campaign_name"] = base_ctx.get("campaign_name", "")

    # 1. Feature summary
    summary.render_summary(data)

    # 2. Sub-tabs
    tabs = st.tabs([
        "πŸš€ μ‹€ν–‰μš”μ²­",
        "πŸ“Š μ˜€λ²„λ·°",
        "🏠 μžμ‚¬ λΈŒλžœλ“œ",
        "🏒 κ²½μŸμ‚¬",
        "πŸ” ν‚€μ›Œλ“œ 뢄석",
    ])

    tab_renderers = [
        ("μ‹€ν–‰μš”μ²­", run.render),
        ("μ˜€λ²„λ·°", overview.render),
        ("μžμ‚¬ λΈŒλžœλ“œ", in_house.render),
        ("κ²½μŸμ‚¬", competitor.render),
        ("ν‚€μ›Œλ“œ 뢄석", keyword_analysis.render),
    ]
    for tab, (label, renderer) in zip(tabs, tab_renderers):
        with tab:
            try:
                renderer(data)
            except Exception as e:
                st.error(f"{label} λ‘œλ”© μ‹€νŒ¨: {e}")

    # 3. Feedback (below tabs)
    feedback.render_feedback_stats(data.get("feedback_stats", {}))