WELCOME BACK
{me.name}
{hosp.name} · {hosp.city}
go('submit')} style={{boxShadow:'0 8px 24px rgba(0,0,0,.2)'}}>Submit New Patient
{c.needs>0 &&
}
{stat(c.total,'Total',null,()=>go('requests',{status:'all'}))}
{stat(c.review,'Under Review','var(--st-review-dot)',()=>go('requests',{status:'under_review'}))}
{stat(c.needs,'Needs Info','var(--st-needs-dot)',()=>go('requests',{status:'needs_info'}),c.needs>0)}
{stat(c.approved,'Approved','var(--st-approved-dot)',()=>go('requests',{status:'approved'}))}
Recent updates
{activityFeed(mine,sel).map((it,i)=>
{it.reqId} {it.to==='submitted'?'submitted':'→ '+window.GOV.STATUS[it.to].label}
{helpers.timeAgo(it.at)}
)}
;
}
/* ---------------- Submit New Patient ---------------- */
const TYPES=['Reconstructive surgery','Scar revision','Consultation','Imaging / diagnostics','Other'];
const Section=({n,title,children})=>
;
function SubmitPatient(){
const {dispatch,go,toast}=window.useStore();
const [f,setF]=useState({ref:'',initials:'',age:'',gender:'',diagnosis:'',condition:'',
type:'',urgency:'normal',reason:'',contact:'',partnerNote:''});
const [files,setFiles]=useState([]);
const [confirm,setConfirm]=useState(false);
const [touched,setTouched]=useState({});
const [submitting,setSubmitting]=useState(false);
const set=(k,v)=>setF(s=>({...s,[k]:v}));
const blur=(k)=>setTouched(t=>({...t,[k]:true}));
const errs={};
if(!f.ref.trim()) errs.ref='Reference code is required';
if(!f.diagnosis.trim()) errs.diagnosis='Diagnosis summary is required';
if(!f.type) errs.type='Select a request type';
if(!f.reason.trim()) errs.reason='A reason for the request is required';
const valid=Object.keys(errs).length===0 && confirm;
const fileTypes=['Medical report','Lab report','Imaging','Referral letter','Other'];
function addFile(){
const t=fileTypes[files.length%fileTypes.length];
const nm=t.toLowerCase().replace(/[^a-z]/g,'-')+'-'+(files.length+1)+(t==='Imaging'?'.jpg':'.pdf');
setFiles(x=>[...x,{name:nm,type:t}]);
}
function submit(){
setTouched({ref:1,diagnosis:1,type:1,reason:1});
if(!valid) return;
setSubmitting(true);
setTimeout(()=>{
dispatch({type:'SUBMIT',data:{
urgency:f.urgency,
patient:{ref:f.ref,initials:f.initials,age:f.age,gender:f.gender,diagnosis:f.diagnosis,condition:f.condition},
request:{type:f.type,reason:f.reason,contact:f.contact,partnerNote:f.partnerNote},
files}});
toast({kind:'success',title:'Request submitted',desc:'Our team has been notified.'});
go('success');
},650);
}
return
Submit New Patient
Provide the case details below. Fields marked * are required.
go('requests',{status:'all'})}>Cancel
Drag & drop or click to add files
Medical & lab reports, scans / imaging, referral letter · PDF, JPG, PNG up to 10MB
{files.length>0 && {files.map((file,i)=>
{file.name} · {file.type}
setFiles(x=>x.filter((_,j)=>j!==i))}> )}
}
;
}
/* ---------------- Submission Success ---------------- */
function SubmitSuccess(){
const {state,go}=window.useStore();
const code=state.lastCreated;
return
Request {code} submitted
Your case has been received and our team has been notified.
What happens next
{[['1','BHF reviews your submission'],['2','A reviewer is assigned to the case'],['3','You’re notified of the decision — or if more info is needed']].map(s=>
{s[0]}
{s[1]}
)}
go('detail',code)}>View request
go('submit')}>Submit another
;
}
/* ---------------- My Requests ---------------- */
function MyRequests({admin}){
const {state,me,route,sel,go}=window.useStore();
const init=(route.id&&route.id.status)||'all';
const [status,setStatus]=useState(init);
const [prio,setPrio]=useState('all');
const [q,setQ]=useState('');
React.useEffect(()=>{ if(route.id&&route.id.status) setStatus(route.id.status); },[route.id]);
let reqs=sel.visibleRequests();
if(status!=='all') reqs=reqs.filter(r=>r.status===status);
if(prio!=='all') reqs=reqs.filter(r=>r.urgency===prio);
if(q.trim()){const s=q.toLowerCase();reqs=reqs.filter(r=>r.id.toLowerCase().includes(s)||r.patient.ref.toLowerCase().includes(s)||r.request.type.toLowerCase().includes(s));}
const cols=admin?['id','ref','hospital','type','prio','status','reviewer','updated']:['id','ref','type','prio','status','updated'];
return
{admin?'All Requests':'My Requests'}
{admin?'Every case across all partner hospitals.':'Cases submitted by '+sel.hospitalName(me.hospitalId)+'.'}
{!admin &&
go('submit')}>Submit New Patient
}
setQ(e.target.value)}/>
setStatus(e.target.value)} style={{width:'auto',minWidth:150}}>
All statuses {window.GOV.STATUS_ORDER.map(s=>{window.GOV.STATUS[s].label} )}
setPrio(e.target.value)} style={{width:'auto',minWidth:130}}>
All priorities Urgent Normal Low
{(status!=='all'||prio!=='all'||q)&&
{setStatus('all');setPrio('all');setQ('');}}>Clear }
{reqs.length} request{reqs.length!==1?'s':''}
go('submit')}>Submit New Patient}/>
;
}
Object.assign(window,{PartnerDashboard,SubmitPatient,SubmitSuccess,MyRequests});
})();