Files
jobtrackingapp/job-tracker-ui/src/types.ts
T

339 lines
7.8 KiB
TypeScript

export interface Company {
id: number;
name: string;
location?: string;
source?: string;
recruiterName?: string;
recruiterEmail?: string;
recruiterLinkedIn?: string;
lastContactedAt?: string;
nextContactAt?: string;
pipelineStage?: string;
}
export type WorkflowActionKey = "package-work" | "follow-up" | "interview-prep" | "review-readiness";
export type WorkflowWorkspaceTab = "tailored-cv" | "follow-up" | "interview-prep" | "readiness";
export interface WorkflowSignal {
actionKey: WorkflowActionKey;
reason: string;
workspaceTab: WorkflowWorkspaceTab;
followMode?: string | null;
needsAttention: boolean;
hasPackageGap: boolean;
needsInterviewPrep: boolean;
needsFollowUpAction: boolean;
hasTailoredCv: boolean;
hasSavedApplicationAnswerDraft: boolean;
hasInterviewPrepNotes: boolean;
}
export interface TailoredCvExperienceItem {
title?: string | null;
company?: string | null;
location?: string | null;
start?: string | null;
end?: string | null;
isCurrent?: boolean;
bullets: string[];
}
export interface TailoredCvEducationItem {
qualification?: string | null;
qualificationLevel?: string | null;
institution?: string | null;
location?: string | null;
start?: string | null;
end?: string | null;
details: string[];
}
export interface TailoredCvCustomSection {
title?: string | null;
items: string[];
}
export interface TailoredCvRenderOptions {
showPhoto: boolean;
pageMode: string;
accentColor: string;
sectionOrder: string[];
bulletDensity: string;
}
export interface TailoredCvDraft {
id?: number | null;
canonicalProfileVersion?: number | null;
templateId: string;
headline?: string | null;
summary: string[];
selectedSkills: string[];
experience: TailoredCvExperienceItem[];
education: TailoredCvEducationItem[];
customSections: TailoredCvCustomSection[];
renderOptions: TailoredCvRenderOptions;
generationContextHash?: string | null;
lastGeneratedAtUtc?: string | null;
lastEditedAtUtc?: string | null;
status: string;
renderedText: string;
isLegacyFallback: boolean;
}
export interface JobApplication {
id: number;
jobTitle: string;
company: Company;
companyId?: number;
status: string;
dateApplied: string;
location?: string;
salary?: string;
nextAction?: string;
followUpAt?: string;
feedbackRequestedAt?: string;
responseReceived: boolean;
responseDate?: string;
description?: string;
translatedDescription?: string;
descriptionLanguage?: string;
tags?: string; // JSON array string
deadline?: string;
notes?: string;
coverLetterText?: string;
recruiterMessageDraft?: string | null;
jobUrl?: string;
shortSummary?: string;
fullSummary?: string | null;
tailoredCvText?: string | null;
tailoredCvUpdatedAt?: string | null;
workflowSignal?: WorkflowSignal | null;
hasResume?: boolean;
hasCoverLetter?: boolean;
hasPortfolio?: boolean;
hasOtherAttachment?: boolean;
daysSince: number;
isDeleted?: boolean;
deletedAt?: string;
needsFollowUp?: boolean;
followUpReason?: string | null;
}
export interface CandidateFitChannelGuidance {
cv: string[];
coverLetter: string[];
interview: string[];
recruiterMessage: string[];
}
export interface CandidateFit {
matchSummary: string;
fitLevel: string;
matchScore: number;
strengths: string[];
gaps: string[];
mention: string[];
avoid: string[];
cvImprovements: string[];
missingKeywords: string[];
interviewPrep: string[];
tailoredPitch: string;
guidance: CandidateFitChannelGuidance;
coverLetterDraft?: string | null;
recruiterMessageDraft?: string | null;
}
export interface FocusPlanResponse {
immediatePriorities: string[];
cvBulletIdeas: string[];
proofPointsToLeadWith: string[];
coverLetterAngles: string[];
followUpApproach: string[];
strategicSummary: string;
}
export interface InterviewPrepResponse {
summary: string;
talkingPoints: string[];
likelyQuestions: string[];
weakSpots: string[];
}
export interface ReadinessResponse {
score: number;
level: string;
completed: string[];
missing: string[];
reminders: string[];
workflowSignal: WorkflowSignal;
}
export interface FollowUpDraft {
subject: string;
body: string;
reason: string;
suggestedSendOn: string;
contextSummary: string;
contextSignals: string[];
threadSubject?: string | null;
lastCorrespondenceFrom?: string | null;
lastCorrespondenceAt?: string | null;
}
export interface ApplicationPackageResponse {
tailoredCvText: string;
coverLetterDraft?: string | null;
applicationAnswerDraft?: string | null;
recruiterMessageDraft?: string | null;
keyPoints: string[];
attachmentSignals: string[];
attachmentFilesUsed: string[];
coverLetterVariants: string[];
recruiterMessageVariants: string[];
}
export interface SaveApplicationDraftsRequest {
coverLetterText?: string | null;
notes?: string | null;
recruiterMessageDraft?: string | null;
}
export interface CorrespondenceAttachmentMetadata {
fileName?: string | null;
mimeType?: string | null;
sizeBytes?: number | null;
gmailAttachmentId?: string | null;
inline?: boolean;
}
export interface CorrespondenceMessage {
id: number;
jobApplicationId: number;
from: string;
direction?: string | null;
content: string;
subject?: string;
channel?: string;
date: string;
externalMessageId?: string | null;
externalThreadId?: string | null;
externalFrom?: string | null;
externalTo?: string | null;
externalLabelsJson?: string | null;
attachmentMetadataJson?: string | null;
}
export interface GmailJobMatchReason {
label: string;
value: string;
}
export interface GmailJobMatchedMessage {
id: string;
threadId: string;
subject: string;
from: string;
to: string;
date?: string;
snippet: string;
score: number;
confidence: string;
alreadyImported: boolean;
matchReasons: GmailJobMatchReason[];
}
export interface GmailJobMatchedThread {
threadId: string;
subject: string;
score: number;
confidence: string;
hasImportedMessages: boolean;
messageCount: number;
latestDate?: string;
matchReasons: GmailJobMatchReason[];
messages: GmailJobMatchedMessage[];
}
export interface GmailJobMatchesResponse {
jobApplicationId: number;
jobTitle: string;
companyName: string;
recruiterName?: string | null;
recruiterEmail?: string | null;
queries: string[];
threads: GmailJobMatchedThread[];
}
export interface GmailImportMessageResult {
imported: number;
skipped: number;
messageId: string;
threadId?: string | null;
message?: CorrespondenceMessage | null;
}
export interface GmailImportThreadResult {
imported: number;
skipped: number;
threadId?: string | null;
}
export interface GmailThreadRefreshThreadResult {
threadId: string;
imported: number;
skipped: number;
totalMessages: number;
status: string;
latestMessageDate?: string;
}
export interface GmailThreadRefreshResult {
jobApplicationId: number;
threadsChecked: number;
imported: number;
skipped: number;
hasLinkedThreads: boolean;
refreshedAt: string;
threads: GmailThreadRefreshThreadResult[];
}
export interface GmailStatus {
connected: boolean;
gmailAddress?: string;
connectedAt?: string;
lastSyncedAt?: string;
lastSyncAttemptedAt?: string;
lastSyncSucceededAt?: string;
lastSyncMode?: string | null;
lastSyncSource?: string | null;
lastSyncStatus?: string | null;
lastSyncError?: string | null;
}
export interface GmailMessageSummary {
id: string;
threadId: string;
subject: string;
from: string;
to: string;
date?: string;
snippet: string;
}
export interface JobImportResult {
title?: string;
company?: string;
location?: string;
description?: string;
translatedDescription?: string;
language?: string;
tags: string[];
sourceUrl: string;
deadline?: string;
success: boolean;
parser?: string;
error?: string;
}