import { pageEffect, bindPageTitle, onPageShow } from "/js/router.js"; import { html, render } from "/js/lib/lit-html.js"; import { headerTemplate } from "/js/templates/header.template.js"; import { displayRelativeTime } from "/js/utils.js"; import { getConvoPreviewText, getDisplayName, getGroupConvoDetails, getGroupConvoOwner, MISSING_HANDLE, } from "/js/dataHelpers.js"; import { avatarTemplate } from "/js/templates/avatar.template.js"; import { avatarGroupTemplate } from "/js/templates/avatarGroup.template.js"; import { knownFollowersSummaryTemplate } from "/js/templates/knownFollowersSummary.template.js"; import { showToast } from "/js/toasts.js"; import "/js/components/container-link.js"; import "/js/components/infinite-scroll-container.js"; import { tryAgainButtonTemplate } from "/js/templates/tryAgainButton.template.js"; export default async function chatRequestsView({ root, router, layout, context: { auth, dataLayer }, }) { await auth.requireAuth(); async function handleAccept(convo) { try { await dataLayer.mutations.acceptConvo(convo); // on accept, navigate to the chat detail page window.router.go(`/messages/${convo.id}`); } catch (error) { console.error(error); showToast("Failed to accept chat request", { style: "error" }); } } async function handleReject(convo) { try { await dataLayer.mutations.rejectConvo(convo); } catch (error) { console.error(error); showToast("Failed to reject chat request", { style: "error" }); } } function requestItemTemplate({ convo }) { const groupDetails = getGroupConvoDetails(convo); const currentUser = dataLayer.derived.$currentUser.get(); const lastMessage = convo.lastMessage; const otherMembers = convo.members.filter( (member) => member.did !== currentUser?.did, ); const otherMember = groupDetails ? null : otherMembers[0]; const timeAgo = lastMessage ? displayRelativeTime(lastMessage.sentAt) : ""; const messagePreview = lastMessage ? getConvoPreviewText(lastMessage, { currentUser, convo, profiles: dataLayer.derived.$convoProfiles.get(convo.id), }) : "No messages yet"; const canAccept = !groupDetails || groupDetails.lockStatus === "unlocked"; return html`
${(() => { if (groupDetails) { return avatarGroupTemplate({ authors: otherMembers }); } return otherMember ? avatarTemplate({ author: otherMember }) : html`
`; })()}
${groupDetails ? groupDetails.name : getDisplayName(otherMember)}
${timeAgo ? html`
${timeAgo}
` : ""}
${!groupDetails && otherMember?.handle && otherMember?.handle !== MISSING_HANDLE ? `@${otherMember.handle}` : ""}
${messagePreview}
${(() => { if (!groupDetails) { return html`
${knownFollowersSummaryTemplate({ profile: otherMember, showPlaceholder: true, })}
`; } const groupOwner = getGroupConvoOwner(convo); return groupOwner ? html`
${getDisplayName(groupOwner)} added you
` : ""; })()}
${canAccept ? html`` : ""}
`; } function requestSkeletonTemplate() { return html` ${Array.from({ length: 3 }).map( () => html`
`, )} `; } function requestsTemplate({ requests, hasMore }) { if (requests.length === 0) { return html`
No chat requests
`; } return html` { if (hasMore) { await dataLayer.requests.loadConvoRequestList(); e.detail.resume(); } }} >
${requests.map((convo) => requestItemTemplate({ convo }))} ${hasMore ? requestSkeletonTemplate() : ""}
`; } function requestsErrorTemplate({ error }) { console.error(error); return html`
There was an error loading chat requests.
${tryAgainButtonTemplate()}
`; } bindPageTitle(root, () => "Chat request inbox"); pageEffect(root, () => { const chatRequests = dataLayer.derived.$convoRequestList.get(); const requestsStatus = dataLayer.requests.statusStore.$statuses.get( "loadConvoRequestList", ); const cursor = dataLayer.derived.$convoRequestListCursor.get(); const hasMore = !!cursor; render( html`
${headerTemplate({ title: "Chat requests", showLoadingSpinner: requestsStatus.loading && !!chatRequests, backButtonFallbackRoute: "/messages", })}
${(() => { if (requestsStatus.error) { return requestsErrorTemplate({ error: requestsStatus.error, }); } else if (chatRequests) { return requestsTemplate({ requests: chatRequests, hasMore, }); } else { return requestSkeletonTemplate(); } })()}
`, root, ); }); function loadPageData() { dataLayer.requests.loadConvoRequestList({ reload: true }); } onPageShow(root, ({ action }) => { if (action === "restore") return; loadPageData(); }); }