Loading...
Loading...
MUST be used when migrating an existing React app to Flows, or when no Flows auth is wired up. Detects classic vs Apps API flow from `app.json` `infra` field, installs the right packages, and wires up the entry file. No-op when a valid auth setup is already in place. Triggers: migrate to Flows, add Flows auth, DuneAuthProvider, AppSdkAuthProvider, connectToHostApp, useDune, Flows setup, setup auth, missing auth provider, CDF authentication, Fusion iframe auth.
npx skill4agent add cognitedata/builder-skills setup-flows-authapp.jsonapp.json | Flow | Auth source | Extra package |
|---|---|---|---|
| Apps API (new Fusion app host) | | |
| missing / other | Classic (legacy Files API) | | — |
app.jsonnpx @cognite/dune createpackage.jsonsrc/main.tsxsrc/index.tsxvite.config.tsapp.json<DuneAuthProvider>@cognite/dune<App />connectToHostApp@cognite/app-sdkApp.tsx<AppSdkAuthProvider>@cognite/dune<App />useDune()pnpm-lock.yamlyarn.lock| Package | Type |
|---|---|
| runtime (provides Vite plugin even in Apps API mode) |
| runtime |
| runtime |
| dev |
| Package | Type |
|---|---|
| runtime |
package.jsonpnpm addnpm installyarn add-D--save-devvite.config.tsimport { fusionOpenPlugin } from "@cognite/dune/vite";
import mkcert from "vite-plugin-mkcert";
export default defineConfig({
base: "./",
plugins: [react(), mkcert(), fusionOpenPlugin(), /* ... */],
server: { port: 3001 },
worker: { format: "es" },
});base: "./"mkcert()fusionOpenPlugin()server.port: 3001src/main.tsximport { DuneAuthProvider } from "@cognite/dune";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.tsx";
const queryClient = new QueryClient({
defaultOptions: { queries: { staleTime: 5 * 60 * 1000, gcTime: 10 * 60 * 1000 } },
});
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<DuneAuthProvider>
<App />
</DuneAuthProvider>
</QueryClientProvider>
</React.StrictMode>
);useDune()import { useDune } from "@cognite/dune";
const { sdk, isLoading, error } = useDune();
// sdk is an authenticated CogniteClientsrc/main.tsxApp.tsximport { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.tsx";
const queryClient = new QueryClient({
defaultOptions: { queries: { staleTime: 5 * 60 * 1000, gcTime: 10 * 60 * 1000 } },
});
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</React.StrictMode>
);src/App.tsxconnectToHostApp@cognite/app-sdkimport { connectToHostApp } from "@cognite/app-sdk";
import { useEffect, useState } from "react";
function App() {
const [project, setProject] = useState<string | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState<string | undefined>();
useEffect(() => {
let cancelled = false;
connectToHostApp({ applicationName: "<your-app-name>" })
.then(async ({ api }) => {
if (cancelled) return;
setProject(await api.getProject());
})
.catch((err: unknown) => {
if (cancelled) return;
setError(err instanceof Error ? err.message : String(err));
})
.finally(() => {
if (!cancelled) setIsLoading(false);
});
return () => { cancelled = true; };
}, []);
// render isLoading / error / authenticated UI
}applicationName: appConfig.externalIdapp.json<AppSdkAuthProvider>@cognite/duneconnectToHostAppuseDune()CogniteClientVITE_CDF_PROJECTVITE_CDF_CLUSTER