source: chapterx-frontend/src/components/DevSwitcher.tsx@ a7550ca

main
Last change on this file since a7550ca was b62cefc, checked in by kikisrbinoska <srbinoskakristina07@…>, 4 months ago

Added frontend and imporoved AI Suggestions service

  • Property mode set to 100644
File size: 3.6 KB
Line 
1import React, { useState } from 'react'
2import { Code2, X, User } from 'lucide-react'
3import { useAuthStore } from '../store/authStore'
4import { Avatar } from './ui/Avatar'
5import { RoleBadge } from './ui/Badge'
6import { useUIStore } from '../store/uiStore'
7
8const 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
17export 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}
Note: See TracBrowser for help on using the repository browser.