ConversasPesquisarView.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <script setup>
  2. import { computed, ref } from "vue";
  3. import { useRouter } from "vue-router";
  4. import LayoutSistema from "../../layout/LayoutSistema.vue";
  5. import BaseButton from "../../components/base/BaseButton.vue";
  6. import { useChat } from "../../composables/useChat.js";
  7. const router = useRouter();
  8. const {
  9. searchConversations,
  10. setActiveConversation,
  11. conversationsHasMore,
  12. conversationsLoading,
  13. loadMoreConversations
  14. } = useChat();
  15. const draftQuery = ref("");
  16. const query = ref("");
  17. const results = computed(() => searchConversations(query.value));
  18. function buscar() {
  19. query.value = String(draftQuery.value ?? "");
  20. }
  21. function abrirConversa(id) {
  22. setActiveConversation(id);
  23. router.push({ name: "home" });
  24. }
  25. </script>
  26. <template>
  27. <LayoutSistema>
  28. <section class="rounded-2xl border border-gray-200 bg-gray-100/50 p-4 shadow-sm backdrop-blur-md dark:border-gray-700 dark:bg-secondary/50">
  29. <h2 class="text-lg font-semibold text-gray-900 dark:text-gray-100">Pesquisar conversas</h2>
  30. <div class="mt-3 grid grid-cols-1 gap-2 min-[520px]:grid-cols-[1fr_120px]">
  31. <div class="relative">
  32. <svg
  33. class="pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400 dark:text-gray-500"
  34. viewBox="0 0 24 24"
  35. fill="none"
  36. stroke="currentColor"
  37. stroke-width="2"
  38. >
  39. <path stroke-linecap="round" stroke-linejoin="round" d="m21 21-4.35-4.35M17 10.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0Z" />
  40. </svg>
  41. <input
  42. v-model="draftQuery"
  43. placeholder="Buscar por título..."
  44. class="pl-9"
  45. @keydown.enter.prevent="buscar"
  46. />
  47. </div>
  48. <BaseButton :disabled="!draftQuery.trim()" @click="buscar">Buscar</BaseButton>
  49. </div>
  50. <div class="mt-2.5 flex items-center justify-between gap-3">
  51. <span class="text-sm text-gray-500 dark:text-gray-400">
  52. {{ query.trim() ? `${results.length} resultados` : "Digite para filtrar o histórico." }}
  53. </span>
  54. <button
  55. v-if="conversationsHasMore"
  56. type="button"
  57. class="shrink-0 text-xs text-primary underline-offset-2 hover:underline disabled:opacity-50"
  58. :disabled="conversationsLoading"
  59. @click="loadMoreConversations"
  60. >
  61. {{ conversationsLoading ? "Carregando..." : "Carregar mais conversas" }}
  62. </button>
  63. </div>
  64. <div class="mt-3 grid gap-2">
  65. <button
  66. v-for="c in results"
  67. :key="c.id"
  68. type="button"
  69. class="rounded-xl border border-gray-200 bg-background/60 p-3 text-left transition-colors hover:border-gray-500 dark:border-gray-700 dark:bg-background/10 dark:hover:border-gray-400"
  70. @click="abrirConversa(c.id)"
  71. >
  72. <div class="text-sm font-semibold text-gray-900 dark:text-gray-100">{{ c.title || "Nova conversa" }}</div>
  73. <div class="mt-1 text-xs text-gray-500 dark:text-gray-400">{{ c.messageCount ?? 0 }} msgs</div>
  74. </button>
  75. <div
  76. v-if="query.trim() && !results.length"
  77. class="flex flex-col items-center gap-3 py-8 text-center"
  78. >
  79. <div class="flex h-14 w-14 items-center justify-center rounded-2xl border border-dashed border-gray-300 dark:border-gray-600">
  80. <svg class="h-6 w-6 text-gray-400 dark:text-gray-500" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8">
  81. <path stroke-linecap="round" stroke-linejoin="round" d="m21 21-4.35-4.35M17 10.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0Z" />
  82. </svg>
  83. </div>
  84. <div class="text-sm font-medium text-gray-500 dark:text-gray-400">Nenhuma conversa encontrada</div>
  85. <div class="text-xs text-gray-400 dark:text-gray-500">Tente buscar por outro título.</div>
  86. </div>
  87. </div>
  88. </section>
  89. </LayoutSistema>
  90. </template>