ModelMenu.svelte 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <script lang="ts">
  2. import { DropdownMenu } from 'bits-ui';
  3. import { flyAndScale } from '$lib/utils/transitions';
  4. import { getContext } from 'svelte';
  5. import Dropdown from '$lib/components/common/Dropdown.svelte';
  6. import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
  7. import Pencil from '$lib/components/icons/Pencil.svelte';
  8. import Tooltip from '$lib/components/common/Tooltip.svelte';
  9. import Tags from '$lib/components/chat/Tags.svelte';
  10. import Share from '$lib/components/icons/Share.svelte';
  11. import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
  12. import DocumentDuplicate from '$lib/components/icons/DocumentDuplicate.svelte';
  13. import ArrowDownTray from '$lib/components/icons/ArrowDownTray.svelte';
  14. import ArrowUpCircle from '$lib/components/icons/ArrowUpCircle.svelte';
  15. import { config } from '$lib/stores';
  16. import Link from '$lib/components/icons/Link.svelte';
  17. const i18n = getContext('i18n');
  18. export let user;
  19. export let model;
  20. export let shareHandler: Function;
  21. export let cloneHandler: Function;
  22. export let exportHandler: Function;
  23. export let copyLinkHandler: Function;
  24. export let hideHandler: Function;
  25. export let deleteHandler: Function;
  26. export let onClose: Function;
  27. let show = false;
  28. </script>
  29. <Dropdown
  30. bind:show
  31. on:change={(e) => {
  32. if (e.detail === false) {
  33. onClose();
  34. }
  35. }}
  36. >
  37. <Tooltip content={$i18n.t('More')}>
  38. <slot />
  39. </Tooltip>
  40. <div slot="content">
  41. <DropdownMenu.Content
  42. class="w-full max-w-[170px] rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-sm"
  43. sideOffset={-2}
  44. side="bottom"
  45. align="start"
  46. transition={flyAndScale}
  47. >
  48. <DropdownMenu.Item
  49. class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
  50. on:click={() => {
  51. hideHandler();
  52. }}
  53. >
  54. {#if model?.meta?.hidden ?? false}
  55. <svg
  56. xmlns="http://www.w3.org/2000/svg"
  57. fill="none"
  58. viewBox="0 0 24 24"
  59. stroke-width="1.5"
  60. stroke="currentColor"
  61. class="size-4"
  62. >
  63. <path
  64. stroke-linecap="round"
  65. stroke-linejoin="round"
  66. d="M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88"
  67. />
  68. </svg>
  69. {:else}
  70. <svg
  71. xmlns="http://www.w3.org/2000/svg"
  72. fill="none"
  73. viewBox="0 0 24 24"
  74. stroke-width="1.5"
  75. stroke="currentColor"
  76. class="size-4"
  77. >
  78. <path
  79. stroke-linecap="round"
  80. stroke-linejoin="round"
  81. d="M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z"
  82. />
  83. <path
  84. stroke-linecap="round"
  85. stroke-linejoin="round"
  86. d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
  87. />
  88. </svg>
  89. {/if}
  90. <div class="flex items-center">
  91. {#if model?.meta?.hidden ?? false}
  92. {$i18n.t('Show Model')}
  93. {:else}
  94. {$i18n.t('Hide Model')}
  95. {/if}
  96. </div>
  97. </DropdownMenu.Item>
  98. <DropdownMenu.Item
  99. class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
  100. on:click={() => {
  101. copyLinkHandler();
  102. }}
  103. >
  104. <Link />
  105. <div class="flex items-center">{$i18n.t('Copy Link')}</div>
  106. </DropdownMenu.Item>
  107. {#if $config?.features.enable_community_sharing}
  108. <DropdownMenu.Item
  109. class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
  110. on:click={() => {
  111. shareHandler();
  112. }}
  113. >
  114. <Share />
  115. <div class="flex items-center">{$i18n.t('Share')}</div>
  116. </DropdownMenu.Item>
  117. {/if}
  118. <DropdownMenu.Item
  119. class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
  120. on:click={() => {
  121. cloneHandler();
  122. }}
  123. >
  124. <DocumentDuplicate />
  125. <div class="flex items-center">{$i18n.t('Clone')}</div>
  126. </DropdownMenu.Item>
  127. <DropdownMenu.Item
  128. class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
  129. on:click={() => {
  130. exportHandler();
  131. }}
  132. >
  133. <ArrowDownTray />
  134. <div class="flex items-center">{$i18n.t('Export')}</div>
  135. </DropdownMenu.Item>
  136. <hr class="border-gray-100 dark:border-gray-850 my-1" />
  137. <DropdownMenu.Item
  138. class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
  139. on:click={() => {
  140. deleteHandler();
  141. }}
  142. >
  143. <GarbageBin strokeWidth="2" />
  144. <div class="flex items-center">{$i18n.t('Delete')}</div>
  145. </DropdownMenu.Item>
  146. </DropdownMenu.Content>
  147. </div>
  148. </Dropdown>