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

Function IntegrationsPage

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

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 3

useExecutorDocumentTitleFunction · 0.90
trackEventFunction · 0.90
isAsyncResultLoadingFunction · 0.90

Tested by

no test coverage detected