Files
happy-life-star/UniApp/src/stores/app.js
T
2026-02-27 11:32:50 +08:00

193 lines
4.3 KiB
JavaScript

import { reactive, computed, readonly } from 'vue'
import * as authService from '../services/auth.js'
import * as userProfileService from '../services/userProfile.js'
import * as lifeEventService from '../services/lifeEvent.js'
import * as epicScriptService from '../services/epicScript.js'
import * as lifePathService from '../services/lifePath.js'
const state = reactive({
isLoggedIn: false,
isLoading: false,
currentStep: 1,
userInfo: null,
userProfile: null,
events: [],
scripts: [],
paths: [],
currentPath: null,
registrationData: {
nickname: '',
gender: '',
mbti: '',
zodiac: '',
profession: '',
hobbies: [],
childhood: { date: '', text: '' },
joy: { date: '', text: '' },
low: { date: '', text: '' },
future: { vision: '', ideal: '' }
}
})
const hasProfile = computed(() => {
return state.userProfile && state.userProfile.nickname
})
const login = async (phone, smsCode) => {
state.isLoading = true
try {
const res = await authService.login({ phone, smsCode })
state.isLoggedIn = true
await fetchUserProfile()
return { success: true, hasProfile: hasProfile.value }
} catch (error) {
return { success: false, error: error.message }
} finally {
state.isLoading = false
}
}
const logout = async () => {
await authService.logout()
state.isLoggedIn = false
state.userInfo = null
state.userProfile = null
}
const fetchUserProfile = async () => {
try {
const res = await userProfileService.getCurrentProfile()
if (res.data) {
state.userProfile = userProfileService.transformToFrontendFormat(res.data)
Object.assign(state.registrationData, state.userProfile)
}
return res.data
} catch (error) {
return null
}
}
const saveUserProfile = async () => {
state.isLoading = true
try {
const dataToSave = { ...state.registrationData }
if (state.userProfile?.id) {
await userProfileService.updateProfile({
id: state.userProfile.id,
...dataToSave
})
} else {
await userProfileService.createProfile(dataToSave)
}
await fetchUserProfile()
return { success: true }
} catch (error) {
return { success: false, error: error.message }
} finally {
state.isLoading = false
}
}
const updateRegistration = (data) => {
Object.assign(state.registrationData, data)
}
const setCurrentStep = (step) => {
state.currentStep = step
}
const fetchEvents = async () => {
try {
const res = await lifeEventService.getEventList()
state.events = lifeEventService.transformListToFrontend(res.data || [])
return state.events
} catch (error) {
return []
}
}
const createEvent = async (eventData) => {
try {
await lifeEventService.createEvent(eventData)
await fetchEvents()
return { success: true }
} catch (error) {
return { success: false, error: error.message }
}
}
const fetchScripts = async () => {
try {
const res = await epicScriptService.getScriptList()
state.scripts = epicScriptService.transformListToFrontend(res.data || [])
return state.scripts
} catch (error) {
return []
}
}
const createScript = async (scriptData) => {
try {
await epicScriptService.createScript(scriptData)
await fetchScripts()
return { success: true }
} catch (error) {
return { success: false, error: error.message }
}
}
const selectScript = async (id) => {
try {
await epicScriptService.selectScript(id)
await fetchScripts()
return { success: true }
} catch (error) {
return { success: false, error: error.message }
}
}
const fetchPaths = async () => {
try {
const res = await lifePathService.getPathList()
state.paths = lifePathService.transformListToFrontend(res.data || [])
return state.paths
} catch (error) {
return []
}
}
const setCurrentPath = (path) => {
state.currentPath = path
}
const initialize = async () => {
const token = uni.getStorageSync('access_token')
if (token) {
state.isLoggedIn = true
await fetchUserProfile()
}
}
export const useAppStore = () => {
return readonly({
...state,
hasProfile,
login,
logout,
fetchUserProfile,
saveUserProfile,
updateRegistration,
setCurrentStep,
fetchEvents,
createEvent,
fetchScripts,
createScript,
selectScript,
fetchPaths,
setCurrentPath,
initialize
})
}
export default useAppStore