/ src / features / feedback / settings-section.ts
settings-section.ts
 1  /**
 2   * Feedback Settings Section
 3   *
 4   * Feature-owned settings UI for bug reporting and feedback.
 5   * Rendered within the main settings panel.
 6   */
 7  
 8  import { Setting } from 'obsidian';
 9  import type InterBrainPlugin from '../../main';
10  import { useInterBrainStore } from '../../core/store/interbrain-store';
11  import { AutoReportPreference } from './store/slice';
12  
13  /**
14   * Create the feedback settings section
15   */
16  export function createFeedbackSettingsSection(
17    containerEl: HTMLElement,
18    plugin: InterBrainPlugin
19  ): void {
20    const header = containerEl.createEl('h2', { text: '🐛 Bug Reporting' });
21    header.id = 'feedback-section';
22  
23    // Auto-report preference
24    const state = useInterBrainStore.getState();
25  
26    new Setting(containerEl)
27      .setName('Automatic Error Reporting')
28      .setDesc('When InterBrain encounters an error:')
29      .addDropdown((dropdown) => {
30        dropdown
31          .addOption('always', 'Always send automatically')
32          .addOption('ask', 'Ask me each time (default)')
33          .addOption('never', 'Never send')
34          .setValue(state.feedback.autoReportPreference)
35          .onChange((value) => {
36            useInterBrainStore
37              .getState()
38              .setAutoReportPreference(value as AutoReportPreference);
39          });
40      });
41  
42    containerEl.createEl('hr');
43  
44    // Data inclusion section
45    containerEl.createEl('h3', { text: 'Data Included in Reports' });
46  
47    new Setting(containerEl)
48      .setName('Console logs')
49      .setDesc('Include last 50 log entries (helps understand context)')
50      .addToggle((toggle) => {
51        toggle.setValue(state.feedback.includeLogs).onChange((value) => {
52          useInterBrainStore.getState().setIncludeLogs(value);
53        });
54      });
55  
56    new Setting(containerEl)
57      .setName('App state snapshot')
58      .setDesc('Include current DreamSpace state (sanitized, no secrets)')
59      .addToggle((toggle) => {
60        toggle.setValue(state.feedback.includeState).onChange((value) => {
61          useInterBrainStore.getState().setIncludeState(value);
62        });
63      });
64  
65    containerEl.createEl('hr');
66  
67    // Action buttons
68    const buttonSetting = new Setting(containerEl)
69      .setName('Actions')
70      .setDesc('Report issues or view existing ones');
71  
72    buttonSetting.addButton((button) =>
73      button.setButtonText('Report a Bug').onClick(() => {
74        plugin.app.commands.executeCommandById('interbrain:report-bug');
75      })
76    );
77  
78    buttonSetting.addButton((button) =>
79      button.setButtonText('View Issues').onClick(() => {
80        window.open(
81          'https://github.com/ProjectLiminality/InterBrain/issues',
82          '_blank'
83        );
84      })
85    );
86  
87    }