Skip to content

Commit 31e3266

Browse files
author
Mohammod Al Amin Ashik
committed
Fix lint errors and format issues for CI/CD
ESLint fixes: - Fix React setState in useEffect pattern (RegistryPage) - Remove unused imports and variables across components - Replace any types with proper TypeScript types - Prefix unused function parameters with underscore Rust format fixes: - Remove trailing whitespace from all Rust files - Fix JWT test formatting - Fix lib.rs, repository, and service formatting All critical lint errors resolved. Remaining warnings are non-breaking (React Hook exhaustive-deps, react-refresh exports).
1 parent 25aa5df commit 31e3266

13 files changed

Lines changed: 198 additions & 186 deletions

File tree

apps/desktop/src-tauri/src/lib.rs

Lines changed: 71 additions & 68 deletions
Large diffs are not rendered by default.

apps/desktop/src/App.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import {
99
Sun,
1010
Moon,
1111
Zap,
12-
Plus,
13-
Trash2,
1412
Check,
1513
Loader2,
1614
FolderOpen,
@@ -32,8 +30,7 @@ import { ThemeProvider } from '@/components/ThemeProvider';
3230
import { OAuthConsentModal } from '@/components/OAuthConsentModal';
3331
import { SpaceSwitcher } from '@/components/SpaceSwitcher';
3432
import { useDataSync } from '@/hooks/useDataSync';
35-
import { useAppStore, useActiveSpace, useViewSpace, useSpaces, useIsLoading, useTheme } from '@/stores';
36-
import { createSpace, deleteSpace, setActiveSpace as setActiveSpaceAPI } from '@/lib/api/spaces';
33+
import { useAppStore, useActiveSpace, useViewSpace, useTheme } from '@/stores';
3734
import { RegistryPage } from '@/features/registry';
3835
import { FeatureSetsPage } from '@/features/featuresets';
3936
import { ClientsPage } from '@/features/clients';

apps/desktop/src/components/OAuthConsentModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import { useState, useEffect } from 'react';
1414
import { invoke } from '@tauri-apps/api/core';
1515
import { listen } from '@tauri-apps/api/event';
16-
import { Shield, Check, X, AlertCircle, ExternalLink, Loader2, Globe, Lock } from 'lucide-react';
16+
import { Shield, Check, X, AlertCircle, Loader2, Globe, Lock } from 'lucide-react';
1717
import {
1818
Button,
1919
Card,

apps/desktop/src/features/clients/ClientsPage.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
Settings,
1313
Trash2,
1414
X,
15-
Tag,
1615
Check,
1716
ChevronDown,
1817
ChevronRight,

apps/desktop/src/features/featuresets/FeatureSetPanel.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
} from 'lucide-react';
2323
import { Button } from '@mcpmux/ui';
2424
import type { FeatureSet, AddMemberInput } from '@/lib/api/featureSets';
25-
import { setFeatureSetMembers, updateFeatureSet } from '@/lib/api/featureSets';
25+
import { setFeatureSetMembers } from '@/lib/api/featureSets';
2626
import type { ServerFeature } from '@/lib/api/serverFeatures';
2727
import { listServerFeatures } from '@/lib/api/serverFeatures';
2828

@@ -49,10 +49,10 @@ export function FeatureSetPanel({ featureSet, spaceId, onClose, onDelete, onUpda
4949
const [error, setError] = useState<string | null>(null);
5050
const [expandedServers, setExpandedServers] = useState<Set<string>>(new Set());
5151

52-
// Edit state for custom sets
53-
const [editName, setEditName] = useState(featureSet.name);
54-
const [editDescription, setEditDescription] = useState(featureSet.description || '');
55-
const [editIcon, setEditIcon] = useState(featureSet.icon || '');
52+
// Edit state for custom sets (placeholder for future functionality)
53+
// const _editName = featureSet.name;
54+
// const _editDescription = featureSet.description || '';
55+
// const _editIcon = featureSet.icon || '';
5656

5757
// Collapsible sections - only one expanded at a time, features by default
5858
const [expandedSections, setExpandedSections] = useState({

apps/desktop/src/features/featuresets/FeatureSetsPage.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { useState, useEffect, useCallback } from 'react';
22
import {
3-
Wrench,
43
Plus,
5-
Trash2,
64
Loader2,
7-
Shield,
85
Server,
96
Package,
107
Settings,
@@ -14,13 +11,11 @@ import {
1411
Star,
1512
Search,
1613
AlertCircle,
17-
Users,
1814
} from 'lucide-react';
1915
import {
2016
Card,
2117
CardHeader,
2218
CardTitle,
23-
CardDescription,
2419
CardContent,
2520
Button,
2621
} from '@mcpmux/ui';

apps/desktop/src/features/registry/RegistryPage.tsx

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,38 @@ export function RegistryPage() {
3636
} = useRegistryStore();
3737

3838
const [localSearch, setLocalSearch] = useState('');
39-
const [currentPage, setCurrentPage] = useState(1);
4039
const viewSpace = useViewSpace();
4140

4241
const itemsPerPage = uiConfig?.items_per_page ?? 24;
4342

44-
// Reset page when display changes
45-
useEffect(() => {
46-
setCurrentPage(1);
47-
}, [displayServers.length, activeFilters, activeSort, searchQuery]);
43+
// Create a key that changes when filters/search/sort change to reset pagination
44+
const paginationKey = JSON.stringify({
45+
filters: activeFilters,
46+
sort: activeSort,
47+
search: searchQuery,
48+
length: displayServers.length
49+
});
50+
51+
// Local page state that resets when key changes
52+
const [pageState, setPageState] = useState({ page: 1, key: paginationKey });
53+
54+
// Reset page when key changes
55+
if (pageState.key !== paginationKey) {
56+
setPageState({ page: 1, key: paginationKey });
57+
}
58+
59+
const activePage = pageState.page;
4860

4961
// Pagination logic
5062
const totalPages = Math.ceil(displayServers.length / itemsPerPage);
5163
const paginatedServers = displayServers.slice(
52-
(currentPage - 1) * itemsPerPage,
53-
currentPage * itemsPerPage
64+
(activePage - 1) * itemsPerPage,
65+
activePage * itemsPerPage
5466
);
5567

5668
const handlePageChange = (newPage: number) => {
5769
if (newPage >= 1 && newPage <= totalPages) {
58-
setCurrentPage(newPage);
70+
setPageState({ page: newPage, key: paginationKey });
5971
document.querySelector('.registry-grid-container')?.scrollTo({ top: 0, behavior: 'smooth' });
6072
}
6173
};
@@ -238,20 +250,20 @@ export function RegistryPage() {
238250
{totalPages > 1 && (
239251
<div className="flex items-center gap-2">
240252
<button
241-
onClick={() => handlePageChange(currentPage - 1)}
242-
disabled={currentPage === 1}
253+
onClick={() => handlePageChange(activePage - 1)}
254+
disabled={activePage === 1}
243255
className="p-1.5 rounded-lg hover:bg-[rgb(var(--surface-hover))] disabled:opacity-30 disabled:hover:bg-transparent transition-colors"
244256
>
245257
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
246258
<path d="M15 18l-6-6 6-6" />
247259
</svg>
248260
</button>
249261
<span className="text-sm font-medium min-w-[3rem] text-center">
250-
{currentPage} / {totalPages}
262+
{activePage} / {totalPages}
251263
</span>
252264
<button
253-
onClick={() => handlePageChange(currentPage + 1)}
254-
disabled={currentPage === totalPages}
265+
onClick={() => handlePageChange(activePage + 1)}
266+
disabled={activePage === totalPages}
255267
className="p-1.5 rounded-lg hover:bg-[rgb(var(--surface-hover))] disabled:opacity-30 disabled:hover:bg-transparent transition-colors"
256268
>
257269
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
@@ -289,7 +301,6 @@ interface FilterDropdownProps {
289301
}
290302

291303
function FilterDropdown({ filter, value, onChange }: FilterDropdownProps) {
292-
const selectedOption = filter.options.find(o => o.id === value);
293304
const isActive = value && value !== 'all';
294305

295306
return (

apps/desktop/src/features/servers/ServerActionMenu.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ export interface ServerActionMenuProps {
2828
}
2929

3030
export function ServerActionMenu({
31-
serverId,
32-
serverName,
31+
serverId: _serverId,
32+
serverName: _serverName,
3333
hasInputs,
3434
isOAuth,
3535
isEnabled,
36-
isConnected,
36+
isConnected: _isConnected,
3737
onConfigure,
3838
onRefresh,
3939
onReconnect,

apps/desktop/src/features/servers/ServersPage.tsx

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,10 @@ import {
1919
FileJson,
2020
} from 'lucide-react';
2121
import { ServerActionMenu } from './ServerActionMenu';
22-
import type { ServerViewModel, ServerDefinition, InstalledServerState } from '../../types/registry';
22+
import type { ServerViewModel, ServerDefinition, InstalledServerState, InputDefinition } from '../../types/registry';
2323
import type { ServerFeature } from '@/lib/api/serverFeatures';
2424
import { listServerFeaturesByServer } from '@/lib/api/serverFeatures';
2525
import { useViewSpace } from '@/stores';
26-
import { useServerManager } from '@/hooks/useServerManager';
27-
import type { ConnectionStatus } from '@/lib/api/serverManager';
28-
import { ServerLogViewer } from '@/components/ServerLogViewer';
29-
import { ConfigEditorModal } from '@/components/ConfigEditorModal';
30-
import { useGatewayEvents, useDomainEvents } from '@/hooks/useDomainEvents';
31-
import { discoverServers, listInstalledServers } from '@/lib/api/registry';
3226
import { SourceBadge } from '@/components/SourceBadge';
3327

3428
// Helper to merge definitions with states (same as registryStore)
@@ -44,7 +38,7 @@ function mergeDefinitionsWithStates(
4438
// Check if any required inputs are missing
4539
const inputs = def.transport.metadata?.inputs ?? [];
4640
const inputValues = state?.input_values ?? {};
47-
const missing_required_inputs = inputs.some((input: any) =>
41+
const missing_required_inputs = inputs.some((input: InputDefinition) =>
4842
input.required && !inputValues[input.id]
4943
);
5044

@@ -306,8 +300,8 @@ export function ServersPage() {
306300

307301
// Sort by installation time (newest first)
308302
mergedServers.sort((a, b) => {
309-
const dateA = new Date((a as any).created_at || 0).getTime();
310-
const dateB = new Date((b as any).created_at || 0).getTime();
303+
const dateA = new Date(a.created_at || 0).getTime();
304+
const dateB = new Date(b.created_at || 0).getTime();
311305
return dateB - dateA;
312306
});
313307

@@ -466,10 +460,10 @@ export function ServersPage() {
466460
const handleEnableClick = async (server: ServerViewModel) => {
467461
const serverInputs = server.transport.metadata?.inputs ?? [];
468462
// If server has required inputs that are missing, show config modal
469-
if (serverInputs.some((i: any) => i.required) && server.missing_required_inputs) {
463+
if (serverInputs.some((i: InputDefinition) => i.required) && server.missing_required_inputs) {
470464
// Initialize with existing values
471465
const initialValues: Record<string, string> = {};
472-
serverInputs.forEach((input: any) => {
466+
serverInputs.forEach((input: InputDefinition) => {
473467
initialValues[input.id] = server.input_values[input.id] || '';
474468
});
475469
setConfigModal({
@@ -530,7 +524,7 @@ export function ServersPage() {
530524
const handleConfigureClick = (server: ServerViewModel) => {
531525
const serverInputs = server.transport.metadata?.inputs ?? [];
532526
const initialValues: Record<string, string> = {};
533-
serverInputs.forEach((input: any) => {
527+
serverInputs.forEach((input: InputDefinition) => {
534528
initialValues[input.id] = server.input_values[input.id] || '';
535529
});
536530
setConfigModal({
@@ -641,7 +635,7 @@ export function ServersPage() {
641635

642636
setActionLoading(`uninstall-${server.id}`);
643637
try {
644-
const { uninstallServer, refreshRegistry } = await import('@/lib/api/registry');
638+
const { uninstallServer } = await import('@/lib/api/registry');
645639
const { disconnectServer } = await import('@/lib/api/gateway');
646640

647641
if (gatewayRunning && server.enabled && viewSpace) {
@@ -1202,7 +1196,7 @@ export function ServersPage() {
12021196
</p>
12031197

12041198
<div className="space-y-4">
1205-
{(configModal.server.transport.metadata?.inputs ?? []).map((input: any) => {
1199+
{(configModal.server.transport.metadata?.inputs ?? []).map((input: InputDefinition) => {
12061200
const obtainUrl = input.obtain_url || input.obtain?.url;
12071201
const obtainInstructions = input.obtain_instructions || input.obtain?.instructions;
12081202
const inputType = input.type || 'text';
@@ -1313,7 +1307,7 @@ export function ServersPage() {
13131307
onClick={handleSaveConfig}
13141308
disabled={
13151309
(configModal.server.transport.metadata?.inputs ?? [])
1316-
.some((i: any) => i.required && !configModal.inputValues[i.id])
1310+
.some((i: InputDefinition) => i.required && !configModal.inputValues[i.id])
13171311
}
13181312
className="px-4 py-2 text-sm rounded-lg bg-[rgb(var(--primary))] text-[rgb(var(--primary-foreground))] hover:bg-[rgb(var(--primary-hover))] disabled:opacity-50 transition-colors"
13191313
data-testid="config-save-btn"

apps/desktop/src/stores/registryStore.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import type {
1212
InstalledServerState,
1313
UiConfig,
1414
HomeConfig,
15-
FilterDefinition,
1615
FilterMatch,
1716
SortOption,
1817
} from '../types/registry';

0 commit comments

Comments
 (0)