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

Function IntegrationsPage

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

Source from the content-addressed store, hash-verified

107// ---------------------------------------------------------------------------
108
109export function IntegrationsPage() {
110 useExecutorDocumentTitle("Integrations");
111 const integrations = useAtomValue(integrationsOptimisticAtom);
112 const refreshIntegrations = useAtomRefresh(integrationsOptimisticAtom);
113 const [connectOpen, setConnectOpen] = useState(false);
114
115 return (
116 <PageContainer>
117 <PageHeader
118 title="Integrations"
119 description="Tool providers available in this workspace."
120 actions={
121 <Button
122 onClick={() => {
123 setConnectOpen(true);
124 trackEvent("integration_connect_dialog_opened");
125 }}
126 size="sm"
127 className="gap-1.5"
128 >
129 <PlusIcon className="size-4" />
130 Connect
131 </Button>
132 }
133 />
134
135 <div className="mb-8">
136 <McpInstallCard />
137 </div>
138
139 <div className="mb-8 border-t border-border/50" />
140
141 {isAsyncResultLoading(integrations) ? (
142 <IntegrationsGridSkeleton />
143 ) : (
144 AsyncResult.match(integrations, {
145 onInitial: () => <IntegrationsGridSkeleton />,
146 onFailure: () => (
147 <ErrorState message="Failed to load integrations" onRetry={refreshIntegrations} />
148 ),
149 onSuccess: ({ value }) => {
150 if (value.length === 0) {
151 return (
152 <EmptyIntegrations
153 onConnect={() => {
154 setConnectOpen(true);
155 trackEvent("integration_connect_dialog_opened");
156 }}
157 />
158 );
159 }
160
161 return (
162 <div className="mb-8 space-y-3">
163 <IntegrationGrid integrations={value} />
164 </div>
165 );
166 },

Callers

nothing calls this directly

Calls 3

useExecutorDocumentTitleFunction · 0.90
trackEventFunction · 0.90
isAsyncResultLoadingFunction · 0.90

Tested by

no test coverage detected