import Watchable from '../watchable'; /** * A React hook for watching data in Airtable models like {@link Table} and {@link Record}. Each * model has several watchable keys that can be used with this hook to have your component * automatically re-render when data in the models changes. You can also provide an optional * callback if you need to do anything other than re-render when the data changes. * * This is a low-level tool that you should only use when you specifically need it. There are more * convenient model-specific hooks available: * * * For {@link Base}, {@link Table}, {@link View}, or {@link Field}, use {@link useBase}. * * For {@link RecordQueryResult} or {@link Record}, use {@link useRecords}, {@link useRecordIds}, or {@link useRecordById}. * * For {@link Viewport}, use {@link useViewport}. * * For {@link SettingsButton}, use {@link useSettingsButton}. * * If you're writing a class component and still want to be able to use hooks, try {@link withHooks}. * * @param models The model or models to watch. * @param keys The key or keys to watch. Non-optional, but may be null. * @param callback An optional callback to call when any of the watch keys change. * * @example * ```js * import {useWatchable} from '@airtable/blocks/ui'; * * function TableName({table}) { * useWatchable(table, 'name'); * return The table name is {table.name}; * } * * function ViewNameAndType({view}) { * useWatchable(view, ['name', 'type']); * return The view name is {view.name} and the type is {view.type}; * } * * function RecordValuesAndColorInViewIfExists({record, field, view}) { * useWatchable(record, ['cellValues', view ? `colorInView:${view.id}` : null]); * return * The record has cell value {record.getCellValue(field)} in {field.name}. * {view ? `The record has color ${record.getColorInView(view)} in ${view.name}.` : null} * * } * ``` * * @example * ```js * import {useWatchable} from '@airtable/blocks/ui'; * * function ActiveView({cursor}) { * useWatchable(cursor, 'activeViewId', () => { * alert('active view changed!!!') * }); * * return Active view id: {cursor.activeViewId}; * } * ``` * @docsPath UI/hooks/useWatchable * @hook */ export default function useWatchable(models: Watchable | ReadonlyArray | null | undefined> | null | undefined, keys: Keys | ReadonlyArray | null, callback?: (model: Watchable, keys: string, ...args: Array) => unknown): void;