| [b62cefc] | 1 | import React, { useState } from 'react'
|
|---|
| 2 | import { Code2, X, User } from 'lucide-react'
|
|---|
| 3 | import { useAuthStore } from '../store/authStore'
|
|---|
| 4 | import { Avatar } from './ui/Avatar'
|
|---|
| 5 | import { RoleBadge } from './ui/Badge'
|
|---|
| 6 | import { useUIStore } from '../store/uiStore'
|
|---|
| 7 |
|
|---|
| 8 | const DEV_USERS = [
|
|---|
| 9 | { user_id: 0, username: 'Guest', name: 'Guest', role: 'guest' as const },
|
|---|
| 10 | { user_id: 1, username: 'admin_alex', name: 'Alex Admin', role: 'admin' as const },
|
|---|
| 11 | { user_id: 2, username: 'elena_writes', name: 'Elena Dimitrova', role: 'writer' as const },
|
|---|
| 12 | { user_id: 3, username: 'marco_author', name: 'Marco Rossi', role: 'writer' as const },
|
|---|
| 13 | { user_id: 4, username: 'sara_reader', name: 'Sara Petkovska', role: 'regular' as const },
|
|---|
| 14 | { user_id: 9, username: 'boris_writer', name: 'Boris Nikolov', role: 'writer' as const },
|
|---|
| 15 | ]
|
|---|
| 16 |
|
|---|
| 17 | export const DevSwitcher: React.FC = () => {
|
|---|
| 18 | const [open, setOpen] = useState(false)
|
|---|
| 19 | const { currentUser, switchUser } = useAuthStore()
|
|---|
| 20 | const { addToast } = useUIStore()
|
|---|
| 21 |
|
|---|
| 22 | const handleSwitch = (userId: number, name: string, role: string) => {
|
|---|
| 23 | switchUser(userId)
|
|---|
| 24 | addToast(`Switched to ${name} (${role})`)
|
|---|
| 25 | setOpen(false)
|
|---|
| 26 | }
|
|---|
| 27 |
|
|---|
| 28 | return (
|
|---|
| 29 | <div className="fixed bottom-6 left-6 z-[90]">
|
|---|
| 30 | {open && (
|
|---|
| 31 | <div className="absolute bottom-12 left-0 w-64 bg-slate-900 border border-indigo-500/30 rounded-2xl shadow-2xl overflow-hidden">
|
|---|
| 32 | <div className="flex items-center justify-between px-4 py-3 border-b border-slate-700 bg-indigo-500/10">
|
|---|
| 33 | <div className="flex items-center gap-2">
|
|---|
| 34 | <Code2 size={14} className="text-indigo-400" />
|
|---|
| 35 | <span className="text-indigo-300 text-xs font-semibold uppercase tracking-wide">Dev Switcher</span>
|
|---|
| 36 | </div>
|
|---|
| 37 | <button onClick={() => setOpen(false)} className="text-slate-400 hover:text-white">
|
|---|
| 38 | <X size={14} />
|
|---|
| 39 | </button>
|
|---|
| 40 | </div>
|
|---|
| 41 | <div className="p-2">
|
|---|
| 42 | {DEV_USERS.map(u => (
|
|---|
| 43 | <button
|
|---|
| 44 | key={u.user_id}
|
|---|
| 45 | onClick={() => handleSwitch(u.user_id, u.name, u.role)}
|
|---|
| 46 | className={`w-full flex items-center gap-3 px-3 py-2.5 rounded-xl transition-all ${
|
|---|
| 47 | (currentUser?.user_id === u.user_id) || (!currentUser && u.user_id === 0)
|
|---|
| 48 | ? 'bg-indigo-600/20 border border-indigo-500/40'
|
|---|
| 49 | : 'hover:bg-slate-800 border border-transparent'
|
|---|
| 50 | }`}
|
|---|
| 51 | >
|
|---|
| 52 | {u.user_id === 0 ? (
|
|---|
| 53 | <div className="w-8 h-8 rounded-full bg-slate-700 flex items-center justify-center">
|
|---|
| 54 | <User size={14} className="text-slate-400" />
|
|---|
| 55 | </div>
|
|---|
| 56 | ) : (
|
|---|
| 57 | <Avatar name={u.name} size="sm" />
|
|---|
| 58 | )}
|
|---|
| 59 | <div className="flex-1 text-left">
|
|---|
| 60 | <p className="text-white text-sm font-medium">{u.name}</p>
|
|---|
| 61 | <p className="text-slate-500 text-xs">@{u.username}</p>
|
|---|
| 62 | </div>
|
|---|
| 63 | <RoleBadge role={u.role} />
|
|---|
| 64 | </button>
|
|---|
| 65 | ))}
|
|---|
| 66 | </div>
|
|---|
| 67 | <div className="px-4 py-2 border-t border-slate-700 text-center">
|
|---|
| 68 | <p className="text-slate-600 text-xs">Development only</p>
|
|---|
| 69 | </div>
|
|---|
| 70 | </div>
|
|---|
| 71 | )}
|
|---|
| 72 |
|
|---|
| 73 | <button
|
|---|
| 74 | onClick={() => setOpen(!open)}
|
|---|
| 75 | className="w-10 h-10 rounded-xl bg-indigo-600 hover:bg-indigo-500 text-white flex items-center justify-center shadow-lg hover:shadow-indigo-500/25 transition-all hover:scale-110 border border-indigo-500"
|
|---|
| 76 | title="Dev User Switcher"
|
|---|
| 77 | >
|
|---|
| 78 | <Code2 size={16} />
|
|---|
| 79 | </button>
|
|---|
| 80 | </div>
|
|---|
| 81 | )
|
|---|
| 82 | }
|
|---|