Skip to content

Commit 551c764

Browse files
feat(overmind-devtools): add computed and derived labels to state
1 parent 733a430 commit 551c764

File tree

4 files changed

+107
-11
lines changed

4 files changed

+107
-11
lines changed

packages/node_modules/overmind-devtools/src/app/mutations.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,11 @@ export function performMutationsByMessageType(state: State, message: Message) {
178178
const path = clientMessage.data.path.split('.')
179179
const key = path.pop()
180180
const target = path.reduce((aggr, pathKey) => aggr[pathKey], appState)
181-
target[key] = clientMessage.data
181+
target[key] = {
182+
cache: clientMessage.data.cache,
183+
limit: clientMessage.data.limit,
184+
updateCount: clientMessage.data.updateCount,
185+
}
182186

183187
state.apps[message.port].computed[clientMessage.data.path] =
184188
clientMessage.data

packages/node_modules/overmind-devtools/src/components/Inspector/index.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,25 @@ class ValueComponent extends React.Component<ValueComponentProps> {
100100
}
101101
}
102102

103+
export type RenderPaths = {
104+
[path: string]: (children: React.ReactChildren) => React.ReactNode
105+
}
106+
103107
type InspectorProps = {
104108
value: object
105109
expandedPaths: string[]
106110
small?: boolean
107111
onToggleExpand: (path: string[]) => void
112+
renderPaths?: RenderPaths
108113
}
109114

110115
class Inspector extends React.Component<InspectorProps> {
111-
renderValue(path: string[], value: any) {
116+
renderValue(path: string[], value: any, renderPaths?: RenderPaths) {
117+
const wrapper = renderPaths && renderPaths[path.join('.')]
118+
let node
119+
112120
if (isObject(value)) {
113-
return (
121+
node = (
114122
<ConnectedNested
115123
key={path.join('.')}
116124
startBracket="{"
@@ -123,13 +131,13 @@ class Inspector extends React.Component<InspectorProps> {
123131
>
124132
{() =>
125133
Object.keys(value).map((key) =>
126-
this.renderValue(path.concat(key), value[key])
134+
this.renderValue(path.concat(key), value[key], renderPaths)
127135
)
128136
}
129137
</ConnectedNested>
130138
)
131139
} else if (isArray(value)) {
132-
return (
140+
node = (
133141
<ConnectedNested
134142
key={path.join('.')}
135143
startBracket="["
@@ -142,19 +150,21 @@ class Inspector extends React.Component<InspectorProps> {
142150
>
143151
{() =>
144152
value.map((_, index) =>
145-
this.renderValue(path.concat(index), value[index])
153+
this.renderValue(path.concat(index), value[index], renderPaths)
146154
)
147155
}
148156
</ConnectedNested>
149157
)
158+
} else {
159+
node = <ValueComponent key={path.join('.')} path={path} value={value} />
150160
}
151161

152-
return <ValueComponent key={path.join('.')} path={path} value={value} />
162+
return wrapper ? wrapper(node) : node
153163
}
154164
render() {
155165
return (
156166
<Wrapper small={this.props.small}>
157-
{this.renderValue([], this.props.value)}
167+
{this.renderValue([], this.props.value, this.props.renderPaths)}
158168
</Wrapper>
159169
)
160170
}

packages/node_modules/overmind-devtools/src/components/State/elements.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,28 @@ export const Wrapper = styled.div`
66
box-sizing: border-box;
77
overflow-y: scroll;
88
`
9+
10+
export const Label = styled.div`
11+
display: flex;
12+
`
13+
14+
export const LabelWrapper = styled.div`
15+
display: flex;
16+
align-items: center;
17+
`
18+
19+
export const ComputedLabel = styled.div`
20+
margin-right: 5px;
21+
background-color: ${({ theme }) => theme.color.primary};
22+
padding: ${({ theme }) => `0 ${theme.padding.smallerer}`};
23+
border-radius: ${({ theme }) => theme.borderRadius.normal};
24+
color: ${({ theme }) => theme.color.white};
25+
`
26+
27+
export const DerivedLabel = styled.div`
28+
margin-right: 5px;
29+
background-color: ${({ theme }) => theme.color.secondary};
30+
padding: ${({ theme }) => `0 ${theme.padding.smallerer}`};
31+
border-radius: ${({ theme }) => theme.borderRadius.normal};
32+
color: ${({ theme }) => theme.color.white};
33+
`

packages/node_modules/overmind-devtools/src/components/State/index.tsx

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,71 @@
11
import * as React from 'react'
22
import { connect, Connect } from '../../app'
3-
import { Wrapper } from './elements'
4-
import Inspector from '../Inspector'
3+
import {
4+
Wrapper,
5+
Label,
6+
LabelWrapper,
7+
ComputedLabel,
8+
DerivedLabel,
9+
} from './elements'
10+
import Inspector, { RenderPaths } from '../Inspector'
11+
import Text from '../common/Text'
12+
13+
const DerivedWrapper = ({ children }) => (
14+
<Label>
15+
<LabelWrapper>
16+
<DerivedLabel>
17+
<Text variant="hint" mono>
18+
derived
19+
</Text>
20+
</DerivedLabel>
21+
</LabelWrapper>
22+
<div>{children}</div>
23+
</Label>
24+
)
25+
26+
const ComputedWrapper = ({ children }) => (
27+
<Label>
28+
<LabelWrapper>
29+
<ComputedLabel>
30+
{' '}
31+
<Text variant="hint" mono>
32+
computed
33+
</Text>
34+
</ComputedLabel>
35+
</LabelWrapper>
36+
<div>{children}</div>
37+
</Label>
38+
)
539

640
const State: React.SFC<Connect> = ({ app }) => (
741
<Wrapper>
842
<Inspector
9-
value={app.state.apps[app.state.currentPort].state}
43+
value={app.state.currentApp.state}
1044
expandedPaths={app.state.expandedStatePaths}
1145
onToggleExpand={app.actions.toggleExpandState}
46+
renderPaths={
47+
Object.assign(
48+
{},
49+
Object.keys(app.state.currentApp.derived).reduce(
50+
(aggr, key) =>
51+
Object.assign(aggr, {
52+
[key]: (children) => (
53+
<DerivedWrapper key={key}>{children}</DerivedWrapper>
54+
),
55+
}),
56+
{}
57+
),
58+
Object.keys(app.state.currentApp.computed).reduce(
59+
(aggr, key) =>
60+
Object.assign(aggr, {
61+
[key]: (children) => (
62+
<ComputedWrapper key={key}>{children}</ComputedWrapper>
63+
),
64+
}),
65+
{}
66+
)
67+
) as RenderPaths
68+
}
1269
/>
1370
</Wrapper>
1471
)

0 commit comments

Comments
 (0)