Spaces:
Build error
Build error
| <script lang="ts"> | |
| import { toast } from 'svelte-sonner'; | |
| import { getContext, onMount } from 'svelte'; | |
| const i18n = getContext('i18n'); | |
| import { removeMembersById } from '$lib/apis/channels'; | |
| import Spinner from '$lib/components/common/Spinner.svelte'; | |
| import Modal from '$lib/components/common/Modal.svelte'; | |
| import XMark from '$lib/components/icons/XMark.svelte'; | |
| import Hashtag from '../icons/Hashtag.svelte'; | |
| import Lock from '../icons/Lock.svelte'; | |
| import UserList from './ChannelInfoModal/UserList.svelte'; | |
| import AddMembersModal from './ChannelInfoModal/AddMembersModal.svelte'; | |
| export let show = false; | |
| export let channel: any = null; | |
| export let onUpdate = () => {}; | |
| let showAddMembersModal = false; | |
| const submitHandler = async () => {}; | |
| const hasPublicReadGrant = (grants: any) => | |
| Array.isArray(grants) && | |
| grants.some( | |
| (grant) => | |
| grant?.principal_type === 'user' && | |
| grant?.principal_id === '*' && | |
| grant?.permission === 'read' | |
| ); | |
| const isPublicChannel = (channel: any): boolean => { | |
| if (channel?.type === 'group') { | |
| if (typeof channel?.is_private === 'boolean') { | |
| return !channel.is_private; | |
| } | |
| return hasPublicReadGrant(channel?.access_grants); | |
| } | |
| return hasPublicReadGrant(channel?.access_grants); | |
| }; | |
| const removeMemberHandler = async (userId) => { | |
| const res = await removeMembersById(localStorage.token, channel.id, { | |
| user_ids: [userId] | |
| }).catch((error) => { | |
| toast.error(`${error}`); | |
| return null; | |
| }); | |
| if (res) { | |
| toast.success($i18n.t('Member removed successfully')); | |
| onUpdate(); | |
| } else { | |
| toast.error($i18n.t('Failed to remove member')); | |
| } | |
| }; | |
| const init = () => {}; | |
| $: if (show) { | |
| init(); | |
| } | |
| onMount(() => { | |
| init(); | |
| }); | |
| </script> | |
| {#if channel} | |
| <AddMembersModal bind:show={showAddMembersModal} {channel} {onUpdate} /> | |
| <Modal size="sm" bind:show> | |
| <div> | |
| <div class=" flex justify-between dark:text-gray-100 px-5 pt-4 mb-1.5"> | |
| <div class="self-center text-base"> | |
| <div class="flex items-center gap-0.5 shrink-0"> | |
| {#if channel?.type === 'dm'} | |
| <div class=" text-left self-center overflow-hidden w-full line-clamp-1 flex-1"> | |
| {$i18n.t('Direct Message')} | |
| </div> | |
| {:else} | |
| <div class=" size-4 justify-center flex items-center"> | |
| {#if isPublicChannel(channel)} | |
| <Hashtag className="size-3.5" strokeWidth="2.5" /> | |
| {:else} | |
| <Lock className="size-5.5" strokeWidth="2" /> | |
| {/if} | |
| </div> | |
| <div class=" text-left self-center overflow-hidden w-full line-clamp-1 flex-1"> | |
| {channel.name} | |
| </div> | |
| {/if} | |
| </div> | |
| </div> | |
| <button | |
| class="self-center" | |
| on:click={() => { | |
| show = false; | |
| }} | |
| > | |
| <XMark className={'size-5'} /> | |
| </button> | |
| </div> | |
| <div class="flex flex-col md:flex-row w-full px-3 pb-4 md:space-x-4 dark:text-gray-200"> | |
| <div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> | |
| <form | |
| class="flex flex-col w-full" | |
| on:submit={(e) => { | |
| e.preventDefault(); | |
| submitHandler(); | |
| }} | |
| > | |
| <div class="flex flex-col w-full h-full pb-2"> | |
| <UserList | |
| {channel} | |
| onAdd={channel?.type === 'group' && channel?.is_manager | |
| ? () => { | |
| showAddMembersModal = true; | |
| } | |
| : null} | |
| onRemove={channel?.type === 'group' && channel?.is_manager | |
| ? (userId) => { | |
| removeMemberHandler(userId); | |
| } | |
| : null} | |
| search={channel?.type !== 'dm'} | |
| sort={channel?.type !== 'dm'} | |
| /> | |
| </div> | |
| </form> | |
| </div> | |
| </div> | |
| </div> | |
| </Modal> | |
| {/if} | |