fix(integrations): remove unnecessary Refresh control

Data already reloads on mount, after mutations, and after Apply & Restart,
so the section Refresh button was redundant noise.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
This commit is contained in:
Serhii Dziupin
2026-08-14 15:19:26 +00:00
committed by Cursor Agent
co-authored by Serhii Dziupin
parent 22ffc4c87f
commit 0e0580f95c
2 changed files with 14 additions and 57 deletions
@@ -52,7 +52,6 @@ export const ThirdPartyIntegrationsSection: React.FC<ThirdPartyIntegrationsSecti
const {
entries,
registryInfo,
isLoadingRegistry,
loadPlugins,
loadRegistryInfo,
createEntry,
@@ -62,7 +61,6 @@ export const ThirdPartyIntegrationsSection: React.FC<ThirdPartyIntegrationsSecti
useShallow((state) => ({
entries: state.entries,
registryInfo: state.registryInfo,
isLoadingRegistry: state.isLoadingRegistry,
loadPlugins: state.loadPlugins,
loadRegistryInfo: state.loadRegistryInfo,
createEntry: state.createEntry,
@@ -71,7 +69,6 @@ export const ThirdPartyIntegrationsSection: React.FC<ThirdPartyIntegrationsSecti
})),
);
const [isRefreshing, setIsRefreshing] = React.useState(false);
const [registryLoadFailed, setRegistryLoadFailed] = React.useState(false);
const [pendingAction, setPendingAction] = React.useState<{
pluginId: string;
@@ -87,26 +84,21 @@ export const ThirdPartyIntegrationsSection: React.FC<ThirdPartyIntegrationsSecti
const [openPluginIds, setOpenPluginIds] = React.useState<ReadonlySet<string>>(() => new Set());
const refresh = React.useCallback(async () => {
setIsRefreshing(true);
try {
const pluginsLoaded = await loadPlugins({ force: true });
if (!pluginsLoaded) {
setRegistryLoadFailed(true);
return;
}
const latestEntries = usePluginsStore.getState().entries;
const specs = new Set(THIRD_PARTY_PLUGINS.map((plugin) => plugin.packageName));
for (const entry of latestEntries) {
if (THIRD_PARTY_PLUGINS.some((plugin) => entry.spec === plugin.packageName || entry.spec.startsWith(`${plugin.packageName}@`))) {
specs.add(entry.spec);
}
}
const registryLoaded = await loadRegistryInfo({ specs: [...specs], force: true });
setRegistryLoadFailed(!registryLoaded);
} finally {
setIsRefreshing(false);
const pluginsLoaded = await loadPlugins({ force: true });
if (!pluginsLoaded) {
setRegistryLoadFailed(true);
return;
}
const latestEntries = usePluginsStore.getState().entries;
const specs = new Set(THIRD_PARTY_PLUGINS.map((plugin) => plugin.packageName));
for (const entry of latestEntries) {
if (THIRD_PARTY_PLUGINS.some((plugin) => entry.spec === plugin.packageName || entry.spec.startsWith(`${plugin.packageName}@`))) {
specs.add(entry.spec);
}
}
const registryLoaded = await loadRegistryInfo({ specs: [...specs], force: true });
setRegistryLoadFailed(!registryLoaded);
}, [loadPlugins, loadRegistryInfo]);
React.useEffect(() => {
@@ -383,18 +375,6 @@ export const ThirdPartyIntegrationsSection: React.FC<ThirdPartyIntegrationsSecti
) : null}
{primaryLabel}
</Button>
{registryUnavailable ? (
<Button
type="button"
size="sm"
variant="outline"
onClick={() => void refresh()}
disabled={isRefreshing || isLoadingRegistry || isPending}
>
{isRefreshing || isLoadingRegistry ? <Icon name="loader-4" className="size-3.5 animate-spin" /> : null}
{t('settings.integrations.thirdParty.actions.refresh')}
</Button>
) : null}
<Button
type="button"
size="sm"
@@ -431,18 +411,6 @@ export const ThirdPartyIntegrationsSection: React.FC<ThirdPartyIntegrationsSecti
info={t('settings.integrations.thirdParty.info')}
divider={false}
settingsItem="integrations.third-party"
headerAction={(
<Button
type="button"
size="xs"
variant="outline"
onClick={() => void refresh()}
disabled={isRefreshing || isLoadingRegistry}
>
{isRefreshing || isLoadingRegistry ? <Icon name="loader-4" className="size-3.5 animate-spin" /> : null}
{t('settings.integrations.thirdParty.actions.refresh')}
</Button>
)}
contentClassName="space-y-3"
>
{THIRD_PARTY_PLUGINS.map(renderPlugin)}
@@ -15,7 +15,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Update',
'settings.integrations.thirdParty.actions.setup': 'Set up',
'settings.integrations.thirdParty.actions.remove': 'Remove',
'settings.integrations.thirdParty.actions.refresh': 'Refresh',
'settings.integrations.thirdParty.actions.docs': 'Docs',
'settings.integrations.thirdParty.actions.managePlugins': 'Manage plugins',
'settings.integrations.thirdParty.status.notInstalled': 'Not installed',
@@ -57,7 +56,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Aktualisieren',
'settings.integrations.thirdParty.actions.setup': 'Einrichten',
'settings.integrations.thirdParty.actions.remove': 'Entfernen',
'settings.integrations.thirdParty.actions.refresh': 'Aktualisieren',
'settings.integrations.thirdParty.actions.docs': 'Dokumentation',
'settings.integrations.thirdParty.actions.managePlugins': 'Plugins verwalten',
'settings.integrations.thirdParty.status.notInstalled': 'Nicht installiert',
@@ -99,7 +97,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Mettre à jour',
'settings.integrations.thirdParty.actions.setup': 'Configurer',
'settings.integrations.thirdParty.actions.remove': 'Supprimer',
'settings.integrations.thirdParty.actions.refresh': 'Actualiser',
'settings.integrations.thirdParty.actions.docs': 'Documentation',
'settings.integrations.thirdParty.actions.managePlugins': 'Gérer les plugins',
'settings.integrations.thirdParty.status.notInstalled': 'Non installé',
@@ -141,7 +138,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Actualizar',
'settings.integrations.thirdParty.actions.setup': 'Configurar',
'settings.integrations.thirdParty.actions.remove': 'Quitar',
'settings.integrations.thirdParty.actions.refresh': 'Actualizar',
'settings.integrations.thirdParty.actions.docs': 'Documentación',
'settings.integrations.thirdParty.actions.managePlugins': 'Administrar plugins',
'settings.integrations.thirdParty.status.notInstalled': 'No instalado',
@@ -183,7 +179,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': '更新',
'settings.integrations.thirdParty.actions.setup': '設定',
'settings.integrations.thirdParty.actions.remove': '削除',
'settings.integrations.thirdParty.actions.refresh': '再読み込み',
'settings.integrations.thirdParty.actions.docs': 'ドキュメント',
'settings.integrations.thirdParty.actions.managePlugins': 'プラグインを管理',
'settings.integrations.thirdParty.status.notInstalled': '未インストール',
@@ -225,7 +220,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': '업데이트',
'settings.integrations.thirdParty.actions.setup': '설정',
'settings.integrations.thirdParty.actions.remove': '제거',
'settings.integrations.thirdParty.actions.refresh': '새로 고침',
'settings.integrations.thirdParty.actions.docs': '문서',
'settings.integrations.thirdParty.actions.managePlugins': '플러그인 관리',
'settings.integrations.thirdParty.status.notInstalled': '설치되지 않음',
@@ -267,7 +261,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Aktualizuj',
'settings.integrations.thirdParty.actions.setup': 'Skonfiguruj',
'settings.integrations.thirdParty.actions.remove': 'Usuń',
'settings.integrations.thirdParty.actions.refresh': 'Odśwież',
'settings.integrations.thirdParty.actions.docs': 'Dokumentacja',
'settings.integrations.thirdParty.actions.managePlugins': 'Zarządzaj wtyczkami',
'settings.integrations.thirdParty.status.notInstalled': 'Nie zainstalowano',
@@ -309,7 +302,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Atualizar',
'settings.integrations.thirdParty.actions.setup': 'Configurar',
'settings.integrations.thirdParty.actions.remove': 'Remover',
'settings.integrations.thirdParty.actions.refresh': 'Atualizar',
'settings.integrations.thirdParty.actions.docs': 'Documentação',
'settings.integrations.thirdParty.actions.managePlugins': 'Gerenciar plugins',
'settings.integrations.thirdParty.status.notInstalled': 'Não instalado',
@@ -351,7 +343,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': 'Оновити',
'settings.integrations.thirdParty.actions.setup': 'Налаштувати',
'settings.integrations.thirdParty.actions.remove': 'Видалити',
'settings.integrations.thirdParty.actions.refresh': 'Оновити',
'settings.integrations.thirdParty.actions.docs': 'Документація',
'settings.integrations.thirdParty.actions.managePlugins': 'Керувати плагінами',
'settings.integrations.thirdParty.status.notInstalled': 'Не встановлено',
@@ -393,7 +384,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': '更新',
'settings.integrations.thirdParty.actions.setup': '设置',
'settings.integrations.thirdParty.actions.remove': '移除',
'settings.integrations.thirdParty.actions.refresh': '刷新',
'settings.integrations.thirdParty.actions.docs': '文档',
'settings.integrations.thirdParty.actions.managePlugins': '管理插件',
'settings.integrations.thirdParty.status.notInstalled': '未安装',
@@ -435,7 +425,6 @@ export const thirdPartyIntegrationI18n = {
'settings.integrations.thirdParty.actions.update': '更新',
'settings.integrations.thirdParty.actions.setup': '設定',
'settings.integrations.thirdParty.actions.remove': '移除',
'settings.integrations.thirdParty.actions.refresh': '重新整理',
'settings.integrations.thirdParty.actions.docs': '文件',
'settings.integrations.thirdParty.actions.managePlugins': '管理外掛',
'settings.integrations.thirdParty.status.notInstalled': '未安裝',