Compare commits
	
		
			1 Commits
		
	
	
		
			main
			...
			session-re
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b1880a41f2 | 
@ -2,23 +2,28 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { Popover, Transition } from '@headlessui/react'
 | 
					import { Popover, Transition } from '@headlessui/react'
 | 
				
			||||||
import { ChevronDownIcon, FolderArrowDownIcon, FolderOpenIcon, FolderPlusIcon } from '@heroicons/react/20/solid'
 | 
					import { ChevronDownIcon, FolderArrowDownIcon, FolderOpenIcon, FolderPlusIcon } from '@heroicons/react/20/solid'
 | 
				
			||||||
import { Fragment, useState } from 'react'
 | 
					import { Fragment, useEffect, useState } from 'react'
 | 
				
			||||||
import { useNavigation } from '../../context/Navigation/provider'
 | 
					import { useNavigation } from '../../context/Navigation/provider'
 | 
				
			||||||
import { mainPages } from '../../context/Navigation/types'
 | 
					import { mainPages } from '../../context/Navigation/types'
 | 
				
			||||||
import { useProject } from '../../context/Project/provider'
 | 
					// import { useProject } from '../../context/Project/provider'
 | 
				
			||||||
import { GetAllLocalProjects } from '../../wailsjs/wailsjs/go/ipc/Channel'
 | 
					import { GetAllLocalProjects } from '../../wailsjs/wailsjs/go/ipc/Channel'
 | 
				
			||||||
import { entities } from '../../wailsjs/wailsjs/go/models'
 | 
					import { entities } from '../../wailsjs/wailsjs/go/models'
 | 
				
			||||||
import NewProjectModal from './NewProjectModal'
 | 
					import NewProjectModal from './NewProjectModal'
 | 
				
			||||||
import ProjectListModal from './ProjectListModal'
 | 
					import ProjectListModal from './ProjectListModal'
 | 
				
			||||||
 | 
					import { useDispatch, useSelector } from 'react-redux'
 | 
				
			||||||
 | 
					import { RootState } from '../../redux/store'
 | 
				
			||||||
 | 
					import { createNewProject, requestSelectProjectByName } from '../../redux/features/session/sessionSlice'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MainProject = () => {
 | 
					const MainProject = () => {
 | 
				
			||||||
 | 
					  const dispatch = useDispatch()
 | 
				
			||||||
 | 
					  const { currentSession } = useSelector((state: RootState) => state.session)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [isNewProjectModalOpen, setIsNewProjectModalOpen] = useState(false)
 | 
					  const [isNewProjectModalOpen, setIsNewProjectModalOpen] = useState(false)
 | 
				
			||||||
  const [isProjectListModal, setIsProjectListModal] = useState(false)
 | 
					  const [isProjectListModal, setIsProjectListModal] = useState(false)
 | 
				
			||||||
  const [canPopoverBeOpen, setCanPopoverBeOpen] = useState(true)
 | 
					  const [canPopoverBeOpen, setCanPopoverBeOpen] = useState(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [availableProjects, setAvailableProjects] = useState<entities.Project[]>([])
 | 
					  const [availableProjects, setAvailableProjects] = useState<entities.Project[]>([])
 | 
				
			||||||
  const { createNewProject, requestSelectProjectByName } = useProject()
 | 
					  // const { createNewProject, requestSelectProjectByName } = useProject()
 | 
				
			||||||
  const { setSelectedMainPage } = useNavigation()
 | 
					  const { setSelectedMainPage } = useNavigation()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const buttonOptions = [
 | 
					  const buttonOptions = [
 | 
				
			||||||
@ -57,18 +62,25 @@ const MainProject = () => {
 | 
				
			|||||||
  const onCreateNewProjectHandler = async (projectName: string) => {
 | 
					  const onCreateNewProjectHandler = async (projectName: string) => {
 | 
				
			||||||
    setIsNewProjectModalOpen(false)
 | 
					    setIsNewProjectModalOpen(false)
 | 
				
			||||||
    setCanPopoverBeOpen(true)
 | 
					    setCanPopoverBeOpen(true)
 | 
				
			||||||
    await createNewProject(projectName)
 | 
					    dispatch(createNewProject(projectName))
 | 
				
			||||||
    setSelectedMainPage(mainPages.WORKSPACE)
 | 
					    // setSelectedMainPage(mainPages.WORKSPACE)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const onSelectProjectHandler = async (name: string) => {
 | 
					  const onSelectProjectHandler = async (name: string) => {
 | 
				
			||||||
    const successfulResponse = await requestSelectProjectByName(name)
 | 
					    // const successfulResponse = await requestSelectProjectByName(name)
 | 
				
			||||||
 | 
					    dispatch(requestSelectProjectByName(name))
 | 
				
			||||||
    setIsProjectListModal(false)
 | 
					    setIsProjectListModal(false)
 | 
				
			||||||
    setCanPopoverBeOpen(true)
 | 
					    setCanPopoverBeOpen(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (successfulResponse) setSelectedMainPage(mainPages.WORKSPACE)
 | 
					    // if (successfulResponse) setSelectedMainPage(mainPages.WORKSPACE)
 | 
				
			||||||
 | 
					    // setSelectedMainPage(mainPages.WORKSPACE)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    console.log('useEffect: ', currentSession?.project?.id)
 | 
				
			||||||
 | 
					    if (currentSession?.project?.id) setSelectedMainPage(mainPages.WORKSPACE)
 | 
				
			||||||
 | 
					  }, [currentSession?.project?.id])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return <main className=" text-gray-100 h-screen overflow-y-scroll">
 | 
					  return <main className=" text-gray-100 h-screen overflow-y-scroll">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    {isNewProjectModalOpen ? <NewProjectModal onCreateNewProjectHandler={onCreateNewProjectHandler} /> : ''}
 | 
					    {isNewProjectModalOpen ? <NewProjectModal onCreateNewProjectHandler={onCreateNewProjectHandler} /> : ''}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,13 +1,19 @@
 | 
				
			|||||||
import Search from '../utils/Search'
 | 
					import Search from '../utils/Search'
 | 
				
			||||||
import { useProject } from '../../context/Project/provider'
 | 
					// import { useProject } from '../../context/Project/provider'
 | 
				
			||||||
import { EnvelopeIcon } from '@heroicons/react/24/outline'
 | 
					import { EnvelopeIcon } from '@heroicons/react/24/outline'
 | 
				
			||||||
import UserAvatar from '../utils/UserAvatar'
 | 
					import UserAvatar from '../utils/UserAvatar'
 | 
				
			||||||
import { useRef, useState } from 'react'
 | 
					import { useEffect, useRef, useState } from 'react'
 | 
				
			||||||
import { useNavigation } from '../../context/Navigation/provider'
 | 
					import { useNavigation } from '../../context/Navigation/provider'
 | 
				
			||||||
import { mainPages } from '../../context/Navigation/types'
 | 
					import { mainPages } from '../../context/Navigation/types'
 | 
				
			||||||
 | 
					import { useDispatch, useSelector } from 'react-redux'
 | 
				
			||||||
 | 
					import { RootState } from '../../redux/store'
 | 
				
			||||||
 | 
					import { requestUpdateCurrentUser } from '../../redux/features/session/sessionSlice'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const User = () => {
 | 
					const User = () => {
 | 
				
			||||||
  const { currentSession, requestUpdateCurrentUser, requestChooseUserAvatar } = useProject()
 | 
					  const dispatch = useDispatch()
 | 
				
			||||||
 | 
					  const { currentSession } = useSelector((state: RootState) => state.session)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // const { requestUpdateCurrentUser, requestChooseUserAvatar } = useProject()
 | 
				
			||||||
  const { setSelectedMainPage } = useNavigation()
 | 
					  const { setSelectedMainPage } = useNavigation()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const firstNameRef = useRef<HTMLInputElement>(null)
 | 
					  const firstNameRef = useRef<HTMLInputElement>(null)
 | 
				
			||||||
@ -16,19 +22,20 @@ const User = () => {
 | 
				
			|||||||
  const [avatarPath, setAvatarPath] = useState(currentSession?.user?.avatarPath || '')
 | 
					  const [avatarPath, setAvatarPath] = useState(currentSession?.user?.avatarPath || '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const onSaveButtonClickHandler = async () => {
 | 
					  const onSaveButtonClickHandler = async () => {
 | 
				
			||||||
    await requestUpdateCurrentUser({
 | 
					    dispatch(requestUpdateCurrentUser({
 | 
				
			||||||
      localId: currentSession?.user?.localId,
 | 
					      localId: currentSession?.user?.localId,
 | 
				
			||||||
      firstName: firstNameRef?.current?.value,
 | 
					      firstName: firstNameRef?.current?.value,
 | 
				
			||||||
      lastName: lastNameRef?.current?.value,
 | 
					      lastName: lastNameRef?.current?.value,
 | 
				
			||||||
      email: emailRef?.current?.value,
 | 
					      email: emailRef?.current?.value,
 | 
				
			||||||
      avatarPath: avatarPath || ''
 | 
					      avatarPath: avatarPath || ''
 | 
				
			||||||
    })
 | 
					    }))
 | 
				
			||||||
    setSelectedMainPage(mainPages.WORKSPACE)
 | 
					    setSelectedMainPage(mainPages.WORKSPACE)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const onAvatarSelectButtonClickHandler = async () => {
 | 
					  const onAvatarSelectButtonClickHandler = async () => {
 | 
				
			||||||
    const chosenAvatarPath = await requestChooseUserAvatar()
 | 
					    // TODO: needs to have requestChooseUserAvatar method made in the slice
 | 
				
			||||||
    setAvatarPath(chosenAvatarPath)
 | 
					    // const chosenAvatarPath = await requestChooseUserAvatar()
 | 
				
			||||||
 | 
					    // setAvatarPath(chosenAvatarPath)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const onAvatarRemoveButtonClickHandler = () => {
 | 
					  const onAvatarRemoveButtonClickHandler = () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,7 @@ const Home: NextPage = () => {
 | 
				
			|||||||
  const { selectedMainPage } = useNavigation()
 | 
					  const { selectedMainPage } = useNavigation()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const renderSelectedMainPage = () => {
 | 
					  const renderSelectedMainPage = () => {
 | 
				
			||||||
 | 
					    console.log('selectedMainPage: ', selectedMainPage)
 | 
				
			||||||
    if (selectedMainPage === mainPages.SELECTPROJECT) return <MainProject />
 | 
					    if (selectedMainPage === mainPages.SELECTPROJECT) return <MainProject />
 | 
				
			||||||
    else if (selectedMainPage === mainPages.EDITUSER) return <User />
 | 
					    else if (selectedMainPage === mainPages.EDITUSER) return <User />
 | 
				
			||||||
    else if ((selectedMainPage === mainPages.WORKSPACE) && currentSession?.project?.id) {
 | 
					    else if ((selectedMainPage === mainPages.WORKSPACE) && currentSession?.project?.id) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										53
									
								
								frontend/redux/features/session/sessionSlice.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								frontend/redux/features/session/sessionSlice.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					import { createSlice } from '@reduxjs/toolkit'
 | 
				
			||||||
 | 
					import type { PayloadAction } from '@reduxjs/toolkit'
 | 
				
			||||||
 | 
					import { entities } from '../../../wailsjs/wailsjs/go/models'
 | 
				
			||||||
 | 
					import { CreateNewProject, GetCurrentSession, RequestChangeSessionProjectByName, RequestChooseUserAvatar, RequestUpdateCurrentUser } from '../../../wailsjs/wailsjs/go/ipc/Channel'
 | 
				
			||||||
 | 
					import { UserProps } from './types'
 | 
				
			||||||
 | 
					import { serialize } from '../../serialize'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = {
 | 
				
			||||||
 | 
					  currentSession: serialize(new entities.Session()) as entities.Session,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const sessionSlice = createSlice({
 | 
				
			||||||
 | 
					  name: 'session',
 | 
				
			||||||
 | 
					  initialState,
 | 
				
			||||||
 | 
					  reducers: {
 | 
				
			||||||
 | 
					    updateSession: (state, action: PayloadAction<undefined>) => {
 | 
				
			||||||
 | 
					      GetCurrentSession().then(response => {
 | 
				
			||||||
 | 
					        if (response) state.currentSession = response
 | 
				
			||||||
 | 
					      }).catch(console.error)
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    createNewProject: (state, action: PayloadAction<string>)=> {
 | 
				
			||||||
 | 
					      const newProjectName = action.payload
 | 
				
			||||||
 | 
					      CreateNewProject(newProjectName).then(createdSession => {
 | 
				
			||||||
 | 
					        if (createdSession) state.currentSession = serialize(createdSession)
 | 
				
			||||||
 | 
					      }).catch(console.error)
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    requestUpdateCurrentUser: (state, action: PayloadAction<UserProps>) => {
 | 
				
			||||||
 | 
					      const userProps = action.payload
 | 
				
			||||||
 | 
					      RequestUpdateCurrentUser(new entities.User(userProps)).then(updatedUser => {
 | 
				
			||||||
 | 
					        state.currentSession.user = serialize(updatedUser)
 | 
				
			||||||
 | 
					      }).catch(console.error)
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    requestSelectProjectByName: (state, action: PayloadAction<string>) => {
 | 
				
			||||||
 | 
					      const projectName = action.payload
 | 
				
			||||||
 | 
					      console.log('projectName: ', projectName)
 | 
				
			||||||
 | 
					      RequestChangeSessionProjectByName(projectName).then(success => {
 | 
				
			||||||
 | 
					        if (success) GetCurrentSession().then(response => {
 | 
				
			||||||
 | 
					          console.log(response)
 | 
				
			||||||
 | 
					          if (response) state.currentSession = serialize(response)
 | 
				
			||||||
 | 
					        }).catch(console.error)
 | 
				
			||||||
 | 
					      }).catch(console.error)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const {
 | 
				
			||||||
 | 
					  updateSession,
 | 
				
			||||||
 | 
					  createNewProject,
 | 
				
			||||||
 | 
					  requestUpdateCurrentUser,
 | 
				
			||||||
 | 
					  requestSelectProjectByName
 | 
				
			||||||
 | 
					} = sessionSlice.actions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default sessionSlice.reducer
 | 
				
			||||||
							
								
								
									
										9
									
								
								frontend/redux/features/session/types.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								frontend/redux/features/session/types.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					export type UserProps = {
 | 
				
			||||||
 | 
					  id?: string,
 | 
				
			||||||
 | 
					  localId?: string,
 | 
				
			||||||
 | 
					  firstName?: string,
 | 
				
			||||||
 | 
					  lastName?: string,
 | 
				
			||||||
 | 
					  avatarPath?: string,
 | 
				
			||||||
 | 
					  authToken?: string,
 | 
				
			||||||
 | 
					  email?: string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								frontend/redux/serialize.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								frontend/redux/serialize.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					const serialize = (value: unknown) => {
 | 
				
			||||||
 | 
					  return JSON.parse(JSON.stringify(value))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const deserialize = (value: Record<string, any>, constructor: any): any => {
 | 
				
			||||||
 | 
					  return constructor(value)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { serialize, deserialize }
 | 
				
			||||||
@ -2,11 +2,13 @@ import { configureStore } from '@reduxjs/toolkit'
 | 
				
			|||||||
import { setupListeners } from '@reduxjs/toolkit/dist/query'
 | 
					import { setupListeners } from '@reduxjs/toolkit/dist/query'
 | 
				
			||||||
import notificationQueueSlice from './features/notifications/notificationQueueSlice'
 | 
					import notificationQueueSlice from './features/notifications/notificationQueueSlice'
 | 
				
			||||||
import stageSlice from './features/stage/stageSlice'
 | 
					import stageSlice from './features/stage/stageSlice'
 | 
				
			||||||
 | 
					import sessionSlice from './features/session/sessionSlice'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const store = configureStore({
 | 
					export const store = configureStore({
 | 
				
			||||||
  reducer: {
 | 
					  reducer: {
 | 
				
			||||||
    notificationQueue: notificationQueueSlice,
 | 
					    notificationQueue: notificationQueueSlice,
 | 
				
			||||||
    stage: stageSlice,
 | 
					    stage: stageSlice,
 | 
				
			||||||
 | 
					    session: sessionSlice,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  middleware: (getDefaultMiddleware) => getDefaultMiddleware(),
 | 
					  middleware: (getDefaultMiddleware) => getDefaultMiddleware(),
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user