export interface Config { url: string; token: string | null; userid: string; owner: string; repo: string; autoRefreshInterval?: number; } export interface User { id: number; login: string; full_name: string; } export interface Label { id: number; name: string; color: string; description?: string; exclusive?: boolean; } export interface Issue { id: number; number: number; title: string; state: 'open' | 'closed'; body: string; user: User; created_at: string; updated_at: string; comments: number; labels: Label[]; pull_request?: any | null; total_tracked_time?: number; // Total time in seconds assignees?: User[]; } export interface Comment { id: number; user: User; body: string; created_at: string; updated_at: string; } export interface SetupForm { url: string; userid: string; token: string; saveConfig: boolean; activeField: 'url' | 'userid' | 'token' | 'saveConfig'; } export interface CreateIssueForm { title: string; body: string; activeField: 'title' | 'body'; cursor: number; } export interface AddCommentForm { body: string; } export interface EditIssueForm { title: string; body: string; activeField: 'title' | 'body'; cursor: number; } export interface AddTimeForm { timeInput: string; } export interface LabelForm { name: string; color: string; description: string; exclusive: boolean; activeField: 'name' | 'color' | 'description' | 'exclusive'; } export type ScreenType = 'launch' | 'setup' | 'repo-picker' | 'list' | 'details' | 'create-issue' | 'add-comment' | 'edit-issue' | 'add-time' | 'confirm-state-change' | 'confirm-cancel-create' | 'animating-close' | 'animating-reopen' | 'set-assignees' | 'labels-list' | 'create-label' | 'edit-label' | 'help'; export interface RepoItem { id: number; name: string; full_name: string; private: boolean; description: string; } export interface AppState { screen: ScreenType; previousScreen?: ScreenType; config: Config; autoRefreshInterval: number; focusedPane: 'list' | 'settings'; selectedSettingIndex: number; // List Screen State issues: Issue[]; currentPage: number; issuesPerPage: number; totalIssuesCount: number; // calculated or fetched loading: boolean; error: string | null; selectedIssueIndex: number; // cursor in list searchQuery: string; stateFilter: 'open' | 'closed' | 'all'; typeFilter: 'issues' | 'pulls' | 'all'; sortField: 'created' | 'updated' | 'comments' | 'assignees'; sortOrder: 'asc' | 'desc'; // Detail Screen State selectedIssue: Issue | null; selectedIssueComments: Comment[]; commentsLoading: boolean; detailScrollOffset: number; assigneesInput: string; // Repo Picker State repos: RepoItem[]; selectedRepoIndex: number; repoSearchQuery: string; repoPickerActiveSearch: boolean; // Setup Form State setupForm: SetupForm; // Create Issue Form State createIssueForm: CreateIssueForm; // Add Comment Form State addCommentForm: AddCommentForm; // Edit Issue Form State editIssueForm: EditIssueForm; // Add Time Form State addTimeForm: AddTimeForm; // Labels List State labels: Label[]; selectedLabelIndex: number; labelsLoading: boolean; // Label Form State labelForm: LabelForm; }