Yehoshua Sandler c49f8e4d07
refact: generalized back end structs (#1)
* refact: generalized back end structs

* refact: fixed front end type, removed dead code

* removed test image folder

* refact: removed dead structs
2023-05-26 19:23:35 -05:00

77 lines
2.8 KiB
TypeScript

'use client'
import { createContext, ReactNode, useContext, useEffect, useState } from 'react'
import { GetCurrentSession, GetDocuments, } from '../../wailsjs/wailsjs/go/ipc/Channel'
import { entities } from '../../wailsjs/wailsjs/go/models'
import { ProjectContextType, ProjectProps } from './types'
import makeDefaultProject from './makeDefaultProject'
import { saveDocuments } from '../../useCases/saveData'
import createAreaProviderMethods from './createAreaProviderMethods'
import createDocumentProviderMethods from './createDocumentMethods'
import createSessionProviderMethods from './createSessionProviderMethods'
import createUserMarkdownProviderMethods from './createUserMarkdownProviderMethods'
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<entities.Document[]>(projectProps.documents)
const [groups, setGroups] = useState<entities.Group[]>(projectProps.groups)
const [selectedAreaId, setSelectedAreaId] = useState<string>('')
const [selectedDocumentId, setSelectedDocumentId] = useState<string>('')
const [currentSession, setCurrentSession] = useState<entities.Session>(new entities.Session())
const updateDocuments = async () => {
const response = await GetDocuments()
const { documents, groups } = response
setDocuments(documents)
setGroups(groups)
return response
}
const updateSession = async () => {
const response = await GetCurrentSession()
if (response) setCurrentSession(response)
return response
}
const documentMethods = createDocumentProviderMethods({ documents, saveDocuments, updateDocuments, selectedDocumentId, groups })
const areaMethods = createAreaProviderMethods({ documents, updateDocuments, selectedDocumentId })
const sessionMethods = createSessionProviderMethods({ updateSession, updateDocuments })
const userMarkDownMethods = createUserMarkdownProviderMethods()
useEffect(() => {
if (!documents.length && !groups.length) updateDocuments()
}, [documents.length, groups.length])
useEffect(() => {
if ((!currentSession?.user?.localId || !currentSession?.user?.id)) {
updateSession()
}
}, [currentSession?.user?.localId, currentSession?.user?.id])
const value = {
id: '',
documents,
groups,
selectedAreaId,
setSelectedAreaId,
selectedDocumentId,
setSelectedDocumentId,
currentSession,
...areaMethods,
...documentMethods,
...sessionMethods,
...userMarkDownMethods,
}
return <ProjectContext.Provider value={value}>
{children}
</ProjectContext.Provider>
}