PageSourceSearch

https://usplus.ai/assets/work-calendar-ChmsqHQS.js

js usplus.ai collected 2026-10-05 14:38:54 UTC 17,332 bytes, 1 lines download raw bytes

1import{j as e}from"./index-COia_u_c.js";import{u as se,d as oe,r as m,f as ie,h as le,e as ce,B as v,z as K,a as de,t as me,v as ue,w as pe}from"./error-boundary-f1in_24u.js";import{S as xe}from"./seo-CDtyH7-O.js";import{W as he}from"./work-shell-Bur3my86.js";import{C as $,a as E,b as fe,c as ge}from"./card-9FFZVsXh.js";import{B as Y}from"./badge-CRv2Uj06.js";import{S as N}from"./skeleton-3sAggrEZ.js";import{A as O,a as _,b as M}from"./alert-BPbEai_E.js";import{T as je,a as we,b as Z}from"./tabs-CgWSzHmc.js";import{S as ye,a as be,b as ve,c as Ne,d as ke}from"./select-BDI2_9d0.js";import{t as W}from"./analytics-DMp_eEpA.js";import{C as Se}from"./calendar-days-BRTFmq0j.js";import{C as Ce}from"./chevron-left-DmTucAKi.js";import{C as Te}from"./chevron-right-8XCGUmdI.js";import{S as q}from"./sparkles-L4bd8k5g.js";import{S as De}from"./shield-check-M2Vb-dGC.js";import{C as Ie}from"./clock-DVQnuqvU.js";import{M as Ae}from"./map-pin-B7UCUBKP.js";import{E as $e}from"./dialog-9oBKR2F0.js";import"./theme-toggle-BkVA7uAI.js";import"./moon-BBJRfaeF.js";import"./sun-2tBrnsEw.js";import"./live-session-context-oXSuMxCg.js";import"./useWorkUserRole-Ch1_NBOt.js";import"./breadcrumbs-Dbgw3lMa.js";import"./use-mobile-zhN_18s-.js";import"./sheet-BmtcUupL.js";import"./index-CGxBfI-N.js";import"./index-D_Zty-fI.js";import"./sidebar-Q-ILwD_u.js";import"./input-BMBT_4Bx.js";import"./separator-DC8uxkik.js";import"./panel-left-TLE_oDGu.js";import"./dropdown-menu-DS2u9Tkk.js";import"./index-Oe821wdH.js";import"./index-Pq_Csd98.js";import"./check-DAidKK12.js";import"./circle-vewocwsg.js";import"./live-session-modal-CkrwjPTa.js";import"./switch-DAKaF9nf.js";import"./index-BkY7P_Qy.js";import"./waveform-indicator-DiSZ9Uw8.js";import"./audio-lines-DDhlfwIS.js";import"./zap-D9FOghzu.js";import"./monitor-ClOxXU8F.js";import"./circle-check-BSwjpvpm.js";import"./plus-CWxxfO2Q.js";import"./thumbs-up-DATWNjlW.js";import"./thumbs-down-BES-Sozt.js";import"./wrench-jBcoNx3r.js";import"./history-C_zog-j6.js";import"./arrow-right-a3GVaBCx.js";import"./lock-BJrY6XHZ.js";import"./chevron-down-Es-EqAgM.js";import"./search-CVoZAhov.js";import"./globe-C07SmJr2.js";import"./calendar-zBoD77sr.js";import"./mail-C6ne6R6V.js";import"./message-square-7jvkyOEW.js";import"./phone-DO06vNU4.js";import"./bot-CHXDX-4s.js";import"./brain-Cp4Jwkst.js";import"./layout-dashboard-C0JGZID7.js";import"./list-checks-eAoJ50lb.js";import"./dollar-sign-DXAqPCZB.js";import"./credit-card-Bbepc1-g.js";import"./chart-column-DJwQW40I.js";import"./package-uYvbNAC8.js";import"./palette-BHPSmLXw.js";import"./building-2-CyA0Yi1V.js";import"./briefcase-ClxkdD6h.js";import"./layout-grid-dBAitVEQ.js";import"./network-xvJyeumO.js";import"./file-text-Bry3cdGt.js";import"./trophy-CbuK_nHV.js";import"./users-i5snUC6z.js";import"./settings-Ciq7jgd4.js";import"./circle-help-C4_4lwWE.js";import"./menu-B0bmwJPy.js";import"./log-out-DfWiNPh1.js";import"./ellipsis-BCHn6xZ1.js";import"./index-BdQq_4o_.js";import"./chevron-up-Va5e9fKM.js";const J="workCalendarTimezone";function Q(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"}catch{return"UTC"}}function Ee(){try{const t=window.localStorage.getItem(J);if(t&&t.trim().length>0)return t}catch{}return Q()}const Oe=["America/Los_Angeles","America/Denver","America/Chicago","America/New_York","America/Toronto","America/Mexico_City","America/Sao_Paulo","Europe/London","Europe/Berlin","Europe/Madrid","Europe/Athens","Africa/Johannesburg","Asia/Dubai","Asia/Kolkata","Asia/Singapore","Asia/Tokyo","Australia/Sydney","Pacific/Auckland","UTC"];function u(t,n){const a=new Intl.DateTimeFormat("en-CA",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(t)),i=o=>a.find(c=>c.type===o)?.value??"";return`${i("year")}-${i("month")}-${i("day")}`}function P(t,n,a){const i=new Intl.DateTimeFormat(void 0,{timeZone:a,hour:"numeric",minute:"2-digit"});return`${i.format(new Date(t))} – ${i.format(new Date(n))}`}function F(t,n){return new Intl.DateTimeFormat(void 0,{timeZone:n,weekday:"long",month:"long",day:"numeric",year:"numeric"}).format(t)}function _e(t,n){return new Intl.DateTimeFormat(void 0,{timeZone:n,month:"long",year:"numeric"}).format(t)}function L(t,n){return new Intl.DateTimeFormat(void 0,{timeZone:n,day:"numeric"}).format(t)}function R(t,n){return new Intl.DateTimeFormat(void 0,{timeZone:n,weekday:"short"}).format(t)}function Me(t,n){return new Intl.DateTimeFormat(void 0,{timeZone:n,timeZoneName:"short"}).formatToParts(t).find(i=>i.type==="timeZoneName")?.value??n}function C(t,n){const a=u(t.toISOString(),n);return new Date(`${a}T12:00:00Z`)}function x(t,n){const a=new Date(t);
1return a.setUTCDate(a.getUTCDate()+n),a}function V(t,n){const a=C(t,n),i=new Date(a).getUTCDay();return x(a,-i)}function Ze(t,n){const a=u(t.toISOString(),n),[i,o]=a.split("-").map(Number);return new Date(`${i}-${String(o).padStart(2,"0")}-01T12:00:00Z`)}function Pe(t,n){const a=u(t.toISOString(),n),[i,o]=a.split("-").map(Number),c=o===12?i+1:i,l=o===12?1:o+1;return new Date(`${c}-${String(l).padStart(2,"0")}-01T12:00:00Z`)}function Fe(t,n,a){if(n==="day"){const l=C(t,a);return{start:l,end:x(l,1)}}if(n==="week"){const l=V(t,a);return{start:l,end:x(l,7)}}const i=Ze(t,a);Pe(t,a);const o=V(i,a),c=x(o,42);return{start:o,end:c}}function H(t,n,a,i){if(n==="day")return x(t,a);if(n==="week")return x(t,a*7);const o=u(t.toISOString(),i),[c,l]=o.split("-").map(Number),h=l+a<1?c-1:l+a>12?c+1:c,d=((l-1+a)%12+12)%12+1;return new Date(`${h}-${String(d).padStart(2,"0")}-15T12:00:00Z`)}function U({event:t,tz:n,onClick:a,compact:i,asNonButton:o}){const c=t.source==="ai_outcome"?"border-l-4 border-l-teal-500":"border-l-4 border-l-muted-foreground/40",l=d=>{d.stopPropagation(),a(t)},h=d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),d.stopPropagation(),a(t))};if(i){const d="block w-full truncate rounded-sm px-1.5 py-0.5 text-left text-xs hover-elevate active-elevate-2 "+c,k=e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"font-medium",children:new Intl.DateTimeFormat(void 0,{timeZone:n,hour:"numeric",minute:"2-digit"}).format(new Date(t.start))})," ",e.jsx("span",{className:"text-muted-foreground",children:t.title})]});return o?e.jsx("div",{role:"button",tabIndex:0,onClick:l,onKeyDown:h,className:d,title:`${t.title} — ${P(t.start,t.end,n)}`,"data-testid":`button-event-compact-${t.id}`,children:k}):e.jsx("button",{type:"button",onClick:l,className:d,title:`${t.title} — ${P(t.start,t.end,n)}`,"data-testid":`button-event-compact-${t.id}`,children:k})}return e.jsxs("button",{type:"button",onClick:()=>a(t),className:"group flex w-full items-start gap-3 rounded-md border p-3 text-left hover-elevate active-elevate-2 "+c,"data-testid":`button-event-${t.id}`,children:[e.jsxs("div",{className:"min-w-0 flex-1 space-y-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium","data-testid":`text-event-title-${t.id}`,children:t.title}),t.source==="ai_outcome"&&e.jsxs(Y,{variant:"outline",className:"text-xs",children:[e.jsx(q,{className:"mr-1 h-3 w-3","aria-hidden":!0}),"AI booked"]}),t.verified&&t.outcomeId&&e.jsx(de,{delayDuration:150,children:e.jsxs(me,{children:[e.jsx(ue,{asChild:!0,children:e.jsxs("span",{className:"inline-flex items-center text-xs text-muted-foreground","data-testid":`badge-verified-${t.id}`,children:[e.jsx(De,{className:"mr-1 h-3 w-3 text-teal-600","aria-hidden":!0}),"Verified"]})}),e.jsxs(pe,{side:"top",children:["HMAC-chain verified outcome · ledger-backed.",e.jsx("br",{}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"Click the row to open the underlying outcome."})]})]})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-xs text-muted-foreground",children:[e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Ie,{className:"h-3 w-3","aria-hidden":!0}),P(t.start,t.end,n)]}),t.location&&e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(Ae,{className:"h-3 w-3","aria-hidden":!0}),t.location]}),t.labTitle&&e.jsx("span",{className:"truncate",children:t.labTitle}),t.customer&&e.jsx("span",{className:"truncate","data-testid":`text-event-customer-${t.id}`,children:t.customer})]})]}),t.source==="google_calendar"&&t.link&&e.jsx($e,{className:"mt-1 h-4 w-4 text-muted-foreground","aria-hidden":!0})]})}function ha(){const[,t]=se(),{toast:n}=oe(),[a,i]=m.useState(()=>Ee()),[o,c]=m.useState("month"),[l,h]=m.useState(()=>C(new Date,a));function d(r){i(r);try{window.localStorage.setItem(J,r)}catch{}}const k=m.useMemo(()=>{const r=Q(),s=new Set([r,a,...Oe]);return Array.from(s)},[a]);m.useEffect(()=>{W("calendar_viewed")},[]);const{start:g,end:z}=m.useMemo(()=>Fe(l,o,a),[l,o,a]),{data:y,isLoading:b,isError:X,refetch:ee}=ie({queryKey:["/api/work/calendar/unified",{start:g.toISOString(),end:z.toISOString()}],queryFn:async()=>
1{const r=new URLSearchParams({start:g.toISOString(),end:z.toISOString()}),s=await fetch(`/api/work/calendar/unified?${r}`,{credentials:"include"});if(!s.ok)throw new Error(`Calendar fetch failed (${s.status})`);return await s.json()}}),S=m.useMemo(()=>{const r=new Map;for(const s of y?.events??[]){const p=u(s.start,a);r.has(p)||r.set(p,[]),r.get(p).push(s)}for(const s of r.values())s.sort((p,j)=>p.start.localeCompare(j.start));return r},[y,a]),T=le({mutationFn:async()=>{const s=await(await ce("POST","/api/service-connections/google/initiate",{returnUrl:"/calendar"})).json();if(s.error)throw new Error(s.error);return s},onSuccess:r=>{r.authUrl&&(window.location.href=r.authUrl)},onError:r=>{n({title:"Couldn't start sign-in",description:r.message,variant:"destructive"})}});function D(r){if(W("calendar_event_clicked",{source:r.source,verified:r.verified}),r.source==="ai_outcome"&&r.instanceId){t(`/my-team/${r.instanceId}?tab=outcomes&outcome=${r.outcomeId??""}#outcomes`);return}r.source==="google_calendar"&&r.link&&window.open(r.link,"_blank","noopener,noreferrer")}const te=m.useMemo(()=>{if(o!=="month")return[];const r=[];for(let s=0;s<42;s++)r.push(x(g,s));return r},[o,g]),I=m.useMemo(()=>{if(o!=="week")return[];const r=[];for(let s=0;s<7;s++)r.push(x(g,s));return r},[o,g]),A=m.useMemo(()=>o!=="day"?[]:S.get(u(l.toISOString(),a))??[],[o,S,l,a]),ae=u(l.toISOString(),a).slice(0,7),B=u(new Date().toISOString(),a),re=Me(new Date,a),ne=o==="month"?_e(l,a):o==="week"?`${L(I[0]??l,a)} – ${F(I[6]??l,a)}`:F(l,a);return e.jsxs(he,{children:[e.jsx(xe,{title:"Calendar — Work Lens",description:"See every AI-booked appointment and your own Google Calendar in one place."}),e.jsxs("div",{className:"mx-auto w-full max-w-6xl space-y-6 p-4 md:p-6",children:[e.jsxs("header",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Se,{className:"h-6 w-6","aria-hidden":!0}),e.jsx("h1",{className:"text-2xl font-semibold","data-testid":"text-calendar-title",children:"Calendar"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm text-muted-foreground",children:[e.jsxs("span",{children:["AI-booked appointments and your Google Calendar in one place. Times shown in"," ",e.jsx("span",{"data-testid":"text-tz-label",children:re}),"."]}),e.jsxs(ye,{value:a,onValueChange:d,children:[e.jsx(be,{className:"h-8 w-[220px]","data-testid":"select-buyer-timezone","aria-label":"Display timezone",children:e.jsx(ve,{placeholder:"Choose timezone"})}),e.jsx(Ne,{children:k.map(r=>e.jsx(ke,{value:r,"data-testid":`option-tz-${r}`,children:r},r))})]})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(v,{size:"icon",variant:"outline",onClick:()=>h(r=>H(r,o,-1,a)),"data-testid":"button-calendar-prev","aria-label":"Previous",children:e.jsx(Ce,{className:"h-4 w-4","aria-hidden":!0})}),e.jsx(v,{size:"default",variant:"outline",onClick:()=>h(C(new Date,a)),"data-testid":"button-calendar-today",children:"Today"}),e.jsx(v,{size:"icon",variant:"outline",onClick:()=>h(r=>H(r,o,1,a)),"data-testid":"button-calendar-next","aria-label":"Next",children:e.jsx(Te,{className:"h-4 w-4","aria-hidden":!0})}),e.jsx("span",{className:"ml-2 text-sm font-medium","data-testid":"text-calendar-range",children:ne})]}),e.jsx(je,{value:o,onValueChange:r=>c(r),"data-testid":"tabs-calendar-view",children:e.jsxs(we,{children:[e.jsx(Z,{value:"month","data-testid":"tab-view-month",children:"Month"}),e.jsx(Z,{value:"week","data-testid":"tab-view-week",children:"Week"}),e.jsx(Z,{value:"day","data-testid":"tab-view-day",children:"Day"})]})})]})]}),y&&!y.googleConnected&&e.jsxs(O,{"data-testid":"alert-connect-google",children:[e.jsx(q,{className:"h-4 w-4","aria-hidden":!0}),e.jsx(_,{children:"Connect Google Calendar"}),e.jsxs(M,{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("span",{className:"text-sm",children:"Link your Google Calendar to see your own events alongside appointments your AI team books for you."}),e.jsx(v,{size:"sm",onClick:()=>T.mutate(),disabled:T.isPending,"data-testid":"button-connect-google",children:T.isPending?"Opening…":"Connect Google"})]})]}),y?.googleError==="google_fetch_failed"&&e.jsxs(O,{variant:"destructive","data-testid":"alert-google-fetch-failed",children:[e.jsx(K,{className:"h-4 w-4","aria-hidden":!0}),e.jsx(_,{children:"Couldn't load Google Calendar events"}),e.jsx(M,{children:"We're showing your AI-booked appointments. Try reconnecting Google from Settings → Connections if this keeps happening."})]}),X&&e.jsxs(O,{variant:"destructive",children:[e.jsx(K,{className:"h-4 w-4","aria-hidden":!0}),e.jsx(_,{children:"Couldn't load your calendar"}),e.jsxs(M,{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{children:"Something went wrong fetching events."}),e.jsx(v,{size:"sm",variant:"outline",onClick:()=>ee(),"data-testid":"button-calendar-retry",children:"Retry"})]})]}),o==="month"&&e.jsx($,{"data-testid":"card-view-month",children:e.jsxs(E,{className:"p-2 md:p-3",children:[e.jsx("div",{className:"grid grid-cols-7 gap-px text-center text-xs font-medium text-muted-foreground",children:Le(g).map((r,s)=>e.jsx("div",{className:"py-1",children:R(r,a)},s))}),e.jsx("div",{className:"grid grid-cols-7 gap-px overflow-hidden rounded-md bg-border",children:b?Array.from({length:42}).map((r,s)=>e.jsx("div",{className:"bg-background p-2",children:e.jsx(N,{className:"h-5 w-5"})},s)):te.map(r=>{const s=u(r.toISOString(),a),p=s.startsWith(ae),j=s===B,f=S.get(s)??[],G=()=>{h(r),c("day")};return e.jsxs("div",{role:"button",tabIndex:0,onClick:G,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),G())}
1,className:"flex min-h-[88px] cursor-pointer flex-col gap-1 bg-background p-1.5 text-left hover-elevate focus:outline-none focus-visible:ring-2 focus-visible:ring-ring "+(p?"":"opacity-50 "),"data-testid":`cell-month-${s}`,children:[e.jsxs("div",{className:"flex items-center justify-between text-xs "+(j?"font-bold text-teal-700 dark:text-teal-300":""),children:[e.jsx("span",{children:L(r,a)}),f.length>0&&e.jsx(Y,{variant:"outline",className:"text-[10px]","data-testid":`badge-day-count-${s}`,children:f.length})]}),e.jsxs("div",{className:"flex flex-col gap-0.5",children:[f.slice(0,3).map(w=>e.jsx(U,{event:w,tz:a,onClick:D,compact:!0,asNonButton:!0},w.id)),f.length>3&&e.jsxs("span",{className:"text-[10px] text-muted-foreground",children:["+",f.length-3," more"]})]})]},s)})})]})}),o==="week"&&e.jsx($,{"data-testid":"card-view-week",children:e.jsx(E,{className:"p-2 md:p-3",children:e.jsx("div",{className:"grid grid-cols-7 gap-2",children:I.map(r=>{const s=u(r.toISOString(),a),p=s===B,j=S.get(s)??[];return e.jsxs("div",{className:"flex min-h-[240px] flex-col gap-2 rounded-md border p-2","data-testid":`cell-week-${s}`,children:[e.jsxs("div",{className:"flex items-baseline justify-between text-xs "+(p?"font-bold text-teal-700 dark:text-teal-300":"text-muted-foreground"),children:[e.jsx("span",{children:R(r,a)}),e.jsx("span",{className:"text-base font-semibold",children:L(r,a)})]}),b?e.jsx(N,{className:"h-12 w-full"}):j.length===0?e.jsx("span",{className:"text-xs text-muted-foreground",children:"No events"}):e.jsx("div",{className:"flex flex-col gap-1",children:j.map(f=>e.jsx(U,{event:f,tz:a,onClick:D,compact:!0},f.id))})]},s)})})})}),o==="day"&&e.jsxs($,{"data-testid":"card-view-day",children:[e.jsx(fe,{children:e.jsx(ge,{className:"text-base","data-testid":"text-day-heading",children:F(l,a)})}),e.jsxs(E,{className:"space-y-3",children:[b&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(N,{className:"h-16 w-full"}),e.jsx(N,{className:"h-16 w-full"}),e.jsx(N,{className:"h-16 w-full"})]}),!b&&A.length===0&&e.jsxs("div",{className:"rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground","data-testid":"text-calendar-empty",children:[e.jsx("p",{className:"font-medium",children:"Open — AI can book here"}),e.jsx("p",{className:"mt-1 text-xs",children:"Nothing scheduled. Your AI team will fill open slots as appointments come in."})]}),!b&&A.length>0&&e.jsx("ul",{className:"flex flex-col gap-2",children:A.map(r=>e.jsx("li",{children:e.jsx(U,{event:r,tz:a,onClick:D})},r.id))})]})]})]})]})}function Le(t,n){const a=[];for(let i=0;i<7;i++)a.push(x(t,i));return a}export{ha as default};

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.