Skip to content

Commit e89a380

Browse files
authored
feat: support onSelect callback (#238)
1 parent 13d4f15 commit e89a380

File tree

5 files changed

+18
-1
lines changed

5 files changed

+18
-1
lines changed

docs/pages/index.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const Component = () => (<JsonViewer value={object}/>)
5757
| `valueTypes` | `ValueTypes` | - | Customize value types. |
5858
| `onChange` | `(path, oldVal, newVal) => void` | - | Callback when value changed. |
5959
| `onCopy` | `(path, value) => void` | - | Callback when value copied. |
60+
| `onSelect` | `(path, value) => void` | - | Callback when value selected. |
6061
| `enableClipboard` | `boolean` | `true` | Whether enable clipboard feature. |
6162
| `editable` | `boolean` \|<br />`(path, currentValue) => boolean` | `false` | Whether enable edit feature. You can pass a function to customize the result. |
6263
| `defaultInspectDepth` | `number` | 5 | Default inspect depth for nested objects.<br /><br />_\* If the number is set too large, it could result in performance issues._ |

src/components/DataTypes/createEasyType.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ export function createEasyType<Value> (
2222
const EasyType: React.FC<DataItemProps<Value>> = (props) => {
2323
const storeDisplayDataTypes = useJsonViewerStore(store => store.displayDataTypes)
2424
const color = useJsonViewerStore(store => store.colorspace[colorKey])
25+
const onSelect = useJsonViewerStore(store => store.onSelect)
26+
2527
return (
26-
<DataBox sx={{ color }} >
28+
<DataBox onClick={() => onSelect?.(props.path, props.value)} sx={{ color }} >
2729
{(displayTypeLabel && storeDisplayDataTypes) && <DataTypeLabel dataType={type}/>}
2830
<DataBox className={`${type}-value`}>
2931
<Render value={props.value}/>

src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ const JsonViewerInner: React.FC<JsonViewerProps> = (props) => {
5454
useSetIfNotUndefinedEffect('displayDataTypes', props.displayDataTypes)
5555
useSetIfNotUndefinedEffect('displayObjectSize', props.displayObjectSize)
5656
useSetIfNotUndefinedEffect('onCopy', props.onCopy)
57+
useSetIfNotUndefinedEffect('onSelect', props.onSelect)
5758
useEffect(() => {
5859
if (props.theme === 'light') {
5960
api.setState({

src/stores/JsonViewerStore.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { combine } from 'zustand/middleware'
66
import type {
77
JsonViewerOnChange,
88
JsonViewerOnCopy,
9+
JsonViewerOnSelect,
910
JsonViewerProps,
1011
Path
1112
} from '..'
@@ -34,6 +35,7 @@ export type JsonViewerState<T = unknown> = {
3435
value: T
3536
onChange: JsonViewerOnChange
3637
onCopy: JsonViewerOnCopy | undefined
38+
onSelect: JsonViewerOnSelect | undefined
3739
keyRenderer: JsonViewerKeyRenderer
3840
displayObjectSize: boolean
3941
}
@@ -61,6 +63,7 @@ export const createJsonViewerStore = <T = unknown> (props: JsonViewerProps<T>) =
6163
rootName: props.rootName ?? 'root',
6264
onChange: props.onChange ?? (() => {}),
6365
onCopy: props.onCopy ?? undefined,
66+
onSelect: props.onSelect ?? undefined,
6467
keyRenderer: props.keyRenderer ?? DefaultKeyRenderer,
6568
editable: props.editable ?? false,
6669
defaultInspectDepth: props.defaultInspectDepth ?? 5,

src/type.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ export type JsonViewerOnCopy = <U = unknown>(
2323
value: U
2424
) => unknown | Promise<unknown>
2525

26+
/**
27+
* @param path path to the target value
28+
* @param value
29+
*/
30+
export type JsonViewerOnSelect = <U = unknown>(
31+
path: Path,
32+
value: U,
33+
) => void
34+
2635
export interface DataItemProps<ValueType = unknown> {
2736
inspect: boolean
2837
setInspect: Dispatch<SetStateAction<boolean>>
@@ -75,6 +84,7 @@ export type JsonViewerProps<T = unknown> = {
7584
valueTypes?: DataType<any>[]
7685
onChange?: JsonViewerOnChange
7786
onCopy?: JsonViewerOnCopy
87+
onSelect?: JsonViewerOnSelect
7888
/**
7989
* Whether enable clipboard feature.
8090
*

0 commit comments

Comments
 (0)