@burdenoff/microfe-housingvista 2026.703.3 → 2026.703.4

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.
Files changed (80) hide show
  1. package/dist/housingvista/HousingVistaRoot.js +23 -23
  2. package/dist/housingvista/HousingVistaRoot.js.map +1 -1
  3. package/dist/housingvista/HousingVistaRoutes.js +10 -10
  4. package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
  5. package/dist/housingvista/components/Breadcrumbs.js +32 -27
  6. package/dist/housingvista/components/Breadcrumbs.js.map +1 -1
  7. package/dist/housingvista/components/ContactOwnerDialog.js +104 -0
  8. package/dist/housingvista/components/ContactOwnerDialog.js.map +1 -0
  9. package/dist/housingvista/components/FileUploader.js +72 -0
  10. package/dist/housingvista/components/FileUploader.js.map +1 -0
  11. package/dist/housingvista/components/ReviewsSection.js +131 -0
  12. package/dist/housingvista/components/ReviewsSection.js.map +1 -0
  13. package/dist/housingvista/components/index.js +3 -0
  14. package/dist/housingvista/hooks/index.js +615 -183
  15. package/dist/housingvista/hooks/index.js.map +1 -1
  16. package/dist/housingvista/hooks/platform.js +228 -0
  17. package/dist/housingvista/hooks/platform.js.map +1 -0
  18. package/dist/housingvista/pages/HomePage.js +126 -134
  19. package/dist/housingvista/pages/HomePage.js.map +1 -1
  20. package/dist/housingvista/pages/amc/AMCManagementPage.js +209 -170
  21. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  22. package/dist/housingvista/pages/analytics/AnalyticsPage.js +123 -145
  23. package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
  24. package/dist/housingvista/pages/assets/AssetDetailPage.js +4 -8
  25. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  26. package/dist/housingvista/pages/assets/AssetManagementPage.js +407 -109
  27. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  28. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +157 -189
  29. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
  30. package/dist/housingvista/pages/finance/HomeLoansPage.js +156 -128
  31. package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
  32. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +615 -400
  33. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  34. package/dist/housingvista/pages/investments/InvestmentsPage.js +207 -188
  35. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  36. package/dist/housingvista/pages/legal/LegalPage.js +93 -73
  37. package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
  38. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +143 -163
  39. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
  40. package/dist/housingvista/pages/market/AreaInsightsPage.js +95 -86
  41. package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
  42. package/dist/housingvista/pages/market/MarketAnalyticsPage.js +73 -64
  43. package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
  44. package/dist/housingvista/pages/marketplace/MarketplacePage.js +100 -79
  45. package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
  46. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +146 -172
  47. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
  48. package/dist/housingvista/pages/offers/OffersPage.js +306 -0
  49. package/dist/housingvista/pages/offers/OffersPage.js.map +1 -0
  50. package/dist/housingvista/pages/properties/AddPropertyPage.js +240 -225
  51. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  52. package/dist/housingvista/pages/properties/PropertiesPage.js +178 -204
  53. package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
  54. package/dist/housingvista/pages/properties/PropertyDetailPage.js +648 -385
  55. package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
  56. package/dist/housingvista/pages/rental/RentalManagementPage.js +552 -309
  57. package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
  58. package/dist/housingvista/pages/settings/ProfilePage.js +81 -144
  59. package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
  60. package/dist/housingvista/pages/settings/SettingsPage.js +80 -143
  61. package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
  62. package/dist/housingvista/pages/shortlist/ShortlistPage.js +32 -19
  63. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  64. package/dist/housingvista/pages/transactions/TransactionDetailPage.js +103 -124
  65. package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
  66. package/dist/housingvista/pages/transactions/TransactionsPage.js +205 -201
  67. package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
  68. package/dist/housingvista/pages/verification/VerificationDetailPage.js +2 -2
  69. package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
  70. package/dist/housingvista/pages/verification/VerificationPage.js +223 -96
  71. package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
  72. package/dist/housingvista/pages/viewings/ViewingsPage.js +259 -0
  73. package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -0
  74. package/dist/housingvista/utils/helpers.js +11 -1
  75. package/dist/housingvista/utils/helpers.js.map +1 -1
  76. package/package.json +1 -1
  77. package/dist/housingvista/pages/chat/ChatPage.js +0 -28
  78. package/dist/housingvista/pages/chat/ChatPage.js.map +0 -1
  79. package/dist/housingvista/pages/notifications/NotificationsPage.js +0 -28
  80. package/dist/housingvista/pages/notifications/NotificationsPage.js.map +0 -1
@@ -2,7 +2,7 @@ import { HousingVistaProvider as e } from "./context/HousingVistaContext.js";
2
2
  import { ErrorBoundary as t } from "./components/ErrorBoundary.js";
3
3
  import { HousingVistaRoutes as n } from "./HousingVistaRoutes.js";
4
4
  import { useEffect as r } from "react";
5
- import { ArrowLeftRight as i, BarChart3 as a, Bell as o, Building as s, Building2 as c, Heart as l, Home as u, KeyRound as d, Landmark as f, LineChart as p, MapPin as m, MessageSquare as h, Scale as g, Settings as _, ShieldCheck as v, Store as y, TrendingUp as b, Wrench as x } from "lucide-react";
5
+ import { ArrowLeftRight as i, BarChart3 as a, Building as o, Building2 as s, CalendarClock as c, Heart as l, Home as u, KeyRound as d, Landmark as f, LineChart as p, MapPin as m, Scale as h, Settings as g, ShieldCheck as _, Store as v, Tag as y, TrendingUp as b, Wrench as x } from "lucide-react";
6
6
  import { jsx as S } from "react/jsx-runtime";
7
7
  import { FeatureFlagProvider as C } from "@burdenoff/fe-libs/shared/feature-flags";
8
8
  import { useI18n as w } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
@@ -26,7 +26,7 @@ var T = (T) => {
26
26
  id: "housingvista-properties",
27
27
  label: j("housingvista.nav.properties", "Properties"),
28
28
  path: M(O, "properties"),
29
- icon: /* @__PURE__ */ S(c, { size: 20 }),
29
+ icon: /* @__PURE__ */ S(s, { size: 20 }),
30
30
  order: 10,
31
31
  group: "properties"
32
32
  },
@@ -54,6 +54,22 @@ var T = (T) => {
54
54
  order: 12,
55
55
  group: "transactions"
56
56
  },
57
+ {
58
+ id: "housingvista-offers",
59
+ label: j("housingvista.nav.offers", "Offers"),
60
+ path: M(O, "offers"),
61
+ icon: /* @__PURE__ */ S(y, { size: 20 }),
62
+ order: 14,
63
+ group: "transactions"
64
+ },
65
+ {
66
+ id: "housingvista-viewings",
67
+ label: j("housingvista.nav.viewings", "Viewings"),
68
+ path: M(O, "viewings"),
69
+ icon: /* @__PURE__ */ S(c, { size: 20 }),
70
+ order: 15,
71
+ group: "properties"
72
+ },
57
73
  {
58
74
  id: "housingvista-rental",
59
75
  label: j("housingvista.nav.rentalManagement", "Rental Mgmt"),
@@ -66,7 +82,7 @@ var T = (T) => {
66
82
  id: "housingvista-assets",
67
83
  label: j("housingvista.nav.assetManagement", "Asset Mgmt"),
68
84
  path: M(O, "assets"),
69
- icon: /* @__PURE__ */ S(s, { size: 20 }),
85
+ icon: /* @__PURE__ */ S(o, { size: 20 }),
70
86
  order: 21,
71
87
  group: "management"
72
88
  },
@@ -82,7 +98,7 @@ var T = (T) => {
82
98
  id: "housingvista-marketplace",
83
99
  label: j("housingvista.nav.marketplace", "Marketplace"),
84
100
  path: M(O, "marketplace"),
85
- icon: /* @__PURE__ */ S(y, { size: 20 }),
101
+ icon: /* @__PURE__ */ S(v, { size: 20 }),
86
102
  order: 30,
87
103
  group: "services"
88
104
  },
@@ -90,7 +106,7 @@ var T = (T) => {
90
106
  id: "housingvista-legal",
91
107
  label: j("housingvista.nav.legalServices", "Legal Services"),
92
108
  path: M(O, "legal"),
93
- icon: /* @__PURE__ */ S(g, { size: 20 }),
109
+ icon: /* @__PURE__ */ S(h, { size: 20 }),
94
110
  order: 31,
95
111
  group: "services"
96
112
  },
@@ -130,31 +146,15 @@ var T = (T) => {
130
146
  id: "housingvista-verification",
131
147
  label: j("housingvista.nav.verification", "Verification"),
132
148
  path: M(O, "verification"),
133
- icon: /* @__PURE__ */ S(v, { size: 20 }),
149
+ icon: /* @__PURE__ */ S(_, { size: 20 }),
134
150
  order: 50,
135
151
  group: "tools"
136
152
  },
137
- {
138
- id: "housingvista-chat",
139
- label: j("housingvista.nav.chat", "Chat"),
140
- path: M(O, "chat"),
141
- icon: /* @__PURE__ */ S(h, { size: 20 }),
142
- order: 51,
143
- group: "tools"
144
- },
145
- {
146
- id: "housingvista-notifications",
147
- label: j("housingvista.nav.notifications", "Notifications"),
148
- path: M(O, "notifications"),
149
- icon: /* @__PURE__ */ S(o, { size: 20 }),
150
- order: 52,
151
- group: "tools"
152
- },
153
153
  {
154
154
  id: "housingvista-settings",
155
155
  label: j("housingvista.nav.settings", "Settings"),
156
156
  path: M(O, "settings"),
157
- icon: /* @__PURE__ */ S(_, { size: 20 }),
157
+ icon: /* @__PURE__ */ S(g, { size: 20 }),
158
158
  order: 60,
159
159
  group: "tools"
160
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HousingVistaRoot.js","names":[],"sources":["../../src/housingvista/HousingVistaRoot.tsx"],"sourcesContent":["/**\n * HousingVista Root Component\n * @module housingvista\n */\n\nimport type { FC } from 'react';\nimport { useEffect } from 'react';\nimport {\n Home,\n Building2,\n ArrowLeftRight,\n Heart,\n TrendingUp,\n KeyRound,\n Building,\n Wrench,\n Store,\n BarChart3,\n LineChart,\n MapPin,\n Scale,\n Landmark,\n ShieldCheck,\n MessageSquare,\n Bell,\n Settings,\n} from 'lucide-react';\nimport { HousingVistaProvider } from './context/HousingVistaContext';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { HousingVistaRoutes } from './HousingVistaRoutes';\nimport { ErrorBoundary } from './components/ErrorBoundary';\nimport type { HousingVistaRootProps, NavItem } from './types';\n\nexport const HousingVistaRoot: FC<HousingVistaRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/', workspaceId = '' } = props;\n const { t } = useI18n();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n // Helper to join paths correctly\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with shell on mount\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n // Dashboard\n {\n id: 'housingvista-dashboard',\n label: tr('housingvista.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <Home size={20} />,\n order: 1,\n group: 'main',\n },\n\n // Properties\n {\n id: 'housingvista-properties',\n label: tr('housingvista.nav.properties', 'Properties'),\n path: joinPath(basePath, 'properties'),\n icon: <Building2 size={20} />,\n order: 10,\n group: 'properties',\n },\n\n // Shortlist\n {\n id: 'housingvista-shortlist',\n label: tr('housingvista.nav.shortlist', 'Shortlist'),\n path: joinPath(basePath, 'shortlist'),\n icon: <Heart size={20} />,\n order: 13,\n group: 'properties',\n },\n\n // Transactions\n {\n id: 'housingvista-transactions',\n label: tr('housingvista.nav.transactions', 'Transactions'),\n path: joinPath(basePath, 'transactions'),\n icon: <ArrowLeftRight size={20} />,\n order: 11,\n group: 'transactions',\n },\n\n // Investments\n {\n id: 'housingvista-investments',\n label: tr('housingvista.nav.investments', 'Investments'),\n path: joinPath(basePath, 'investments'),\n icon: <TrendingUp size={20} />,\n order: 12,\n group: 'transactions',\n },\n\n // Rental Management\n {\n id: 'housingvista-rental',\n label: tr('housingvista.nav.rentalManagement', 'Rental Mgmt'),\n path: joinPath(basePath, 'rental'),\n icon: <KeyRound size={20} />,\n order: 20,\n group: 'management',\n },\n\n // Asset Management\n {\n id: 'housingvista-assets',\n label: tr('housingvista.nav.assetManagement', 'Asset Mgmt'),\n path: joinPath(basePath, 'assets'),\n icon: <Building size={20} />,\n order: 21,\n group: 'management',\n },\n\n // AMC Management\n {\n id: 'housingvista-amc',\n label: tr('housingvista.nav.amcManagement', 'AMC Mgmt'),\n path: joinPath(basePath, 'amc'),\n icon: <Wrench size={20} />,\n order: 22,\n group: 'management',\n },\n\n // Marketplace\n {\n id: 'housingvista-marketplace',\n label: tr('housingvista.nav.marketplace', 'Marketplace'),\n path: joinPath(basePath, 'marketplace'),\n icon: <Store size={20} />,\n order: 30,\n group: 'services',\n },\n\n // Legal Services\n {\n id: 'housingvista-legal',\n label: tr('housingvista.nav.legalServices', 'Legal Services'),\n path: joinPath(basePath, 'legal'),\n icon: <Scale size={20} />,\n order: 31,\n group: 'services',\n },\n\n // Home Loans\n {\n id: 'housingvista-loans',\n label: tr('housingvista.nav.homeLoans', 'Home Loans'),\n path: joinPath(basePath, 'home-loans'),\n icon: <Landmark size={20} />,\n order: 32,\n group: 'services',\n },\n\n // Analytics\n {\n id: 'housingvista-analytics',\n label: tr('housingvista.nav.analytics', 'Analytics'),\n path: joinPath(basePath, 'analytics'),\n icon: <BarChart3 size={20} />,\n order: 40,\n group: 'analytics',\n },\n\n // Market Analytics\n {\n id: 'housingvista-market',\n label: tr('housingvista.nav.marketAnalytics', 'Market Analytics'),\n path: joinPath(basePath, 'market-analytics'),\n icon: <LineChart size={20} />,\n order: 41,\n group: 'analytics',\n },\n\n // Area Insights\n {\n id: 'housingvista-area',\n label: tr('housingvista.nav.areaInsights', 'Area Insights'),\n path: joinPath(basePath, 'area-insights'),\n icon: <MapPin size={20} />,\n order: 42,\n group: 'analytics',\n },\n\n // Verification\n {\n id: 'housingvista-verification',\n label: tr('housingvista.nav.verification', 'Verification'),\n path: joinPath(basePath, 'verification'),\n icon: <ShieldCheck size={20} />,\n order: 50,\n group: 'tools',\n },\n\n // Chat\n {\n id: 'housingvista-chat',\n label: tr('housingvista.nav.chat', 'Chat'),\n path: joinPath(basePath, 'chat'),\n icon: <MessageSquare size={20} />,\n order: 51,\n group: 'tools',\n },\n\n // Notifications\n {\n id: 'housingvista-notifications',\n label: tr('housingvista.nav.notifications', 'Notifications'),\n path: joinPath(basePath, 'notifications'),\n icon: <Bell size={20} />,\n order: 52,\n group: 'tools',\n },\n\n // Settings\n {\n id: 'housingvista-settings',\n label: tr('housingvista.nav.settings', 'Settings'),\n path: joinPath(basePath, 'settings'),\n icon: <Settings size={20} />,\n order: 60,\n group: 'tools',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [basePath, registerNavItems, t]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'housingvista-status',\n label: tr('housingvista.footer.ready', 'HousingVista Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, t]);\n\n return (\n <FeatureFlagProvider workspaceId={workspaceId || null} gateway=\"global\" defaultEnabled={true}>\n <HousingVistaProvider {...props}>\n <ErrorBoundary>\n <HousingVistaRoutes />\n </ErrorBoundary>\n </HousingVistaProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;;AAkCA,IAAa,KAA+C,MAAU;CACpE,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,KAAK,iBAAc,OAAO,GAC9E,EAAE,SAAM,GAAS,EAEjB,KAAM,GAAa,MAAqB;EAC5C,IAAM,IAAa,EAAE,EAAI;AACzB,SAAO,MAAe,IAAM,IAAW;IAInC,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAoNtD,QA/MA,QAAgB;AACT,QAyLL,QADgB,EAtLY;GAE1B;IACE,IAAI;IACJ,OAAO,EAAG,8BAA8B,YAAY;IACpD,MAAM,EAAS,GAAU,GAAG;IAC5B,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,+BAA+B,aAAa;IACtD,MAAM,EAAS,GAAU,aAAa;IACtC,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,8BAA8B,YAAY;IACpD,MAAM,EAAS,GAAU,YAAY;IACrC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,iCAAiC,eAAe;IAC1D,MAAM,EAAS,GAAU,eAAe;IACxC,MAAM,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;IAClC,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,gCAAgC,cAAc;IACxD,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAY,MAAM,IAAM,CAAA;IAC9B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,qCAAqC,cAAc;IAC7D,MAAM,EAAS,GAAU,SAAS;IAClC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,oCAAoC,aAAa;IAC3D,MAAM,EAAS,GAAU,SAAS;IAClC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,kCAAkC,WAAW;IACvD,MAAM,EAAS,GAAU,MAAM;IAC/B,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;IAC1B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,gCAAgC,cAAc;IACxD,MAAM,EAAS,GAAU,cAAc;IACvC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,kCAAkC,iBAAiB;IAC7D,MAAM,EAAS,GAAU,QAAQ;IACjC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,8BAA8B,aAAa;IACrD,MAAM,EAAS,GAAU,aAAa;IACtC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,8BAA8B,YAAY;IACpD,MAAM,EAAS,GAAU,YAAY;IACrC,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,oCAAoC,mBAAmB;IACjE,MAAM,EAAS,GAAU,mBAAmB;IAC5C,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,iCAAiC,gBAAgB;IAC3D,MAAM,EAAS,GAAU,gBAAgB;IACzC,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;IAC1B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,iCAAiC,eAAe;IAC1D,MAAM,EAAS,GAAU,eAAe;IACxC,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;IAC/B,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,yBAAyB,OAAO;IAC1C,MAAM,EAAS,GAAU,OAAO;IAChC,MAAM,kBAAC,GAAD,EAAe,MAAM,IAAM,CAAA;IACjC,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,kCAAkC,gBAAgB;IAC5D,MAAM,EAAS,GAAU,gBAAgB;IACzC,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IACxB,OAAO;IACP,OAAO;IACR;GAGD;IACE,IAAI;IACJ,OAAO,EAAG,6BAA6B,WAAW;IAClD,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACF,CAEyC;IAEzC;EAAC;EAAU;EAAkB;EAAE,CAAC,EAGnC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO,EAAG,6BAA6B,qBAAqB;GAC5D,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,GAAqB,EAAE,CAAC,EAG1B,kBAAC,GAAD;EAAqB,aAAa,KAAe;EAAM,SAAQ;EAAS,gBAAgB;YACtF,kBAAC,GAAD;GAAsB,GAAI;aACxB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAsB,CAAA,EACR,CAAA;GACK,CAAA;EACH,CAAA"}
1
+ {"version":3,"file":"HousingVistaRoot.js","names":[],"sources":["../../src/housingvista/HousingVistaRoot.tsx"],"sourcesContent":["/**\n * HousingVista Root Component\n * @module housingvista\n */\n\nimport type { FC } from 'react';\nimport { useEffect } from 'react';\nimport {\n Home,\n Building2,\n ArrowLeftRight,\n Heart,\n TrendingUp,\n KeyRound,\n Building,\n Wrench,\n Store,\n BarChart3,\n LineChart,\n MapPin,\n Scale,\n Landmark,\n ShieldCheck,\n Tag,\n CalendarClock,\n Settings,\n} from 'lucide-react';\nimport { HousingVistaProvider } from './context/HousingVistaContext';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { HousingVistaRoutes } from './HousingVistaRoutes';\nimport { ErrorBoundary } from './components/ErrorBoundary';\nimport type { HousingVistaRootProps, NavItem } from './types';\n\nexport const HousingVistaRoot: FC<HousingVistaRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/', workspaceId = '' } = props;\n const { t } = useI18n();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n // Helper to join paths correctly\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with shell on mount\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n // Dashboard\n {\n id: 'housingvista-dashboard',\n label: tr('housingvista.nav.dashboard', 'Dashboard'),\n path: joinPath(basePath, ''),\n icon: <Home size={20} />,\n order: 1,\n group: 'main',\n },\n\n // Properties\n {\n id: 'housingvista-properties',\n label: tr('housingvista.nav.properties', 'Properties'),\n path: joinPath(basePath, 'properties'),\n icon: <Building2 size={20} />,\n order: 10,\n group: 'properties',\n },\n\n // Shortlist\n {\n id: 'housingvista-shortlist',\n label: tr('housingvista.nav.shortlist', 'Shortlist'),\n path: joinPath(basePath, 'shortlist'),\n icon: <Heart size={20} />,\n order: 13,\n group: 'properties',\n },\n\n // Transactions\n {\n id: 'housingvista-transactions',\n label: tr('housingvista.nav.transactions', 'Transactions'),\n path: joinPath(basePath, 'transactions'),\n icon: <ArrowLeftRight size={20} />,\n order: 11,\n group: 'transactions',\n },\n\n // Investments\n {\n id: 'housingvista-investments',\n label: tr('housingvista.nav.investments', 'Investments'),\n path: joinPath(basePath, 'investments'),\n icon: <TrendingUp size={20} />,\n order: 12,\n group: 'transactions',\n },\n\n // Offers\n {\n id: 'housingvista-offers',\n label: tr('housingvista.nav.offers', 'Offers'),\n path: joinPath(basePath, 'offers'),\n icon: <Tag size={20} />,\n order: 14,\n group: 'transactions',\n },\n\n // Viewings\n {\n id: 'housingvista-viewings',\n label: tr('housingvista.nav.viewings', 'Viewings'),\n path: joinPath(basePath, 'viewings'),\n icon: <CalendarClock size={20} />,\n order: 15,\n group: 'properties',\n },\n\n // Rental Management\n {\n id: 'housingvista-rental',\n label: tr('housingvista.nav.rentalManagement', 'Rental Mgmt'),\n path: joinPath(basePath, 'rental'),\n icon: <KeyRound size={20} />,\n order: 20,\n group: 'management',\n },\n\n // Asset Management\n {\n id: 'housingvista-assets',\n label: tr('housingvista.nav.assetManagement', 'Asset Mgmt'),\n path: joinPath(basePath, 'assets'),\n icon: <Building size={20} />,\n order: 21,\n group: 'management',\n },\n\n // AMC Management\n {\n id: 'housingvista-amc',\n label: tr('housingvista.nav.amcManagement', 'AMC Mgmt'),\n path: joinPath(basePath, 'amc'),\n icon: <Wrench size={20} />,\n order: 22,\n group: 'management',\n },\n\n // Marketplace\n {\n id: 'housingvista-marketplace',\n label: tr('housingvista.nav.marketplace', 'Marketplace'),\n path: joinPath(basePath, 'marketplace'),\n icon: <Store size={20} />,\n order: 30,\n group: 'services',\n },\n\n // Legal Services\n {\n id: 'housingvista-legal',\n label: tr('housingvista.nav.legalServices', 'Legal Services'),\n path: joinPath(basePath, 'legal'),\n icon: <Scale size={20} />,\n order: 31,\n group: 'services',\n },\n\n // Home Loans\n {\n id: 'housingvista-loans',\n label: tr('housingvista.nav.homeLoans', 'Home Loans'),\n path: joinPath(basePath, 'home-loans'),\n icon: <Landmark size={20} />,\n order: 32,\n group: 'services',\n },\n\n // Analytics\n {\n id: 'housingvista-analytics',\n label: tr('housingvista.nav.analytics', 'Analytics'),\n path: joinPath(basePath, 'analytics'),\n icon: <BarChart3 size={20} />,\n order: 40,\n group: 'analytics',\n },\n\n // Market Analytics\n {\n id: 'housingvista-market',\n label: tr('housingvista.nav.marketAnalytics', 'Market Analytics'),\n path: joinPath(basePath, 'market-analytics'),\n icon: <LineChart size={20} />,\n order: 41,\n group: 'analytics',\n },\n\n // Area Insights\n {\n id: 'housingvista-area',\n label: tr('housingvista.nav.areaInsights', 'Area Insights'),\n path: joinPath(basePath, 'area-insights'),\n icon: <MapPin size={20} />,\n order: 42,\n group: 'analytics',\n },\n\n // Verification\n {\n id: 'housingvista-verification',\n label: tr('housingvista.nav.verification', 'Verification'),\n path: joinPath(basePath, 'verification'),\n icon: <ShieldCheck size={20} />,\n order: 50,\n group: 'tools',\n },\n\n // Settings\n {\n id: 'housingvista-settings',\n label: tr('housingvista.nav.settings', 'Settings'),\n path: joinPath(basePath, 'settings'),\n icon: <Settings size={20} />,\n order: 60,\n group: 'tools',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [basePath, registerNavItems, t]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'housingvista-status',\n label: tr('housingvista.footer.ready', 'HousingVista Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, t]);\n\n return (\n <FeatureFlagProvider workspaceId={workspaceId || null} gateway=\"global\" defaultEnabled={true}>\n <HousingVistaProvider {...props}>\n <ErrorBoundary>\n <HousingVistaRoutes />\n </ErrorBoundary>\n </HousingVistaProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ var c = () => /* @__PURE__ */ o("div", {
9
9
  className: "text-sm text-text-secondary",
10
10
  children: "Loading..."
11
11
  })
12
- }), l = n(() => import("./pages/properties/PropertiesPage.js").then((e) => ({ default: e.PropertiesPage }))), u = n(() => import("./pages/properties/AddPropertyPage.js").then((e) => ({ default: e.AddPropertyPage }))), d = n(() => import("./pages/properties/PropertyDetailPage.js").then((e) => ({ default: e.PropertyDetailPage }))), f = n(() => import("./pages/shortlist/ShortlistPage.js").then((e) => ({ default: e.ShortlistPage }))), p = n(() => import("./pages/transactions/TransactionsPage.js").then((e) => ({ default: e.TransactionsPage }))), m = n(() => import("./pages/transactions/TransactionDetailPage.js").then((e) => ({ default: e.TransactionDetailPage }))), h = n(() => import("./pages/investments/InvestmentsPage.js").then((e) => ({ default: e.InvestmentsPage }))), g = n(() => import("./pages/investments/InvestmentDetailPage.js").then((e) => ({ default: e.InvestmentDetailPage }))), _ = n(() => import("./pages/analytics/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), v = n(() => import("./pages/rental/RentalManagementPage.js").then((e) => ({ default: e.RentalManagementPage }))), y = n(() => import("./pages/assets/AssetManagementPage.js").then((e) => ({ default: e.AssetManagementPage }))), b = n(() => import("./pages/assets/AssetDetailPage.js").then((e) => ({ default: e.AssetDetailPage }))), x = n(() => import("./pages/amc/AMCManagementPage.js").then((e) => ({ default: e.AMCManagementPage }))), S = n(() => import("./pages/marketplace/MarketplacePage.js").then((e) => ({ default: e.MarketplacePage }))), C = n(() => import("./pages/marketplace/ServiceDetailPage.js").then((e) => ({ default: e.ServiceDetailPage }))), w = n(() => import("./pages/chat/ChatPage.js").then((e) => ({ default: e.ChatPage }))), T = n(() => import("./pages/notifications/NotificationsPage.js").then((e) => ({ default: e.NotificationsPage }))), E = n(() => import("./pages/verification/VerificationPage.js").then((e) => ({ default: e.VerificationPage }))), D = n(() => import("./pages/verification/VerificationDetailPage.js").then((e) => ({ default: e.VerificationDetailPage }))), O = n(() => import("./pages/legal/LegalPage.js").then((e) => ({ default: e.LegalPage }))), k = n(() => import("./pages/legal/LegalServiceDetailPage.js").then((e) => ({ default: e.LegalServiceDetailPage }))), A = n(() => import("./pages/finance/HomeLoansPage.js").then((e) => ({ default: e.HomeLoansPage }))), j = n(() => import("./pages/finance/HomeLoanDetailPage.js").then((e) => ({ default: e.HomeLoanDetailPage }))), M = n(() => import("./pages/market/MarketAnalyticsPage.js").then((e) => ({ default: e.MarketAnalyticsPage }))), N = n(() => import("./pages/market/AreaInsightsPage.js").then((e) => ({ default: e.AreaInsightsPage }))), P = n(() => import("./pages/settings/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), F = n(() => import("./pages/settings/ProfilePage.js").then((e) => ({ default: e.ProfilePage })));
12
+ }), l = n(() => import("./pages/properties/PropertiesPage.js").then((e) => ({ default: e.PropertiesPage }))), u = n(() => import("./pages/properties/AddPropertyPage.js").then((e) => ({ default: e.AddPropertyPage }))), d = n(() => import("./pages/properties/PropertyDetailPage.js").then((e) => ({ default: e.PropertyDetailPage }))), f = n(() => import("./pages/shortlist/ShortlistPage.js").then((e) => ({ default: e.ShortlistPage }))), p = n(() => import("./pages/transactions/TransactionsPage.js").then((e) => ({ default: e.TransactionsPage }))), m = n(() => import("./pages/transactions/TransactionDetailPage.js").then((e) => ({ default: e.TransactionDetailPage }))), h = n(() => import("./pages/investments/InvestmentsPage.js").then((e) => ({ default: e.InvestmentsPage }))), g = n(() => import("./pages/investments/InvestmentDetailPage.js").then((e) => ({ default: e.InvestmentDetailPage }))), _ = n(() => import("./pages/offers/OffersPage.js").then((e) => ({ default: e.OffersPage }))), v = n(() => import("./pages/viewings/ViewingsPage.js").then((e) => ({ default: e.ViewingsPage }))), y = n(() => import("./pages/analytics/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), b = n(() => import("./pages/rental/RentalManagementPage.js").then((e) => ({ default: e.RentalManagementPage }))), x = n(() => import("./pages/assets/AssetManagementPage.js").then((e) => ({ default: e.AssetManagementPage }))), S = n(() => import("./pages/assets/AssetDetailPage.js").then((e) => ({ default: e.AssetDetailPage }))), C = n(() => import("./pages/amc/AMCManagementPage.js").then((e) => ({ default: e.AMCManagementPage }))), w = n(() => import("./pages/marketplace/MarketplacePage.js").then((e) => ({ default: e.MarketplacePage }))), T = n(() => import("./pages/marketplace/ServiceDetailPage.js").then((e) => ({ default: e.ServiceDetailPage }))), E = n(() => import("./pages/verification/VerificationPage.js").then((e) => ({ default: e.VerificationPage }))), D = n(() => import("./pages/verification/VerificationDetailPage.js").then((e) => ({ default: e.VerificationDetailPage }))), O = n(() => import("./pages/legal/LegalPage.js").then((e) => ({ default: e.LegalPage }))), k = n(() => import("./pages/legal/LegalServiceDetailPage.js").then((e) => ({ default: e.LegalServiceDetailPage }))), A = n(() => import("./pages/finance/HomeLoansPage.js").then((e) => ({ default: e.HomeLoansPage }))), j = n(() => import("./pages/finance/HomeLoanDetailPage.js").then((e) => ({ default: e.HomeLoanDetailPage }))), M = n(() => import("./pages/market/MarketAnalyticsPage.js").then((e) => ({ default: e.MarketAnalyticsPage }))), N = n(() => import("./pages/market/AreaInsightsPage.js").then((e) => ({ default: e.AreaInsightsPage }))), P = n(() => import("./pages/settings/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), F = n(() => import("./pages/settings/ProfilePage.js").then((e) => ({ default: e.ProfilePage })));
13
13
  function I() {
14
14
  return /* @__PURE__ */ o(t, {
15
15
  fallback: /* @__PURE__ */ o(c, {}),
@@ -51,39 +51,39 @@ function I() {
51
51
  element: /* @__PURE__ */ o(g, {})
52
52
  }),
53
53
  /* @__PURE__ */ o(i, {
54
- path: "analytics",
54
+ path: "offers",
55
55
  element: /* @__PURE__ */ o(_, {})
56
56
  }),
57
57
  /* @__PURE__ */ o(i, {
58
- path: "rental",
58
+ path: "viewings",
59
59
  element: /* @__PURE__ */ o(v, {})
60
60
  }),
61
61
  /* @__PURE__ */ o(i, {
62
- path: "assets",
62
+ path: "analytics",
63
63
  element: /* @__PURE__ */ o(y, {})
64
64
  }),
65
65
  /* @__PURE__ */ o(i, {
66
- path: "assets/:id",
66
+ path: "rental",
67
67
  element: /* @__PURE__ */ o(b, {})
68
68
  }),
69
69
  /* @__PURE__ */ o(i, {
70
- path: "amc",
70
+ path: "assets",
71
71
  element: /* @__PURE__ */ o(x, {})
72
72
  }),
73
73
  /* @__PURE__ */ o(i, {
74
- path: "marketplace",
74
+ path: "assets/:id",
75
75
  element: /* @__PURE__ */ o(S, {})
76
76
  }),
77
77
  /* @__PURE__ */ o(i, {
78
- path: "marketplace/:id",
78
+ path: "amc",
79
79
  element: /* @__PURE__ */ o(C, {})
80
80
  }),
81
81
  /* @__PURE__ */ o(i, {
82
- path: "chat",
82
+ path: "marketplace",
83
83
  element: /* @__PURE__ */ o(w, {})
84
84
  }),
85
85
  /* @__PURE__ */ o(i, {
86
- path: "notifications",
86
+ path: "marketplace/:id",
87
87
  element: /* @__PURE__ */ o(T, {})
88
88
  }),
89
89
  /* @__PURE__ */ o(i, {
@@ -1 +1 @@
1
- {"version":3,"file":"HousingVistaRoutes.js","names":[],"sources":["../../src/housingvista/HousingVistaRoutes.tsx"],"sourcesContent":["/**\n * HousingVista Routes\n * All route definitions with lazy loading.\n * @module housingvista\n */\n\nimport { lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\n\n// Eagerly load the home page\nimport { HomePage } from './pages/HomePage';\n\n// Loading fallback\nconst PageLoader = () => (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"text-sm text-text-secondary\">Loading...</div>\n </div>\n);\n\n// ── Properties ──────────────────────────────────────────────────────────────\nconst PropertiesPage = lazy(() =>\n import('./pages/properties/PropertiesPage').then((m) => ({ default: m.PropertiesPage }))\n);\nconst AddPropertyPage = lazy(() =>\n import('./pages/properties/AddPropertyPage').then((m) => ({ default: m.AddPropertyPage }))\n);\nconst PropertyDetailPage = lazy(() =>\n import('./pages/properties/PropertyDetailPage').then((m) => ({ default: m.PropertyDetailPage }))\n);\nconst ShortlistPage = lazy(() => import('./pages/shortlist/ShortlistPage').then((m) => ({ default: m.ShortlistPage })));\n\n// ── Transactions ────────────────────────────────────────────────────────────\nconst TransactionsPage = lazy(() =>\n import('./pages/transactions/TransactionsPage').then((m) => ({ default: m.TransactionsPage }))\n);\nconst TransactionDetailPage = lazy(() =>\n import('./pages/transactions/TransactionDetailPage').then((m) => ({ default: m.TransactionDetailPage }))\n);\n\n// ── Investments ─────────────────────────────────────────────────────────────\nconst InvestmentsPage = lazy(() =>\n import('./pages/investments/InvestmentsPage').then((m) => ({ default: m.InvestmentsPage }))\n);\nconst InvestmentDetailPage = lazy(() =>\n import('./pages/investments/InvestmentDetailPage').then((m) => ({ default: m.InvestmentDetailPage }))\n);\n\n// ── Analytics ───────────────────────────────────────────────────────────────\nconst AnalyticsPage = lazy(() => import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage })));\n\n// ── Rental Management ───────────────────────────────────────────────────────\nconst RentalManagementPage = lazy(() =>\n import('./pages/rental/RentalManagementPage').then((m) => ({ default: m.RentalManagementPage }))\n);\n\n// ── Asset Management ────────────────────────────────────────────────────────\nconst AssetManagementPage = lazy(() =>\n import('./pages/assets/AssetManagementPage').then((m) => ({ default: m.AssetManagementPage }))\n);\nconst AssetDetailPage = lazy(() =>\n import('./pages/assets/AssetDetailPage').then((m) => ({ default: m.AssetDetailPage }))\n);\n\n// ── AMC Management ──────────────────────────────────────────────────────────\nconst AMCManagementPage = lazy(() =>\n import('./pages/amc/AMCManagementPage').then((m) => ({ default: m.AMCManagementPage }))\n);\n\n// ── Marketplace ─────────────────────────────────────────────────────────────\nconst MarketplacePage = lazy(() =>\n import('./pages/marketplace/MarketplacePage').then((m) => ({ default: m.MarketplacePage }))\n);\nconst ServiceDetailPage = lazy(() =>\n import('./pages/marketplace/ServiceDetailPage').then((m) => ({ default: m.ServiceDetailPage }))\n);\n\n// ── Chat ────────────────────────────────────────────────────────────────────\nconst ChatPage = lazy(() => import('./pages/chat/ChatPage').then((m) => ({ default: m.ChatPage })));\n\n// ── Notifications ───────────────────────────────────────────────────────────\nconst NotificationsPage = lazy(() =>\n import('./pages/notifications/NotificationsPage').then((m) => ({ default: m.NotificationsPage }))\n);\n\n// ── Verification ────────────────────────────────────────────────────────────\nconst VerificationPage = lazy(() =>\n import('./pages/verification/VerificationPage').then((m) => ({ default: m.VerificationPage }))\n);\nconst VerificationDetailPage = lazy(() =>\n import('./pages/verification/VerificationDetailPage').then((m) => ({ default: m.VerificationDetailPage }))\n);\n\n// ── Legal ───────────────────────────────────────────────────────────────────\nconst LegalPage = lazy(() => import('./pages/legal/LegalPage').then((m) => ({ default: m.LegalPage })));\nconst LegalServiceDetailPage = lazy(() =>\n import('./pages/legal/LegalServiceDetailPage').then((m) => ({ default: m.LegalServiceDetailPage }))\n);\n\n// ── Finance ─────────────────────────────────────────────────────────────────\nconst HomeLoansPage = lazy(() => import('./pages/finance/HomeLoansPage').then((m) => ({ default: m.HomeLoansPage })));\nconst HomeLoanDetailPage = lazy(() =>\n import('./pages/finance/HomeLoanDetailPage').then((m) => ({ default: m.HomeLoanDetailPage }))\n);\n\n// ── Market ──────────────────────────────────────────────────────────────────\nconst MarketAnalyticsPage = lazy(() =>\n import('./pages/market/MarketAnalyticsPage').then((m) => ({ default: m.MarketAnalyticsPage }))\n);\nconst AreaInsightsPage = lazy(() =>\n import('./pages/market/AreaInsightsPage').then((m) => ({ default: m.AreaInsightsPage }))\n);\n\n// ── Settings ────────────────────────────────────────────────────────────────\nconst SettingsPage = lazy(() => import('./pages/settings/SettingsPage').then((m) => ({ default: m.SettingsPage })));\nconst ProfilePage = lazy(() => import('./pages/settings/ProfilePage').then((m) => ({ default: m.ProfilePage })));\n\n// ============================================================================\n// Routes\n// ============================================================================\n\nexport function HousingVistaRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Dashboard */}\n <Route index element={<HomePage />} />\n\n {/* Properties */}\n <Route path=\"properties\" element={<PropertiesPage />} />\n <Route path=\"properties/new\" element={<AddPropertyPage />} />\n <Route path=\"properties/:id\" element={<PropertyDetailPage />} />\n\n {/* Shortlist */}\n <Route path=\"shortlist\" element={<ShortlistPage />} />\n\n {/* Transactions */}\n <Route path=\"transactions\" element={<TransactionsPage />} />\n <Route path=\"transactions/:id\" element={<TransactionDetailPage />} />\n\n {/* Investments */}\n <Route path=\"investments\" element={<InvestmentsPage />} />\n <Route path=\"investments/:id\" element={<InvestmentDetailPage />} />\n\n {/* Analytics */}\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n\n {/* Rental Management */}\n <Route path=\"rental\" element={<RentalManagementPage />} />\n\n {/* Asset Management */}\n <Route path=\"assets\" element={<AssetManagementPage />} />\n <Route path=\"assets/:id\" element={<AssetDetailPage />} />\n\n {/* AMC Management */}\n <Route path=\"amc\" element={<AMCManagementPage />} />\n\n {/* Marketplace */}\n <Route path=\"marketplace\" element={<MarketplacePage />} />\n <Route path=\"marketplace/:id\" element={<ServiceDetailPage />} />\n\n {/* Chat */}\n <Route path=\"chat\" element={<ChatPage />} />\n\n {/* Notifications */}\n <Route path=\"notifications\" element={<NotificationsPage />} />\n\n {/* Verification */}\n <Route path=\"verification\" element={<VerificationPage />} />\n <Route path=\"verification/:id\" element={<VerificationDetailPage />} />\n\n {/* Legal */}\n <Route path=\"legal\" element={<LegalPage />} />\n <Route path=\"legal/:id\" element={<LegalServiceDetailPage />} />\n\n {/* Home Loans */}\n <Route path=\"home-loans\" element={<HomeLoansPage />} />\n <Route path=\"home-loans/:id/apply\" element={<HomeLoanDetailPage />} />\n\n {/* Market Analytics */}\n <Route path=\"market-analytics\" element={<MarketAnalyticsPage />} />\n <Route path=\"area-insights\" element={<AreaInsightsPage />} />\n\n {/* Settings & Profile */}\n <Route path=\"settings\" element={<SettingsPage />} />\n <Route path=\"profile\" element={<ProfilePage />} />\n\n {/* Catch-all: redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HousingVistaRoutes.js","names":[],"sources":["../../src/housingvista/HousingVistaRoutes.tsx"],"sourcesContent":["/**\n * HousingVista Routes\n * All route definitions with lazy loading.\n * @module housingvista\n */\n\nimport { lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\n\n// Eagerly load the home page\nimport { HomePage } from './pages/HomePage';\n\n// Loading fallback\nconst PageLoader = () => (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"text-sm text-text-secondary\">Loading...</div>\n </div>\n);\n\n// ── Properties ──────────────────────────────────────────────────────────────\nconst PropertiesPage = lazy(() =>\n import('./pages/properties/PropertiesPage').then((m) => ({ default: m.PropertiesPage }))\n);\nconst AddPropertyPage = lazy(() =>\n import('./pages/properties/AddPropertyPage').then((m) => ({ default: m.AddPropertyPage }))\n);\nconst PropertyDetailPage = lazy(() =>\n import('./pages/properties/PropertyDetailPage').then((m) => ({ default: m.PropertyDetailPage }))\n);\nconst ShortlistPage = lazy(() => import('./pages/shortlist/ShortlistPage').then((m) => ({ default: m.ShortlistPage })));\n\n// ── Transactions ────────────────────────────────────────────────────────────\nconst TransactionsPage = lazy(() =>\n import('./pages/transactions/TransactionsPage').then((m) => ({ default: m.TransactionsPage }))\n);\nconst TransactionDetailPage = lazy(() =>\n import('./pages/transactions/TransactionDetailPage').then((m) => ({ default: m.TransactionDetailPage }))\n);\n\n// ── Investments ─────────────────────────────────────────────────────────────\nconst InvestmentsPage = lazy(() =>\n import('./pages/investments/InvestmentsPage').then((m) => ({ default: m.InvestmentsPage }))\n);\nconst InvestmentDetailPage = lazy(() =>\n import('./pages/investments/InvestmentDetailPage').then((m) => ({ default: m.InvestmentDetailPage }))\n);\n\n// ── Offers ──────────────────────────────────────────────────────────────────\nconst OffersPage = lazy(() => import('./pages/offers/OffersPage').then((m) => ({ default: m.OffersPage })));\n\n// ── Viewings ────────────────────────────────────────────────────────────────\nconst ViewingsPage = lazy(() =>\n import('./pages/viewings/ViewingsPage').then((m) => ({ default: m.ViewingsPage }))\n);\n\n// ── Analytics ───────────────────────────────────────────────────────────────\nconst AnalyticsPage = lazy(() => import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage })));\n\n// ── Rental Management ───────────────────────────────────────────────────────\nconst RentalManagementPage = lazy(() =>\n import('./pages/rental/RentalManagementPage').then((m) => ({ default: m.RentalManagementPage }))\n);\n\n// ── Asset Management ────────────────────────────────────────────────────────\nconst AssetManagementPage = lazy(() =>\n import('./pages/assets/AssetManagementPage').then((m) => ({ default: m.AssetManagementPage }))\n);\nconst AssetDetailPage = lazy(() =>\n import('./pages/assets/AssetDetailPage').then((m) => ({ default: m.AssetDetailPage }))\n);\n\n// ── AMC Management ──────────────────────────────────────────────────────────\nconst AMCManagementPage = lazy(() =>\n import('./pages/amc/AMCManagementPage').then((m) => ({ default: m.AMCManagementPage }))\n);\n\n// ── Marketplace ─────────────────────────────────────────────────────────────\nconst MarketplacePage = lazy(() =>\n import('./pages/marketplace/MarketplacePage').then((m) => ({ default: m.MarketplacePage }))\n);\nconst ServiceDetailPage = lazy(() =>\n import('./pages/marketplace/ServiceDetailPage').then((m) => ({ default: m.ServiceDetailPage }))\n);\n\n// ── Verification ────────────────────────────────────────────────────────────\nconst VerificationPage = lazy(() =>\n import('./pages/verification/VerificationPage').then((m) => ({ default: m.VerificationPage }))\n);\nconst VerificationDetailPage = lazy(() =>\n import('./pages/verification/VerificationDetailPage').then((m) => ({ default: m.VerificationDetailPage }))\n);\n\n// ── Legal ───────────────────────────────────────────────────────────────────\nconst LegalPage = lazy(() => import('./pages/legal/LegalPage').then((m) => ({ default: m.LegalPage })));\nconst LegalServiceDetailPage = lazy(() =>\n import('./pages/legal/LegalServiceDetailPage').then((m) => ({ default: m.LegalServiceDetailPage }))\n);\n\n// ── Finance ─────────────────────────────────────────────────────────────────\nconst HomeLoansPage = lazy(() => import('./pages/finance/HomeLoansPage').then((m) => ({ default: m.HomeLoansPage })));\nconst HomeLoanDetailPage = lazy(() =>\n import('./pages/finance/HomeLoanDetailPage').then((m) => ({ default: m.HomeLoanDetailPage }))\n);\n\n// ── Market ──────────────────────────────────────────────────────────────────\nconst MarketAnalyticsPage = lazy(() =>\n import('./pages/market/MarketAnalyticsPage').then((m) => ({ default: m.MarketAnalyticsPage }))\n);\nconst AreaInsightsPage = lazy(() =>\n import('./pages/market/AreaInsightsPage').then((m) => ({ default: m.AreaInsightsPage }))\n);\n\n// ── Settings ────────────────────────────────────────────────────────────────\nconst SettingsPage = lazy(() => import('./pages/settings/SettingsPage').then((m) => ({ default: m.SettingsPage })));\nconst ProfilePage = lazy(() => import('./pages/settings/ProfilePage').then((m) => ({ default: m.ProfilePage })));\n\n// ============================================================================\n// Routes\n// ============================================================================\n\nexport function HousingVistaRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Dashboard */}\n <Route index element={<HomePage />} />\n\n {/* Properties */}\n <Route path=\"properties\" element={<PropertiesPage />} />\n <Route path=\"properties/new\" element={<AddPropertyPage />} />\n <Route path=\"properties/:id\" element={<PropertyDetailPage />} />\n\n {/* Shortlist */}\n <Route path=\"shortlist\" element={<ShortlistPage />} />\n\n {/* Transactions */}\n <Route path=\"transactions\" element={<TransactionsPage />} />\n <Route path=\"transactions/:id\" element={<TransactionDetailPage />} />\n\n {/* Investments */}\n <Route path=\"investments\" element={<InvestmentsPage />} />\n <Route path=\"investments/:id\" element={<InvestmentDetailPage />} />\n\n {/* Offers */}\n <Route path=\"offers\" element={<OffersPage />} />\n\n {/* Viewings */}\n <Route path=\"viewings\" element={<ViewingsPage />} />\n\n {/* Analytics */}\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n\n {/* Rental Management */}\n <Route path=\"rental\" element={<RentalManagementPage />} />\n\n {/* Asset Management */}\n <Route path=\"assets\" element={<AssetManagementPage />} />\n <Route path=\"assets/:id\" element={<AssetDetailPage />} />\n\n {/* AMC Management */}\n <Route path=\"amc\" element={<AMCManagementPage />} />\n\n {/* Marketplace */}\n <Route path=\"marketplace\" element={<MarketplacePage />} />\n <Route path=\"marketplace/:id\" element={<ServiceDetailPage />} />\n\n {/* Verification */}\n <Route path=\"verification\" element={<VerificationPage />} />\n <Route path=\"verification/:id\" element={<VerificationDetailPage />} />\n\n {/* Legal */}\n <Route path=\"legal\" element={<LegalPage />} />\n <Route path=\"legal/:id\" element={<LegalServiceDetailPage />} />\n\n {/* Home Loans */}\n <Route path=\"home-loans\" element={<HomeLoansPage />} />\n <Route path=\"home-loans/:id/apply\" element={<HomeLoanDetailPage />} />\n\n {/* Market Analytics */}\n <Route path=\"market-analytics\" element={<MarketAnalyticsPage />} />\n <Route path=\"area-insights\" element={<AreaInsightsPage />} />\n\n {/* Settings & Profile */}\n <Route path=\"settings\" element={<SettingsPage />} />\n <Route path=\"profile\" element={<ProfilePage />} />\n\n {/* Catch-all: redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -1,31 +1,36 @@
1
- import { cn as e } from "../utils/helpers.js";
2
- import { ChevronRight as t, Home as n } from "lucide-react";
3
- import { Link as r } from "react-router-dom";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
1
+ import { useHousingVista as e } from "../context/HousingVistaContext.js";
2
+ import { cn as t } from "../utils/helpers.js";
3
+ import { ChevronRight as n, Home as r } from "lucide-react";
4
+ import { Link as i } from "react-router-dom";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
6
  //#region src/housingvista/components/Breadcrumbs.tsx
6
- var o = ({ items: o, className: s }) => /* @__PURE__ */ a("nav", {
7
- "aria-label": "Breadcrumb",
8
- className: e("flex items-center gap-1 text-sm", s),
9
- children: [/* @__PURE__ */ i(r, {
10
- to: "",
11
- className: "flex items-center text-text-secondary hover:text-text-primary",
12
- children: /* @__PURE__ */ i(n, { className: "h-3.5 w-3.5" })
13
- }), o.map((n, s) => {
14
- let c = s === o.length - 1;
15
- return /* @__PURE__ */ a("span", {
16
- className: "flex items-center gap-1",
17
- children: [/* @__PURE__ */ i(t, { className: "h-3.5 w-3.5 text-text-secondary/50" }), c || !n.href ? /* @__PURE__ */ i("span", {
18
- className: e(c ? "font-medium text-text-primary" : "text-text-secondary"),
19
- children: n.label
20
- }) : /* @__PURE__ */ i(r, {
21
- to: n.href,
22
- className: "text-text-secondary hover:text-text-primary",
23
- children: n.label
24
- })]
25
- }, n.label);
26
- })]
27
- });
7
+ var s = ({ items: s, className: c }) => {
8
+ let { basePath: l } = e(), u = l && l !== "/" ? l : "/";
9
+ return /* @__PURE__ */ o("nav", {
10
+ "aria-label": "Breadcrumb",
11
+ className: t("flex items-center gap-1 text-sm", c),
12
+ children: [/* @__PURE__ */ a(i, {
13
+ to: u,
14
+ className: "flex items-center text-text-secondary hover:text-text-primary",
15
+ "aria-label": "Dashboard",
16
+ children: /* @__PURE__ */ a(r, { className: "h-3.5 w-3.5" })
17
+ }), s.map((e, r) => {
18
+ let c = r === s.length - 1;
19
+ return /* @__PURE__ */ o("span", {
20
+ className: "flex items-center gap-1",
21
+ children: [/* @__PURE__ */ a(n, { className: "h-3.5 w-3.5 text-text-secondary/50" }), c || !e.href ? /* @__PURE__ */ a("span", {
22
+ className: t(c ? "font-medium text-text-primary" : "text-text-secondary"),
23
+ children: e.label
24
+ }) : /* @__PURE__ */ a(i, {
25
+ to: e.href,
26
+ className: "text-text-secondary hover:text-text-primary",
27
+ children: e.label
28
+ })]
29
+ }, e.label);
30
+ })]
31
+ });
32
+ };
28
33
  //#endregion
29
- export { o as Breadcrumbs };
34
+ export { s as Breadcrumbs };
30
35
 
31
36
  //# sourceMappingURL=Breadcrumbs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/housingvista/components/Breadcrumbs.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { ChevronRight, Home } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { cn } from '../utils/helpers';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ninterface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({ items, className }) => {\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center gap-1 text-sm', className)}>\n <Link to=\"\" className=\"flex items-center text-text-secondary hover:text-text-primary\">\n <Home className=\"h-3.5 w-3.5\" />\n </Link>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <span key={item.label} className=\"flex items-center gap-1\">\n <ChevronRight className=\"h-3.5 w-3.5 text-text-secondary/50\" />\n {isLast || !item.href ? (\n <span className={cn(isLast ? 'font-medium text-text-primary' : 'text-text-secondary')}>{item.label}</span>\n ) : (\n <Link to={item.href} className=\"text-text-secondary hover:text-text-primary\">\n {item.label}\n </Link>\n )}\n </span>\n );\n })}\n </nav>\n );\n};\n"],"mappings":";;;;;AAeA,IAAa,KAAqC,EAAE,UAAO,mBAEvD,kBAAC,OAAD;CAAK,cAAW;CAAa,WAAW,EAAG,mCAAmC,EAAU;WAAxF,CACE,kBAAC,GAAD;EAAM,IAAG;EAAG,WAAU;YACpB,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;EAC3B,CAAA,EACN,EAAM,KAAK,GAAM,MAAU;EAC1B,IAAM,IAAS,MAAU,EAAM,SAAS;AACxC,SACE,kBAAC,QAAD;GAAuB,WAAU;aAAjC,CACE,kBAAC,GAAD,EAAc,WAAU,sCAAuC,CAAA,EAC9D,KAAU,CAAC,EAAK,OACf,kBAAC,QAAD;IAAM,WAAW,EAAG,IAAS,kCAAkC,sBAAsB;cAAG,EAAK;IAAa,CAAA,GAE1G,kBAAC,GAAD;IAAM,IAAI,EAAK;IAAM,WAAU;cAC5B,EAAK;IACD,CAAA,CAEJ;KATI,EAAK,MAST;GAET,CACE"}
1
+ {"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/housingvista/components/Breadcrumbs.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { ChevronRight, Home } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { cn } from '../utils/helpers';\nimport { useHousingVista } from '../context/HousingVistaContext';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ninterface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({ items, className }) => {\n // The Home crumb must land on the HousingVista dashboard root regardless of\n // how deep the current route is nested, so link to the absolute mount path.\n const { basePath } = useHousingVista();\n const homeHref = basePath && basePath !== '/' ? basePath : '/';\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center gap-1 text-sm', className)}>\n <Link to={homeHref} className=\"flex items-center text-text-secondary hover:text-text-primary\" aria-label=\"Dashboard\">\n <Home className=\"h-3.5 w-3.5\" />\n </Link>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <span key={item.label} className=\"flex items-center gap-1\">\n <ChevronRight className=\"h-3.5 w-3.5 text-text-secondary/50\" />\n {isLast || !item.href ? (\n <span className={cn(isLast ? 'font-medium text-text-primary' : 'text-text-secondary')}>{item.label}</span>\n ) : (\n <Link to={item.href} className=\"text-text-secondary hover:text-text-primary\">\n {item.label}\n </Link>\n )}\n </span>\n );\n })}\n </nav>\n );\n};\n"],"mappings":";;;;;;AAgBA,IAAa,KAAqC,EAAE,UAAO,mBAAgB;CAGzE,IAAM,EAAE,gBAAa,GAAiB,EAChC,IAAW,KAAY,MAAa,MAAM,IAAW;AAC3D,QACE,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,mCAAmC,EAAU;YAAxF,CACE,kBAAC,GAAD;GAAM,IAAI;GAAU,WAAU;GAAgE,cAAW;aACvG,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;GAC3B,CAAA,EACN,EAAM,KAAK,GAAM,MAAU;GAC1B,IAAM,IAAS,MAAU,EAAM,SAAS;AACxC,UACE,kBAAC,QAAD;IAAuB,WAAU;cAAjC,CACE,kBAAC,GAAD,EAAc,WAAU,sCAAuC,CAAA,EAC9D,KAAU,CAAC,EAAK,OACf,kBAAC,QAAD;KAAM,WAAW,EAAG,IAAS,kCAAkC,sBAAsB;eAAG,EAAK;KAAa,CAAA,GAE1G,kBAAC,GAAD;KAAM,IAAI,EAAK;KAAM,WAAU;eAC5B,EAAK;KACD,CAAA,CAEJ;MATI,EAAK,MAST;IAET,CACE"}
@@ -0,0 +1,104 @@
1
+ import { useHousingVista as e } from "../context/HousingVistaContext.js";
2
+ import { cn as t } from "../utils/helpers.js";
3
+ import { useContactConversation as n, useConversationMessages as r, useSendMessage as i } from "../hooks/platform.js";
4
+ import "../hooks/index.js";
5
+ import { notify as a } from "../lib/toast.js";
6
+ import { useEffect as o, useRef as s, useState as c } from "react";
7
+ import { Send as l } from "lucide-react";
8
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
+ import { Button as f, ResponsiveDialog as p, ResponsiveDialogContent as m, ResponsiveDialogDescription as h, ResponsiveDialogHeader as g, ResponsiveDialogTitle as _, ResponsiveDialogTrigger as v } from "@burdenoff/fe-libs/ui";
10
+ //#region src/housingvista/components/ContactOwnerDialog.tsx
11
+ var y = ({ entityId: y, entityType: b, title: x, pagePath: S, trigger: C, heading: w = "Contact", description: T }) => {
12
+ let { currentUser: E } = e(), { openConversation: D, loading: O } = n(), { sendMessage: k, loading: A } = i(), [j, M] = c(!1), [N, P] = c(), [F, I] = c(""), { data: L, loading: R } = r(N), z = s(null);
13
+ o(() => {
14
+ if (!j || N) return;
15
+ let e = !1;
16
+ return D({
17
+ entityId: y,
18
+ entityType: b,
19
+ title: x,
20
+ contextHref: S,
21
+ pagePath: S
22
+ }).then((t) => {
23
+ e || P(t.id);
24
+ }).catch((e) => a.error("Could not open the conversation", e.message)), () => {
25
+ e = !0;
26
+ };
27
+ }, [
28
+ j,
29
+ N,
30
+ D,
31
+ y,
32
+ b,
33
+ x,
34
+ S
35
+ ]), o(() => {
36
+ z.current?.scrollTo({ top: z.current.scrollHeight });
37
+ }, [L]);
38
+ let B = async () => {
39
+ let e = F.trim();
40
+ if (!(!e || !N)) try {
41
+ await k(N, e), I("");
42
+ } catch (e) {
43
+ a.error("Message not sent", e.message);
44
+ }
45
+ }, V = E?.id ?? "";
46
+ return /* @__PURE__ */ d(p, {
47
+ open: j,
48
+ onOpenChange: M,
49
+ children: [/* @__PURE__ */ u(v, {
50
+ asChild: !0,
51
+ children: C
52
+ }), /* @__PURE__ */ d(m, {
53
+ className: "sm:max-w-lg",
54
+ children: [
55
+ /* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(_, { children: w }), /* @__PURE__ */ u(h, { children: T ?? `Start a conversation about ${x}. Messages are saved and delivered in your inbox.` })] }),
56
+ /* @__PURE__ */ u("div", {
57
+ ref: z,
58
+ className: "max-h-72 min-h-40 space-y-2 overflow-y-auto rounded-md border border-border-subtle bg-bg-sunken p-3",
59
+ children: O || R ? /* @__PURE__ */ u("p", {
60
+ className: "py-8 text-center text-sm text-text-secondary",
61
+ children: "Loading conversation…"
62
+ }) : L.length === 0 ? /* @__PURE__ */ u("p", {
63
+ className: "py-8 text-center text-sm text-text-secondary",
64
+ children: "No messages yet. Say hello to get the conversation started."
65
+ }) : L.map((e) => {
66
+ let n = e.authorId === V;
67
+ return /* @__PURE__ */ u("div", {
68
+ className: t("flex", n ? "justify-end" : "justify-start"),
69
+ children: /* @__PURE__ */ u("div", {
70
+ className: t("max-w-[80%] rounded-lg px-3 py-2 text-sm", n ? "bg-action-primary-bg text-action-primary-text" : "bg-bg-surface text-text-primary border border-border-subtle"),
71
+ children: e.text
72
+ })
73
+ }, e.id);
74
+ })
75
+ }),
76
+ /* @__PURE__ */ d("div", {
77
+ className: "mt-3 flex items-end gap-2",
78
+ children: [/* @__PURE__ */ u("textarea", {
79
+ value: F,
80
+ onChange: (e) => I(e.target.value),
81
+ onKeyDown: (e) => {
82
+ e.key === "Enter" && !e.shiftKey && (e.preventDefault(), B());
83
+ },
84
+ rows: 2,
85
+ placeholder: "Write a message…",
86
+ className: "min-h-10 flex-1 resize-none rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
87
+ }), /* @__PURE__ */ d(f, {
88
+ type: "button",
89
+ onClick: B,
90
+ disabled: !F.trim() || !N || A,
91
+ children: [/* @__PURE__ */ u(l, { className: "h-4 w-4" }), /* @__PURE__ */ u("span", {
92
+ className: "ml-1",
93
+ children: "Send"
94
+ })]
95
+ })]
96
+ })
97
+ ]
98
+ })]
99
+ });
100
+ };
101
+ //#endregion
102
+ export { y as ContactOwnerDialog };
103
+
104
+ //# sourceMappingURL=ContactOwnerDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactOwnerDialog.js","names":[],"sources":["../../../src/housingvista/components/ContactOwnerDialog.tsx"],"sourcesContent":["/**\n * Real messaging surface backed by wspace-conversations-svc. Any \"Contact /\n * Message / Apply / Contact Owner\" CTA renders this: it resolves (get-or-create)\n * the entity's conversation, shows the persisted thread, and posts messages via\n * `sendMessage`. No stub, no dead-end — everything is persisted server-side.\n * @module housingvista\n */\n\nimport { useEffect, useRef, useState, type FC, type ReactNode } from 'react';\nimport { Send } from 'lucide-react';\nimport {\n Button,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useContactConversation, useConversationMessages, useSendMessage } from '../hooks';\nimport { useHousingVista } from '../context/HousingVistaContext';\nimport { notify } from '../lib/toast';\nimport { cn } from '../utils/helpers';\n\ninterface ContactOwnerDialogProps {\n /** Stable id of the thing being discussed (property/service/listing id). */\n entityId: string;\n /** e.g. `housingvista-property`, `housingvista-marketplace-service`. */\n entityType: string;\n /** Title used when the conversation is first created. */\n title: string;\n /** Router path back into this surface (deep link). */\n pagePath: string;\n /** Clickable trigger element (button/link). */\n trigger: ReactNode;\n /** Dialog heading, defaults to \"Contact\". */\n heading?: string;\n description?: string;\n}\n\nexport const ContactOwnerDialog: FC<ContactOwnerDialogProps> = ({\n entityId,\n entityType,\n title,\n pagePath,\n trigger,\n heading = 'Contact',\n description,\n}) => {\n const { currentUser } = useHousingVista();\n const { openConversation, loading: opening } = useContactConversation();\n const { sendMessage, loading: sending } = useSendMessage();\n const [open, setOpen] = useState(false);\n const [conversationId, setConversationId] = useState<string | undefined>();\n const [draft, setDraft] = useState('');\n const { data: messages, loading: loadingMessages } = useConversationMessages(conversationId);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Resolve the conversation the first time the dialog opens.\n useEffect(() => {\n if (!open || conversationId) return;\n let cancelled = false;\n openConversation({\n entityId,\n entityType,\n title,\n contextHref: pagePath,\n pagePath,\n })\n .then((res) => {\n if (!cancelled) setConversationId(res.id);\n })\n .catch((err: Error) => notify.error('Could not open the conversation', err.message));\n return () => {\n cancelled = true;\n };\n }, [open, conversationId, openConversation, entityId, entityType, title, pagePath]);\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight });\n }, [messages]);\n\n const handleSend = async () => {\n const text = draft.trim();\n if (!text || !conversationId) return;\n try {\n await sendMessage(conversationId, text);\n setDraft('');\n } catch (err) {\n notify.error('Message not sent', (err as Error).message);\n }\n };\n\n const currentUserId = currentUser?.id ?? '';\n\n return (\n <ResponsiveDialog open={open} onOpenChange={setOpen}>\n <ResponsiveDialogTrigger asChild>{trigger}</ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>{heading}</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {description ?? `Start a conversation about ${title}. Messages are saved and delivered in your inbox.`}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div\n ref={scrollRef}\n className=\"max-h-72 min-h-40 space-y-2 overflow-y-auto rounded-md border border-border-subtle bg-bg-sunken p-3\"\n >\n {opening || loadingMessages ? (\n <p className=\"py-8 text-center text-sm text-text-secondary\">Loading conversation…</p>\n ) : messages.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-text-secondary\">\n No messages yet. Say hello to get the conversation started.\n </p>\n ) : (\n messages.map((message) => {\n const mine = message.authorId === currentUserId;\n return (\n <div key={message.id} className={cn('flex', mine ? 'justify-end' : 'justify-start')}>\n <div\n className={cn(\n 'max-w-[80%] rounded-lg px-3 py-2 text-sm',\n mine\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-surface text-text-primary border border-border-subtle'\n )}\n >\n {message.text}\n </div>\n </div>\n );\n })\n )}\n </div>\n\n <div className=\"mt-3 flex items-end gap-2\">\n <textarea\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n void handleSend();\n }\n }}\n rows={2}\n placeholder=\"Write a message…\"\n className=\"min-h-10 flex-1 resize-none rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n <Button type=\"button\" onClick={handleSend} disabled={!draft.trim() || !conversationId || sending}>\n <Send className=\"h-4 w-4\" />\n <span className=\"ml-1\">Send</span>\n </Button>\n </div>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n};\n"],"mappings":";;;;;;;;;;AAwCA,IAAa,KAAmD,EAC9D,aACA,eACA,UACA,aACA,YACA,aAAU,WACV,qBACI;CACJ,IAAM,EAAE,mBAAgB,GAAiB,EACnC,EAAE,qBAAkB,SAAS,MAAY,GAAwB,EACjE,EAAE,gBAAa,SAAS,MAAY,GAAgB,EACpD,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,CAAC,GAAgB,KAAqB,GAA8B,EACpE,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,EAAE,MAAM,GAAU,SAAS,MAAoB,EAAwB,EAAe,EACtF,IAAY,EAAuB,KAAK;AAsB9C,CAnBA,QAAgB;AACd,MAAI,CAAC,KAAQ,EAAgB;EAC7B,IAAI,IAAY;AAYhB,SAXA,EAAiB;GACf;GACA;GACA;GACA,aAAa;GACb;GACD,CAAC,CACC,MAAM,MAAQ;AACb,GAAK,KAAW,EAAkB,EAAI,GAAG;IACzC,CACD,OAAO,MAAe,EAAO,MAAM,mCAAmC,EAAI,QAAQ,CAAC,QACzE;AACX,OAAY;;IAEb;EAAC;EAAM;EAAgB;EAAkB;EAAU;EAAY;EAAO;EAAS,CAAC,EAEnF,QAAgB;AACd,IAAU,SAAS,SAAS,EAAE,KAAK,EAAU,QAAQ,cAAc,CAAC;IACnE,CAAC,EAAS,CAAC;CAEd,IAAM,IAAa,YAAY;EAC7B,IAAM,IAAO,EAAM,MAAM;AACrB,SAAC,KAAQ,CAAC,GACd,KAAI;AAEF,GADA,MAAM,EAAY,GAAgB,EAAK,EACvC,EAAS,GAAG;WACL,GAAK;AACZ,KAAO,MAAM,oBAAqB,EAAc,QAAQ;;IAItD,IAAgB,GAAa,MAAM;AAEzC,QACE,kBAAC,GAAD;EAAwB;EAAM,cAAc;YAA5C,CACE,kBAAC,GAAD;GAAyB,SAAA;aAAS;GAAkC,CAAA,EACpE,kBAAC,GAAD;GAAyB,WAAU;aAAnC;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAwB,GAAgC,CAAA,EACxD,kBAAC,GAAD,EAAA,UACG,KAAe,8BAA8B,EAAM,oDACxB,CAAA,CACP,EAAA,CAAA;IAEzB,kBAAC,OAAD;KACE,KAAK;KACL,WAAU;eAET,KAAW,IACV,kBAAC,KAAD;MAAG,WAAU;gBAA+C;MAAyB,CAAA,GACnF,EAAS,WAAW,IACtB,kBAAC,KAAD;MAAG,WAAU;gBAA+C;MAExD,CAAA,GAEJ,EAAS,KAAK,MAAY;MACxB,IAAM,IAAO,EAAQ,aAAa;AAClC,aACE,kBAAC,OAAD;OAAsB,WAAW,EAAG,QAAQ,IAAO,gBAAgB,gBAAgB;iBACjF,kBAAC,OAAD;QACE,WAAW,EACT,4CACA,IACI,kDACA,8DACL;kBAEA,EAAQ;QACL,CAAA;OACF,EAXI,EAAQ,GAWZ;OAER;KAEA,CAAA;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,YAAD;MACE,OAAO;MACP,WAAW,MAAU,EAAS,EAAM,OAAO,MAAM;MACjD,YAAY,MAAU;AACpB,OAAI,EAAM,QAAQ,WAAW,CAAC,EAAM,aAClC,EAAM,gBAAgB,EACjB,GAAY;;MAGrB,MAAM;MACN,aAAY;MACZ,WAAU;MACV,CAAA,EACF,kBAAC,GAAD;MAAQ,MAAK;MAAS,SAAS;MAAY,UAAU,CAAC,EAAM,MAAM,IAAI,CAAC,KAAkB;gBAAzF,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,kBAAC,QAAD;OAAM,WAAU;iBAAO;OAAW,CAAA,CAC3B;QACL;;IACkB;KACT"}
@@ -0,0 +1,72 @@
1
+ import { cn as e } from "../utils/helpers.js";
2
+ import { useFileUpload as t } from "../hooks/platform.js";
3
+ import "../hooks/index.js";
4
+ import { notify as n } from "../lib/toast.js";
5
+ import { useRef as r, useState as i } from "react";
6
+ import { FileText as a, Loader2 as o, Upload as s, X as c } from "lucide-react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ //#region src/housingvista/components/FileUploader.tsx
9
+ var d = ({ onUploaded: d, value: f = [], onRemove: p, accept: m, multiple: h = !0, label: g = "Choose files", className: _ }) => {
10
+ let { uploadFile: v } = t(), y = r(null), [b, x] = i(!1), S = async (e) => {
11
+ if (!e || e.length === 0) return;
12
+ x(!0);
13
+ let t = [];
14
+ try {
15
+ for (let n of Array.from(e)) {
16
+ let e = await v(n);
17
+ t.push(e);
18
+ }
19
+ t.length > 0 && (d(t), n.success(`${t.length} file${t.length > 1 ? "s" : ""} uploaded`));
20
+ } catch (e) {
21
+ n.error("Upload failed", e.message);
22
+ } finally {
23
+ x(!1), y.current && (y.current.value = "");
24
+ }
25
+ };
26
+ return /* @__PURE__ */ u("div", {
27
+ className: e("space-y-3", _),
28
+ children: [
29
+ /* @__PURE__ */ u("button", {
30
+ type: "button",
31
+ disabled: b,
32
+ onClick: () => y.current?.click(),
33
+ className: "flex w-full items-center justify-center gap-2 rounded-md border border-dashed border-border-subtle bg-bg-sunken px-4 py-6 text-sm font-medium text-text-secondary transition-colors hover:bg-bg-surface hover:text-text-primary disabled:opacity-60",
34
+ children: [b ? /* @__PURE__ */ l(o, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ l(s, { className: "h-4 w-4" }), b ? "Uploading…" : g]
35
+ }),
36
+ /* @__PURE__ */ l("input", {
37
+ ref: y,
38
+ type: "file",
39
+ accept: m,
40
+ multiple: h,
41
+ className: "hidden",
42
+ onChange: (e) => S(e.target.files)
43
+ }),
44
+ f.length > 0 && /* @__PURE__ */ l("ul", {
45
+ className: "space-y-1.5",
46
+ children: f.map((e) => /* @__PURE__ */ u("li", {
47
+ className: "flex items-center justify-between gap-2 rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm",
48
+ children: [/* @__PURE__ */ u("a", {
49
+ href: e.url,
50
+ target: "_blank",
51
+ rel: "noopener noreferrer",
52
+ className: "flex min-w-0 items-center gap-2 text-text-primary hover:underline",
53
+ children: [/* @__PURE__ */ l(a, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ l("span", {
54
+ className: "truncate",
55
+ children: e.name
56
+ })]
57
+ }), p && /* @__PURE__ */ l("button", {
58
+ type: "button",
59
+ onClick: () => p(e.id),
60
+ "aria-label": `Remove ${e.name}`,
61
+ className: "shrink-0 text-text-secondary hover:text-status-error-text",
62
+ children: /* @__PURE__ */ l(c, { className: "h-4 w-4" })
63
+ })]
64
+ }, e.id))
65
+ })
66
+ ]
67
+ });
68
+ };
69
+ //#endregion
70
+ export { d as FileUploader };
71
+
72
+ //# sourceMappingURL=FileUploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileUploader.js","names":[],"sources":["../../../src/housingvista/components/FileUploader.tsx"],"sourcesContent":["/**\n * Real file upload widget backed by wspace-files-svc (presigned initiate → PUT\n * → complete). Emits durable File ids + download URLs via `onUploaded`. Replaces\n * every dead \"Choose Files\" / \"Upload Document\" button in the MFE.\n * @module housingvista\n */\n\nimport { useRef, useState, type FC } from 'react';\nimport { Upload, X, FileText, Loader2 } from 'lucide-react';\nimport { useFileUpload, type HvUploadedFile } from '../hooks';\nimport { notify } from '../lib/toast';\nimport { cn } from '../utils/helpers';\n\ninterface FileUploaderProps {\n onUploaded: (files: HvUploadedFile[]) => void;\n /** Files already attached (rendered as removable chips). */\n value?: HvUploadedFile[];\n onRemove?: (fileId: string) => void;\n accept?: string;\n multiple?: boolean;\n label?: string;\n className?: string;\n}\n\nexport const FileUploader: FC<FileUploaderProps> = ({\n onUploaded,\n value = [],\n onRemove,\n accept,\n multiple = true,\n label = 'Choose files',\n className,\n}) => {\n const { uploadFile } = useFileUpload();\n const inputRef = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n\n const handleFiles = async (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n setBusy(true);\n const uploaded: HvUploadedFile[] = [];\n try {\n for (const file of Array.from(fileList)) {\n const result = await uploadFile(file);\n uploaded.push(result);\n }\n if (uploaded.length > 0) {\n onUploaded(uploaded);\n notify.success(`${uploaded.length} file${uploaded.length > 1 ? 's' : ''} uploaded`);\n }\n } catch (err) {\n notify.error('Upload failed', (err as Error).message);\n } finally {\n setBusy(false);\n if (inputRef.current) inputRef.current.value = '';\n }\n };\n\n return (\n <div className={cn('space-y-3', className)}>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => inputRef.current?.click()}\n className=\"flex w-full items-center justify-center gap-2 rounded-md border border-dashed border-border-subtle bg-bg-sunken px-4 py-6 text-sm font-medium text-text-secondary transition-colors hover:bg-bg-surface hover:text-text-primary disabled:opacity-60\"\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Upload className=\"h-4 w-4\" />}\n {busy ? 'Uploading…' : label}\n </button>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(event) => handleFiles(event.target.files)}\n />\n\n {value.length > 0 && (\n <ul className=\"space-y-1.5\">\n {value.map((file) => (\n <li\n key={file.id}\n className=\"flex items-center justify-between gap-2 rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm\"\n >\n <a\n href={file.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex min-w-0 items-center gap-2 text-text-primary hover:underline\"\n >\n <FileText className=\"h-4 w-4 shrink-0 text-text-secondary\" />\n <span className=\"truncate\">{file.name}</span>\n </a>\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => onRemove(file.id)}\n aria-label={`Remove ${file.name}`}\n className=\"shrink-0 text-text-secondary hover:text-status-error-text\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;AAwBA,IAAa,KAAuC,EAClD,eACA,WAAQ,EAAE,EACV,aACA,WACA,cAAW,IACX,WAAQ,gBACR,mBACI;CACJ,IAAM,EAAE,kBAAe,GAAe,EAChC,IAAW,EAAyB,KAAK,EACzC,CAAC,GAAM,KAAW,EAAS,GAAM,EAEjC,IAAc,OAAO,MAA8B;AACvD,MAAI,CAAC,KAAY,EAAS,WAAW,EAAG;AACxC,IAAQ,GAAK;EACb,IAAM,IAA6B,EAAE;AACrC,MAAI;AACF,QAAK,IAAM,KAAQ,MAAM,KAAK,EAAS,EAAE;IACvC,IAAM,IAAS,MAAM,EAAW,EAAK;AACrC,MAAS,KAAK,EAAO;;AAEvB,GAAI,EAAS,SAAS,MACpB,EAAW,EAAS,EACpB,EAAO,QAAQ,GAAG,EAAS,OAAO,OAAO,EAAS,SAAS,IAAI,MAAM,GAAG,WAAW;WAE9E,GAAK;AACZ,KAAO,MAAM,iBAAkB,EAAc,QAAQ;YAC7C;AAER,GADA,EAAQ,GAAM,EACV,EAAS,YAAS,EAAS,QAAQ,QAAQ;;;AAInD,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,aAAa,EAAU;YAA1C;GACE,kBAAC,UAAD;IACE,MAAK;IACL,UAAU;IACV,eAAe,EAAS,SAAS,OAAO;IACxC,WAAU;cAJZ,CAMG,IAAO,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA,GAAG,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EACpF,IAAO,eAAe,EAChB;;GACT,kBAAC,SAAD;IACE,KAAK;IACL,MAAK;IACG;IACE;IACV,WAAU;IACV,WAAW,MAAU,EAAY,EAAM,OAAO,MAAM;IACpD,CAAA;GAED,EAAM,SAAS,KACd,kBAAC,MAAD;IAAI,WAAU;cACX,EAAM,KAAK,MACV,kBAAC,MAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,KAAD;MACE,MAAM,EAAK;MACX,QAAO;MACP,KAAI;MACJ,WAAU;gBAJZ,CAME,kBAAC,GAAD,EAAU,WAAU,wCAAyC,CAAA,EAC7D,kBAAC,QAAD;OAAM,WAAU;iBAAY,EAAK;OAAY,CAAA,CAC3C;SACH,KACC,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAS,EAAK,GAAG;MAChC,cAAY,UAAU,EAAK;MAC3B,WAAU;gBAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;MAClB,CAAA,CAER;OAtBE,EAAK,GAsBP,CACL;IACC,CAAA;GAEH"}