pih-appointment-widget 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AppointmentPage.js +16 -3
- package/dist/constants/apiConfig.js +1 -2
- package/dist/pih-appointment-widget.umd.js +25 -11
- package/dist/pih-appointment-widget.umd.min.js +1 -1
- package/dist/services/appointmentService.js +10 -7
- package/package.json +1 -1
- package/src/components/AppointmentPage.js +17 -4
- package/src/constants/apiConfig.js +1 -2
- package/src/services/appointmentService.js +9 -7
|
@@ -28,6 +28,7 @@ const STORAGE_KEY_EMAIL = "pih_appointment_email";
|
|
|
28
28
|
const STORAGE_KEY_APP_TOKEN = "pih_appointment_appToken";
|
|
29
29
|
const STORAGE_KEY_DOCTOR_ID = "pih_appointment_doctorId";
|
|
30
30
|
const STORAGE_KEY_USER_NAME = "pih_appointment_userName";
|
|
31
|
+
const STORAGE_KEY_API_BASE_URL = "pih_appointment_apiBaseUrl";
|
|
31
32
|
const DEFAULT_PIP_WIDTH = 720;
|
|
32
33
|
const DEFAULT_PIP_HEIGHT = 560;
|
|
33
34
|
|
|
@@ -117,7 +118,14 @@ const AppointmentPage = _ref => {
|
|
|
117
118
|
let {
|
|
118
119
|
config = {}
|
|
119
120
|
} = _ref;
|
|
120
|
-
const
|
|
121
|
+
const [storedApiBaseUrl, setStoredApiBaseUrl] = (0, _react.useState)(() => {
|
|
122
|
+
try {
|
|
123
|
+
return typeof localStorage !== "undefined" ? localStorage.getItem(STORAGE_KEY_API_BASE_URL) : null;
|
|
124
|
+
} catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
const apiBaseUrl = config.apiBaseUrl || storedApiBaseUrl || _apiConfig.API_BASE_URL;
|
|
121
129
|
const hospitalId = config.hospitalId || _apiConfig.DEFAULT_PARAMS.hospitalId;
|
|
122
130
|
|
|
123
131
|
// idToken/email: config first, then localStorage. When Flutter (or parent) passes a new token, we use it and re-login.
|
|
@@ -161,8 +169,12 @@ const AppointmentPage = _ref => {
|
|
|
161
169
|
localStorage.setItem(STORAGE_KEY_EMAIL, config.email);
|
|
162
170
|
setStoredEmail(config.email);
|
|
163
171
|
}
|
|
172
|
+
if (config.apiBaseUrl && String(config.apiBaseUrl).trim()) {
|
|
173
|
+
localStorage.setItem(STORAGE_KEY_API_BASE_URL, config.apiBaseUrl.trim());
|
|
174
|
+
setStoredApiBaseUrl(config.apiBaseUrl.trim());
|
|
175
|
+
}
|
|
164
176
|
} catch (e) {}
|
|
165
|
-
}, [config.idToken, config.token, config.email]);
|
|
177
|
+
}, [config.idToken, config.token, config.email, config.apiBaseUrl]);
|
|
166
178
|
const [appToken, setAppToken] = (0, _react.useState)(() => {
|
|
167
179
|
try {
|
|
168
180
|
return typeof localStorage !== "undefined" ? localStorage.getItem(STORAGE_KEY_APP_TOKEN) : null;
|
|
@@ -442,7 +454,7 @@ const AppointmentPage = _ref => {
|
|
|
442
454
|
doctorId,
|
|
443
455
|
token: appToken
|
|
444
456
|
};
|
|
445
|
-
const response = await (0, _appointmentService.getAppointmentsByStatus)(activeTab, fromDate, toDate, serviceConfig);
|
|
457
|
+
const response = await (0, _appointmentService.getAppointmentsByStatus)(activeTab, fromDate, toDate, 'PHYSICAL', serviceConfig);
|
|
446
458
|
if (response.status === 401 || response.status === 403) {
|
|
447
459
|
// Token expired — clear stored token and trigger re-login (SSO effect will fire)
|
|
448
460
|
try {
|
|
@@ -492,6 +504,7 @@ const AppointmentPage = _ref => {
|
|
|
492
504
|
localStorage.removeItem(STORAGE_KEY_APP_TOKEN);
|
|
493
505
|
localStorage.removeItem(STORAGE_KEY_DOCTOR_ID);
|
|
494
506
|
localStorage.removeItem(STORAGE_KEY_USER_NAME);
|
|
507
|
+
localStorage.removeItem(STORAGE_KEY_API_BASE_URL);
|
|
495
508
|
}
|
|
496
509
|
} catch (e) {}
|
|
497
510
|
setShowProfileDropdown(false);
|
|
@@ -22,8 +22,7 @@ const API_PATHS = exports.API_PATHS = {
|
|
|
22
22
|
|
|
23
23
|
// Default request parameters (will be fetched from auth API later)
|
|
24
24
|
const DEFAULT_PARAMS = exports.DEFAULT_PARAMS = {
|
|
25
|
-
hospitalId: "dMtEGhak"
|
|
26
|
-
doctorId: 6694
|
|
25
|
+
hospitalId: "dMtEGhak"
|
|
27
26
|
};
|
|
28
27
|
|
|
29
28
|
// Request timeout (milliseconds)
|
|
@@ -149,8 +149,7 @@
|
|
|
149
149
|
|
|
150
150
|
// Default request parameters (will be fetched from auth API later)
|
|
151
151
|
const DEFAULT_PARAMS = {
|
|
152
|
-
hospitalId: "dMtEGhak"
|
|
153
|
-
doctorId: 6694
|
|
152
|
+
hospitalId: "dMtEGhak"
|
|
154
153
|
};
|
|
155
154
|
|
|
156
155
|
// Join call URL (will be dynamic from auth API later)
|
|
@@ -166,22 +165,24 @@
|
|
|
166
165
|
* @returns {Promise} Appointments data
|
|
167
166
|
*/
|
|
168
167
|
const getAppointmentsByStatus = async function (status, fromDate, toDate) {
|
|
169
|
-
let
|
|
168
|
+
let type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'ONLINE';
|
|
169
|
+
let config = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
170
170
|
// Map status to API format
|
|
171
171
|
let apiStatus = (status || "").toUpperCase();
|
|
172
172
|
if (apiStatus === "INPROGRESS") {
|
|
173
173
|
apiStatus = "IN_PROGRESS";
|
|
174
174
|
}
|
|
175
|
-
const baseURL = config.apiBaseUrl
|
|
175
|
+
const baseURL = config.apiBaseUrl;
|
|
176
176
|
const hospitalId = config.hospitalId || DEFAULT_PARAMS.hospitalId;
|
|
177
|
-
const doctorId = config.doctorId
|
|
177
|
+
const doctorId = config.doctorId;
|
|
178
178
|
const token = config.token || '';
|
|
179
179
|
const params = {
|
|
180
180
|
hospitalId,
|
|
181
181
|
doctorId,
|
|
182
182
|
fromDate,
|
|
183
183
|
toDate,
|
|
184
|
-
statuses: apiStatus
|
|
184
|
+
statuses: apiStatus,
|
|
185
|
+
type
|
|
185
186
|
};
|
|
186
187
|
const url = `${baseURL}${API_PATHS.APPOINTMENTS}`;
|
|
187
188
|
|
|
@@ -198,14 +199,15 @@
|
|
|
198
199
|
*/
|
|
199
200
|
const initiateConsultation = async function (appointment) {
|
|
200
201
|
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
201
|
-
|
|
202
|
+
console.log("initiateConsultation -> config", config);
|
|
203
|
+
const baseURL = config.apiBaseUrl.replace(/\/$/, "");
|
|
202
204
|
const url = `${baseURL}${API_PATHS.INITIATE_CALL}`;
|
|
203
205
|
const appToken = config.appToken || "";
|
|
204
206
|
const body = {
|
|
205
207
|
patientId: String(appointment.patientId || ""),
|
|
206
208
|
primaryPatientId: String(appointment.primaryPatientId || appointment.patientId || ""),
|
|
207
209
|
hospitalId: config.hospitalId || DEFAULT_PARAMS.hospitalId,
|
|
208
|
-
doctorId: String(config.
|
|
210
|
+
doctorId: String(config.doctorId),
|
|
209
211
|
patientName: appointment.patientName || appointment.name || "",
|
|
210
212
|
doctorName: appointment.doctorName || config.doctorName,
|
|
211
213
|
appointmentId: String(appointment.id || appointment.appointmentId || appointment._id || "")
|
|
@@ -231,6 +233,7 @@
|
|
|
231
233
|
const STORAGE_KEY_APP_TOKEN = "pih_appointment_appToken";
|
|
232
234
|
const STORAGE_KEY_DOCTOR_ID = "pih_appointment_doctorId";
|
|
233
235
|
const STORAGE_KEY_USER_NAME = "pih_appointment_userName";
|
|
236
|
+
const STORAGE_KEY_API_BASE_URL = "pih_appointment_apiBaseUrl";
|
|
234
237
|
const DEFAULT_PIP_WIDTH = 720;
|
|
235
238
|
const DEFAULT_PIP_HEIGHT = 560;
|
|
236
239
|
|
|
@@ -320,7 +323,14 @@
|
|
|
320
323
|
let {
|
|
321
324
|
config = {}
|
|
322
325
|
} = _ref;
|
|
323
|
-
const
|
|
326
|
+
const [storedApiBaseUrl, setStoredApiBaseUrl] = React.useState(() => {
|
|
327
|
+
try {
|
|
328
|
+
return typeof localStorage !== "undefined" ? localStorage.getItem(STORAGE_KEY_API_BASE_URL) : null;
|
|
329
|
+
} catch {
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
const apiBaseUrl = config.apiBaseUrl || storedApiBaseUrl || API_BASE_URL;
|
|
324
334
|
const hospitalId = config.hospitalId || DEFAULT_PARAMS.hospitalId;
|
|
325
335
|
|
|
326
336
|
// idToken/email: config first, then localStorage. When Flutter (or parent) passes a new token, we use it and re-login.
|
|
@@ -364,8 +374,12 @@
|
|
|
364
374
|
localStorage.setItem(STORAGE_KEY_EMAIL, config.email);
|
|
365
375
|
setStoredEmail(config.email);
|
|
366
376
|
}
|
|
377
|
+
if (config.apiBaseUrl && String(config.apiBaseUrl).trim()) {
|
|
378
|
+
localStorage.setItem(STORAGE_KEY_API_BASE_URL, config.apiBaseUrl.trim());
|
|
379
|
+
setStoredApiBaseUrl(config.apiBaseUrl.trim());
|
|
380
|
+
}
|
|
367
381
|
} catch (e) {}
|
|
368
|
-
}, [config.idToken, config.token, config.email]);
|
|
382
|
+
}, [config.idToken, config.token, config.email, config.apiBaseUrl]);
|
|
369
383
|
const [appToken, setAppToken] = React.useState(() => {
|
|
370
384
|
try {
|
|
371
385
|
return typeof localStorage !== "undefined" ? localStorage.getItem(STORAGE_KEY_APP_TOKEN) : null;
|
|
@@ -645,7 +659,7 @@
|
|
|
645
659
|
doctorId,
|
|
646
660
|
token: appToken
|
|
647
661
|
};
|
|
648
|
-
const response = await getAppointmentsByStatus(activeTab, fromDate, toDate, serviceConfig);
|
|
662
|
+
const response = await getAppointmentsByStatus(activeTab, fromDate, toDate, 'PHYSICAL', serviceConfig);
|
|
649
663
|
if (response.status === 401 || response.status === 403) {
|
|
650
664
|
// Token expired — clear stored token and trigger re-login (SSO effect will fire)
|
|
651
665
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","react-dom"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MyPackage={},e.React,e.ReactDOM)}(this,(function(e,t,n){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(t),i=o(n);const r="https://afiyaapiqa.powermindinc.com",l="/appointment/V1/consultant/all-appointments",d="/notification/V1/consultation/online/initiate",s="dMtEGhak",p=6694,c="https://wbafedevittisalwe01-had2b3e0a7h6fyey.westeurope-01.azurewebsites.net/call/",u=async function(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=(e||"").toUpperCase();"INPROGRESS"===a&&(a="IN_PROGRESS");const i=o.apiBaseUrl||r,d=o.hospitalId||s,c=o.doctorId||p,u=o.token||"",f={hospitalId:d,doctorId:c,fromDate:t,toDate:n,statuses:a},m=`${i}${l}`,x=await async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";const o=new URL(e);return o.search=new URLSearchParams(t).toString(),fetch(o,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`${n}`}}).then((async e=>{const t=await e.json().catch((()=>({})));return e.ok?t:{err:t?.resultInfo?.message||"Something went wrong!",status:e.status}})).catch((e=>(console.error("Fetch error:",e),{err:e?.message||String(e)||"Network error"})))}(m,f,"PIH-Appointment-Widget",u);return x},f=async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=`${(t.apiBaseUrl||r).replace(/\/$/,"")}${d}`,o=t.appToken||"";return async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=arguments.length>4?arguments[4]:void 0;const a=new URL(e);Object.keys(n).forEach((e=>{a.searchParams.append(e,n[e])}));const i={"Content-Type":"application/json"};o&&(i.Authorization=o);const r={method:"POST",headers:i,body:JSON.stringify(t)};return fetch(a.toString(),r).then((async e=>{const t=await e.json().catch((()=>({})));return e.ok?t:{err:t?.resultInfo?.message||"Something went wrong!",status:e.status}})).catch((e=>(console.error("Fetch error:",e),{err:e.message||"Network error"})))}(n,{patientId:String(e.patientId||""),primaryPatientId:String(e.primaryPatientId||e.patientId||""),hospitalId:t.hospitalId||s,doctorId:String(t.doctor_id||p),patientName:e.patientName||e.name||"",doctorName:e.doctorName||t.doctorName,appointmentId:String(e.id||e.appointmentId||e._id||"")},"PIH-Appointment-Widget",{},o)};const m="pih_appointment_idToken",x="pih_appointment_email",g="pih_appointment_appToken",h="pih_appointment_doctorId",y="pih_appointment_userName",E=720,F="pih-appointment-widget",b="data-pih-widget";class w extends t.Component{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e,t){"undefined"!=typeof console&&console.error&&console.error("Appointment widget error:",e,t)}render(){return this.state.hasError?a.default.createElement("div",{className:F,[b]:"teleconsult-appointments",style:{fontFamily:'"Nunito", serif',background:"#F5F5F7",boxSizing:"border-box",minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",padding:"24px",textAlign:"center"}},a.default.createElement("div",{style:{maxWidth:"400px"}},a.default.createElement("div",{style:{fontSize:"48px",marginBottom:"16px"}},"⚠️"),a.default.createElement("h2",{style:{fontSize:"20px",fontWeight:700,color:"#1a1a1a",margin:"0 0 8px 0"}},"Something went wrong"),a.default.createElement("p",{style:{fontSize:"14px",color:"#666",margin:0,lineHeight:1.5}},"Please refresh the page or try again later."))):this.props.children}}const S=e=>{let{config:n={}}=e;const o=n.apiBaseUrl||r,i=n.hospitalId||s,[l,d]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(m):null}catch{return null}})),[p,S]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(x):null}catch{return null}})),v=n.idToken||n.token||l,k=n.email||p;t.useEffect((()=>{try{if("undefined"==typeof localStorage)return;const e=n.idToken||n.token;if(e&&String(e).trim()){localStorage.getItem(m)!==e&&(I(null),z(null),T(null),localStorage.removeItem(g),localStorage.removeItem(h),localStorage.removeItem(y)),localStorage.setItem(m,e),d(e)}n.email&&String(n.email).trim()&&(localStorage.setItem(x,n.email),S(n.email))}catch(e){}}),[n.idToken,n.token,n.email]);const[C,I]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(g):null}catch{return null}})),[D,z]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(h):null}catch{return null}})),[W,T]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(y):null}catch{return null}})),[M,A]=t.useState((()=>{try{if("undefined"==typeof localStorage)return!1;const e=localStorage.getItem(g),t=localStorage.getItem(m),n=localStorage.getItem(x);return!e&&!(!t||!n)}catch{return!1}})),[R,N]=t.useState(null),[P,j]=t.useState(!1),[B,H]=t.useState(0);t.useEffect((()=>{C&&M&&A(!1)}),[C,M]),t.useEffect((()=>{C||(v&&k?(j(!1),N((e=>"Sign in required. Redirecting to home..."===e?null:e))):(N("Sign in required. Redirecting to home..."),j(!0)))}),[C,v,k]),t.useEffect((()=>{if(!P)return;const e=n.homeUrl||"https://wbaemrdevittisalwe01-fnapdpfme7bvduhh.westeurope-01.azurewebsites.net/";if(!e||"undefined"==typeof window)return;const t=setTimeout((()=>{window.location.href=e}),2500);return()=>clearTimeout(t)}),[P,n.homeUrl]),t.useEffect((()=>{if(!M)return;const e=setTimeout((()=>{N("Request timed out. Please try again."),A(!1)}),3e4);return()=>clearTimeout(e)}),[M]);const L=n.joinCallUrl||c;C&&String(L||"").replace(/\/?$/,"/");const $=function(e){if(!e||"string"!=typeof e)return{};try{const t=e.split(".");if(3!==t.length)return{};const n=t[1].replace(/-/g,"+").replace(/_/g,"/"),o=n.padEnd(n.length+(4-n.length%4)%4,"=");return JSON.parse(atob(o))}catch{return{}}}(v),_=W||$.name||$.sub||"User",O=()=>(new Date).toISOString().split("T")[0],[U,Y]=t.useState("upcoming"),[V,q]=t.useState([]),[X,G]=t.useState(null),[J,K]=t.useState(!1),[Q,Z]=t.useState(null),[ee,te]=t.useState(window.innerWidth<768),[ne,oe]=t.useState("today"),[ae,ie]=t.useState("today"),[re,le]=t.useState(!1),[de,se]=t.useState("asc"),[pe,ce]=t.useState(""),[ue,fe]=t.useState(!1),[me,xe]=t.useState(!1),[ge,he]=t.useState(!1),[ye,Ee]=t.useState(null),[Fe,be]=t.useState(null),[we,Se]=t.useState(!1),[ve,ke]=t.useState(null),[Ce,Ie]=t.useState((()=>({x:Math.max(20,"undefined"!=typeof window?window.innerWidth-E-20:300),y:80}))),[De,ze]=t.useState({width:E,height:560}),[We,Te]=t.useState(!1),[Me,Ae]=t.useState({x:0,y:0}),[Re,Ne]=t.useState(!1),[Pe,je]=t.useState(null),[Be,He]=t.useState({x:0,y:0,width:0,height:0});t.useState(!1);const[Le,$e]=t.useState(1),_e=V.filter((e=>{if(!pe.trim())return!0;const t=pe.toLowerCase(),n=(e.patientName||"").toLowerCase(),o=String(e.patientId||"").toLowerCase();return n.includes(t)||o.includes(t)})),Oe=20*(Le-1),Ue=Oe+20,Ye=_e.slice(Oe,Ue),Ve=Math.ceil(_e.length/20),qe=_e.length,[Xe,Ge]=t.useState(O()),[Je,Ke]=t.useState(O()),[Qe,Ze]=t.useState(),[et,tt]=t.useState(),nt=e=>e?.id||e?._id||e?.appointmentId||e?.patientId||JSON.stringify(e),ot=e=>e?.image?e.image:null,at=e=>e?e.charAt(0).toUpperCase():"?",it=e=>{if(!e)return"#4C4DDC";const t=["#4C4DDC","#1CC3CE","#FF6B6B","#4ECDC4","#45B7D1","#FFA07A","#98D8C8","#F7DC6F"];return t[e.charCodeAt(0)%t.length]},rt=()=>{const e="asc"===de?"desc":"asc";se(e);const t=[...V].sort(((t,n)=>{const o=new Date(t.appointmentDate||t.date||0),a=new Date(n.appointmentDate||n.date||0);return"asc"===e?o-a:a-o}));q(t),$e(1),t.length>0&&G(t[0])},lt=t.useCallback((async()=>{if(!C)return;console.log(D,"fetchAppointments -> doctorIdFromLogin");const e=D;K(!0),Z(null);try{const t={apiBaseUrl:o,hospitalId:i,doctorId:e,token:C},n=await u(U,Xe,Je,t);if(401===n.status||403===n.status){try{"undefined"!=typeof localStorage&&(localStorage.removeItem(g),localStorage.removeItem(h),localStorage.removeItem(y))}catch(e){}return I(null),z(null),T(null),H((e=>e+1)),void Z("Session expired. Re-authenticating...")}if(n.err)return void Z(String(n.err||"Failed to fetch appointments"));const a=n.data||n.appointments||n||[];q(Array.isArray(a)?a:[]),Array.isArray(a)&&a.length>0?G(a[0]):G(null)}catch(e){console.error("Error fetching appointments:",e),Z(e.message||"Failed to fetch appointments")}finally{K(!1)}}),[U,Xe,Je,o,i,D,C]),dt=e=>{G(e)},st=async()=>{if(X&&C){Se(!0),ke(null);try{const e={apiBaseUrl:o,hospitalId:i,doctorId:D,doctorName:W||_,appToken:C};console.log(X,"selectedAppointment"),console.log(e,"callConfig");const t=await f(X,e);if(401===t.status||403===t.status)return ke("Session expired. Please try again."),void Se(!1);if(t.err||!t.data?.token)return ke(String(t.err||"Failed to initiate call")),void Se(!1);const a=n.joinCallUrl||c,r=t.data.token?String(a||"").replace(/\/?$/,"/")+t.data.token:"";console.log("joinCallUrl",r),Ee(t.data.token),be(r||""),fe(!0),xe(!1),he(!1),ze({width:E,height:560}),Ie({x:Math.max(20,window.innerWidth-E-20),y:80})}catch(e){ke(e.message||"Failed to initiate call")}finally{ke(null),Se(!1)}}},pt=()=>{fe(!1),xe(!1),he(!1),Ee(null),be(null),ke(null),lt()},ct=()=>{ge&&he(!1),xe(!me)},ut=()=>{me&&xe(!1),he(!ge)},ft=e=>{if(0!==e.button)return;if(e.target.closest("button"))return;e.currentTarget.setPointerCapture&&e.currentTarget.setPointerCapture(e.pointerId),Te(!0);const t=e.currentTarget.getBoundingClientRect();Ae({x:e.clientX-t.left,y:e.clientY-t.top})},mt=t.useCallback((e=>{if(!ge)if(We){const t=e.clientX-Me.x,n=e.clientY-Me.y,o=window.innerWidth-De.width,a=window.innerHeight-De.height;Ie({x:Math.max(0,Math.min(t,o)),y:Math.max(0,Math.min(n,a))})}else if(Re){const t=e.clientX-Be.x,n=e.clientY-Be.y;let o=Be.width,a=Be.height,i=Be.posX,r=Be.posY;const l=300,d=250,s=window.innerWidth-40,p=window.innerHeight-100;if("bottom-right"===Pe)o=Math.min(Math.max(Be.width+t,l),s),a=Math.min(Math.max(Be.height+n,d),p),i+o>window.innerWidth&&(o=window.innerWidth-i),r+a>window.innerHeight&&(a=window.innerHeight-r);else if("bottom-left"===Pe){o=Math.min(Math.max(Be.width-t,l),s),i=Math.max(0,Be.posX+t),0===i&&(o=Be.posX+Be.width),a=Math.min(Math.max(Be.height+n,d),p),r+a>window.innerHeight&&(a=window.innerHeight-r)}else if("top-right"===Pe){o=Math.min(Math.max(Be.width+t,l),s),i+o>window.innerWidth&&(o=window.innerWidth-i);a=Math.min(Math.max(Be.height-n,d),p),r=Math.max(0,Be.posY+n),0===r&&(a=Be.posY+Be.height)}else if("top-left"===Pe){o=Math.min(Math.max(Be.width-t,l),s),i=Math.max(0,Be.posX+t),0===i&&(o=Be.posX+Be.width);a=Math.min(Math.max(Be.height-n,d),p),r=Math.max(0,Be.posY+n),0===r&&(a=Be.posY+Be.height)}ze({width:o,height:a}),Ie({x:i,y:r})}}),[We,Re,Me,Pe,Be,Ce,De,ge]),xt=()=>{Te(!1),Ne(!1),je(null)},gt=(e,t)=>{t.preventDefault(),t.stopPropagation(),t.currentTarget.setPointerCapture&&t.currentTarget.setPointerCapture(t.pointerId),Ne(!0),je(e),He({x:t.clientX,y:t.clientY,width:De.width,height:De.height,posX:Ce.x,posY:Ce.y})};t.useEffect((()=>{if(!ue||ge)return;const e=()=>{if(!(window.innerWidth<768)){const e=me?350:De.width,t=me?60:De.height,n=window.innerWidth-40,o=window.innerHeight-100,a=Math.min(e,n),i=Math.min(t,o);a===De.width&&i===De.height||ze({width:a,height:i});const r=window.innerWidth-a-20,l=window.innerHeight-i-20;Ie((e=>({x:Math.min(e.x,r),y:Math.min(e.y,l)})))}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[ue,me,ge,De]),t.useEffect((()=>{if(!(v&&k&&(!C||B>0)))return;let e=!1;return A(!0),N(null),(async(e,t,n,o)=>{const a=`${e.replace(/\/$/,"")}/um/user/V1/sso/login?hospitalId=${encodeURIComponent(t)}`,i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({idToken:n,email:o})};return console.log("[getTokenFromSso] request",{url:a,body:{idToken:n?n.slice(0,50)+"...":null,email:o}}),fetch(a,i).then((e=>(console.log("[getTokenFromSso] response status",e.status,e.statusText),e.ok?e.json().then((e=>(console.log("[getTokenFromSso] success",{hasData:!!e,dataKeys:e?Object.keys(e):[],hasAccessToken:!!e?.data?.access_token}),e))):e.json().then((t=>{const n=t?.resultInfo?.message||"SSO login failed";return console.log("[getTokenFromSso] error body",t),{err:n,status:e.status}})).catch((()=>({err:"Something went wrong!",status:e.status})))))).catch((e=>(console.error("[getTokenFromSso] catch",e),{err:e.message||"Network error"})))})(o,i,v,k).then((t=>{if(e)return;const n=function(e){return!e||e.err?null:e.data?.access_token??e.data?.token??e.token??e.accessToken??null}(t);if(400===t.status)return N(t.err||"Invalid request. Redirecting to home..."),A(!1),void j(!0);if(t.err||!n){N(String(t.err||"Failed to get token")),I(null),z(null),T(null);try{"undefined"!=typeof localStorage&&(localStorage.removeItem(g),localStorage.removeItem(h),localStorage.removeItem(y))}catch(e){}}else{const e=function(e){if(!e?.data)return null;const t=e.data.doctor_id??e.data.doctorId??null;return console.log(t,"extractDoctorIdFromLoginResponse -> id"),null!=t?String(t):null}(t);console.log(e,"extractDoctorIdFromLoginResponse -> doctorId");const o=function(e){if(!e?.data)return null;const t=e.data.name??e.data.doctor_name??e.data.userName??null;return null!=t?String(t):null}(t);I(n),z(e),T(o),N(null),j(!1);try{"undefined"!=typeof localStorage&&(localStorage.setItem(g,n),e&&localStorage.setItem(h,e),o&&localStorage.setItem(y,o))}catch(e){}}})).catch((()=>{})).finally((()=>{e||A(!1)})),()=>{e=!0}}),[o,i,v,k,B]),t.useEffect((()=>{$e(1)}),[U,ne,Xe,Je,pe]),t.useEffect((()=>{!M&&C&<()}),[lt,C,M]),t.useEffect((()=>{const e=document.createElement("link");e.href="https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap",e.rel="stylesheet",document.head.appendChild(e);const t=document.createElement("style");t.innerHTML="\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n \n @media (max-width: 768px) {\n .appointments-grid {\n grid-template-columns: 1.5fr 1fr 0.8fr !important;\n }\n .appointments-header-grid {\n grid-template-columns: 1.5fr 1fr 0.8fr !important;\n }\n .hide-on-mobile {\n display: none !important;\n }\n }\n @media (max-width: 480px) {\n .appointments-header-grid {\n font-size: 10px !important;\n }\n .appointments-grid {\n font-size: 11px !important;\n }\n }\n ",document.head.appendChild(t);const n=()=>{te(window.innerWidth<768)};return window.addEventListener("resize",n),()=>{document.head.removeChild(e),document.head.removeChild(t),window.removeEventListener("resize",n)}}),[]),t.useEffect((()=>{const e=e=>{!re||e.target.closest("button")||e.target.closest('input[type="date"]')||le(!1)};return document.addEventListener("click",e),()=>{document.removeEventListener("click",e)}}),[re]);let ht='"Nunito", serif';const yt=R||!C&&(!v||!k),Et=R||"Sign in required. Redirecting to home...";let Ft;return Ft=M&&v&&k?a.default.createElement("div",{className:F,[b]:"teleconsult-appointments",style:{fontFamily:ht,background:"#F5F5F7",boxSizing:"border-box",height:"100%",minHeight:"100vh",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:"24px"}},a.default.createElement("style",null,"@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }"),a.default.createElement("div",{style:{width:"40px",height:"40px",border:"3px solid #f3f3f3",borderTop:"3px solid #4C4DDC",borderRadius:"50%",animation:"spin 1s linear infinite",marginBottom:"16px"}}),a.default.createElement("p",{style:{fontSize:"14px",color:"#666",margin:0}},"Checking authorisation...")):a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{className:F,[b]:"teleconsult-appointments",style:{fontFamily:ht,background:"#F5F5F7",boxSizing:"border-box",height:"100%",minHeight:"100vh",width:"100%",display:"flex",flexDirection:"column",overflow:"hidden"}},a.default.createElement("div",{style:{background:"#FFFFFF",padding:ee?"10px 12px":"12px 24px",display:"flex",justifyContent:"space-between",alignItems:"center",borderBottom:"1px solid #E5E5E5",flexWrap:"nowrap",gap:ee?"8px":"0"}},a.default.createElement("div",{style:{position:"relative",width:ee?"calc(100% - 90px)":"480px",maxWidth:ee?"none":"480px"}},a.default.createElement("input",{type:"text",placeholder:"Search by patient name or ID",value:pe,onChange:e=>ce(e.target.value),style:{width:"100%",padding:ee?"8px 32px 8px 10px":"8px 36px 8px 14px",border:"1px solid #E5E5E5",borderRadius:"6px",fontSize:ee?"12px":"13px",fontFamily:ht,background:"#FFFFFF",outline:"none",boxSizing:"border-box"}}),pe&&a.default.createElement("button",{onClick:()=>ce(""),style:{position:"absolute",right:"8px",top:"50%",transform:"translateY(-50%)",background:"none",border:"none",cursor:"pointer",padding:"4px",display:"flex",alignItems:"center",justifyContent:"center",color:"#999",fontSize:"16px"},title:"Clear search"},"✕")),!1),a.default.createElement("div",{style:{padding:ee?"12px":"16px 24px",flex:1,minHeight:0,overflow:"hidden",display:"flex",flexDirection:"column"}},a.default.createElement("div",{style:{marginBottom:ee?"10px":"14px"}},a.default.createElement("h1",{style:{fontSize:ee?"18px":"22px",fontWeight:700,color:"#1a1a1a",margin:"0 0 2px 0"}},"Tele Consultation"),a.default.createElement("p",{style:{fontSize:ee?"11px":"12px",color:"#999",margin:0}},"Displaying All Tele Consultation Appointments")),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:ee?"flex-start":"center",marginBottom:ee?"10px":"14px",flexDirection:ee?"column":"row",gap:ee?"12px":"0"}},a.default.createElement("div",{style:{display:"flex",gap:"6px",flexWrap:"wrap",width:ee?"100%":"auto"}},a.default.createElement("button",{onClick:()=>Y("upcoming"),style:{background:"upcoming"===U?"#4C4DDC":"#FFFFFF",padding:ee?"8px 10px":"9px 16px",border:"upcoming"===U?"none":"1px solid #E5E5E5",borderRadius:"6px",fontSize:ee?"10px":"13px",color:"upcoming"===U?"white":"#555555",fontWeight:600,fontFamily:ht,cursor:"pointer",flex:ee?"1 1 auto":"none",minWidth:ee?"0":"auto",transition:"all 0.3s ease",whiteSpace:"nowrap"}},"Upcoming Appointments"),a.default.createElement("button",{onClick:()=>Y("completed"),style:{background:"completed"===U?"#4C4DDC":"#FFFFFF",padding:ee?"8px 10px":"9px 16px",border:"completed"===U?"none":"1px solid #E5E5E5",borderRadius:"6px",fontSize:ee?"10px":"13px",color:"completed"===U?"white":"#555555",fontWeight:600,fontFamily:ht,cursor:"pointer",flex:ee?"1 1 auto":"none",minWidth:ee?"0":"auto",transition:"all 0.3s ease",whiteSpace:"nowrap"}},"Completed Appointments"),a.default.createElement("button",{onClick:()=>Y("cancelled"),style:{background:"cancelled"===U?"#4C4DDC":"#FFFFFF",padding:ee?"8px 10px":"9px 16px",border:"cancelled"===U?"none":"1px solid #E5E5E5",borderRadius:"6px",fontSize:ee?"10px":"13px",color:"cancelled"===U?"white":"#555555",fontWeight:600,fontFamily:ht,cursor:"pointer",flex:ee?"1 1 auto":"none",minWidth:ee?"0":"auto",transition:"all 0.3s ease",whiteSpace:"nowrap"}},"Cancelled Appointments")),a.default.createElement("div",{style:{display:"flex",gap:"8px",alignItems:"center",width:"auto",position:"relative",justifyContent:ee?"flex-start":"flex-end"}},a.default.createElement("button",{onClick:()=>{re||(Ze(Xe),tt(Je),ie(ne)),le(!re)},style:{padding:"8px 12px",fontFamily:ht,fontWeight:600,border:"1px solid #E5E5E5",borderRadius:"6px",fontSize:ee?"11px":"13px",color:"#1a1a1a",background:"#FFFFFF",display:"flex",alignItems:"center",gap:ee?"4px":"6px",cursor:"pointer",flex:"none",minWidth:ee?"100px":"auto",justifyContent:"center"}},a.default.createElement("svg",{width:ee?"12":"14",height:ee?"12":"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},a.default.createElement("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),a.default.createElement("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),a.default.createElement("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),a.default.createElement("line",{x1:"3",y1:"10",x2:"21",y2:"10"})),a.default.createElement("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},(()=>{switch(ne){case"today":default:return"Today";case"tomorrow":return"Tomorrow";case"currentWeek":return"Current Week";case"thisMonth":return"This Month";case"currentYear":return"Current Year";case"custom":return ee?"Custom":`${Xe} to ${Je}`}})()),a.default.createElement("svg",{width:ee?"8":"10",height:ee?"8":"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},a.default.createElement("polyline",{points:"6 9 12 15 18 9"}))),re&&a.default.createElement("div",{style:{position:"absolute",top:"100%",right:ee?"auto":0,left:ee?0:"auto",marginTop:"4px",background:"#FFFFFF",border:"1px solid #E5E5E5",borderRadius:"8px",boxShadow:"0 4px 16px rgba(0,0,0,0.15)",padding:"8px",zIndex:1e3,minWidth:ee?"280px":"240px",width:ee?"calc(100vw - 24px)":"auto",maxWidth:ee?"calc(100vw - 24px)":"280px"}},a.default.createElement("div",{style:{marginBottom:"custom"===ae?"12px":"0"}},["thisMonth","today","tomorrow","currentWeek","currentYear","custom"].map((e=>a.default.createElement("button",{key:e,onClick:()=>{if(ie(e),"custom"!==e){const t=(e=>{const t=new Date;let n,o;switch(e){case"today":default:n=o=O();break;case"tomorrow":const e=new Date(t);e.setDate(e.getDate()+1),n=o=e.toISOString().split("T")[0];break;case"currentWeek":const a=new Date(t),i=new Date(t),r=t.getDay(),l=0===r?-6:1-r;a.setDate(t.getDate()+l),i.setDate(a.getDate()+6),n=a.toISOString().split("T")[0],o=i.toISOString().split("T")[0];break;case"thisMonth":const d=new Date(t.getFullYear(),t.getMonth(),1),s=new Date(t.getFullYear(),t.getMonth()+1,0);n=d.toISOString().split("T")[0],o=s.toISOString().split("T")[0];break;case"currentYear":n=`${t.getFullYear()}-01-01`,o=`${t.getFullYear()}-12-31`}return{from:n,to:o}})(e);oe(e),Ge(t.from),Ke(t.to),Ze(t.from),tt(t.to),le(!1)}else Ze(""),tt("")},style:{width:"100%",padding:"10px 12px",background:ae===e?"#E8EEF4":"#FFFFFF",border:"none",borderRadius:"4px",fontSize:"13px",fontFamily:ht,cursor:"pointer",textAlign:"left",fontWeight:ae===e?600:400,color:ae===e?"#4C4DDC":"#1a1a1a",marginBottom:"4px",display:"flex",justifyContent:"space-between",alignItems:"center",transition:"all 0.2s ease"},onMouseEnter:t=>{ae!==e&&(t.target.style.background="#F5F5F5")},onMouseLeave:t=>{ae!==e&&(t.target.style.background="#FFFFFF")}},a.default.createElement("span",null,{thisMonth:"This Month",today:"Today",tomorrow:"Tomorrow",currentWeek:"Current Week",currentYear:"Current Year",custom:"Custom"}[e]),ae===e&&a.default.createElement("span",{style:{color:"#4C4DDC",fontSize:"16px"}},"✓"))))),"custom"===ae&&a.default.createElement("div",{style:{paddingTop:"8px",borderTop:"1px solid #E5E5E5"}},a.default.createElement("div",{style:{marginBottom:"8px"}},a.default.createElement("input",{type:"date",value:Qe,onChange:e=>Ze(e.target.value),placeholder:"Start Date",style:{width:"100%",padding:"10px 8px",border:"1px solid #E5E5E5",borderRadius:"4px",fontSize:"13px",fontFamily:ht,boxSizing:"border-box",cursor:"pointer"}})),a.default.createElement("div",{style:{marginBottom:"12px"}},a.default.createElement("input",{type:"date",value:et,onChange:e=>tt(e.target.value),placeholder:"End Date",style:{width:"100%",padding:"10px 8px",border:"1px solid #E5E5E5",borderRadius:"4px",fontSize:"13px",fontFamily:ht,boxSizing:"border-box",cursor:"pointer"}})),a.default.createElement("div",{style:{display:"flex",gap:"8px"}},a.default.createElement("button",{onClick:()=>{ie(ne),Ze(Xe),tt(Je),le(!1)},style:{flex:1,padding:"10px 12px",background:"#FFFFFF",color:"#4C4DDC",border:"1px solid #4C4DDC",borderRadius:"4px",fontSize:"13px",fontFamily:ht,fontWeight:600,cursor:"pointer"}},"Cancel"),a.default.createElement("button",{onClick:()=>{Qe&&et&&(oe("custom"),Ge(Qe),Ke(et),le(!1))},style:{flex:1,padding:"10px 12px",background:"#4C4DDC",color:"#FFFFFF",border:"none",borderRadius:"4px",fontSize:"13px",fontFamily:ht,fontWeight:600,cursor:"pointer"}},"Submit")))))),a.default.createElement("div",{style:{display:"flex",flexDirection:ee?"column":"row",gap:ee?"12px":"14px",flex:1,minHeight:0,overflow:ee?"auto":"hidden"}},a.default.createElement("div",{style:{flex:ee?"none":"1 1 65%",width:ee?"100%":"auto",display:"flex",flexDirection:"column",minHeight:ee?"400px":0}},a.default.createElement("div",{style:{background:"#FFFFFF",borderRadius:"8px",boxShadow:"0 1px 4px rgba(0,0,0,0.08)",overflow:"hidden",display:"flex",flexDirection:"column",flex:ee?"none":1,minHeight:ee?"auto":0}},a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:ee?"12px 14px":"14px 18px",borderBottom:"1px solid #F1F1F1"}},a.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:ee?"6px":"8px"}},a.default.createElement("span",{style:{fontSize:ee?"14px":"15px",fontWeight:700,color:"#1a1a1a"}},"Appointments"),a.default.createElement("span",{style:{background:"#4C4DDC",color:"#fff",fontSize:ee?"10px":"11px",fontWeight:600,padding:ee?"2px 7px":"3px 8px",borderRadius:"12px"}},qe))),a.default.createElement("div",{className:"appointments-header-grid",style:{display:"grid",gridTemplateColumns:ee?"1.5fr 1fr 0.8fr":"2.5fr 1fr 1.5fr 0.8fr 1.2fr",gap:ee?"8px":"12px",padding:ee?"8px 12px":"10px 18px",background:"#F5F5F5",fontSize:ee?"10px":"12px",fontWeight:600,color:"#666"}},a.default.createElement("div",null,"Patients name"),!ee&&a.default.createElement("div",null,"Patient ID"),a.default.createElement("div",{onClick:rt,style:{display:"flex",alignItems:"center",gap:"3px",cursor:"pointer",userSelect:"none"}},"Date",a.default.createElement("span",{style:{opacity:.7,fontSize:"10px"}},"asc"===de?"▲":"▼")),!ee&&a.default.createElement("div",null,"Slot"),!ee&&a.default.createElement("div",null,"Doctor")),a.default.createElement("div",{style:{overflow:"auto",flex:1}},M?a.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",padding:"40px",color:"#888"}},a.default.createElement("div",{style:{textAlign:"center"}},a.default.createElement("div",{style:{width:"40px",height:"40px",border:"3px solid #f3f3f3",borderTop:"3px solid #4C4DDC",borderRadius:"50%",animation:"spin 1s linear infinite",margin:"0 auto 10px"}}),"Getting token...")):J?a.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",padding:"40px",color:"#888"}},a.default.createElement("div",{style:{textAlign:"center"}},a.default.createElement("div",{style:{width:"40px",height:"40px",border:"3px solid #f3f3f3",borderTop:"3px solid #4C4DDC",borderRadius:"50%",animation:"spin 1s linear infinite",margin:"0 auto 10px"}}),"Loading appointments...")):Q?a.default.createElement("div",{style:{padding:"40px",textAlign:"center",color:"#FF0000"}},a.default.createElement("div",{style:{fontSize:"16px",marginBottom:"8px"}},"⚠️ Error"),a.default.createElement("div",{style:{fontSize:"13px"}},Q),a.default.createElement("button",{onClick:lt,style:{marginTop:"16px",padding:"8px 16px",background:"#4C4DDC",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontFamily:ht}},"Retry")):0===Ye.length?a.default.createElement("div",{style:{padding:"40px",textAlign:"center",color:"#888"}},a.default.createElement("div",{style:{fontSize:"16px",marginBottom:"8px"}},"📋"),a.default.createElement("div",{style:{fontSize:"13px"}},pe?`No appointments found for "${pe}"`:"No appointments found"),pe&&a.default.createElement("button",{onClick:()=>ce(""),style:{marginTop:"12px",padding:"6px 12px",background:"#4C4DDC",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px",fontFamily:ht}},"Clear Search")):Ye.map((e=>a.default.createElement("div",{key:nt(e),role:"button",tabIndex:0,onClick:()=>dt(e),onKeyDown:t=>"Enter"===t.key&&dt(e),className:"appointments-grid",style:{display:"grid",gridTemplateColumns:ee?"1.5fr 1fr 0.8fr":"2.5fr 1fr 1.5fr 0.8fr 1.2fr",gap:ee?"8px":"12px",padding:ee?"10px 12px":"12px 18px",background:nt(X)===nt(e)?"#E8EEF4":"#FFFFFF",borderTop:"1px solid #F1F1F1",alignItems:"center",cursor:"pointer",fontSize:ee?"11px":"13px"}},a.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:ee?"8px":"10px"}},ot(e)?a.default.createElement("img",{src:e.image,alt:"",style:{width:ee?"32px":"36px",height:ee?"32px":"36px",borderRadius:"50%",objectFit:"cover"}}):a.default.createElement("div",{style:{width:ee?"32px":"36px",height:ee?"32px":"36px",borderRadius:"50%",background:it(e.patientName),display:"flex",alignItems:"center",justifyContent:"center",color:"#FFFFFF",fontWeight:600,fontSize:ee?"14px":"16px"}},at(e.patientName)),a.default.createElement("div",null,a.default.createElement("div",{style:{fontWeight:600,color:"#1a1a1a",fontSize:ee?"11px":"13px"}},e.patientName),a.default.createElement("div",{style:{fontSize:ee?"9px":"11px",color:"#888"}},e.email))),!ee&&a.default.createElement("div",{style:{color:"#555",fontSize:"12px"}},e.patientId),a.default.createElement("div",{style:{color:"#555",fontSize:ee?"10px":"12px"}},(()=>{const t=e.appointmentDate||"",n=t.match(/\s(\d{1,2}:\d{2}(?:\s*(?:AM|PM))?)$/i);return n?a.default.createElement(a.default.Fragment,null,a.default.createElement("div",null,t.slice(0,n.index).trim()),a.default.createElement("div",{style:{fontSize:ee?"9px":"11px",color:"#888"}},n[1].trim())):a.default.createElement("div",null,t)})()),!ee&&a.default.createElement("div",{style:{color:"#555",fontSize:"12px"}},e.appointmentTime||"-"),!ee&&a.default.createElement("div",{style:{color:"#555",fontSize:"12px"}},e.doctorName||e.doctor||"-"))))),!J&&!Q&&Ye.length>0&&a.default.createElement("div",{style:{padding:ee?"12px 14px":"14px 18px",borderTop:"1px solid #F1F1F1",display:"flex",justifyContent:"space-between",alignItems:"center",background:"#FFFFFF",flexWrap:ee?"wrap":"nowrap",gap:ee?"10px":"0"}},a.default.createElement("div",{style:{fontSize:ee?"11px":"12px",color:"#666"}},"Showing page ",Le," of ",Ve," (",qe," total)"),a.default.createElement("div",{style:{display:"flex",gap:"6px",alignItems:"center"}},a.default.createElement("button",{onClick:()=>$e((e=>Math.max(1,e-1))),disabled:1===Le,style:{padding:ee?"6px 10px":"6px 12px",border:"1px solid #E5E5E5",borderRadius:"4px",background:1===Le?"#F5F5F5":"#FFFFFF",color:1===Le?"#999":"#1a1a1a",fontSize:ee?"11px":"12px",fontFamily:ht,fontWeight:600,cursor:1===Le?"not-allowed":"pointer",opacity:1===Le?.5:1}},"Previous"),a.default.createElement("div",{style:{display:"flex",gap:"4px"}},[...Array(Math.min(5,Ve))].map(((e,t)=>{let n;return n=Ve<=5||Le<=3?t+1:Le>=Ve-2?Ve-4+t:Le-2+t,a.default.createElement("button",{key:n,onClick:()=>$e(n),style:{padding:ee?"6px 10px":"6px 12px",border:Le===n?"none":"1px solid #E5E5E5",borderRadius:"4px",background:Le===n?"#4C4DDC":"#FFFFFF",color:Le===n?"#FFFFFF":"#1a1a1a",fontSize:ee?"11px":"12px",fontFamily:ht,fontWeight:600,cursor:"pointer",minWidth:ee?"32px":"36px"}},n)}))),a.default.createElement("button",{onClick:()=>$e((e=>Math.min(Ve,e+1))),disabled:Le===Ve,style:{padding:ee?"6px 10px":"6px 12px",border:"1px solid #E5E5E5",borderRadius:"4px",background:Le===Ve?"#F5F5F5":"#FFFFFF",color:Le===Ve?"#999":"#1a1a1a",fontSize:ee?"11px":"12px",fontFamily:ht,fontWeight:600,cursor:Le===Ve?"not-allowed":"pointer",opacity:Le===Ve?.5:1}},"Next"))))),a.default.createElement("div",{style:{flex:ee?"none":"1 1 35%",width:ee?"100%":"auto",display:X||!ee?"flex":"none",flexDirection:"column",minHeight:ee?"auto":0}},a.default.createElement("div",{style:{border:"1px solid #E5E5E5",borderRadius:"8px",overflow:"hidden",background:"#FFFFFF",boxShadow:"0 1px 4px rgba(0,0,0,0.08)",display:"flex",flexDirection:"column",flex:ee?"none":1,minHeight:ee?"auto":0}},X?a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:ee?"12px 14px":"16px 18px",background:"#E8EEF4",borderBottom:"1px solid #E5E5E5"}},a.default.createElement("div",null,a.default.createElement("div",{style:{color:"#002668",fontSize:ee?"14px":"16px",fontWeight:"700"}},X.patientName||"N/A"),a.default.createElement("div",{style:{color:"#002668",fontSize:ee?"11px":"13px"}},X.patientId||X.mrn||"N/A")),a.default.createElement("div",null,ot(X)?a.default.createElement("img",{style:{width:ee?"36px":"44px",height:ee?"36px":"44px",borderRadius:"50%",objectFit:"cover"},src:X.image,alt:X.patientName}):a.default.createElement("div",{style:{width:ee?"36px":"44px",height:ee?"36px":"44px",borderRadius:"50%",background:it(X.patientName),display:"flex",alignItems:"center",justifyContent:"center",color:"#FFFFFF",fontWeight:700,fontSize:ee?"16px":"20px"}},at(X.patientName)))),a.default.createElement("div",{style:{padding:ee?"12px 14px":"14px 18px",gap:ee?"10px":"12px",display:"flex",flexDirection:"column",background:"white",overflow:"auto",flex:1,position:"relative"}},a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Speciality"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ee?"12px":"13px"}},X?.specialisation||X?.speciality||"N/A")),a.default.createElement("div",{style:{textAlign:"right"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Appointment Type"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ee?"12px":"13px"}},X?.type||X?.appointmentType||"Online"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Appointment Date"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ee?"12px":"13px"}},X?.date||X?.appointmentDate||"N/A")),a.default.createElement("div",{style:{textAlign:"right"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Appointment Time"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ee?"12px":"13px"}},X?.time||X?.appointmentTime||"N/A"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Doctor"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ee?"12px":"13px"}},X?.doctor||X?.doctorName||"N/A"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Hospital"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ee?"12px":"13px"}},X?.hospital||X?.hospitalName||"N/A"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ee?"10px":"11px",color:"#888",marginBottom:"3px"}},"Reason for Appointment"),a.default.createElement("div",{style:{fontWeight:"600",fontSize:ee?"11px":"12px",lineHeight:"1.4"}},X?.reason||X?.reasonForAppointment||"No reason provided"))),"upcoming"===U&&a.default.createElement("div",{style:{display:"flex",flexDirection:ee?"column":"row",gap:"6px",marginTop:"10px"}},a.default.createElement("button",{type:"button",onClick:st,disabled:we,style:{flex:1,background:we?"#99e4e8":"#1CC3CE",color:"#FFFFFF",border:"1px solid #1CC3CE",borderRadius:"6px",padding:ee?"10px 8px":"8px 6px",fontFamily:ht,fontWeight:600,fontSize:ee?"11px":"12px",cursor:we?"not-allowed":"pointer"}},we?"Connecting...":"Join Call >")),"upcoming"===U&&ve&&a.default.createElement("div",{style:{fontSize:"11px",color:"#e53935",marginTop:"6px",textAlign:"center",width:"100%"}},"⚠️ ",ve))):a.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",padding:"40px",color:"#888",textAlign:"center"}},a.default.createElement("div",null,a.default.createElement("div",{style:{fontSize:"16px",marginBottom:"8px"}},"📋"),a.default.createElement("div",{style:{fontSize:"13px"}},"Select an appointment to view details"))))))),ue&&a.default.createElement("div",{style:{position:"fixed",left:ge?"0":ee?"10px":`${Ce.x}px`,top:ge?"0":ee?"70px":`${Ce.y}px`,right:ge?"0":ee?"10px":"auto",bottom:ge?"0":"auto",width:ge?"100vw":ee?"calc(100vw - 20px)":me?"350px":`${De.width}px`,height:ge?"100vh":me?"auto":ee?"300px":`${De.height}px`,background:"#FFFFFF",borderRadius:ge?"0":"8px",boxShadow:"0 8px 24px rgba(0, 0, 0, 0.3)",zIndex:1e4,overflow:"hidden",display:"flex",flexDirection:"column",transition:We||Re?"none":"all 0.3s ease"}},a.default.createElement("div",{onPointerDown:ee||ge?void 0:ft,onPointerMove:ee||ge?void 0:mt,onPointerUp:ee||ge?void 0:xt,onPointerCancel:ee||ge?void 0:xt,style:{background:"linear-gradient(135deg, #4C4DDC 0%, #3A3BBD 100%)",color:"#FFFFFF",padding:ee?"8px 10px":"10px 12px",display:"flex",justifyContent:"space-between",alignItems:"center",cursor:ee||ge?"default":"move",userSelect:"none"}},a.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:ee?"6px":"8px",flex:1,minWidth:0}},a.default.createElement("div",{style:{width:ee?"6px":"8px",height:ee?"6px":"8px",borderRadius:"50%",background:"#FF4444",animation:"pulse 2s infinite",flexShrink:0}}),a.default.createElement("span",{style:{fontSize:ee?"11px":"13px",fontWeight:600,fontFamily:ht,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},"Video Call - ",X?.patientName||"Patient")),a.default.createElement("div",{style:{display:"flex",gap:ee?"4px":"6px",alignItems:"center",flexShrink:0}},!ge&&a.default.createElement("button",{onClick:ct,style:{background:"rgba(255, 255, 255, 0.2)",border:"1px solid rgba(255, 255, 255, 0.3)",borderRadius:"6px",color:"#FFFFFF",cursor:"pointer",padding:ee?"5px 8px":"6px 10px",lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",minWidth:ee?"28px":"32px",height:ee?"28px":"32px",transition:"background 0.2s ease"},onMouseEnter:e=>e.target.style.background="rgba(255, 255, 255, 0.3)",onMouseLeave:e=>e.target.style.background="rgba(255, 255, 255, 0.2)",title:me?"Restore":"Minimize"},me?a.default.createElement("svg",{width:ee?"14":"16",height:ee?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("rect",{x:"3",y:"3",width:"10",height:"10",stroke:"white",strokeWidth:"1.8",fill:"none"})):a.default.createElement("svg",{width:ee?"14":"16",height:ee?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("line",{x1:"3",y1:"8",x2:"13",y2:"8",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round"}))),a.default.createElement("button",{onClick:ut,style:{background:"rgba(255, 255, 255, 0.2)",border:"1px solid rgba(255, 255, 255, 0.3)",borderRadius:"6px",color:"#FFFFFF",cursor:"pointer",padding:ee?"5px 8px":"6px 10px",lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",minWidth:ee?"28px":"32px",height:ee?"28px":"32px",transition:"background 0.2s ease"},onMouseEnter:e=>e.target.style.background="rgba(255, 255, 255, 0.3)",onMouseLeave:e=>e.target.style.background="rgba(255, 255, 255, 0.2)",title:ge?"Exit Fullscreen":"Fullscreen"},ge?a.default.createElement("svg",{width:ee?"14":"16",height:ee?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("path",{d:"M10 3H13V6M6 13H3V10M13 10V13H10M3 6V3H6",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})):a.default.createElement("svg",{width:ee?"14":"16",height:ee?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("path",{d:"M3 6V3H6M13 10V13H10M10 3H13V6M6 13H3V10",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"}))),a.default.createElement("button",{onClick:pt,style:{background:"rgba(255, 255, 255, 0.2)",border:"1px solid rgba(255, 255, 255, 0.3)",borderRadius:"6px",color:"#FFFFFF",cursor:"pointer",padding:ee?"5px 8px":"6px 10px",lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",minWidth:ee?"28px":"32px",height:ee?"28px":"32px",fontWeight:"bold",fontSize:ee?"18px":"22px",transition:"background 0.2s ease"},onMouseEnter:e=>e.target.style.background="rgba(255, 255, 255, 0.3)",onMouseLeave:e=>e.target.style.background="rgba(255, 255, 255, 0.2)",title:"Close"},"×"))),!me&&a.default.createElement("div",{style:{flex:1,background:"#000000",position:"relative"}},a.default.createElement("iframe",{src:(()=>{if(!ye)return"";const e=String(L||"").replace(/\/?$/,"/");return console.log("${base}token=${callToken}",`${e}token=${ye}`),`${e}token=${ye}`})(),style:{width:"100%",height:"100%",border:"none"},allow:"camera; microphone; display-capture; autoplay",allowFullScreen:!0,title:"Video Call"})),!ee&&!ge&&!me&&a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{onPointerDown:e=>gt("top-left",e),onPointerMove:mt,onPointerUp:xt,onPointerCancel:xt,style:{position:"absolute",left:0,top:0,width:"16px",height:"16px",cursor:"nwse-resize",background:"transparent",zIndex:10001}}),a.default.createElement("div",{onPointerDown:e=>gt("top-right",e),onPointerMove:mt,onPointerUp:xt,onPointerCancel:xt,style:{position:"absolute",right:0,top:0,width:"16px",height:"16px",cursor:"nesw-resize",background:"transparent",zIndex:10001}}),a.default.createElement("div",{onPointerDown:e=>gt("bottom-left",e),onPointerMove:mt,onPointerUp:xt,onPointerCancel:xt,style:{position:"absolute",left:0,bottom:0,width:"16px",height:"16px",cursor:"nesw-resize",background:"transparent",zIndex:10001}}),a.default.createElement("div",{onPointerDown:e=>gt("bottom-right",e),onPointerMove:mt,onPointerUp:xt,onPointerCancel:xt,style:{position:"absolute",right:0,bottom:0,width:"16px",height:"16px",cursor:"nwse-resize",background:"transparent",zIndex:10001}})),a.default.createElement("style",null,"\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n "))),yt&&a.default.createElement("div",{style:{position:"fixed",inset:0,zIndex:1e5,display:"flex",alignItems:"center",justifyContent:"center",padding:"24px",background:"rgba(0,0,0,0.4)",boxSizing:"border-box"}},a.default.createElement("div",{style:{fontFamily:ht,maxWidth:"400px",width:"100%",padding:"32px 24px",background:"#FFFFFF",borderRadius:"12px",boxShadow:"0 8px 32px rgba(0,0,0,0.2)",textAlign:"center"}},a.default.createElement("div",{style:{fontSize:"48px",marginBottom:"16px"}},"🔒"),a.default.createElement("h2",{style:{fontSize:"20px",fontWeight:700,color:"#1a1a1a",margin:"0 0 8px 0"}},R?"Not authorised":"Sign in required"),a.default.createElement("p",{style:{fontSize:"14px",color:"#666",margin:0,lineHeight:1.5}},Et),a.default.createElement("p",{style:{fontSize:"13px",color:"#999",marginTop:"16px",marginBottom:0}},"Redirecting to login...")))),a.default.createElement(w,null,Ft)};let v=null;const k={showWidget:(e,t)=>{v||(v=document.createElement("div"),document.body.appendChild(v));const n=()=>a.default.createElement(a.default.Fragment,null,a.default.createElement(S,{config:e}));i.default.render(a.default.createElement(n,null),v)},closePopup:()=>{v&&(i.default.unmountComponentAtNode(v),v=null)}};window.BookingSDK=k,e.AppointmentPage=S,e.PIH_APPOINTMENT_WIDGET_CLASS=F,e.default=k,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("react-dom")):"function"==typeof define&&define.amd?define(["exports","react","react-dom"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MyPackage={},e.React,e.ReactDOM)}(this,(function(e,t,n){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(t),i=o(n);const r="/appointment/V1/consultant/all-appointments",l="/notification/V1/consultation/online/initiate",d="dMtEGhak",s="https://wbafedevittisalwe01-had2b3e0a7h6fyey.westeurope-01.azurewebsites.net/call/",p=async function(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"ONLINE",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},i=(e||"").toUpperCase();"INPROGRESS"===i&&(i="IN_PROGRESS");const l=a.apiBaseUrl,s=a.hospitalId||d,p=a.doctorId,c=a.token||"",u={hospitalId:s,doctorId:p,fromDate:t,toDate:n,statuses:i,type:o},f=`${l}${r}`,m=await async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";const o=new URL(e);return o.search=new URLSearchParams(t).toString(),fetch(o,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`${n}`}}).then((async e=>{const t=await e.json().catch((()=>({})));return e.ok?t:{err:t?.resultInfo?.message||"Something went wrong!",status:e.status}})).catch((e=>(console.error("Fetch error:",e),{err:e?.message||String(e)||"Network error"})))}(f,u,"PIH-Appointment-Widget",c);return m},c=async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};console.log("initiateConsultation -> config",t);const n=`${t.apiBaseUrl.replace(/\/$/,"")}${l}`,o=t.appToken||"";return async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=arguments.length>4?arguments[4]:void 0;const a=new URL(e);Object.keys(n).forEach((e=>{a.searchParams.append(e,n[e])}));const i={"Content-Type":"application/json"};o&&(i.Authorization=o);const r={method:"POST",headers:i,body:JSON.stringify(t)};return fetch(a.toString(),r).then((async e=>{const t=await e.json().catch((()=>({})));return e.ok?t:{err:t?.resultInfo?.message||"Something went wrong!",status:e.status}})).catch((e=>(console.error("Fetch error:",e),{err:e.message||"Network error"})))}(n,{patientId:String(e.patientId||""),primaryPatientId:String(e.primaryPatientId||e.patientId||""),hospitalId:t.hospitalId||d,doctorId:String(t.doctorId),patientName:e.patientName||e.name||"",doctorName:e.doctorName||t.doctorName,appointmentId:String(e.id||e.appointmentId||e._id||"")},"PIH-Appointment-Widget",{},o)};const u="pih_appointment_idToken",f="pih_appointment_email",m="pih_appointment_appToken",x="pih_appointment_doctorId",g="pih_appointment_userName",h="pih_appointment_apiBaseUrl",y=720,E="pih-appointment-widget",F="data-pih-widget";class b extends t.Component{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e,t){"undefined"!=typeof console&&console.error&&console.error("Appointment widget error:",e,t)}render(){return this.state.hasError?a.default.createElement("div",{className:E,[F]:"teleconsult-appointments",style:{fontFamily:'"Nunito", serif',background:"#F5F5F7",boxSizing:"border-box",minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",padding:"24px",textAlign:"center"}},a.default.createElement("div",{style:{maxWidth:"400px"}},a.default.createElement("div",{style:{fontSize:"48px",marginBottom:"16px"}},"⚠️"),a.default.createElement("h2",{style:{fontSize:"20px",fontWeight:700,color:"#1a1a1a",margin:"0 0 8px 0"}},"Something went wrong"),a.default.createElement("p",{style:{fontSize:"14px",color:"#666",margin:0,lineHeight:1.5}},"Please refresh the page or try again later."))):this.props.children}}const w=e=>{let{config:n={}}=e;const[o,i]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(h):null}catch{return null}})),r=n.apiBaseUrl||o||"https://afiyaapiqa.powermindinc.com",l=n.hospitalId||d,[w,S]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(u):null}catch{return null}})),[v,k]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(f):null}catch{return null}})),C=n.idToken||n.token||w,I=n.email||v;t.useEffect((()=>{try{if("undefined"==typeof localStorage)return;const e=n.idToken||n.token;if(e&&String(e).trim()){localStorage.getItem(u)!==e&&(z(null),T(null),A(null),localStorage.removeItem(m),localStorage.removeItem(x),localStorage.removeItem(g)),localStorage.setItem(u,e),S(e)}n.email&&String(n.email).trim()&&(localStorage.setItem(f,n.email),k(n.email)),n.apiBaseUrl&&String(n.apiBaseUrl).trim()&&(localStorage.setItem(h,n.apiBaseUrl.trim()),i(n.apiBaseUrl.trim()))}catch(e){}}),[n.idToken,n.token,n.email,n.apiBaseUrl]);const[D,z]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(m):null}catch{return null}})),[W,T]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(x):null}catch{return null}})),[M,A]=t.useState((()=>{try{return"undefined"!=typeof localStorage?localStorage.getItem(g):null}catch{return null}})),[R,N]=t.useState((()=>{try{if("undefined"==typeof localStorage)return!1;const e=localStorage.getItem(m),t=localStorage.getItem(u),n=localStorage.getItem(f);return!e&&!(!t||!n)}catch{return!1}})),[P,j]=t.useState(null),[B,H]=t.useState(!1),[L,U]=t.useState(0);t.useEffect((()=>{D&&R&&N(!1)}),[D,R]),t.useEffect((()=>{D||(C&&I?(H(!1),j((e=>"Sign in required. Redirecting to home..."===e?null:e))):(j("Sign in required. Redirecting to home..."),H(!0)))}),[D,C,I]),t.useEffect((()=>{if(!B)return;const e=n.homeUrl||"https://wbaemrdevittisalwe01-fnapdpfme7bvduhh.westeurope-01.azurewebsites.net/";if(!e||"undefined"==typeof window)return;const t=setTimeout((()=>{window.location.href=e}),2500);return()=>clearTimeout(t)}),[B,n.homeUrl]),t.useEffect((()=>{if(!R)return;const e=setTimeout((()=>{j("Request timed out. Please try again."),N(!1)}),3e4);return()=>clearTimeout(e)}),[R]);const $=n.joinCallUrl||s;D&&String($||"").replace(/\/?$/,"/");const _=function(e){if(!e||"string"!=typeof e)return{};try{const t=e.split(".");if(3!==t.length)return{};const n=t[1].replace(/-/g,"+").replace(/_/g,"/"),o=n.padEnd(n.length+(4-n.length%4)%4,"=");return JSON.parse(atob(o))}catch{return{}}}(C),O=M||_.name||_.sub||"User",Y=()=>(new Date).toISOString().split("T")[0],[V,q]=t.useState("upcoming"),[X,G]=t.useState([]),[J,K]=t.useState(null),[Q,Z]=t.useState(!1),[ee,te]=t.useState(null),[ne,oe]=t.useState(window.innerWidth<768),[ae,ie]=t.useState("today"),[re,le]=t.useState("today"),[de,se]=t.useState(!1),[pe,ce]=t.useState("asc"),[ue,fe]=t.useState(""),[me,xe]=t.useState(!1),[ge,he]=t.useState(!1),[ye,Ee]=t.useState(!1),[Fe,be]=t.useState(null),[we,Se]=t.useState(null),[ve,ke]=t.useState(!1),[Ce,Ie]=t.useState(null),[De,ze]=t.useState((()=>({x:Math.max(20,"undefined"!=typeof window?window.innerWidth-y-20:300),y:80}))),[We,Te]=t.useState({width:y,height:560}),[Me,Ae]=t.useState(!1),[Re,Ne]=t.useState({x:0,y:0}),[Pe,je]=t.useState(!1),[Be,He]=t.useState(null),[Le,Ue]=t.useState({x:0,y:0,width:0,height:0});t.useState(!1);const[$e,_e]=t.useState(1),Oe=X.filter((e=>{if(!ue.trim())return!0;const t=ue.toLowerCase(),n=(e.patientName||"").toLowerCase(),o=String(e.patientId||"").toLowerCase();return n.includes(t)||o.includes(t)})),Ye=20*($e-1),Ve=Ye+20,qe=Oe.slice(Ye,Ve),Xe=Math.ceil(Oe.length/20),Ge=Oe.length,[Je,Ke]=t.useState(Y()),[Qe,Ze]=t.useState(Y()),[et,tt]=t.useState(),[nt,ot]=t.useState(),at=e=>e?.id||e?._id||e?.appointmentId||e?.patientId||JSON.stringify(e),it=e=>e?.image?e.image:null,rt=e=>e?e.charAt(0).toUpperCase():"?",lt=e=>{if(!e)return"#4C4DDC";const t=["#4C4DDC","#1CC3CE","#FF6B6B","#4ECDC4","#45B7D1","#FFA07A","#98D8C8","#F7DC6F"];return t[e.charCodeAt(0)%t.length]},dt=()=>{const e="asc"===pe?"desc":"asc";ce(e);const t=[...X].sort(((t,n)=>{const o=new Date(t.appointmentDate||t.date||0),a=new Date(n.appointmentDate||n.date||0);return"asc"===e?o-a:a-o}));G(t),_e(1),t.length>0&&K(t[0])},st=t.useCallback((async()=>{if(!D)return;console.log(W,"fetchAppointments -> doctorIdFromLogin");const e=W;Z(!0),te(null);try{const t={apiBaseUrl:r,hospitalId:l,doctorId:e,token:D},n=await p(V,Je,Qe,"PHYSICAL",t);if(401===n.status||403===n.status){try{"undefined"!=typeof localStorage&&(localStorage.removeItem(m),localStorage.removeItem(x),localStorage.removeItem(g))}catch(e){}return z(null),T(null),A(null),U((e=>e+1)),void te("Session expired. Re-authenticating...")}if(n.err)return void te(String(n.err||"Failed to fetch appointments"));const o=n.data||n.appointments||n||[];G(Array.isArray(o)?o:[]),Array.isArray(o)&&o.length>0?K(o[0]):K(null)}catch(e){console.error("Error fetching appointments:",e),te(e.message||"Failed to fetch appointments")}finally{Z(!1)}}),[V,Je,Qe,r,l,W,D]),pt=e=>{K(e)},ct=async()=>{if(J&&D){ke(!0),Ie(null);try{const e={apiBaseUrl:r,hospitalId:l,doctorId:W,doctorName:M||O,appToken:D};console.log(J,"selectedAppointment"),console.log(e,"callConfig");const t=await c(J,e);if(401===t.status||403===t.status)return Ie("Session expired. Please try again."),void ke(!1);if(t.err||!t.data?.token)return Ie(String(t.err||"Failed to initiate call")),void ke(!1);const o=n.joinCallUrl||s,a=t.data.token?String(o||"").replace(/\/?$/,"/")+t.data.token:"";console.log("joinCallUrl",a),be(t.data.token),Se(a||""),xe(!0),he(!1),Ee(!1),Te({width:y,height:560}),ze({x:Math.max(20,window.innerWidth-y-20),y:80})}catch(e){Ie(e.message||"Failed to initiate call")}finally{Ie(null),ke(!1)}}},ut=()=>{xe(!1),he(!1),Ee(!1),be(null),Se(null),Ie(null),st()},ft=()=>{ye&&Ee(!1),he(!ge)},mt=()=>{ge&&he(!1),Ee(!ye)},xt=e=>{if(0!==e.button)return;if(e.target.closest("button"))return;e.currentTarget.setPointerCapture&&e.currentTarget.setPointerCapture(e.pointerId),Ae(!0);const t=e.currentTarget.getBoundingClientRect();Ne({x:e.clientX-t.left,y:e.clientY-t.top})},gt=t.useCallback((e=>{if(!ye)if(Me){const t=e.clientX-Re.x,n=e.clientY-Re.y,o=window.innerWidth-We.width,a=window.innerHeight-We.height;ze({x:Math.max(0,Math.min(t,o)),y:Math.max(0,Math.min(n,a))})}else if(Pe){const t=e.clientX-Le.x,n=e.clientY-Le.y;let o=Le.width,a=Le.height,i=Le.posX,r=Le.posY;const l=300,d=250,s=window.innerWidth-40,p=window.innerHeight-100;if("bottom-right"===Be)o=Math.min(Math.max(Le.width+t,l),s),a=Math.min(Math.max(Le.height+n,d),p),i+o>window.innerWidth&&(o=window.innerWidth-i),r+a>window.innerHeight&&(a=window.innerHeight-r);else if("bottom-left"===Be){o=Math.min(Math.max(Le.width-t,l),s),i=Math.max(0,Le.posX+t),0===i&&(o=Le.posX+Le.width),a=Math.min(Math.max(Le.height+n,d),p),r+a>window.innerHeight&&(a=window.innerHeight-r)}else if("top-right"===Be){o=Math.min(Math.max(Le.width+t,l),s),i+o>window.innerWidth&&(o=window.innerWidth-i);a=Math.min(Math.max(Le.height-n,d),p),r=Math.max(0,Le.posY+n),0===r&&(a=Le.posY+Le.height)}else if("top-left"===Be){o=Math.min(Math.max(Le.width-t,l),s),i=Math.max(0,Le.posX+t),0===i&&(o=Le.posX+Le.width);a=Math.min(Math.max(Le.height-n,d),p),r=Math.max(0,Le.posY+n),0===r&&(a=Le.posY+Le.height)}Te({width:o,height:a}),ze({x:i,y:r})}}),[Me,Pe,Re,Be,Le,De,We,ye]),ht=()=>{Ae(!1),je(!1),He(null)},yt=(e,t)=>{t.preventDefault(),t.stopPropagation(),t.currentTarget.setPointerCapture&&t.currentTarget.setPointerCapture(t.pointerId),je(!0),He(e),Ue({x:t.clientX,y:t.clientY,width:We.width,height:We.height,posX:De.x,posY:De.y})};t.useEffect((()=>{if(!me||ye)return;const e=()=>{if(!(window.innerWidth<768)){const e=ge?350:We.width,t=ge?60:We.height,n=window.innerWidth-40,o=window.innerHeight-100,a=Math.min(e,n),i=Math.min(t,o);a===We.width&&i===We.height||Te({width:a,height:i});const r=window.innerWidth-a-20,l=window.innerHeight-i-20;ze((e=>({x:Math.min(e.x,r),y:Math.min(e.y,l)})))}};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)}),[me,ge,ye,We]),t.useEffect((()=>{if(!(C&&I&&(!D||L>0)))return;let e=!1;return N(!0),j(null),(async(e,t,n,o)=>{const a=`${e.replace(/\/$/,"")}/um/user/V1/sso/login?hospitalId=${encodeURIComponent(t)}`,i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({idToken:n,email:o})};return console.log("[getTokenFromSso] request",{url:a,body:{idToken:n?n.slice(0,50)+"...":null,email:o}}),fetch(a,i).then((e=>(console.log("[getTokenFromSso] response status",e.status,e.statusText),e.ok?e.json().then((e=>(console.log("[getTokenFromSso] success",{hasData:!!e,dataKeys:e?Object.keys(e):[],hasAccessToken:!!e?.data?.access_token}),e))):e.json().then((t=>{const n=t?.resultInfo?.message||"SSO login failed";return console.log("[getTokenFromSso] error body",t),{err:n,status:e.status}})).catch((()=>({err:"Something went wrong!",status:e.status})))))).catch((e=>(console.error("[getTokenFromSso] catch",e),{err:e.message||"Network error"})))})(r,l,C,I).then((t=>{if(e)return;const n=function(e){return!e||e.err?null:e.data?.access_token??e.data?.token??e.token??e.accessToken??null}(t);if(400===t.status)return j(t.err||"Invalid request. Redirecting to home..."),N(!1),void H(!0);if(t.err||!n){j(String(t.err||"Failed to get token")),z(null),T(null),A(null);try{"undefined"!=typeof localStorage&&(localStorage.removeItem(m),localStorage.removeItem(x),localStorage.removeItem(g))}catch(e){}}else{const e=function(e){if(!e?.data)return null;const t=e.data.doctor_id??e.data.doctorId??null;return console.log(t,"extractDoctorIdFromLoginResponse -> id"),null!=t?String(t):null}(t);console.log(e,"extractDoctorIdFromLoginResponse -> doctorId");const o=function(e){if(!e?.data)return null;const t=e.data.name??e.data.doctor_name??e.data.userName??null;return null!=t?String(t):null}(t);z(n),T(e),A(o),j(null),H(!1);try{"undefined"!=typeof localStorage&&(localStorage.setItem(m,n),e&&localStorage.setItem(x,e),o&&localStorage.setItem(g,o))}catch(e){}}})).catch((()=>{})).finally((()=>{e||N(!1)})),()=>{e=!0}}),[r,l,C,I,L]),t.useEffect((()=>{_e(1)}),[V,ae,Je,Qe,ue]),t.useEffect((()=>{!R&&D&&st()}),[st,D,R]),t.useEffect((()=>{const e=document.createElement("link");e.href="https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap",e.rel="stylesheet",document.head.appendChild(e);const t=document.createElement("style");t.innerHTML="\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n \n @media (max-width: 768px) {\n .appointments-grid {\n grid-template-columns: 1.5fr 1fr 0.8fr !important;\n }\n .appointments-header-grid {\n grid-template-columns: 1.5fr 1fr 0.8fr !important;\n }\n .hide-on-mobile {\n display: none !important;\n }\n }\n @media (max-width: 480px) {\n .appointments-header-grid {\n font-size: 10px !important;\n }\n .appointments-grid {\n font-size: 11px !important;\n }\n }\n ",document.head.appendChild(t);const n=()=>{oe(window.innerWidth<768)};return window.addEventListener("resize",n),()=>{document.head.removeChild(e),document.head.removeChild(t),window.removeEventListener("resize",n)}}),[]),t.useEffect((()=>{const e=e=>{!de||e.target.closest("button")||e.target.closest('input[type="date"]')||se(!1)};return document.addEventListener("click",e),()=>{document.removeEventListener("click",e)}}),[de]);let Et='"Nunito", serif';const Ft=P||!D&&(!C||!I),bt=P||"Sign in required. Redirecting to home...";let wt;return wt=R&&C&&I?a.default.createElement("div",{className:E,[F]:"teleconsult-appointments",style:{fontFamily:Et,background:"#F5F5F7",boxSizing:"border-box",height:"100%",minHeight:"100vh",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:"24px"}},a.default.createElement("style",null,"@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }"),a.default.createElement("div",{style:{width:"40px",height:"40px",border:"3px solid #f3f3f3",borderTop:"3px solid #4C4DDC",borderRadius:"50%",animation:"spin 1s linear infinite",marginBottom:"16px"}}),a.default.createElement("p",{style:{fontSize:"14px",color:"#666",margin:0}},"Checking authorisation...")):a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{className:E,[F]:"teleconsult-appointments",style:{fontFamily:Et,background:"#F5F5F7",boxSizing:"border-box",height:"100%",minHeight:"100vh",width:"100%",display:"flex",flexDirection:"column",overflow:"hidden"}},a.default.createElement("div",{style:{background:"#FFFFFF",padding:ne?"10px 12px":"12px 24px",display:"flex",justifyContent:"space-between",alignItems:"center",borderBottom:"1px solid #E5E5E5",flexWrap:"nowrap",gap:ne?"8px":"0"}},a.default.createElement("div",{style:{position:"relative",width:ne?"calc(100% - 90px)":"480px",maxWidth:ne?"none":"480px"}},a.default.createElement("input",{type:"text",placeholder:"Search by patient name or ID",value:ue,onChange:e=>fe(e.target.value),style:{width:"100%",padding:ne?"8px 32px 8px 10px":"8px 36px 8px 14px",border:"1px solid #E5E5E5",borderRadius:"6px",fontSize:ne?"12px":"13px",fontFamily:Et,background:"#FFFFFF",outline:"none",boxSizing:"border-box"}}),ue&&a.default.createElement("button",{onClick:()=>fe(""),style:{position:"absolute",right:"8px",top:"50%",transform:"translateY(-50%)",background:"none",border:"none",cursor:"pointer",padding:"4px",display:"flex",alignItems:"center",justifyContent:"center",color:"#999",fontSize:"16px"},title:"Clear search"},"✕")),!1),a.default.createElement("div",{style:{padding:ne?"12px":"16px 24px",flex:1,minHeight:0,overflow:"hidden",display:"flex",flexDirection:"column"}},a.default.createElement("div",{style:{marginBottom:ne?"10px":"14px"}},a.default.createElement("h1",{style:{fontSize:ne?"18px":"22px",fontWeight:700,color:"#1a1a1a",margin:"0 0 2px 0"}},"Tele Consultation"),a.default.createElement("p",{style:{fontSize:ne?"11px":"12px",color:"#999",margin:0}},"Displaying All Tele Consultation Appointments")),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:ne?"flex-start":"center",marginBottom:ne?"10px":"14px",flexDirection:ne?"column":"row",gap:ne?"12px":"0"}},a.default.createElement("div",{style:{display:"flex",gap:"6px",flexWrap:"wrap",width:ne?"100%":"auto"}},a.default.createElement("button",{onClick:()=>q("upcoming"),style:{background:"upcoming"===V?"#4C4DDC":"#FFFFFF",padding:ne?"8px 10px":"9px 16px",border:"upcoming"===V?"none":"1px solid #E5E5E5",borderRadius:"6px",fontSize:ne?"10px":"13px",color:"upcoming"===V?"white":"#555555",fontWeight:600,fontFamily:Et,cursor:"pointer",flex:ne?"1 1 auto":"none",minWidth:ne?"0":"auto",transition:"all 0.3s ease",whiteSpace:"nowrap"}},"Upcoming Appointments"),a.default.createElement("button",{onClick:()=>q("completed"),style:{background:"completed"===V?"#4C4DDC":"#FFFFFF",padding:ne?"8px 10px":"9px 16px",border:"completed"===V?"none":"1px solid #E5E5E5",borderRadius:"6px",fontSize:ne?"10px":"13px",color:"completed"===V?"white":"#555555",fontWeight:600,fontFamily:Et,cursor:"pointer",flex:ne?"1 1 auto":"none",minWidth:ne?"0":"auto",transition:"all 0.3s ease",whiteSpace:"nowrap"}},"Completed Appointments"),a.default.createElement("button",{onClick:()=>q("cancelled"),style:{background:"cancelled"===V?"#4C4DDC":"#FFFFFF",padding:ne?"8px 10px":"9px 16px",border:"cancelled"===V?"none":"1px solid #E5E5E5",borderRadius:"6px",fontSize:ne?"10px":"13px",color:"cancelled"===V?"white":"#555555",fontWeight:600,fontFamily:Et,cursor:"pointer",flex:ne?"1 1 auto":"none",minWidth:ne?"0":"auto",transition:"all 0.3s ease",whiteSpace:"nowrap"}},"Cancelled Appointments")),a.default.createElement("div",{style:{display:"flex",gap:"8px",alignItems:"center",width:"auto",position:"relative",justifyContent:ne?"flex-start":"flex-end"}},a.default.createElement("button",{onClick:()=>{de||(tt(Je),ot(Qe),le(ae)),se(!de)},style:{padding:"8px 12px",fontFamily:Et,fontWeight:600,border:"1px solid #E5E5E5",borderRadius:"6px",fontSize:ne?"11px":"13px",color:"#1a1a1a",background:"#FFFFFF",display:"flex",alignItems:"center",gap:ne?"4px":"6px",cursor:"pointer",flex:"none",minWidth:ne?"100px":"auto",justifyContent:"center"}},a.default.createElement("svg",{width:ne?"12":"14",height:ne?"12":"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},a.default.createElement("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),a.default.createElement("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),a.default.createElement("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),a.default.createElement("line",{x1:"3",y1:"10",x2:"21",y2:"10"})),a.default.createElement("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},(()=>{switch(ae){case"today":default:return"Today";case"tomorrow":return"Tomorrow";case"currentWeek":return"Current Week";case"thisMonth":return"This Month";case"currentYear":return"Current Year";case"custom":return ne?"Custom":`${Je} to ${Qe}`}})()),a.default.createElement("svg",{width:ne?"8":"10",height:ne?"8":"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},a.default.createElement("polyline",{points:"6 9 12 15 18 9"}))),de&&a.default.createElement("div",{style:{position:"absolute",top:"100%",right:ne?"auto":0,left:ne?0:"auto",marginTop:"4px",background:"#FFFFFF",border:"1px solid #E5E5E5",borderRadius:"8px",boxShadow:"0 4px 16px rgba(0,0,0,0.15)",padding:"8px",zIndex:1e3,minWidth:ne?"280px":"240px",width:ne?"calc(100vw - 24px)":"auto",maxWidth:ne?"calc(100vw - 24px)":"280px"}},a.default.createElement("div",{style:{marginBottom:"custom"===re?"12px":"0"}},["thisMonth","today","tomorrow","currentWeek","currentYear","custom"].map((e=>a.default.createElement("button",{key:e,onClick:()=>{if(le(e),"custom"!==e){const t=(e=>{const t=new Date;let n,o;switch(e){case"today":default:n=o=Y();break;case"tomorrow":const e=new Date(t);e.setDate(e.getDate()+1),n=o=e.toISOString().split("T")[0];break;case"currentWeek":const a=new Date(t),i=new Date(t),r=t.getDay(),l=0===r?-6:1-r;a.setDate(t.getDate()+l),i.setDate(a.getDate()+6),n=a.toISOString().split("T")[0],o=i.toISOString().split("T")[0];break;case"thisMonth":const d=new Date(t.getFullYear(),t.getMonth(),1),s=new Date(t.getFullYear(),t.getMonth()+1,0);n=d.toISOString().split("T")[0],o=s.toISOString().split("T")[0];break;case"currentYear":n=`${t.getFullYear()}-01-01`,o=`${t.getFullYear()}-12-31`}return{from:n,to:o}})(e);ie(e),Ke(t.from),Ze(t.to),tt(t.from),ot(t.to),se(!1)}else tt(""),ot("")},style:{width:"100%",padding:"10px 12px",background:re===e?"#E8EEF4":"#FFFFFF",border:"none",borderRadius:"4px",fontSize:"13px",fontFamily:Et,cursor:"pointer",textAlign:"left",fontWeight:re===e?600:400,color:re===e?"#4C4DDC":"#1a1a1a",marginBottom:"4px",display:"flex",justifyContent:"space-between",alignItems:"center",transition:"all 0.2s ease"},onMouseEnter:t=>{re!==e&&(t.target.style.background="#F5F5F5")},onMouseLeave:t=>{re!==e&&(t.target.style.background="#FFFFFF")}},a.default.createElement("span",null,{thisMonth:"This Month",today:"Today",tomorrow:"Tomorrow",currentWeek:"Current Week",currentYear:"Current Year",custom:"Custom"}[e]),re===e&&a.default.createElement("span",{style:{color:"#4C4DDC",fontSize:"16px"}},"✓"))))),"custom"===re&&a.default.createElement("div",{style:{paddingTop:"8px",borderTop:"1px solid #E5E5E5"}},a.default.createElement("div",{style:{marginBottom:"8px"}},a.default.createElement("input",{type:"date",value:et,onChange:e=>tt(e.target.value),placeholder:"Start Date",style:{width:"100%",padding:"10px 8px",border:"1px solid #E5E5E5",borderRadius:"4px",fontSize:"13px",fontFamily:Et,boxSizing:"border-box",cursor:"pointer"}})),a.default.createElement("div",{style:{marginBottom:"12px"}},a.default.createElement("input",{type:"date",value:nt,onChange:e=>ot(e.target.value),placeholder:"End Date",style:{width:"100%",padding:"10px 8px",border:"1px solid #E5E5E5",borderRadius:"4px",fontSize:"13px",fontFamily:Et,boxSizing:"border-box",cursor:"pointer"}})),a.default.createElement("div",{style:{display:"flex",gap:"8px"}},a.default.createElement("button",{onClick:()=>{le(ae),tt(Je),ot(Qe),se(!1)},style:{flex:1,padding:"10px 12px",background:"#FFFFFF",color:"#4C4DDC",border:"1px solid #4C4DDC",borderRadius:"4px",fontSize:"13px",fontFamily:Et,fontWeight:600,cursor:"pointer"}},"Cancel"),a.default.createElement("button",{onClick:()=>{et&&nt&&(ie("custom"),Ke(et),Ze(nt),se(!1))},style:{flex:1,padding:"10px 12px",background:"#4C4DDC",color:"#FFFFFF",border:"none",borderRadius:"4px",fontSize:"13px",fontFamily:Et,fontWeight:600,cursor:"pointer"}},"Submit")))))),a.default.createElement("div",{style:{display:"flex",flexDirection:ne?"column":"row",gap:ne?"12px":"14px",flex:1,minHeight:0,overflow:ne?"auto":"hidden"}},a.default.createElement("div",{style:{flex:ne?"none":"1 1 65%",width:ne?"100%":"auto",display:"flex",flexDirection:"column",minHeight:ne?"400px":0}},a.default.createElement("div",{style:{background:"#FFFFFF",borderRadius:"8px",boxShadow:"0 1px 4px rgba(0,0,0,0.08)",overflow:"hidden",display:"flex",flexDirection:"column",flex:ne?"none":1,minHeight:ne?"auto":0}},a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:ne?"12px 14px":"14px 18px",borderBottom:"1px solid #F1F1F1"}},a.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:ne?"6px":"8px"}},a.default.createElement("span",{style:{fontSize:ne?"14px":"15px",fontWeight:700,color:"#1a1a1a"}},"Appointments"),a.default.createElement("span",{style:{background:"#4C4DDC",color:"#fff",fontSize:ne?"10px":"11px",fontWeight:600,padding:ne?"2px 7px":"3px 8px",borderRadius:"12px"}},Ge))),a.default.createElement("div",{className:"appointments-header-grid",style:{display:"grid",gridTemplateColumns:ne?"1.5fr 1fr 0.8fr":"2.5fr 1fr 1.5fr 0.8fr 1.2fr",gap:ne?"8px":"12px",padding:ne?"8px 12px":"10px 18px",background:"#F5F5F5",fontSize:ne?"10px":"12px",fontWeight:600,color:"#666"}},a.default.createElement("div",null,"Patients name"),!ne&&a.default.createElement("div",null,"Patient ID"),a.default.createElement("div",{onClick:dt,style:{display:"flex",alignItems:"center",gap:"3px",cursor:"pointer",userSelect:"none"}},"Date",a.default.createElement("span",{style:{opacity:.7,fontSize:"10px"}},"asc"===pe?"▲":"▼")),!ne&&a.default.createElement("div",null,"Slot"),!ne&&a.default.createElement("div",null,"Doctor")),a.default.createElement("div",{style:{overflow:"auto",flex:1}},R?a.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",padding:"40px",color:"#888"}},a.default.createElement("div",{style:{textAlign:"center"}},a.default.createElement("div",{style:{width:"40px",height:"40px",border:"3px solid #f3f3f3",borderTop:"3px solid #4C4DDC",borderRadius:"50%",animation:"spin 1s linear infinite",margin:"0 auto 10px"}}),"Getting token...")):Q?a.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",padding:"40px",color:"#888"}},a.default.createElement("div",{style:{textAlign:"center"}},a.default.createElement("div",{style:{width:"40px",height:"40px",border:"3px solid #f3f3f3",borderTop:"3px solid #4C4DDC",borderRadius:"50%",animation:"spin 1s linear infinite",margin:"0 auto 10px"}}),"Loading appointments...")):ee?a.default.createElement("div",{style:{padding:"40px",textAlign:"center",color:"#FF0000"}},a.default.createElement("div",{style:{fontSize:"16px",marginBottom:"8px"}},"⚠️ Error"),a.default.createElement("div",{style:{fontSize:"13px"}},ee),a.default.createElement("button",{onClick:st,style:{marginTop:"16px",padding:"8px 16px",background:"#4C4DDC",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontFamily:Et}},"Retry")):0===qe.length?a.default.createElement("div",{style:{padding:"40px",textAlign:"center",color:"#888"}},a.default.createElement("div",{style:{fontSize:"16px",marginBottom:"8px"}},"📋"),a.default.createElement("div",{style:{fontSize:"13px"}},ue?`No appointments found for "${ue}"`:"No appointments found"),ue&&a.default.createElement("button",{onClick:()=>fe(""),style:{marginTop:"12px",padding:"6px 12px",background:"#4C4DDC",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px",fontFamily:Et}},"Clear Search")):qe.map((e=>a.default.createElement("div",{key:at(e),role:"button",tabIndex:0,onClick:()=>pt(e),onKeyDown:t=>"Enter"===t.key&&pt(e),className:"appointments-grid",style:{display:"grid",gridTemplateColumns:ne?"1.5fr 1fr 0.8fr":"2.5fr 1fr 1.5fr 0.8fr 1.2fr",gap:ne?"8px":"12px",padding:ne?"10px 12px":"12px 18px",background:at(J)===at(e)?"#E8EEF4":"#FFFFFF",borderTop:"1px solid #F1F1F1",alignItems:"center",cursor:"pointer",fontSize:ne?"11px":"13px"}},a.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:ne?"8px":"10px"}},it(e)?a.default.createElement("img",{src:e.image,alt:"",style:{width:ne?"32px":"36px",height:ne?"32px":"36px",borderRadius:"50%",objectFit:"cover"}}):a.default.createElement("div",{style:{width:ne?"32px":"36px",height:ne?"32px":"36px",borderRadius:"50%",background:lt(e.patientName),display:"flex",alignItems:"center",justifyContent:"center",color:"#FFFFFF",fontWeight:600,fontSize:ne?"14px":"16px"}},rt(e.patientName)),a.default.createElement("div",null,a.default.createElement("div",{style:{fontWeight:600,color:"#1a1a1a",fontSize:ne?"11px":"13px"}},e.patientName),a.default.createElement("div",{style:{fontSize:ne?"9px":"11px",color:"#888"}},e.email))),!ne&&a.default.createElement("div",{style:{color:"#555",fontSize:"12px"}},e.patientId),a.default.createElement("div",{style:{color:"#555",fontSize:ne?"10px":"12px"}},(()=>{const t=e.appointmentDate||"",n=t.match(/\s(\d{1,2}:\d{2}(?:\s*(?:AM|PM))?)$/i);return n?a.default.createElement(a.default.Fragment,null,a.default.createElement("div",null,t.slice(0,n.index).trim()),a.default.createElement("div",{style:{fontSize:ne?"9px":"11px",color:"#888"}},n[1].trim())):a.default.createElement("div",null,t)})()),!ne&&a.default.createElement("div",{style:{color:"#555",fontSize:"12px"}},e.appointmentTime||"-"),!ne&&a.default.createElement("div",{style:{color:"#555",fontSize:"12px"}},e.doctorName||e.doctor||"-"))))),!Q&&!ee&&qe.length>0&&a.default.createElement("div",{style:{padding:ne?"12px 14px":"14px 18px",borderTop:"1px solid #F1F1F1",display:"flex",justifyContent:"space-between",alignItems:"center",background:"#FFFFFF",flexWrap:ne?"wrap":"nowrap",gap:ne?"10px":"0"}},a.default.createElement("div",{style:{fontSize:ne?"11px":"12px",color:"#666"}},"Showing page ",$e," of ",Xe," (",Ge," total)"),a.default.createElement("div",{style:{display:"flex",gap:"6px",alignItems:"center"}},a.default.createElement("button",{onClick:()=>_e((e=>Math.max(1,e-1))),disabled:1===$e,style:{padding:ne?"6px 10px":"6px 12px",border:"1px solid #E5E5E5",borderRadius:"4px",background:1===$e?"#F5F5F5":"#FFFFFF",color:1===$e?"#999":"#1a1a1a",fontSize:ne?"11px":"12px",fontFamily:Et,fontWeight:600,cursor:1===$e?"not-allowed":"pointer",opacity:1===$e?.5:1}},"Previous"),a.default.createElement("div",{style:{display:"flex",gap:"4px"}},[...Array(Math.min(5,Xe))].map(((e,t)=>{let n;return n=Xe<=5||$e<=3?t+1:$e>=Xe-2?Xe-4+t:$e-2+t,a.default.createElement("button",{key:n,onClick:()=>_e(n),style:{padding:ne?"6px 10px":"6px 12px",border:$e===n?"none":"1px solid #E5E5E5",borderRadius:"4px",background:$e===n?"#4C4DDC":"#FFFFFF",color:$e===n?"#FFFFFF":"#1a1a1a",fontSize:ne?"11px":"12px",fontFamily:Et,fontWeight:600,cursor:"pointer",minWidth:ne?"32px":"36px"}},n)}))),a.default.createElement("button",{onClick:()=>_e((e=>Math.min(Xe,e+1))),disabled:$e===Xe,style:{padding:ne?"6px 10px":"6px 12px",border:"1px solid #E5E5E5",borderRadius:"4px",background:$e===Xe?"#F5F5F5":"#FFFFFF",color:$e===Xe?"#999":"#1a1a1a",fontSize:ne?"11px":"12px",fontFamily:Et,fontWeight:600,cursor:$e===Xe?"not-allowed":"pointer",opacity:$e===Xe?.5:1}},"Next"))))),a.default.createElement("div",{style:{flex:ne?"none":"1 1 35%",width:ne?"100%":"auto",display:J||!ne?"flex":"none",flexDirection:"column",minHeight:ne?"auto":0}},a.default.createElement("div",{style:{border:"1px solid #E5E5E5",borderRadius:"8px",overflow:"hidden",background:"#FFFFFF",boxShadow:"0 1px 4px rgba(0,0,0,0.08)",display:"flex",flexDirection:"column",flex:ne?"none":1,minHeight:ne?"auto":0}},J?a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:ne?"12px 14px":"16px 18px",background:"#E8EEF4",borderBottom:"1px solid #E5E5E5"}},a.default.createElement("div",null,a.default.createElement("div",{style:{color:"#002668",fontSize:ne?"14px":"16px",fontWeight:"700"}},J.patientName||"N/A"),a.default.createElement("div",{style:{color:"#002668",fontSize:ne?"11px":"13px"}},J.patientId||J.mrn||"N/A")),a.default.createElement("div",null,it(J)?a.default.createElement("img",{style:{width:ne?"36px":"44px",height:ne?"36px":"44px",borderRadius:"50%",objectFit:"cover"},src:J.image,alt:J.patientName}):a.default.createElement("div",{style:{width:ne?"36px":"44px",height:ne?"36px":"44px",borderRadius:"50%",background:lt(J.patientName),display:"flex",alignItems:"center",justifyContent:"center",color:"#FFFFFF",fontWeight:700,fontSize:ne?"16px":"20px"}},rt(J.patientName)))),a.default.createElement("div",{style:{padding:ne?"12px 14px":"14px 18px",gap:ne?"10px":"12px",display:"flex",flexDirection:"column",background:"white",overflow:"auto",flex:1,position:"relative"}},a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Speciality"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ne?"12px":"13px"}},J?.specialisation||J?.speciality||"N/A")),a.default.createElement("div",{style:{textAlign:"right"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Appointment Type"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ne?"12px":"13px"}},J?.type||J?.appointmentType||"Online"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Appointment Date"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ne?"12px":"13px"}},J?.date||J?.appointmentDate||"N/A")),a.default.createElement("div",{style:{textAlign:"right"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Appointment Time"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ne?"12px":"13px"}},J?.time||J?.appointmentTime||"N/A"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Doctor"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ne?"12px":"13px"}},J?.doctor||J?.doctorName||"N/A"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Hospital"),a.default.createElement("div",{style:{fontWeight:"700",fontSize:ne?"12px":"13px"}},J?.hospital||J?.hospitalName||"N/A"))),a.default.createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a.default.createElement("div",{style:{textAlign:"left"}},a.default.createElement("div",{style:{fontSize:ne?"10px":"11px",color:"#888",marginBottom:"3px"}},"Reason for Appointment"),a.default.createElement("div",{style:{fontWeight:"600",fontSize:ne?"11px":"12px",lineHeight:"1.4"}},J?.reason||J?.reasonForAppointment||"No reason provided"))),"upcoming"===V&&a.default.createElement("div",{style:{display:"flex",flexDirection:ne?"column":"row",gap:"6px",marginTop:"10px"}},a.default.createElement("button",{type:"button",onClick:ct,disabled:ve,style:{flex:1,background:ve?"#99e4e8":"#1CC3CE",color:"#FFFFFF",border:"1px solid #1CC3CE",borderRadius:"6px",padding:ne?"10px 8px":"8px 6px",fontFamily:Et,fontWeight:600,fontSize:ne?"11px":"12px",cursor:ve?"not-allowed":"pointer"}},ve?"Connecting...":"Join Call >")),"upcoming"===V&&Ce&&a.default.createElement("div",{style:{fontSize:"11px",color:"#e53935",marginTop:"6px",textAlign:"center",width:"100%"}},"⚠️ ",Ce))):a.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",padding:"40px",color:"#888",textAlign:"center"}},a.default.createElement("div",null,a.default.createElement("div",{style:{fontSize:"16px",marginBottom:"8px"}},"📋"),a.default.createElement("div",{style:{fontSize:"13px"}},"Select an appointment to view details"))))))),me&&a.default.createElement("div",{style:{position:"fixed",left:ye?"0":ne?"10px":`${De.x}px`,top:ye?"0":ne?"70px":`${De.y}px`,right:ye?"0":ne?"10px":"auto",bottom:ye?"0":"auto",width:ye?"100vw":ne?"calc(100vw - 20px)":ge?"350px":`${We.width}px`,height:ye?"100vh":ge?"auto":ne?"300px":`${We.height}px`,background:"#FFFFFF",borderRadius:ye?"0":"8px",boxShadow:"0 8px 24px rgba(0, 0, 0, 0.3)",zIndex:1e4,overflow:"hidden",display:"flex",flexDirection:"column",transition:Me||Pe?"none":"all 0.3s ease"}},a.default.createElement("div",{onPointerDown:ne||ye?void 0:xt,onPointerMove:ne||ye?void 0:gt,onPointerUp:ne||ye?void 0:ht,onPointerCancel:ne||ye?void 0:ht,style:{background:"linear-gradient(135deg, #4C4DDC 0%, #3A3BBD 100%)",color:"#FFFFFF",padding:ne?"8px 10px":"10px 12px",display:"flex",justifyContent:"space-between",alignItems:"center",cursor:ne||ye?"default":"move",userSelect:"none"}},a.default.createElement("div",{style:{display:"flex",alignItems:"center",gap:ne?"6px":"8px",flex:1,minWidth:0}},a.default.createElement("div",{style:{width:ne?"6px":"8px",height:ne?"6px":"8px",borderRadius:"50%",background:"#FF4444",animation:"pulse 2s infinite",flexShrink:0}}),a.default.createElement("span",{style:{fontSize:ne?"11px":"13px",fontWeight:600,fontFamily:Et,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},"Video Call - ",J?.patientName||"Patient")),a.default.createElement("div",{style:{display:"flex",gap:ne?"4px":"6px",alignItems:"center",flexShrink:0}},!ye&&a.default.createElement("button",{onClick:ft,style:{background:"rgba(255, 255, 255, 0.2)",border:"1px solid rgba(255, 255, 255, 0.3)",borderRadius:"6px",color:"#FFFFFF",cursor:"pointer",padding:ne?"5px 8px":"6px 10px",lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",minWidth:ne?"28px":"32px",height:ne?"28px":"32px",transition:"background 0.2s ease"},onMouseEnter:e=>e.target.style.background="rgba(255, 255, 255, 0.3)",onMouseLeave:e=>e.target.style.background="rgba(255, 255, 255, 0.2)",title:ge?"Restore":"Minimize"},ge?a.default.createElement("svg",{width:ne?"14":"16",height:ne?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("rect",{x:"3",y:"3",width:"10",height:"10",stroke:"white",strokeWidth:"1.8",fill:"none"})):a.default.createElement("svg",{width:ne?"14":"16",height:ne?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("line",{x1:"3",y1:"8",x2:"13",y2:"8",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round"}))),a.default.createElement("button",{onClick:mt,style:{background:"rgba(255, 255, 255, 0.2)",border:"1px solid rgba(255, 255, 255, 0.3)",borderRadius:"6px",color:"#FFFFFF",cursor:"pointer",padding:ne?"5px 8px":"6px 10px",lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",minWidth:ne?"28px":"32px",height:ne?"28px":"32px",transition:"background 0.2s ease"},onMouseEnter:e=>e.target.style.background="rgba(255, 255, 255, 0.3)",onMouseLeave:e=>e.target.style.background="rgba(255, 255, 255, 0.2)",title:ye?"Exit Fullscreen":"Fullscreen"},ye?a.default.createElement("svg",{width:ne?"14":"16",height:ne?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("path",{d:"M10 3H13V6M6 13H3V10M13 10V13H10M3 6V3H6",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})):a.default.createElement("svg",{width:ne?"14":"16",height:ne?"14":"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("path",{d:"M3 6V3H6M13 10V13H10M10 3H13V6M6 13H3V10",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"}))),a.default.createElement("button",{onClick:ut,style:{background:"rgba(255, 255, 255, 0.2)",border:"1px solid rgba(255, 255, 255, 0.3)",borderRadius:"6px",color:"#FFFFFF",cursor:"pointer",padding:ne?"5px 8px":"6px 10px",lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",minWidth:ne?"28px":"32px",height:ne?"28px":"32px",fontWeight:"bold",fontSize:ne?"18px":"22px",transition:"background 0.2s ease"},onMouseEnter:e=>e.target.style.background="rgba(255, 255, 255, 0.3)",onMouseLeave:e=>e.target.style.background="rgba(255, 255, 255, 0.2)",title:"Close"},"×"))),!ge&&a.default.createElement("div",{style:{flex:1,background:"#000000",position:"relative"}},a.default.createElement("iframe",{src:(()=>{if(!Fe)return"";const e=String($||"").replace(/\/?$/,"/");return console.log("${base}token=${callToken}",`${e}token=${Fe}`),`${e}token=${Fe}`})(),style:{width:"100%",height:"100%",border:"none"},allow:"camera; microphone; display-capture; autoplay",allowFullScreen:!0,title:"Video Call"})),!ne&&!ye&&!ge&&a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{onPointerDown:e=>yt("top-left",e),onPointerMove:gt,onPointerUp:ht,onPointerCancel:ht,style:{position:"absolute",left:0,top:0,width:"16px",height:"16px",cursor:"nwse-resize",background:"transparent",zIndex:10001}}),a.default.createElement("div",{onPointerDown:e=>yt("top-right",e),onPointerMove:gt,onPointerUp:ht,onPointerCancel:ht,style:{position:"absolute",right:0,top:0,width:"16px",height:"16px",cursor:"nesw-resize",background:"transparent",zIndex:10001}}),a.default.createElement("div",{onPointerDown:e=>yt("bottom-left",e),onPointerMove:gt,onPointerUp:ht,onPointerCancel:ht,style:{position:"absolute",left:0,bottom:0,width:"16px",height:"16px",cursor:"nesw-resize",background:"transparent",zIndex:10001}}),a.default.createElement("div",{onPointerDown:e=>yt("bottom-right",e),onPointerMove:gt,onPointerUp:ht,onPointerCancel:ht,style:{position:"absolute",right:0,bottom:0,width:"16px",height:"16px",cursor:"nwse-resize",background:"transparent",zIndex:10001}})),a.default.createElement("style",null,"\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n "))),Ft&&a.default.createElement("div",{style:{position:"fixed",inset:0,zIndex:1e5,display:"flex",alignItems:"center",justifyContent:"center",padding:"24px",background:"rgba(0,0,0,0.4)",boxSizing:"border-box"}},a.default.createElement("div",{style:{fontFamily:Et,maxWidth:"400px",width:"100%",padding:"32px 24px",background:"#FFFFFF",borderRadius:"12px",boxShadow:"0 8px 32px rgba(0,0,0,0.2)",textAlign:"center"}},a.default.createElement("div",{style:{fontSize:"48px",marginBottom:"16px"}},"🔒"),a.default.createElement("h2",{style:{fontSize:"20px",fontWeight:700,color:"#1a1a1a",margin:"0 0 8px 0"}},P?"Not authorised":"Sign in required"),a.default.createElement("p",{style:{fontSize:"14px",color:"#666",margin:0,lineHeight:1.5}},bt),a.default.createElement("p",{style:{fontSize:"13px",color:"#999",marginTop:"16px",marginBottom:0}},"Redirecting to login...")))),a.default.createElement(b,null,wt)};let S=null;const v={showWidget:(e,t)=>{S||(S=document.createElement("div"),document.body.appendChild(S));const n=()=>a.default.createElement(a.default.Fragment,null,a.default.createElement(w,{config:e}));i.default.render(a.default.createElement(n,null),S)},closePopup:()=>{S&&(i.default.unmountComponentAtNode(S),S=null)}};window.BookingSDK=v,e.AppointmentPage=w,e.PIH_APPOINTMENT_WIDGET_CLASS=E,e.default=v,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
@@ -15,22 +15,24 @@ var _apiConfig = require("../constants/apiConfig");
|
|
|
15
15
|
* @returns {Promise} Appointments data
|
|
16
16
|
*/
|
|
17
17
|
const getAppointmentsByStatus = async function (status, fromDate, toDate) {
|
|
18
|
-
let
|
|
18
|
+
let type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'ONLINE';
|
|
19
|
+
let config = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
19
20
|
// Map status to API format
|
|
20
21
|
let apiStatus = (status || "").toUpperCase();
|
|
21
22
|
if (apiStatus === "INPROGRESS") {
|
|
22
23
|
apiStatus = "IN_PROGRESS";
|
|
23
24
|
}
|
|
24
|
-
const baseURL = config.apiBaseUrl
|
|
25
|
+
const baseURL = config.apiBaseUrl;
|
|
25
26
|
const hospitalId = config.hospitalId || _apiConfig.DEFAULT_PARAMS.hospitalId;
|
|
26
|
-
const doctorId = config.doctorId
|
|
27
|
+
const doctorId = config.doctorId;
|
|
27
28
|
const token = config.token || '';
|
|
28
29
|
const params = {
|
|
29
30
|
hospitalId,
|
|
30
31
|
doctorId,
|
|
31
32
|
fromDate,
|
|
32
33
|
toDate,
|
|
33
|
-
statuses: apiStatus
|
|
34
|
+
statuses: apiStatus,
|
|
35
|
+
type
|
|
34
36
|
};
|
|
35
37
|
const url = `${baseURL}${_apiConfig.API_PATHS.APPOINTMENTS}`;
|
|
36
38
|
|
|
@@ -49,7 +51,7 @@ exports.getAppointmentsByStatus = getAppointmentsByStatus;
|
|
|
49
51
|
const getAppointmentDetails = async function (appointmentId) {
|
|
50
52
|
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
51
53
|
try {
|
|
52
|
-
const baseURL = config.apiBaseUrl
|
|
54
|
+
const baseURL = config.apiBaseUrl;
|
|
53
55
|
const url = `${baseURL}${_apiConfig.API_PATHS.APPOINTMENT_DETAILS}/${appointmentId}`;
|
|
54
56
|
const response = await (0, _httpService.getApi)(url, {}, "PIH-Appointment-Widget");
|
|
55
57
|
if (response.err) {
|
|
@@ -71,14 +73,15 @@ const getAppointmentDetails = async function (appointmentId) {
|
|
|
71
73
|
exports.getAppointmentDetails = getAppointmentDetails;
|
|
72
74
|
const initiateConsultation = async function (appointment) {
|
|
73
75
|
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
74
|
-
|
|
76
|
+
console.log("initiateConsultation -> config", config);
|
|
77
|
+
const baseURL = config.apiBaseUrl.replace(/\/$/, "");
|
|
75
78
|
const url = `${baseURL}${_apiConfig.API_PATHS.INITIATE_CALL}`;
|
|
76
79
|
const appToken = config.appToken || "";
|
|
77
80
|
const body = {
|
|
78
81
|
patientId: String(appointment.patientId || ""),
|
|
79
82
|
primaryPatientId: String(appointment.primaryPatientId || appointment.patientId || ""),
|
|
80
83
|
hospitalId: config.hospitalId || _apiConfig.DEFAULT_PARAMS.hospitalId,
|
|
81
|
-
doctorId: String(config.
|
|
84
|
+
doctorId: String(config.doctorId),
|
|
82
85
|
patientName: appointment.patientName || appointment.name || "",
|
|
83
86
|
doctorName: appointment.doctorName || config.doctorName,
|
|
84
87
|
appointmentId: String(appointment.id || appointment.appointmentId || appointment._id || "")
|
package/package.json
CHANGED
|
@@ -25,6 +25,7 @@ const STORAGE_KEY_EMAIL = "pih_appointment_email";
|
|
|
25
25
|
const STORAGE_KEY_APP_TOKEN = "pih_appointment_appToken";
|
|
26
26
|
const STORAGE_KEY_DOCTOR_ID = "pih_appointment_doctorId";
|
|
27
27
|
const STORAGE_KEY_USER_NAME = "pih_appointment_userName";
|
|
28
|
+
const STORAGE_KEY_API_BASE_URL = "pih_appointment_apiBaseUrl";
|
|
28
29
|
|
|
29
30
|
const DEFAULT_PIP_WIDTH = 720;
|
|
30
31
|
const DEFAULT_PIP_HEIGHT = 560;
|
|
@@ -96,8 +97,15 @@ class AppointmentErrorBoundary extends Component {
|
|
|
96
97
|
}
|
|
97
98
|
|
|
98
99
|
// SDK Component - accepts configuration from parent app
|
|
99
|
-
const AppointmentPage = ({ config = {}}) => {
|
|
100
|
-
const
|
|
100
|
+
const AppointmentPage = ({ config = {} }) => {
|
|
101
|
+
const [storedApiBaseUrl, setStoredApiBaseUrl] = useState(() => {
|
|
102
|
+
try {
|
|
103
|
+
return typeof localStorage !== "undefined" ? localStorage.getItem(STORAGE_KEY_API_BASE_URL) : null;
|
|
104
|
+
} catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const apiBaseUrl = config.apiBaseUrl || storedApiBaseUrl || API_BASE_URL;
|
|
101
109
|
const hospitalId = config.hospitalId || DEFAULT_PARAMS.hospitalId;
|
|
102
110
|
|
|
103
111
|
// idToken/email: config first, then localStorage. When Flutter (or parent) passes a new token, we use it and re-login.
|
|
@@ -141,8 +149,12 @@ const AppointmentPage = ({ config = {}}) => {
|
|
|
141
149
|
localStorage.setItem(STORAGE_KEY_EMAIL, config.email);
|
|
142
150
|
setStoredEmail(config.email);
|
|
143
151
|
}
|
|
152
|
+
if (config.apiBaseUrl && String(config.apiBaseUrl).trim()) {
|
|
153
|
+
localStorage.setItem(STORAGE_KEY_API_BASE_URL, config.apiBaseUrl.trim());
|
|
154
|
+
setStoredApiBaseUrl(config.apiBaseUrl.trim());
|
|
155
|
+
}
|
|
144
156
|
} catch (e) {}
|
|
145
|
-
}, [config.idToken, config.token, config.email]);
|
|
157
|
+
}, [config.idToken, config.token, config.email, config.apiBaseUrl]);
|
|
146
158
|
|
|
147
159
|
const [appToken, setAppToken] = useState(() => {
|
|
148
160
|
try {
|
|
@@ -412,7 +424,7 @@ const AppointmentPage = ({ config = {}}) => {
|
|
|
412
424
|
doctorId,
|
|
413
425
|
token: appToken,
|
|
414
426
|
};
|
|
415
|
-
const response = await getAppointmentsByStatus(activeTab, fromDate, toDate, serviceConfig);
|
|
427
|
+
const response = await getAppointmentsByStatus(activeTab, fromDate, toDate, 'PHYSICAL', serviceConfig);
|
|
416
428
|
if (response.status === 401 || response.status === 403) {
|
|
417
429
|
// Token expired — clear stored token and trigger re-login (SSO effect will fire)
|
|
418
430
|
try {
|
|
@@ -462,6 +474,7 @@ const AppointmentPage = ({ config = {}}) => {
|
|
|
462
474
|
localStorage.removeItem(STORAGE_KEY_APP_TOKEN);
|
|
463
475
|
localStorage.removeItem(STORAGE_KEY_DOCTOR_ID);
|
|
464
476
|
localStorage.removeItem(STORAGE_KEY_USER_NAME);
|
|
477
|
+
localStorage.removeItem(STORAGE_KEY_API_BASE_URL);
|
|
465
478
|
}
|
|
466
479
|
} catch (e) {}
|
|
467
480
|
setShowProfileDropdown(false);
|
|
@@ -13,19 +13,20 @@ import {
|
|
|
13
13
|
* @param {object} config - Optional configuration { apiBaseUrl, hospitalId, doctorId }
|
|
14
14
|
* @returns {Promise} Appointments data
|
|
15
15
|
*/
|
|
16
|
-
export const getAppointmentsByStatus = async (status, fromDate, toDate, config = {}) => {
|
|
16
|
+
export const getAppointmentsByStatus = async (status, fromDate, toDate, type = 'ONLINE', config = {}) => {
|
|
17
17
|
// Map status to API format
|
|
18
18
|
let apiStatus = (status || "").toUpperCase();
|
|
19
|
+
|
|
19
20
|
if (apiStatus === "INPROGRESS") {
|
|
20
21
|
apiStatus = "IN_PROGRESS";
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
const baseURL = config.apiBaseUrl
|
|
24
|
+
const baseURL = config.apiBaseUrl;
|
|
24
25
|
const hospitalId = config.hospitalId || DEFAULT_PARAMS.hospitalId;
|
|
25
|
-
const doctorId = config.doctorId
|
|
26
|
+
const doctorId = config.doctorId;
|
|
26
27
|
const token = config.token || '';
|
|
27
28
|
|
|
28
|
-
const params = { hospitalId, doctorId, fromDate, toDate, statuses: apiStatus };
|
|
29
|
+
const params = { hospitalId, doctorId, fromDate, toDate, statuses: apiStatus, type };
|
|
29
30
|
const url = `${baseURL}${API_PATHS.APPOINTMENTS}`;
|
|
30
31
|
|
|
31
32
|
// Return raw response (including status) so caller can detect 401 and re-login
|
|
@@ -41,7 +42,7 @@ export const getAppointmentsByStatus = async (status, fromDate, toDate, config =
|
|
|
41
42
|
*/
|
|
42
43
|
export const getAppointmentDetails = async (appointmentId, config = {}) => {
|
|
43
44
|
try {
|
|
44
|
-
const baseURL = config.apiBaseUrl
|
|
45
|
+
const baseURL = config.apiBaseUrl;
|
|
45
46
|
const url = `${baseURL}${API_PATHS.APPOINTMENT_DETAILS}/${appointmentId}`;
|
|
46
47
|
|
|
47
48
|
const response = await getApi(url, {}, "PIH-Appointment-Widget");
|
|
@@ -64,7 +65,8 @@ export const getAppointmentDetails = async (appointmentId, config = {}) => {
|
|
|
64
65
|
* @returns {Promise<{ data: { token, url, roomName, participantName }, err?, status? }>}
|
|
65
66
|
*/
|
|
66
67
|
export const initiateConsultation = async (appointment, config = {}) => {
|
|
67
|
-
|
|
68
|
+
console.log("initiateConsultation -> config", config)
|
|
69
|
+
const baseURL = (config.apiBaseUrl).replace(/\/$/, "");
|
|
68
70
|
const url = `${baseURL}${API_PATHS.INITIATE_CALL}`;
|
|
69
71
|
const appToken = config.appToken || "";
|
|
70
72
|
|
|
@@ -72,7 +74,7 @@ export const initiateConsultation = async (appointment, config = {}) => {
|
|
|
72
74
|
patientId: String(appointment.patientId || ""),
|
|
73
75
|
primaryPatientId: String(appointment.primaryPatientId || appointment.patientId || ""),
|
|
74
76
|
hospitalId: config.hospitalId || DEFAULT_PARAMS.hospitalId,
|
|
75
|
-
doctorId: String(config.
|
|
77
|
+
doctorId: String(config.doctorId),
|
|
76
78
|
patientName: appointment.patientName || appointment.name || "",
|
|
77
79
|
doctorName: appointment.doctorName || config.doctorName,
|
|
78
80
|
appointmentId: String(appointment.id || appointment.appointmentId || appointment._id || ""),
|