PageSourceSearch

https://www.saudident.com/assets/Notifications-BP_aNtQp.js

js saudident.com collected 2026-10-08 04:00:46 UTC 3,031 bytes, 1 lines download raw bytes

1import{j as e,t as l,S as c,bG as m,bH as x,m as r,by as u,l as h,bI as p,L as f}from"./index-jdqwVp6Y.js";import{R as j}from"./RequireMember-CQBnU8A2.js";import{T as N}from"./trash-2-9A3TPZge.js";import"./log-in-_uPupQzr.js";function b(){const{notifications:a,unreadCount:i,isLoading:o,markAsRead:t,markAllAsRead:n,remove:d}=m();return o?e.jsx("div",{className:"space-y-3",children:[0,1,2].map(s=>e.jsx("div",{className:"h-20 bg-muted animate-pulse rounded-xl"},s))}):a.length===0?e.jsxs("div",{className:"rounded-xl border border-border bg-card p-8 text-center",children:[e.jsx(x,{className:"h-8 w-8 text-muted-foreground mx-auto mb-3"}),e.jsx("h2",{className:"font-semibold mb-1",children:"No notifications yet"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"You'll be notified here when an employer requests an introduction, or when a dentist replies to you."})]}):e.jsxs("div",{className:"space-y-3",children:[i>0&&e.jsx("div",{className:"flex justify-end",children:e.jsxs(r,{size:"sm",variant:"outline",onClick:()=>n(),className:"gap-1.5",children:[e.jsx(u,{className:"h-4 w-4"})," Mark all as read"]})}),a.map(s=>e.jsxs("article",{className:h("rounded-xl border border-border bg-card p-4 flex items-start gap-3 min-w-0",!s.is_read&&"border-primary/30 bg-primary/[0.03]"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[!s.is_read&&e.jsx("span",{className:"h-1.5 w-1.5 shrink-0 rounded-full bg-primary"}),e.jsx("h2",{className:"font-semibold text-sm break-words",children:s.title})]}),s.body&&e.jsx("p",{className:"text-sm text-muted-foreground mt-1 break-words whitespace-pre-wrap",children:s.body}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 mt-2",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:p(s.created_at)}),s.link&&e.jsx(f,{to:s.link,onClick:()=>!s.is_read&&t([s.id]),className:"text-xs font-medium text-primary underline",children:"Open"}),!s.is_read&&e.jsx("button",{onClick:()=>t([s.id]),className:"text-xs text-muted-foreground hover:text-foreground",children:"Mark as read"})]})]}),e.jsx(r,{variant:"ghost",size:"icon","aria-label":"Delete notification",className:"shrink-0 text-muted-foreground hover:text-destructive",onClick:()=>d(s.id),children:e.jsx(N,{className:"h-4 w-4"})})]},s.id))]})}function w(){return e.jsxs(l,{children:[e.jsx(c,{title:"Your Notifications | SaudiDent",description:"Introduction requests, replies and other updates from your SaudiDent activity, all in one place.",canonical:"/notifications",noindex:!0}),e.jsxs("div",{className:"container mx-auto px-5 sm:px-6 py-8 md:py-12 max-w-3xl",children:[e.jsxs("header",{className:"mb-6",children:[e.jsx("h1",{className:"text-3xl font-bold tracking-tight mb-2",children:"Notifications"}),e.jsx("p",{className:"text-muted-foreground",children:"Introduction requests and replies show up here as soon as they happen."})]}),e.jsx(j,{title:"your notifications",children:e.jsx(b,{})})]})]})}export{w 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.