import { RefreshCw } from 'lucide-react' import type { ModuleRow } from './types' type GitChangedFile = { path: string status: 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked' staged: boolean unstaged: boolean } type GitCommitInfo = { hash: string shortHash: string author: string date: string message: string } type GitStatusInfo = { ok: boolean branch: string | null ahead: number behind: number files: GitChangedFile[] selectedFilePath: string | null diff: string commits: GitCommitInfo[] message?: string } type GitSubmissionInfo = { id: string submittedAt: string moduleName: string commit: GitCommitInfo } type DiffViewLine = { key: string type: 'file' | 'hunk' | 'context' | 'add' | 'delete' | 'note' oldLine: number | null newLine: number | null content: string } type GitTarget = { moduleName: string filePath: string } type GitSubmissionGroup = { id: string submittedAt: string submissions: GitSubmissionInfo[] } type Props = { dark: boolean borderSoft: string textStrong: string textMid: string textDim: string gitPanelTab: 'source' | 'history' gitChangedFileCount: number gitChangedModules: ModuleRow[] gitModuleStatuses: Record gitError: string | null gitLoading: boolean gitSubmissionsLoading: boolean gitSubmissionDiffLoading: boolean gitSubmissions: GitSubmissionInfo[] gitSubmissionGroups: GitSubmissionGroup[] selectedGitTarget: GitTarget | null selectedGitFile: GitChangedFile | null selectedGitStatus: GitStatusInfo | null selectedGitSubmission: GitSubmissionInfo | null selectedGitSubmissionDiff: string onGitPanelTabChange: (tab: 'source' | 'history') => void onRefresh: () => void onSelectGitFile: (moduleName: string, filePath: string) => void onOpenGitChangedFile: (moduleName: string, filePath: string) => void onOpenGitFileContextMenu: (module: ModuleRow, file: GitChangedFile, x: number, y: number) => void onSelectGitSubmission: (submission: GitSubmissionInfo) => void parseDiffViewLines: (diff: string) => DiffViewLine[] renderDiffLine: (line: DiffViewLine) => React.JSX.Element getGitStatusLabel: (status: GitChangedFile['status']) => string getGitStatusTone: (status: GitChangedFile['status']) => string formatGitCommitDate: (date: string) => string } function WorkspaceSourceControlView({ dark, borderSoft, textStrong, textMid, textDim, gitPanelTab, gitChangedFileCount, gitChangedModules, gitModuleStatuses, gitError, gitLoading, gitSubmissionsLoading, gitSubmissionDiffLoading, gitSubmissions, gitSubmissionGroups, selectedGitTarget, selectedGitFile, selectedGitStatus, selectedGitSubmission, selectedGitSubmissionDiff, onGitPanelTabChange, onRefresh, onSelectGitFile, onOpenGitChangedFile, onOpenGitFileContextMenu, onSelectGitSubmission, parseDiffViewLines, renderDiffLine, getGitStatusLabel, getGitStatusTone, formatGitCommitDate }: Props): React.JSX.Element { const refreshing = gitPanelTab === 'history' ? gitSubmissionsLoading : gitLoading return (
{[ { key: 'source' as const, label: '소스 제어' }, { key: 'history' as const, label: '제출 내역' } ].map((tab) => ( ))}
{gitPanelTab === 'source' ? (
{selectedGitTarget ? `${selectedGitTarget.moduleName} / ${selectedGitTarget.filePath}` : ''} {selectedGitTarget && selectedGitFile?.status !== 'deleted' && ( )}
{gitLoading && !selectedGitStatus ? (
변경 내용 불러오는 중
) : selectedGitStatus?.diff ? (
{parseDiffViewLines(selectedGitStatus.diff).map(renderDiffLine)}
) : (
)}
) : (
{selectedGitSubmission ? `${selectedGitSubmission.moduleName} / ${selectedGitSubmission.commit.shortHash}` : ''} {selectedGitSubmission && ( {formatGitCommitDate(selectedGitSubmission.submittedAt)} )}
{gitSubmissionDiffLoading ? (
변경 내용 불러오는 중
) : selectedGitSubmissionDiff ? (
{parseDiffViewLines(selectedGitSubmissionDiff).map(renderDiffLine)}
) : (
)}
)}
) } export default WorkspaceSourceControlView