diff --git a/assets/repo_view_screen.tcss b/assets/repo_view_screen.tcss index ac3f662..8f1b8a2 100644 --- a/assets/repo_view_screen.tcss +++ b/assets/repo_view_screen.tcss @@ -33,7 +33,7 @@ } #files { - height: 5; + min-height: 4; background: red 50%; margin-left: 1; border: tall $surface; @@ -75,4 +75,8 @@ max-width: 16; margin-right: 1; } +} + +LoadingIndicator { + height: 1; } \ No newline at end of file diff --git a/screens/repo_view_screen.py b/screens/repo_view_screen.py index 89712f9..1e584aa 100644 --- a/screens/repo_view_screen.py +++ b/screens/repo_view_screen.py @@ -1,6 +1,6 @@ from textual.screen import Screen from textual.app import ComposeResult -from textual.widgets import Input, Select, Static, DataTable, ContentSwitcher, Tabs, Tab, Button +from textual.widgets import Input, Select, LoadingIndicator, Static, DataTable, ContentSwitcher, Tabs, Tab, Button from textual.containers import VerticalGroup, Vertical, HorizontalGroup, Right from widgets import Navbar @@ -15,6 +15,98 @@ class RepoViewScreen(Screen): super().__init__() self.owner_name = owner_name self.repo_name = repo_name + + def get_icon_from_name_and_type(self, file_name: str, is_folder: bool): + + # nerd font icons my beloved + if not is_folder: + if not "." in file_name: + match file_name: + case "Makefile": + return "\ue673" + case "Dockerfile": + return "\ue7b0" + case _: + return "\uf15b" + + extension = file_name[file_name.index(".")+1:] + + match extension: + case 'c' | 'h': + return "\ue61e" + case 'cpp': + return "\ue61d" + case 'py': + return "\ue73c" + case 'js': + return "\ue781" + case 'gitignore': + return "\ue702" + case 'css' | 'tcss': + return "\ue749" + case 'go': + return "\ue65e" + case 'rs': + return "\ue7a8" + case 'grnd': + return "\uf44f" + case 'md': + return "\ueb1d" + case 'fish': + return "\uee41" + case 'sh': + return "\ue760" + case 'bat': + return "\ue70f" + case _: + return "\uf15b" + else: + return "\ue5ff" + + async def on_mount(self): + files: DataTable = self.query_one("#files") + loading = self.query_one(LoadingIndicator) + + files.display = False + + # get files in root dir + files_response = requests.get( + self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/contents" + ) + + loading.display = False + + if not files_response.ok: + self.notify(files_response.text, title="Failed to get files:", severity="error") + return + + # get most recent commit + commits_response = requests.get( + self.app.GITEA_HOST + f"api/v1/repos/{self.owner_name}/{self.repo_name}/commits", + params={ + "limit": 1 + } + ) + + if not commits_response.ok: + self.notify(commits_response.text, title="Failed to get most recent commit:", severity="error") + return + + most_recent_commit = commits_response.json()[0] + files.add_columns( + f"[b]{most_recent_commit["author"]["login"]}[/]", + f"[r]{most_recent_commit["sha"][:10]}[/]", + f"[d]{most_recent_commit["commit"]["message"]}" + ) + + + + rows = [] + for file in files_response.json(): + rows.append((f"[cyan]{self.get_icon_from_name_and_type(file["name"], file["type"] != "file")}[/] {file["name"]}", "[d]todo lol", "Updated idk ago")) + files.add_rows(rows) + + files.display = True def compose(self) -> ComposeResult: @@ -65,9 +157,11 @@ class RepoViewScreen(Screen): yield Button("Go to file", flat=True) table = DataTable(id="files", show_cursor=False) - table.add_columns("SpookyDervish [r]9b32c417e9[/]", "switched from tabs to spaces", "51 minutes ago") - table.add_row("\ue5ff screens", "[d]switched from tabs to spaces", "[d]51 minutes ago") + #table.add_columns("SpookyDervish [r]9b32c417e9[/]", "switched from tabs to spaces", "51 minutes ago") + #table.add_row("\ue5ff screens", "[d]switched from tabs to spaces", "[d]51 minutes ago") yield table + + yield LoadingIndicator() with Vertical(id="repo-info"): with HorizontalGroup(): yield Input("Search code...", id="search-query")