export interface Config { url: string; token: string | null; userid: string; owner: string; repo: string; } export interface User { id: number; login: string; full_name: string; } export interface Label { id: number; name: string; color: string; } 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; } 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'; } export interface AddCommentForm { body: string; } export interface EditIssueForm { title: string; body: string; activeField: 'title' | 'body'; } export type ScreenType = 'setup' | 'repo-picker' | 'list' | 'details' | 'create-issue' | 'add-comment' | 'edit-issue'; export interface RepoItem { id: number; name: string; full_name: string; private: boolean; description: string; } export interface AppState { screen: ScreenType; config: Config; // 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'; sortOrder: 'asc' | 'desc'; // Detail Screen State selectedIssue: Issue | null; selectedIssueComments: Comment[]; commentsLoading: boolean; detailScrollOffset: number; // 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; }