@fatagnus/convex-feedback 0.1.0

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.
Files changed (78) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +382 -0
  3. package/dist/convex/agents/bugReportAgent.d.ts +30 -0
  4. package/dist/convex/agents/bugReportAgent.d.ts.map +1 -0
  5. package/dist/convex/agents/bugReportAgent.js +243 -0
  6. package/dist/convex/agents/bugReportAgent.js.map +1 -0
  7. package/dist/convex/agents/feedbackAgent.d.ts +29 -0
  8. package/dist/convex/agents/feedbackAgent.d.ts.map +1 -0
  9. package/dist/convex/agents/feedbackAgent.js +232 -0
  10. package/dist/convex/agents/feedbackAgent.js.map +1 -0
  11. package/dist/convex/bugReports.d.ts +49 -0
  12. package/dist/convex/bugReports.d.ts.map +1 -0
  13. package/dist/convex/bugReports.js +321 -0
  14. package/dist/convex/bugReports.js.map +1 -0
  15. package/dist/convex/convex.config.d.ts +3 -0
  16. package/dist/convex/convex.config.d.ts.map +1 -0
  17. package/dist/convex/convex.config.js +6 -0
  18. package/dist/convex/convex.config.js.map +1 -0
  19. package/dist/convex/emails/bugReportEmails.d.ts +16 -0
  20. package/dist/convex/emails/bugReportEmails.d.ts.map +1 -0
  21. package/dist/convex/emails/bugReportEmails.js +403 -0
  22. package/dist/convex/emails/bugReportEmails.js.map +1 -0
  23. package/dist/convex/emails/feedbackEmails.d.ts +16 -0
  24. package/dist/convex/emails/feedbackEmails.d.ts.map +1 -0
  25. package/dist/convex/emails/feedbackEmails.js +389 -0
  26. package/dist/convex/emails/feedbackEmails.js.map +1 -0
  27. package/dist/convex/feedback.d.ts +49 -0
  28. package/dist/convex/feedback.d.ts.map +1 -0
  29. package/dist/convex/feedback.js +327 -0
  30. package/dist/convex/feedback.js.map +1 -0
  31. package/dist/convex/index.d.ts +10 -0
  32. package/dist/convex/index.d.ts.map +1 -0
  33. package/dist/convex/index.js +12 -0
  34. package/dist/convex/index.js.map +1 -0
  35. package/dist/convex/schema.d.ts +200 -0
  36. package/dist/convex/schema.d.ts.map +1 -0
  37. package/dist/convex/schema.js +150 -0
  38. package/dist/convex/schema.js.map +1 -0
  39. package/dist/convex/supportTeams.d.ts +29 -0
  40. package/dist/convex/supportTeams.d.ts.map +1 -0
  41. package/dist/convex/supportTeams.js +159 -0
  42. package/dist/convex/supportTeams.js.map +1 -0
  43. package/dist/index.d.ts +70 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +63 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/react/BugReportButton.d.ts +70 -0
  48. package/dist/react/BugReportButton.d.ts.map +1 -0
  49. package/dist/react/BugReportButton.js +371 -0
  50. package/dist/react/BugReportButton.js.map +1 -0
  51. package/dist/react/BugReportContext.d.ts +59 -0
  52. package/dist/react/BugReportContext.d.ts.map +1 -0
  53. package/dist/react/BugReportContext.js +107 -0
  54. package/dist/react/BugReportContext.js.map +1 -0
  55. package/dist/react/index.d.ts +36 -0
  56. package/dist/react/index.d.ts.map +1 -0
  57. package/dist/react/index.js +36 -0
  58. package/dist/react/index.js.map +1 -0
  59. package/dist/types.d.ts +89 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +5 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +101 -0
  64. package/src/convex/agents/bugReportAgent.ts +277 -0
  65. package/src/convex/agents/feedbackAgent.ts +264 -0
  66. package/src/convex/bugReports.ts +350 -0
  67. package/src/convex/convex.config.ts +7 -0
  68. package/src/convex/emails/bugReportEmails.ts +479 -0
  69. package/src/convex/emails/feedbackEmails.ts +465 -0
  70. package/src/convex/feedback.ts +356 -0
  71. package/src/convex/index.ts +28 -0
  72. package/src/convex/schema.ts +207 -0
  73. package/src/convex/supportTeams.ts +179 -0
  74. package/src/index.ts +77 -0
  75. package/src/react/BugReportButton.tsx +755 -0
  76. package/src/react/BugReportContext.tsx +146 -0
  77. package/src/react/index.ts +46 -0
  78. package/src/types.ts +93 -0
@@ -0,0 +1,150 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+ // ===== Validators =====
4
+ /**
5
+ * Bug report severity levels
6
+ */
7
+ export const bugSeverityValidator = v.union(v.literal("low"), v.literal("medium"), v.literal("high"), v.literal("critical"));
8
+ /**
9
+ * Bug report status
10
+ */
11
+ export const bugStatusValidator = v.union(v.literal("open"), v.literal("in-progress"), v.literal("resolved"), v.literal("closed"));
12
+ /**
13
+ * Feedback type
14
+ */
15
+ export const feedbackTypeValidator = v.union(v.literal("feature_request"), v.literal("change_request"), v.literal("general"));
16
+ /**
17
+ * Feedback priority
18
+ */
19
+ export const feedbackPriorityValidator = v.union(v.literal("nice_to_have"), v.literal("important"), v.literal("critical"));
20
+ /**
21
+ * Feedback status
22
+ */
23
+ export const feedbackStatusValidator = v.union(v.literal("open"), v.literal("under_review"), v.literal("planned"), v.literal("in_progress"), v.literal("completed"), v.literal("declined"));
24
+ /**
25
+ * Reporter type
26
+ */
27
+ export const reporterTypeValidator = v.union(v.literal("staff"), v.literal("customer"));
28
+ /**
29
+ * Effort estimate
30
+ */
31
+ export const effortValidator = v.union(v.literal("low"), v.literal("medium"), v.literal("high"));
32
+ // ===== Schema =====
33
+ export default defineSchema({
34
+ /**
35
+ * Bug Reports - in-app bug reports with diagnostics
36
+ */
37
+ bugReports: defineTable({
38
+ // Report content
39
+ title: v.string(),
40
+ description: v.string(),
41
+ severity: bugSeverityValidator,
42
+ status: bugStatusValidator,
43
+ // Archive flag
44
+ isArchived: v.optional(v.boolean()),
45
+ // Reporter info
46
+ reporterType: reporterTypeValidator,
47
+ reporterId: v.string(),
48
+ reporterEmail: v.string(),
49
+ reporterName: v.string(),
50
+ // Page context
51
+ url: v.string(),
52
+ route: v.optional(v.string()),
53
+ // Browser diagnostics
54
+ browserInfo: v.string(), // JSON stringified browser info
55
+ consoleErrors: v.optional(v.string()), // JSON stringified array of errors
56
+ // Screenshot
57
+ screenshotStorageId: v.optional(v.id("_storage")),
58
+ // Viewport
59
+ viewportWidth: v.number(),
60
+ viewportHeight: v.number(),
61
+ // Network state
62
+ networkState: v.string(), // online/offline
63
+ // AI Analysis fields
64
+ aiSummary: v.optional(v.string()),
65
+ aiRootCauseAnalysis: v.optional(v.string()),
66
+ aiReproductionSteps: v.optional(v.array(v.string())),
67
+ aiSuggestedFix: v.optional(v.string()),
68
+ aiEstimatedEffort: v.optional(effortValidator),
69
+ aiSuggestedSeverity: v.optional(bugSeverityValidator),
70
+ aiAnalyzedAt: v.optional(v.number()),
71
+ aiThreadId: v.optional(v.string()),
72
+ notificationsSentAt: v.optional(v.number()),
73
+ // Timestamps
74
+ createdAt: v.number(),
75
+ updatedAt: v.number(),
76
+ })
77
+ .index("by_status", ["status"])
78
+ .index("by_severity", ["severity"])
79
+ .index("by_reporter", ["reporterType", "reporterId"])
80
+ .index("by_created", ["createdAt"])
81
+ .index("by_archived", ["isArchived"])
82
+ .index("by_ai_analyzed", ["aiAnalyzedAt"]),
83
+ /**
84
+ * Feedback - feature requests, change requests, and general feedback
85
+ */
86
+ feedback: defineTable({
87
+ // Feedback type
88
+ type: feedbackTypeValidator,
89
+ // Content
90
+ title: v.string(),
91
+ description: v.string(),
92
+ priority: feedbackPriorityValidator,
93
+ status: feedbackStatusValidator,
94
+ // Archive flag
95
+ isArchived: v.optional(v.boolean()),
96
+ // Reporter info
97
+ reporterType: reporterTypeValidator,
98
+ reporterId: v.string(),
99
+ reporterEmail: v.string(),
100
+ reporterName: v.string(),
101
+ // Page context
102
+ url: v.string(),
103
+ route: v.optional(v.string()),
104
+ // Browser diagnostics
105
+ browserInfo: v.string(),
106
+ consoleErrors: v.optional(v.string()),
107
+ // Screenshot
108
+ screenshotStorageId: v.optional(v.id("_storage")),
109
+ // Viewport
110
+ viewportWidth: v.number(),
111
+ viewportHeight: v.number(),
112
+ // Network state
113
+ networkState: v.string(),
114
+ // AI Analysis fields
115
+ aiSummary: v.optional(v.string()),
116
+ aiImpactAnalysis: v.optional(v.string()),
117
+ aiActionItems: v.optional(v.array(v.string())),
118
+ aiEstimatedEffort: v.optional(effortValidator),
119
+ aiSuggestedPriority: v.optional(feedbackPriorityValidator),
120
+ aiAnalyzedAt: v.optional(v.number()),
121
+ aiThreadId: v.optional(v.string()),
122
+ notificationsSentAt: v.optional(v.number()),
123
+ // Timestamps
124
+ createdAt: v.number(),
125
+ updatedAt: v.number(),
126
+ })
127
+ .index("by_status", ["status"])
128
+ .index("by_type", ["type"])
129
+ .index("by_priority", ["priority"])
130
+ .index("by_reporter", ["reporterType", "reporterId"])
131
+ .index("by_created", ["createdAt"])
132
+ .index("by_archived", ["isArchived"])
133
+ .index("by_ai_analyzed", ["aiAnalyzedAt"]),
134
+ /**
135
+ * Support Teams - configure teams for notification routing
136
+ */
137
+ supportTeams: defineTable({
138
+ teamName: v.string(),
139
+ memberEmails: v.array(v.string()),
140
+ // Multi-select: which feedback types this team handles
141
+ feedbackTypes: v.array(feedbackTypeValidator),
142
+ // Multi-select: which bug report severities this team handles
143
+ bugReportSeverities: v.array(bugSeverityValidator),
144
+ isActive: v.boolean(),
145
+ createdAt: v.number(),
146
+ updatedAt: v.number(),
147
+ })
148
+ .index("by_active", ["isActive"]),
149
+ });
150
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/convex/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * List all support teams.
3
+ */
4
+ export declare const list: any;
5
+ /**
6
+ * Get a support team by ID.
7
+ */
8
+ export declare const get: any;
9
+ /**
10
+ * Internal query to find all active teams that handle a given feedback type.
11
+ */
12
+ export declare const getTeamsForFeedbackType: any;
13
+ /**
14
+ * Internal query to find all active teams that handle a given bug report severity.
15
+ */
16
+ export declare const getTeamsForBugReportSeverity: any;
17
+ /**
18
+ * Create a new support team.
19
+ */
20
+ export declare const create: any;
21
+ /**
22
+ * Update a support team.
23
+ */
24
+ export declare const update: any;
25
+ /**
26
+ * Delete a support team.
27
+ */
28
+ export declare const remove: any;
29
+ //# sourceMappingURL=supportTeams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportTeams.d.ts","sourceRoot":"","sources":["../../src/convex/supportTeams.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,eAAO,MAAM,IAAI,KAcf,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,GAAG,KAQd,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB,KAelC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,4BAA4B,KAevC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,KAoBjB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,KAuCjB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,KAcjB,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { v } from "convex/values";
2
+ import { mutation, query, internalQuery } from "./_generated/server";
3
+ import { feedbackTypeValidator, bugSeverityValidator, } from "./schema";
4
+ // Return type for support team records
5
+ const supportTeamReturnValidator = v.object({
6
+ _id: v.id("supportTeams"),
7
+ _creationTime: v.number(),
8
+ teamName: v.string(),
9
+ memberEmails: v.array(v.string()),
10
+ feedbackTypes: v.array(feedbackTypeValidator),
11
+ bugReportSeverities: v.array(bugSeverityValidator),
12
+ isActive: v.boolean(),
13
+ createdAt: v.number(),
14
+ updatedAt: v.number(),
15
+ });
16
+ /**
17
+ * List all support teams.
18
+ */
19
+ export const list = query({
20
+ args: {
21
+ activeOnly: v.optional(v.boolean()),
22
+ },
23
+ returns: v.array(supportTeamReturnValidator),
24
+ handler: async (ctx, args) => {
25
+ if (args.activeOnly) {
26
+ return await ctx.db
27
+ .query("supportTeams")
28
+ .withIndex("by_active", (q) => q.eq("isActive", true))
29
+ .collect();
30
+ }
31
+ return await ctx.db.query("supportTeams").collect();
32
+ },
33
+ });
34
+ /**
35
+ * Get a support team by ID.
36
+ */
37
+ export const get = query({
38
+ args: {
39
+ teamId: v.id("supportTeams"),
40
+ },
41
+ returns: v.union(supportTeamReturnValidator, v.null()),
42
+ handler: async (ctx, args) => {
43
+ return await ctx.db.get(args.teamId);
44
+ },
45
+ });
46
+ /**
47
+ * Internal query to find all active teams that handle a given feedback type.
48
+ */
49
+ export const getTeamsForFeedbackType = internalQuery({
50
+ args: {
51
+ feedbackType: feedbackTypeValidator,
52
+ },
53
+ returns: v.array(supportTeamReturnValidator),
54
+ handler: async (ctx, args) => {
55
+ const allTeams = await ctx.db
56
+ .query("supportTeams")
57
+ .withIndex("by_active", (q) => q.eq("isActive", true))
58
+ .collect();
59
+ return allTeams.filter((team) => team.feedbackTypes.includes(args.feedbackType));
60
+ },
61
+ });
62
+ /**
63
+ * Internal query to find all active teams that handle a given bug report severity.
64
+ */
65
+ export const getTeamsForBugReportSeverity = internalQuery({
66
+ args: {
67
+ severity: bugSeverityValidator,
68
+ },
69
+ returns: v.array(supportTeamReturnValidator),
70
+ handler: async (ctx, args) => {
71
+ const allTeams = await ctx.db
72
+ .query("supportTeams")
73
+ .withIndex("by_active", (q) => q.eq("isActive", true))
74
+ .collect();
75
+ return allTeams.filter((team) => team.bugReportSeverities.includes(args.severity));
76
+ },
77
+ });
78
+ /**
79
+ * Create a new support team.
80
+ */
81
+ export const create = mutation({
82
+ args: {
83
+ teamName: v.string(),
84
+ memberEmails: v.array(v.string()),
85
+ feedbackTypes: v.array(feedbackTypeValidator),
86
+ bugReportSeverities: v.array(bugSeverityValidator),
87
+ },
88
+ returns: v.id("supportTeams"),
89
+ handler: async (ctx, args) => {
90
+ const now = Date.now();
91
+ return await ctx.db.insert("supportTeams", {
92
+ teamName: args.teamName,
93
+ memberEmails: args.memberEmails,
94
+ feedbackTypes: args.feedbackTypes,
95
+ bugReportSeverities: args.bugReportSeverities,
96
+ isActive: true,
97
+ createdAt: now,
98
+ updatedAt: now,
99
+ });
100
+ },
101
+ });
102
+ /**
103
+ * Update a support team.
104
+ */
105
+ export const update = mutation({
106
+ args: {
107
+ teamId: v.id("supportTeams"),
108
+ teamName: v.optional(v.string()),
109
+ memberEmails: v.optional(v.array(v.string())),
110
+ feedbackTypes: v.optional(v.array(feedbackTypeValidator)),
111
+ bugReportSeverities: v.optional(v.array(bugSeverityValidator)),
112
+ isActive: v.optional(v.boolean()),
113
+ },
114
+ returns: v.null(),
115
+ handler: async (ctx, args) => {
116
+ const team = await ctx.db.get(args.teamId);
117
+ if (!team) {
118
+ throw new Error("Support team not found");
119
+ }
120
+ const updates = {
121
+ updatedAt: Date.now(),
122
+ };
123
+ if (args.teamName !== undefined) {
124
+ updates.teamName = args.teamName;
125
+ }
126
+ if (args.memberEmails !== undefined) {
127
+ updates.memberEmails = args.memberEmails;
128
+ }
129
+ if (args.feedbackTypes !== undefined) {
130
+ updates.feedbackTypes = args.feedbackTypes;
131
+ }
132
+ if (args.bugReportSeverities !== undefined) {
133
+ updates.bugReportSeverities = args.bugReportSeverities;
134
+ }
135
+ if (args.isActive !== undefined) {
136
+ updates.isActive = args.isActive;
137
+ }
138
+ await ctx.db.patch(args.teamId, updates);
139
+ return null;
140
+ },
141
+ });
142
+ /**
143
+ * Delete a support team.
144
+ */
145
+ export const remove = mutation({
146
+ args: {
147
+ teamId: v.id("supportTeams"),
148
+ },
149
+ returns: v.null(),
150
+ handler: async (ctx, args) => {
151
+ const team = await ctx.db.get(args.teamId);
152
+ if (!team) {
153
+ throw new Error("Support team not found");
154
+ }
155
+ await ctx.db.delete(args.teamId);
156
+ return null;
157
+ },
158
+ });
159
+ //# sourceMappingURL=supportTeams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supportTeams.js","sourceRoot":"","sources":["../../src/convex/supportTeams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @convex-dev/feedback
3
+ *
4
+ * Bug reports and feedback collection component for Convex applications.
5
+ *
6
+ * ## Installation
7
+ *
8
+ * ```bash
9
+ * npm install @convex-dev/feedback
10
+ * ```
11
+ *
12
+ * ## Setup
13
+ *
14
+ * 1. Add the component to your `convex/convex.config.ts`:
15
+ *
16
+ * ```typescript
17
+ * import { defineApp } from "convex/server";
18
+ * import feedback from "@convex-dev/feedback/convex.config";
19
+ *
20
+ * const app = defineApp();
21
+ * app.use(feedback);
22
+ * export default app;
23
+ * ```
24
+ *
25
+ * 2. Set required environment variables in your Convex dashboard:
26
+ * - `OPENROUTER_API_KEY` - For AI analysis (optional)
27
+ * - `RESEND_API_KEY` - For email notifications (optional)
28
+ * - `RESEND_FROM_EMAIL` - From address for emails (optional)
29
+ *
30
+ * ## Usage
31
+ *
32
+ * ### Convex Functions
33
+ *
34
+ * The component exposes these functions through `api.feedback`:
35
+ *
36
+ * - `api.feedback.bugReports.create` - Create a bug report
37
+ * - `api.feedback.bugReports.list` - List bug reports
38
+ * - `api.feedback.bugReports.get` - Get a bug report by ID
39
+ * - `api.feedback.bugReports.updateStatus` - Update bug report status
40
+ * - `api.feedback.bugReports.archive` - Archive a bug report
41
+ * - `api.feedback.bugReports.unarchive` - Unarchive a bug report
42
+ *
43
+ * - `api.feedback.feedback.create` - Create feedback
44
+ * - `api.feedback.feedback.list` - List feedback
45
+ * - `api.feedback.feedback.get` - Get feedback by ID
46
+ * - `api.feedback.feedback.updateStatus` - Update feedback status
47
+ *
48
+ * - `api.feedback.supportTeams.list` - List support teams
49
+ * - `api.feedback.supportTeams.create` - Create a support team
50
+ * - `api.feedback.supportTeams.update` - Update a support team
51
+ *
52
+ * ### React Components
53
+ *
54
+ * Import from `@convex-dev/feedback/react`:
55
+ *
56
+ * ```tsx
57
+ * import { BugReportProvider, BugReportButton } from '@convex-dev/feedback/react';
58
+ * ```
59
+ *
60
+ * @module
61
+ */
62
+ export type BugSeverity = 'low' | 'medium' | 'high' | 'critical';
63
+ export type BugStatus = 'open' | 'in-progress' | 'resolved' | 'closed';
64
+ export type FeedbackType = 'feature_request' | 'change_request' | 'general';
65
+ export type FeedbackPriority = 'nice_to_have' | 'important' | 'critical';
66
+ export type FeedbackStatus = 'open' | 'under_review' | 'planned' | 'in_progress' | 'completed' | 'declined';
67
+ export type ReporterType = 'staff' | 'customer';
68
+ export type Effort = 'low' | 'medium' | 'high';
69
+ export type { BugReport, Feedback, SupportTeam, } from './types';
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAGH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,GAAG,QAAQ,CAAC;AACvE,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC;AACzE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAC5G,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;AAChD,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAG/C,YAAY,EACV,SAAS,EACT,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @convex-dev/feedback
3
+ *
4
+ * Bug reports and feedback collection component for Convex applications.
5
+ *
6
+ * ## Installation
7
+ *
8
+ * ```bash
9
+ * npm install @convex-dev/feedback
10
+ * ```
11
+ *
12
+ * ## Setup
13
+ *
14
+ * 1. Add the component to your `convex/convex.config.ts`:
15
+ *
16
+ * ```typescript
17
+ * import { defineApp } from "convex/server";
18
+ * import feedback from "@convex-dev/feedback/convex.config";
19
+ *
20
+ * const app = defineApp();
21
+ * app.use(feedback);
22
+ * export default app;
23
+ * ```
24
+ *
25
+ * 2. Set required environment variables in your Convex dashboard:
26
+ * - `OPENROUTER_API_KEY` - For AI analysis (optional)
27
+ * - `RESEND_API_KEY` - For email notifications (optional)
28
+ * - `RESEND_FROM_EMAIL` - From address for emails (optional)
29
+ *
30
+ * ## Usage
31
+ *
32
+ * ### Convex Functions
33
+ *
34
+ * The component exposes these functions through `api.feedback`:
35
+ *
36
+ * - `api.feedback.bugReports.create` - Create a bug report
37
+ * - `api.feedback.bugReports.list` - List bug reports
38
+ * - `api.feedback.bugReports.get` - Get a bug report by ID
39
+ * - `api.feedback.bugReports.updateStatus` - Update bug report status
40
+ * - `api.feedback.bugReports.archive` - Archive a bug report
41
+ * - `api.feedback.bugReports.unarchive` - Unarchive a bug report
42
+ *
43
+ * - `api.feedback.feedback.create` - Create feedback
44
+ * - `api.feedback.feedback.list` - List feedback
45
+ * - `api.feedback.feedback.get` - Get feedback by ID
46
+ * - `api.feedback.feedback.updateStatus` - Update feedback status
47
+ *
48
+ * - `api.feedback.supportTeams.list` - List support teams
49
+ * - `api.feedback.supportTeams.create` - Create a support team
50
+ * - `api.feedback.supportTeams.update` - Update a support team
51
+ *
52
+ * ### React Components
53
+ *
54
+ * Import from `@convex-dev/feedback/react`:
55
+ *
56
+ * ```tsx
57
+ * import { BugReportProvider, BugReportButton } from '@convex-dev/feedback/react';
58
+ * ```
59
+ *
60
+ * @module
61
+ */
62
+ export {};
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG"}
@@ -0,0 +1,70 @@
1
+ import type { FunctionReference } from 'convex/server';
2
+ /**
3
+ * Props for the BugReportButton component
4
+ */
5
+ export interface BugReportButtonProps {
6
+ /** Reporter type: 'staff' for internal users, 'customer' for external users */
7
+ reporterType: 'staff' | 'customer';
8
+ /** Unique identifier for the reporter */
9
+ reporterId: string;
10
+ /** Reporter's email address */
11
+ reporterEmail: string;
12
+ /** Reporter's display name */
13
+ reporterName: string;
14
+ /** Convex API reference for bug reports */
15
+ bugReportApi: {
16
+ create: FunctionReference<'mutation'>;
17
+ generateUploadUrl: FunctionReference<'mutation'>;
18
+ };
19
+ /** Convex API reference for feedback */
20
+ feedbackApi: {
21
+ create: FunctionReference<'mutation'>;
22
+ generateUploadUrl: FunctionReference<'mutation'>;
23
+ };
24
+ /** Position of the floating button */
25
+ position?: {
26
+ bottom?: number;
27
+ right?: number;
28
+ top?: number;
29
+ left?: number;
30
+ };
31
+ /** Button color (default: red) */
32
+ buttonColor?: string;
33
+ /** Show feedback tab in addition to bug reports */
34
+ showFeedback?: boolean;
35
+ /** Callback when submission succeeds */
36
+ onSuccess?: (type: 'bug' | 'feedback') => void;
37
+ /** Callback when submission fails */
38
+ onError?: (error: Error, type: 'bug' | 'feedback') => void;
39
+ }
40
+ /**
41
+ * Floating action button for submitting bug reports and feedback.
42
+ * Captures browser diagnostics, console errors, and optional screenshots.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * import { BugReportButton } from '@convex-dev/feedback/react';
47
+ * import { api } from './convex/_generated/api';
48
+ *
49
+ * function App() {
50
+ * return (
51
+ * <BugReportButton
52
+ * reporterType="staff"
53
+ * reporterId={user.id}
54
+ * reporterEmail={user.email}
55
+ * reporterName={user.name}
56
+ * bugReportApi={{
57
+ * create: api.feedback.bugReports.create,
58
+ * generateUploadUrl: api.feedback.bugReports.generateUploadUrl,
59
+ * }}
60
+ * feedbackApi={{
61
+ * create: api.feedback.feedback.create,
62
+ * generateUploadUrl: api.feedback.feedback.generateUploadUrl,
63
+ * }}
64
+ * />
65
+ * );
66
+ * }
67
+ * ```
68
+ */
69
+ export declare function BugReportButton({ reporterType, reporterId, reporterEmail, reporterName, bugReportApi, feedbackApi, position, buttonColor, showFeedback, onSuccess, onError, }: BugReportButtonProps): import("react/jsx-runtime").JSX.Element;
70
+ //# sourceMappingURL=BugReportButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BugReportButton.d.ts","sourceRoot":"","sources":["../../src/react/BugReportButton.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,YAAY,EAAE,OAAO,GAAG,UAAU,CAAC;IACnC,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,YAAY,EAAE;QACZ,MAAM,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACtC,iBAAiB,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC;IACF,wCAAwC;IACxC,WAAW,EAAE;QACX,MAAM,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACtC,iBAAiB,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;KAClD,CAAC;IACF,sCAAsC;IACtC,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,KAAK,IAAI,CAAC;IAC/C,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,UAAU,KAAK,IAAI,CAAC;CAC5D;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,eAAe,CAAC,EAC9B,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,QAAoC,EACpC,WAAmB,EACnB,YAAmB,EACnB,SAAS,EACT,OAAO,GACR,EAAE,oBAAoB,2CAonBtB"}