-
-
Notifications
You must be signed in to change notification settings - Fork 177
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into chore/remove-webpack.config.js
- Loading branch information
Showing
12 changed files
with
171 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
import { extendTest } from '../../../tests/shared/demoTest'; | ||
|
||
extendTest('bubble'); | ||
extendTest('bubble', { | ||
// Ignore gpt-vis demo, need browser env not jsdom | ||
skip: ['gpt-vis'], | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
import demoTest from '../../../tests/shared/demoTest'; | ||
|
||
demoTest('bubble'); | ||
demoTest('bubble', { | ||
// Ignore gpt-vis demo, need browser env not jsdom | ||
skip: ['gpt-vis'], | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
## zh-CN | ||
|
||
配合 `@antv/GPT-Vis` 实现大模型输出的图表渲染,支持模型流式输出。 | ||
|
||
## en-US | ||
|
||
Cooperate with `@antv/GPT-Vis` to achieve customized rendering chart of LLM stream output. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import { Bubble } from '@ant-design/x'; | ||
import type { BubbleProps } from '@ant-design/x'; | ||
import { GPTVis } from '@antv/gpt-vis'; | ||
import { Button, Flex } from 'antd'; | ||
/* eslint-disable react/no-danger */ | ||
import React from 'react'; | ||
|
||
const text = ` | ||
**GPT-Vis**, Components for GPTs, generative AI, and LLM projects. Not only UI Components. [more...](https://github.com/antvis/GPT-Vis) \n\n | ||
Here’s a visualization of Haidilao's food delivery revenue from 2013 to 2022. You can see a steady increase over the years, with notable *growth* particularly in recent years. | ||
\`\`\`vis-chart | ||
{ | ||
"type": "line", | ||
"data": [{"time":2013,"value":59.3},{"time":2014,"value":64.4},{"time":2015,"value":68.9},{"time":2016,"value":74.4},{"time":2017,"value":82.7},{"time":2018,"value":91.9},{"time":2019,"value":99.1},{"time":2020,"value":101.6},{"time":2021,"value":114.4},{"time":2022,"value":121}], | ||
"axisXTitle": "year", | ||
"axisYTitle": "sale" | ||
} | ||
\`\`\` | ||
`; | ||
|
||
const RenderMarkdown: BubbleProps['messageRender'] = (content) => <GPTVis>{content}</GPTVis>; | ||
|
||
const App = () => { | ||
const [rerenderKey, setRerenderKey] = React.useState(0); | ||
|
||
return ( | ||
<Flex vertical gap="small" key={rerenderKey}> | ||
<Button | ||
style={{ alignSelf: 'flex-end' }} | ||
onClick={() => { | ||
setRerenderKey((prev) => prev + 1); | ||
}} | ||
> | ||
Re-Render | ||
</Button> | ||
|
||
<Bubble | ||
typing={{ step: 20, interval: 150 }} | ||
content={text} | ||
messageRender={RenderMarkdown} | ||
avatar={{ | ||
src: 'https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*2Q5LRJ3LFPUAAAAAAAAAAAAADmJ7AQ/fmt.webp', | ||
}} | ||
variant="outlined" | ||
/> | ||
</Flex> | ||
); | ||
}; | ||
|
||
export default App; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
import { act, renderHook } from '../../../tests/utils'; | ||
import useSyncState from '../useSyncState'; | ||
|
||
describe('useSyncState', () => { | ||
it('should initialize state with default value', () => { | ||
const { result } = renderHook(() => useSyncState(0)); | ||
|
||
const [state] = result.current!; | ||
|
||
expect(state).toBe(0); | ||
}); | ||
|
||
it('should initialize state with default value by getter', () => { | ||
const { result } = renderHook(() => useSyncState(() => 0)); | ||
|
||
const [state] = result.current!; | ||
|
||
expect(state).toBe(0); | ||
}); | ||
|
||
it('should update state using setState', () => { | ||
const { result } = renderHook(() => useSyncState(0)); | ||
const [, setState] = result.current!; | ||
|
||
act(() => { | ||
setState(10); | ||
}); | ||
|
||
const [state] = result.current!; | ||
expect(state).toBe(10); | ||
}); | ||
|
||
it('should update state using setState by setter', () => { | ||
const { result } = renderHook(() => useSyncState(0)); | ||
const [, setState] = result.current!; | ||
|
||
act(() => { | ||
setState((prev) => prev + 1); | ||
}); | ||
|
||
const [state] = result.current!; | ||
expect(state).toBe(1); | ||
}); | ||
|
||
it('should get the current state by getState', () => { | ||
const { result } = renderHook(() => useSyncState(0)); | ||
const [, setState, getState] = result.current!; | ||
|
||
act(() => { | ||
setState(5); | ||
}); | ||
|
||
expect(getState()).toBe(5); | ||
|
||
act(() => { | ||
setState((prev) => prev + 5); | ||
}); | ||
|
||
expect(getState()).toBe(10); | ||
}); | ||
|
||
it('should trigger re-renders when state update', () => { | ||
const { result } = renderHook(() => useSyncState(0)); | ||
|
||
const [, setState] = result.current!; | ||
|
||
const prevState = result?.current?.[0]; | ||
|
||
act(() => { | ||
setState(20); | ||
}); | ||
|
||
const nextState = result?.current?.[0]; | ||
expect(nextState).not.toBe(prevState); | ||
expect(nextState).toBe(20); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,23 @@ | ||
import React from 'react'; | ||
|
||
export default function useSyncState<T>(defaultValue: T | (() => T)) { | ||
const [state, setState] = React.useState(defaultValue); | ||
type Getter<T> = () => T; | ||
type Setter<T> = (pre: T) => T; | ||
|
||
const stateRef = React.useRef(state); | ||
stateRef.current = state; | ||
export default function useSyncState<T>(defaultValue: T | Getter<T>) { | ||
const [, forceUpdate] = React.useState(0); | ||
|
||
const getState = React.useCallback(() => stateRef.current, []); | ||
const stateRef = React.useRef<T>( | ||
typeof defaultValue === 'function' ? (defaultValue as Getter<T>)() : defaultValue, | ||
); | ||
|
||
return [state, setState, getState] as const; | ||
const setState = React.useCallback((action: React.SetStateAction<T>) => { | ||
stateRef.current = | ||
typeof action === 'function' ? (action as Setter<T>)(stateRef.current) : action; | ||
|
||
forceUpdate((prev) => prev + 1); | ||
}, []); | ||
|
||
const getState: Getter<T> = React.useCallback(() => stateRef.current, []); | ||
|
||
return [stateRef.current, setState, getState] as const; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters