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 }