{"ast":null,"code":"import React,{createContext,useContext,useState,useEffect}from'react';import{authAPI}from'../services/api';import{jsx as _jsx}from\"react/jsx-runtime\";const AuthContext=/*#__PURE__*/createContext();export const useAuth=()=>{const context=useContext(AuthContext);if(!context){throw new Error('useAuth must be used within an AuthProvider');}return context;};export const AuthProvider=_ref=>{let{children}=_ref;const[user,setUser]=useState(null);const[loading,setLoading]=useState(true);useEffect(()=>{const token=localStorage.getItem('token');const savedUser=localStorage.getItem('user');if(token&&savedUser){try{setUser(JSON.parse(savedUser));}catch(e){console.error('解析用户信息失败:',e);}}setLoading(false);},[]);const login=async credentials=>{const response=await authAPI.login(credentials);const{token,user}=response.data;localStorage.setItem('token',token);localStorage.setItem('user',JSON.stringify(user));setUser(user);return response.data;};const logout=()=>{localStorage.removeItem('token');localStorage.removeItem('user');setUser(null);};const updateUser=userData=>{const updatedUser={...user,...userData};localStorage.setItem('user',JSON.stringify(updatedUser));setUser(updatedUser);};const hasPermission=role=>{if(!user)return false;if(user.role==='admin')return true;return user.role===role;};const isAdmin=()=>(user===null||user===void 0?void 0:user.role)==='admin';const isInvestmentManager=()=>['admin','investment_manager'].includes(user===null||user===void 0?void 0:user.role);return/*#__PURE__*/_jsx(AuthContext.Provider,{value:{user,login,logout,updateUser,loading,hasPermission,isAdmin,isInvestmentManager},children:children});};","map":{"version":3,"names":["React","createContext","useContext","useState","useEffect","authAPI","jsx","_jsx","AuthContext","useAuth","context","Error","AuthProvider","_ref","children","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"],"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":[]}