<script lang="ts"> import { getContext, onMount } from 'svelte'; import { models, config } from '$lib/stores'; import { toast } from 'svelte-sonner'; import { deleteSharedChatById, getChatById, shareChatById } from '$lib/apis/chats'; import { copyToClipboard } from '$lib/utils'; import Modal from '../common/Modal.svelte'; import Link from '../icons/Link.svelte'; export let chatId; let chat = null; let shareUrl = null; const i18n = getContext('i18n'); const shareLocalChat = async () => { const _chat = chat; const sharedChat = await shareChatById(localStorage.token, chatId); shareUrl = `${window.location.origin}/s/${sharedChat.id}`; console.log(shareUrl); chat = await getChatById(localStorage.token, chatId); return shareUrl; }; const shareChat = async () => { const _chat = chat.chat; console.log('share', _chat); toast.success($i18n.t('Redirecting you to OpenWebUI Community')); const url = 'https://openwebui.com'; // const url = 'http://localhost:5173'; const tab = await window.open(`${url}/chats/upload`, '_blank'); window.addEventListener( 'message', (event) => { if (event.origin !== url) return; if (event.data === 'loaded') { tab.postMessage( JSON.stringify({ chat: _chat, models: $models.filter((m) => _chat.models.includes(m.id)) }), '*' ); } }, false ); }; export let show = false; const isDifferentChat = (_chat) => { if (!chat) { return true; } if (!_chat) { return false; } return chat.id !== _chat.id || chat.share_id !== _chat.share_id; }; $: if (show) { (async () => { if (chatId) { const _chat = await getChatById(localStorage.token, chatId); if (isDifferentChat(_chat)) { chat = _chat; } } else { chat = null; console.log(chat); } })(); } </script> <Modal bind:show size="sm"> <div> <div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-0.5"> <div class=" text-lg font-medium self-center">{$i18n.t('Share Chat')}</div> <button class="self-center" on:click={() => { show = false; }} > <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" > <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" /> </svg> </button> </div> {#if chat} <div class="px-5 pt-4 pb-5 w-full flex flex-col justify-center"> <div class=" text-sm dark:text-gray-300 mb-1"> {#if chat.share_id} <a href="/s/{chat.share_id}" target="_blank" >{$i18n.t('You have shared this chat')} <span class=" underline">{$i18n.t('before')}</span>.</a > {$i18n.t('Click here to')} <button class="underline" on:click={async () => { const res = await deleteSharedChatById(localStorage.token, chatId); if (res) { chat = await getChatById(localStorage.token, chatId); } }} >{$i18n.t('delete this link')} </button> {$i18n.t('and create a new shared link.')} {:else} {$i18n.t( "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat." )} {/if} </div> <div class="flex justify-end"> <div class="flex flex-col items-end space-x-1 mt-1.5"> <div class="flex gap-1"> {#if $config?.features.enable_community_sharing} <button class=" self-center px-3.5 py-2 rounded-xl text-sm font-medium bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white" type="button" on:click={() => { shareChat(); show = false; }} > {$i18n.t('Share to OpenWebUI Community')} </button> {/if} <button class=" self-center flex items-center gap-1 px-3.5 py-2 rounded-xl text-sm font-medium bg-emerald-600 hover:bg-emerald-500 text-white" type="button" id="copy-and-share-chat-button" on:click={async () => { const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); if (isSafari) { // Oh, Safari, you're so special, let's give you some extra love and attention console.log('isSafari'); const getUrlPromise = async () => { const url = await shareLocalChat(); return new Blob([url], { type: 'text/plain' }); }; navigator.clipboard .write([ new ClipboardItem({ 'text/plain': getUrlPromise() }) ]) .then(() => { console.log('Async: Copying to clipboard was successful!'); return true; }) .catch((error) => { console.error('Async: Could not copy text: ', error); return false; }); } else { copyToClipboard(await shareLocalChat()); } toast.success($i18n.t('Copied shared chat URL to clipboard!')); show = false; }} > <Link /> {#if chat.share_id} {$i18n.t('Update and Copy Link')} {:else} {$i18n.t('Copy Link')} {/if} </button> </div> </div> </div> </div> {/if} </div> </Modal>