fjtui/src/types.ts

131 lines
2.6 KiB
TypeScript

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;
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';
}
export interface AddCommentForm {
body: string;
}
export interface EditIssueForm {
title: string;
body: string;
activeField: 'title' | 'body';
}
export interface AddTimeForm {
timeInput: string;
}
export type ScreenType = 'setup' | 'repo-picker' | 'list' | 'details' | 'create-issue' | 'add-comment' | 'edit-issue' | 'add-time' | 'confirm-state-change' | 'animating-close' | 'animating-reopen' | 'set-assignees';
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' | '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;
}