Remove unnecessary error handling parameter.

This commit is contained in:
Dermot Duffy
2023-10-02 20:31:27 -07:00
parent c2145ef0d5
commit 5ebd85e5e8
6 changed files with 128 additions and 68 deletions
+5 -8
View File
@@ -13,7 +13,7 @@ import { createRef, ref, Ref } from 'lit/directives/ref.js';
import { DateRange } from '../camera-manager/range';
import { localize } from '../localize/localize';
import mediaFilterStyle from '../scss/media-filter.scss';
import { executeMediaQueryForView } from '../utils/media-to-view.js';
import { executeMediaQueryForViewWithErrorDispatching } from '../utils/media-to-view.js';
import { errorToConsole, formatDate, prettifyTitle } from '../utils/basic';
import { ScopedRegistryHost } from '@lit-labs/scoped-registry-mixin';
import './select';
@@ -228,7 +228,7 @@ class FrigateCardMediaFilter extends ScopedRegistryHost(LitElement) {
]);
(
await executeMediaQueryForView(
await executeMediaQueryForViewWithErrorDispatching(
this,
this.cameraManager,
this.view,
@@ -251,7 +251,7 @@ class FrigateCardMediaFilter extends ScopedRegistryHost(LitElement) {
]);
(
await executeMediaQueryForView(
await executeMediaQueryForViewWithErrorDispatching(
this,
this.cameraManager,
this.view,
@@ -404,7 +404,7 @@ class FrigateCardMediaFilter extends ScopedRegistryHost(LitElement) {
...(what && { what: what }),
...(where && { where: where }),
...(favorite !== undefined && { favorite: favorite }),
...(tags && { tags: tags })
...(tags && { tags: tags }),
};
}
@@ -527,10 +527,7 @@ export class MediaMetadataController implements ReactiveController {
public whatOptions: SelectOption[] = [];
public whereOptions: SelectOption[] = [];
constructor(
host: ReactiveControllerHost,
cameraManager: CameraManager,
) {
constructor(host: ReactiveControllerHost, cameraManager: CameraManager) {
this._host = host;
this._cameraManager = cameraManager;
host.addController(this);
+7 -9
View File
@@ -50,7 +50,10 @@ import {
isTruthy,
setOrRemoveAttribute,
} from '../utils/basic';
import { executeMediaQueryForView, findBestMediaIndex } from '../utils/media-to-view';
import {
executeMediaQueryForViewWithErrorDispatching,
findBestMediaIndex,
} from '../utils/media-to-view';
import { FrigateCardTimelineItem, TimelineDataSource } from '../utils/timeline-source';
import { ViewMedia } from '../view/media';
import { ViewMediaClassifier } from '../view/media-classifier';
@@ -580,7 +583,7 @@ export class FrigateCardTimelineCore extends LitElement {
) {
const query = this._createMediaQueries('recording');
if (query) {
view = await executeMediaQueryForView(
view = await executeMediaQueryForViewWithErrorDispatching(
this,
this.cameraManager,
this.view,
@@ -734,7 +737,7 @@ export class FrigateCardTimelineCore extends LitElement {
if (!this.hass || !this.cameraManager || !this.view || !query) {
return null;
}
const view = await executeMediaQueryForView(
const view = await executeMediaQueryForViewWithErrorDispatching(
this,
this.cameraManager,
this.view,
@@ -971,12 +974,7 @@ export class FrigateCardTimelineCore extends LitElement {
* Update the timeline from the view object.
*/
protected async _updateTimelineFromView(): Promise<void> {
if (
!this.view ||
!this.timelineConfig ||
!this._timelineSource ||
!this._timeline
) {
if (!this.view || !this.timelineConfig || !this._timelineSource || !this._timeline) {
return;
}
+6 -3
View File
@@ -101,7 +101,6 @@ export class ViewManager {
}
public async setViewWithNewDisplayMode(displayMode: ViewDisplayMode): Promise<void> {
const host = this._api.getCardElementManager().getElement();
const hass = this._api.getHASSManager().getHASS();
if (this._view && hass) {
@@ -125,8 +124,9 @@ export class ViewManager {
// query for more than one camera, reset the query results, change the
// existing query to refer to all cameras and execute it to fetch new
// results.
const viewWithNewQuery = await executeMediaQueryForView(
host,
let viewWithNewQuery: View | null = null;
try {
viewWithNewQuery = await executeMediaQueryForView(
this._api.getCameraManager(),
view,
view.query
@@ -137,6 +137,9 @@ export class ViewManager {
: view.camera,
),
);
} catch (e: unknown) {
this._api.getMessageManager().setErrorIfHigherPriority(e);
}
if (viewWithNewQuery) {
return this._setView(viewWithNewQuery);
+43 -15
View File
@@ -44,10 +44,16 @@ export const changeViewToRecentEventsForCameraAndDependents = async (
}
(
await executeMediaQueryForView(element, cameraManager, view, queries, {
await executeMediaQueryForViewWithErrorDispatching(
element,
cameraManager,
view,
queries,
{
targetView: options?.targetView,
select: options?.select,
})
},
)
)?.dispatchChangeEvent(element);
};
@@ -106,10 +112,16 @@ export const changeViewToRecentRecordingForCameraAndDependents = async (
}
(
await executeMediaQueryForView(element, cameraManager, view, queries, {
await executeMediaQueryForViewWithErrorDispatching(
element,
cameraManager,
view,
queries,
{
targetView: options?.targetView,
select: options?.select,
})
},
)
)?.dispatchChangeEvent(element);
};
@@ -127,7 +139,6 @@ const createQueriesForRecordingsView = (
};
export const executeMediaQueryForView = async (
element: HTMLElement,
cameraManager: CameraManager,
view: View,
query: MediaQueries,
@@ -138,21 +149,12 @@ export const executeMediaQueryForView = async (
select?: ResultSelectType;
},
): Promise<View | null> => {
let mediaArray: ViewMedia[] | null;
const queries = query.getQueries();
if (!queries) {
return null;
}
try {
mediaArray = await cameraManager.executeMediaQueries<MediaQuery>(queries);
} catch (e) {
errorToConsole(e as Error);
dispatchFrigateCardErrorEvent(element, e as Error);
return null;
}
const mediaArray = await cameraManager.executeMediaQueries<MediaQuery>(queries);
if (!mediaArray) {
return null;
}
@@ -182,6 +184,32 @@ export const executeMediaQueryForView = async (
.mergeInContext(viewerContext);
};
export const executeMediaQueryForViewWithErrorDispatching = async (
element: HTMLElement,
cameraManager: CameraManager,
view: View,
query: MediaQueries,
options?: {
targetCameraID?: string;
targetView?: FrigateCardView;
targetTime?: Date;
select?: ResultSelectType;
},
): Promise<View | null> => {
try {
return await executeMediaQueryForView(cameraManager, view, query, {
targetCameraID: options?.targetCameraID,
targetView: options?.targetView,
targetTime: options?.targetTime,
select: options?.select,
});
} catch (e: unknown) {
errorToConsole(e as Error);
dispatchFrigateCardErrorEvent(element, e as Error);
}
return null;
};
/**
* Find the longest matching media object that contains a given targetTime.
* Longest is chosen to give the most stability to the media viewer.
@@ -496,7 +496,7 @@ describe('ViewManager.setViewWithNewDisplayMode', () => {
manager.setView(originalView);
// Query execution fails / returns null.
vi.mocked(cameraManager.executeMediaQueries).mockResolvedValue(null);
vi.mocked(cameraManager.executeMediaQueries).mockRejectedValue(null);
await manager.setViewWithNewDisplayMode('single');
+40 -6
View File
@@ -6,6 +6,7 @@ import {
changeViewToRecentEventsForCameraAndDependents,
changeViewToRecentRecordingForCameraAndDependents,
executeMediaQueryForView,
executeMediaQueryForViewWithErrorDispatching,
findBestMediaIndex,
} from '../../src/utils/media-to-view';
import { ViewMedia } from '../../src/view/media';
@@ -205,13 +206,11 @@ describe('executeMediaQueryForView', () => {
});
it('should not execute empty queries', async () => {
const elementHandler = createElementListenForView();
const cameraConfigs: CameraConfigs = new Map();
const cameraManager = createCameraManager({ configs: cameraConfigs });
expect(
await executeMediaQueryForView(
elementHandler.element,
cameraManager,
createView(),
new EventMediaQueries(),
@@ -219,8 +218,23 @@ describe('executeMediaQueryForView', () => {
).toBeNull();
});
it('should throw on failure', async () => {
const cameraConfigs: CameraConfigs = new Map();
const cameraManager = createCameraManager({ configs: cameraConfigs });
vi.mocked(cameraManager.executeMediaQueries).mockRejectedValue(new Error());
await expect(
executeMediaQueryForView(
cameraManager,
createView(),
new EventMediaQueries(
cameraManager.generateDefaultEventQueries('camera') ?? undefined,
),
),
).rejects.toThrowError();
});
it('should select time-based result', async () => {
const elementHandler = createElementListenForView();
const cameraConfigs: CameraConfigs = new Map();
const cameraManager = createCameraManager({ configs: cameraConfigs });
@@ -233,7 +247,6 @@ describe('executeMediaQueryForView', () => {
vi.mocked(cameraManager.executeMediaQueries).mockResolvedValue(mediaArray);
const view = await executeMediaQueryForView(
elementHandler.element,
cameraManager,
createView(),
new EventMediaQueries(
@@ -251,7 +264,6 @@ describe('executeMediaQueryForView', () => {
});
it('should select nothing when time-based selection does not match', async () => {
const elementHandler = createElementListenForView();
const cameraConfigs: CameraConfigs = new Map();
const cameraManager = createCameraManager({ configs: cameraConfigs });
@@ -265,7 +277,6 @@ describe('executeMediaQueryForView', () => {
vi.mocked(cameraManager.executeMediaQueries).mockResolvedValue(mediaArray);
const view = await executeMediaQueryForView(
elementHandler.element,
cameraManager,
createView(),
new EventMediaQueries(
@@ -378,6 +389,29 @@ describe('changeViewToRecentRecordingForCameraAndDependents', () => {
});
});
// @vitest-environment jsdom
describe('executeMediaQueryForViewWithErrorDispatching', () => {
it('should dispatch error message on fail', async () => {
vi.spyOn(global.console, 'warn').mockImplementation(() => true);
const elementHandler = createElementListenForView();
const cameraManager = createCameraManager();
vi.mocked(cameraManager.executeMediaQueries).mockRejectedValue(new Error());
await executeMediaQueryForViewWithErrorDispatching(
elementHandler.element,
cameraManager,
createView(),
new EventMediaQueries(
cameraManager.generateDefaultEventQueries('camera') ?? undefined,
),
);
expect(elementHandler.viewHandler).not.toBeCalled();
expect(elementHandler.messageHandler).toBeCalled();
});
});
// @vitest-environment jsdom
describe('findBestMediaIndex', () => {
it('should find best media index', async () => {