assembly-kit 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +205 -0
- package/LICENSE +21 -0
- package/README.md +516 -0
- package/dist/bridge-ui/index.d.mts +4 -0
- package/dist/bridge-ui/index.mjs +5 -0
- package/dist/bridge-ui/use-actions-menu.d.mts +16 -0
- package/dist/bridge-ui/use-actions-menu.mjs +33 -0
- package/dist/bridge-ui/use-actions-menu.mjs.map +1 -0
- package/dist/bridge-ui/use-primary-cta.d.mts +16 -0
- package/dist/bridge-ui/use-primary-cta.mjs +34 -0
- package/dist/bridge-ui/use-primary-cta.mjs.map +1 -0
- package/dist/bridge-ui/use-secondary-cta.d.mts +16 -0
- package/dist/bridge-ui/use-secondary-cta.mjs +34 -0
- package/dist/bridge-ui/use-secondary-cta.mjs.map +1 -0
- package/dist/client/index.d.mts +108 -0
- package/dist/client/index.mjs +168 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/client/options.d.mts +40 -0
- package/dist/constants/kit-mode.d.mts +15 -0
- package/dist/constants/kit-mode.mjs +15 -0
- package/dist/constants/kit-mode.mjs.map +1 -0
- package/dist/errors/base.d.mts +29 -0
- package/dist/errors/base.mjs +16 -0
- package/dist/errors/base.mjs.map +1 -0
- package/dist/errors/connection.d.mts +12 -0
- package/dist/errors/connection.mjs +16 -0
- package/dist/errors/connection.mjs.map +1 -0
- package/dist/errors/forbidden.d.mts +12 -0
- package/dist/errors/forbidden.mjs +16 -0
- package/dist/errors/forbidden.mjs.map +1 -0
- package/dist/errors/index.d.mts +13 -0
- package/dist/errors/index.mjs +13 -0
- package/dist/errors/invalid-token.d.mts +12 -0
- package/dist/errors/invalid-token.mjs +16 -0
- package/dist/errors/invalid-token.mjs.map +1 -0
- package/dist/errors/missing-api-key.d.mts +12 -0
- package/dist/errors/missing-api-key.mjs +16 -0
- package/dist/errors/missing-api-key.mjs.map +1 -0
- package/dist/errors/no-token.d.mts +12 -0
- package/dist/errors/no-token.mjs +16 -0
- package/dist/errors/no-token.mjs.map +1 -0
- package/dist/errors/not-found.d.mts +12 -0
- package/dist/errors/not-found.mjs +16 -0
- package/dist/errors/not-found.mjs.map +1 -0
- package/dist/errors/rate-limit.d.mts +17 -0
- package/dist/errors/rate-limit.mjs +18 -0
- package/dist/errors/rate-limit.mjs.map +1 -0
- package/dist/errors/response-parse.d.mts +19 -0
- package/dist/errors/response-parse.mjs +23 -0
- package/dist/errors/response-parse.mjs.map +1 -0
- package/dist/errors/server.d.mts +12 -0
- package/dist/errors/server.mjs +16 -0
- package/dist/errors/server.mjs.map +1 -0
- package/dist/errors/unauthorized.d.mts +12 -0
- package/dist/errors/unauthorized.mjs +16 -0
- package/dist/errors/unauthorized.mjs.map +1 -0
- package/dist/errors/validation.d.mts +12 -0
- package/dist/errors/validation.mjs +16 -0
- package/dist/errors/validation.mjs.map +1 -0
- package/dist/index.d.mts +49 -0
- package/dist/index.mjs +51 -0
- package/dist/lib/modules/app-connections/resource.d.mts +28 -0
- package/dist/lib/modules/app-connections/resource.mjs +33 -0
- package/dist/lib/modules/app-connections/resource.mjs.map +1 -0
- package/dist/lib/modules/app-connections/schema.d.mts +37 -0
- package/dist/lib/modules/app-connections/schema.mjs +30 -0
- package/dist/lib/modules/app-connections/schema.mjs.map +1 -0
- package/dist/lib/modules/app-installs/resource.d.mts +21 -0
- package/dist/lib/modules/app-installs/resource.mjs +31 -0
- package/dist/lib/modules/app-installs/resource.mjs.map +1 -0
- package/dist/lib/modules/app-installs/schema.d.mts +22 -0
- package/dist/lib/modules/app-installs/schema.mjs +23 -0
- package/dist/lib/modules/app-installs/schema.mjs.map +1 -0
- package/dist/lib/modules/clients/resource.d.mts +43 -0
- package/dist/lib/modules/clients/resource.mjs +62 -0
- package/dist/lib/modules/clients/resource.mjs.map +1 -0
- package/dist/lib/modules/clients/schema.d.mts +50 -0
- package/dist/lib/modules/clients/schema.mjs +52 -0
- package/dist/lib/modules/clients/schema.mjs.map +1 -0
- package/dist/lib/modules/companies/resource.d.mts +37 -0
- package/dist/lib/modules/companies/resource.mjs +60 -0
- package/dist/lib/modules/companies/resource.mjs.map +1 -0
- package/dist/lib/modules/companies/schema.d.mts +39 -0
- package/dist/lib/modules/companies/schema.mjs +34 -0
- package/dist/lib/modules/companies/schema.mjs.map +1 -0
- package/dist/lib/modules/contract-templates/resource.d.mts +27 -0
- package/dist/lib/modules/contract-templates/resource.mjs +40 -0
- package/dist/lib/modules/contract-templates/resource.mjs.map +1 -0
- package/dist/lib/modules/contract-templates/schema.d.mts +21 -0
- package/dist/lib/modules/contract-templates/schema.mjs +18 -0
- package/dist/lib/modules/contract-templates/schema.mjs.map +1 -0
- package/dist/lib/modules/contracts/resource.d.mts +29 -0
- package/dist/lib/modules/contracts/resource.mjs +40 -0
- package/dist/lib/modules/contracts/resource.mjs.map +1 -0
- package/dist/lib/modules/contracts/schema.d.mts +50 -0
- package/dist/lib/modules/contracts/schema.mjs +45 -0
- package/dist/lib/modules/contracts/schema.mjs.map +1 -0
- package/dist/lib/modules/custom-field-options/index.d.mts +1 -0
- package/dist/lib/modules/custom-field-options/index.mjs +2 -0
- package/dist/lib/modules/custom-field-options/resource.d.mts +22 -0
- package/dist/lib/modules/custom-field-options/resource.mjs +25 -0
- package/dist/lib/modules/custom-field-options/resource.mjs.map +1 -0
- package/dist/lib/modules/custom-field-options/schema.d.mts +18 -0
- package/dist/lib/modules/custom-field-options/schema.mjs +13 -0
- package/dist/lib/modules/custom-field-options/schema.mjs.map +1 -0
- package/dist/lib/modules/custom-fields/resource.d.mts +21 -0
- package/dist/lib/modules/custom-fields/resource.mjs +24 -0
- package/dist/lib/modules/custom-fields/resource.mjs.map +1 -0
- package/dist/lib/modules/custom-fields/schema.d.mts +43 -0
- package/dist/lib/modules/custom-fields/schema.mjs +44 -0
- package/dist/lib/modules/custom-fields/schema.mjs.map +1 -0
- package/dist/lib/modules/events/resource.d.mts +33 -0
- package/dist/lib/modules/events/resource.mjs +49 -0
- package/dist/lib/modules/events/resource.mjs.map +1 -0
- package/dist/lib/modules/events/schema.d.mts +52 -0
- package/dist/lib/modules/events/schema.mjs +49 -0
- package/dist/lib/modules/events/schema.mjs.map +1 -0
- package/dist/lib/modules/file-channels/resource.d.mts +26 -0
- package/dist/lib/modules/file-channels/resource.mjs +48 -0
- package/dist/lib/modules/file-channels/resource.mjs.map +1 -0
- package/dist/lib/modules/file-channels/schema.d.mts +33 -0
- package/dist/lib/modules/file-channels/schema.mjs +28 -0
- package/dist/lib/modules/file-channels/schema.mjs.map +1 -0
- package/dist/lib/modules/files/resource.d.mts +40 -0
- package/dist/lib/modules/files/resource.mjs +52 -0
- package/dist/lib/modules/files/resource.mjs.map +1 -0
- package/dist/lib/modules/files/schema.d.mts +27 -0
- package/dist/lib/modules/files/schema.mjs +27 -0
- package/dist/lib/modules/files/schema.mjs.map +1 -0
- package/dist/lib/modules/form-responses/resource.d.mts +24 -0
- package/dist/lib/modules/form-responses/resource.mjs +34 -0
- package/dist/lib/modules/form-responses/resource.mjs.map +1 -0
- package/dist/lib/modules/form-responses/schema.d.mts +29 -0
- package/dist/lib/modules/form-responses/schema.mjs +23 -0
- package/dist/lib/modules/form-responses/schema.mjs.map +1 -0
- package/dist/lib/modules/forms/resource.d.mts +24 -0
- package/dist/lib/modules/forms/resource.mjs +40 -0
- package/dist/lib/modules/forms/resource.mjs.map +1 -0
- package/dist/lib/modules/forms/schema.d.mts +22 -0
- package/dist/lib/modules/forms/schema.mjs +19 -0
- package/dist/lib/modules/forms/schema.mjs.map +1 -0
- package/dist/lib/modules/index.d.mts +28 -0
- package/dist/lib/modules/index.mjs +29 -0
- package/dist/lib/modules/internal-users/resource.d.mts +24 -0
- package/dist/lib/modules/internal-users/resource.mjs +37 -0
- package/dist/lib/modules/internal-users/resource.mjs.map +1 -0
- package/dist/lib/modules/internal-users/schema.d.mts +27 -0
- package/dist/lib/modules/internal-users/schema.mjs +24 -0
- package/dist/lib/modules/internal-users/schema.mjs.map +1 -0
- package/dist/lib/modules/invoice-templates/resource.d.mts +22 -0
- package/dist/lib/modules/invoice-templates/resource.mjs +32 -0
- package/dist/lib/modules/invoice-templates/resource.mjs.map +1 -0
- package/dist/lib/modules/invoice-templates/schema.d.mts +21 -0
- package/dist/lib/modules/invoice-templates/schema.mjs +18 -0
- package/dist/lib/modules/invoice-templates/schema.mjs.map +1 -0
- package/dist/lib/modules/invoices/resource.d.mts +30 -0
- package/dist/lib/modules/invoices/resource.mjs +48 -0
- package/dist/lib/modules/invoices/resource.mjs.map +1 -0
- package/dist/lib/modules/invoices/schema.d.mts +81 -0
- package/dist/lib/modules/invoices/schema.mjs +75 -0
- package/dist/lib/modules/invoices/schema.mjs.map +1 -0
- package/dist/lib/modules/message-channels/resource.d.mts +26 -0
- package/dist/lib/modules/message-channels/resource.mjs +48 -0
- package/dist/lib/modules/message-channels/resource.mjs.map +1 -0
- package/dist/lib/modules/message-channels/schema.d.mts +35 -0
- package/dist/lib/modules/message-channels/schema.mjs +30 -0
- package/dist/lib/modules/message-channels/schema.mjs.map +1 -0
- package/dist/lib/modules/messages/resource.d.mts +27 -0
- package/dist/lib/modules/messages/resource.mjs +40 -0
- package/dist/lib/modules/messages/resource.mjs.map +1 -0
- package/dist/lib/modules/messages/schema.d.mts +30 -0
- package/dist/lib/modules/messages/schema.mjs +26 -0
- package/dist/lib/modules/messages/schema.mjs.map +1 -0
- package/dist/lib/modules/notes/resource.d.mts +37 -0
- package/dist/lib/modules/notes/resource.mjs +60 -0
- package/dist/lib/modules/notes/resource.mjs.map +1 -0
- package/dist/lib/modules/notes/schema.d.mts +34 -0
- package/dist/lib/modules/notes/schema.mjs +27 -0
- package/dist/lib/modules/notes/schema.mjs.map +1 -0
- package/dist/lib/modules/notifications/resource.d.mts +27 -0
- package/dist/lib/modules/notifications/resource.mjs +52 -0
- package/dist/lib/modules/notifications/resource.mjs.map +1 -0
- package/dist/lib/modules/notifications/schema.d.mts +52 -0
- package/dist/lib/modules/notifications/schema.mjs +43 -0
- package/dist/lib/modules/notifications/schema.mjs.map +1 -0
- package/dist/lib/modules/payments/resource.d.mts +26 -0
- package/dist/lib/modules/payments/resource.mjs +32 -0
- package/dist/lib/modules/payments/resource.mjs.map +1 -0
- package/dist/lib/modules/payments/schema.d.mts +23 -0
- package/dist/lib/modules/payments/schema.mjs +20 -0
- package/dist/lib/modules/payments/schema.mjs.map +1 -0
- package/dist/lib/modules/prices/resource.d.mts +27 -0
- package/dist/lib/modules/prices/resource.mjs +40 -0
- package/dist/lib/modules/prices/resource.mjs.map +1 -0
- package/dist/lib/modules/prices/schema.d.mts +22 -0
- package/dist/lib/modules/prices/schema.mjs +19 -0
- package/dist/lib/modules/prices/schema.mjs.map +1 -0
- package/dist/lib/modules/products/resource.d.mts +24 -0
- package/dist/lib/modules/products/resource.mjs +40 -0
- package/dist/lib/modules/products/resource.mjs.map +1 -0
- package/dist/lib/modules/products/schema.d.mts +22 -0
- package/dist/lib/modules/products/schema.mjs +19 -0
- package/dist/lib/modules/products/schema.mjs.map +1 -0
- package/dist/lib/modules/subscription-templates/resource.d.mts +22 -0
- package/dist/lib/modules/subscription-templates/resource.mjs +32 -0
- package/dist/lib/modules/subscription-templates/resource.mjs.map +1 -0
- package/dist/lib/modules/subscription-templates/schema.d.mts +21 -0
- package/dist/lib/modules/subscription-templates/schema.mjs +18 -0
- package/dist/lib/modules/subscription-templates/schema.mjs.map +1 -0
- package/dist/lib/modules/subscriptions/resource.d.mts +32 -0
- package/dist/lib/modules/subscriptions/resource.mjs +56 -0
- package/dist/lib/modules/subscriptions/resource.mjs.map +1 -0
- package/dist/lib/modules/subscriptions/schema.d.mts +31 -0
- package/dist/lib/modules/subscriptions/schema.mjs +26 -0
- package/dist/lib/modules/subscriptions/schema.mjs.map +1 -0
- package/dist/lib/modules/task-templates/resource.d.mts +24 -0
- package/dist/lib/modules/task-templates/resource.mjs +40 -0
- package/dist/lib/modules/task-templates/resource.mjs.map +1 -0
- package/dist/lib/modules/task-templates/schema.d.mts +22 -0
- package/dist/lib/modules/task-templates/schema.mjs +19 -0
- package/dist/lib/modules/task-templates/schema.mjs.map +1 -0
- package/dist/lib/modules/tasks/resource.d.mts +38 -0
- package/dist/lib/modules/tasks/resource.mjs +60 -0
- package/dist/lib/modules/tasks/resource.mjs.map +1 -0
- package/dist/lib/modules/tasks/schema.d.mts +45 -0
- package/dist/lib/modules/tasks/schema.mjs +43 -0
- package/dist/lib/modules/tasks/schema.mjs.map +1 -0
- package/dist/lib/modules/workspace/resource.d.mts +19 -0
- package/dist/lib/modules/workspace/resource.mjs +23 -0
- package/dist/lib/modules/workspace/resource.mjs.map +1 -0
- package/dist/lib/modules/workspace/schema.d.mts +23 -0
- package/dist/lib/modules/workspace/schema.mjs +21 -0
- package/dist/lib/modules/workspace/schema.mjs.map +1 -0
- package/dist/lib/pagination/paginate.d.mts +8 -0
- package/dist/lib/pagination/paginate.mjs +24 -0
- package/dist/lib/pagination/paginate.mjs.map +1 -0
- package/dist/logger/index.d.mts +26 -0
- package/dist/logger/index.mjs +45 -0
- package/dist/logger/index.mjs.map +1 -0
- package/dist/schemas/index.d.mts +32 -0
- package/dist/schemas/index.mjs +34 -0
- package/dist/schemas/shared/hex-color.d.mts +8 -0
- package/dist/schemas/shared/hex-color.mjs +7 -0
- package/dist/schemas/shared/hex-color.mjs.map +1 -0
- package/dist/schemas/shared/index.d.mts +3 -0
- package/dist/schemas/shared/index.mjs +4 -0
- package/dist/schemas/shared/membership-type.d.mts +9 -0
- package/dist/schemas/shared/membership-type.mjs +11 -0
- package/dist/schemas/shared/membership-type.mjs.map +1 -0
- package/dist/schemas/shared/token.d.mts +22 -0
- package/dist/schemas/shared/token.mjs +21 -0
- package/dist/schemas/shared/token.mjs.map +1 -0
- package/dist/token/assembly-token.d.mts +96 -0
- package/dist/token/assembly-token.mjs +117 -0
- package/dist/token/assembly-token.mjs.map +1 -0
- package/dist/token/crypto.mjs +98 -0
- package/dist/token/crypto.mjs.map +1 -0
- package/dist/token/index.d.mts +3 -0
- package/dist/token/index.mjs +3 -0
- package/dist/token/parse.d.mts +24 -0
- package/dist/token/parse.mjs +62 -0
- package/dist/token/parse.mjs.map +1 -0
- package/dist/transport/build-search-params.mjs +16 -0
- package/dist/transport/build-search-params.mjs.map +1 -0
- package/dist/transport/http.d.mts +14 -0
- package/dist/transport/http.mjs +142 -0
- package/dist/transport/http.mjs.map +1 -0
- package/dist/transport/parse-response.mjs +17 -0
- package/dist/transport/parse-response.mjs.map +1 -0
- package/dist/version.mjs +7 -0
- package/dist/version.mjs.map +1 -0
- package/package.json +93 -0
package/README.md
ADDED
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
# assembly-kit
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for the [Assembly](https://assembly.ac) platform. ESM-only, targets Node.js 18+, Node.js 24+, and Bun.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add assembly-kit
|
|
9
|
+
# or
|
|
10
|
+
bun add assembly-kit
|
|
11
|
+
# or
|
|
12
|
+
npm install assembly-kit
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Client
|
|
18
|
+
|
|
19
|
+
Create an SDK client with `createAssemblyKit()`. At least one of `token` or `workspaceId` must be provided:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { createAssemblyKit } from "assembly-kit";
|
|
23
|
+
|
|
24
|
+
// With token (e.g. marketplace apps, portal users)
|
|
25
|
+
const kit = createAssemblyKit({
|
|
26
|
+
apiKey: "your-api-key",
|
|
27
|
+
token: encryptedToken,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// With workspaceId only (server-to-server, local dev)
|
|
31
|
+
const kit = createAssemblyKit({
|
|
32
|
+
apiKey: "your-api-key",
|
|
33
|
+
workspaceId: "ws-123",
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Access resources via namespaces
|
|
37
|
+
const workspace = await kit.workspace.retrieve();
|
|
38
|
+
const companies = await kit.companies.list();
|
|
39
|
+
const task = await kit.tasks.create({ title: "Follow up", ... });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
When only `workspaceId` is provided (no token), the SDK automatically sets `ASSEMBLY_ENV=local` at runtime and builds the compound key as `workspaceId/apiKey`.
|
|
43
|
+
|
|
44
|
+
#### Multiple workspaces
|
|
45
|
+
|
|
46
|
+
Each `createAssemblyKit()` call returns a fully independent client. To work with multiple workspaces or API keys, create one instance per credential set.
|
|
47
|
+
|
|
48
|
+
**React Server Components (recommended):** Use React's `cache()` to deduplicate instances per request. This is the idiomatic approach for Next.js App Router:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// lib/assembly.ts
|
|
52
|
+
import { cache } from "react";
|
|
53
|
+
import { createAssemblyKit } from "assembly-kit";
|
|
54
|
+
|
|
55
|
+
export const getAssemblyKit = cache((apiKey: string, workspaceId: string) =>
|
|
56
|
+
createAssemblyKit({ apiKey, workspaceId }),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// In any Server Component or server action:
|
|
60
|
+
const kitA = getAssemblyKit("api-key-a", "ws-workspace-a");
|
|
61
|
+
const kitB = getAssemblyKit("api-key-b", "ws-workspace-b");
|
|
62
|
+
|
|
63
|
+
// Same args within the same request → same instance (deduplicated by React)
|
|
64
|
+
const same = getAssemblyKit("api-key-a", "ws-workspace-a"); // === kitA
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Plain Node.js / Bun:** Manage your own singleton map:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { createAssemblyKit } from "assembly-kit";
|
|
71
|
+
import type { AssemblyKit } from "assembly-kit";
|
|
72
|
+
|
|
73
|
+
const clients = new Map<string, AssemblyKit>();
|
|
74
|
+
|
|
75
|
+
function getKit(apiKey: string, workspaceId: string): AssemblyKit {
|
|
76
|
+
const existing = clients.get(workspaceId);
|
|
77
|
+
if (existing) return existing;
|
|
78
|
+
|
|
79
|
+
const kit = createAssemblyKit({ apiKey, workspaceId });
|
|
80
|
+
clients.set(workspaceId, kit);
|
|
81
|
+
return kit;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const kitA = getKit("api-key-a", "ws-workspace-a");
|
|
85
|
+
const kitB = getKit("api-key-b", "ws-workspace-b");
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### Options
|
|
89
|
+
|
|
90
|
+
| Option | Type | Default | Description |
|
|
91
|
+
| ------------------- | --------------------- | --------- | ------------------------------------------------------------------------- |
|
|
92
|
+
| `apiKey` | `string` | — | Required. Your Assembly API key. |
|
|
93
|
+
| `token` | `string` | — | Encrypted token from Assembly. Required if `workspaceId` is not provided. |
|
|
94
|
+
| `workspaceId` | `string` | — | Explicit workspace ID. Required if `token` is not provided. |
|
|
95
|
+
| `retry` | `RetryOptions\|false` | see below | Retry config, or `false` to disable retry entirely. |
|
|
96
|
+
| `validateResponses` | `boolean` | `true` | When true, all responses are validated through Zod schemas. |
|
|
97
|
+
|
|
98
|
+
**Default retry options:**
|
|
99
|
+
|
|
100
|
+
| Option | Default |
|
|
101
|
+
| ------------ | ------- |
|
|
102
|
+
| `retries` | `3` |
|
|
103
|
+
| `minTimeout` | `1000` |
|
|
104
|
+
| `maxTimeout` | `5000` |
|
|
105
|
+
| `factor` | `2` |
|
|
106
|
+
|
|
107
|
+
#### Token properties
|
|
108
|
+
|
|
109
|
+
When a token is provided, the decrypted payload is available directly on the instance:
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
const kit = createAssemblyKit({ apiKey, token });
|
|
113
|
+
|
|
114
|
+
kit.token; // AssemblyToken | undefined — the decrypted token instance
|
|
115
|
+
kit.payload; // TokenPayload | undefined — the decrypted token payload
|
|
116
|
+
|
|
117
|
+
// Assert token type — throws AssemblyNoTokenError or AssemblyUnauthorizedError
|
|
118
|
+
const clientPayload = kit.ensureIsClient(); // ClientTokenPayload
|
|
119
|
+
const internalPayload = kit.ensureIsInternalUser(); // InternalUserTokenPayload
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### Disabling response validation
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
const kit = createAssemblyKit({
|
|
126
|
+
apiKey: "your-api-key",
|
|
127
|
+
token: encryptedToken,
|
|
128
|
+
validateResponses: false, // skip Zod parsing for performance
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### Disabling retry
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const kit = createAssemblyKit({
|
|
136
|
+
apiKey: "your-api-key",
|
|
137
|
+
token: encryptedToken,
|
|
138
|
+
retry: false,
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
#### Resource namespaces
|
|
143
|
+
|
|
144
|
+
| Namespace | Methods |
|
|
145
|
+
| ----------------------- | ----------------------------------------------------------------------- |
|
|
146
|
+
| `workspace` | `retrieve()` |
|
|
147
|
+
| `clients` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
|
|
148
|
+
| `companies` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
|
|
149
|
+
| `internalUsers` | `list()`, `retrieve()`, `listAll()` |
|
|
150
|
+
| `customFields` | `list()` |
|
|
151
|
+
| `customFieldOptions` | `list()` |
|
|
152
|
+
| `notes` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
|
|
153
|
+
| `messageChannels` | `list()`, `retrieve()`, `create()`, `listAll()` |
|
|
154
|
+
| `messages` | `list()`, `send()`, `listAll()` |
|
|
155
|
+
| `products` | `list()`, `retrieve()`, `listAll()` |
|
|
156
|
+
| `prices` | `list()`, `retrieve()`, `listAll()` |
|
|
157
|
+
| `invoiceTemplates` | `list()`, `listAll()` |
|
|
158
|
+
| `invoices` | `list()`, `retrieve()`, `create()`, `listAll()` |
|
|
159
|
+
| `subscriptionTemplates` | `list()`, `listAll()` |
|
|
160
|
+
| `subscriptions` | `list()`, `retrieve()`, `create()`, `cancel()`, `listAll()` |
|
|
161
|
+
| `payments` | `list()`, `listAll()` |
|
|
162
|
+
| `fileChannels` | `list()`, `retrieve()`, `create()`, `listAll()` |
|
|
163
|
+
| `files` | `list()`, `retrieve()`, `create()`, `delete()`, `listAll()` |
|
|
164
|
+
| `contractTemplates` | `list()`, `retrieve()`, `listAll()` |
|
|
165
|
+
| `contracts` | `list()`, `retrieve()`, `send()` |
|
|
166
|
+
| `forms` | `list()`, `retrieve()`, `listAll()` |
|
|
167
|
+
| `formResponses` | `list()`, `create()` |
|
|
168
|
+
| `tasks` | `list()`, `retrieve()`, `create()`, `update()`, `delete()`, `listAll()` |
|
|
169
|
+
| `taskTemplates` | `list()`, `retrieve()`, `listAll()` |
|
|
170
|
+
| `notifications` | `list()`, `create()`, `delete()`, `markRead()`, `markUnread()` |
|
|
171
|
+
| `events` | `list()`, `retrieve()`, `create()`, `listAll()` |
|
|
172
|
+
| `appConnections` | `list()`, `create()` |
|
|
173
|
+
| `appInstalls` | `list()`, `retrieve()` |
|
|
174
|
+
|
|
175
|
+
### Pagination
|
|
176
|
+
|
|
177
|
+
Every resource that supports listing also exposes `listAll()`, which collects all pages into a single array by following `nextToken` cursors automatically:
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { AssemblyKit } from "assembly-kit";
|
|
181
|
+
|
|
182
|
+
const kit = createAssemblyKit({ apiKey, token });
|
|
183
|
+
|
|
184
|
+
// Returns Promise<Company[]> — all pages collected
|
|
185
|
+
const allCompanies = await kit.companies.listAll();
|
|
186
|
+
|
|
187
|
+
// Filter arguments are passed through on every page
|
|
188
|
+
const allTasks = await kit.tasks.listAll({ status: "open" });
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
For manual pagination, use `list()` directly and handle `nextToken` yourself:
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
const page1 = await kit.companies.list({ limit: 100 });
|
|
195
|
+
if (page1.nextToken) {
|
|
196
|
+
const page2 = await kit.companies.list({ limit: 100, nextToken: page1.nextToken });
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Error classes
|
|
201
|
+
|
|
202
|
+
All errors extend the base `AssemblyError` class, which carries a `statusCode` and optional `details` payload. Import from the package root or from `assembly-kit/errors`:
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
import {
|
|
206
|
+
AssemblyError,
|
|
207
|
+
AssemblyMissingApiKeyError,
|
|
208
|
+
AssemblyNoTokenError,
|
|
209
|
+
AssemblyInvalidTokenError,
|
|
210
|
+
AssemblyUnauthorizedError,
|
|
211
|
+
AssemblyForbiddenError,
|
|
212
|
+
AssemblyNotFoundError,
|
|
213
|
+
AssemblyValidationError,
|
|
214
|
+
AssemblyRateLimitError,
|
|
215
|
+
AssemblyServerError,
|
|
216
|
+
AssemblyConnectionError,
|
|
217
|
+
AssemblyResponseParseError,
|
|
218
|
+
} from "assembly-kit";
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
#### Catching errors
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import { AssemblyRateLimitError, AssemblyUnauthorizedError, AssemblyError } from "assembly-kit";
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
await kit.companies.retrieve(id);
|
|
228
|
+
} catch (err) {
|
|
229
|
+
if (err instanceof AssemblyRateLimitError) {
|
|
230
|
+
console.log("Retry after:", err.retryAfter); // seconds, if provided
|
|
231
|
+
} else if (err instanceof AssemblyUnauthorizedError) {
|
|
232
|
+
console.log("Check your API key");
|
|
233
|
+
} else if (err instanceof AssemblyError) {
|
|
234
|
+
console.log(err.message, err.statusCode, err.details);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### Error hierarchy
|
|
240
|
+
|
|
241
|
+
| Class | Status | Thrown when |
|
|
242
|
+
| ---------------------------- | ------ | ------------------------------------------------------- |
|
|
243
|
+
| `AssemblyError` | — | Base class for all errors |
|
|
244
|
+
| `AssemblyMissingApiKeyError` | 400 | API key is absent or empty |
|
|
245
|
+
| `AssemblyNoTokenError` | 400 | Token required but not provided |
|
|
246
|
+
| `AssemblyInvalidTokenError` | 401 | Token could not be decrypted or validated |
|
|
247
|
+
| `AssemblyUnauthorizedError` | 401 | API key rejected, or token fails identity assertion |
|
|
248
|
+
| `AssemblyForbiddenError` | 403 | API key lacks required permission |
|
|
249
|
+
| `AssemblyNotFoundError` | 404 | Requested resource does not exist |
|
|
250
|
+
| `AssemblyValidationError` | 422 | Request payload rejected by API |
|
|
251
|
+
| `AssemblyRateLimitError` | 429 | Rate limit exceeded (`.retryAfter?: number`) |
|
|
252
|
+
| `AssemblyServerError` | 500 | Unexpected error on Assembly servers |
|
|
253
|
+
| `AssemblyResponseParseError` | 500 | API response failed Zod schema validation (`.zodError`) |
|
|
254
|
+
| `AssemblyConnectionError` | 503 | Network error reaching the API |
|
|
255
|
+
|
|
256
|
+
### Schemas
|
|
257
|
+
|
|
258
|
+
All Zod schemas are available from `assembly-kit/schemas` (also re-exported from the package root). Each resource has a base schema, a response schema (for paginated API responses), and optionally a request schema for create/update payloads.
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
import {
|
|
262
|
+
ClientSchema,
|
|
263
|
+
CompanySchema,
|
|
264
|
+
TaskSchema,
|
|
265
|
+
TaskStatusSchema,
|
|
266
|
+
WorkspaceSchema,
|
|
267
|
+
InternalUserSchema,
|
|
268
|
+
InvoiceSchema,
|
|
269
|
+
CustomFieldSchema,
|
|
270
|
+
TokenPayloadSchema,
|
|
271
|
+
HexColorSchema,
|
|
272
|
+
} from "assembly-kit/schemas";
|
|
273
|
+
|
|
274
|
+
// TypeScript types inferred from schemas
|
|
275
|
+
import type {
|
|
276
|
+
Client,
|
|
277
|
+
Company,
|
|
278
|
+
Task,
|
|
279
|
+
TaskStatus,
|
|
280
|
+
Workspace,
|
|
281
|
+
InternalUser,
|
|
282
|
+
} from "assembly-kit/schemas";
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
#### Response schemas
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
import {
|
|
289
|
+
ClientsResponseSchema,
|
|
290
|
+
CompaniesResponseSchema,
|
|
291
|
+
TasksResponseSchema,
|
|
292
|
+
} from "assembly-kit/schemas";
|
|
293
|
+
|
|
294
|
+
import type { ClientsResponse, CompaniesResponse, TasksResponse } from "assembly-kit/schemas";
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
#### Request schemas
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
import {
|
|
301
|
+
ClientCreateRequestSchema,
|
|
302
|
+
ClientUpdateRequestSchema,
|
|
303
|
+
CompanyCreateRequestSchema,
|
|
304
|
+
TaskCreateRequestSchema,
|
|
305
|
+
} from "assembly-kit/schemas";
|
|
306
|
+
|
|
307
|
+
import type { ClientCreateRequest, ClientUpdateRequest } from "assembly-kit/schemas";
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
#### Validating data
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
import { ClientSchema } from "assembly-kit/schemas";
|
|
314
|
+
|
|
315
|
+
const result = ClientSchema.safeParse(unknownData);
|
|
316
|
+
|
|
317
|
+
if (result.success) {
|
|
318
|
+
console.log(result.data.name);
|
|
319
|
+
} else {
|
|
320
|
+
console.error(result.error);
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Token Utilities
|
|
325
|
+
|
|
326
|
+
Decrypt, validate, and inspect encrypted Assembly tokens using the `AssemblyToken` class. These utilities are standalone — they are also used internally by `AssemblyKit` when a token is provided.
|
|
327
|
+
|
|
328
|
+
Import from either the package root or from `assembly-kit/token`:
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
import { AssemblyToken, createToken } from "assembly-kit";
|
|
332
|
+
// or
|
|
333
|
+
import { AssemblyToken, createToken } from "assembly-kit/token";
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
#### `AssemblyToken`
|
|
337
|
+
|
|
338
|
+
Decrypts and validates a token using your API key. The constructor exposes the payload along with convenience getters and guard methods:
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
import { AssemblyToken } from "assembly-kit";
|
|
342
|
+
|
|
343
|
+
const token = new AssemblyToken({ token: encryptedTokenHex, apiKey });
|
|
344
|
+
|
|
345
|
+
// Convenience getters
|
|
346
|
+
token.workspaceId; // string — always present
|
|
347
|
+
token.clientId; // string | undefined — present for client (portal) users
|
|
348
|
+
token.companyId; // string | undefined — present for client users
|
|
349
|
+
token.internalUserId; // string | undefined — present for internal (team member) users
|
|
350
|
+
token.tokenId; // string | undefined — present in some marketplace tokens
|
|
351
|
+
token.baseUrl; // string | undefined — overrides the API base URL if set
|
|
352
|
+
|
|
353
|
+
// Identity checks
|
|
354
|
+
token.isClientUser; // true if clientId + companyId are present
|
|
355
|
+
token.isInternalUser; // true if internalUserId is present
|
|
356
|
+
|
|
357
|
+
// Throwing guards — return narrowed payload type or throw AssemblyUnauthorizedError
|
|
358
|
+
const clientPayload = token.ensureIsClient(); // ClientTokenPayload
|
|
359
|
+
const internalPayload = token.ensureIsInternalUser(); // InternalUserTokenPayload
|
|
360
|
+
|
|
361
|
+
// Build the compound API key for the X-API-Key header
|
|
362
|
+
const key = token.buildCompoundKey({ apiKey });
|
|
363
|
+
// With tokenId: "workspaceId/apiKey/tokenId"
|
|
364
|
+
// Without tokenId: "workspaceId/apiKey"
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Throws `AssemblyNoTokenError` if the token is missing, or `AssemblyInvalidTokenError` if decryption or validation fails.
|
|
368
|
+
|
|
369
|
+
For request-scoped usage, use `AssemblyToken.new()` — it returns the existing instance for the current async context if the token matches:
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
const token = AssemblyToken.new({ token: encryptedTokenHex, apiKey });
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
#### `createToken`
|
|
376
|
+
|
|
377
|
+
Encrypt a `TokenPayload` into a hex-encoded token string (the inverse of `new AssemblyToken()`):
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
import { createToken } from "assembly-kit";
|
|
381
|
+
|
|
382
|
+
const encrypted = createToken({
|
|
383
|
+
payload: {
|
|
384
|
+
workspaceId: "ws-123",
|
|
385
|
+
clientId: "cl-456",
|
|
386
|
+
companyId: "co-789",
|
|
387
|
+
},
|
|
388
|
+
apiKey,
|
|
389
|
+
});
|
|
390
|
+
// encrypted is a hex-encoded AES-128-CBC encrypted string
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
The payload is validated against `TokenPayloadSchema` before encryption. Throws `AssemblyInvalidTokenError` if validation fails. Each call produces a different ciphertext (random IV).
|
|
394
|
+
|
|
395
|
+
### Logger
|
|
396
|
+
|
|
397
|
+
A request-scoped Pino logger is available from `assembly-kit/logger`. Requires `pino` and `pino-pretty` as peer dependencies.
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
import { createLogger, logger } from "assembly-kit/logger";
|
|
401
|
+
|
|
402
|
+
// Request-scoped: returns the same instance within the same async context
|
|
403
|
+
const log = createLogger({ level: "debug" });
|
|
404
|
+
log.info("hello");
|
|
405
|
+
log.warn("careful");
|
|
406
|
+
|
|
407
|
+
// Or use the default module-level logger
|
|
408
|
+
import { logger } from "assembly-kit/logger";
|
|
409
|
+
logger.info("starting up");
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
The logger uses `pino-pretty` in non-production environments and plain JSON in production (`NODE_ENV=production`). The default log level respects the `LOG_LEVEL` environment variable.
|
|
413
|
+
|
|
414
|
+
### App Bridge (React Hooks)
|
|
415
|
+
|
|
416
|
+
React hooks that register UI elements in the Assembly dashboard header from an embedded iframe app. Handles setup, cleanup, and `beforeunload` automatically.
|
|
417
|
+
|
|
418
|
+
Requires `react >= 18` and `@assembly-js/app-bridge` as peer dependencies:
|
|
419
|
+
|
|
420
|
+
```bash
|
|
421
|
+
pnpm add react @assembly-js/app-bridge
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Import from `assembly-kit/bridge-ui`:
|
|
425
|
+
|
|
426
|
+
#### `usePrimaryCta`
|
|
427
|
+
|
|
428
|
+
Registers a primary CTA button in the dashboard header:
|
|
429
|
+
|
|
430
|
+
```tsx
|
|
431
|
+
import { usePrimaryCta } from "assembly-kit/bridge-ui";
|
|
432
|
+
import type { CtaConfig } from "@assembly-js/app-bridge";
|
|
433
|
+
|
|
434
|
+
function MyApp() {
|
|
435
|
+
usePrimaryCta({
|
|
436
|
+
label: "Create Invoice",
|
|
437
|
+
onClick: () => {
|
|
438
|
+
console.log("Primary CTA clicked");
|
|
439
|
+
},
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
return <div>My App</div>;
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
#### `useSecondaryCta`
|
|
447
|
+
|
|
448
|
+
Registers a secondary CTA button. Same API as `usePrimaryCta`:
|
|
449
|
+
|
|
450
|
+
```tsx
|
|
451
|
+
import { useSecondaryCta } from "assembly-kit/bridge-ui";
|
|
452
|
+
|
|
453
|
+
function MyApp() {
|
|
454
|
+
useSecondaryCta({
|
|
455
|
+
label: "Export",
|
|
456
|
+
onClick: () => {
|
|
457
|
+
console.log("Secondary CTA clicked");
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
return <div>My App</div>;
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
#### `useActionsMenu`
|
|
466
|
+
|
|
467
|
+
Registers a dropdown actions menu in the dashboard header:
|
|
468
|
+
|
|
469
|
+
```tsx
|
|
470
|
+
import { useActionsMenu } from "assembly-kit/bridge-ui";
|
|
471
|
+
import type { ActionMenuItem } from "@assembly-js/app-bridge";
|
|
472
|
+
|
|
473
|
+
function MyApp() {
|
|
474
|
+
useActionsMenu([
|
|
475
|
+
{ label: "Archive", onClick: () => archive() },
|
|
476
|
+
{ label: "Delete", onClick: () => remove() },
|
|
477
|
+
]);
|
|
478
|
+
|
|
479
|
+
return <div>My App</div>;
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
#### Visibility toggle
|
|
484
|
+
|
|
485
|
+
All hooks accept an optional second argument to control visibility. When `false`, the slot is cleared. Defaults to `true`:
|
|
486
|
+
|
|
487
|
+
```tsx
|
|
488
|
+
usePrimaryCta({ label: "Save", onClick: () => save() }, false);
|
|
489
|
+
useActionsMenu([{ label: "Archive", onClick: () => archive() }], hasItems);
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## Entry Points
|
|
493
|
+
|
|
494
|
+
| Import path | Exports |
|
|
495
|
+
| ------------------------ | ------------------------------------------------------------------------------------------- |
|
|
496
|
+
| `assembly-kit` | `createAssemblyKit`, `AssemblyKit`, all errors, all schemas, `AssemblyToken`, `createToken` |
|
|
497
|
+
| `assembly-kit/client` | `createAssemblyKit`, `AssemblyKit`, `AssemblyKitOptions`, `RetryOptions` |
|
|
498
|
+
| `assembly-kit/errors` | All error classes |
|
|
499
|
+
| `assembly-kit/schemas` | All Zod schemas and inferred types (no client dependency) |
|
|
500
|
+
| `assembly-kit/token` | `AssemblyToken`, `createToken`, `ClientTokenPayload`, `InternalUserTokenPayload` |
|
|
501
|
+
| `assembly-kit/logger` | `createLogger`, `logger` |
|
|
502
|
+
| `assembly-kit/bridge-ui` | `usePrimaryCta`, `useSecondaryCta`, `useActionsMenu` |
|
|
503
|
+
|
|
504
|
+
## Development
|
|
505
|
+
|
|
506
|
+
```bash
|
|
507
|
+
pnpm run build # build to dist/
|
|
508
|
+
pnpm run dev # build in watch mode
|
|
509
|
+
pnpm test # run tests
|
|
510
|
+
pnpm run check # lint + format + type check
|
|
511
|
+
pnpm run release # bump version, commit, push, tag
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
## License
|
|
515
|
+
|
|
516
|
+
MIT
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ActionMenuItem } from "@assembly-js/app-bridge";
|
|
2
|
+
|
|
3
|
+
//#region src/bridge-ui/use-actions-menu.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Registers an actions menu in the Assembly dashboard header.
|
|
6
|
+
*
|
|
7
|
+
* Uses `AssemblyBridge.header.setActionsMenu()` to set the menu items and
|
|
8
|
+
* automatically clears them on unmount or page unload.
|
|
9
|
+
*
|
|
10
|
+
* @param items - Array of menu items with labels, icons, and click handlers.
|
|
11
|
+
* @param show - Whether the menu is visible. Defaults to true.
|
|
12
|
+
*/
|
|
13
|
+
declare const useActionsMenu: (items: ActionMenuItem[], show?: boolean) => void;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { useActionsMenu };
|
|
16
|
+
//# sourceMappingURL=use-actions-menu.d.mts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AssemblyBridge } from "@assembly-js/app-bridge";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
//#region src/bridge-ui/use-actions-menu.ts
|
|
4
|
+
/**
|
|
5
|
+
* Registers an actions menu in the Assembly dashboard header.
|
|
6
|
+
*
|
|
7
|
+
* Uses `AssemblyBridge.header.setActionsMenu()` to set the menu items and
|
|
8
|
+
* automatically clears them on unmount or page unload.
|
|
9
|
+
*
|
|
10
|
+
* @param items - Array of menu items with labels, icons, and click handlers.
|
|
11
|
+
* @param show - Whether the menu is visible. Defaults to true.
|
|
12
|
+
*/
|
|
13
|
+
const useActionsMenu = (items, show = true) => {
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
AssemblyBridge.header.setActionsMenu(show ? items : []);
|
|
16
|
+
return () => {
|
|
17
|
+
AssemblyBridge.header.setActionsMenu([]);
|
|
18
|
+
};
|
|
19
|
+
}, [items, show]);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const handleUnload = () => {
|
|
22
|
+
AssemblyBridge.header.setActionsMenu([]);
|
|
23
|
+
};
|
|
24
|
+
addEventListener("beforeunload", handleUnload);
|
|
25
|
+
return () => {
|
|
26
|
+
removeEventListener("beforeunload", handleUnload);
|
|
27
|
+
};
|
|
28
|
+
}, []);
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { useActionsMenu };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=use-actions-menu.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-actions-menu.mjs","names":[],"sources":["../../src/bridge-ui/use-actions-menu.ts"],"sourcesContent":["import { AssemblyBridge } from \"@assembly-js/app-bridge\";\nimport type { ActionMenuItem } from \"@assembly-js/app-bridge\";\nimport { useEffect } from \"react\";\n\n/**\n * Registers an actions menu in the Assembly dashboard header.\n *\n * Uses `AssemblyBridge.header.setActionsMenu()` to set the menu items and\n * automatically clears them on unmount or page unload.\n *\n * @param items - Array of menu items with labels, icons, and click handlers.\n * @param show - Whether the menu is visible. Defaults to true.\n */\nexport const useActionsMenu = (items: ActionMenuItem[], show = true): void => {\n useEffect(() => {\n AssemblyBridge.header.setActionsMenu(show ? items : []);\n\n return () => {\n AssemblyBridge.header.setActionsMenu([]);\n };\n }, [items, show]);\n\n useEffect(() => {\n const handleUnload = (): void => {\n AssemblyBridge.header.setActionsMenu([]);\n };\n\n addEventListener(\"beforeunload\", handleUnload);\n\n return () => {\n removeEventListener(\"beforeunload\", handleUnload);\n };\n }, []);\n};\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,kBAAkB,OAAyB,OAAO,SAAe;AAC5E,iBAAgB;AACd,iBAAe,OAAO,eAAe,OAAO,QAAQ,EAAE,CAAC;AAEvD,eAAa;AACX,kBAAe,OAAO,eAAe,EAAE,CAAC;;IAEzC,CAAC,OAAO,KAAK,CAAC;AAEjB,iBAAgB;EACd,MAAM,qBAA2B;AAC/B,kBAAe,OAAO,eAAe,EAAE,CAAC;;AAG1C,mBAAiB,gBAAgB,aAAa;AAE9C,eAAa;AACX,uBAAoB,gBAAgB,aAAa;;IAElD,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CtaConfig } from "@assembly-js/app-bridge";
|
|
2
|
+
|
|
3
|
+
//#region src/bridge-ui/use-primary-cta.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Registers a primary CTA button in the Assembly dashboard header.
|
|
6
|
+
*
|
|
7
|
+
* Uses `AssemblyBridge.header.setPrimaryCta()` to set the button and
|
|
8
|
+
* automatically clears it on unmount or page unload.
|
|
9
|
+
*
|
|
10
|
+
* @param cta - Label, icon, and click handler for the primary CTA.
|
|
11
|
+
* @param show - Whether the CTA is visible. Defaults to true.
|
|
12
|
+
*/
|
|
13
|
+
declare const usePrimaryCta: (cta: CtaConfig, show?: boolean) => void;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { usePrimaryCta };
|
|
16
|
+
//# sourceMappingURL=use-primary-cta.d.mts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AssemblyBridge } from "@assembly-js/app-bridge";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
//#region src/bridge-ui/use-primary-cta.ts
|
|
4
|
+
/**
|
|
5
|
+
* Registers a primary CTA button in the Assembly dashboard header.
|
|
6
|
+
*
|
|
7
|
+
* Uses `AssemblyBridge.header.setPrimaryCta()` to set the button and
|
|
8
|
+
* automatically clears it on unmount or page unload.
|
|
9
|
+
*
|
|
10
|
+
* @param cta - Label, icon, and click handler for the primary CTA.
|
|
11
|
+
* @param show - Whether the CTA is visible. Defaults to true.
|
|
12
|
+
*/
|
|
13
|
+
const usePrimaryCta = (cta, show = true) => {
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (show) AssemblyBridge.header.setPrimaryCta(cta);
|
|
16
|
+
else AssemblyBridge.header.setPrimaryCta(null);
|
|
17
|
+
return () => {
|
|
18
|
+
AssemblyBridge.header.setPrimaryCta(null);
|
|
19
|
+
};
|
|
20
|
+
}, [cta, show]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const handleUnload = () => {
|
|
23
|
+
AssemblyBridge.header.setPrimaryCta(null);
|
|
24
|
+
};
|
|
25
|
+
addEventListener("beforeunload", handleUnload);
|
|
26
|
+
return () => {
|
|
27
|
+
removeEventListener("beforeunload", handleUnload);
|
|
28
|
+
};
|
|
29
|
+
}, []);
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { usePrimaryCta };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=use-primary-cta.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-primary-cta.mjs","names":[],"sources":["../../src/bridge-ui/use-primary-cta.ts"],"sourcesContent":["import { AssemblyBridge } from \"@assembly-js/app-bridge\";\nimport type { CtaConfig } from \"@assembly-js/app-bridge\";\nimport { useEffect } from \"react\";\n\n/**\n * Registers a primary CTA button in the Assembly dashboard header.\n *\n * Uses `AssemblyBridge.header.setPrimaryCta()` to set the button and\n * automatically clears it on unmount or page unload.\n *\n * @param cta - Label, icon, and click handler for the primary CTA.\n * @param show - Whether the CTA is visible. Defaults to true.\n */\nexport const usePrimaryCta = (cta: CtaConfig, show = true): void => {\n useEffect(() => {\n if (show) {\n AssemblyBridge.header.setPrimaryCta(cta);\n } else {\n AssemblyBridge.header.setPrimaryCta(null);\n }\n\n return () => {\n AssemblyBridge.header.setPrimaryCta(null);\n };\n }, [cta, show]);\n\n useEffect(() => {\n const handleUnload = (): void => {\n AssemblyBridge.header.setPrimaryCta(null);\n };\n\n addEventListener(\"beforeunload\", handleUnload);\n\n return () => {\n removeEventListener(\"beforeunload\", handleUnload);\n };\n }, []);\n};\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,iBAAiB,KAAgB,OAAO,SAAe;AAClE,iBAAgB;AACd,MAAI,KACF,gBAAe,OAAO,cAAc,IAAI;MAExC,gBAAe,OAAO,cAAc,KAAK;AAG3C,eAAa;AACX,kBAAe,OAAO,cAAc,KAAK;;IAE1C,CAAC,KAAK,KAAK,CAAC;AAEf,iBAAgB;EACd,MAAM,qBAA2B;AAC/B,kBAAe,OAAO,cAAc,KAAK;;AAG3C,mBAAiB,gBAAgB,aAAa;AAE9C,eAAa;AACX,uBAAoB,gBAAgB,aAAa;;IAElD,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CtaConfig } from "@assembly-js/app-bridge";
|
|
2
|
+
|
|
3
|
+
//#region src/bridge-ui/use-secondary-cta.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Registers a secondary CTA button in the Assembly dashboard header.
|
|
6
|
+
*
|
|
7
|
+
* Uses `AssemblyBridge.header.setSecondaryCta()` to set the button and
|
|
8
|
+
* automatically clears it on unmount or page unload.
|
|
9
|
+
*
|
|
10
|
+
* @param cta - Label, icon, and click handler for the secondary CTA.
|
|
11
|
+
* @param show - Whether the CTA is visible. Defaults to true.
|
|
12
|
+
*/
|
|
13
|
+
declare const useSecondaryCta: (cta: CtaConfig, show?: boolean) => void;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { useSecondaryCta };
|
|
16
|
+
//# sourceMappingURL=use-secondary-cta.d.mts.map
|