fjtui/src/types.ts

157 lines
3.2 KiB
TypeScript

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;
}