app.js 4.26 KB
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useAppStore = defineStore('app', () => {
  const currentUser = ref(null)
  const activities = ref([])
  const loading = ref(true)
  const error = ref(null)
  const registrations = ref([])
  const userMessages = ref([])

  // 初始化应用数据
  async function fetchInitialData() {
    try {
      loading.value = true

      // 获取用户数据
      const usersResponse = await fetch('/data/users.json')
      const usersData = await usersResponse.json()
      currentUser.value = usersData[0]

      // 获取活动数据
      const activitiesResponse = await fetch('/data/activities.json')
      const activitiesData = await activitiesResponse.json()
      activities.value = activitiesData

      // 获取报名数据
      const registrationsResponse = await fetch('/data/registrations.json')
      const registrationsData = await registrationsResponse.json()
      registrations.value = registrationsData

      // 获取消息数据
      const messagesResponse = await fetch('/data/messages.json')
      const messagesData = await messagesResponse.json()
      userMessages.value = messagesData

      loading.value = false
    } catch (err) {
      console.error('Failed to fetch initial data:', err)
      error.value = '加载应用数据失败,请稍后重试。'
      loading.value = false
    }
  }

  // 根据ID获取活动
  const getActivityById = computed(() => {
    return (activityId) => activities.value.find(activity => activity.id === activityId) || null
  })

  // 获取用户的报名记录
  const getUserRegistrations = computed(() => {
    return () => currentUser.value ? registrations.value.filter(reg => reg.user_id === currentUser.value.id) : []
  })

  // 报名活动
  function registerForActivity(activityId, formData) {
    if (!currentUser.value) return { success: false, error: '用户未登录' }

    const newRegistration = {
      id: `R${Math.floor(Math.random() * 10000).toString().padStart(4, '0')}`,
      activity_id: activityId,
      user_id: currentUser.value.id,
      registration_time: new Date().toISOString().replace('T', ' ').substring(0, 19),
      status: 'pending',
      custom_fields: formData.fields,
      custom_answers: formData.answers
    }

    registrations.value.push(newRegistration)
    return { success: true, registrationId: newRegistration.id }
  }

  // 创建新活动
  function createActivity(activityData) {
    if (!currentUser.value) return { success: false, error: '用户未登录' }

    const newActivity = {
      id: `A${Math.floor(Math.random() * 10000).toString().padStart(4, '0')}`,
      organizer_id: currentUser.value.id,
      organizer_name: currentUser.value.name,
      ...activityData,
      participant_count: 0,
      is_published: activityData.is_published || true,
      is_public: activityData.is_public || true,
    }

    activities.value.push(newActivity)
    return { success: true, activityId: newActivity.id }
  }

  // 活动签到
  function checkInForActivity(activityId, registrationId, method = 'manual') {
    if (!currentUser.value) return { success: false, error: '用户未登录' }

    const checkinData = {
      id: `C${Math.floor(Math.random() * 10000).toString().padStart(4, '0')}`,
      activity_id: activityId,
      user_id: currentUser.value.id,
      registration_id: registrationId,
      checkin_time: new Date().toISOString().replace('T', ' ').substring(0, 19),
      checkin_type: method,
      status: 'successful',
      is_late: false
    }

    return { success: true, checkin: checkinData }
  }

  // 获取用户消息
  const getUserMessages = computed(() => {
    return () => currentUser.value ? userMessages.value.filter(msg => msg.recipient_id === currentUser.value.id) : []
  })

  // 切换消息已读状态
  function toggleMessageReadStatus(messageId) {
    userMessages.value = userMessages.value.map(msg =>
      msg.id === messageId
        ? { ...msg, read_status: !msg.read_status }
        : msg
    )
  }

  return {
    currentUser,
    activities,
    loading,
    error,
    registrations,
    userMessages,
    fetchInitialData,
    getActivityById,
    getUserRegistrations,
    registerForActivity,
    createActivity,
    checkInForActivity,
    getUserMessages,
    toggleMessageReadStatus
  }
})