react-native-bug-reporter 1.0.4 → 1.1.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/README.md CHANGED
@@ -62,8 +62,8 @@ export default function App() {
62
62
  <BugReporterProvider
63
63
  config={{
64
64
  supabaseUrl: 'https://YOURPROJECT.supabase.co',
65
- supabaseAnonKey: 'eyJ...anon-key', // safe to ship; RLS controls access
66
- notifyEmails: 'admin@yourcompany.com', // who gets the email
65
+ supabaseAnonKey: 'eyJ...anon-key', // safe to ship; RLS controls access
66
+ notifyEmails: 'admin@yourcompany.com', // who gets the email
67
67
  environment: __DEV__ ? 'development' : 'production',
68
68
  getUser: () => ({ id: user.id, name: user.name, email: user.email }),
69
69
  }}
@@ -94,12 +94,12 @@ function HelpScreen() {
94
94
 
95
95
  `useBugReporter()` returns:
96
96
 
97
- | Field | Type | Description |
98
- |-----------------------|-----------------------------------------|-------------|
99
- | `openReporter` | `(screenshot?) => void` | Open the modal (optionally pre-attach an image). |
100
- | `closeReporter` | `() => void` | Close it. |
101
- | `isOpen` | `boolean` | Modal visibility. |
102
- | `isAutoDetectEnabled` | `boolean` | Whether screenshot detection is on. |
97
+ | Field | Type | Description |
98
+ | --------------------- | ----------------------- | ------------------------------------------------ |
99
+ | `openReporter` | `(screenshot?) => void` | Open the modal (optionally pre-attach an image). |
100
+ | `closeReporter` | `() => void` | Close it. |
101
+ | `isOpen` | `boolean` | Modal visibility. |
102
+ | `isAutoDetectEnabled` | `boolean` | Whether screenshot detection is on. |
103
103
 
104
104
  ### Track the current screen
105
105
 
@@ -107,14 +107,17 @@ The SDK is navigation-agnostic. Report the active route so it's attached to bug
107
107
  reports. With **React Navigation**:
108
108
 
109
109
  ```tsx
110
- import { setCurrentScreen, getActiveRouteName } from 'react-native-bug-reporter';
110
+ import {
111
+ setCurrentScreen,
112
+ getActiveRouteName,
113
+ } from 'react-native-bug-reporter';
111
114
 
112
115
  <NavigationContainer
113
- onStateChange={(state) => {
116
+ onStateChange={state => {
114
117
  const route = getActiveRouteName(state);
115
118
  if (route) setCurrentScreen(route);
116
119
  }}
117
- />
120
+ />;
118
121
  ```
119
122
 
120
123
  …then pass `getCurrentScreen` in the config:
@@ -131,12 +134,35 @@ Or just call `setCurrentScreen('Checkout')` from any screen's effect.
131
134
  ```tsx
132
135
  import { BugReportAdminScreen } from 'react-native-bug-reporter';
133
136
 
134
- <BugReportAdminScreen config={{ supabaseUrl, supabaseAnonKey }} />
137
+ <BugReportAdminScreen config={{ supabaseUrl, supabaseAnonKey }} />;
135
138
  ```
136
139
 
137
140
  Live-lists all reports from Supabase (realtime) with screenshot thumbnails and a
138
141
  tap-to-cycle status control. Pass the same `supabaseUrl` + `supabaseAnonKey`.
139
142
 
143
+ ### Multi-app support
144
+
145
+ Give each app its own `appKey` (and `appName`) — every report is tagged with it:
146
+
147
+ ```tsx
148
+ <BugReporterProvider config={{ supabaseUrl, supabaseAnonKey, appKey: 'shop', appName: 'Shop App' }}>
149
+ ```
150
+
151
+ The web admin panel then shows a per-app sidebar with bug counts, and email
152
+ notifications are routed per app.
153
+
154
+ ### Web admin panel + per-app notification emails
155
+
156
+ Open [`supabase/dashboard.html`](../supabase/dashboard.html) in a browser, enter
157
+ your Supabase URL + anon key, and (for Send/Resend) the Edge Function name. It
158
+ gives you:
159
+
160
+ - **Per-app sidebar** with live bug counts, overall stats
161
+ - **Status + severity filters**, search, CSV export, screenshot lightbox
162
+ - **Report details** (full JSON), status change, **resend email**, delete
163
+ - **🔔 Notify Emails** per app — add multiple emails at once; the Edge Function
164
+ emails all of them for that app's new bugs. **Send test email** to verify.
165
+
140
166
  ### Theming
141
167
 
142
168
  ```tsx
@@ -169,22 +195,24 @@ config={{
169
195
 
170
196
  ## Config reference (`BugReporterConfig`)
171
197
 
172
- | Option | Type | Default | Description |
173
- |---------------------|---------------------------------|----------------|-------------|
174
- | `supabaseUrl` | `string` **(required)** | — | Supabase project URL. |
175
- | `supabaseAnonKey` | `string` **(required)** | — | Supabase anon (public) key. |
176
- | `tableName` | `string` | `bug_reports` | Postgres table for reports. |
177
- | `storageBucket` | `string` | `bug-reports` | Storage bucket for screenshots. |
178
- | `notifyEmails` | `string \| string[]` | | Recipient(s) for the email (stored on the row; Edge Function reads it). |
179
- | `getUser` | `() => UserInfo \| Promise<…>` | — | Current signed-in user. |
180
- | `getCurrentScreen` | `() => string \| null` | — | Active route name. |
181
- | `environment` | `string` | — | e.g. `"production"`. |
182
- | `showContextSummary`| `boolean` | `true` | Show the "Automatically attached" block (data is always collected). |
183
- | `disableAutoDetect` | `boolean` | `false` | Manual-only reporting. |
184
- | `theme` | `BugReporterTheme` | light theme | Color overrides. |
185
- | `onSubmitted` | `(report) => void` | | Success callback. |
186
- | `onError` | `(error) => void` | | Failure callback. |
187
- | `debug` | `boolean` | `false` | Verbose logging. |
198
+ | Option | Type | Default | Description |
199
+ | -------------------- | ------------------------------ | ------------- | -------------------------------------------------------------------------------------------------------------- |
200
+ | `supabaseUrl` | `string` **(required)** | — | Supabase project URL. |
201
+ | `supabaseAnonKey` | `string` **(required)** | — | Supabase anon (public) key. |
202
+ | `appKey` | `string` | `default` | Multi-app id tags every report so the admin panel shows per-app sections + counts and routes emails per app. |
203
+ | `appName` | `string` | `appKey` | Human-friendly app name shown in the admin panel. |
204
+ | `tableName` | `string` | `bug_reports` | Postgres table for reports. |
205
+ | `storageBucket` | `string` | `bug-reports` | Storage bucket for screenshots. |
206
+ | `notifyEmails` | `string \| string[]` | — | Extra recipient(s); merged with the app's emails from the admin panel. |
207
+ | `getUser` | `() => UserInfo \| Promise<…>` | — | Current signed-in user. |
208
+ | `getCurrentScreen` | `() => string \| null` | — | Active route name. |
209
+ | `environment` | `string` | | e.g. `"production"`. |
210
+ | `showContextSummary` | `boolean` | `true` | Show the "Automatically attached" block (data is always collected). |
211
+ | `disableAutoDetect` | `boolean` | `false` | Manual-only reporting. |
212
+ | `theme` | `BugReporterTheme` | light theme | Color overrides. |
213
+ | `onSubmitted` | `(report) => void` | | Success callback. |
214
+ | `onError` | `(error) => void` | — | Failure callback. |
215
+ | `debug` | `boolean` | `false` | Verbose logging. |
188
216
 
189
217
  ---
190
218
 
@@ -203,12 +231,13 @@ The JS layer shows the image in the modal and streams it to your backend as
203
231
 
204
232
  ---
205
233
 
234
+ <!--
206
235
  ## Publishing your own copy
207
236
 
208
237
  ```sh
209
238
  npm version patch
210
239
  npm publish # runs `bob build` via the prepare script
211
- ```
240
+ ``` -->
212
241
 
213
242
  The build emits CommonJS, ESM, and TypeScript declarations to `lib/`.
214
243
 
@@ -41,6 +41,7 @@ function getClient(url, anonKey) {
41
41
  function mapRow(row) {
42
42
  return {
43
43
  id: row.id,
44
+ appKey: row.app_key ?? 'default',
44
45
  title: row.title ?? '',
45
46
  description: row.description ?? '',
46
47
  severity: row.severity ?? 'medium',
@@ -97,6 +98,7 @@ async function insertReport(target, report) {
97
98
  data,
98
99
  error
99
100
  } = await supabase.from(target.tableName).insert({
101
+ app_key: target.appKey,
100
102
  title: report.title,
101
103
  description: report.description,
102
104
  severity: report.severity,
@@ -109,9 +111,35 @@ async function insertReport(target, report) {
109
111
  }).select().single();
110
112
  if (error) throw error;
111
113
  _logger.logger.log('report inserted', data.id);
114
+ // Register the app (insert-if-absent) so it shows in the admin panel.
115
+ void ensureAppRegistered(target);
112
116
  return mapRow(data);
113
117
  }
114
118
 
119
+ /**
120
+ * Inserts the app into bug_report_apps if it's not there yet (without clobbering
121
+ * its notify_emails). Fire-and-forget — never blocks submission.
122
+ */
123
+ async function ensureAppRegistered(target) {
124
+ try {
125
+ await fetch(`${target.supabaseUrl.replace(/\/+$/, '')}/rest/v1/bug_report_apps?on_conflict=app_key`, {
126
+ method: 'POST',
127
+ headers: {
128
+ apikey: target.supabaseAnonKey,
129
+ Authorization: `Bearer ${target.supabaseAnonKey}`,
130
+ 'Content-Type': 'application/json',
131
+ Prefer: 'resolution=ignore-duplicates'
132
+ },
133
+ body: JSON.stringify({
134
+ app_key: target.appKey,
135
+ app_name: target.appName
136
+ })
137
+ });
138
+ } catch {
139
+ // ignore — not critical
140
+ }
141
+ }
142
+
115
143
  /**
116
144
  * Subscribes to the reports table (newest first). Does an initial fetch, then
117
145
  * refetches on any realtime change. Returns an unsubscribe function.
@@ -156,11 +184,14 @@ async function updateReportStatus(target, reportId, status) {
156
184
 
157
185
  /** Builds a SupabaseTarget from the SDK config (with defaults). */
158
186
  function targetFromConfig(config) {
187
+ const appKey = config.appKey ?? 'default';
159
188
  return {
160
189
  supabaseUrl: config.supabaseUrl,
161
190
  supabaseAnonKey: config.supabaseAnonKey,
162
191
  tableName: config.tableName ?? 'bug_reports',
163
- storageBucket: config.storageBucket ?? 'bug-reports'
192
+ storageBucket: config.storageBucket ?? 'bug-reports',
193
+ appKey,
194
+ appName: config.appName ?? appKey
164
195
  };
165
196
  }
166
197
  //# sourceMappingURL=supabaseService.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["require","_supabaseJs","_logger","client","clientKey","getClient","url","anonKey","key","createClient","auth","persistSession","autoRefreshToken","mapRow","row","id","title","description","severity","screenshotUrl","screenshot_url","screenshotPath","screenshot_path","context","status","createdAt","created_at","notifyEmails","notify_emails","undefined","uploadScreenshot","target","localUri","storagePath","Date","now","Math","floor","random","endpoint","supabaseUrl","replace","storageBucket","form","FormData","append","uri","name","type","res","fetch","method","headers","apikey","supabaseAnonKey","Authorization","body","ok","text","catch","Error","publicUrl","logger","log","insertReport","report","supabase","data","error","from","tableName","insert","select","single","subscribeToReports","onData","onError","fetchAll","order","ascending","limit","map","channel","on","event","schema","table","subscribe","removeChannel","updateReportStatus","reportId","update","eq","targetFromConfig","config"],"sourceRoot":"../../../src","sources":["services/supabaseService.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["require","_supabaseJs","_logger","client","clientKey","getClient","url","anonKey","key","createClient","auth","persistSession","autoRefreshToken","mapRow","row","id","appKey","app_key","title","description","severity","screenshotUrl","screenshot_url","screenshotPath","screenshot_path","context","status","createdAt","created_at","notifyEmails","notify_emails","undefined","uploadScreenshot","target","localUri","storagePath","Date","now","Math","floor","random","endpoint","supabaseUrl","replace","storageBucket","form","FormData","append","uri","name","type","res","fetch","method","headers","apikey","supabaseAnonKey","Authorization","body","ok","text","catch","Error","publicUrl","logger","log","insertReport","report","supabase","data","error","from","tableName","insert","select","single","ensureAppRegistered","Prefer","JSON","stringify","app_name","appName","subscribeToReports","onData","onError","fetchAll","order","ascending","limit","map","channel","on","event","schema","table","subscribe","removeChannel","updateReportStatus","reportId","update","eq","targetFromConfig","config"],"sourceRoot":"../../../src","sources":["services/supabaseService.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["SEVERITIES","exports"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAAA;AACA;AACA;;AAIO,MAAMA,UAAyB,GAAAC,OAAA,CAAAD,UAAA,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAE9E;AACA;AACA;AACA;;AASA;;AAmBA;;AAUA;;AAUA;;AAWA;;AAOA;;AAYA;;AAYA;;AAUA","ignoreList":[]}
1
+ {"version":3,"names":["SEVERITIES","exports"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;;;;;AAAA;AACA;AACA;;AAIO,MAAMA,UAAyB,GAAAC,OAAA,CAAAD,UAAA,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAE9E;AACA;AACA;AACA;;AASA;;AAmBA;;AAUA;;AAUA;;AAWA;;AAOA;;AAcA;;AAYA;;AAUA","ignoreList":[]}
@@ -34,6 +34,7 @@ function getClient(url, anonKey) {
34
34
  function mapRow(row) {
35
35
  return {
36
36
  id: row.id,
37
+ appKey: row.app_key ?? 'default',
37
38
  title: row.title ?? '',
38
39
  description: row.description ?? '',
39
40
  severity: row.severity ?? 'medium',
@@ -90,6 +91,7 @@ export async function insertReport(target, report) {
90
91
  data,
91
92
  error
92
93
  } = await supabase.from(target.tableName).insert({
94
+ app_key: target.appKey,
93
95
  title: report.title,
94
96
  description: report.description,
95
97
  severity: report.severity,
@@ -102,9 +104,35 @@ export async function insertReport(target, report) {
102
104
  }).select().single();
103
105
  if (error) throw error;
104
106
  logger.log('report inserted', data.id);
107
+ // Register the app (insert-if-absent) so it shows in the admin panel.
108
+ void ensureAppRegistered(target);
105
109
  return mapRow(data);
106
110
  }
107
111
 
112
+ /**
113
+ * Inserts the app into bug_report_apps if it's not there yet (without clobbering
114
+ * its notify_emails). Fire-and-forget — never blocks submission.
115
+ */
116
+ async function ensureAppRegistered(target) {
117
+ try {
118
+ await fetch(`${target.supabaseUrl.replace(/\/+$/, '')}/rest/v1/bug_report_apps?on_conflict=app_key`, {
119
+ method: 'POST',
120
+ headers: {
121
+ apikey: target.supabaseAnonKey,
122
+ Authorization: `Bearer ${target.supabaseAnonKey}`,
123
+ 'Content-Type': 'application/json',
124
+ Prefer: 'resolution=ignore-duplicates'
125
+ },
126
+ body: JSON.stringify({
127
+ app_key: target.appKey,
128
+ app_name: target.appName
129
+ })
130
+ });
131
+ } catch {
132
+ // ignore — not critical
133
+ }
134
+ }
135
+
108
136
  /**
109
137
  * Subscribes to the reports table (newest first). Does an initial fetch, then
110
138
  * refetches on any realtime change. Returns an unsubscribe function.
@@ -149,11 +177,14 @@ export async function updateReportStatus(target, reportId, status) {
149
177
 
150
178
  /** Builds a SupabaseTarget from the SDK config (with defaults). */
151
179
  export function targetFromConfig(config) {
180
+ const appKey = config.appKey ?? 'default';
152
181
  return {
153
182
  supabaseUrl: config.supabaseUrl,
154
183
  supabaseAnonKey: config.supabaseAnonKey,
155
184
  tableName: config.tableName ?? 'bug_reports',
156
- storageBucket: config.storageBucket ?? 'bug-reports'
185
+ storageBucket: config.storageBucket ?? 'bug-reports',
186
+ appKey,
187
+ appName: config.appName ?? appKey
157
188
  };
158
189
  }
159
190
  //# sourceMappingURL=supabaseService.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createClient","logger","client","clientKey","getClient","url","anonKey","key","auth","persistSession","autoRefreshToken","mapRow","row","id","title","description","severity","screenshotUrl","screenshot_url","screenshotPath","screenshot_path","context","status","createdAt","created_at","notifyEmails","notify_emails","undefined","uploadScreenshot","target","localUri","storagePath","Date","now","Math","floor","random","endpoint","supabaseUrl","replace","storageBucket","form","FormData","append","uri","name","type","res","fetch","method","headers","apikey","supabaseAnonKey","Authorization","body","ok","text","catch","Error","publicUrl","log","insertReport","report","supabase","data","error","from","tableName","insert","select","single","subscribeToReports","onData","onError","fetchAll","order","ascending","limit","map","channel","on","event","schema","table","subscribe","removeChannel","updateReportStatus","reportId","update","eq","targetFromConfig","config"],"sourceRoot":"../../../src","sources":["services/supabaseService.ts"],"mappings":";;AAAA,OAAO,gCAAgC;AACvC,SAASA,YAAY,QAA6B,uBAAuB;AAEzE,SAASC,MAAM,QAAQ,iBAAiB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAIC,MAA6B,GAAG,IAAI;AACxC,IAAIC,SAAS,GAAG,EAAE;AAElB,SAASC,SAASA,CAACC,GAAW,EAAEC,OAAe,EAAkB;EAC/D,MAAMC,GAAG,GAAG,GAAGF,GAAG,KAAKC,OAAO,EAAE;EAChC,IAAI,CAACJ,MAAM,IAAIC,SAAS,KAAKI,GAAG,EAAE;IAChCL,MAAM,GAAGF,YAAY,CAACK,GAAG,EAAEC,OAAO,EAAE;MAClCE,IAAI,EAAE;QAAEC,cAAc,EAAE,KAAK;QAAEC,gBAAgB,EAAE;MAAM;IACzD,CAAC,CAAC;IACFP,SAAS,GAAGI,GAAG;EACjB;EACA,OAAOL,MAAM;AACf;AASA;AACA,SAASS,MAAMA,CAACC,GAA4B,EAAa;EACvD,OAAO;IACLC,EAAE,EAAED,GAAG,CAACC,EAAY;IACpBC,KAAK,EAAGF,GAAG,CAACE,KAAK,IAAe,EAAE;IAClCC,WAAW,EAAGH,GAAG,CAACG,WAAW,IAAe,EAAE;IAC9CC,QAAQ,EAAGJ,GAAG,CAACI,QAAQ,IAA8B,QAAQ;IAC7DC,aAAa,EAAGL,GAAG,CAACM,cAAc,IAAe,IAAI;IACrDC,cAAc,EAAGP,GAAG,CAACQ,eAAe,IAAe,IAAI;IACvDC,OAAO,EAAGT,GAAG,CAACS,OAAO,IAA8B,CAAC,CAA0B;IAC9EC,MAAM,EAAGV,GAAG,CAACU,MAAM,IAA4B,MAAM;IACrDC,SAAS,EAAGX,GAAG,CAACY,UAAU,IAAe,EAAE;IAC3CC,YAAY,EAAGb,GAAG,CAACc,aAAa,IAAiBC;EACnD,CAAC;AACH;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,gBAAgBA,CACpCC,MAAsB,EACtBC,QAAgB,EACO;EACvB,MAAMC,WAAW,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,IAAIC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM;EAC1E,MAAMC,QAAQ,GAAG,GAAGR,MAAM,CAACS,WAAW,CAACC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAsBV,MAAM,CAACW,aAAa,IAAIT,WAAW,EAAE;EAErH,MAAMU,IAAI,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAC3BD,IAAI,CAACE,MAAM,CAAC,MAAM,EAAE;IAClBC,GAAG,EAAEd,QAAQ;IACbe,IAAI,EAAEd,WAAW;IACjBe,IAAI,EAAE;EACR,CAAoB,CAAC;EAErB,MAAMC,GAAG,GAAG,MAAMC,KAAK,CAACX,QAAQ,EAAE;IAChCY,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MACPC,MAAM,EAAEtB,MAAM,CAACuB,eAAe;MAC9BC,aAAa,EAAE,UAAUxB,MAAM,CAACuB,eAAe,EAAE;MACjD,UAAU,EAAE;IACd,CAAC;IACDE,IAAI,EAAEb;EACR,CAAC,CAAC;EAEF,IAAI,CAACM,GAAG,CAACQ,EAAE,EAAE;IACX,MAAMC,IAAI,GAAG,MAAMT,GAAG,CAACS,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7C,MAAM,IAAIC,KAAK,CAAC,0BAA0BX,GAAG,CAACzB,MAAM,MAAMkC,IAAI,EAAE,CAAC;EACnE;EAEA,MAAMG,SAAS,GAAG,GAAG9B,MAAM,CAACS,WAAW,CAACC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,6BAA6BV,MAAM,CAACW,aAAa,IAAIT,WAAW,EAAE;EAC7H9B,MAAM,CAAC2D,GAAG,CAAC,qBAAqB,EAAE7B,WAAW,CAAC;EAC9C,OAAO;IAAE4B,SAAS;IAAE5B;EAAY,CAAC;AACnC;;AAEA;AACA,OAAO,eAAe8B,YAAYA,CAChChC,MAAsB,EACtBiC,MAA6B,EACT;EACpB,MAAMC,QAAQ,GAAG3D,SAAS,CAACyB,MAAM,CAACS,WAAW,EAAET,MAAM,CAACuB,eAAe,CAAC;EACtE,MAAM;IAAEY,IAAI;IAAEC;EAAM,CAAC,GAAG,MAAMF,QAAQ,CACnCG,IAAI,CAACrC,MAAM,CAACsC,SAAS,CAAC,CACtBC,MAAM,CAAC;IACNtD,KAAK,EAAEgD,MAAM,CAAChD,KAAK;IACnBC,WAAW,EAAE+C,MAAM,CAAC/C,WAAW;IAC/BC,QAAQ,EAAE8C,MAAM,CAAC9C,QAAQ;IACzBE,cAAc,EAAE4C,MAAM,CAAC7C,aAAa;IACpCG,eAAe,EAAE0C,MAAM,CAAC3C,cAAc;IACtCE,OAAO,EAAEyC,MAAM,CAACzC,OAAO;IACvBC,MAAM,EAAEwC,MAAM,CAACxC,MAAM;IACrBE,UAAU,EAAEsC,MAAM,CAACvC,SAAS;IAC5BG,aAAa,EAAEoC,MAAM,CAACrC,YAAY,IAAI;EACxC,CAAC,CAAC,CACD4C,MAAM,CAAC,CAAC,CACRC,MAAM,CAAC,CAAC;EACX,IAAIL,KAAK,EAAE,MAAMA,KAAK;EACtBhE,MAAM,CAAC2D,GAAG,CAAC,iBAAiB,EAAEI,IAAI,CAACnD,EAAE,CAAC;EACtC,OAAOF,MAAM,CAACqD,IAAI,CAAC;AACrB;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASO,kBAAkBA,CAChC1C,MAAsB,EACtB2C,MAAsC,EACtCC,OAAgC,EACpB;EACZ,MAAMV,QAAQ,GAAG3D,SAAS,CAACyB,MAAM,CAACS,WAAW,EAAET,MAAM,CAACuB,eAAe,CAAC;EAEtE,MAAMsB,QAAQ,GAAG,MAAAA,CAAA,KAAY;IAC3B,MAAM;MAAEV,IAAI;MAAEC;IAAM,CAAC,GAAG,MAAMF,QAAQ,CACnCG,IAAI,CAACrC,MAAM,CAACsC,SAAS,CAAC,CACtBE,MAAM,CAAC,GAAG,CAAC,CACXM,KAAK,CAAC,YAAY,EAAE;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC,CACzCC,KAAK,CAAC,GAAG,CAAC;IACb,IAAIZ,KAAK,EAAE;MACThE,MAAM,CAACgE,KAAK,CAAC,qBAAqB,EAAEA,KAAK,CAAC;MAC1CQ,OAAO,GAAGR,KAAyB,CAAC;MACpC;IACF;IACAO,MAAM,CAAC,CAACR,IAAI,IAAI,EAAE,EAAEc,GAAG,CAACnE,MAAM,CAAC,CAAC;EAClC,CAAC;EAED+D,QAAQ,CAAC,CAAC;EAEV,MAAMK,OAAO,GAAGhB,QAAQ,CACrBgB,OAAO,CAAC,eAAelD,MAAM,CAACsC,SAAS,EAAE,CAAC,CAC1Ca,EAAE,CACD,kBAAkB,EAClB;IAAEC,KAAK,EAAE,GAAG;IAAEC,MAAM,EAAE,QAAQ;IAAEC,KAAK,EAAEtD,MAAM,CAACsC;EAAU,CAAC,EACzD,MAAMO,QAAQ,CAAC,CACjB,CAAC,CACAU,SAAS,CAAC,CAAC;EAEd,OAAO,MAAM;IACXrB,QAAQ,CAACsB,aAAa,CAACN,OAAO,CAAC;EACjC,CAAC;AACH;;AAEA;AACA,OAAO,eAAeO,kBAAkBA,CACtCzD,MAAsB,EACtB0D,QAAgB,EAChBjE,MAA2B,EACZ;EACf,MAAMyC,QAAQ,GAAG3D,SAAS,CAACyB,MAAM,CAACS,WAAW,EAAET,MAAM,CAACuB,eAAe,CAAC;EACtE,MAAM;IAAEa;EAAM,CAAC,GAAG,MAAMF,QAAQ,CAC7BG,IAAI,CAACrC,MAAM,CAACsC,SAAS,CAAC,CACtBqB,MAAM,CAAC;IAAElE;EAAO,CAAC,CAAC,CAClBmE,EAAE,CAAC,IAAI,EAAEF,QAAQ,CAAC;EACrB,IAAItB,KAAK,EAAE,MAAMA,KAAK;AACxB;;AAEA;AACA,OAAO,SAASyB,gBAAgBA,CAACC,MAKhC,EAAkB;EACjB,OAAO;IACLrD,WAAW,EAAEqD,MAAM,CAACrD,WAAW;IAC/Bc,eAAe,EAAEuC,MAAM,CAACvC,eAAe;IACvCe,SAAS,EAAEwB,MAAM,CAACxB,SAAS,IAAI,aAAa;IAC5C3B,aAAa,EAAEmD,MAAM,CAACnD,aAAa,IAAI;EACzC,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["createClient","logger","client","clientKey","getClient","url","anonKey","key","auth","persistSession","autoRefreshToken","mapRow","row","id","appKey","app_key","title","description","severity","screenshotUrl","screenshot_url","screenshotPath","screenshot_path","context","status","createdAt","created_at","notifyEmails","notify_emails","undefined","uploadScreenshot","target","localUri","storagePath","Date","now","Math","floor","random","endpoint","supabaseUrl","replace","storageBucket","form","FormData","append","uri","name","type","res","fetch","method","headers","apikey","supabaseAnonKey","Authorization","body","ok","text","catch","Error","publicUrl","log","insertReport","report","supabase","data","error","from","tableName","insert","select","single","ensureAppRegistered","Prefer","JSON","stringify","app_name","appName","subscribeToReports","onData","onError","fetchAll","order","ascending","limit","map","channel","on","event","schema","table","subscribe","removeChannel","updateReportStatus","reportId","update","eq","targetFromConfig","config"],"sourceRoot":"../../../src","sources":["services/supabaseService.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["SEVERITIES"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAAA;AACA;AACA;;AAIA,OAAO,MAAMA,UAAyB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAE9E;AACA;AACA;AACA;;AASA;;AAmBA;;AAUA;;AAUA;;AAWA;;AAOA;;AAYA;;AAYA;;AAUA","ignoreList":[]}
1
+ {"version":3,"names":["SEVERITIES"],"sourceRoot":"../../src","sources":["types.ts"],"mappings":";;AAAA;AACA;AACA;;AAIA,OAAO,MAAMA,UAAyB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;;AAE9E;AACA;AACA;AACA;;AASA;;AAmBA;;AAUA;;AAUA;;AAWA;;AAOA;;AAcA;;AAYA;;AAUA","ignoreList":[]}
@@ -5,6 +5,8 @@ export interface SupabaseTarget {
5
5
  supabaseAnonKey: string;
6
6
  tableName: string;
7
7
  storageBucket: string;
8
+ appKey: string;
9
+ appName: string;
8
10
  }
9
11
  export interface UploadResult {
10
12
  publicUrl: string;
@@ -34,5 +36,7 @@ export declare function targetFromConfig(config: {
34
36
  supabaseAnonKey: string;
35
37
  tableName?: string;
36
38
  storageBucket?: string;
39
+ appKey?: string;
40
+ appName?: string;
37
41
  }): SupabaseTarget;
38
42
  //# sourceMappingURL=supabaseService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"supabaseService.d.ts","sourceRoot":"","sources":["../../../../src/services/supabaseService.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA4B1C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAkBD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED,6DAA6D;AAC7D,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAC5B,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,EACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC/B,MAAM,IAAI,CA+BZ;AAED,yCAAyC;AACzC,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,cAAc,CAOjB"}
1
+ {"version":3,"file":"supabaseService.d.ts","sourceRoot":"","sources":["../../../../src/services/supabaseService.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA4B1C,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAmBD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED,6DAA6D;AAC7D,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAC5B,OAAO,CAAC,SAAS,CAAC,CAuBpB;AA0BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,EACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC/B,MAAM,IAAI,CA+BZ;AAED,yCAAyC;AACzC,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,cAAc,CAUjB"}
@@ -69,6 +69,8 @@ export interface BugReportInput {
69
69
  /** The full bug report persisted on the backend. */
70
70
  export interface BugReport extends BugReportInput {
71
71
  id?: string;
72
+ /** Logical app this report belongs to. */
73
+ appKey?: string;
72
74
  screenshotUrl: string | null;
73
75
  screenshotPath: string | null;
74
76
  context: CollectedContext;
@@ -102,6 +104,14 @@ export interface BugReporterConfig {
102
104
  supabaseUrl: string;
103
105
  /** Supabase anon (public) API key. */
104
106
  supabaseAnonKey: string;
107
+ /**
108
+ * Logical app identifier for multi-app bug tracking. Every report is tagged
109
+ * with this key so the admin panel can show per-app sections + counts and
110
+ * route notification emails per app. Defaults to "default".
111
+ */
112
+ appKey?: string;
113
+ /** Human-friendly app name shown in the admin panel (defaults to appKey). */
114
+ appName?: string;
105
115
  /** Postgres table reports are inserted into. Defaults to "bug_reports". */
106
116
  tableName?: string;
107
117
  /** Supabase Storage bucket for screenshots. Defaults to "bug-reports". */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-bug-reporter",
3
- "version": "1.0.4",
3
+ "version": "1.1.1",
4
4
  "description": "Universal React Native bug reporter: auto-detect screenshots, annotate, collect device/app/user context, and ship to Supabase (Postgres + Storage) with Edge Function email.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -33,12 +33,15 @@ export interface SupabaseTarget {
33
33
  supabaseAnonKey: string;
34
34
  tableName: string;
35
35
  storageBucket: string;
36
+ appKey: string;
37
+ appName: string;
36
38
  }
37
39
 
38
40
  /** DB row (snake_case) → SDK BugReport (camelCase). */
39
41
  function mapRow(row: Record<string, unknown>): BugReport {
40
42
  return {
41
43
  id: row.id as string,
44
+ appKey: (row.app_key as string) ?? 'default',
42
45
  title: (row.title as string) ?? '',
43
46
  description: (row.description as string) ?? '',
44
47
  severity: (row.severity as BugReport['severity']) ?? 'medium',
@@ -107,6 +110,7 @@ export async function insertReport(
107
110
  const { data, error } = await supabase
108
111
  .from(target.tableName)
109
112
  .insert({
113
+ app_key: target.appKey,
110
114
  title: report.title,
111
115
  description: report.description,
112
116
  severity: report.severity,
@@ -121,9 +125,35 @@ export async function insertReport(
121
125
  .single();
122
126
  if (error) throw error;
123
127
  logger.log('report inserted', data.id);
128
+ // Register the app (insert-if-absent) so it shows in the admin panel.
129
+ void ensureAppRegistered(target);
124
130
  return mapRow(data);
125
131
  }
126
132
 
133
+ /**
134
+ * Inserts the app into bug_report_apps if it's not there yet (without clobbering
135
+ * its notify_emails). Fire-and-forget — never blocks submission.
136
+ */
137
+ async function ensureAppRegistered(target: SupabaseTarget): Promise<void> {
138
+ try {
139
+ await fetch(
140
+ `${target.supabaseUrl.replace(/\/+$/, '')}/rest/v1/bug_report_apps?on_conflict=app_key`,
141
+ {
142
+ method: 'POST',
143
+ headers: {
144
+ apikey: target.supabaseAnonKey,
145
+ Authorization: `Bearer ${target.supabaseAnonKey}`,
146
+ 'Content-Type': 'application/json',
147
+ Prefer: 'resolution=ignore-duplicates',
148
+ },
149
+ body: JSON.stringify({ app_key: target.appKey, app_name: target.appName }),
150
+ },
151
+ );
152
+ } catch {
153
+ // ignore — not critical
154
+ }
155
+ }
156
+
127
157
  /**
128
158
  * Subscribes to the reports table (newest first). Does an initial fetch, then
129
159
  * refetches on any realtime change. Returns an unsubscribe function.
@@ -185,11 +215,16 @@ export function targetFromConfig(config: {
185
215
  supabaseAnonKey: string;
186
216
  tableName?: string;
187
217
  storageBucket?: string;
218
+ appKey?: string;
219
+ appName?: string;
188
220
  }): SupabaseTarget {
221
+ const appKey = config.appKey ?? 'default';
189
222
  return {
190
223
  supabaseUrl: config.supabaseUrl,
191
224
  supabaseAnonKey: config.supabaseAnonKey,
192
225
  tableName: config.tableName ?? 'bug_reports',
193
226
  storageBucket: config.storageBucket ?? 'bug-reports',
227
+ appKey,
228
+ appName: config.appName ?? appKey,
194
229
  };
195
230
  }
package/src/types.ts CHANGED
@@ -78,6 +78,8 @@ export interface BugReportInput {
78
78
  /** The full bug report persisted on the backend. */
79
79
  export interface BugReport extends BugReportInput {
80
80
  id?: string;
81
+ /** Logical app this report belongs to. */
82
+ appKey?: string;
81
83
  screenshotUrl: string | null;
82
84
  screenshotPath: string | null;
83
85
  context: CollectedContext;
@@ -115,6 +117,14 @@ export interface BugReporterConfig {
115
117
  supabaseUrl: string;
116
118
  /** Supabase anon (public) API key. */
117
119
  supabaseAnonKey: string;
120
+ /**
121
+ * Logical app identifier for multi-app bug tracking. Every report is tagged
122
+ * with this key so the admin panel can show per-app sections + counts and
123
+ * route notification emails per app. Defaults to "default".
124
+ */
125
+ appKey?: string;
126
+ /** Human-friendly app name shown in the admin panel (defaults to appKey). */
127
+ appName?: string;
118
128
  /** Postgres table reports are inserted into. Defaults to "bug_reports". */
119
129
  tableName?: string;
120
130
  /** Supabase Storage bucket for screenshots. Defaults to "bug-reports". */