Skip to content

Commit

Permalink
add ui slice
Browse files Browse the repository at this point in the history
add ifc slice to the store

add ifc slice state properties to cadview

add select IFC element test

add viewer test

add viewer test

new build
  • Loading branch information
OlegMoshkovich committed Jun 19, 2022
1 parent 0671471 commit 7d227e5
Show file tree
Hide file tree
Showing 8 changed files with 336 additions and 254 deletions.
410 changes: 205 additions & 205 deletions docs/index.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/index.js.map

Large diffs are not rendered by default.

50 changes: 33 additions & 17 deletions src/Containers/CadView.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import NavPanel from '../Components/NavPanel'
import OperationsGroup from '../Components/OperationsGroup'
import SearchBar from '../Components/SearchBar'
import SnackBarMessage from '../Components/SnackbarMessage'
import useStore from '../store/useStore'
import debug from '../utils/debug'
import useStore from '../utils/store'
import * as Privacy from '../privacy/Privacy'
import {assertDefined} from '../utils/assert'
import {computeElementPath, setupLookupAndParentLinks} from '../utils/TreeUtils'
Expand Down Expand Up @@ -53,7 +53,6 @@ export default function CadView({
const [rootElement, setRootElement] = useState({})
const elementsById = useState({})
const [defaultExpandedElements, setDefaultExpandedElements] = useState([])
const [selectedElement, setSelectedElement] = useState({})
const [selectedElements, setSelectedElements] = useState([])
const [expandedElements, setExpandedElements] = useState([])

Expand All @@ -67,9 +66,20 @@ export default function CadView({
const isItemPanelOpenState = {value: isItemPanelOpen, set: setIsItemPanelOpen}
const [isLoading, setIsLoading] = useState(false)
const [model, setModel] = useState(null)
const isDrawerOpen = useStore((state) => state.isDrawerOpen)
const modelStore = useStore((state) => state.modelStore)
const setModelStore = useStore((state) => state.setModelStore)
const setSelectedElement = useStore((state) => state.setSelectedElement)
const selectedElement = useStore((state) => state.selectedElement)
const viewerStore = useStore((state) => state.viewerStore)
const setViewerStore = useStore((state) => state.setViewerStore)
const snackMessage = useStore((state) => state.snackMessage)
const setSnackMessage = useStore((state) => state.setSnackMessage)

console.log('selected element', selectedElement)
console.log('modelStore', modelStore)
console.log('viewerStore', viewerStore)


/* eslint-disable react-hooks/exhaustive-deps */
// ModelPath changes in parent (ShareRoutes) from user and
Expand Down Expand Up @@ -110,12 +120,14 @@ export default function CadView({
setShowSearchBar(false)
setIsItemPanelOpen(false)
const theme = colorModeContext.getTheme()
setViewer(initViewer(
const intializedViewer = initViewer(
pathPrefix,
(theme &&
theme.palette &&
theme.palette.background &&
theme.palette.background.paper) || '0xabcdef'))
theme.palette &&
theme.palette.background &&
theme.palette.background.paper) || '0xabcdef')
setViewer(intializedViewer)
setViewerStore(intializedViewer)
debug().log('CadView#onModelPath, done setting new viewer')
}

Expand Down Expand Up @@ -183,6 +195,7 @@ export default function CadView({
// always be 0.
model.modelID = 0
setModel(model)
setModelStore(model)
}
}

Expand Down Expand Up @@ -335,17 +348,19 @@ export default function CadView({
selectItems([id])
const props = await viewer.getProperties(0, elt.expressID)
setSelectedElement(props)

// TODO(pablo): just found out this method is getting called a lot
// when i added navigation on select, which flooded the browser
// IPC.
// console.log('CadView#onElementSelect: in...')
}


const addThemeListener = () => {
colorModeContext.addThemeChangeListener((newMode, theme) => {
if (theme && theme.palette && theme.palette.background && theme.palette.background.paper) {
setViewer(initViewer(pathPrefix, theme.palette.background.paper))
const intializedViewer = initViewer(pathPrefix, theme.palette.background.paper)
setViewer(intializedViewer)
setViewerStore(intializedViewer)
}
})
}
Expand Down Expand Up @@ -383,20 +398,21 @@ export default function CadView({
classes.operationsGroupOpen :
classes.operationsGroup}>
{viewer &&
<OperationsGroup
viewer={viewer}
unSelectItem={unSelectItems}
itemPanelControl={
<ItemPanelControl
model={model}
element={selectedElement}
isOpenState={isItemPanelOpenState}/>}/>}
<OperationsGroup
viewer={viewer}
unSelectItem={unSelectItems}
itemPanelControl={
<ItemPanelControl
model={model}
element={selectedElement}
isOpenState={isItemPanelOpenState}/>}/>}
</div>
<div className={isItemPanelOpen ? classes.baseGroupOpen : classes.baseGroup}>
<div className={isDrawerOpen ? classes.baseGroupOpen : classes.baseGroup}>
<BaseGroup installPrefix={installPrefix} fileOpen={loadLocalFile}/>
</div>
{alert}
</div>

</div>
)
}
Expand Down
12 changes: 6 additions & 6 deletions src/utils/store.js → src/store/UISlice.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import create from 'zustand'


const useStore = create((set) => ({
const createUISlice = (set, get) => ({
isDrawerOpen: false,
isCommentsOn: false,
snackMessage: null,
isPropertiesOn: false,
setSnackMessage: (message) => set(() => ({snackMessage: message})),
openDrawer: () => set(() => ({isDrawerOpen: true})),
closeDrawer: () => set(() => ({isDrawerOpen: false})),
}))
export default useStore
toggleIsPropertiesOn: () => set((state) => ({isPropertiesOn: !state.isPropertiesOn})),
})

export default createUISlice
10 changes: 10 additions & 0 deletions src/store/ifcSlice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const craeateIFCSlice = (set, get) => ({
viewerStore: {},
modelStore: null,
selectedElement: {},
setViewerStore: (viewer) => set(() => ({viewerStore: viewer})),
setModelStore: (model) => set(() => ({modelStore: model})),
setSelectedElement: (element) => set(() => ({selectedElement: element})),
})

export default craeateIFCSlice
13 changes: 13 additions & 0 deletions src/store/useStore.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import create from 'zustand'
import createUISlice from './UISlice'
import craeateIFCSlice from './IFCSlice'


const useStore = create((set, get) => ({
...createUISlice(set, get),
...craeateIFCSlice(set, get),
}))

export default useStore


66 changes: 66 additions & 0 deletions src/store/useStore.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import {act, renderHook} from '@testing-library/react-hooks'
import useStore from './useStore'


describe('UI slice', () => {
it('Set snack message', () => {
const {result} = renderHook(() => useStore((state) => state))
act(() => {
result.current.setSnackMessage(['loading'])
})
expect(result.current.snackMessage).toEqual(['loading'])
})
})

describe('UI slice', () => {
it('Set Drawer State', () => {
const {result} = renderHook(() => useStore((state) => state))
act(() => {
result.current.openDrawer()
})
expect(result.current.isDrawerOpen).toEqual(true)
})
})

describe('IFC slice', () => {
it('select an IFC element', () => {
const {result} = renderHook(() => useStore((state) => state))
act(() => {
result.current.setSelectedElement(
{Name: {
type: 1,
value: 'Together',
},
})
})
expect(result.current.selectedElement).toEqual({Name: {
type: 1,
value: 'Together',
},
})
})
})

describe('IFC slice', () => {
it('set IFC model', () => {
const {result} = renderHook(() => useStore((state) => state))
act(() => {
result.current.setModelStore({castShadow: false})
})
expect(result.current.modelStore).toEqual(
{castShadow: false},
)
})
})

describe('IFC slice', () => {
it('set IFC viewer', () => {
const {result} = renderHook(() => useStore((state) => state))
act(() => {
result.current.setViewerStore({GLTF: {GLTFModels: {}}})
})
expect(result.current.viewerStore).toEqual(
{GLTF: {GLTFModels: {}}},
)
})
})
23 changes: 0 additions & 23 deletions src/utils/store.test.js

This file was deleted.

0 comments on commit 7d227e5

Please sign in to comment.