Skip to content

Commit 55ccfe2

Browse files
committed
docs: add docs for built-in types
1 parent 0c9ef70 commit 55ccfe2

File tree

4 files changed

+187
-0
lines changed

4 files changed

+187
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { defineEasyType, JsonViewer } from '@textea/json-viewer'
2+
import type { FC } from 'react'
3+
4+
import { useNextraTheme } from '../hooks/useTheme'
5+
6+
const myDateType = defineEasyType<Date>({
7+
is: (value) => value instanceof Date,
8+
type: 'date',
9+
colorKey: 'base0D',
10+
Renderer: ({ value }) => <>{value.toISOString().split('T')[0]}</>
11+
})
12+
13+
const value = {
14+
date: new Date('2023/04/12 12:34:56')
15+
}
16+
17+
const Example: FC = () => {
18+
const theme = useNextraTheme()
19+
return (
20+
<JsonViewer
21+
rootName={false}
22+
displaySize={false}
23+
theme={theme}
24+
value={value}
25+
valueTypes={[myDateType]}
26+
/>
27+
)
28+
}
29+
30+
export default Example
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import type { JsonViewerOnChange } from '@textea/json-viewer'
2+
import { applyValue, booleanType, defineDataType, defineEasyType, JsonViewer } from '@textea/json-viewer'
3+
import type { FC } from 'react'
4+
import { useCallback, useMemo, useState } from 'react'
5+
6+
import { useNextraTheme } from '../hooks/useTheme'
7+
8+
const value = {
9+
agree: true,
10+
disagree: false,
11+
description: 'Click the ✔️ ❌ to toggle the boolean value'
12+
}
13+
14+
export const JsonViewerToggleBoolean1: FC = () => {
15+
const theme = useNextraTheme()
16+
const [src, setSrc] = useState(value)
17+
const onChange = useCallback<JsonViewerOnChange>(
18+
(path, oldValue, newValue) => {
19+
setSrc(src => applyValue(src, path, newValue))
20+
}, [])
21+
22+
const toggleBoolType = useMemo(() => {
23+
return defineDataType<boolean>({
24+
...booleanType,
25+
Component: ({ value, path }) => (
26+
<span onClick={() => onChange(path, value, !value)}>
27+
{value ? '✔️' : '❌'}
28+
</span>
29+
)
30+
})
31+
}, [onChange])
32+
33+
return (
34+
<JsonViewer
35+
rootName={false}
36+
displaySize={false}
37+
theme={theme}
38+
value={src}
39+
onChange={onChange}
40+
valueTypes={[toggleBoolType]}
41+
/>
42+
)
43+
}
44+
45+
export const JsonViewerToggleBoolean2: FC = () => {
46+
const theme = useNextraTheme()
47+
const [src, setSrc] = useState(value)
48+
const onChange = useCallback<JsonViewerOnChange>(
49+
(path, oldValue, newValue) => {
50+
setSrc(src => applyValue(src, path, newValue))
51+
}, [])
52+
53+
const toggleBoolType = useMemo(() => {
54+
return defineEasyType<boolean>({
55+
...booleanType,
56+
type: 'bool',
57+
colorKey: 'base0E',
58+
Renderer: ({ value, path }) => (
59+
<span onClick={() => onChange(path, value, !value)}>
60+
{value ? '✔️' : '❌'}
61+
</span>
62+
)
63+
})
64+
}, [onChange])
65+
66+
return (
67+
<JsonViewer
68+
rootName={false}
69+
displaySize={false}
70+
theme={theme}
71+
value={src}
72+
onChange={onChange}
73+
valueTypes={[toggleBoolType]}
74+
/>
75+
)
76+
}

docs/pages/how-to/_meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"data-type": "Defining Data Types",
3+
"built-in-types": "Extend Built-in Data Types",
34
"styling": "Styling and Theming"
45
}

docs/pages/how-to/built-in-types.mdx

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { JsonViewerToggleBoolean1, JsonViewerToggleBoolean2 } from '../../examples/JsonViewerToggleBoolean'
2+
3+
# Extend Built-in Data Types
4+
5+
The following is a list of the built-in data types that can be extended:
6+
7+
- `stringType`
8+
- `intType`
9+
- `floatType`
10+
- `booleanType`
11+
- `dateType`
12+
- `nanType`
13+
- `nullType`
14+
- `undefinedType`
15+
- `bigIntType`
16+
- `objectType`
17+
- `functionType`
18+
19+
20+
## Example
21+
22+
### Displaying Boolean Values as Icons
23+
24+
Suppose you want to display boolean values as icons (e.g., ✔️ or ❌) instead of the default `true` or `false`. There are two ways to accomplish this:
25+
26+
1. Override the `Component` property of the built-in booleanType data type:
27+
28+
29+
<JsonViewerToggleBoolean1 />
30+
31+
```tsx
32+
import { JsonViewer, defineDataType, booleanType } from '@textea/json-viewer'
33+
import { Button } from '@mui/material'
34+
35+
const toggleBoolType = defineDataType<boolean>({
36+
...booleanType,
37+
Component: ({ value }) => (
38+
<span>{value ? '✔️' : ''}</span>
39+
)
40+
})
41+
42+
<JsonViewer
43+
value={{
44+
agree: true,
45+
disagree: false,
46+
}}
47+
valueTypes={[toggleBoolType]}
48+
/>
49+
```
50+
[[Source Code]](https://github.com/TexteaInc/json-viewer/blob/main/docs/examples/JsonViewerToggleBoolean.tsx)
51+
52+
2. Create a new data type with `defineEasyType`
53+
54+
<JsonViewerToggleBoolean2 />
55+
56+
```tsx
57+
import { defineEasyType, booleanType } from '@textea/json-viewer'
58+
59+
const booleanType = defineEasyType<boolean>({
60+
...booleanType,
61+
type: 'bool',
62+
colorKey: 'base0E',
63+
Renderer: ({ value }) => (
64+
<span>{value ? '✔️' : ''}</span>
65+
)
66+
})
67+
68+
<JsonViewer
69+
value={{
70+
agree: true,
71+
disagree: false,
72+
}}
73+
valueTypes={[toggleBoolType]}
74+
/>
75+
```
76+
[[Source Code]](https://github.com/TexteaInc/json-viewer/blob/main/docs/examples/JsonViewerToggleBoolean.tsx)
77+
78+
Did you notice the difference between the two examples?
79+
80+
`defineEasyType` is a helper function that creates data types with type labels and colors. So you only need to care about how the balue should be rendered. All other details will be automatically handled.

0 commit comments

Comments
 (0)