MCPcopy Create free account
hub / github.com/UsefulSoftwareCo/executor / IntegrationsPage

Function IntegrationsPage

packages/react/src/pages/integrations.tsx:70–134  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

68// ---------------------------------------------------------------------------
69
70export function IntegrationsPage() {
71 useExecutorDocumentTitle("Integrations");
72 const integrations = useAtomValue(integrationsOptimisticAtom);
73 const refreshIntegrations = useAtomRefresh(integrationsOptimisticAtom);
74 const [connectOpen, setConnectOpen] = useState(false);
75
76 return (
77 <PageContainer>
78 <PageHeader
79 title="Integrations"
80 description="Tool providers available in this workspace."
81 actions={
82 <Button
83 onClick={() => {
84 setConnectOpen(true);
85 trackEvent("integration_connect_dialog_opened");
86 }}
87 size="sm"
88 className="gap-1.5"
89 >
90 <PlusIcon className="size-4" />
91 Connect
92 </Button>
93 }
94 />
95
96 <div className="mb-8">
97 <McpInstallCard />
98 </div>
99
100 <div className="mb-8 border-t border-border/50" />
101
102 {isAsyncResultLoading(integrations) ? (
103 <IntegrationsGridSkeleton />
104 ) : (
105 AsyncResult.match(integrations, {
106 onInitial: () => <IntegrationsGridSkeleton />,
107 onFailure: () => (
108 <ErrorState message="Failed to load integrations" onRetry={refreshIntegrations} />
109 ),
110 onSuccess: ({ value }) => {
111 if (value.length === 0) {
112 return (
113 <EmptyIntegrations
114 onConnect={() => {
115 setConnectOpen(true);
116 trackEvent("integration_connect_dialog_opened");
117 }}
118 />
119 );
120 }
121
122 return (
123 <div className="mb-8 space-y-3">
124 <IntegrationGrid integrations={value} />
125 </div>
126 );
127 },

Callers

nothing calls this directly

Calls 3

useExecutorDocumentTitleFunction · 0.90
trackEventFunction · 0.90
isAsyncResultLoadingFunction · 0.90

Tested by

no test coverage detected