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

Function IntegrationsPage

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

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 3

useExecutorDocumentTitleFunction · 0.90
trackEventFunction · 0.90
isAsyncResultLoadingFunction · 0.90

Tested by

no test coverage detected