Skip to main content

ui_storybook/fixtures/
audio_apps.rs

1//! Audio-app fixtures — apps emitting audio that the system-audio
2//! picker can target (M-UI.9 / AUT-129).
3
4use crate::components::recorder::{AppIconView, AudioAppView, SystemAudioView};
5
6fn app_icon(id: &str, monogram: &str, color: &str) -> AppIconView {
7    AppIconView {
8        id: id.to_owned(),
9        monogram: monogram.to_owned(),
10        color: color.to_owned(),
11    }
12}
13
14/// All sample apps in display order.
15#[must_use]
16pub fn sample_audio_apps() -> Vec<AudioAppView> {
17    vec![
18        AudioAppView {
19            id: "spotify".to_owned(),
20            name: "Spotify".to_owned(),
21            context: "Discover Weekly · 18 m left".to_owned(),
22            selected: true,
23            suggested: true,
24            live: true,
25            level: Some(0.62),
26            icon: app_icon("spotify", "S", "#16a34a"),
27        },
28        AudioAppView {
29            id: "chrome-yt".to_owned(),
30            name: "Chrome — YouTube".to_owned(),
31            context: "Tab 3 · TWIR podcast ep 42".to_owned(),
32            selected: true,
33            suggested: true,
34            live: false,
35            level: Some(0.18),
36            icon: app_icon("chrome", "C", "#fbbf24"),
37        },
38        AudioAppView {
39            id: "discord".to_owned(),
40            name: "Discord".to_owned(),
41            context: "#engineering".to_owned(),
42            selected: false,
43            suggested: true,
44            live: false,
45            level: Some(0.05),
46            icon: app_icon("discord", "D", "#5865f2"),
47        },
48        AudioAppView {
49            id: "zoom".to_owned(),
50            name: "Zoom".to_owned(),
51            context: "Idle · last call 12m ago".to_owned(),
52            selected: false,
53            suggested: false,
54            live: false,
55            level: None,
56            icon: app_icon("zoom", "Z", "#0ea5e9"),
57        },
58        AudioAppView {
59            id: "messages".to_owned(),
60            name: "Messages".to_owned(),
61            context: "Notification sounds".to_owned(),
62            selected: false,
63            suggested: false,
64            live: false,
65            level: None,
66            icon: app_icon("messages", "M", "#22c55e"),
67        },
68    ]
69}
70
71/// Variant with no apps selected.
72#[must_use]
73pub fn sample_audio_apps_none_selected() -> Vec<AudioAppView> {
74    sample_audio_apps()
75        .into_iter()
76        .map(|mut a| {
77            a.selected = false;
78            a
79        })
80        .collect()
81}
82
83/// Variant with every app selected.
84#[must_use]
85pub fn sample_audio_apps_all_selected() -> Vec<AudioAppView> {
86    sample_audio_apps()
87        .into_iter()
88        .map(|mut a| {
89            a.selected = true;
90            a
91        })
92        .collect()
93}
94
95/// View-model for the collapsed `SystemAudioRow`.
96#[must_use]
97pub fn sample_system_audio_view(
98    enabled: bool,
99    expanded: bool,
100    selected_apps: &[AudioAppView],
101    total: usize,
102) -> SystemAudioView {
103    let icon_stack: Vec<AppIconView> = selected_apps.iter().map(|a| a.icon.clone()).collect();
104    SystemAudioView {
105        enabled,
106        expanded,
107        selected_count: selected_apps.iter().filter(|a| a.selected).count(),
108        total_count: total,
109        icon_stack,
110    }
111}