File size: 6,637 Bytes
78d0e31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
// lib/user-database.ts

export type UserRole = "guardian" | "healer" // Keep it simple as per original user DB

export interface BaseUser {
  id: string
  type: UserRole
  fullName: string
  email: string
  registeredAt: string // ISO date string
  profileImage?: string | null
}

export interface Guardian extends BaseUser {
  type: "guardian"
  country: string
  contributionAmount: string // Stored as string, might need parsing
  currency: string
  paymentMethod: string
  motivation: string
  impact: {
    donationsCount: number
    totalDonated: number // Sum of contributionAmounts
    healthWorkersSupported: number // Count of distinct healers supported
  }
  achievements?: Achievement[]
}

export interface Healer extends BaseUser {
  type: "healer"
  role: string // e.g., "Doctor", "Nurse", "Midwife"
  specialization?: string
  region: string // e.g., "East Africa"
  country: string
  city: string
  facilityName?: string
  experience: string // e.g., "5 years"
  credentials: string // Link or description
  walletAddress?: string
  bio?: string
  faceVerified: boolean
  licenseVerified: boolean
  verificationStatus: "pending" | "verified" | "rejected"
  impact: {
    patientsServed: number
    communitiesReached: number
    donationsReceived: number // Sum of donations from Guardians
  }
  achievements?: Achievement[]
}

export interface Achievement {
  id: string
  title: string
  description: string
  icon: string // Lucide icon name or path to image
  awardedAt: string // ISO date string
}

export type User = Guardian | Healer

// User database service using localStorage
export const UserDatabase = {
  // Get all users
  getAllUsers: (): User[] => {
    if (typeof window === "undefined") return []
    const users: User[] = []
    for (let i = 0; i < localStorage.length; i++) {
      const key = localStorage.key(i)
      if (key && key.startsWith("flameborn_user_")) {
        try {
          const userData = JSON.parse(localStorage.getItem(key) || "")
          users.push(userData)
        } catch (error) {
          console.error("Error parsing user data from localStorage:", error)
        }
      }
    }
    return users
  },

  // Get user by ID
  getUserById: (id: string): User | null => {
    if (typeof window === "undefined") return null
    try {
      const userData = localStorage.getItem(`flameborn_user_${id}`)
      return userData ? JSON.parse(userData) : null
    } catch (error) {
      console.error("Error getting user by ID from localStorage:", error)
      return null
    }
  },

  // Get current user ID from localStorage
  getCurrentUserId: (): string | null => {
    if (typeof window === "undefined") return null
    return localStorage.getItem("flameborn_current_user_id")
  },

  // Get current user
  getCurrentUser: (): User | null => {
    if (typeof window === "undefined") return null
    const currentUserId = UserDatabase.getCurrentUserId()
    if (!currentUserId) return null
    return UserDatabase.getUserById(currentUserId)
  },

  // Set current user ID in localStorage
  setCurrentUserId: (id: string | null): void => {
    if (typeof window === "undefined") return
    if (id) {
      localStorage.setItem("flameborn_current_user_id", id)
    } else {
      localStorage.removeItem("flameborn_current_user_id")
    }
  },

  // Save user
  saveUser: (user: User): boolean => {
    if (typeof window === "undefined") return false
    try {
      localStorage.setItem(`flameborn_user_${user.id}`, JSON.stringify(user))
      return true
    } catch (error) {
      console.error("Error saving user to localStorage:", error)
      return false
    }
  },

  // Update user
  updateUser: (id: string, updates: Partial<User>): User | null => {
    if (typeof window === "undefined") return null
    const user = UserDatabase.getUserById(id)
    if (!user) return null
    const updatedUser = { ...user, ...updates }
    UserDatabase.saveUser(updatedUser)
    // If current user is updated, reflect this if needed (though usually re-fetched)
    return updatedUser
  },

  // Delete user
  deleteUser: (id: string): boolean => {
    if (typeof window === "undefined") return false
    try {
      localStorage.removeItem(`flameborn_user_${id}`)
      if (UserDatabase.getCurrentUserId() === id) {
        UserDatabase.setCurrentUserId(null)
      }
      return true
    } catch (error) {
      console.error("Error deleting user from localStorage:", error)
      return false
    }
  },

  // Get all healers
  getAllHealers: (): Healer[] => {
    return UserDatabase.getAllUsers().filter((user) => user.type === "healer") as Healer[]
  },

  // Get all guardians
  getAllGuardians: (): Guardian[] => {
    return UserDatabase.getAllUsers().filter((user) => user.type === "guardian") as Guardian[]
  },

  // Add achievement to user
  addAchievement: (userId: string, achievement: Achievement): User | null => {
    const user = UserDatabase.getUserById(userId)
    if (!user) return null
    const achievements = user.achievements || []
    const updatedUser = {
      ...user,
      achievements: [...achievements, achievement],
    }
    UserDatabase.saveUser(updatedUser)
    return updatedUser
  },

  // Update user impact
  updateUserImpact: (userId: string, impact: Partial<Guardian["impact"] | Healer["impact"]>): User | null => {
    const user = UserDatabase.getUserById(userId)
    if (!user) return null
    const updatedUser = {
      ...user,
      impact: {
        ...user.impact,
        ...impact,
      },
    }
    UserDatabase.saveUser(updatedUser)
    return updatedUser
  },

  // Verify healer
  verifyHealer: (healerId: string, verified: boolean): Healer | null => {
    const healer = UserDatabase.getUserById(healerId) as Healer | null
    if (!healer || healer.type !== "healer") return null
    const updatedHealer = {
      ...healer,
      licenseVerified: verified, // Assuming licenseVerified is the primary flag
      verificationStatus: verified ? "verified" : "rejected", // Or "pending" if it's a step
    }
    UserDatabase.saveUser(updatedHealer)
    return updatedHealer
  },

  // Simulate login
  loginUser: (email: string /* password?: string */): User | null => {
    if (typeof window === "undefined") return null
    const users = UserDatabase.getAllUsers()
    const user = users.find((u) => u.email === email)
    // In a real app, you'd verify password here
    if (user) {
      UserDatabase.setCurrentUserId(user.id)
      return user
    }
    return null
  },

  // Simulate logout
  logoutUser: (): void => {
    if (typeof window === "undefined") return
    UserDatabase.setCurrentUserId(null)
  },
}