);
}
if (leadMarketplaceTab() === 'View Details' && selectedLead()) {
const lead = selectedLead()!;
const spec = leadDetailsSpec(lead);
return (
);
}
if (customerKey() === 'jobs') {
if (isJobSeekerRole()) {
const selectedJob = () => jobBoardJobs().find((job) => job.id === jobSeekerSelectedId()) || jobBoardJobs()[0];
const selectedAppliedTab = normalizeTabKey(tab) === 'applied';
const selectedOpenJobCards = () => {
const tabKey = normalizeTabKey(tab);
const rows = jobBoardJobs();
if (tabKey === 'recommended') return rows.slice(0, 3);
if (tabKey === 'saved') return rows.slice(1);
if (tabKey === 'expiring soon') return rows.filter((_, idx) => idx % 2 === 0);
return rows;
};
const stepWidth = () => `${Math.round((jobSeekerApplyStep() / 4) * 100)}%`;
if (selectedAppliedTab) {
return (
);
}
if (jobSeekerScreen() === 'apply') {
return (
);
}
if (jobSeekerScreen() === 'detail') {
return (
);
}
const progressWidth = () => `${Math.round((jobPostStep() / COMPANY_JOB_STEPS.length) * 100)}%`;
const latestSubmission = () => companyJobSubmissions()[0] || null;
const latestStatusLabel = () => {
const status = latestSubmission()?.status;
if (status === 'VERIFICATION_PENDING') return 'In Verification Management';
if (status === 'VERIFIED' || status === 'APPROVAL_PENDING') return 'In Approval Management';
if (status === 'APPROVED_LIVE') return 'Approved and Live';
return 'Submitted';
};
const goNextJobStep = () => {
if (jobPostStep() >= COMPANY_JOB_STEPS.length) {
setJobPostView('review');
return;
}
setJobPostStep((prev) => Math.min(COMPANY_JOB_STEPS.length, prev + 1));
};
const goPrevJobStep = () => setJobPostStep((prev) => Math.max(1, prev - 1));
if (jobPostView() === 'success') {
return (
);
}
if (jobPostView() === 'review') {
return (
);
}
if (customerKey() === 'my requirements') {
const statusMeta = (value: string) => {
const key = String(value || '').toLowerCase();
if (key === 'approved') return { bg: '#DCFCE7', c: '#15803D', label: 'Approved' };
if (key === 'active') return { bg: '#DBEAFE', c: '#1D4ED8', label: 'Active' };
if (key === 'under review') return { bg: '#FFEDD5', c: '#C2410C', label: 'Under Review' };
if (key === 'draft') return { bg: '#F3F4F6', c: '#4B5563', label: 'Draft' };
if (key === 'closed') return { bg: '#E5E7EB', c: '#4B5563', label: 'Closed' };
if (key === 'rejected') return { bg: '#FEE2E2', c: '#B91C1C', label: 'Rejected' };
return { bg: '#F3F4F6', c: '#6B7280', label: titleCase(value) };
};
const filteredRows = requirementRows().filter((row) => {
if (tab === 'open') return row.status === 'active' || row.status === 'under review';
if (tab === 'closed') return row.status === 'closed';
if (tab === 'drafts') return row.status === 'draft';
return true;
});
const selectedRoleDetails = () => REQUIREMENT_ROLE_DETAILS[selectedRequirementRole()] || REQUIREMENT_ROLE_DETAILS.PHOTOGRAPHER;
const steps = ['Choose Type', 'Basic Details', 'Role-Specific', 'Budget & Location', 'Attachments', 'Review'];
const canGoBack = () => requirementsStep() > 1;
const nextLabel = () => (requirementsStep() === steps.length ? 'Submit For Approval' : 'Next');
const goNextStep = () => {
if (requirementsStep() >= steps.length) {
submitRequirementForReview();
return;
}
setRequirementsStep((prev) => Math.min(steps.length, prev + 1));
};
const goBackStep = () => setRequirementsStep((prev) => Math.max(1, prev - 1));
if (requirementsView() === 'new') {
return (
Post New Requirement
{(step, idx) => (
idx() + 1 ? '#FF5E13' : '#D1D5DB'};background:${requirementsStep() === idx() + 1 ? '#FF5E13' : requirementsStep() > idx() + 1 ? '#FFF1EB' : '#F9FAFB'};color:${requirementsStep() === idx() + 1 ? 'white' : requirementsStep() > idx() + 1 ? '#FF5E13' : '#6B7280'}`}>{idx() + 1}
{step}
idx() + 1 ? '#FF5E13' : '#E5E7EB'};margin-top:16px`} />
)}
What kind of professional are you looking for?
Select a category to start your requirement. This helps us match you with the right experts.
{(role) => {
const active = selectedRequirementRole() === role.key;
return (
);
}}
Basic Requirement Details
Add core details before role-specific inputs.
{['Requirement Title', 'Priority', 'Requirement Description', 'Expected Start Date', 'Service City', 'Contact Number'].map((field) => (
{field}
Enter {field.toLowerCase()}
))}
{selectedRoleDetails().title}
{selectedRoleDetails().subtitle}
{(field, idx) => (
{field}
{idx() % 2 === 0 ? 'Select' : 'Enter'} {field.toLowerCase()}
▾
)}
{(toggleLabel) => (
{toggleLabel}
)}
Style Needed
{(styleLabel) => (
{styleLabel}
)}
Budget & Location
Set your target budget and service location to get relevant quotes.
{['Budget Range', 'Urgency Level', 'Service Location', 'Mode (Remote / On-site)', 'Preferred Start Date', 'Flexible Budget'].map((field, idx) => (
{field}
{idx % 2 === 0 ? 'Enter' : 'Select'} {field.toLowerCase()}
▾
))}
Attachments
Upload reference files to help professionals understand your requirement better.
{[1, 2, 3, 4].map((slot) => (
))}
Review & Submit
Final check before submitting for approval.
{[
['Category', titleCase(selectedRequirementRole().replace(/_/g, ' ').toLowerCase())],
['Requirement Title', 'Luxury Wedding Shoot'],
['Budget Range', '₹1,50,000 - ₹2,00,000'],
['Service Location', 'Chennai, TN'],
['Expected Start Date', 'Nov 12, 2023'],
].map(([label, value]) => (
{label}
{value}
))}
Approval Flow
Submit For Approval
Once submitted, your requirement goes to Verification Management first, then Approval Management. Only after both stages it goes live in professional leads.
{['Draft Created', 'Verification Management', 'Approval Management', 'Live In Leads'].map((state, idx) => (
{idx < 2 ? '✓' : idx + 1}
{state}
))}
);
}
if (requirementsView() === 'detail') {
const selectedRow = requirementRows().find((row) => row.id === selectedRequirementId()) || requirementRows()[0];
const status = statusMeta(selectedRow.status);
return (
Requirements > Details
{selectedRow.title}
{status.label}
Active
Created on {selectedRow.submission}
{[
['Proposed Budget', selectedRow.budget],
['Location & Urgency', selectedRow.location],
['Project Scope', '3 Day Event'],
].map(([label, val]) => (
))}
Requirement Overview
We are looking for a premium {selectedRow.category.toLowerCase().replace(/_/g, ' ')} team for a high-end project with a focus on quality, timeline ownership, and clear communication throughout execution.
Special Instructions
- Mandatory experience in similar premium projects.
- Must be available for milestone reviews every 72 hours.
- NDA required before onboarding and deliverable sharing.
Reference Material
{[1, 2, 3, 4].map((slot) => (
{slot === 4 ? 'Add More' : `Asset ${slot}`}
))}
Response Metrics
08
Total Responses
03 Shortlisted
03 Rejected
Approval History
{['Requirement Approved', 'Under Review', 'Submitted', 'Draft Created'].map((step) => (
))}
{['Extend Expiry', 'Edit Details', 'Close Requirement'].map((action, idx) => (
))}
);
}
const totalCount = requirementRows().length;
const draftCount = requirementRows().filter((item) => item.status === 'draft').length;
const submittedCount = requirementRows().filter((item) => item.status === 'under review').length;
const approvedCount = requirementRows().filter((item) => item.status === 'approved').length;
const activeCount = requirementRows().filter((item) => item.status === 'active').length;
const rejectedCount = requirementRows().filter((item) => item.status === 'rejected').length;
return (
My Requirements
Create, submit for approval, and manage your requirements with precision and clarity.
{[
['Total Requirements', String(totalCount)],
['Drafts', String(draftCount)],
['Submitted', String(submittedCount)],
['Approved', String(approvedCount)],
['Active', String(activeCount)],
['Rejected', String(rejectedCount)],
].map(([label, value], idx) => (
))}
{['All Requirements', 'Drafts', 'Submitted', 'Approved', 'Active', 'Rejected', 'Closed', 'Expired'].map((label, idx) => (
))}
Search ID or Title...
{['Sort By: Newest', 'Category: All', 'Status: All'].map((item) => (
))}
{['ID', 'Requirement Details', 'Category', 'Budget & Location', 'Submission', 'Status', 'Actions'].map((head) => (
| {head} |
))}
{(row) => {
const status = statusMeta(row.status);
return (
| {row.id} |
{row.title}
{row.summary}
|
{row.category} |
{row.budget}
{row.location}
|
{row.submission} |
{status.label}
{row.responseTag}
|
|
);
}}
Showing 1 to {Math.min(filteredRows.length, 6)} of {filteredRows.length} requirements
{[1, 2, 3].map((p) => )}
);
}
if (customerKey() === 'received responses' || customerKey() === 'my responses') {
if (normalizeRoleKey(props.roleKey || '') !== 'CUSTOMER') {
const leadStatusPill = (status: string) => {
if (status === 'request_sent') return { c: '#374151', text: 'Request Sent' };
if (status === 'contact_unlocked') return { c: '#374151', text: 'Contact Unlocked' };
if (status === 'approved') return { c: '#374151', text: 'Approved' };
if (status === 'rejected') return { c: '#374151', text: 'Rejected' };
if (status === 'expired_refunded') return { c: '#374151', text: 'Expired · Refunded' };
if (status === 'cancelled_by_professional') return { c: '#374151', text: 'Cancelled' };
return { c: '#374151', text: titleCase(status) };
};
const responseSelectedLead = () => leadCards().find((item) => item.id === activeResponseLeadId()) || null;
const list = filteredRequestedRows().filter((row) => {
if (resolvedTabKey() === 'pending leads') return row.status === 'request_sent';
return true;
});
const totalPages = Math.max(1, Math.ceil(list.length / requestedPerPage));
const currentPage = Math.min(requestedPage(), totalPages);
const pagedList = list.slice((currentPage - 1) * requestedPerPage, (currentPage - 1) * requestedPerPage + requestedPerPage);
if (responsesDetailMode() && responseSelectedLead()) {
const lead = responseSelectedLead()!;
const spec = leadDetailsSpec(lead);
return (
My Responses • View Details
{lead.title}
{lead.category} • {lead.location} • {lead.area}
Date Required
{lead.dateRequired}
Area
{String(lead.area || 'Chennai')}
Unlock Cost
{lead.cost} Tracecoin
Lead ID{lead.id}
Category{lead.category}
Location{lead.location}
StatusFrom My Responses
);
}
return (
My Responses
{['Newest First', 'Oldest First'].map((item) => (
))}
{['All Status', 'Request Sent', 'Contact Unlocked', 'Rejected', 'Expired Refunded', 'Cancelled By Professional'].map((item) => (
))}
{['Lead ID', 'Lead Title', 'Request Date', 'Status', 'Cost', 'Decision Date', 'Action'].map((h) => (
| {h} |
))}
{(row) => {
const badge = leadStatusPill(row.status);
return (
| #{row.id} |
{row.title}
{row.city}
|
{row.requestDate} |
{badge.text}
|
{leadCostPerContact} |
{row.decisionDate} |
|
);
}}
Showing {pagedList.length ? (currentPage - 1) * requestedPerPage + 1 : 0} to {(currentPage - 1) * requestedPerPage + pagedList.length} of {list.length} responses
i + 1)}>
{(pageNo) => (
)}
);
}
const list = RESPONSE_ROWS.filter((r) => {
if (tab === 'new') return r.status === 'new';
if (tab === 'shortlisted') return r.status === 'shortlisted';
if (tab === 'rejected') return r.status === 'rejected';
return true;
});
return (
Before accepting contact request, review portfolio, experience, and quoted charges.
{(row) => {
const chip = statusChip(row.status);
return (
{row.name}
Applied for active requirement
Experience: 7+ years
{row.quote}
{row.status}
);
}}
);
}
if (customerKey() === 'shortlisted responses') {
const list = RESPONSE_ROWS.filter((r) => {
if (tab === 'interview scheduled') return r.status === 'shortlisted';
if (tab === 'finalized') return r.status === 'shortlisted';
return r.status === 'shortlisted';
});
return (
{(p) => (
{p.name}
High-potential response for active requirement
Quoted {p.quote}
)}
);
}
if (customerKey() === 'credits') {
const invoiceRows = [
['#INV-2023-089', 'Oct 14, 2023', 'Enterprise Pack', '₹499.00', 'Paid'],
['#INV-2023-074', 'Sep 14, 2023', 'Enterprise Pack', '₹499.00', 'Paid'],
['#INV-2023-052', 'Aug 14, 2023', 'Growth Starter', '₹135.00', 'Paid'],
['#INV-2023-031', 'Jul 14, 2023', 'Growth Starter', '₹135.00', 'Failed'],
] as const;
const renderCheckout = () => {
const pkg = checkoutPackage();
if (!pkg) return null;
const step = paymentStep();
return (
Finalize Purchase
Selected Package
{pkg.display_name || pkg.name}
{(Number(pkg.credits) + Number(pkg.bonus_credits || 0)).toLocaleString()} TC
Total Tracecoins
Base Credits
{Number(pkg.credits).toLocaleString()}
0}>
Bonus Credits
+{Number(pkg.bonus_credits).toLocaleString()}
{/* Coupon section */}
Coupon Code
setCouponCode(e.currentTarget.value)}
style="flex:1;height:32px;border:1px solid #E5E7EB;border-radius:6px;padding:0 8px;font-size:12px"
disabled={couponLoading()}
/>
{couponError()}
Coupon ({appliedCoupon()!.code})
-{appliedCoupon()!.discount_type === 'PERCENT' ? `${appliedCoupon()!.discount_value}%` : `₹${appliedCoupon()!.discount_value}`}
Total Amount
₹{((appliedCoupon() ? appliedCoupon().final_price_inr : Number(pkg.price_paise)) / 100).toLocaleString('en-IN')}
Secure Gateway
Continue to our secure partner gateway to complete the transaction.
{step === 'processing' ? 'Creating Order...' : 'Verifying Payment...'}
Please do not refresh or close the page.
✓
Payment Successful!
Your account has been credited with {(Number(pkg.credits) + Number(pkg.bonus_credits || 0)).toLocaleString()} Tracecoins.
New Balance
{leadCredits().toLocaleString()} TC
✕
Payment Failed
Something went wrong with the mock gateway. Please try again.
);
};
const renderCreditManagement = () => {
let amtInput: HTMLInputElement | undefined;
let rsnInput: HTMLInputElement | undefined;
return (
Credit Management Console
Current User Balance
{leadCredits().toLocaleString()} TC
Note: Adjustments are final and logged in transaction history for auditing.
);
};
if (checkoutPackage()) return renderCheckout();
if (creditManageView()) return renderCreditManagement();
if (tab === 'buy credits') {
return (
Current Balance
{leadCredits().toLocaleString()} Tracecoins
+12% from last month
{(pkg) => (
MOST POPULAR
{pkg.name}
{pkg.display_name || pkg.name}
{Number(pkg.credits).toLocaleString()}
Credits
0}>
+{pkg.bonus_credits} bonus
₹{(Number(pkg.price_paise) / 100).toLocaleString('en-IN')}
)}
Why buy larger packs?
More savings
Higher packs include bonus credits.
No expiry
Credits stay active with your account.
Instant activation
Credits reflect right after purchase.
Recommended
Start with Standard
Best value for active buying and response unlocks.
);
}
if (tab === 'transactions') {
return (
{['Invoice No', 'Package', 'Credits', 'Amount Paid', 'Status', 'Date', 'Actions'].map((h) => (
| {h} |
))}
{txRows().map((row) => (
| {row[0]} |
{row[1]} |
{row[2]} |
{row[3]} |
{row[4]}
|
{row[5]} |
|
))}
Showing 1 to 4 of 42 transactions
{[1, 2, 3].map((p) => (
))}
);
}
if (tab === 'usage history') {
return (

Total Used (30d)
12,480

Most Used Action
Boost Profile

Current Balance
12,450 TC
{['Usage ID', 'Action Type', 'Credits Used', 'Related ID', 'Date', 'Remarks'].map((h) => (
| {h} |
))}
{[
['#US-99421', 'Unlock Contact', '-5.00', 'CONT-2034', 'Oct 24, 2023', 'Direct profile unlock for enterprise tier'],
['#US-99418', 'Boost Profile', '-25.00', 'PROF-8812', 'Oct 23, 2023', 'Featured placement (7 days)'],
['#US-99405', 'Batch Export', '-150.00', 'EXP-0044', 'Oct 22, 2023', 'Export of 300 leads'],
['#US-99388', 'Unlock Contact', '-5.00', 'CONT-1992', 'Oct 21, 2023', 'Individual unlock action'],
].map((row) => (
| {row[0]} |
{row[1]} |
{row[2]} |
{row[3]} |
{row[4]} |
{row[5]} |
))}
Showing 1 to 4 of 142 results
{[1, 2, 3].map((p) => (
))}
);
}
if (tab === 'invoices') {
return (
{['Invoice Number', 'Billing Date', 'Package', 'Total', 'Status'].map((h) => (
| {h} |
))}
{invoiceRows.map((row) => (
| {row[0]} |
{row[1]} |
{row[2]} |
{row[3]} |
{row[4]}
|
))}
Showing 1 to 4 of 24 invoices
{[1, 2, 3].map((p) => (
))}
);
}
return (
Current Balance
12,450 TC
+12% from last month
Monthly Usage
1,248
Avg 42/day
Pending Invoices
1
Recent Transactions
{['Transaction ID', 'Package', 'Credits', 'Amount Paid', 'Status', 'Date'].map((h) => (
| {h} |
))}
{txRows().slice(0, 3).map((row: any) => (
| {row[0]} |
{row[1]} |
{row[2]} |
{row[3]} |
{row[4]}
|
{row[5]} |
))}
);
}
if (customerKey() === 'explore nxtgauge') {
return (
Explore opportunities on Nxtgauge
Discover services, connect with verified users, and expand into additional roles using the same dashboard workflow.
{[
{ key: 'COMPANY', title: 'Company', icon: '/sidebar-icons/users.svg', subtitle: 'Hire talent, post jobs, and manage applications in one path.' },
{ key: 'JOB_SEEKER', title: 'Job Seeker', icon: '/sidebar-icons/company.svg', subtitle: 'Explore opportunities and apply to roles with your profile.' },
{ key: 'SERVICE_SEEKER', title: 'Service Seeker', icon: '/sidebar-icons/candidate.svg', subtitle: 'Post requirements and connect with verified professionals.' },
].map((roleCard) => {
const activeRoles = userRoles();
const isRegistered = activeRoles.some((ar) => normalizeRoleKey(ar.role_key || ar.key) === normalizeRoleKey(roleCard.key));
const isCurrentRole = normalizeRoleKey(props.roleKey || '') === normalizeRoleKey(roleCard.key);
return (
{roleCard.title}
{roleCard.subtitle}
);
})}
Professional Services
Choose from 10 professional roles, including UGC Content Creator.
{(role) => (
}
>
{role.status}
{role.title}
{role.subtitle}
)}
Growth Advantage
Why Add More Services?
A multi-service profile helps you acquire more opportunities, improve trust, and scale consistently on a single platform.
Reach More Buyers
Get discovered by customers across multiple demand categories.
Increase Revenue Paths
Offer additional services and create new income streams.
Strengthen Credibility
Verified multi-service profiles build confidence and improve conversion.
Scale Faster
Grow your business from one unified account and workflow.
);
}
if (customerKey() === 'verification') {
if (tab === 'approval status') {
return (
Verification Center
Complete just 2 steps. Submit profile and portfolio. We review and unlock access.
Step 1
Profile: {approvalTone(profileApprovalState()).label}
Step 2
Portfolio: {approvalTone(portfolioApprovalState()).label}
Final Access
{bothApprovalsApproved() ? 'Unlocked' : 'Blocked'}
Profile Verification
Finish your basic information and required documents, then submit.
Portfolio Verification
Add portfolio details and submit separately for review.
Admin Flow: once submitted, both items appear in Verification Management. Admin can request documents or approve. Leads remain blocked until both are approved.
);
}
if (tab === 'submitted details') {
return (
Application Snapshot
{[
['Service', 'Social Media Manager'],
['Submission ID', 'VRF-2023-1042'],
['Submitted On', 'Oct 22, 2023'],
['Status', 'Under Review'],
].map(([k, v]) => (
{k}: {v}
))}
Submitted Details
Strategic Social Media Manager with 6+ years of experience in content strategy, campaign planning, and audience growth for D2C brands.
{['Sprout Social', 'Figma', 'Google Analytics'].map((tool) => {tool})}
);
}
if (tab === 'documents') {
return (
Admin requested missing documents
Required Missing Documents: Address Proof (clear PDF/JPG/PNG).
| Document |
File |
Status |
Action |
{[
['Identity Proof', 'id_scan_v2.pdf', 'Approved'],
['Address Proof', 'electricity_bill.jpg', 'Rejected'],
['Tax Document', 'itr_form16_2023.pdf', 'Approved'],
].map(([doc, file, state]) => (
| {doc} |
{file} |
{state}
|
No action}
>
|
))}
Address Proof needs re-upload to continue verification.
);
}
if (tab === 're-upload') {
return (
1 item needs correction
Identity proof is unclear. Please upload a clear copy.
);
}
if (tab === 'activity') {
return (
{[
['Today, 11:30 AM', 'Correction submitted', 'Completed'],
['Today, 10:45 AM', 'Re-upload requested', 'Action Needed'],
['Yesterday, 04:20 PM', 'Reviewer note added', 'Updated'],
['Yesterday, 11:10 AM', 'Verification started', 'Started'],
].map(([time, title, state]) => (
))}
);
}
return (
Details will appear here
This section is being prepared. Please use the available tabs above.
);
}
if (customerKey() === 'help center' || customerKey() === 'support') {
const active = helpCenterTab();
return (
Help Center
Get help, manage tickets, and contact support.
Knowledge Base
Popular:
{['Verification', 'Credits', 'Lead Response'].map((tag) => )}
{(cat) => (
)}
{kbSearch() || kbCategory() !== 'All' ? 'Search Results' : 'Important Articles'}
{(a) => (
)}
No articles found matching your criteria.
Quick Guides
Actionable tutorials to master Nxtgauge
{[
{ title: 'The First 24 Hours: Setup', text: 'Complete your core profile requirements and find your first lead fast.', read: '8 min read', level: 'Beginner', Icon: Rocket },
{ title: 'Maximizing Lead Conversions', text: 'Use response quality and timing strategies to improve closure rate.', read: '15 min read', level: 'Growth', Icon: TrendingUp },
{ title: 'Data Privacy & Security', text: 'Understand how we protect your business and financial information.', read: '5 min read', level: 'Essential', Icon: ShieldCheck },
].map((g) => (
))}
My Tickets
Open: {ticketSummary().openCount}
Resolved: {ticketSummary().resolvedCount}
You have {ticketSummary().total} tickets. {ticketSummary().openCount} still need action and {ticketSummary().resolvedCount} are resolved.
| Ticket ID |
Request |
State |
Priority |
Last Message |
Updated |
Action |
{HELP_TICKET_ROWS.map((t) => (
openTicketDetails(t.id)} style={`border-top:1px solid #F3F4F6;background:${activeTicketId() === t.id ? '#F5F7FF' : 'white'};cursor:pointer`}>
| {t.id} |
{t.title} |
{t.status}
|
{t.priority} |
{t.lastMessage} |
{t.updated} |
|
))}
Ticket Communication
{activeTicketId()} • Share updates and attachments with support team.
Message Support
User message
{selectedTicketDetails().userMessage}
Admin reply
{selectedTicketDetails().adminMessage}
Requested Documents
{(d) => (
{d}
{selectedTicketDetails().requestedDocuments.length ? 'Pending' : 'NA'}
)}
Received From User
{(f) => (
{f.file}
{f.state}
)}
Upload Requested Files
{
const files = event.currentTarget.files;
setViewTicketFiles(files ? Array.from(files).map((file) => file.name) : []);
}}
style="width:100%;font-size:12px;color:#374151"
/>
{(name) => {name}}
Create Ticket
Create a support request with complete details for faster resolution.
Category
);
}
if (customerKey() === 'settings') {
if (tab === 'privacy') {
return
{['Profile visibility', 'Data sharing consent', 'Session management'].map((s) =>
{s}Enabled
)}
;
}
if (tab === 'notifications') {
return
{['Response alerts', 'Billing alerts', 'Security alerts'].map((s) =>
{s}On
)}
;
}
return
{['Change Password', 'Two-factor authentication', 'Login activity'].map((s) =>
{s}
)}
;
}
if (customerKey() === 'switch role' || customerKey() === 'switch services' || customerKey() === 'switch service') {
const activeRoles = userRoles();
return (
Switch Services
Switch between your active roles to manage different business operations.
{(role) => {
const roleKey = String(role.role_key || role.key).toUpperCase();
const isCurrent = normalizeRoleKey(props.roleKey || '') === normalizeRoleKey(roleKey);
return (
{(() => {
const Icon = roleIcon(roleKey);
return ;
})()}
{role.status}
{titleCase(roleKey.replace(/_/g, ' '))}
);
}}
No other active roles found. Explore Nxtgauge to add more.
);
}
if (customerKey() === 'logout') {
if (tab === 'cancel') {
return
Logout Cancelled
Your session is still active.
;
}
return (
Confirm Logout
Are you sure you want to logout from the service seeker portal?
);
}
if (customerKey() === 'my portfolio') {
if (!isProfessionalRoleKey(props.roleKey || '')) {
return (
My Portfolio is only for professionals
Switch to a professional role to manage and preview portfolio content.
);
}
return renderPortfolioContent();
}
return (
Screen Preview
Service seeker screen is selected and interactive.
);
};
const portfolioTabIcon = (tabLabel: string) => {
const key = normalizeTabKey(tabLabel);
if (key === 'overview') return LayoutGrid;
if (key === 'about') return UserCircle2;
if (key.includes('services')) return Coins;
if (key.includes('portfolio')) return Image;
if (key.includes('experience')) return BriefcaseBusiness;
if (key === 'testimonials') return Star;
if (key === 'faqs') return HelpCircle;
return FileText;
};
return (
Actual End-User Dashboard UI Preview
Account Verification Required
{verificationPending() ? 'Your profile is currently under review by our team. This usually takes 24-48 hours.' : 'Complete your profile details to unlock all platform features and start receiving leads.'}
Current View
{isCustomerExternalMode() ? customerView().title : titleCase(props.activeSidebar)}
{isCustomerExternalMode() ? customerView().subtitle : 'Interactive preview for configured dashboard.'}
0 && customerKey() !== 'my portfolio'}>
{(item) => (
(() => {
const itemKey = normalizeTabKey(item);
const isLockedTestimonialsTab = customerKey() === 'my portfolio' && itemKey === 'testimonials' && !portfolioTestimonialsUnlocked();
return (
);
})()
)}
}
>
{(item) => {
const itemKey = normalizeTabKey(item);
const isLockedTestimonialsTab = itemKey === 'testimonials' && !portfolioTestimonialsUnlocked();
const isActive = resolvedTabKey() === itemKey;
const Icon = portfolioTabIcon(item);
return (
);
}}
Default preview mode.
}>
{renderCustomerContent()}