feat: session with current user

This commit is contained in:
2024-02-06 12:50:00 -06:00
parent 7696c4f371
commit c21617aec3
3 changed files with 49 additions and 25 deletions
+25 -17
View File
@@ -1,33 +1,41 @@
'use client' 'use client'
import { useAppDispatch } from '@/hooks/useAppDispatch' import { useAppDispatch } from '@/hooks/useAppDispatch'
import { useAppSelector } from '@/hooks/useAppSelector' import { useAppSelector } from '@/hooks/useAppSelector'
import { setSession, setStatus } from '@/state/sessionSlice' import { setCurrentUser, setSession, setStatus } from '@/state/sessionSlice'
import { AppwriteException } from 'appwrite' import { AppwriteException } from 'appwrite'
import { getSession } from 'entgamers-database/frontend/session' import { getCurrentUser, getSession } from 'entgamers-database/frontend/session'
import { useEffect, type FC } from 'react' import { useCallback, useEffect, type FC } from 'react'
const SessionConsumer: FC = () => { const SessionConsumer: FC = () => {
const session = useAppSelector((state) => state.session) const session = useAppSelector((state) => state.session)
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
useEffect(() => { const ensureSession = useCallback(async () => {
if (session.status === 'initializing' && session.session === undefined) { try {
if (session.status !== 'initializing' || session.session !== undefined) return
dispatch(setStatus('loading')) dispatch(setStatus('loading'))
getSession('current') const currentSession = await getSession('current')
.then((session) => { const currentUser = await getCurrentUser()
dispatch(setSession(session)) dispatch(setSession(currentSession))
}) dispatch(setCurrentUser(currentUser))
.catch((error) => { } catch (error) {
if (error instanceof AppwriteException) { dispatch(setSession())
console.error(error) dispatch(setCurrentUser())
} throw error
}) } finally {
.finally(() => { dispatch(setStatus('idle'))
dispatch(setStatus('idle'))
})
} }
}, []) }, [])
useEffect(() => {
ensureSession()
.catch((error) => {
if (error instanceof AppwriteException) {
console.error(error)
}
})
}, [])
return ( return (
<> <>
</> </>
+4 -2
View File
@@ -7,10 +7,10 @@ import PasswordInput from '@/components/ui/form/PasswordInput'
import { useAppDispatch } from '@/hooks/useAppDispatch' import { useAppDispatch } from '@/hooks/useAppDispatch'
import { useAppSelector } from '@/hooks/useAppSelector' import { useAppSelector } from '@/hooks/useAppSelector'
import { addAlert } from '@/state/feedbackSlice' import { addAlert } from '@/state/feedbackSlice'
import { setSession, setStatus } from '@/state/sessionSlice' import { setCurrentUser, setSession, setStatus } from '@/state/sessionSlice'
import { nanoid } from '@reduxjs/toolkit' import { nanoid } from '@reduxjs/toolkit'
import { AppwriteException } from 'appwrite' import { AppwriteException } from 'appwrite'
import { login } from 'entgamers-database/frontend/session' import { getCurrentUser, login } from 'entgamers-database/frontend/session'
import { useFormik } from 'formik' import { useFormik } from 'formik'
import NextLink from 'next/link' import NextLink from 'next/link'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
@@ -41,7 +41,9 @@ const LoginForm: FC = () => {
dispatch(setStatus('loading')) dispatch(setStatus('loading'))
try { try {
const session = await login(email, password) const session = await login(email, password)
const user = await getCurrentUser()
dispatch(setSession(session)) dispatch(setSession(session))
dispatch(setCurrentUser(user))
} catch (error) { } catch (error) {
if (error instanceof AppwriteException) { if (error instanceof AppwriteException) {
dispatch(addAlert({ dispatch(addAlert({
+20 -6
View File
@@ -1,14 +1,16 @@
import { createSlice, type PayloadAction } from '@reduxjs/toolkit' import { createSlice, type PayloadAction } from '@reduxjs/toolkit'
import { type Models } from 'appwrite' import { type Models } from 'appwrite'
import { type UserWithPreferences } from 'entgamers-database/frontend/session'
export interface SessionState { export type SessionState =
| {
status: 'idle' | 'loading' | 'initializing' status: 'idle' | 'loading' | 'initializing'
session?: Models.Session session?: Models.Session
user?: UserWithPreferences
} }
const initialState: SessionState = { const initialState: SessionState = {
status: 'initializing', status: 'initializing'
session: undefined
} }
const sessionSlice = createSlice({ const sessionSlice = createSlice({
@@ -16,14 +18,26 @@ const sessionSlice = createSlice({
initialState, initialState,
reducers: { reducers: {
setStatus: (state, action: PayloadAction<SessionState['status']>) => { setStatus: (state, action: PayloadAction<SessionState['status']>) => {
state.status = action.payload return {
...state,
status: action.payload
}
}, },
setSession: (state, action: PayloadAction<SessionState['session']>) => { setSession: (state, action: PayloadAction<SessionState['session']>) => {
state.session = action.payload return {
...state,
session: action.payload
}
},
setCurrentUser: (state, action: PayloadAction<SessionState['user']>) => {
return {
...state,
userPreferences: action.payload
}
} }
} }
}) })
export const { setStatus, setSession } = sessionSlice.actions export const { setStatus, setSession, setCurrentUser } = sessionSlice.actions
export default sessionSlice export default sessionSlice