PageSourceSearch

https://kanvo.ai/assets/SaveSender-Dc53QaE4.js

js kanvo.ai collected 2026-10-05 12:19:47 UTC 2,756 bytes, 1 lines download raw bytes

1import{j as u,r as i,s as l,a1 as p}from"./index-CyV9aJqm.js";import{c as I}from"./dropdown-menu-DK9YJd9_.js";import{U as $}from"./user-plus-B-PAM72x.js";import"./index-DVqKCrim.js";import"./index-BA7E567d.js";import"./component-C_jfQAm5.js";import"./index-DBqDUzce.js";import"./chevron-right-BWPdaLPy.js";import"./check-DhJPFTEW.js";import"./circle-DuTmMPzJ.js";const g=["whatsapp","instagram","messenger"];function s(r){if(typeof r!="string")return null;const t=r.trim();return t||null}function k(r){return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}function x(r,t,e){if(!r||!g.includes(r)||!s(t))return null;const n=t;return{platform:r,platformId:n,name:s(e)??n.trim()}}function j(r,t){const e=k(t);switch(r){case"discord":{const n=s(e.discord_user_id);return n?{platform:r,platformId:n,name:s(e.discord_username)??`Discord user ${n}`}:null}case"slack":{const n=s(e.slack_user);return n?{platform:r,platformId:n,name:`Slack user ${n}`}:null}default:return null}}function y(r,t){return t.some(e=>e.platform===r.platform&&e.platform_id===r.platformId)}function v(r){return{name:r.name,platform:r.platform,platform_id:r.platformId}}async function w(r){const{data:t,error:e}=await l.from("contacts").select("platform, platform_id").eq("platform",r);if(e)throw e;return t??[]}const c=new Map;function A(r,t){const e=`${r}:${t}`,n=c.get(e);if(n)return n;const a=w(t).catch(o=>{throw c.delete(e),o});return c.set(e,a),a}function E(r,t){const e=`${r}:${t.platform}`,n=c.get(e);n&&c.set(e,n.then(a=>[...a,{platform:t.platform,platform_id:t.platformId}]))}function R(r,t){const[e,n]=i.useState(null);return i.useEffect(()=>{if(!t)return;let a=!1;return A(r,t.platform).then(o=>{a||n(y(t,o))},()=>{}),()=>{a=!0}},[r,t==null?void 0:t.platform,t==null?void 0:t.platformId]),t?e:null}function P({conversationId:r,person:t,label:e,saved:n}){const a=R(r,t),[o,f]=i.useState(!1),S=i.useCallback(async()=>{var d;f(!0);try{const{data:_}=await l.auth.getSession(),m=(d=_.session)==null?void 0:d.user.id;if(!m)throw new Error("nobody is signed in");const b=await w(t.platform);if(!y(t,b)){const{error:h}=await l.from("contacts").insert({user_id:m,...v(t)});if(h)throw h}E(r,t),p.success(`${t.name} is in your contacts.`)}catch{p.error("That contact could not be saved.")}finally{f(!1)}},[r,t]);return a===null?null:u.jsxs(I,{disabled:a||o,onSelect:()=>void S(),children:[u.jsx($,{className:"mr-2 h-4 w-4","aria-hidden":"true"}),a?n:e]})}function H({conversation:r,message:t}){const e=t?t.direction==="outbound"?null:j(r.platform,t.metadata):x(r.platform,r.platform_conversation_id,r.title);return e?u.jsx(P,{conversationId:r.id,person:e,label:t?`Save ${e.name}`:"Add to contacts",saved:t?`${e.name} is in your contacts`:"In your contacts"}):null}export{H as SaveSender};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.