Skip to content

Commit 3a8ed33

Browse files
committed
Update FirebaseTelemetry react function to take app
1 parent 3611531 commit 3a8ed33

File tree

4 files changed

+29
-52
lines changed

4 files changed

+29
-52
lines changed

common/api-review/telemetry-react.api.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
```ts
66

77
import { FirebaseApp } from '@firebase/app';
8-
import { FirebaseOptions } from '@firebase/app';
98
import { LoggerProvider } from '@opentelemetry/sdk-logs';
109

1110
// @public
12-
export function FirebaseTelemetry({ firebaseOptions, telemetryOptions }: {
13-
firebaseOptions?: FirebaseOptions;
11+
export function FirebaseTelemetry({ firebaseApp, telemetryOptions }: {
12+
firebaseApp: FirebaseApp;
1413
telemetryOptions?: TelemetryOptions;
1514
}): null;
1615

docs-devsite/telemetry_react.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ https://github.com/firebase/firebase-js-sdk
1515

1616
| Function | Description |
1717
| --- | --- |
18-
| [FirebaseTelemetry({ firebaseOptions, telemetryOptions })](./telemetry_react.md#firebasetelemetry_f37eb31) | Registers event listeners for uncaught errors.<!-- -->This should be installed near the root of your application. Caught errors, including those implicitly caught by Error Boundaries, will not be captured by this component. |
18+
| [FirebaseTelemetry({ firebaseApp, telemetryOptions })](./telemetry_react.md#firebasetelemetry_10424e8) | Registers event listeners for uncaught errors.<!-- -->This should be installed near the root of your application. Caught errors, including those implicitly caught by Error Boundaries, will not be captured by this component. |
1919

2020
## Interfaces
2121

@@ -24,9 +24,9 @@ https://github.com/firebase/firebase-js-sdk
2424
| [Telemetry](./telemetry_react.telemetry.md#telemetry_interface) | An instance of the Firebase Telemetry SDK.<!-- -->Do not create this instance directly. Instead, use [getTelemetry()](./telemetry_.md#gettelemetry_448bdc6)<!-- -->. |
2525
| [TelemetryOptions](./telemetry_react.telemetryoptions.md#telemetryoptions_interface) | Options for initialized the Telemetry service using [getTelemetry()](./telemetry_.md#gettelemetry_448bdc6)<!-- -->. |
2626

27-
## function({ firebaseOptions, telemetryOptions }, ...)
27+
## function({ firebaseApp, telemetryOptions }, ...)
2828

29-
### FirebaseTelemetry({ firebaseOptions, telemetryOptions }) {:#firebasetelemetry_f37eb31}
29+
### FirebaseTelemetry({ firebaseApp, telemetryOptions }) {:#firebasetelemetry_10424e8}
3030

3131
Registers event listeners for uncaught errors.
3232

@@ -35,8 +35,8 @@ This should be installed near the root of your application. Caught errors, inclu
3535
<b>Signature:</b>
3636

3737
```typescript
38-
export declare function FirebaseTelemetry({ firebaseOptions, telemetryOptions }: {
39-
firebaseOptions?: FirebaseOptions;
38+
export declare function FirebaseTelemetry({ firebaseApp, telemetryOptions }: {
39+
firebaseApp: FirebaseApp;
4040
telemetryOptions?: TelemetryOptions;
4141
}): null;
4242
```
@@ -45,7 +45,7 @@ export declare function FirebaseTelemetry({ firebaseOptions, telemetryOptions }:
4545

4646
| Parameter | Type | Description |
4747
| --- | --- | --- |
48-
| { firebaseOptions, telemetryOptions } | { firebaseOptions?: [FirebaseOptions](./app.firebaseoptions.md#firebaseoptions_interface)<!-- -->; telemetryOptions?: [TelemetryOptions](./telemetry_.telemetryoptions.md#telemetryoptions_interface)<!-- -->; } | |
48+
| { firebaseApp, telemetryOptions } | { firebaseApp: [FirebaseApp](./app.firebaseapp.md#firebaseapp_interface)<!-- -->; telemetryOptions?: [TelemetryOptions](./telemetry_.telemetryoptions.md#telemetryoptions_interface)<!-- -->; } | |
4949

5050
<b>Returns:</b>
5151

@@ -58,7 +58,7 @@ The default [Telemetry](./telemetry_.telemetry.md#telemetry_interface) instance
5858

5959
```html
6060
<body>
61-
<FirebaseTelemetry firebaseOptions={options} />
61+
<FirebaseTelemetry firebaseApp={app} />
6262
... my app ...
6363
</body>
6464

packages/telemetry/src/react/index.test.tsx

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,72 +33,45 @@ use(chaiAsPromised);
3333
describe('FirebaseTelemetry', () => {
3434
let getTelemetryStub: sinon.SinonStub;
3535
let captureErrorStub: sinon.SinonStub;
36-
let initializeAppStub: sinon.SinonStub;
37-
let getAppStub: sinon.SinonStub;
3836
let fakeApp: FirebaseApp;
3937
let fakeTelemetry: Telemetry;
4038

4139
beforeEach(() => {
4240
fakeApp = { name: 'fakeApp' } as FirebaseApp;
4341
fakeTelemetry = {} as Telemetry;
4442

45-
initializeAppStub = stub(app, 'initializeApp').returns(fakeApp);
4643
getTelemetryStub = stub(telemetry, 'getTelemetry').returns(fakeTelemetry);
4744
captureErrorStub = stub(telemetry, 'captureError');
48-
getAppStub = stub(app, 'getApp').returns(fakeApp);
4945
});
5046

5147
afterEach(() => {
5248
restore();
5349
});
5450

55-
it('gets telemetry with the default app if no firebaseOptions are provided', () => {
56-
render(<FirebaseTelemetry />);
57-
expect(initializeAppStub).not.to.have.been.called;
58-
});
59-
60-
it('initializes a new app and gets telemetry if firebaseOptions are provided', () => {
61-
const firebaseOptions = { apiKey: 'test' };
62-
render(<FirebaseTelemetry firebaseOptions={firebaseOptions} />);
63-
expect(initializeAppStub).to.have.been.calledWith(firebaseOptions);
64-
});
65-
6651
it('captures window errors', done => {
67-
render(<FirebaseTelemetry />);
52+
render(<FirebaseTelemetry firebaseApp={fakeApp} />);
6853
const error = new Error('test error');
6954
window.onerror = () => {
7055
// Prevent error from bubbling up to test suite
7156
};
7257
window.addEventListener('error', (event: ErrorEvent) => {
7358
// Registers another listener (sequential) to confirm behaviour.
74-
expect(getTelemetryStub).to.have.been.called;
59+
expect(getTelemetryStub).to.have.been.calledWith(fakeApp);
7560
expect(captureErrorStub).to.have.been.calledWith(fakeTelemetry, error);
7661
done();
7762
});
7863
window.dispatchEvent(new ErrorEvent('error', { error }));
7964
});
8065

8166
it('captures unhandled promise rejections', () => {
82-
render(<FirebaseTelemetry />);
67+
render(<FirebaseTelemetry firebaseApp={fakeApp} />);
8368
const reason = new Error('test rejection');
8469
const promise = Promise.reject(reason);
8570
promise.catch(() => {});
8671
window.dispatchEvent(
8772
new PromiseRejectionEvent('unhandledrejection', { reason, promise })
8873
);
89-
expect(getTelemetryStub).to.have.been.called;
74+
expect(getTelemetryStub).to.have.been.calledWith(fakeApp);
9075
expect(captureErrorStub).to.have.been.calledWith(fakeTelemetry, reason);
9176
});
92-
93-
it('fails silently when getTelemetry fails', () => {
94-
const error = new Error('getTelemetry failed');
95-
initializeAppStub.throws(error);
96-
const consoleWarnStub = stub(console, 'warn');
97-
98-
expect(() => render(<FirebaseTelemetry firebaseOptions={{}}/>)).not.to.throw();
99-
expect(consoleWarnStub).to.have.been.calledWith(
100-
'Firebase Telemetry was not initialized:\n',
101-
error
102-
);
103-
});
10477
});

packages/telemetry/src/react/index.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { FirebaseOptions, getApp, initializeApp } from '@firebase/app';
18+
import { FirebaseApp } from '@firebase/app';
1919
import { registerTelemetry } from '../register';
2020
import { captureError, getTelemetry } from '../api';
2121
import { TelemetryOptions } from '../public-types';
@@ -34,22 +34,22 @@ export * from '../public-types';
3434
* @example
3535
* ```html
3636
* <body>
37-
* <FirebaseTelemetry firebaseOptions={options} />
37+
* <FirebaseTelemetry firebaseApp={app} />
3838
* ... my app ...
3939
* </body>
4040
* ```
4141
*
42-
* @param firebaseOptions - Options to run {@link @firebase/app#initializeApp}. If this is not provided, initializeApp needs to be called explicitly elsewhere in your application.
42+
* @param firebaseApp - The {@link @firebase/app#FirebaseApp} instance to use.
4343
* @param telemetryOptions - {@link TelemetryOptions} that configure the Telemetry instance.
4444
* @returns The default {@link Telemetry} instance for the given {@link @firebase/app#FirebaseApp}.
4545
*
4646
* @public
4747
*/
4848
export function FirebaseTelemetry({
49-
firebaseOptions,
49+
firebaseApp,
5050
telemetryOptions
5151
}: {
52-
firebaseOptions?: FirebaseOptions;
52+
firebaseApp: FirebaseApp;
5353
telemetryOptions?: TelemetryOptions;
5454
}): null {
5555
useEffect(() => {
@@ -58,17 +58,22 @@ export function FirebaseTelemetry({
5858
}
5959

6060
const errorListener = (event: ErrorEvent): void => {
61-
captureError(getTelemetry(getApp(), telemetryOptions), event.error, {});
61+
captureError(
62+
getTelemetry(firebaseApp, telemetryOptions),
63+
event.error,
64+
{}
65+
);
6266
};
6367

6468
const unhandledRejectionListener = (event: PromiseRejectionEvent): void => {
65-
captureError(getTelemetry(getApp(), telemetryOptions), event.reason, {});
69+
captureError(
70+
getTelemetry(firebaseApp, telemetryOptions),
71+
event.reason,
72+
{}
73+
);
6674
};
6775

6876
try {
69-
if (firebaseOptions) {
70-
initializeApp(firebaseOptions);
71-
}
7277
window.addEventListener('error', errorListener);
7378
window.addEventListener('unhandledrejection', unhandledRejectionListener);
7479
} catch (error) {
@@ -82,7 +87,7 @@ export function FirebaseTelemetry({
8287
unhandledRejectionListener
8388
);
8489
};
85-
}, []);
90+
}, [firebaseApp, telemetryOptions]);
8691

8792
return null;
8893
}

0 commit comments

Comments
 (0)