6ede33ccdb
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Has been cancelled
Build and Push Docker Images / finalize_release (push) Has been cancelled
Obsidian Plugin Lint / lint (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / compute_version (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / verify_digests (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Has been cancelled
101 lines
2.9 KiB
TypeScript
101 lines
2.9 KiB
TypeScript
"use client";
|
|
|
|
import { useQuery } from "@tanstack/react-query";
|
|
import { useAtomValue } from "jotai";
|
|
import { useCallback, useState } from "react";
|
|
import { toast } from "sonner";
|
|
import { updateWorkspaceApiAccessMutationAtom } from "@/atoms/workspaces/workspace-mutation.atoms";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Label } from "@/components/ui/label";
|
|
import { Skeleton } from "@/components/ui/skeleton";
|
|
import { Switch } from "@/components/ui/switch";
|
|
import { workspacesApiService } from "@/lib/apis/workspaces-api.service";
|
|
import { cacheKeys } from "@/lib/query-client/cache-keys";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
interface WorkspaceApiAccessControlProps {
|
|
workspaceId: number;
|
|
className?: string;
|
|
}
|
|
|
|
export function WorkspaceApiAccessControl({
|
|
workspaceId,
|
|
className,
|
|
}: WorkspaceApiAccessControlProps) {
|
|
const {
|
|
data: workspace,
|
|
isLoading,
|
|
isError,
|
|
refetch,
|
|
} = useQuery({
|
|
queryKey: cacheKeys.workspaces.detail(workspaceId.toString()),
|
|
queryFn: () => workspacesApiService.getWorkspace({ id: workspaceId }),
|
|
enabled: !!workspaceId,
|
|
});
|
|
|
|
const { mutateAsync: updateWorkspaceApiAccess } = useAtomValue(
|
|
updateWorkspaceApiAccessMutationAtom
|
|
);
|
|
const [savingApiAccess, setSavingApiAccess] = useState(false);
|
|
|
|
const handleApiAccessToggle = useCallback(
|
|
async (enabled: boolean) => {
|
|
try {
|
|
setSavingApiAccess(true);
|
|
await updateWorkspaceApiAccess({
|
|
id: workspaceId,
|
|
api_access_enabled: enabled,
|
|
});
|
|
await refetch();
|
|
} catch (error) {
|
|
console.error("Error updating API access:", error);
|
|
toast.error(error instanceof Error ? error.message : "Failed to update API access");
|
|
} finally {
|
|
setSavingApiAccess(false);
|
|
}
|
|
},
|
|
[refetch, workspaceId, updateWorkspaceApiAccess]
|
|
);
|
|
|
|
if (isLoading) {
|
|
return (
|
|
<div className={cn("flex flex-col gap-3 md:flex-row md:items-center md:justify-between", className)}>
|
|
<div className="space-y-2">
|
|
<Skeleton className="h-4 w-32" />
|
|
<Skeleton className="h-3 w-56" />
|
|
</div>
|
|
<Skeleton className="h-6 w-11 rounded-full" />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (isError) {
|
|
return (
|
|
<div className={cn("flex flex-col gap-3 md:flex-row md:items-center md:justify-between", className)}>
|
|
<div className="space-y-1">
|
|
<Label>API key access</Label>
|
|
<p className="text-xs text-destructive">Failed to load workspace API access.</p>
|
|
</div>
|
|
<Button variant="outline" size="sm" onClick={() => refetch()}>
|
|
Retry
|
|
</Button>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className={cn("flex flex-col gap-3 md:flex-row md:items-center md:justify-between", className)}>
|
|
<div className="space-y-1">
|
|
<Label htmlFor="api-access-enabled">API key access</Label>
|
|
<p className="text-xs text-muted-foreground">Allow API keys to access this workspace.</p>
|
|
</div>
|
|
<Switch
|
|
id="api-access-enabled"
|
|
checked={!!workspace?.api_access_enabled}
|
|
disabled={savingApiAccess}
|
|
onCheckedChange={handleApiAccessToggle}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|