From c9289eb24f88c6e45014e498ac9f781e1ce0ba3f Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Wed, 6 May 2026 15:13:38 +0300 Subject: [PATCH] feat: add stash access in clean git state Show a Stashes button when the working tree is clean Keep stash management available even without visible file changes --- packages/ui/src/components/views/GitView.tsx | 6 ++--- .../components/views/git/GitEmptyState.tsx | 22 +++++++++++++++++-- packages/ui/src/lib/i18n/messages/en.ts | 1 + packages/ui/src/lib/i18n/messages/es.ts | 1 + packages/ui/src/lib/i18n/messages/ko.ts | 1 + packages/ui/src/lib/i18n/messages/pt-BR.ts | 1 + packages/ui/src/lib/i18n/messages/uk.ts | 1 + packages/ui/src/lib/i18n/messages/zh-CN.ts | 1 + 8 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/views/GitView.tsx b/packages/ui/src/components/views/GitView.tsx index 7ac5eaed..71458b4d 100644 --- a/packages/ui/src/components/views/GitView.tsx +++ b/packages/ui/src/components/views/GitView.tsx @@ -982,7 +982,7 @@ export const GitView: React.FC = () => { } else if (pushedChanges) { toast.success(t('gitView.toast.pushedToUpstream')); } else { - toast.success(t('gitView.toast.syncedChanges')); + toast.success(t('gitView.toast.alreadyUpToDate')); } } @@ -1104,7 +1104,7 @@ export const GitView: React.FC = () => { } else if (pushedChanges) { toast.success(t('gitView.toast.pushedToUpstream')); } else { - toast.success(t('gitView.toast.syncedChanges')); + toast.success(t('gitView.toast.alreadyUpToDate')); } triggerFireworks(); @@ -2241,7 +2241,7 @@ export const GitView: React.FC = () => { /> ) : ( - + setIsStashesDialogOpen(true)} /> )} ) : null} diff --git a/packages/ui/src/components/views/git/GitEmptyState.tsx b/packages/ui/src/components/views/git/GitEmptyState.tsx index d7d1389f..40ce2d19 100644 --- a/packages/ui/src/components/views/git/GitEmptyState.tsx +++ b/packages/ui/src/components/views/git/GitEmptyState.tsx @@ -1,8 +1,13 @@ import React from 'react'; -import { RiGitCommitLine } from '@remixicon/react'; +import { RiArchiveStackLine, RiGitCommitLine } from '@remixicon/react'; +import { Button } from '@/components/ui/button'; import { useI18n } from '@/lib/i18n'; -export const GitEmptyState: React.FC = () => { +interface GitEmptyStateProps { + onOpenStashes?: () => void; +} + +export const GitEmptyState: React.FC = ({ onOpenStashes }) => { const { t } = useI18n(); return (
@@ -13,6 +18,19 @@ export const GitEmptyState: React.FC = () => {

{t('gitView.empty.cleanDescription')}

+ + {onOpenStashes ? ( + + ) : null}
); }; diff --git a/packages/ui/src/lib/i18n/messages/en.ts b/packages/ui/src/lib/i18n/messages/en.ts index 137ca088..0bc709be 100644 --- a/packages/ui/src/lib/i18n/messages/en.ts +++ b/packages/ui/src/lib/i18n/messages/en.ts @@ -708,6 +708,7 @@ export const dict = { 'gitView.toast.pulledFilesSingle': 'Pulled {count} file from {name}', 'gitView.toast.pushedToUpstream': 'Pushed to upstream', 'gitView.toast.commitOrStashBeforeSync': 'Commit or stash your changes before syncing', + 'gitView.toast.alreadyUpToDate': 'Already up to date', 'gitView.toast.syncedPulledPluralAndPushed': 'Pulled {count} files from {name} and pushed to upstream', 'gitView.toast.syncedPulledSingleAndPushed': 'Pulled {count} file from {name} and pushed to upstream', 'gitView.toast.syncedChanges': 'Synced changes', diff --git a/packages/ui/src/lib/i18n/messages/es.ts b/packages/ui/src/lib/i18n/messages/es.ts index a165429d..32cbb435 100644 --- a/packages/ui/src/lib/i18n/messages/es.ts +++ b/packages/ui/src/lib/i18n/messages/es.ts @@ -709,6 +709,7 @@ export const dict: Record = { "gitView.toast.pulledFilesSingle": "Se trajo {count} archivo de {name}", "gitView.toast.pushedToUpstream": "Enviado al upstream", "gitView.toast.commitOrStashBeforeSync": "Haz commit o stash de tus cambios antes de sincronizar", + "gitView.toast.alreadyUpToDate": "Ya está actualizado", "gitView.toast.syncedPulledPluralAndPushed": "Se trajeron {count} archivos de {name} y se envió al upstream", "gitView.toast.syncedPulledSingleAndPushed": "Se trajo {count} archivo de {name} y se envió al upstream", "gitView.toast.syncedChanges": "Cambios sincronizados", diff --git a/packages/ui/src/lib/i18n/messages/ko.ts b/packages/ui/src/lib/i18n/messages/ko.ts index f8d29b18..bae70b62 100644 --- a/packages/ui/src/lib/i18n/messages/ko.ts +++ b/packages/ui/src/lib/i18n/messages/ko.ts @@ -709,6 +709,7 @@ export const dict: Record = { 'gitView.toast.pulledFilesSingle': '{name}에서 파일 {count}개를 풀했습니다', 'gitView.toast.pushedToUpstream': '업스트림에 푸시했습니다', 'gitView.toast.commitOrStashBeforeSync': '동기화하기 전에 변경 사항을 커밋하거나 stash하세요', + 'gitView.toast.alreadyUpToDate': '이미 최신 상태입니다', 'gitView.toast.syncedPulledPluralAndPushed': '{name}에서 파일 {count}개를 풀하고 업스트림에 푸시했습니다', 'gitView.toast.syncedPulledSingleAndPushed': '{name}에서 파일 {count}개를 풀하고 업스트림에 푸시했습니다', 'gitView.toast.syncedChanges': '변경 사항을 동기화했습니다', diff --git a/packages/ui/src/lib/i18n/messages/pt-BR.ts b/packages/ui/src/lib/i18n/messages/pt-BR.ts index bc5ba74a..cb26a47a 100644 --- a/packages/ui/src/lib/i18n/messages/pt-BR.ts +++ b/packages/ui/src/lib/i18n/messages/pt-BR.ts @@ -709,6 +709,7 @@ export const dict: Record = { "gitView.toast.pulledFilesSingle": "Se trajo {count} arquivo de {name}", "gitView.toast.pushedToUpstream": "Enviado ao upstream", "gitView.toast.commitOrStashBeforeSync": "Faça commit ou stash das alterações antes de sincronizar", + "gitView.toast.alreadyUpToDate": "Já está atualizado", "gitView.toast.syncedPulledPluralAndPushed": "Foram trazidos {count} arquivos de {name} e enviados ao upstream", "gitView.toast.syncedPulledSingleAndPushed": "Foi trazido {count} arquivo de {name} e enviado ao upstream", "gitView.toast.syncedChanges": "Alterações sincronizadas", diff --git a/packages/ui/src/lib/i18n/messages/uk.ts b/packages/ui/src/lib/i18n/messages/uk.ts index 5119df5a..1bcaf8a6 100644 --- a/packages/ui/src/lib/i18n/messages/uk.ts +++ b/packages/ui/src/lib/i18n/messages/uk.ts @@ -709,6 +709,7 @@ export const dict: Record = { "gitView.toast.pulledFilesSingle": "Отримано файл: {count} з {name}", "gitView.toast.pushedToUpstream": "Надіслано в upstream", "gitView.toast.commitOrStashBeforeSync": "Закомітьте або сховайте зміни перед синхронізацією", + "gitView.toast.alreadyUpToDate": "Вже актуально", "gitView.toast.syncedPulledPluralAndPushed": "Отримано файлів: {count} з {name} і надіслано в upstream", "gitView.toast.syncedPulledSingleAndPushed": "Отримано файл: {count} з {name} і надіслано в upstream", "gitView.toast.syncedChanges": "Зміни синхронізовано", diff --git a/packages/ui/src/lib/i18n/messages/zh-CN.ts b/packages/ui/src/lib/i18n/messages/zh-CN.ts index a4af4128..f83f58f1 100644 --- a/packages/ui/src/lib/i18n/messages/zh-CN.ts +++ b/packages/ui/src/lib/i18n/messages/zh-CN.ts @@ -709,6 +709,7 @@ export const dict: Record = { 'gitView.toast.pulledFilesSingle': '已从 {name} 拉取 {count} 个文件', 'gitView.toast.pushedToUpstream': '已推送到上游', 'gitView.toast.commitOrStashBeforeSync': '同步前请先提交或储藏你的更改', + 'gitView.toast.alreadyUpToDate': '已是最新状态', 'gitView.toast.syncedPulledPluralAndPushed': '已从 {name} 拉取 {count} 个文件并推送到上游', 'gitView.toast.syncedPulledSingleAndPushed': '已从 {name} 拉取 {count} 个文件并推送到上游', 'gitView.toast.syncedChanges': '已同步更改',