+page.svelte 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <script>
  2. import { Settings, Phone, Bell, HelpCircle, ShieldCheck } from 'lucide-svelte';
  3. import SlaConfigManager from '$lib/features/sla/SlaConfigManager.svelte';
  4. // Settings sections
  5. const settingsSections = [
  6. {
  7. title: 'Integrações',
  8. icon: Phone,
  9. items: [
  10. {
  11. title: 'WhatsApp Business',
  12. description: 'Configure sua conta do WhatsApp Business para comunicação',
  13. status: 'connected',
  14. action: 'gerenciar'
  15. },
  16. {
  17. title: 'WhatsApp dos Vendedores',
  18. description: 'Adicione os números de WhatsApp da equipe de vendas',
  19. status: 'partial',
  20. action: 'configurar',
  21. count: '3 de 5 configurados'
  22. }
  23. ]
  24. },
  25. {
  26. title: 'Notificações',
  27. icon: Bell,
  28. items: [
  29. {
  30. title: 'Alertas de Sentimento',
  31. description: 'Receba alertas sobre mudanças no sentimento dos clientes',
  32. status: 'enabled',
  33. action: 'configurar'
  34. },
  35. {
  36. title: 'Relatórios Diários',
  37. description: 'Receba relatórios automáticos por e-mail',
  38. status: 'disabled',
  39. action: 'ativar'
  40. }
  41. ]
  42. },
  43. {
  44. title: 'Suporte',
  45. icon: HelpCircle,
  46. items: [
  47. {
  48. title: 'Central de Ajuda',
  49. description: 'Acesse nossa documentação e tutoriais',
  50. status: 'available',
  51. action: 'acessar'
  52. },
  53. {
  54. title: 'Contato',
  55. description: 'Fale com nossa equipe de suporte',
  56. status: 'available',
  57. action: 'abrir chamado'
  58. }
  59. ]
  60. }
  61. ];
  62. function handleAction(item) {
  63. // Handle different actions based on item
  64. console.log(`Action: ${item.action} for ${item.title}`);
  65. // For WhatsApp integration, we could open a modal or navigate to a specific page
  66. if (item.title === 'WhatsApp Business') {
  67. // TODO: Open WhatsApp configuration modal
  68. } else if (item.title === 'WhatsApp dos Vendedores') {
  69. // TODO: Open sellers WhatsApp configuration
  70. }
  71. }
  72. function getStatusBadge(status) {
  73. const statusConfig = {
  74. connected: { text: 'Conectado', class: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400' },
  75. partial: { text: 'Parcial', class: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400' },
  76. enabled: { text: 'Ativo', class: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400' },
  77. disabled: { text: 'Inativo', class: 'bg-slate-100 text-slate-800 dark:bg-slate-900/30 dark:text-slate-400' },
  78. configured: { text: 'Configurado', class: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400' },
  79. available: { text: 'Disponível', class: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400' },
  80. dark: { text: 'Escuro', class: 'bg-slate-100 text-slate-800 dark:bg-slate-900/30 dark:text-slate-400' },
  81. 'pt-BR': { text: 'Português', class: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400' }
  82. };
  83. return statusConfig[status] || statusConfig.available;
  84. }
  85. </script>
  86. <div class="mx-auto max-w-[1600px] space-y-6">
  87. <!-- Header -->
  88. <div class="rounded-xl border border-slate-200 bg-white p-5 md:p-6 shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
  89. <div class="flex items-center gap-3">
  90. <div class="h-8 w-8 shrink-0 rounded-lg bg-indigo-500/20 text-indigo-500 flex items-center justify-center">
  91. <Settings size={20} strokeWidth={2.5} />
  92. </div>
  93. <h1 class="text-xl font-bold text-slate-900 dark:text-white">Configurações</h1>
  94. </div>
  95. <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">
  96. Gerencie as configurações do sistema, integrações e preferências da sua conta
  97. </p>
  98. </div>
  99. <!-- Settings Sections -->
  100. <div class="grid grid-cols-1 gap-6">
  101. {#each settingsSections as section}
  102. <div class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]">
  103. <!-- Section Header -->
  104. <div class="border-b border-slate-200 p-5 dark:border-slate-800">
  105. <div class="flex items-center gap-3">
  106. <div class="h-8 w-8 shrink-0 rounded-lg bg-slate-100 text-slate-600 flex items-center justify-center dark:bg-slate-800 dark:text-slate-400">
  107. <section.icon size={18} strokeWidth={2} />
  108. </div>
  109. <h2 class="text-lg font-semibold text-slate-900 dark:text-white">{section.title}</h2>
  110. </div>
  111. </div>
  112. <!-- Section Items -->
  113. <div class="divide-y divide-slate-200 dark:divide-slate-800">
  114. {#each section.items as item}
  115. <div class="p-5 hover:bg-slate-50 transition-colors duration-150 dark:hover:bg-slate-800/50">
  116. <div class="flex items-center justify-between">
  117. <div class="flex-1 min-w-0">
  118. <div class="flex items-center gap-3">
  119. <h3 class="text-sm font-medium text-slate-900 dark:text-white">{item.title}</h3>
  120. <span class="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium {getStatusBadge(item.status).class}">
  121. {getStatusBadge(item.status).text}
  122. </span>
  123. </div>
  124. <p class="mt-1 text-sm text-slate-600 dark:text-slate-400">{item.description}</p>
  125. {#if item.count}
  126. <p class="mt-1 text-xs text-amber-600 dark:text-amber-400">{item.count}</p>
  127. {/if}
  128. </div>
  129. <div class="ml-4">
  130. <button
  131. onclick={() => handleAction(item)}
  132. class="inline-flex items-center px-3 py-1.5 text-xs font-medium rounded-md bg-indigo-600 text-white hover:bg-indigo-700 transition-colors duration-150"
  133. >
  134. {item.action}
  135. </button>
  136. </div>
  137. </div>
  138. </div>
  139. {/each}
  140. </div>
  141. </div>
  142. {/each}
  143. </div>
  144. <!-- SLA / Tempo de Resposta -->
  145. <div
  146. class="rounded-xl border border-slate-200 bg-white shadow-sm transition-colors duration-200 dark:border-slate-800 dark:bg-[#161f30]"
  147. >
  148. <div class="border-b border-slate-200 p-5 dark:border-slate-800">
  149. <div class="flex items-center gap-3">
  150. <div
  151. class="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-400"
  152. >
  153. <ShieldCheck size={18} strokeWidth={2} />
  154. </div>
  155. <div>
  156. <h2 class="text-lg font-semibold text-slate-900 dark:text-white">SLA por Departamento</h2>
  157. <p class="text-sm text-slate-500 dark:text-slate-400">
  158. Tempos de primeira resposta e resolução, com status em tempo real
  159. </p>
  160. </div>
  161. </div>
  162. </div>
  163. <div class="p-5">
  164. <SlaConfigManager />
  165. </div>
  166. </div>
  167. </div>