{"ast":null,"code":"var _jsxFileName = \"/Users/nili/Documents/trae_projects/client/src/contexts/AuthContext.js\",\n  _s = $RefreshSig$(),\n  _s2 = $RefreshSig$();\nimport React, { createContext, useContext, useState, useEffect } from 'react';\nimport { authAPI } from '../services/api';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst AuthContext = /*#__PURE__*/createContext();\nexport const useAuth = () => {\n  _s();\n  const context = useContext(AuthContext);\n  if (!context) {\n    throw new Error('useAuth must be used within an AuthProvider');\n  }\n  return context;\n};\n_s(useAuth, \"b9L3QQ+jgeyIrH0NfHrJ8nn7VMU=\");\nexport const AuthProvider = ({\n  children\n}) => {\n  _s2();\n  const [user, setUser] = useState(null);\n  const [loading, setLoading] = useState(true);\n  useEffect(() => {\n    const token = localStorage.getItem('token');\n    const savedUser = localStorage.getItem('user');\n    if (token && savedUser) {\n      try {\n        setUser(JSON.parse(savedUser));\n      } catch (e) {\n        console.error('解析用户信息失败:', e);\n      }\n    }\n    setLoading(false);\n  }, []);\n  const login = async credentials => {\n    const response = await authAPI.login(credentials);\n    const {\n      token,\n      user\n    } = response.data;\n    localStorage.setItem('token', token);\n    localStorage.setItem('user', JSON.stringify(user));\n    setUser(user);\n    return response.data;\n  };\n  const logout = () => {\n    localStorage.removeItem('token');\n    localStorage.removeItem('user');\n    setUser(null);\n  };\n  const updateUser = userData => {\n    const updatedUser = {\n      ...user,\n      ...userData\n    };\n    localStorage.setItem('user', JSON.stringify(updatedUser));\n    setUser(updatedUser);\n  };\n  const hasPermission = role => {\n    if (!user) return false;\n    if (user.role === 'admin') return true;\n    return user.role === role;\n  };\n  const isAdmin = () => (user === null || user === void 0 ? void 0 : user.role) === 'admin';\n  const isInvestmentManager = () => ['admin', 'investment_manager'].includes(user === null || user === void 0 ? void 0 : user.role);\n  return /*#__PURE__*/_jsxDEV(AuthContext.Provider, {\n    value: {\n      user,\n      login,\n      logout,\n      updateUser,\n      loading,\n      hasPermission,\n      isAdmin,\n      isInvestmentManager\n    },\n    children: children\n  }, void 0, false, {\n    fileName: _jsxFileName,\n    lineNumber: 62,\n    columnNumber: 5\n  }, this);\n};\n_s2(AuthProvider, \"NiO5z6JIqzX62LS5UWDgIqbZYyY=\");\n_c = AuthProvider;\nvar _c;\n$RefreshReg$(_c, \"AuthProvider\");","map":{"version":3,"names":["React","createContext","useContext","useState","useEffect","authAPI","jsxDEV","_jsxDEV","AuthContext","useAuth","_s","context","Error","AuthProvider","children","_s2","user","setUser","loading","setLoading","token","localStorage","getItem","savedUser","JSON","parse","e","console","error","login","credentials","response","data","setItem","stringify","logout","removeItem","updateUser","userData","updatedUser","hasPermission","role","isAdmin","isInvestmentManager","includes","Provider","value","fileName","_jsxFileName","lineNumber","columnNumber","_c","$RefreshReg$"],"sources":["/Users/nili/Documents/trae_projects/client/src/contexts/AuthContext.js"],"sourcesContent":["import React, { createContext, useContext, useState, useEffect } from 'react';\nimport { authAPI } from '../services/api';\n\nconst AuthContext = createContext();\n\nexport const useAuth = () => {\n  const context = useContext(AuthContext);\n  if (!context) {\n    throw new Error('useAuth must be used within an AuthProvider');\n  }\n  return context;\n};\n\nexport const AuthProvider = ({ children }) => {\n  const [user, setUser] = useState(null);\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    const token = localStorage.getItem('token');\n    const savedUser = localStorage.getItem('user');\n    if (token && savedUser) {\n      try {\n        setUser(JSON.parse(savedUser));\n      } catch (e) {\n        console.error('解析用户信息失败:', e);\n      }\n    }\n    setLoading(false);\n  }, []);\n\n  const login = async (credentials) => {\n    const response = await authAPI.login(credentials);\n    const { token, user } = response.data;\n    localStorage.setItem('token', token);\n    localStorage.setItem('user', JSON.stringify(user));\n    setUser(user);\n    return response.data;\n  };\n\n  const logout = () => {\n    localStorage.removeItem('token');\n    localStorage.removeItem('user');\n    setUser(null);\n  };\n\n  const updateUser = (userData) => {\n    const updatedUser = { ...user, ...userData };\n    localStorage.setItem('user', JSON.stringify(updatedUser));\n    setUser(updatedUser);\n  };\n\n  const hasPermission = (role) => {\n    if (!user) return false;\n    if (user.role === 'admin') return true;\n    return user.role === role;\n  };\n\n  const isAdmin = () => user?.role === 'admin';\n  const isInvestmentManager = () => ['admin', 'investment_manager'].includes(user?.role);\n\n  return (\n    <AuthContext.Provider value={{ user, login, logout, updateUser, loading, hasPermission, isAdmin, isInvestmentManager }}>\n      {children}\n    </AuthContext.Provider>\n  );\n};\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}