OldPlaceholder.svelte 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <script lang="ts">
  2. import { WEBUI_BASE_URL } from '$lib/constants';
  3. import { marked } from 'marked';
  4. import { config, user, models as _models, temporaryChatEnabled } from '$lib/stores';
  5. import { onMount, getContext } from 'svelte';
  6. import { blur, fade } from 'svelte/transition';
  7. import Suggestions from '../MessageInput/Suggestions.svelte';
  8. import { sanitizeResponseContent } from '$lib/utils';
  9. import Tooltip from '$lib/components/common/Tooltip.svelte';
  10. import EyeSlash from '$lib/components/icons/EyeSlash.svelte';
  11. const i18n = getContext('i18n');
  12. export let modelIds = [];
  13. export let models = [];
  14. export let submitPrompt;
  15. let mounted = false;
  16. let selectedModelIdx = 0;
  17. $: if (modelIds.length > 0) {
  18. selectedModelIdx = models.length - 1;
  19. }
  20. $: models = modelIds.map((id) => $_models.find((m) => m.id === id));
  21. onMount(() => {
  22. mounted = true;
  23. });
  24. </script>
  25. {#key mounted}
  26. <div class="m-auto w-full max-w-6xl px-8 lg:px-20">
  27. <div class="flex justify-start">
  28. <div class="flex -space-x-4 mb-0.5" in:fade={{ duration: 200 }}>
  29. {#each models as model, modelIdx}
  30. <button
  31. on:click={() => {
  32. selectedModelIdx = modelIdx;
  33. }}
  34. >
  35. <Tooltip
  36. content={marked.parse(
  37. sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description ?? '')
  38. )}
  39. placement="right"
  40. >
  41. <img
  42. crossorigin="anonymous"
  43. src={model?.info?.meta?.profile_image_url ??
  44. ($i18n.language === 'dg-DG'
  45. ? `/doge.png`
  46. : `${WEBUI_BASE_URL}/static/favicon.png`)}
  47. class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
  48. alt="logo"
  49. draggable="false"
  50. />
  51. </Tooltip>
  52. </button>
  53. {/each}
  54. </div>
  55. </div>
  56. {#if $temporaryChatEnabled}
  57. <Tooltip
  58. content="This chat won't appear in history and your messages will not be saved."
  59. className="w-fit"
  60. placement="top-start"
  61. >
  62. <div class="flex items-center gap-2 text-gray-500 font-medium text-lg my-2 w-fit">
  63. <EyeSlash strokeWidth="2.5" className="size-5" /> Temporary Chat
  64. </div>
  65. </Tooltip>
  66. {/if}
  67. <div
  68. class=" mt-2 mb-4 text-3xl text-gray-800 dark:text-gray-100 font-medium text-left flex items-center gap-4 font-primary"
  69. >
  70. <div>
  71. <div class=" capitalize line-clamp-1" in:fade={{ duration: 200 }}>
  72. {#if models[selectedModelIdx]?.info}
  73. {models[selectedModelIdx]?.info?.name}
  74. {:else}
  75. {$i18n.t('Hello, {{name}}', { name: $user.name })}
  76. {/if}
  77. </div>
  78. <div in:fade={{ duration: 200, delay: 200 }}>
  79. {#if models[selectedModelIdx]?.info?.meta?.description ?? null}
  80. <div
  81. class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3 markdown"
  82. >
  83. {@html marked.parse(
  84. sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)
  85. )}
  86. </div>
  87. {#if models[selectedModelIdx]?.info?.meta?.user}
  88. <div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
  89. By
  90. {#if models[selectedModelIdx]?.info?.meta?.user.community}
  91. <a
  92. href="https://openwebui.com/m/{models[selectedModelIdx]?.info?.meta?.user
  93. .username}"
  94. >{models[selectedModelIdx]?.info?.meta?.user.name
  95. ? models[selectedModelIdx]?.info?.meta?.user.name
  96. : `@${models[selectedModelIdx]?.info?.meta?.user.username}`}</a
  97. >
  98. {:else}
  99. {models[selectedModelIdx]?.info?.meta?.user.name}
  100. {/if}
  101. </div>
  102. {/if}
  103. {:else}
  104. <div class=" font-medium text-gray-400 dark:text-gray-500 line-clamp-1 font-p">
  105. {$i18n.t('How can I help you today?')}
  106. </div>
  107. {/if}
  108. </div>
  109. </div>
  110. </div>
  111. <div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
  112. <Suggestions
  113. suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
  114. $config?.default_prompt_suggestions ??
  115. []}
  116. {submitPrompt}
  117. />
  118. </div>
  119. </div>
  120. {/key}