blob: 3046275c5f6053f27e3ddf53377152b352fbd5a5 [file] [log] [blame]
// Copyright (C) 2024 The Android Open Source Project
//
// 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
//
// http://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 m from 'mithril';
import {Selection, TrackEventSelection} from './selection';
import {z} from 'zod';
export interface DetailsPanel {
render(selection: Selection): m.Children;
isLoading?(): boolean;
}
export interface TrackEventDetailsPanelSerializeArgs<T> {
// The Zod schema which will be used the parse the state in a serialized
// permalink JSON object.
readonly schema: z.ZodType<T>;
// The serializable state of the details panel. The usage of this field is
// as follows
// 1) default initialize this field in the constructor.
// 2) if the trace is being restored from a permalink, the UI will use
// `schema` to parse the serialized state and will write the result into
// `state`. If parsing failed or the trace is not being restored,
// `state` will not be touched.
// 3) if a permalink is requested, the UI will read the value of `state`
// and stash it in the permalink serialzed state.
//
// This flow has the following consequences:
// 1) Details panels *must* respect changes to this object between their
// constructor and the first call to `load()`. This is the point where
// the core will "inject" the permalink deserialized object
// if available.
// 2) The `state` object *must* be serializable: that is, it should be a
// pure Javascript object.
state: T;
}
export interface TrackEventDetailsPanel {
// Optional: Do any loading required to render the details panel in here and
// the core will:
// - Ensure that no more than one concurrent loads are enqueued at any given
// time in order to keep the UI snappy.
// - Hold off switching to this tab for up to around 50ms while this loading
// is going, to avoid flickering when loading is fast.
load?(id: TrackEventSelection): Promise<void>;
// Called every render cycle to render the details panel. Note: This function
// is called regardless of whether |load| has completed yet.
render(): m.Children;
// Optional interface to implement by details panels which want to support
// saving/restoring state from a permalink.
readonly serialization?: TrackEventDetailsPanelSerializeArgs<unknown>;
}