diff options
author | Xin Li <delphij@google.com> | 2024-01-17 22:13:58 -0800 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2024-01-17 22:13:58 -0800 |
commit | 28d03a2a1cabbe01d7bcb6cf5166c10e50d3c2c6 (patch) | |
tree | c1643be8ab17fc607cea748a8bb1d621a5964873 /pw_web/log-viewer/src/createLogViewer.ts | |
parent | ec2628a6ba2d0ecbe3ac10c8c772f6fc6acc345d (diff) | |
parent | f054515492af5132f685cb23fe11891ee77104c9 (diff) | |
download | pigweed-temp_319669529.tar.gz |
Merge Android 24Q1 Release (ab/11220357)temp_319669529
Bug: 319669529
Merged-In: Iba357b308a79d0c8b560acd4f72b5423c9c83294
Change-Id: Icdf552029fb97a34e83c6dd7799433fc473a2506
Diffstat (limited to 'pw_web/log-viewer/src/createLogViewer.ts')
-rw-r--r-- | pw_web/log-viewer/src/createLogViewer.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/pw_web/log-viewer/src/createLogViewer.ts b/pw_web/log-viewer/src/createLogViewer.ts new file mode 100644 index 000000000..10ce61859 --- /dev/null +++ b/pw_web/log-viewer/src/createLogViewer.ts @@ -0,0 +1,63 @@ +// Copyright 2023 The Pigweed Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +import { LogViewer as RootComponent } from './components/log-viewer'; +import { StateStore, LocalStorageState } from './shared/state'; +import { LogEntry } from '../src/shared/interfaces'; +import { LogSource } from '../src/log-source'; + +import '@material/web/button/filled-button.js'; +import '@material/web/button/outlined-button.js'; +import '@material/web/checkbox/checkbox.js'; +import '@material/web/field/outlined-field.js'; +import '@material/web/textfield/outlined-text-field.js'; +import '@material/web/textfield/filled-text-field.js'; +import '@material/web/icon/icon.js'; +import '@material/web/iconbutton/icon-button.js'; +import '@material/web/menu/menu.js'; +import '@material/web/menu/menu-item.js'; + +export function createLogViewer( + logSource: LogSource, + root: HTMLElement, + state: StateStore = new LocalStorageState(), +) { + const logViewer = new RootComponent(state); + const logs: LogEntry[] = []; + root.appendChild(logViewer); + let lastUpdateTimeoutId: NodeJS.Timeout; + + // Define an event listener for the 'logEntry' event + const logEntryListener = (logEntry: LogEntry) => { + logs.push(logEntry); + logViewer.logs = logs; + if (lastUpdateTimeoutId) { + clearTimeout(lastUpdateTimeoutId); + } + + // Call requestUpdate at most once every 100 milliseconds. + lastUpdateTimeoutId = setTimeout(() => { + const updatedLogs = [...logs]; + logViewer.logs = updatedLogs; + }, 100); + }; + + // Add the event listener to the LogSource instance + logSource.addEventListener('logEntry', logEntryListener); + + // Method to destroy and unsubscribe + return () => { + logSource.removeEventListener('logEntry', logEntryListener); + }; +} |