66 lines
2.3 KiB
TypeScript
66 lines
2.3 KiB
TypeScript
import { createContext, ReactNode, useContext, useState } from 'react'
|
|
import { GetDocuments, RequestAddArea, RequestAddDocument, RequestAddDocumentGroup } from '../../wailsjs/wailsjs/go/ipc/Channel'
|
|
import { ipc } from '../../wailsjs/wailsjs/go/models'
|
|
import { AddAreaProps, ProjectContextType, ProjectProps } from './types'
|
|
import makeDefaultProject from './makeDefaultProject'
|
|
import { LogPrint } from '../../wailsjs/wailsjs/runtime/runtime'
|
|
|
|
const ProjectContext = createContext<ProjectContextType>(makeDefaultProject())
|
|
|
|
export function useProject() {
|
|
return useContext(ProjectContext)
|
|
}
|
|
|
|
type Props = { children: ReactNode, projectProps: ProjectProps }
|
|
export function ProjectProvider({ children, projectProps }: Props) {
|
|
const [ documents, setDocuments ] = useState<ipc.Document[]>(projectProps.documents)
|
|
const [ groups, setGroups ] = useState<ipc.Group[]>(projectProps.groups)
|
|
const [selectedDocumentId, setSelectedDocumentId] = useState<string>('')
|
|
|
|
const updateDocuments = async () => {
|
|
GetDocuments().then(response => {
|
|
if (response.documents.length) setDocuments(response.documents)
|
|
if (response.groups.length) setGroups(response.groups)
|
|
Promise.resolve(response)
|
|
})
|
|
}
|
|
|
|
const requestAddDocument = async (groupId: string, documentName: string) => {
|
|
const response = await RequestAddDocument(groupId, documentName)
|
|
if (response.id) await updateDocuments()
|
|
return response
|
|
}
|
|
|
|
const requestAddDocumentGroup = async (groupName: string) => {
|
|
const response = await RequestAddDocumentGroup(groupName)
|
|
if (response.id) await updateDocuments()
|
|
return response
|
|
}
|
|
|
|
const requestAddArea = async (documentId: string, area: AddAreaProps): Promise<ipc.Area> => {
|
|
const response = await RequestAddArea(documentId, new ipc.Area(area))
|
|
|
|
if (response.id) await updateDocuments()
|
|
return response
|
|
}
|
|
|
|
const getSelectedDocument = () => documents.find(d => d.id === selectedDocumentId)
|
|
|
|
if (!documents.length && !groups.length) updateDocuments()
|
|
|
|
const value = {
|
|
id: '',
|
|
documents,
|
|
groups,
|
|
getSelectedDocument,
|
|
requestAddArea,
|
|
requestAddDocument,
|
|
requestAddDocumentGroup,
|
|
selectedDocumentId,
|
|
setSelectedDocumentId,
|
|
}
|
|
|
|
return <ProjectContext.Provider value={value}>
|
|
{ children }
|
|
</ProjectContext.Provider>
|
|
} |