@tlj-blocks/feedback-client
v0.1.0
Published
Framework-agnostic data connector for submitting feedback to a tlj-feedback endpoint
Readme
@tlj-blocks/feedback-client
Submits user feedback to a @tlj-blocks/feedback-cdk endpoint, which
is a Lambda Function URL that emails the feedback through SNS. It has no
dependencies and runs anywhere fetch exists.
Install
npm install @tlj-blocks/feedback-clientUsage
import { submitFeedback } from "@tlj-blocks/feedback-client";
await submitFeedback({
endpoint: "https://<your-function-url>.lambda-url.us-east-1.on.aws/",
feedback: {
type: "bug", // "bug" or "feature"
title: "Save button does nothing",
description: "Clicking Save on the settings page has no effect.",
},
});With the reporter's address and what the app knows
email names who sent it. system is a flat record of what the app knows
about its environment, such as its version, the OS and its configuration. The
email prints it after the description, one line per entry, in the order given.
A value with line breaks, such as a block of JSON, is printed indented under
its key.
await submitFeedback({
endpoint,
feedback: {
type: "bug",
title: "Save button does nothing",
description: "Clicking Save on the settings page has no effect.",
email: "[email protected]",
system: {
"App version": "1.4.0",
OS: "macos (aarch64)",
Settings: JSON.stringify(settings, null, 2),
},
},
});With auth
Pass a bearer token, or a function that returns one, and it goes out as an
Authorization: Bearer <token> header.
await submitFeedback({
endpoint,
feedback,
authToken: () => auth.tokens.idToken, // string | () => string | Promise<string>
});API
submitFeedback(options) resolves when the endpoint accepts the feedback. It
throws a FeedbackError on invalid input or a non-OK response, and
error.status holds the HTTP status.
| Option | Type | Notes |
| ----------- | ----------------------------------------------- | ---------------------------------------------------------------------- |
| endpoint | string | Absolute feedback URL. Required. |
| feedback | { type, title, description, email?, system? } | type is "bug" or "feature". system is Record<string, string>. |
| authToken | string \| () => string \| Promise<string> | Optional bearer token. |
| fetch | typeof fetch | Defaults to globalThis.fetch. |
| headers | Record<string, string> | Extra request headers. |
| signal | AbortSignal | Optional cancellation signal. |
