✓ این فرصت ذخیره شد و در پیشنهادهای شما لحاظ میشود.
}
@@ -196,26 +194,11 @@
@* Sticky bottom action bar — mobile only. Always-reachable primary action (native-app feel). *@
- @if (Model.ShowContact)
- {
- @if (!string.IsNullOrEmpty(f.Phone))
- {
-
📞 تماس با مرکز
- }
- else
- {
-
اطلاعات تماس در بالای صفحه
- }
- }
- else
- {
-
-
- }
+
+
@if (!string.IsNullOrEmpty(Model.MapKey) && Model.Shift?.Facility?.Lat is not null)
diff --git a/src/JobsMedical.Web/Pages/Talent/Details.cshtml b/src/JobsMedical.Web/Pages/Talent/Details.cshtml
index 1f41a39..535fbfb 100644
--- a/src/JobsMedical.Web/Pages/Talent/Details.cshtml
+++ b/src/JobsMedical.Web/Pages/Talent/Details.cshtml
@@ -13,16 +13,6 @@
comp = JalaliDate.Toman(pa) + " مدنظر";
else
comp = "توافقی";
- string? telHref = null;
- if (!string.IsNullOrWhiteSpace(t.Phone))
- {
- var digits = new string(t.Phone.Where(char.IsDigit).ToArray());
- if (digits.Length >= 7) telHref = "tel:" + digits;
- }
- // Only Divar is surfaced as a fallback source (and only when no number was extracted).
- // We never name other crawl sources (medjobs/telegram/…) publicly.
- bool isDivar = !string.IsNullOrWhiteSpace(t.SourceUrl)
- && System.Uri.TryCreate(t.SourceUrl, UriKind.Absolute, out var su) && su.Host.Contains("divar");
}
diff --git a/src/JobsMedical.Web/Program.cs b/src/JobsMedical.Web/Program.cs
index a3b0dce..1eb5c0d 100644
--- a/src/JobsMedical.Web/Program.cs
+++ b/src/JobsMedical.Web/Program.cs
@@ -390,6 +390,62 @@ app.MapGet("/sitemap.xml", async (HttpContext ctx, AppDbContext db) =>
return Results.Content(sb.ToString(), "application/xml");
});
+// ---- Contact reveal (modal): a listing's contact channels as JSON, fetched lazily on click so
+// personal numbers never sit in list-page HTML. Logs the Apply interest signal for shift/job. ----
+app.MapGet("/contact", async (string? type, int id, AppDbContext db, InterestService interest) =>
+{
+ object Item(ContactType ct, string value) => new
+ {
+ icon = ContactInfo.Icon(ct), label = ContactInfo.Label(ct), value, href = ContactInfo.Href(ct, value),
+ };
+
+ string? title = null, fallbackUrl = null, fallbackLabel = null;
+ var items = new List