@geenius/feedback 0.1.0 → 0.3.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 (104) hide show
  1. package/package.json +16 -3
  2. package/packages/convex/dist/index.d.ts +192 -0
  3. package/packages/convex/dist/index.js +239 -0
  4. package/packages/convex/dist/index.js.map +1 -0
  5. package/packages/react/README.md +1 -1
  6. package/packages/react/dist/index.d.ts +146 -0
  7. package/packages/react/dist/index.js +545 -0
  8. package/packages/react/dist/index.js.map +1 -0
  9. package/packages/react-css/README.md +1 -1
  10. package/packages/react-css/dist/index.css +965 -0
  11. package/packages/react-css/dist/index.css.map +1 -0
  12. package/packages/react-css/dist/index.d.ts +49 -0
  13. package/packages/react-css/dist/index.js +228 -0
  14. package/packages/react-css/dist/index.js.map +1 -0
  15. package/packages/shared/README.md +1 -1
  16. package/packages/shared/dist/index.d.ts +115 -0
  17. package/packages/shared/dist/index.js +112 -0
  18. package/packages/shared/dist/index.js.map +1 -0
  19. package/packages/solidjs/README.md +1 -1
  20. package/packages/solidjs/dist/index.d.ts +128 -0
  21. package/packages/solidjs/dist/index.js +289 -0
  22. package/packages/solidjs/dist/index.js.map +1 -0
  23. package/packages/solidjs-css/README.md +1 -1
  24. package/packages/solidjs-css/dist/index.css +965 -0
  25. package/packages/solidjs-css/dist/index.css.map +1 -0
  26. package/packages/solidjs-css/dist/index.d.ts +2 -0
  27. package/packages/solidjs-css/dist/index.js +29 -0
  28. package/packages/solidjs-css/dist/index.js.map +1 -0
  29. package/.changeset/config.json +0 -11
  30. package/.github/CODEOWNERS +0 -1
  31. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  32. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  33. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  34. package/.github/dependabot.yml +0 -11
  35. package/.github/workflows/ci.yml +0 -23
  36. package/.github/workflows/release.yml +0 -29
  37. package/.nvmrc +0 -1
  38. package/.project/ACCOUNT.yaml +0 -4
  39. package/.project/IDEAS.yaml +0 -7
  40. package/.project/PROJECT.yaml +0 -11
  41. package/.project/ROADMAP.yaml +0 -15
  42. package/CODE_OF_CONDUCT.md +0 -16
  43. package/CONTRIBUTING.md +0 -26
  44. package/SECURITY.md +0 -15
  45. package/SUPPORT.md +0 -8
  46. package/packages/convex/package.json +0 -42
  47. package/packages/convex/src/index.ts +0 -3
  48. package/packages/convex/src/mutations.ts +0 -88
  49. package/packages/convex/src/queries.ts +0 -78
  50. package/packages/convex/src/schema.ts +0 -47
  51. package/packages/convex/tsconfig.json +0 -18
  52. package/packages/convex/tsup.config.ts +0 -17
  53. package/packages/react/package.json +0 -49
  54. package/packages/react/src/components/FeedbackCard.tsx +0 -51
  55. package/packages/react/src/components/FeedbackForm.tsx +0 -43
  56. package/packages/react/src/components/FeedbackWidget.tsx +0 -32
  57. package/packages/react/src/components/NPSSurvey.tsx +0 -62
  58. package/packages/react/src/components/index.ts +0 -4
  59. package/packages/react/src/hooks/index.ts +0 -5
  60. package/packages/react/src/hooks/useFeedback.ts +0 -23
  61. package/packages/react/src/hooks/useFeedbackAdmin.ts +0 -24
  62. package/packages/react/src/hooks/useFeedbackForm.ts +0 -35
  63. package/packages/react/src/hooks/useNPS.ts +0 -26
  64. package/packages/react/src/index.tsx +0 -13
  65. package/packages/react/src/pages/FeedbackAdminPage.tsx +0 -71
  66. package/packages/react/src/pages/FeedbackPublicPage.tsx +0 -42
  67. package/packages/react/src/pages/FeedbackWidgetPage.tsx +0 -25
  68. package/packages/react/src/pages/index.ts +0 -3
  69. package/packages/react/tsconfig.json +0 -19
  70. package/packages/react/tsup.config.ts +0 -12
  71. package/packages/react-css/package.json +0 -36
  72. package/packages/react-css/src/components/index.ts +0 -5
  73. package/packages/react-css/src/components/index.tsx +0 -107
  74. package/packages/react-css/src/hooks/index.ts +0 -2
  75. package/packages/react-css/src/index.tsx +0 -5
  76. package/packages/react-css/src/pages/FeedbackAdminPage.tsx +0 -112
  77. package/packages/react-css/src/pages/FeedbackPage.tsx +0 -76
  78. package/packages/react-css/src/styles.css +0 -281
  79. package/packages/react-css/tsconfig.json +0 -19
  80. package/packages/react-css/tsup.config.ts +0 -10
  81. package/packages/shared/package.json +0 -44
  82. package/packages/shared/src/__tests__/feedback.test.ts +0 -72
  83. package/packages/shared/src/config.ts +0 -49
  84. package/packages/shared/src/index.ts +0 -111
  85. package/packages/shared/src/types.ts +0 -59
  86. package/packages/shared/tsconfig.json +0 -18
  87. package/packages/shared/tsup.config.ts +0 -11
  88. package/packages/shared/vitest.config.ts +0 -4
  89. package/packages/solidjs/package.json +0 -45
  90. package/packages/solidjs/src/components.tsx +0 -72
  91. package/packages/solidjs/src/index.tsx +0 -3
  92. package/packages/solidjs/src/primitives.ts +0 -49
  93. package/packages/solidjs/tsconfig.json +0 -20
  94. package/packages/solidjs/tsup.config.ts +0 -12
  95. package/packages/solidjs-css/package.json +0 -32
  96. package/packages/solidjs-css/src/index.tsx +0 -4
  97. package/packages/solidjs-css/src/pages/FeedbackAdminPage.tsx +0 -78
  98. package/packages/solidjs-css/src/pages/FeedbackPage.tsx +0 -65
  99. package/packages/solidjs-css/src/primitives/index.ts +0 -1
  100. package/packages/solidjs-css/src/styles.css +0 -281
  101. package/packages/solidjs-css/tsconfig.json +0 -20
  102. package/packages/solidjs-css/tsup.config.ts +0 -10
  103. package/pnpm-workspace.yaml +0 -2
  104. package/tsconfig.json +0 -23
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@geenius/feedback",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.3.0",
5
5
  "description": "Geenius Feedback — User feedback collection for Convex apps (React + SolidJS)",
6
6
  "author": "Antigravity HQ",
7
7
  "license": "MIT",
@@ -19,19 +19,32 @@
19
19
  "solidjs",
20
20
  "geenius"
21
21
  ],
22
+ "files": [
23
+ "packages/shared/dist",
24
+ "packages/react/dist",
25
+ "packages/solidjs/dist",
26
+ "packages/convex/dist",
27
+ "packages/react-css/dist",
28
+ "packages/solidjs-css/dist",
29
+ "README.md",
30
+ "LICENSE",
31
+ "CHANGELOG.md"
32
+ ],
22
33
  "scripts": {
23
34
  "dev": "pnpm -r --parallel type-check",
24
35
  "build": "pnpm -r build",
25
36
  "clean": "pnpm -r clean",
26
37
  "lint": "pnpm -r --parallel type-check",
27
- "test": "echo \"No tests configured yet\" && exit 0",
38
+ "test": "pnpm -r test",
28
39
  "type-check": "pnpm -r type-check",
29
40
  "format": "prettier --write \"packages/*/src/**/*.{ts,tsx}\"",
30
41
  "version:patch": "pnpm -r exec -- npm version patch --no-git-tag-version && npm version patch -m 'v%s'",
31
42
  "version:minor": "pnpm -r exec -- npm version minor --no-git-tag-version && npm version minor -m 'v%s'",
32
43
  "version:major": "pnpm -r exec -- npm version major --no-git-tag-version && npm version major -m 'v%s'",
33
44
  "release": "git push && git push --tags",
34
- "publish:all": "pnpm -r publish --access public"
45
+ "publish:all": "pnpm -r publish --access public",
46
+ "publish:root": "npm publish --access public",
47
+ "prepublishOnly": "pnpm build"
35
48
  },
36
49
  "devDependencies": {
37
50
  "prettier": "^3.8.1",
@@ -0,0 +1,192 @@
1
+ import * as convex_server from 'convex/server';
2
+ import * as convex_values from 'convex/values';
3
+
4
+ declare const _default: convex_server.SchemaDefinition<{
5
+ feedback_items: convex_server.TableDefinition<convex_values.VObject<{
6
+ userId?: string | undefined;
7
+ userEmail?: string | undefined;
8
+ userName?: string | undefined;
9
+ url?: string | undefined;
10
+ browser?: string | undefined;
11
+ os?: string | undefined;
12
+ attachments?: {
13
+ url: string;
14
+ name: string;
15
+ size: number;
16
+ }[] | undefined;
17
+ adminNote?: string | undefined;
18
+ type: "bug" | "feature" | "general" | "suggestion";
19
+ title: string;
20
+ description: string;
21
+ status: "open" | "under-review" | "planned" | "in-progress" | "done" | "declined";
22
+ priority: "low" | "medium" | "high" | "critical";
23
+ tags: string[];
24
+ votes: number;
25
+ createdAt: string;
26
+ updatedAt: string;
27
+ }, {
28
+ type: convex_values.VUnion<"bug" | "feature" | "general" | "suggestion", [convex_values.VLiteral<"bug", "required">, convex_values.VLiteral<"feature", "required">, convex_values.VLiteral<"general", "required">, convex_values.VLiteral<"suggestion", "required">], "required", never>;
29
+ title: convex_values.VString<string, "required">;
30
+ description: convex_values.VString<string, "required">;
31
+ status: convex_values.VUnion<"open" | "under-review" | "planned" | "in-progress" | "done" | "declined", [convex_values.VLiteral<"open", "required">, convex_values.VLiteral<"under-review", "required">, convex_values.VLiteral<"planned", "required">, convex_values.VLiteral<"in-progress", "required">, convex_values.VLiteral<"done", "required">, convex_values.VLiteral<"declined", "required">], "required", never>;
32
+ priority: convex_values.VUnion<"low" | "medium" | "high" | "critical", [convex_values.VLiteral<"low", "required">, convex_values.VLiteral<"medium", "required">, convex_values.VLiteral<"high", "required">, convex_values.VLiteral<"critical", "required">], "required", never>;
33
+ userId: convex_values.VString<string | undefined, "optional">;
34
+ userEmail: convex_values.VString<string | undefined, "optional">;
35
+ userName: convex_values.VString<string | undefined, "optional">;
36
+ url: convex_values.VString<string | undefined, "optional">;
37
+ browser: convex_values.VString<string | undefined, "optional">;
38
+ os: convex_values.VString<string | undefined, "optional">;
39
+ tags: convex_values.VArray<string[], convex_values.VString<string, "required">, "required">;
40
+ votes: convex_values.VFloat64<number, "required">;
41
+ createdAt: convex_values.VString<string, "required">;
42
+ updatedAt: convex_values.VString<string, "required">;
43
+ attachments: convex_values.VArray<{
44
+ url: string;
45
+ name: string;
46
+ size: number;
47
+ }[] | undefined, convex_values.VObject<{
48
+ url: string;
49
+ name: string;
50
+ size: number;
51
+ }, {
52
+ url: convex_values.VString<string, "required">;
53
+ name: convex_values.VString<string, "required">;
54
+ size: convex_values.VFloat64<number, "required">;
55
+ }, "required", "url" | "name" | "size">, "optional">;
56
+ adminNote: convex_values.VString<string | undefined, "optional">;
57
+ }, "required", "type" | "title" | "description" | "status" | "priority" | "userId" | "userEmail" | "userName" | "url" | "browser" | "os" | "tags" | "votes" | "createdAt" | "updatedAt" | "attachments" | "adminNote">, {
58
+ by_type: ["type", "_creationTime"];
59
+ by_status: ["status", "_creationTime"];
60
+ by_priority: ["priority", "_creationTime"];
61
+ by_userId: ["userId", "_creationTime"];
62
+ by_createdAt: ["createdAt", "_creationTime"];
63
+ }, {}, {}>;
64
+ nps_responses: convex_server.TableDefinition<convex_values.VObject<{
65
+ userId?: string | undefined;
66
+ comment?: string | undefined;
67
+ score: number;
68
+ submittedAt: string;
69
+ }, {
70
+ score: convex_values.VFloat64<number, "required">;
71
+ comment: convex_values.VString<string | undefined, "optional">;
72
+ userId: convex_values.VString<string | undefined, "optional">;
73
+ submittedAt: convex_values.VString<string, "required">;
74
+ }, "required", "userId" | "score" | "comment" | "submittedAt">, {
75
+ by_userId: ["userId", "_creationTime"];
76
+ by_score: ["score", "_creationTime"];
77
+ by_submittedAt: ["submittedAt", "_creationTime"];
78
+ }, {}, {}>;
79
+ feedback_votes: convex_server.TableDefinition<convex_values.VObject<{
80
+ userId: string;
81
+ createdAt: string;
82
+ feedbackId: convex_values.GenericId<"feedback_items">;
83
+ }, {
84
+ feedbackId: convex_values.VId<convex_values.GenericId<"feedback_items">, "required">;
85
+ userId: convex_values.VString<string, "required">;
86
+ createdAt: convex_values.VString<string, "required">;
87
+ }, "required", "userId" | "createdAt" | "feedbackId">, {
88
+ by_feedbackId: ["feedbackId", "_creationTime"];
89
+ by_userId_feedbackId: ["userId", "feedbackId", "_creationTime"];
90
+ }, {}, {}>;
91
+ }, true>;
92
+
93
+ declare const listFeedback: convex_server.RegisteredQuery<"public", {
94
+ type?: "bug" | "feature" | "general" | "suggestion" | undefined;
95
+ status?: "open" | "under-review" | "planned" | "in-progress" | "done" | "declined" | undefined;
96
+ priority?: "low" | "medium" | "high" | "critical" | undefined;
97
+ limit?: number | undefined;
98
+ }, Promise<any[]>>;
99
+ declare const getFeedback: convex_server.RegisteredQuery<"public", {
100
+ id: convex_values.GenericId<"feedback_items">;
101
+ }, Promise<any>>;
102
+ declare const getFeedbackStats: convex_server.RegisteredQuery<"public", {}, Promise<{
103
+ total: number;
104
+ byType: Record<string, number>;
105
+ byStatus: Record<string, number>;
106
+ }>>;
107
+ declare const listNPS: convex_server.RegisteredQuery<"public", {
108
+ limit?: number | undefined;
109
+ }, Promise<any[]>>;
110
+ declare const getNPSStats: convex_server.RegisteredQuery<"public", {}, Promise<{
111
+ averageScore: number;
112
+ totalResponses: number;
113
+ promoters: number;
114
+ passives: number;
115
+ detractors: number;
116
+ npsScore: number;
117
+ }>>;
118
+ declare const getUserVotes: convex_server.RegisteredQuery<"public", {
119
+ userId: string;
120
+ }, Promise<any[]>>;
121
+ declare const searchFeedback: convex_server.RegisteredQuery<"public", {
122
+ query: string;
123
+ }, Promise<any[]>>;
124
+
125
+ declare const queries_getFeedback: typeof getFeedback;
126
+ declare const queries_getFeedbackStats: typeof getFeedbackStats;
127
+ declare const queries_getNPSStats: typeof getNPSStats;
128
+ declare const queries_getUserVotes: typeof getUserVotes;
129
+ declare const queries_listFeedback: typeof listFeedback;
130
+ declare const queries_listNPS: typeof listNPS;
131
+ declare const queries_searchFeedback: typeof searchFeedback;
132
+ declare namespace queries {
133
+ export { queries_getFeedback as getFeedback, queries_getFeedbackStats as getFeedbackStats, queries_getNPSStats as getNPSStats, queries_getUserVotes as getUserVotes, queries_listFeedback as listFeedback, queries_listNPS as listNPS, queries_searchFeedback as searchFeedback };
134
+ }
135
+
136
+ declare const submitFeedback: convex_server.RegisteredMutation<"public", {
137
+ userId?: string | undefined;
138
+ userEmail?: string | undefined;
139
+ userName?: string | undefined;
140
+ url?: string | undefined;
141
+ browser?: string | undefined;
142
+ os?: string | undefined;
143
+ tags?: string[] | undefined;
144
+ type: "bug" | "feature" | "general" | "suggestion";
145
+ title: string;
146
+ description: string;
147
+ }, Promise<convex_values.GenericId<"feedback_items">>>;
148
+ declare const updateFeedbackStatus: convex_server.RegisteredMutation<"public", {
149
+ adminNote?: string | undefined;
150
+ status: "open" | "under-review" | "planned" | "in-progress" | "done" | "declined";
151
+ feedbackId: convex_values.GenericId<"feedback_items">;
152
+ }, Promise<void>>;
153
+ declare const updateFeedbackPriority: convex_server.RegisteredMutation<"public", {
154
+ priority: "low" | "medium" | "high" | "critical";
155
+ feedbackId: convex_values.GenericId<"feedback_items">;
156
+ }, Promise<void>>;
157
+ declare const deleteFeedback: convex_server.RegisteredMutation<"public", {
158
+ feedbackId: convex_values.GenericId<"feedback_items">;
159
+ }, Promise<void>>;
160
+ declare const voteFeedback: convex_server.RegisteredMutation<"public", {
161
+ userId: string;
162
+ feedbackId: convex_values.GenericId<"feedback_items">;
163
+ }, Promise<void>>;
164
+ declare const unvoteFeedback: convex_server.RegisteredMutation<"public", {
165
+ userId: string;
166
+ feedbackId: convex_values.GenericId<"feedback_items">;
167
+ }, Promise<void>>;
168
+ declare const submitNPS: convex_server.RegisteredMutation<"public", {
169
+ userId?: string | undefined;
170
+ comment?: string | undefined;
171
+ score: number;
172
+ }, Promise<convex_values.GenericId<"nps_responses">>>;
173
+ declare const addAttachment: convex_server.RegisteredMutation<"public", {
174
+ url: string;
175
+ name: string;
176
+ size: number;
177
+ feedbackId: convex_values.GenericId<"feedback_items">;
178
+ }, Promise<void>>;
179
+
180
+ declare const mutations_addAttachment: typeof addAttachment;
181
+ declare const mutations_deleteFeedback: typeof deleteFeedback;
182
+ declare const mutations_submitFeedback: typeof submitFeedback;
183
+ declare const mutations_submitNPS: typeof submitNPS;
184
+ declare const mutations_unvoteFeedback: typeof unvoteFeedback;
185
+ declare const mutations_updateFeedbackPriority: typeof updateFeedbackPriority;
186
+ declare const mutations_updateFeedbackStatus: typeof updateFeedbackStatus;
187
+ declare const mutations_voteFeedback: typeof voteFeedback;
188
+ declare namespace mutations {
189
+ export { mutations_addAttachment as addAttachment, mutations_deleteFeedback as deleteFeedback, mutations_submitFeedback as submitFeedback, mutations_submitNPS as submitNPS, mutations_unvoteFeedback as unvoteFeedback, mutations_updateFeedbackPriority as updateFeedbackPriority, mutations_updateFeedbackStatus as updateFeedbackStatus, mutations_voteFeedback as voteFeedback };
190
+ }
191
+
192
+ export { mutations, queries, _default as schema };
@@ -0,0 +1,239 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/schema.ts
8
+ import { defineSchema, defineTable } from "convex/server";
9
+ import { v } from "convex/values";
10
+ var schema_default = defineSchema({
11
+ feedback_items: defineTable({
12
+ type: v.union(v.literal("bug"), v.literal("feature"), v.literal("general"), v.literal("suggestion")),
13
+ title: v.string(),
14
+ description: v.string(),
15
+ status: v.union(v.literal("open"), v.literal("under-review"), v.literal("planned"), v.literal("in-progress"), v.literal("done"), v.literal("declined")),
16
+ priority: v.union(v.literal("low"), v.literal("medium"), v.literal("high"), v.literal("critical")),
17
+ userId: v.optional(v.string()),
18
+ userEmail: v.optional(v.string()),
19
+ userName: v.optional(v.string()),
20
+ url: v.optional(v.string()),
21
+ browser: v.optional(v.string()),
22
+ os: v.optional(v.string()),
23
+ tags: v.array(v.string()),
24
+ votes: v.number(),
25
+ createdAt: v.string(),
26
+ updatedAt: v.string(),
27
+ attachments: v.optional(v.array(v.object({ url: v.string(), name: v.string(), size: v.number() }))),
28
+ adminNote: v.optional(v.string())
29
+ }).index("by_type", ["type"]).index("by_status", ["status"]).index("by_priority", ["priority"]).index("by_userId", ["userId"]).index("by_createdAt", ["createdAt"]),
30
+ nps_responses: defineTable({
31
+ score: v.number(),
32
+ comment: v.optional(v.string()),
33
+ userId: v.optional(v.string()),
34
+ submittedAt: v.string()
35
+ }).index("by_userId", ["userId"]).index("by_score", ["score"]).index("by_submittedAt", ["submittedAt"]),
36
+ feedback_votes: defineTable({
37
+ feedbackId: v.id("feedback_items"),
38
+ userId: v.string(),
39
+ createdAt: v.string()
40
+ }).index("by_feedbackId", ["feedbackId"]).index("by_userId_feedbackId", ["userId", "feedbackId"])
41
+ });
42
+
43
+ // src/queries.ts
44
+ var queries_exports = {};
45
+ __export(queries_exports, {
46
+ getFeedback: () => getFeedback,
47
+ getFeedbackStats: () => getFeedbackStats,
48
+ getNPSStats: () => getNPSStats,
49
+ getUserVotes: () => getUserVotes,
50
+ listFeedback: () => listFeedback,
51
+ listNPS: () => listNPS,
52
+ searchFeedback: () => searchFeedback
53
+ });
54
+ import { queryGeneric as query } from "convex/server";
55
+ import { v as v2 } from "convex/values";
56
+ var listFeedback = query({
57
+ args: {
58
+ type: v2.optional(v2.union(v2.literal("bug"), v2.literal("feature"), v2.literal("general"), v2.literal("suggestion"))),
59
+ status: v2.optional(v2.union(v2.literal("open"), v2.literal("under-review"), v2.literal("planned"), v2.literal("in-progress"), v2.literal("done"), v2.literal("declined"))),
60
+ priority: v2.optional(v2.union(v2.literal("low"), v2.literal("medium"), v2.literal("high"), v2.literal("critical"))),
61
+ limit: v2.optional(v2.number())
62
+ },
63
+ handler: async (ctx, args) => {
64
+ const limit = args.limit ?? 100;
65
+ let items;
66
+ if (args.type) items = await ctx.db.query("feedback_items").withIndex("by_type", (q) => q.eq("type", args.type)).order("desc").take(limit);
67
+ else if (args.status) items = await ctx.db.query("feedback_items").withIndex("by_status", (q) => q.eq("status", args.status)).order("desc").take(limit);
68
+ else if (args.priority) items = await ctx.db.query("feedback_items").withIndex("by_priority", (q) => q.eq("priority", args.priority)).order("desc").take(limit);
69
+ else items = await ctx.db.query("feedback_items").order("desc").take(limit);
70
+ return items;
71
+ }
72
+ });
73
+ var getFeedback = query({
74
+ args: { id: v2.id("feedback_items") },
75
+ handler: async (ctx, args) => ctx.db.get(args.id)
76
+ });
77
+ var getFeedbackStats = query({
78
+ args: {},
79
+ handler: async (ctx) => {
80
+ const items = await ctx.db.query("feedback_items").collect();
81
+ const byType = { bug: 0, feature: 0, suggestion: 0, general: 0 };
82
+ const byStatus = { open: 0, "under-review": 0, planned: 0, "in-progress": 0, done: 0, declined: 0 };
83
+ for (const item of items) {
84
+ byType[item.type]++;
85
+ byStatus[item.status]++;
86
+ }
87
+ return { total: items.length, byType, byStatus };
88
+ }
89
+ });
90
+ var listNPS = query({
91
+ args: { limit: v2.optional(v2.number()) },
92
+ handler: async (ctx, args) => ctx.db.query("nps_responses").order("desc").take(args.limit ?? 100)
93
+ });
94
+ var getNPSStats = query({
95
+ args: {},
96
+ handler: async (ctx) => {
97
+ const responses = await ctx.db.query("nps_responses").collect();
98
+ let promoters = 0, passives = 0, detractors = 0, totalScore = 0;
99
+ for (const r of responses) {
100
+ totalScore += r.score;
101
+ if (r.score >= 9) promoters++;
102
+ else if (r.score >= 7) passives++;
103
+ else detractors++;
104
+ }
105
+ const total = responses.length;
106
+ return {
107
+ averageScore: total > 0 ? Math.round(totalScore / total * 10) / 10 : 0,
108
+ totalResponses: total,
109
+ promoters,
110
+ passives,
111
+ detractors,
112
+ npsScore: total > 0 ? Math.round((promoters - detractors) / total * 100) : 0
113
+ };
114
+ }
115
+ });
116
+ var getUserVotes = query({
117
+ args: { userId: v2.string() },
118
+ handler: async (ctx, args) => {
119
+ const votes = await ctx.db.query("feedback_votes").withIndex("by_userId_feedbackId", (q) => q.eq("userId", args.userId)).collect();
120
+ return votes.map((v4) => v4.feedbackId);
121
+ }
122
+ });
123
+ var searchFeedback = query({
124
+ args: { query: v2.string() },
125
+ handler: async (ctx, args) => {
126
+ const items = await ctx.db.query("feedback_items").order("desc").collect();
127
+ const q = args.query.toLowerCase();
128
+ return items.filter((i) => i.title.toLowerCase().includes(q) || i.description.toLowerCase().includes(q));
129
+ }
130
+ });
131
+
132
+ // src/mutations.ts
133
+ var mutations_exports = {};
134
+ __export(mutations_exports, {
135
+ addAttachment: () => addAttachment,
136
+ deleteFeedback: () => deleteFeedback,
137
+ submitFeedback: () => submitFeedback,
138
+ submitNPS: () => submitNPS,
139
+ unvoteFeedback: () => unvoteFeedback,
140
+ updateFeedbackPriority: () => updateFeedbackPriority,
141
+ updateFeedbackStatus: () => updateFeedbackStatus,
142
+ voteFeedback: () => voteFeedback
143
+ });
144
+ import { mutationGeneric as mutation } from "convex/server";
145
+ import { v as v3 } from "convex/values";
146
+ var submitFeedback = mutation({
147
+ args: {
148
+ type: v3.union(v3.literal("bug"), v3.literal("feature"), v3.literal("general"), v3.literal("suggestion")),
149
+ title: v3.string(),
150
+ description: v3.string(),
151
+ url: v3.optional(v3.string()),
152
+ userId: v3.optional(v3.string()),
153
+ userEmail: v3.optional(v3.string()),
154
+ userName: v3.optional(v3.string()),
155
+ browser: v3.optional(v3.string()),
156
+ os: v3.optional(v3.string()),
157
+ tags: v3.optional(v3.array(v3.string()))
158
+ },
159
+ handler: async (ctx, args) => {
160
+ const now = (/* @__PURE__ */ new Date()).toISOString();
161
+ return ctx.db.insert("feedback_items", {
162
+ ...args,
163
+ tags: args.tags ?? [],
164
+ status: "open",
165
+ priority: "medium",
166
+ votes: 0,
167
+ createdAt: now,
168
+ updatedAt: now
169
+ });
170
+ }
171
+ });
172
+ var updateFeedbackStatus = mutation({
173
+ args: {
174
+ feedbackId: v3.id("feedback_items"),
175
+ status: v3.union(v3.literal("open"), v3.literal("under-review"), v3.literal("planned"), v3.literal("in-progress"), v3.literal("done"), v3.literal("declined")),
176
+ adminNote: v3.optional(v3.string())
177
+ },
178
+ handler: async (ctx, args) => {
179
+ const updates = { status: args.status, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
180
+ if (args.adminNote !== void 0) updates.adminNote = args.adminNote;
181
+ await ctx.db.patch(args.feedbackId, updates);
182
+ }
183
+ });
184
+ var updateFeedbackPriority = mutation({
185
+ args: {
186
+ feedbackId: v3.id("feedback_items"),
187
+ priority: v3.union(v3.literal("low"), v3.literal("medium"), v3.literal("high"), v3.literal("critical"))
188
+ },
189
+ handler: async (ctx, args) => {
190
+ await ctx.db.patch(args.feedbackId, { priority: args.priority, updatedAt: (/* @__PURE__ */ new Date()).toISOString() });
191
+ }
192
+ });
193
+ var deleteFeedback = mutation({
194
+ args: { feedbackId: v3.id("feedback_items") },
195
+ handler: async (ctx, args) => {
196
+ const votes = await ctx.db.query("feedback_votes").withIndex("by_feedbackId", (q) => q.eq("feedbackId", args.feedbackId)).collect();
197
+ for (const v4 of votes) await ctx.db.delete(v4._id);
198
+ await ctx.db.delete(args.feedbackId);
199
+ }
200
+ });
201
+ var voteFeedback = mutation({
202
+ args: { feedbackId: v3.id("feedback_items"), userId: v3.string() },
203
+ handler: async (ctx, args) => {
204
+ const existing = await ctx.db.query("feedback_votes").withIndex("by_userId_feedbackId", (q) => q.eq("userId", args.userId).eq("feedbackId", args.feedbackId)).first();
205
+ if (existing) return;
206
+ await ctx.db.insert("feedback_votes", { ...args, createdAt: (/* @__PURE__ */ new Date()).toISOString() });
207
+ const item = await ctx.db.get(args.feedbackId);
208
+ if (item) await ctx.db.patch(args.feedbackId, { votes: item.votes + 1 });
209
+ }
210
+ });
211
+ var unvoteFeedback = mutation({
212
+ args: { feedbackId: v3.id("feedback_items"), userId: v3.string() },
213
+ handler: async (ctx, args) => {
214
+ const existing = await ctx.db.query("feedback_votes").withIndex("by_userId_feedbackId", (q) => q.eq("userId", args.userId).eq("feedbackId", args.feedbackId)).first();
215
+ if (!existing) return;
216
+ await ctx.db.delete(existing._id);
217
+ const item = await ctx.db.get(args.feedbackId);
218
+ if (item) await ctx.db.patch(args.feedbackId, { votes: Math.max(0, item.votes - 1) });
219
+ }
220
+ });
221
+ var submitNPS = mutation({
222
+ args: { score: v3.number(), comment: v3.optional(v3.string()), userId: v3.optional(v3.string()) },
223
+ handler: async (ctx, args) => ctx.db.insert("nps_responses", { ...args, submittedAt: (/* @__PURE__ */ new Date()).toISOString() })
224
+ });
225
+ var addAttachment = mutation({
226
+ args: { feedbackId: v3.id("feedback_items"), url: v3.string(), name: v3.string(), size: v3.number() },
227
+ handler: async (ctx, args) => {
228
+ const item = await ctx.db.get(args.feedbackId);
229
+ if (!item) throw new Error("Feedback not found");
230
+ const attachments = [...item.attachments ?? [], { url: args.url, name: args.name, size: args.size }];
231
+ await ctx.db.patch(args.feedbackId, { attachments, updatedAt: (/* @__PURE__ */ new Date()).toISOString() });
232
+ }
233
+ });
234
+ export {
235
+ mutations_exports as mutations,
236
+ queries_exports as queries,
237
+ schema_default as schema
238
+ };
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts","../src/queries.ts","../src/mutations.ts"],"sourcesContent":["import { defineSchema, defineTable } from 'convex/server'\nimport { v } from 'convex/values'\n\nexport default defineSchema({\n feedback_items: defineTable({\n type: v.union(v.literal('bug'), v.literal('feature'), v.literal('general'), v.literal('suggestion')),\n title: v.string(),\n description: v.string(),\n status: v.union(v.literal('open'), v.literal('under-review'), v.literal('planned'), v.literal('in-progress'), v.literal('done'), v.literal('declined')),\n priority: v.union(v.literal('low'), v.literal('medium'), v.literal('high'), v.literal('critical')),\n userId: v.optional(v.string()),\n userEmail: v.optional(v.string()),\n userName: v.optional(v.string()),\n url: v.optional(v.string()),\n browser: v.optional(v.string()),\n os: v.optional(v.string()),\n tags: v.array(v.string()),\n votes: v.number(),\n createdAt: v.string(),\n updatedAt: v.string(),\n attachments: v.optional(v.array(v.object({ url: v.string(), name: v.string(), size: v.number() }))),\n adminNote: v.optional(v.string()),\n })\n .index('by_type', ['type'])\n .index('by_status', ['status'])\n .index('by_priority', ['priority'])\n .index('by_userId', ['userId'])\n .index('by_createdAt', ['createdAt']),\n\n nps_responses: defineTable({\n score: v.number(),\n comment: v.optional(v.string()),\n userId: v.optional(v.string()),\n submittedAt: v.string(),\n })\n .index('by_userId', ['userId'])\n .index('by_score', ['score'])\n .index('by_submittedAt', ['submittedAt']),\n\n feedback_votes: defineTable({\n feedbackId: v.id('feedback_items'),\n userId: v.string(),\n createdAt: v.string(),\n })\n .index('by_feedbackId', ['feedbackId'])\n .index('by_userId_feedbackId', ['userId', 'feedbackId']),\n})\n","import { queryGeneric as query } from 'convex/server'\nimport { v } from 'convex/values'\n\nexport const listFeedback = query({\n args: {\n type: v.optional(v.union(v.literal('bug'), v.literal('feature'), v.literal('general'), v.literal('suggestion'))),\n status: v.optional(v.union(v.literal('open'), v.literal('under-review'), v.literal('planned'), v.literal('in-progress'), v.literal('done'), v.literal('declined'))),\n priority: v.optional(v.union(v.literal('low'), v.literal('medium'), v.literal('high'), v.literal('critical'))),\n limit: v.optional(v.number()),\n },\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100\n let items\n if (args.type) items = await ctx.db.query('feedback_items').withIndex('by_type', q => q.eq('type', args.type!)).order('desc').take(limit)\n else if (args.status) items = await ctx.db.query('feedback_items').withIndex('by_status', q => q.eq('status', args.status!)).order('desc').take(limit)\n else if (args.priority) items = await ctx.db.query('feedback_items').withIndex('by_priority', q => q.eq('priority', args.priority!)).order('desc').take(limit)\n else items = await ctx.db.query('feedback_items').order('desc').take(limit)\n return items\n },\n})\n\nexport const getFeedback = query({\n args: { id: v.id('feedback_items') },\n handler: async (ctx, args) => ctx.db.get(args.id),\n})\n\nexport const getFeedbackStats = query({\n args: {},\n handler: async (ctx) => {\n const items = await ctx.db.query('feedback_items').collect()\n const byType: Record<string, number> = { bug: 0, feature: 0, suggestion: 0, general: 0 }\n const byStatus: Record<string, number> = { open: 0, 'under-review': 0, planned: 0, 'in-progress': 0, done: 0, declined: 0 }\n for (const item of items) { byType[item.type]++; byStatus[item.status]++ }\n return { total: items.length, byType, byStatus }\n },\n})\n\nexport const listNPS = query({\n args: { limit: v.optional(v.number()) },\n handler: async (ctx, args) => ctx.db.query('nps_responses').order('desc').take(args.limit ?? 100),\n})\n\nexport const getNPSStats = query({\n args: {},\n handler: async (ctx) => {\n const responses = await ctx.db.query('nps_responses').collect()\n let promoters = 0, passives = 0, detractors = 0, totalScore = 0\n for (const r of responses) {\n totalScore += r.score\n if (r.score >= 9) promoters++\n else if (r.score >= 7) passives++\n else detractors++\n }\n const total = responses.length\n return {\n averageScore: total > 0 ? Math.round((totalScore / total) * 10) / 10 : 0,\n totalResponses: total, promoters, passives, detractors,\n npsScore: total > 0 ? Math.round(((promoters - detractors) / total) * 100) : 0,\n }\n },\n})\n\nexport const getUserVotes = query({\n args: { userId: v.string() },\n handler: async (ctx, args) => {\n const votes = await ctx.db.query('feedback_votes').withIndex('by_userId_feedbackId', q => q.eq('userId', args.userId)).collect()\n return votes.map(v => v.feedbackId)\n },\n})\n\nexport const searchFeedback = query({\n args: { query: v.string() },\n handler: async (ctx, args) => {\n const items = await ctx.db.query('feedback_items').order('desc').collect()\n const q = args.query.toLowerCase()\n return items.filter(i => i.title.toLowerCase().includes(q) || i.description.toLowerCase().includes(q))\n },\n})\n","import { mutationGeneric as mutation } from 'convex/server'\nimport { v } from 'convex/values'\n\nexport const submitFeedback = mutation({\n args: {\n type: v.union(v.literal('bug'), v.literal('feature'), v.literal('general'), v.literal('suggestion')),\n title: v.string(), description: v.string(),\n url: v.optional(v.string()), userId: v.optional(v.string()), userEmail: v.optional(v.string()),\n userName: v.optional(v.string()), browser: v.optional(v.string()), os: v.optional(v.string()),\n tags: v.optional(v.array(v.string())),\n },\n handler: async (ctx, args) => {\n const now = new Date().toISOString()\n return ctx.db.insert('feedback_items', {\n ...args, tags: args.tags ?? [], status: 'open', priority: 'medium',\n votes: 0, createdAt: now, updatedAt: now,\n })\n },\n})\n\nexport const updateFeedbackStatus = mutation({\n args: {\n feedbackId: v.id('feedback_items'),\n status: v.union(v.literal('open'), v.literal('under-review'), v.literal('planned'), v.literal('in-progress'), v.literal('done'), v.literal('declined')),\n adminNote: v.optional(v.string()),\n },\n handler: async (ctx, args) => {\n const updates: Record<string, unknown> = { status: args.status, updatedAt: new Date().toISOString() }\n if (args.adminNote !== undefined) updates.adminNote = args.adminNote\n await ctx.db.patch(args.feedbackId, updates)\n },\n})\n\nexport const updateFeedbackPriority = mutation({\n args: {\n feedbackId: v.id('feedback_items'),\n priority: v.union(v.literal('low'), v.literal('medium'), v.literal('high'), v.literal('critical')),\n },\n handler: async (ctx, args) => {\n await ctx.db.patch(args.feedbackId, { priority: args.priority, updatedAt: new Date().toISOString() })\n },\n})\n\nexport const deleteFeedback = mutation({\n args: { feedbackId: v.id('feedback_items') },\n handler: async (ctx, args) => {\n const votes = await ctx.db.query('feedback_votes').withIndex('by_feedbackId', q => q.eq('feedbackId', args.feedbackId)).collect()\n for (const v of votes) await ctx.db.delete(v._id)\n await ctx.db.delete(args.feedbackId)\n },\n})\n\nexport const voteFeedback = mutation({\n args: { feedbackId: v.id('feedback_items'), userId: v.string() },\n handler: async (ctx, args) => {\n const existing = await ctx.db.query('feedback_votes').withIndex('by_userId_feedbackId', (q: any) => q.eq('userId', args.userId).eq('feedbackId', args.feedbackId)).first()\n if (existing) return\n await ctx.db.insert('feedback_votes', { ...args, createdAt: new Date().toISOString() })\n const item = await ctx.db.get(args.feedbackId)\n if (item) await ctx.db.patch(args.feedbackId, { votes: item.votes + 1 })\n },\n})\n\nexport const unvoteFeedback = mutation({\n args: { feedbackId: v.id('feedback_items'), userId: v.string() },\n handler: async (ctx, args) => {\n const existing = await ctx.db.query('feedback_votes').withIndex('by_userId_feedbackId', (q: any) => q.eq('userId', args.userId).eq('feedbackId', args.feedbackId)).first()\n if (!existing) return\n await ctx.db.delete(existing._id)\n const item = await ctx.db.get(args.feedbackId)\n if (item) await ctx.db.patch(args.feedbackId, { votes: Math.max(0, item.votes - 1) })\n },\n})\n\nexport const submitNPS = mutation({\n args: { score: v.number(), comment: v.optional(v.string()), userId: v.optional(v.string()) },\n handler: async (ctx, args) => ctx.db.insert('nps_responses', { ...args, submittedAt: new Date().toISOString() }),\n})\n\nexport const addAttachment = mutation({\n args: { feedbackId: v.id('feedback_items'), url: v.string(), name: v.string(), size: v.number() },\n handler: async (ctx, args) => {\n const item = await ctx.db.get(args.feedbackId)\n if (!item) throw new Error('Feedback not found')\n const attachments = [...(item.attachments ?? []), { url: args.url, name: args.name, size: args.size }]\n await ctx.db.patch(args.feedbackId, { attachments, updatedAt: new Date().toISOString() })\n },\n})\n"],"mappings":"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","names":["v","v"]}
@@ -1 +1 @@
1
- # ✦ @geenius-feedback/react\n\n> Geenius Feedback — React components & hooks\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius-feedback/react\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-feedback/react';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
1
+ # ✦ @geenius/feedback-react\n\n> Geenius Feedback — React components & hooks\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/feedback-react\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/feedback-react';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n