{
  "version": 3,
  "sources": ["../../src/document/components/chrome/siteSettings/Project/APIKeys/useAPIKeys.ts"],
  "sourcesContent": ["import { unhandledError } from \"@framerjs/shared\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { isAbortError } from \"web/lib/Fetcher.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport type { APIKey, CreateAPIKeyResponse } from \"./types.ts\"\n\nasync function fetchAPIKeys(projectId: string, signal?: AbortSignal): Promise<APIKey[]> {\n\tconst response = (await apiFetcher.get(`/web/api-keys`, { target: `project:${projectId}` }, signal)) as {\n\t\tapiKeys: APIKey[]\n\t}\n\treturn response.apiKeys.sort((a, b) => {\n\t\tconst aTime = a.lastUsed ? new Date(a.lastUsed).getTime() : 0\n\t\tconst bTime = b.lastUsed ? new Date(b.lastUsed).getTime() : 0\n\t\treturn bTime - aTime\n\t})\n}\n\nexport async function createAPIKeyRequest(projectId: string, name: string): Promise<CreateAPIKeyResponse> {\n\treturn apiFetcher.post(`/web/api-keys`, {\n\t\tname,\n\t\ttarget: { type: \"project\", id: projectId },\n\t})\n}\n\nasync function revokeAPIKeyRequest(projectId: string, apiKeyId: string): Promise<void> {\n\tawait apiFetcher.delete(`/web/api-keys/${apiKeyId}?target=project:${projectId}`, undefined)\n}\n\ninterface UseAPIKeysResult {\n\tapiKeys: APIKey[]\n\tloading: boolean\n\tshowCreateModal: boolean\n\tsetShowCreateModal: (show: boolean) => void\n\tnewlyCreatedToken: string | null\n\tsetNewlyCreatedToken: (token: string | null) => void\n\tkeyToRevoke: { id: string; name: string } | null\n\tsetKeyToRevoke: (key: { id: string; name: string } | null) => void\n\thandleCreate: (name: string) => Promise<void>\n\thandleRevoke: () => Promise<void>\n}\n\nexport function useAPIKeys(projectId: string | undefined): UseAPIKeysResult {\n\tconst [apiKeys, setApiKeys] = useState<APIKey[]>([])\n\tconst [loading, setLoading] = useState(true)\n\tconst [showCreateModal, setShowCreateModal] = useState(false)\n\tconst [newlyCreatedToken, setNewlyCreatedToken] = useState<string | null>(null)\n\tconst [keyToRevoke, setKeyToRevoke] = useState<{ id: string; name: string } | null>(null)\n\n\tuseEffect(() => {\n\t\tif (!projectId) return\n\n\t\tconst abortController = new AbortController()\n\n\t\tfetchAPIKeys(projectId, abortController.signal)\n\t\t\t.then(keys => {\n\t\t\t\tsetApiKeys(keys)\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tif (isAbortError(error)) return\n\t\t\t\tunhandledError(error)\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (abortController.signal.aborted) return\n\t\t\t\tsetLoading(false)\n\t\t\t})\n\n\t\treturn () => {\n\t\t\tabortController.abort()\n\t\t}\n\t}, [projectId])\n\n\tconst handleCreate = useCallback(\n\t\tasync (name: string) => {\n\t\t\tif (!projectId) return\n\n\t\t\ttry {\n\t\t\t\tconst result = await createAPIKeyRequest(projectId, name)\n\t\t\t\tsetShowCreateModal(false)\n\t\t\t\tsetNewlyCreatedToken(result.token)\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"success\",\n\t\t\t\t\ticon: \"success\",\n\t\t\t\t\tkey: \"api-key-create\",\n\t\t\t\t\tprimaryText: \"API key\",\n\t\t\t\t\tsecondaryText: \"created.\",\n\t\t\t\t})\n\t\t\t\tvoid fetchAPIKeys(projectId).then(setApiKeys).catch(unhandledError)\n\t\t\t} catch (error) {\n\t\t\t\tunhandledError(error)\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\ticon: \"error\",\n\t\t\t\t\tkey: \"api-key-create\",\n\t\t\t\t\tprimaryText: \"Failed to create\",\n\t\t\t\t\tsecondaryText: \"an API key.\",\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[projectId],\n\t)\n\n\tconst handleRevoke = useCallback(async () => {\n\t\tif (!projectId || !keyToRevoke) return\n\n\t\tconst keyName = keyToRevoke.name\n\t\ttry {\n\t\t\tawait revokeAPIKeyRequest(projectId, keyToRevoke.id)\n\t\t\tsetKeyToRevoke(null)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\ticon: \"success\",\n\t\t\t\tkey: \"api-key-revoke\",\n\t\t\t\tprimaryText: \"Revoked\",\n\t\t\t\tsecondaryText: `\"${keyName}\".`,\n\t\t\t})\n\t\t\tvoid fetchAPIKeys(projectId).then(setApiKeys).catch(unhandledError)\n\t\t} catch (error) {\n\t\t\tunhandledError(error)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\ticon: \"error\",\n\t\t\t\tkey: \"api-key-revoke\",\n\t\t\t\tprimaryText: \"Failed to revoke\",\n\t\t\t\tsecondaryText: \"an API key.\",\n\t\t\t})\n\t\t}\n\t}, [projectId, keyToRevoke])\n\n\treturn {\n\t\tapiKeys,\n\t\tloading,\n\t\tshowCreateModal,\n\t\tsetShowCreateModal,\n\t\tnewlyCreatedToken,\n\t\tsetNewlyCreatedToken,\n\t\tkeyToRevoke,\n\t\tsetKeyToRevoke,\n\t\thandleCreate,\n\t\thandleRevoke,\n\t}\n}\n"],
  "mappings": "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",
  "names": []
}
