@burdenoff/microfe-housingvista 2026.703.12 → 2026.709.1

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 (35) hide show
  1. package/dist/generated/wspace-operations.js +67 -0
  2. package/dist/generated/wspace-operations.js.map +1 -0
  3. package/dist/housingvista/hooks/index.js +1 -0
  4. package/dist/housingvista/hooks/index.js.map +1 -1
  5. package/dist/housingvista/hooks/useHousingVistaAnalytics.js +57 -0
  6. package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -0
  7. package/dist/housingvista/index.js +2 -0
  8. package/dist/housingvista/pages/HomePage.js +135 -132
  9. package/dist/housingvista/pages/HomePage.js.map +1 -1
  10. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  11. package/dist/housingvista/pages/analytics/AnalyticsPage.js +143 -141
  12. package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
  13. package/dist/housingvista/pages/assets/AssetDetailPage.js +3 -3
  14. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  15. package/dist/housingvista/pages/assets/AssetManagementPage.js +5 -5
  16. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  17. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +3 -3
  18. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  19. package/dist/housingvista/pages/investments/InvestmentsPage.js +5 -5
  20. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  21. package/dist/housingvista/pages/properties/AddPropertyPage.js +279 -278
  22. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  23. package/dist/housingvista/pages/properties/PropertiesPage.js +93 -86
  24. package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
  25. package/dist/housingvista/pages/properties/PropertyDetailPage.js +514 -511
  26. package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
  27. package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
  28. package/dist/housingvista/services/assistantApi.js +222 -0
  29. package/dist/housingvista/services/assistantApi.js.map +1 -0
  30. package/dist/housingvista/services/createSandboxAssistantTransport.js +120 -0
  31. package/dist/housingvista/services/createSandboxAssistantTransport.js.map +1 -0
  32. package/dist/housingvista/utils/pageContext.js +77 -0
  33. package/dist/housingvista/utils/pageContext.js.map +1 -0
  34. package/dist/index.js +5 -3
  35. package/package.json +6 -2
@@ -0,0 +1,67 @@
1
+ import { gql as e } from "@apollo/client";
2
+ import "@apollo/client/react";
3
+ e`
4
+ mutation CheckAiCredits {
5
+ checkAiCredits
6
+ }
7
+ `, e`
8
+ mutation ReportAiTokenUsage($input: ReportAiTokenUsageInput!) {
9
+ reportAiTokenUsage(input: $input)
10
+ }
11
+ `;
12
+ var t = e`
13
+ query GetSandbox($id: ID!, $context: ContextInput!) {
14
+ getSandbox(id: $id, context: $context) {
15
+ id
16
+ status
17
+ errorMessage
18
+ network {
19
+ internalUrl
20
+ }
21
+ }
22
+ }
23
+ `, n = e`
24
+ query GetActiveSandboxes($context: ContextInput!) {
25
+ getActiveSandboxes(context: $context) {
26
+ id
27
+ name
28
+ status
29
+ metadata
30
+ template
31
+ createdBy
32
+ }
33
+ }
34
+ `, r = e`
35
+ mutation CreateSandbox($input: CreateSandboxInput!) {
36
+ createSandbox(input: $input) {
37
+ id
38
+ name
39
+ status
40
+ network {
41
+ internalUrl
42
+ }
43
+ }
44
+ }
45
+ `, i = e`
46
+ mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {
47
+ proxySandboxRequest(input: $input) {
48
+ status
49
+ body
50
+ }
51
+ }
52
+ `, a = e`
53
+ mutation ExtendSandboxTtl($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {
54
+ extendSandboxTTL(
55
+ id: $id
56
+ additionalSeconds: $additionalSeconds
57
+ context: $context
58
+ ) {
59
+ id
60
+ expiresAt
61
+ }
62
+ }
63
+ `;
64
+ //#endregion
65
+ export { r as CreateSandboxDocument, a as ExtendSandboxTtlDocument, n as GetActiveSandboxesDocument, t as GetSandboxDocument, i as ProxySandboxRequestDocument };
66
+
67
+ //# sourceMappingURL=wspace-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wspace-operations.js","names":[],"sources":["../../src/generated/wspace-operations.ts"],"sourcesContent":["// @ts-nocheck\nimport * as Types from './wspace-types';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nimport * as ApolloReactHooks from '@apollo/client/react';\nconst defaultOptions = {} as const;\nexport type CheckAiCreditsMutationVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type CheckAiCreditsMutation = { __typename?: 'Mutation', checkAiCredits: boolean };\n\nexport type ReportAiTokenUsageMutationVariables = Types.Exact<{\n input: Types.ReportAiTokenUsageInput;\n}>;\n\n\nexport type ReportAiTokenUsageMutation = { __typename?: 'Mutation', reportAiTokenUsage: boolean };\n\nexport type GetSandboxQueryVariables = Types.Exact<{\n id: Types.Scalars['ID']['input'];\n context: Types.ContextInput;\n}>;\n\n\nexport type GetSandboxQuery = { __typename?: 'Query', getSandbox?: { __typename?: 'Sandbox', id: string, status: Types.SandboxStatus, errorMessage?: string | null, network: { __typename?: 'SandboxNetwork', internalUrl?: string | null } } | null };\n\nexport type GetActiveSandboxesQueryVariables = Types.Exact<{\n context: Types.ContextInput;\n}>;\n\n\nexport type GetActiveSandboxesQuery = { __typename?: 'Query', getActiveSandboxes: Array<{ __typename?: 'Sandbox', id: string, name: string, status: Types.SandboxStatus, metadata?: Record<string, unknown> | null, template: Types.SandboxTemplate, createdBy: string }> };\n\nexport type CreateSandboxMutationVariables = Types.Exact<{\n input: Types.CreateSandboxInput;\n}>;\n\n\nexport type CreateSandboxMutation = { __typename?: 'Mutation', createSandbox: { __typename?: 'Sandbox', id: string, name: string, status: Types.SandboxStatus, network: { __typename?: 'SandboxNetwork', internalUrl?: string | null } } };\n\nexport type ProxySandboxRequestMutationVariables = Types.Exact<{\n input: Types.ProxySandboxRequestInput;\n}>;\n\n\nexport type ProxySandboxRequestMutation = { __typename?: 'Mutation', proxySandboxRequest: { __typename?: 'ProxySandboxResponse', status: number, body?: Record<string, unknown> | null } };\n\nexport type ExtendSandboxTtlMutationVariables = Types.Exact<{\n id: Types.Scalars['ID']['input'];\n additionalSeconds: Types.Scalars['Int']['input'];\n context: Types.ContextInput;\n}>;\n\n\nexport type ExtendSandboxTtlMutation = { __typename?: 'Mutation', extendSandboxTTL: { __typename?: 'Sandbox', id: string, expiresAt: string } };\n\n\nexport const CheckAiCreditsDocument = gql`\n mutation CheckAiCredits {\n checkAiCredits\n}\n `;\nexport type CheckAiCreditsMutationFn = Apollo.MutationFunction<Types.CheckAiCreditsMutation, Types.CheckAiCreditsMutationVariables>;\n\n/**\n * __useCheckAiCreditsMutation__\n *\n * To run a mutation, you first call `useCheckAiCreditsMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useCheckAiCreditsMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [checkAiCreditsMutation, { data, loading, error }] = useCheckAiCreditsMutation({\n * variables: {\n * },\n * });\n */\nexport function useCheckAiCreditsMutation(baseOptions?: ApolloReactHooks.MutationHookOptions<Types.CheckAiCreditsMutation, Types.CheckAiCreditsMutationVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useMutation<Types.CheckAiCreditsMutation, Types.CheckAiCreditsMutationVariables>(CheckAiCreditsDocument, options);\n }\nexport type CheckAiCreditsMutationHookResult = ReturnType<typeof useCheckAiCreditsMutation>;\nexport type CheckAiCreditsMutationResult = Apollo.MutationResult<Types.CheckAiCreditsMutation>;\nexport type CheckAiCreditsMutationOptions = Apollo.BaseMutationOptions<Types.CheckAiCreditsMutation, Types.CheckAiCreditsMutationVariables>;\nexport const ReportAiTokenUsageDocument = gql`\n mutation ReportAiTokenUsage($input: ReportAiTokenUsageInput!) {\n reportAiTokenUsage(input: $input)\n}\n `;\nexport type ReportAiTokenUsageMutationFn = Apollo.MutationFunction<Types.ReportAiTokenUsageMutation, Types.ReportAiTokenUsageMutationVariables>;\n\n/**\n * __useReportAiTokenUsageMutation__\n *\n * To run a mutation, you first call `useReportAiTokenUsageMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useReportAiTokenUsageMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [reportAiTokenUsageMutation, { data, loading, error }] = useReportAiTokenUsageMutation({\n * variables: {\n * input: // value for 'input'\n * },\n * });\n */\nexport function useReportAiTokenUsageMutation(baseOptions?: ApolloReactHooks.MutationHookOptions<Types.ReportAiTokenUsageMutation, Types.ReportAiTokenUsageMutationVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useMutation<Types.ReportAiTokenUsageMutation, Types.ReportAiTokenUsageMutationVariables>(ReportAiTokenUsageDocument, options);\n }\nexport type ReportAiTokenUsageMutationHookResult = ReturnType<typeof useReportAiTokenUsageMutation>;\nexport type ReportAiTokenUsageMutationResult = Apollo.MutationResult<Types.ReportAiTokenUsageMutation>;\nexport type ReportAiTokenUsageMutationOptions = Apollo.BaseMutationOptions<Types.ReportAiTokenUsageMutation, Types.ReportAiTokenUsageMutationVariables>;\nexport const GetSandboxDocument = gql`\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) {\n id\n status\n errorMessage\n network {\n internalUrl\n }\n }\n}\n `;\n\n/**\n * __useGetSandboxQuery__\n *\n * To run a query within a React component, call `useGetSandboxQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetSandboxQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetSandboxQuery({\n * variables: {\n * id: // value for 'id'\n * context: // value for 'context'\n * },\n * });\n */\nexport function useGetSandboxQuery(baseOptions: ApolloReactHooks.QueryHookOptions<Types.GetSandboxQuery, Types.GetSandboxQueryVariables> & ({ variables: Types.GetSandboxQueryVariables; skip?: boolean; } | { skip: boolean; }) ) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useQuery<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>(GetSandboxDocument, options);\n }\nexport function useGetSandboxLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useLazyQuery<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>(GetSandboxDocument, options);\n }\n// @ts-ignore\nexport function useGetSandboxSuspenseQuery(baseOptions?: ApolloReactHooks.SuspenseQueryHookOptions<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>): ApolloReactHooks.UseSuspenseQueryResult<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>;\nexport function useGetSandboxSuspenseQuery(baseOptions?: ApolloReactHooks.SkipToken | ApolloReactHooks.SuspenseQueryHookOptions<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>): ApolloReactHooks.UseSuspenseQueryResult<Types.GetSandboxQuery | undefined, Types.GetSandboxQueryVariables>;\nexport function useGetSandboxSuspenseQuery(baseOptions?: ApolloReactHooks.SkipToken | ApolloReactHooks.SuspenseQueryHookOptions<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>) {\n const options = baseOptions === ApolloReactHooks.skipToken ? baseOptions : {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useSuspenseQuery<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>(GetSandboxDocument, options);\n }\nexport type GetSandboxQueryHookResult = ReturnType<typeof useGetSandboxQuery>;\nexport type GetSandboxLazyQueryHookResult = ReturnType<typeof useGetSandboxLazyQuery>;\nexport type GetSandboxSuspenseQueryHookResult = ReturnType<typeof useGetSandboxSuspenseQuery>;\nexport type GetSandboxQueryResult = Apollo.QueryResult<Types.GetSandboxQuery, Types.GetSandboxQueryVariables>;\nexport const GetActiveSandboxesDocument = gql`\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) {\n id\n name\n status\n metadata\n template\n createdBy\n }\n}\n `;\n\n/**\n * __useGetActiveSandboxesQuery__\n *\n * To run a query within a React component, call `useGetActiveSandboxesQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetActiveSandboxesQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetActiveSandboxesQuery({\n * variables: {\n * context: // value for 'context'\n * },\n * });\n */\nexport function useGetActiveSandboxesQuery(baseOptions: ApolloReactHooks.QueryHookOptions<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables> & ({ variables: Types.GetActiveSandboxesQueryVariables; skip?: boolean; } | { skip: boolean; }) ) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useQuery<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>(GetActiveSandboxesDocument, options);\n }\nexport function useGetActiveSandboxesLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useLazyQuery<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>(GetActiveSandboxesDocument, options);\n }\n// @ts-ignore\nexport function useGetActiveSandboxesSuspenseQuery(baseOptions?: ApolloReactHooks.SuspenseQueryHookOptions<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>): ApolloReactHooks.UseSuspenseQueryResult<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>;\nexport function useGetActiveSandboxesSuspenseQuery(baseOptions?: ApolloReactHooks.SkipToken | ApolloReactHooks.SuspenseQueryHookOptions<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>): ApolloReactHooks.UseSuspenseQueryResult<Types.GetActiveSandboxesQuery | undefined, Types.GetActiveSandboxesQueryVariables>;\nexport function useGetActiveSandboxesSuspenseQuery(baseOptions?: ApolloReactHooks.SkipToken | ApolloReactHooks.SuspenseQueryHookOptions<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>) {\n const options = baseOptions === ApolloReactHooks.skipToken ? baseOptions : {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useSuspenseQuery<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>(GetActiveSandboxesDocument, options);\n }\nexport type GetActiveSandboxesQueryHookResult = ReturnType<typeof useGetActiveSandboxesQuery>;\nexport type GetActiveSandboxesLazyQueryHookResult = ReturnType<typeof useGetActiveSandboxesLazyQuery>;\nexport type GetActiveSandboxesSuspenseQueryHookResult = ReturnType<typeof useGetActiveSandboxesSuspenseQuery>;\nexport type GetActiveSandboxesQueryResult = Apollo.QueryResult<Types.GetActiveSandboxesQuery, Types.GetActiveSandboxesQueryVariables>;\nexport const CreateSandboxDocument = gql`\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) {\n id\n name\n status\n network {\n internalUrl\n }\n }\n}\n `;\nexport type CreateSandboxMutationFn = Apollo.MutationFunction<Types.CreateSandboxMutation, Types.CreateSandboxMutationVariables>;\n\n/**\n * __useCreateSandboxMutation__\n *\n * To run a mutation, you first call `useCreateSandboxMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useCreateSandboxMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [createSandboxMutation, { data, loading, error }] = useCreateSandboxMutation({\n * variables: {\n * input: // value for 'input'\n * },\n * });\n */\nexport function useCreateSandboxMutation(baseOptions?: ApolloReactHooks.MutationHookOptions<Types.CreateSandboxMutation, Types.CreateSandboxMutationVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useMutation<Types.CreateSandboxMutation, Types.CreateSandboxMutationVariables>(CreateSandboxDocument, options);\n }\nexport type CreateSandboxMutationHookResult = ReturnType<typeof useCreateSandboxMutation>;\nexport type CreateSandboxMutationResult = Apollo.MutationResult<Types.CreateSandboxMutation>;\nexport type CreateSandboxMutationOptions = Apollo.BaseMutationOptions<Types.CreateSandboxMutation, Types.CreateSandboxMutationVariables>;\nexport const ProxySandboxRequestDocument = gql`\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) {\n status\n body\n }\n}\n `;\nexport type ProxySandboxRequestMutationFn = Apollo.MutationFunction<Types.ProxySandboxRequestMutation, Types.ProxySandboxRequestMutationVariables>;\n\n/**\n * __useProxySandboxRequestMutation__\n *\n * To run a mutation, you first call `useProxySandboxRequestMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useProxySandboxRequestMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [proxySandboxRequestMutation, { data, loading, error }] = useProxySandboxRequestMutation({\n * variables: {\n * input: // value for 'input'\n * },\n * });\n */\nexport function useProxySandboxRequestMutation(baseOptions?: ApolloReactHooks.MutationHookOptions<Types.ProxySandboxRequestMutation, Types.ProxySandboxRequestMutationVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useMutation<Types.ProxySandboxRequestMutation, Types.ProxySandboxRequestMutationVariables>(ProxySandboxRequestDocument, options);\n }\nexport type ProxySandboxRequestMutationHookResult = ReturnType<typeof useProxySandboxRequestMutation>;\nexport type ProxySandboxRequestMutationResult = Apollo.MutationResult<Types.ProxySandboxRequestMutation>;\nexport type ProxySandboxRequestMutationOptions = Apollo.BaseMutationOptions<Types.ProxySandboxRequestMutation, Types.ProxySandboxRequestMutationVariables>;\nexport const ExtendSandboxTtlDocument = gql`\n mutation ExtendSandboxTtl($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(\n id: $id\n additionalSeconds: $additionalSeconds\n context: $context\n ) {\n id\n expiresAt\n }\n}\n `;\nexport type ExtendSandboxTtlMutationFn = Apollo.MutationFunction<Types.ExtendSandboxTtlMutation, Types.ExtendSandboxTtlMutationVariables>;\n\n/**\n * __useExtendSandboxTtlMutation__\n *\n * To run a mutation, you first call `useExtendSandboxTtlMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useExtendSandboxTtlMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [extendSandboxTtlMutation, { data, loading, error }] = useExtendSandboxTtlMutation({\n * variables: {\n * id: // value for 'id'\n * additionalSeconds: // value for 'additionalSeconds'\n * context: // value for 'context'\n * },\n * });\n */\nexport function useExtendSandboxTtlMutation(baseOptions?: ApolloReactHooks.MutationHookOptions<Types.ExtendSandboxTtlMutation, Types.ExtendSandboxTtlMutationVariables>) {\n const options = {...defaultOptions, ...baseOptions}\n return ApolloReactHooks.useMutation<Types.ExtendSandboxTtlMutation, Types.ExtendSandboxTtlMutationVariables>(ExtendSandboxTtlDocument, options);\n }\nexport type ExtendSandboxTtlMutationHookResult = ReturnType<typeof useExtendSandboxTtlMutation>;\nexport type ExtendSandboxTtlMutationResult = Apollo.MutationResult<Types.ExtendSandboxTtlMutation>;\nexport type ExtendSandboxTtlMutationOptions = Apollo.BaseMutationOptions<Types.ExtendSandboxTtlMutation, Types.ExtendSandboxTtlMutationVariables>;"],"mappings":";;AA0DsC,CAAG;;;;OA8BC,CAAG;;;;;AA+B7C,IAAa,IAAqB,CAAG;;;;;;;;;;;OAiDxB,IAA6B,CAAG;;;;;;;;;;;OAgDhC,IAAwB,CAAG;;;;;;;;;;;OAsC3B,IAA8B,CAAG;;;;;;;OAkCjC,IAA2B,CAAG"}
@@ -1,4 +1,5 @@
1
1
  import "./platform.js";
2
+ import "./useHousingVistaAnalytics.js";
2
3
  import { gql as e } from "@apollo/client";
3
4
  import { useMutation as t, useQuery as n } from "@apollo/client/react";
4
5
  //#region src/housingvista/hooks/index.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/housingvista/hooks/index.ts"],"sourcesContent":["/**\n * HousingVista data hooks — real GraphQL against the wspace gateway via Apollo.\n *\n * Every read maps the `housingvista*` query contract to the MFE domain types in\n * `../types`. Every write wraps a `housingvista*` mutation and (where it changes\n * a list the UI shows) refetches the affected query so the cache stays honest.\n * No `any`, no mock data — hooks that have no backing query return an explicit\n * `unsupported` empty-state instead of fabricating rows.\n * @module housingvista\n */\n\nimport { gql } from '@apollo/client';\nimport { useQuery, useMutation } from '@apollo/client/react';\nimport type {\n Property,\n Transaction,\n Investment,\n DashboardStats,\n RecentActivity,\n RentalUnit,\n Asset,\n AMCContract,\n MarketplaceService,\n VerificationItem,\n LegalService,\n HomeLoan,\n MarketTrend,\n AreaInsight,\n AnalyticsChartData,\n PropertyType,\n PropertyStatus,\n} from '../types';\n\n// ---------------------------------------------------------------------------\n// Shared input shapes (mirror HousingVista*Input from the subgraph schema)\n// ---------------------------------------------------------------------------\n\nexport type PaginationInput = {\n limit?: number;\n offset?: number;\n};\n\nexport type PropertyFilterInput = {\n search?: string;\n status?: PropertyStatus;\n type?: PropertyType;\n city?: string;\n};\n\nexport type TransactionFilterInput = {\n search?: string;\n status?: string;\n type?: string;\n propertyId?: string;\n};\n\nexport type InvestmentFilterInput = {\n search?: string;\n status?: string;\n investmentType?: string;\n riskLevel?: string;\n propertyId?: string;\n};\n\nexport type RentalUnitFilterInput = {\n search?: string;\n status?: string;\n paymentStatus?: string;\n propertyId?: string;\n};\n\nexport type AssetFilterInput = {\n search?: string;\n status?: string;\n type?: string;\n category?: string;\n};\n\nexport type AmcContractFilterInput = {\n search?: string;\n status?: string;\n propertyId?: string;\n};\n\nexport type MarketplaceServiceFilterInput = {\n search?: string;\n category?: string;\n verified?: boolean;\n};\n\nexport type LegalServiceFilterInput = {\n search?: string;\n status?: string;\n category?: string;\n};\n\nexport type VerificationItemFilterInput = {\n search?: string;\n status?: string;\n priority?: string;\n entityType?: string;\n};\n\nexport type ViewingFilterInput = {\n search?: string;\n status?: string;\n type?: string;\n propertyId?: string;\n};\n\nexport type OfferFilterInput = {\n status?: string;\n propertyId?: string;\n};\n\nexport type RentalApplicationFilterInput = {\n search?: string;\n status?: string;\n rentalUnitId?: string;\n};\n\nexport type MaintenanceRequestFilterInput = {\n search?: string;\n status?: string;\n priority?: 'low' | 'medium' | 'high';\n category?: string;\n propertyId?: string;\n rentalUnitId?: string;\n};\n\n/** Options accepted by every server-filtered list hook. */\nexport interface ListOptions<TFilter> {\n filter?: TFilter;\n pagination?: PaginationInput;\n}\n\nconst DEFAULT_LIST_PAGINATION: Required<PaginationInput> = { limit: 50, offset: 0 };\n\nconst getPaginationVariables = (pagination: PaginationInput = DEFAULT_LIST_PAGINATION) => ({\n pagination: {\n limit: pagination.limit ?? DEFAULT_LIST_PAGINATION.limit,\n offset: pagination.offset ?? DEFAULT_LIST_PAGINATION.offset,\n },\n});\n\n// ---------------------------------------------------------------------------\n// Query documents\n// ---------------------------------------------------------------------------\n\nconst GET_DASHBOARD_STATS = gql`\n query GetDashboardStats {\n housingvistaDashboardStats {\n totalProperties\n totalValue\n occupancyRate\n monthlyRevenue\n activeTransactions\n pendingVerifications\n totalInvestments\n totalPortfolioValue\n investmentReturns\n totalTenants\n maintenanceRequests\n unreadMessages\n upcomingViewings\n }\n }\n`;\n\nconst PROPERTY_FIELDS = gql`\n fragment PropertyFields on HousingVistaProperty {\n id\n title\n description\n type\n status\n category\n verificationStatus\n imageUrl\n createdAt\n updatedAt\n price {\n amount\n currency\n type\n period\n negotiable\n pricePerSqft\n }\n location {\n address\n city\n state\n country\n pincode\n coordinates {\n latitude\n longitude\n }\n neighborhood\n landmarks\n }\n specifications {\n totalArea\n carpetArea\n builtUpArea\n bedrooms\n bathrooms\n floors\n totalFloors\n parking\n balconies\n furnishingStatus\n ageOfProperty\n facing\n }\n amenities {\n id\n name\n category\n available\n }\n images {\n id\n url\n title\n type\n order\n isPrimary\n }\n }\n`;\n\nconst GET_PROPERTIES = gql`\n ${PROPERTY_FIELDS}\n query GetProperties($filter: HousingVistaPropertyFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaProperties(filter: $filter, pagination: $pagination) {\n ...PropertyFields\n }\n }\n`;\n\nconst GET_PROPERTY = gql`\n ${PROPERTY_FIELDS}\n query GetProperty($id: ID!) {\n housingvistaProperty(id: $id) {\n ...PropertyFields\n }\n }\n`;\n\nconst TRANSACTION_FIELDS = gql`\n fragment TransactionFields on HousingVistaTransaction {\n id\n title\n type\n status\n amount\n currency\n documents\n milestones\n parties\n escrow\n createdAt\n updatedAt\n property {\n id\n title\n location {\n city\n state\n }\n images {\n id\n url\n isPrimary\n }\n }\n buyer {\n id\n firstName\n lastName\n avatar\n }\n seller {\n id\n firstName\n lastName\n avatar\n }\n tenant {\n id\n firstName\n lastName\n avatar\n }\n landlord {\n id\n firstName\n lastName\n avatar\n }\n }\n`;\n\nconst GET_TRANSACTIONS = gql`\n ${TRANSACTION_FIELDS}\n query GetTransactions($filter: HousingVistaTransactionFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaTransactions(filter: $filter, pagination: $pagination) {\n ...TransactionFields\n }\n }\n`;\n\nconst GET_TRANSACTION = gql`\n ${TRANSACTION_FIELDS}\n query GetTransaction($id: ID!) {\n housingvistaTransaction(id: $id) {\n ...TransactionFields\n }\n }\n`;\n\nconst INVESTMENT_FIELDS = gql`\n fragment InvestmentFields on HousingVistaInvestment {\n id\n title\n investmentType\n totalValue\n status\n startDate\n maturityDate\n riskLevel\n investors\n returns\n property {\n id\n title\n location {\n city\n state\n }\n }\n }\n`;\n\nconst GET_INVESTMENTS = gql`\n ${INVESTMENT_FIELDS}\n query GetInvestments($filter: HousingVistaInvestmentFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaInvestments(filter: $filter, pagination: $pagination) {\n ...InvestmentFields\n }\n }\n`;\n\nconst GET_INVESTMENT = gql`\n ${INVESTMENT_FIELDS}\n query GetInvestment($id: ID!) {\n housingvistaInvestment(id: $id) {\n ...InvestmentFields\n }\n }\n`;\n\nconst GET_RENTAL_UNITS = gql`\n query GetRentalUnits($filter: HousingVistaRentalUnitFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaRentalUnits(filter: $filter, pagination: $pagination) {\n id\n propertyId\n propertyTitle\n unitNumber\n tenantName\n tenantEmail\n tenantPhone\n monthlyRent\n leaseStart\n leaseEnd\n status\n lastPaymentDate\n paymentStatus\n securityDeposit\n }\n }\n`;\n\nconst ASSET_FIELDS = gql`\n fragment AssetFields on HousingVistaAsset {\n id\n title\n type\n category\n location\n currentValue\n purchasePrice\n purchaseDate\n appreciationPercent\n rentalYield\n status\n imageUrl\n lastValuationDate\n }\n`;\n\nconst GET_ASSETS = gql`\n ${ASSET_FIELDS}\n query GetAssets($filter: HousingVistaAssetFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaAssets(filter: $filter, pagination: $pagination) {\n ...AssetFields\n }\n }\n`;\n\nconst GET_ASSET = gql`\n ${ASSET_FIELDS}\n query GetAsset($id: ID!) {\n housingvistaAsset(id: $id) {\n ...AssetFields\n }\n }\n`;\n\nconst GET_AMC_CONTRACTS = gql`\n query GetAmcContracts($filter: HousingVistaAmcContractFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaAmcContracts(filter: $filter, pagination: $pagination) {\n id\n propertyId\n propertyTitle\n packageName\n providerName\n status\n startDate\n endDate\n monthlyCost\n nextServiceDate\n servicesIncluded\n }\n }\n`;\n\nconst MARKETPLACE_SERVICE_FIELDS = gql`\n fragment MarketplaceServiceFields on HousingVistaMarketplaceService {\n id\n name\n providerName\n category\n description\n rating\n reviewCount\n priceRange\n availableAreas\n responseTime\n verified\n imageUrl\n featured\n }\n`;\n\nconst GET_MARKETPLACE_SERVICES = gql`\n ${MARKETPLACE_SERVICE_FIELDS}\n query GetMarketplaceServices(\n $filter: HousingVistaMarketplaceServiceFilterInput\n $pagination: HousingVistaPaginationInput\n ) {\n housingvistaMarketplaceServices(filter: $filter, pagination: $pagination) {\n ...MarketplaceServiceFields\n }\n }\n`;\n\nconst GET_MARKETPLACE_SERVICE = gql`\n ${MARKETPLACE_SERVICE_FIELDS}\n query GetMarketplaceService($id: ID!) {\n housingvistaMarketplaceService(id: $id) {\n ...MarketplaceServiceFields\n }\n }\n`;\n\nconst VERIFICATION_FIELDS = gql`\n fragment VerificationFields on HousingVistaVerificationItem {\n id\n entityType\n entityId\n entityLabel\n status\n submittedDate\n reviewerName\n priority\n notes\n createdAt\n updatedAt\n }\n`;\n\nconst GET_VERIFICATIONS = gql`\n ${VERIFICATION_FIELDS}\n query GetVerifications($filter: HousingVistaVerificationItemFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaVerificationItems(filter: $filter, pagination: $pagination) {\n ...VerificationFields\n }\n }\n`;\n\nconst GET_VERIFICATION = gql`\n ${VERIFICATION_FIELDS}\n query GetVerification($id: ID!) {\n housingvistaVerificationItem(id: $id) {\n ...VerificationFields\n }\n }\n`;\n\nconst LEGAL_SERVICE_FIELDS = gql`\n fragment LegalServiceFields on HousingVistaLegalService {\n id\n title\n category\n description\n providerName\n providerRating\n estimatedDuration\n priceRange\n status\n consultationFee\n documentsRequired\n }\n`;\n\nconst GET_LEGAL_SERVICES = gql`\n ${LEGAL_SERVICE_FIELDS}\n query GetLegalServices($filter: HousingVistaLegalServiceFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaLegalServices(filter: $filter, pagination: $pagination) {\n ...LegalServiceFields\n }\n }\n`;\n\nconst GET_LEGAL_SERVICE = gql`\n ${LEGAL_SERVICE_FIELDS}\n query GetLegalService($id: ID!) {\n housingvistaLegalService(id: $id) {\n ...LegalServiceFields\n }\n }\n`;\n\nconst HOME_LOAN_FIELDS = gql`\n fragment HomeLoanFields on HousingVistaHomeLoanOffer {\n id\n bankName\n bankLogo\n interestRate\n maxTenure\n maxAmount\n processingFee\n emiPerLakh\n features\n rating\n specialOffer\n prepaymentCharges\n }\n`;\n\nconst GET_HOME_LOANS = gql`\n ${HOME_LOAN_FIELDS}\n query GetHomeLoans($pagination: HousingVistaPaginationInput) {\n housingvistaHomeLoanOffers(pagination: $pagination) {\n ...HomeLoanFields\n }\n }\n`;\n\nconst GET_HOME_LOAN = gql`\n ${HOME_LOAN_FIELDS}\n query GetHomeLoan($id: ID!) {\n housingvistaHomeLoanOffer(id: $id) {\n ...HomeLoanFields\n }\n }\n`;\n\nconst GET_MARKET_TRENDS = gql`\n query GetMarketTrends($pagination: HousingVistaPaginationInput) {\n housingvistaMarketTrends(pagination: $pagination) {\n month\n avgPrice\n avgRent\n demandIndex\n supplyIndex\n priceChangePercent\n }\n }\n`;\n\nconst GET_AREA_INSIGHTS = gql`\n query GetAreaInsights($pagination: HousingVistaPaginationInput) {\n housingvistaAreaInsights(pagination: $pagination) {\n id\n areaName\n city\n avgPropertyPrice\n avgRentalYield\n appreciationRate\n safetyScore\n connectivityScore\n amenitiesScore\n schoolsNearby\n hospitalsNearby\n population\n greenCoverPercent\n upcomingProjects\n }\n }\n`;\n\nconst GET_ANALYTICS = gql`\n query GetHousingvistaAnalytics {\n housingvistaAnalytics {\n kpis {\n id\n label\n value\n previousValue\n unit\n trend\n changePercent\n }\n revenueByMonth {\n month\n revenue\n expenses\n }\n propertyTypeDistribution {\n type\n count\n value\n }\n occupancyRate {\n month\n rate\n }\n }\n }\n`;\n\nconst SHORTLIST_FIELDS = gql`\n ${PROPERTY_FIELDS}\n fragment ShortlistFields on HousingVistaShortlist {\n id\n propertyId\n notes\n createdAt\n property {\n ...PropertyFields\n }\n }\n`;\n\nconst GET_SHORTLISTS = gql`\n ${SHORTLIST_FIELDS}\n query GetShortlists($pagination: HousingVistaPaginationInput) {\n housingvistaShortlists(pagination: $pagination) {\n ...ShortlistFields\n }\n }\n`;\n\nconst OFFER_FIELDS = gql`\n fragment OfferFields on HousingVistaOffer {\n id\n propertyId\n amount\n counterAmount\n currency\n status\n notes\n respondedAt\n createdAt\n updatedAt\n property {\n id\n title\n location {\n city\n state\n }\n images {\n id\n url\n isPrimary\n }\n price {\n amount\n currency\n }\n }\n }\n`;\n\nconst GET_OFFERS = gql`\n ${OFFER_FIELDS}\n query GetOffers($filter: HousingVistaOfferFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaOffers(filter: $filter, pagination: $pagination) {\n ...OfferFields\n }\n }\n`;\n\nconst GET_OFFER = gql`\n ${OFFER_FIELDS}\n query GetOffer($id: ID!) {\n housingvistaOffer(id: $id) {\n ...OfferFields\n }\n }\n`;\n\nconst VIEWING_FIELDS = gql`\n fragment ViewingFields on HousingVistaViewing {\n id\n propertyId\n scheduledAt\n type\n status\n attendeeName\n attendeeEmail\n notes\n createdAt\n updatedAt\n property {\n id\n title\n location {\n city\n state\n }\n images {\n id\n url\n isPrimary\n }\n }\n }\n`;\n\nconst GET_VIEWINGS = gql`\n ${VIEWING_FIELDS}\n query GetViewings($filter: HousingVistaViewingFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaViewings(filter: $filter, pagination: $pagination) {\n ...ViewingFields\n }\n }\n`;\n\nconst GET_VIEWING = gql`\n ${VIEWING_FIELDS}\n query GetViewing($id: ID!) {\n housingvistaViewing(id: $id) {\n ...ViewingFields\n }\n }\n`;\n\nconst RENTAL_APPLICATION_FIELDS = gql`\n fragment RentalApplicationFields on HousingVistaRentalApplication {\n id\n rentalUnitId\n applicantName\n applicantEmail\n applicantPhone\n monthlyIncome\n moveInDate\n status\n reviewNotes\n reviewedAt\n createdAt\n updatedAt\n rentalUnit {\n id\n unitNumber\n propertyTitle\n monthlyRent\n }\n }\n`;\n\nconst GET_RENTAL_APPLICATIONS = gql`\n ${RENTAL_APPLICATION_FIELDS}\n query GetRentalApplications(\n $filter: HousingVistaRentalApplicationFilterInput\n $pagination: HousingVistaPaginationInput\n ) {\n housingvistaRentalApplications(filter: $filter, pagination: $pagination) {\n ...RentalApplicationFields\n }\n }\n`;\n\nconst MAINTENANCE_FIELDS = gql`\n fragment MaintenanceFields on HousingVistaMaintenanceRequest {\n id\n propertyId\n rentalUnitId\n title\n description\n category\n priority\n status\n resolutionNotes\n resolvedAt\n createdAt\n updatedAt\n }\n`;\n\nconst GET_MAINTENANCE_REQUESTS = gql`\n ${MAINTENANCE_FIELDS}\n query GetMaintenanceRequests(\n $filter: HousingVistaMaintenanceRequestFilterInput\n $pagination: HousingVistaPaginationInput\n ) {\n housingvistaMaintenanceRequests(filter: $filter, pagination: $pagination) {\n ...MaintenanceFields\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Mutation documents\n// ---------------------------------------------------------------------------\n\nconst CREATE_PROPERTY = gql`\n ${PROPERTY_FIELDS}\n mutation CreateHousingvistaProperty($input: HousingVistaCreatePropertyInput!) {\n createHousingvistaProperty(input: $input) {\n ...PropertyFields\n }\n }\n`;\n\nconst UPDATE_PROPERTY = gql`\n ${PROPERTY_FIELDS}\n mutation UpdateHousingvistaProperty($id: ID!, $input: HousingVistaUpdatePropertyInput!) {\n updateHousingvistaProperty(id: $id, input: $input) {\n ...PropertyFields\n }\n }\n`;\n\nconst DELETE_PROPERTY = gql`\n mutation DeleteHousingvistaProperty($id: ID!) {\n deleteHousingvistaProperty(id: $id)\n }\n`;\n\nconst SAVE_SHORTLIST = gql`\n ${SHORTLIST_FIELDS}\n mutation SaveHousingvistaShortlist($input: HousingVistaSaveShortlistInput!) {\n saveHousingvistaShortlist(input: $input) {\n ...ShortlistFields\n }\n }\n`;\n\nconst REMOVE_SHORTLIST = gql`\n mutation RemoveHousingvistaShortlist($propertyId: ID!) {\n removeHousingvistaShortlist(propertyId: $propertyId)\n }\n`;\n\nconst BOOK_VIEWING = gql`\n mutation BookHousingvistaViewing($input: HousingVistaBookViewingInput!) {\n bookHousingvistaViewing(input: $input) {\n id\n propertyId\n scheduledAt\n type\n status\n attendeeName\n attendeeEmail\n notes\n }\n }\n`;\n\nconst CANCEL_VIEWING = gql`\n mutation CancelHousingvistaViewing($id: ID!) {\n cancelHousingvistaViewing(id: $id) {\n id\n status\n }\n }\n`;\n\nconst SUBMIT_OFFER = gql`\n mutation SubmitHousingvistaOffer($input: HousingVistaSubmitOfferInput!) {\n submitHousingvistaOffer(input: $input) {\n id\n propertyId\n amount\n currency\n status\n notes\n createdAt\n }\n }\n`;\n\nconst RESPOND_OFFER = gql`\n mutation RespondHousingvistaOffer($id: ID!, $input: HousingVistaRespondOfferInput!) {\n respondHousingvistaOffer(id: $id, input: $input) {\n id\n status\n counterAmount\n respondedAt\n }\n }\n`;\n\nconst CREATE_TRANSACTION = gql`\n ${TRANSACTION_FIELDS}\n mutation CreateHousingvistaTransaction($input: HousingVistaCreateTransactionInput!) {\n createHousingvistaTransaction(input: $input) {\n ...TransactionFields\n }\n }\n`;\n\nconst CREATE_INVESTMENT = gql`\n ${INVESTMENT_FIELDS}\n mutation CreateHousingvistaInvestment($input: HousingVistaCreateInvestmentInput!) {\n createHousingvistaInvestment(input: $input) {\n ...InvestmentFields\n }\n }\n`;\n\nconst CREATE_RENTAL_UNIT = gql`\n mutation CreateHousingvistaRentalUnit($input: HousingVistaCreateRentalUnitInput!) {\n createHousingvistaRentalUnit(input: $input) {\n id\n propertyTitle\n unitNumber\n tenantName\n monthlyRent\n status\n }\n }\n`;\n\nconst SUBMIT_RENTAL_APPLICATION = gql`\n mutation SubmitHousingvistaRentalApplication($input: HousingVistaSubmitRentalApplicationInput!) {\n submitHousingvistaRentalApplication(input: $input) {\n id\n rentalUnitId\n applicantName\n status\n }\n }\n`;\n\nconst CREATE_AMC_CONTRACT = gql`\n mutation CreateHousingvistaAmcContract($input: HousingVistaCreateAmcContractInput!) {\n createHousingvistaAmcContract(input: $input) {\n id\n propertyTitle\n packageName\n providerName\n monthlyCost\n status\n }\n }\n`;\n\nconst CREATE_MAINTENANCE_REQUEST = gql`\n mutation CreateHousingvistaMaintenanceRequest($input: HousingVistaCreateMaintenanceRequestInput!) {\n createHousingvistaMaintenanceRequest(input: $input) {\n id\n title\n category\n priority\n status\n }\n }\n`;\n\nconst APPROVE_VERIFICATION = gql`\n mutation ApproveHousingvistaVerificationItem($id: ID!, $notes: String) {\n approveHousingvistaVerificationItem(id: $id, notes: $notes) {\n id\n status\n reviewerName\n notes\n }\n }\n`;\n\nconst REJECT_VERIFICATION = gql`\n mutation RejectHousingvistaVerificationItem($id: ID!, $notes: String) {\n rejectHousingvistaVerificationItem(id: $id, notes: $notes) {\n id\n status\n reviewerName\n notes\n }\n }\n`;\n\nconst WITHDRAW_OFFER = gql`\n mutation WithdrawHousingvistaOffer($id: ID!) {\n withdrawHousingvistaOffer(id: $id) {\n id\n status\n }\n }\n`;\n\nconst UPDATE_VIEWING = gql`\n mutation UpdateHousingvistaViewing($id: ID!, $input: HousingVistaUpdateViewingInput!) {\n updateHousingvistaViewing(id: $id, input: $input) {\n id\n scheduledAt\n status\n type\n notes\n }\n }\n`;\n\nconst UPDATE_INVESTMENT = gql`\n ${INVESTMENT_FIELDS}\n mutation UpdateHousingvistaInvestment($id: ID!, $input: HousingVistaUpdateInvestmentInput!) {\n updateHousingvistaInvestment(id: $id, input: $input) {\n ...InvestmentFields\n }\n }\n`;\n\nconst DELETE_INVESTMENT = gql`\n mutation DeleteHousingvistaInvestment($id: ID!) {\n deleteHousingvistaInvestment(id: $id)\n }\n`;\n\nconst CREATE_ASSET = gql`\n ${ASSET_FIELDS}\n mutation CreateHousingvistaAsset($input: HousingVistaCreateAssetInput!) {\n createHousingvistaAsset(input: $input) {\n ...AssetFields\n }\n }\n`;\n\nconst UPDATE_ASSET = gql`\n ${ASSET_FIELDS}\n mutation UpdateHousingvistaAsset($id: ID!, $input: HousingVistaUpdateAssetInput!) {\n updateHousingvistaAsset(id: $id, input: $input) {\n ...AssetFields\n }\n }\n`;\n\nconst DELETE_ASSET = gql`\n mutation DeleteHousingvistaAsset($id: ID!) {\n deleteHousingvistaAsset(id: $id)\n }\n`;\n\nconst UPDATE_AMC_CONTRACT = gql`\n mutation UpdateHousingvistaAmcContract($id: ID!, $input: HousingVistaUpdateAmcContractInput!) {\n updateHousingvistaAmcContract(id: $id, input: $input) {\n id\n status\n packageName\n providerName\n monthlyCost\n }\n }\n`;\n\nconst DELETE_AMC_CONTRACT = gql`\n mutation DeleteHousingvistaAmcContract($id: ID!) {\n deleteHousingvistaAmcContract(id: $id)\n }\n`;\n\nconst UPDATE_TRANSACTION = gql`\n ${TRANSACTION_FIELDS}\n mutation UpdateHousingvistaTransaction($id: ID!, $input: HousingVistaUpdateTransactionInput!) {\n updateHousingvistaTransaction(id: $id, input: $input) {\n ...TransactionFields\n }\n }\n`;\n\nconst DELETE_TRANSACTION = gql`\n mutation DeleteHousingvistaTransaction($id: ID!) {\n deleteHousingvistaTransaction(id: $id)\n }\n`;\n\nconst RESOLVE_MAINTENANCE = gql`\n ${MAINTENANCE_FIELDS}\n mutation ResolveHousingvistaMaintenanceRequest($id: ID!, $resolutionNotes: String) {\n resolveHousingvistaMaintenanceRequest(id: $id, resolutionNotes: $resolutionNotes) {\n ...MaintenanceFields\n }\n }\n`;\n\nconst REVIEW_RENTAL_APPLICATION = gql`\n ${RENTAL_APPLICATION_FIELDS}\n mutation ReviewHousingvistaRentalApplication($id: ID!, $input: HousingVistaReviewRentalApplicationInput!) {\n reviewHousingvistaRentalApplication(id: $id, input: $input) {\n ...RentalApplicationFields\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Query-result row shapes (as selected above)\n// ---------------------------------------------------------------------------\n\ninterface PropertyRow {\n id: string;\n title: string;\n description: string | null;\n type: Property['type'];\n status: Property['status'];\n category: string;\n verificationStatus: string;\n imageUrl: string | null;\n createdAt: string;\n updatedAt: string;\n price: Property['price'];\n location: Omit<Property['location'], 'coordinates'> & {\n coordinates: { latitude: number; longitude: number } | null;\n };\n specifications: Property['specifications'];\n amenities: Property['amenities'];\n images: Property['images'];\n}\n\ninterface TransactionRow {\n id: string;\n title: string;\n type: string;\n status: string;\n amount: number;\n currency: string;\n documents: unknown;\n milestones: unknown;\n parties: unknown;\n escrow: unknown;\n createdAt: string;\n updatedAt: string;\n property: PropertyRow | null;\n buyer: TxParty | null;\n seller: TxParty | null;\n tenant: TxParty | null;\n landlord: TxParty | null;\n}\n\ninterface TxParty {\n id: string | null;\n firstName: string | null;\n lastName: string | null;\n avatar: string | null;\n}\n\ninterface InvestmentRow {\n id: string;\n title: string;\n investmentType: string;\n totalValue: number;\n status: string;\n startDate: string;\n maturityDate: string | null;\n riskLevel: string;\n investors: unknown;\n returns: unknown;\n property: PropertyRow | null;\n}\n\ninterface ShortlistRow {\n id: string;\n propertyId: string;\n notes: string | null;\n createdAt: string;\n property: PropertyRow;\n}\n\n// ---------------------------------------------------------------------------\n// Mappers: GraphQL row → MFE domain type\n// ---------------------------------------------------------------------------\n\n/**\n * The domain `Property` carries display-only fields the subgraph does not\n * resolve (owner/documents/features/virtualTours/availability). We fill the\n * present fields from the query and default the rest to empty so consumers can\n * render honest empty-states rather than crashing on `undefined`.\n */\nconst mapProperty = (row: PropertyRow): Property => ({\n id: row.id,\n title: row.title,\n description: row.description ?? '',\n type: row.type,\n status: row.status,\n category: row.category as Property['category'],\n price: row.price,\n location: {\n ...row.location,\n coordinates: row.location.coordinates ?? { latitude: 0, longitude: 0 },\n },\n specifications: row.specifications,\n amenities: row.amenities ?? [],\n images: row.images ?? [],\n documents: [],\n virtualTours: [],\n owner: { id: '', name: '', email: '', phone: '', verified: false },\n features: [],\n verificationStatus: (row.verificationStatus as Property['verificationStatus']) ?? 'pending',\n availability: { available: true },\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n});\n\n// ---------------------------------------------------------------------------\n// Query hooks\n// ---------------------------------------------------------------------------\n\nexport const useDashboardStats = () => {\n const { data, loading, error } = useQuery<{ housingvistaDashboardStats: DashboardStats }>(GET_DASHBOARD_STATS);\n const empty: DashboardStats = {\n totalProperties: 0,\n totalValue: 0,\n occupancyRate: 0,\n monthlyRevenue: 0,\n activeTransactions: 0,\n pendingVerifications: 0,\n totalInvestments: 0,\n investmentReturns: 0,\n totalTenants: 0,\n maintenanceRequests: 0,\n unreadMessages: 0,\n upcomingViewings: 0,\n };\n return { data: data?.housingvistaDashboardStats ?? empty, loading, error };\n};\n\nexport const useRecentActivities = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaTransactions: TransactionRow[] }>(GET_TRANSACTIONS, {\n variables: getPaginationVariables(pagination),\n });\n const activities: RecentActivity[] = (data?.housingvistaTransactions ?? []).map((txn) => ({\n id: `act-${txn.id}`,\n type: 'transaction_update',\n title: `Transaction: ${txn.type}`,\n description: `${txn.property?.title ?? 'Property'} - ${txn.status}`,\n timestamp: txn.updatedAt || txn.createdAt,\n entityId: txn.id,\n entityType: 'transaction',\n actorName: txn.buyer\n ? `${txn.buyer.firstName ?? ''} ${txn.buyer.lastName ?? ''}`.trim()\n : txn.tenant\n ? `${txn.tenant.firstName ?? ''} ${txn.tenant.lastName ?? ''}`.trim()\n : 'System',\n actorAvatar: txn.buyer?.avatar ?? txn.tenant?.avatar ?? undefined,\n }));\n return { data: activities, loading, error };\n};\n\nexport const useProperties = (options?: { filter?: PropertyFilterInput; pagination?: PaginationInput }) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaProperties: PropertyRow[] }>(GET_PROPERTIES, {\n variables: {\n filter: options?.filter,\n ...getPaginationVariables(options?.pagination),\n },\n });\n return {\n data: (data?.housingvistaProperties ?? []).map(mapProperty),\n loading,\n error,\n refetch,\n };\n};\n\nexport const useProperty = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaProperty: PropertyRow | null }>(GET_PROPERTY, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return {\n data: data?.housingvistaProperty ? mapProperty(data.housingvistaProperty) : null,\n loading,\n error,\n };\n};\n\nexport const useTransactions = (options?: ListOptions<TransactionFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaTransactions: TransactionRow[] }>(GET_TRANSACTIONS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n // Transaction JSON columns (documents/milestones/parties/escrow) are opaque to\n // the schema; the page guards their runtime shape. Cast is localized here.\n return { data: (data?.housingvistaTransactions ?? []) as unknown as Transaction[], loading, error, refetch };\n};\n\nexport const useTransaction = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaTransaction: TransactionRow | null }>(GET_TRANSACTION, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return {\n data: (data?.housingvistaTransaction ?? null) as unknown as Transaction | null,\n loading,\n error,\n };\n};\n\nexport const useInvestments = (options?: ListOptions<InvestmentFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaInvestments: InvestmentRow[] }>(GET_INVESTMENTS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: (data?.housingvistaInvestments ?? []) as unknown as Investment[], loading, error, refetch };\n};\n\nexport const useInvestment = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaInvestment: InvestmentRow | null }>(GET_INVESTMENT, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: (data?.housingvistaInvestment ?? null) as unknown as Investment | null, loading, error };\n};\n\nexport const useRentalUnits = (options?: ListOptions<RentalUnitFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaRentalUnits: RentalUnit[] }>(GET_RENTAL_UNITS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaRentalUnits ?? [], loading, error, refetch };\n};\n\nexport const useAssets = (options?: ListOptions<AssetFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaAssets: Asset[] }>(GET_ASSETS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaAssets ?? [], loading, error, refetch };\n};\n\nexport const useAsset = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaAsset: Asset | null }>(GET_ASSET, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaAsset ?? null, loading, error };\n};\n\nexport const useAMCContracts = (options?: ListOptions<AmcContractFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaAmcContracts: AMCContract[] }>(GET_AMC_CONTRACTS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaAmcContracts ?? [], loading, error, refetch };\n};\n\nexport const useMarketplaceServices = (options?: ListOptions<MarketplaceServiceFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaMarketplaceServices: MarketplaceService[] }>(\n GET_MARKETPLACE_SERVICES,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaMarketplaceServices ?? [], loading, error, refetch };\n};\n\nexport const useMarketplaceService = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaMarketplaceService: MarketplaceService | null }>(\n GET_MARKETPLACE_SERVICE,\n { variables: { id: id ?? '' }, skip: !id }\n );\n return { data: data?.housingvistaMarketplaceService ?? null, loading, error };\n};\n\nexport const useVerifications = (options?: ListOptions<VerificationItemFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaVerificationItems: VerificationItem[] }>(\n GET_VERIFICATIONS,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaVerificationItems ?? [], loading, error, refetch };\n};\n\n/**\n * Single verification item. The detail view needs the audit timestamps\n * (`createdAt`/`updatedAt`) that the list type omits, so the result is typed as\n * `VerificationItem` extended with those ISO-string fields.\n */\nexport type VerificationItemDetail = VerificationItem & {\n createdAt: string;\n updatedAt: string;\n};\n\nexport const useVerificationItem = (id: string | undefined) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaVerificationItem: VerificationItemDetail | null }>(\n GET_VERIFICATION,\n { variables: { id: id ?? '' }, skip: !id }\n );\n return { data: data?.housingvistaVerificationItem ?? null, loading, error, refetch };\n};\n\nexport const useLegalServices = (options?: ListOptions<LegalServiceFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaLegalServices: LegalService[] }>(\n GET_LEGAL_SERVICES,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaLegalServices ?? [], loading, error, refetch };\n};\n\nexport const useLegalService = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaLegalService: LegalService | null }>(GET_LEGAL_SERVICE, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaLegalService ?? null, loading, error };\n};\n\nexport const useHomeLoans = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaHomeLoanOffers: HomeLoan[] }>(GET_HOME_LOANS, {\n variables: getPaginationVariables(pagination),\n });\n return { data: data?.housingvistaHomeLoanOffers ?? [], loading, error };\n};\n\nexport const useHomeLoanOffer = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaHomeLoanOffer: HomeLoan | null }>(GET_HOME_LOAN, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaHomeLoanOffer ?? null, loading, error };\n};\n\nexport const useMarketTrends = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaMarketTrends: MarketTrend[] }>(GET_MARKET_TRENDS, {\n variables: getPaginationVariables(pagination),\n });\n return { data: data?.housingvistaMarketTrends ?? [], loading, error };\n};\n\nexport const useAreaInsights = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaAreaInsights: AreaInsight[] }>(GET_AREA_INSIGHTS, {\n variables: getPaginationVariables(pagination),\n });\n return { data: data?.housingvistaAreaInsights ?? [], loading, error };\n};\n\nexport const useShortlists = (pagination?: PaginationInput) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaShortlists: ShortlistRow[] }>(GET_SHORTLISTS, {\n variables: getPaginationVariables(pagination),\n });\n const shortlists = (data?.housingvistaShortlists ?? []).map((row) => ({\n id: row.id,\n propertyId: row.propertyId,\n notes: row.notes ?? undefined,\n createdAt: row.createdAt,\n property: mapProperty(row.property),\n }));\n return { data: shortlists, loading, error, refetch };\n};\n\nexport const useAnalyticsData = () => {\n const { data, loading, error } = useQuery<{ housingvistaAnalytics: AnalyticsChartData }>(GET_ANALYTICS);\n return { data: data?.housingvistaAnalytics ?? null, loading, error };\n};\n\n// ---------------------------------------------------------------------------\n// Offers / Viewings / Rental applications / Maintenance — query hooks\n// ---------------------------------------------------------------------------\n\nexport interface OfferRow {\n id: string;\n propertyId: string;\n amount: number;\n counterAmount: number | null;\n currency: string;\n status: 'submitted' | 'countered' | 'accepted' | 'rejected' | 'withdrawn';\n notes: string | null;\n respondedAt: string | null;\n createdAt: string;\n updatedAt: string;\n property: {\n id: string;\n title: string;\n location: { city: string; state: string };\n images: { id: string; url: string; isPrimary: boolean }[];\n price: { amount: number; currency: string };\n } | null;\n}\n\nexport const useOffers = (options?: ListOptions<OfferFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaOffers: OfferRow[] }>(GET_OFFERS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaOffers ?? [], loading, error, refetch };\n};\n\nexport const useOffer = (id: string | undefined) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaOffer: OfferRow | null }>(GET_OFFER, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaOffer ?? null, loading, error, refetch };\n};\n\nexport interface ViewingRow {\n id: string;\n propertyId: string;\n scheduledAt: string;\n type: 'in_person' | 'virtual';\n status: 'requested' | 'confirmed' | 'completed' | 'cancelled';\n attendeeName: string | null;\n attendeeEmail: string | null;\n notes: string | null;\n createdAt: string;\n updatedAt: string;\n property: {\n id: string;\n title: string;\n location: { city: string; state: string };\n images: { id: string; url: string; isPrimary: boolean }[];\n } | null;\n}\n\nexport const useViewings = (options?: ListOptions<ViewingFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaViewings: ViewingRow[] }>(GET_VIEWINGS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaViewings ?? [], loading, error, refetch };\n};\n\nexport const useViewing = (id: string | undefined) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaViewing: ViewingRow | null }>(GET_VIEWING, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaViewing ?? null, loading, error, refetch };\n};\n\nexport interface RentalApplicationRow {\n id: string;\n rentalUnitId: string;\n applicantName: string;\n applicantEmail: string;\n applicantPhone: string | null;\n monthlyIncome: number | null;\n moveInDate: string | null;\n status: 'submitted' | 'screening' | 'approved' | 'rejected';\n reviewNotes: string | null;\n reviewedAt: string | null;\n createdAt: string;\n updatedAt: string;\n rentalUnit: {\n id: string;\n unitNumber: string;\n propertyTitle: string;\n monthlyRent: number;\n } | null;\n}\n\nexport const useRentalApplications = (options?: ListOptions<RentalApplicationFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaRentalApplications: RentalApplicationRow[] }>(\n GET_RENTAL_APPLICATIONS,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaRentalApplications ?? [], loading, error, refetch };\n};\n\nexport interface MaintenanceRequestRow {\n id: string;\n propertyId: string | null;\n rentalUnitId: string | null;\n title: string;\n description: string | null;\n category: string;\n priority: 'low' | 'medium' | 'high';\n status: 'open' | 'in_progress' | 'resolved';\n resolutionNotes: string | null;\n resolvedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const useMaintenanceRequests = (options?: ListOptions<MaintenanceRequestFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaMaintenanceRequests: MaintenanceRequestRow[] }>(\n GET_MAINTENANCE_REQUESTS,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaMaintenanceRequests ?? [], loading, error, refetch };\n};\n\n// ---------------------------------------------------------------------------\n// Mutation hooks\n// ---------------------------------------------------------------------------\n\nexport interface CreatePropertyInput {\n title: string;\n description?: string;\n status: PropertyStatus;\n type: PropertyType;\n category: string;\n address?: string;\n city: string;\n state: string;\n country?: string;\n pincode?: string;\n neighborhood?: string;\n landmarks?: string[];\n price: number;\n currency?: string;\n priceType?: string;\n pricePeriod?: string;\n negotiable?: boolean;\n pricePerSqft?: number;\n bedrooms: number;\n bathrooms: number;\n totalArea: number;\n carpetArea?: number;\n builtUpArea?: number;\n floors?: number;\n totalFloors?: number;\n parking?: number;\n balconies?: number;\n furnishingStatus?: string;\n ageOfProperty?: number;\n facing?: string;\n amenities?: { name: string; category: string; available?: boolean }[];\n images?: { url: string; title?: string; type?: string; order?: number; isPrimary?: boolean }[];\n imageUrl?: string;\n}\n\nexport type UpdatePropertyInput = Partial<CreatePropertyInput>;\n\nexport const useCreateProperty = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaProperty: PropertyRow },\n { input: CreatePropertyInput }\n >(CREATE_PROPERTY, { refetchQueries: ['GetProperties'], awaitRefetchQueries: true });\n const createProperty = async (input: CreatePropertyInput): Promise<Property> => {\n const res = await mutate({ variables: { input } });\n if (!res.data) throw new Error('Property was not created');\n return mapProperty(res.data.createHousingvistaProperty);\n };\n return { createProperty, loading };\n};\n\nexport const useUpdateProperty = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaProperty: PropertyRow },\n { id: string; input: UpdatePropertyInput }\n >(UPDATE_PROPERTY);\n const updateProperty = async (id: string, input: UpdatePropertyInput): Promise<Property> => {\n const res = await mutate({ variables: { id, input } });\n if (!res.data) throw new Error('Property was not updated');\n return mapProperty(res.data.updateHousingvistaProperty);\n };\n return { updateProperty, loading };\n};\n\nexport const useDeleteProperty = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaProperty: boolean }, { id: string }>(DELETE_PROPERTY, {\n refetchQueries: ['GetProperties'],\n awaitRefetchQueries: true,\n });\n const deleteProperty = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaProperty ?? false;\n };\n return { deleteProperty, loading };\n};\n\nexport const useSaveShortlist = () => {\n const [mutate, { loading }] = useMutation<\n { saveHousingvistaShortlist: ShortlistRow },\n { input: { propertyId: string; notes?: string } }\n >(SAVE_SHORTLIST, { refetchQueries: ['GetShortlists'], awaitRefetchQueries: true });\n const saveShortlist = async (propertyId: string, notes?: string) => {\n await mutate({ variables: { input: { propertyId, notes } } });\n };\n return { saveShortlist, loading };\n};\n\nexport const useRemoveShortlist = () => {\n const [mutate, { loading }] = useMutation<{ removeHousingvistaShortlist: boolean }, { propertyId: string }>(\n REMOVE_SHORTLIST,\n { refetchQueries: ['GetShortlists'], awaitRefetchQueries: true }\n );\n const removeShortlist = async (propertyId: string) => {\n await mutate({ variables: { propertyId } });\n };\n return { removeShortlist, loading };\n};\n\nexport interface BookViewingInput {\n propertyId: string;\n scheduledAt: string;\n type?: 'in_person' | 'virtual';\n attendeeName?: string;\n attendeeEmail?: string;\n notes?: string;\n}\n\nexport const useBookViewing = () => {\n const [mutate, { loading }] = useMutation<{ bookHousingvistaViewing: { id: string } }, { input: BookViewingInput }>(\n BOOK_VIEWING\n );\n const bookViewing = async (input: BookViewingInput) => {\n await mutate({ variables: { input } });\n };\n return { bookViewing, loading };\n};\n\nexport const useCancelViewing = () => {\n const [mutate, { loading }] = useMutation<{ cancelHousingvistaViewing: { id: string } }, { id: string }>(\n CANCEL_VIEWING\n );\n const cancelViewing = async (id: string) => {\n await mutate({ variables: { id } });\n };\n return { cancelViewing, loading };\n};\n\nexport interface SubmitOfferInput {\n propertyId: string;\n amount: number;\n currency?: string;\n notes?: string;\n}\n\nexport const useSubmitOffer = () => {\n const [mutate, { loading }] = useMutation<{ submitHousingvistaOffer: { id: string } }, { input: SubmitOfferInput }>(\n SUBMIT_OFFER\n );\n const submitOffer = async (input: SubmitOfferInput) => {\n await mutate({ variables: { input } });\n };\n return { submitOffer, loading };\n};\n\nexport const useRespondOffer = () => {\n const [mutate, { loading }] = useMutation<\n { respondHousingvistaOffer: { id: string } },\n { id: string; input: { action: 'accept' | 'reject' | 'counter'; counterAmount?: number; notes?: string } }\n >(RESPOND_OFFER);\n const respondOffer = async (\n id: string,\n input: { action: 'accept' | 'reject' | 'counter'; counterAmount?: number; notes?: string }\n ) => {\n await mutate({ variables: { id, input } });\n };\n return { respondOffer, loading };\n};\n\nexport interface CreateTransactionInput {\n propertyId: string;\n title: string;\n type: string;\n status: string;\n amount: number;\n currency?: string;\n}\n\nexport const useCreateTransaction = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaTransaction: TransactionRow },\n { input: CreateTransactionInput }\n >(CREATE_TRANSACTION, { refetchQueries: ['GetTransactions'], awaitRefetchQueries: true });\n const createTransaction = async (input: CreateTransactionInput) => {\n await mutate({ variables: { input } });\n };\n return { createTransaction, loading };\n};\n\nexport interface CreateInvestmentInput {\n propertyId: string;\n title: string;\n status: string;\n investmentType: string;\n riskLevel: string;\n totalValue: number;\n startDate?: string;\n maturityDate?: string;\n}\n\nexport const useCreateInvestment = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaInvestment: InvestmentRow },\n { input: CreateInvestmentInput }\n >(CREATE_INVESTMENT, { refetchQueries: ['GetInvestments'], awaitRefetchQueries: true });\n const createInvestment = async (input: CreateInvestmentInput) => {\n await mutate({ variables: { input } });\n };\n return { createInvestment, loading };\n};\n\nexport interface CreateRentalUnitInput {\n propertyId?: string;\n propertyTitle: string;\n unitNumber: string;\n tenantName: string;\n tenantEmail: string;\n tenantPhone?: string;\n monthlyRent: number;\n leaseStart: string;\n leaseEnd: string;\n status: string;\n paymentStatus: string;\n securityDeposit?: number;\n}\n\nexport const useCreateRentalUnit = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaRentalUnit: { id: string } },\n { input: CreateRentalUnitInput }\n >(CREATE_RENTAL_UNIT, { refetchQueries: ['GetRentalUnits'], awaitRefetchQueries: true });\n const createRentalUnit = async (input: CreateRentalUnitInput) => {\n await mutate({ variables: { input } });\n };\n return { createRentalUnit, loading };\n};\n\nexport interface SubmitRentalApplicationInput {\n rentalUnitId: string;\n applicantName: string;\n applicantEmail: string;\n applicantPhone?: string;\n monthlyIncome?: number;\n moveInDate?: string;\n}\n\nexport const useSubmitRentalApplication = () => {\n const [mutate, { loading }] = useMutation<\n { submitHousingvistaRentalApplication: { id: string } },\n { input: SubmitRentalApplicationInput }\n >(SUBMIT_RENTAL_APPLICATION);\n const submitRentalApplication = async (input: SubmitRentalApplicationInput) => {\n await mutate({ variables: { input } });\n };\n return { submitRentalApplication, loading };\n};\n\nexport interface CreateAmcContractInput {\n propertyId?: string;\n propertyTitle: string;\n packageName: string;\n providerName: string;\n monthlyCost: number;\n startDate: string;\n endDate: string;\n nextServiceDate?: string;\n status: string;\n servicesIncluded?: string[];\n}\n\nexport const useCreateAmcContract = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaAmcContract: { id: string } },\n { input: CreateAmcContractInput }\n >(CREATE_AMC_CONTRACT, { refetchQueries: ['GetAmcContracts'], awaitRefetchQueries: true });\n const createAmcContract = async (input: CreateAmcContractInput) => {\n await mutate({ variables: { input } });\n };\n return { createAmcContract, loading };\n};\n\nexport interface CreateMaintenanceRequestInput {\n propertyId?: string;\n rentalUnitId?: string;\n title: string;\n description?: string;\n category: string;\n priority?: 'low' | 'medium' | 'high';\n}\n\nexport const useCreateMaintenanceRequest = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaMaintenanceRequest: { id: string } },\n { input: CreateMaintenanceRequestInput }\n >(CREATE_MAINTENANCE_REQUEST);\n const createMaintenanceRequest = async (input: CreateMaintenanceRequestInput) => {\n await mutate({ variables: { input } });\n };\n return { createMaintenanceRequest, loading };\n};\n\nexport const useApproveVerification = () => {\n const [mutate, { loading }] = useMutation<\n { approveHousingvistaVerificationItem: { id: string } },\n { id: string; notes?: string }\n >(APPROVE_VERIFICATION, { refetchQueries: ['GetVerifications'], awaitRefetchQueries: true });\n const approveVerification = async (id: string, notes?: string) => {\n await mutate({ variables: { id, notes } });\n };\n return { approveVerification, loading };\n};\n\nexport const useRejectVerification = () => {\n const [mutate, { loading }] = useMutation<\n { rejectHousingvistaVerificationItem: { id: string } },\n { id: string; notes?: string }\n >(REJECT_VERIFICATION, { refetchQueries: ['GetVerifications'], awaitRefetchQueries: true });\n const rejectVerification = async (id: string, notes?: string) => {\n await mutate({ variables: { id, notes } });\n };\n return { rejectVerification, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Offer / Viewing owner-side + lifecycle mutation hooks\n// ---------------------------------------------------------------------------\n\nexport const useWithdrawOffer = () => {\n const [mutate, { loading }] = useMutation<{ withdrawHousingvistaOffer: { id: string } }, { id: string }>(\n WITHDRAW_OFFER,\n { refetchQueries: ['GetOffers', 'GetOffer'], awaitRefetchQueries: true }\n );\n const withdrawOffer = async (id: string) => {\n await mutate({ variables: { id } });\n };\n return { withdrawOffer, loading };\n};\n\nexport interface UpdateViewingInput {\n scheduledAt?: string;\n status?: 'requested' | 'confirmed' | 'completed' | 'cancelled';\n type?: 'in_person' | 'virtual';\n attendeeName?: string;\n attendeeEmail?: string;\n notes?: string;\n}\n\nexport const useUpdateViewing = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaViewing: { id: string } },\n { id: string; input: UpdateViewingInput }\n >(UPDATE_VIEWING, { refetchQueries: ['GetViewings', 'GetViewing'], awaitRefetchQueries: true });\n const updateViewing = async (id: string, input: UpdateViewingInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateViewing, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Investment update / delete\n// ---------------------------------------------------------------------------\n\nexport interface UpdateInvestmentInput {\n title?: string;\n investmentType?: string;\n status?: string;\n riskLevel?: string;\n totalValue?: number;\n startDate?: string;\n maturityDate?: string;\n}\n\nexport const useUpdateInvestment = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaInvestment: InvestmentRow },\n { id: string; input: UpdateInvestmentInput }\n >(UPDATE_INVESTMENT, { refetchQueries: ['GetInvestments', 'GetInvestment'], awaitRefetchQueries: true });\n const updateInvestment = async (id: string, input: UpdateInvestmentInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateInvestment, loading };\n};\n\nexport const useDeleteInvestment = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaInvestment: boolean }, { id: string }>(\n DELETE_INVESTMENT,\n { refetchQueries: ['GetInvestments'], awaitRefetchQueries: true }\n );\n const deleteInvestment = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaInvestment ?? false;\n };\n return { deleteInvestment, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Asset create / update / delete\n// ---------------------------------------------------------------------------\n\nexport interface CreateAssetInput {\n title: string;\n type: string;\n category: string;\n location: string;\n currentValue: number;\n purchasePrice: number;\n purchaseDate?: string;\n appreciationPercent?: number;\n rentalYield?: number;\n status: string;\n imageUrl?: string;\n lastValuationDate?: string;\n}\n\nexport const useCreateAsset = () => {\n const [mutate, { loading }] = useMutation<{ createHousingvistaAsset: Asset }, { input: CreateAssetInput }>(\n CREATE_ASSET,\n { refetchQueries: ['GetAssets'], awaitRefetchQueries: true }\n );\n const createAsset = async (input: CreateAssetInput) => {\n await mutate({ variables: { input } });\n };\n return { createAsset, loading };\n};\n\nexport type UpdateAssetInput = Partial<CreateAssetInput>;\n\nexport const useUpdateAsset = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaAsset: Asset },\n { id: string; input: UpdateAssetInput }\n >(UPDATE_ASSET, { refetchQueries: ['GetAssets', 'GetAsset'], awaitRefetchQueries: true });\n const updateAsset = async (id: string, input: UpdateAssetInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateAsset, loading };\n};\n\nexport const useDeleteAsset = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaAsset: boolean }, { id: string }>(DELETE_ASSET, {\n refetchQueries: ['GetAssets'],\n awaitRefetchQueries: true,\n });\n const deleteAsset = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaAsset ?? false;\n };\n return { deleteAsset, loading };\n};\n\n// ---------------------------------------------------------------------------\n// AMC update / delete\n// ---------------------------------------------------------------------------\n\nexport type UpdateAmcContractInput = Partial<CreateAmcContractInput>;\n\nexport const useUpdateAmcContract = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaAmcContract: { id: string } },\n { id: string; input: UpdateAmcContractInput }\n >(UPDATE_AMC_CONTRACT, { refetchQueries: ['GetAmcContracts'], awaitRefetchQueries: true });\n const updateAmcContract = async (id: string, input: UpdateAmcContractInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateAmcContract, loading };\n};\n\nexport const useDeleteAmcContract = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaAmcContract: boolean }, { id: string }>(\n DELETE_AMC_CONTRACT,\n { refetchQueries: ['GetAmcContracts'], awaitRefetchQueries: true }\n );\n const deleteAmcContract = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaAmcContract ?? false;\n };\n return { deleteAmcContract, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Transaction update / delete\n// ---------------------------------------------------------------------------\n\nexport interface UpdateTransactionInput {\n title?: string;\n type?: string;\n status?: string;\n amount?: number;\n currency?: string;\n documents?: unknown;\n}\n\nexport const useUpdateTransaction = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaTransaction: TransactionRow },\n { id: string; input: UpdateTransactionInput }\n >(UPDATE_TRANSACTION, { refetchQueries: ['GetTransactions', 'GetTransaction'], awaitRefetchQueries: true });\n const updateTransaction = async (id: string, input: UpdateTransactionInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateTransaction, loading };\n};\n\nexport const useDeleteTransaction = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaTransaction: boolean }, { id: string }>(\n DELETE_TRANSACTION,\n { refetchQueries: ['GetTransactions'], awaitRefetchQueries: true }\n );\n const deleteTransaction = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaTransaction ?? false;\n };\n return { deleteTransaction, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Maintenance resolve + Rental-application review\n// ---------------------------------------------------------------------------\n\nexport const useResolveMaintenanceRequest = () => {\n const [mutate, { loading }] = useMutation<\n { resolveHousingvistaMaintenanceRequest: MaintenanceRequestRow },\n { id: string; resolutionNotes?: string }\n >(RESOLVE_MAINTENANCE, { refetchQueries: ['GetMaintenanceRequests'], awaitRefetchQueries: true });\n const resolveMaintenanceRequest = async (id: string, resolutionNotes?: string) => {\n await mutate({ variables: { id, resolutionNotes } });\n };\n return { resolveMaintenanceRequest, loading };\n};\n\nexport interface ReviewRentalApplicationInput {\n decision: 'approved' | 'rejected' | 'screening' | 'submitted';\n reviewNotes?: string;\n}\n\nexport const useReviewRentalApplication = () => {\n const [mutate, { loading }] = useMutation<\n { reviewHousingvistaRentalApplication: RentalApplicationRow },\n { id: string; input: ReviewRentalApplicationInput }\n >(REVIEW_RENTAL_APPLICATION, { refetchQueries: ['GetRentalApplications'], awaitRefetchQueries: true });\n const reviewRentalApplication = async (id: string, input: ReviewRentalApplicationInput) => {\n await mutate({ variables: { id, input } });\n };\n return { reviewRentalApplication, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Platform-service reuse (conversations / files) — re-exported from ./platform\n// ---------------------------------------------------------------------------\n\nexport {\n useContactConversation,\n useSendMessage,\n useConversationMessages,\n useEntityComments,\n useCreateEntityComment,\n useFileUpload,\n} from './platform';\nexport type { HvContextTarget, HvConversationMessage, HvEntityComment, HvUploadedFile } from './platform';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/housingvista/hooks/index.ts"],"sourcesContent":["/**\n * HousingVista data hooks — real GraphQL against the wspace gateway via Apollo.\n *\n * Every read maps the `housingvista*` query contract to the MFE domain types in\n * `../types`. Every write wraps a `housingvista*` mutation and (where it changes\n * a list the UI shows) refetches the affected query so the cache stays honest.\n * No `any`, no mock data — hooks that have no backing query return an explicit\n * `unsupported` empty-state instead of fabricating rows.\n * @module housingvista\n */\n\nimport { gql } from '@apollo/client';\nimport { useQuery, useMutation } from '@apollo/client/react';\nimport type {\n Property,\n Transaction,\n Investment,\n DashboardStats,\n RecentActivity,\n RentalUnit,\n Asset,\n AMCContract,\n MarketplaceService,\n VerificationItem,\n LegalService,\n HomeLoan,\n MarketTrend,\n AreaInsight,\n AnalyticsChartData,\n PropertyType,\n PropertyStatus,\n} from '../types';\n\n// ---------------------------------------------------------------------------\n// Shared input shapes (mirror HousingVista*Input from the subgraph schema)\n// ---------------------------------------------------------------------------\n\nexport type PaginationInput = {\n limit?: number;\n offset?: number;\n};\n\nexport type PropertyFilterInput = {\n search?: string;\n status?: PropertyStatus;\n type?: PropertyType;\n city?: string;\n};\n\nexport type TransactionFilterInput = {\n search?: string;\n status?: string;\n type?: string;\n propertyId?: string;\n};\n\nexport type InvestmentFilterInput = {\n search?: string;\n status?: string;\n investmentType?: string;\n riskLevel?: string;\n propertyId?: string;\n};\n\nexport type RentalUnitFilterInput = {\n search?: string;\n status?: string;\n paymentStatus?: string;\n propertyId?: string;\n};\n\nexport type AssetFilterInput = {\n search?: string;\n status?: string;\n type?: string;\n category?: string;\n};\n\nexport type AmcContractFilterInput = {\n search?: string;\n status?: string;\n propertyId?: string;\n};\n\nexport type MarketplaceServiceFilterInput = {\n search?: string;\n category?: string;\n verified?: boolean;\n};\n\nexport type LegalServiceFilterInput = {\n search?: string;\n status?: string;\n category?: string;\n};\n\nexport type VerificationItemFilterInput = {\n search?: string;\n status?: string;\n priority?: string;\n entityType?: string;\n};\n\nexport type ViewingFilterInput = {\n search?: string;\n status?: string;\n type?: string;\n propertyId?: string;\n};\n\nexport type OfferFilterInput = {\n status?: string;\n propertyId?: string;\n};\n\nexport type RentalApplicationFilterInput = {\n search?: string;\n status?: string;\n rentalUnitId?: string;\n};\n\nexport type MaintenanceRequestFilterInput = {\n search?: string;\n status?: string;\n priority?: 'low' | 'medium' | 'high';\n category?: string;\n propertyId?: string;\n rentalUnitId?: string;\n};\n\n/** Options accepted by every server-filtered list hook. */\nexport interface ListOptions<TFilter> {\n filter?: TFilter;\n pagination?: PaginationInput;\n}\n\nconst DEFAULT_LIST_PAGINATION: Required<PaginationInput> = { limit: 50, offset: 0 };\n\nconst getPaginationVariables = (pagination: PaginationInput = DEFAULT_LIST_PAGINATION) => ({\n pagination: {\n limit: pagination.limit ?? DEFAULT_LIST_PAGINATION.limit,\n offset: pagination.offset ?? DEFAULT_LIST_PAGINATION.offset,\n },\n});\n\n// ---------------------------------------------------------------------------\n// Query documents\n// ---------------------------------------------------------------------------\n\nconst GET_DASHBOARD_STATS = gql`\n query GetDashboardStats {\n housingvistaDashboardStats {\n totalProperties\n totalValue\n occupancyRate\n monthlyRevenue\n activeTransactions\n pendingVerifications\n totalInvestments\n totalPortfolioValue\n investmentReturns\n totalTenants\n maintenanceRequests\n unreadMessages\n upcomingViewings\n }\n }\n`;\n\nconst PROPERTY_FIELDS = gql`\n fragment PropertyFields on HousingVistaProperty {\n id\n title\n description\n type\n status\n category\n verificationStatus\n imageUrl\n createdAt\n updatedAt\n price {\n amount\n currency\n type\n period\n negotiable\n pricePerSqft\n }\n location {\n address\n city\n state\n country\n pincode\n coordinates {\n latitude\n longitude\n }\n neighborhood\n landmarks\n }\n specifications {\n totalArea\n carpetArea\n builtUpArea\n bedrooms\n bathrooms\n floors\n totalFloors\n parking\n balconies\n furnishingStatus\n ageOfProperty\n facing\n }\n amenities {\n id\n name\n category\n available\n }\n images {\n id\n url\n title\n type\n order\n isPrimary\n }\n }\n`;\n\nconst GET_PROPERTIES = gql`\n ${PROPERTY_FIELDS}\n query GetProperties($filter: HousingVistaPropertyFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaProperties(filter: $filter, pagination: $pagination) {\n ...PropertyFields\n }\n }\n`;\n\nconst GET_PROPERTY = gql`\n ${PROPERTY_FIELDS}\n query GetProperty($id: ID!) {\n housingvistaProperty(id: $id) {\n ...PropertyFields\n }\n }\n`;\n\nconst TRANSACTION_FIELDS = gql`\n fragment TransactionFields on HousingVistaTransaction {\n id\n title\n type\n status\n amount\n currency\n documents\n milestones\n parties\n escrow\n createdAt\n updatedAt\n property {\n id\n title\n location {\n city\n state\n }\n images {\n id\n url\n isPrimary\n }\n }\n buyer {\n id\n firstName\n lastName\n avatar\n }\n seller {\n id\n firstName\n lastName\n avatar\n }\n tenant {\n id\n firstName\n lastName\n avatar\n }\n landlord {\n id\n firstName\n lastName\n avatar\n }\n }\n`;\n\nconst GET_TRANSACTIONS = gql`\n ${TRANSACTION_FIELDS}\n query GetTransactions($filter: HousingVistaTransactionFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaTransactions(filter: $filter, pagination: $pagination) {\n ...TransactionFields\n }\n }\n`;\n\nconst GET_TRANSACTION = gql`\n ${TRANSACTION_FIELDS}\n query GetTransaction($id: ID!) {\n housingvistaTransaction(id: $id) {\n ...TransactionFields\n }\n }\n`;\n\nconst INVESTMENT_FIELDS = gql`\n fragment InvestmentFields on HousingVistaInvestment {\n id\n title\n investmentType\n totalValue\n status\n startDate\n maturityDate\n riskLevel\n investors\n returns\n property {\n id\n title\n location {\n city\n state\n }\n }\n }\n`;\n\nconst GET_INVESTMENTS = gql`\n ${INVESTMENT_FIELDS}\n query GetInvestments($filter: HousingVistaInvestmentFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaInvestments(filter: $filter, pagination: $pagination) {\n ...InvestmentFields\n }\n }\n`;\n\nconst GET_INVESTMENT = gql`\n ${INVESTMENT_FIELDS}\n query GetInvestment($id: ID!) {\n housingvistaInvestment(id: $id) {\n ...InvestmentFields\n }\n }\n`;\n\nconst GET_RENTAL_UNITS = gql`\n query GetRentalUnits($filter: HousingVistaRentalUnitFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaRentalUnits(filter: $filter, pagination: $pagination) {\n id\n propertyId\n propertyTitle\n unitNumber\n tenantName\n tenantEmail\n tenantPhone\n monthlyRent\n leaseStart\n leaseEnd\n status\n lastPaymentDate\n paymentStatus\n securityDeposit\n }\n }\n`;\n\nconst ASSET_FIELDS = gql`\n fragment AssetFields on HousingVistaAsset {\n id\n title\n type\n category\n location\n currentValue\n purchasePrice\n purchaseDate\n appreciationPercent\n rentalYield\n status\n imageUrl\n lastValuationDate\n }\n`;\n\nconst GET_ASSETS = gql`\n ${ASSET_FIELDS}\n query GetAssets($filter: HousingVistaAssetFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaAssets(filter: $filter, pagination: $pagination) {\n ...AssetFields\n }\n }\n`;\n\nconst GET_ASSET = gql`\n ${ASSET_FIELDS}\n query GetAsset($id: ID!) {\n housingvistaAsset(id: $id) {\n ...AssetFields\n }\n }\n`;\n\nconst GET_AMC_CONTRACTS = gql`\n query GetAmcContracts($filter: HousingVistaAmcContractFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaAmcContracts(filter: $filter, pagination: $pagination) {\n id\n propertyId\n propertyTitle\n packageName\n providerName\n status\n startDate\n endDate\n monthlyCost\n nextServiceDate\n servicesIncluded\n }\n }\n`;\n\nconst MARKETPLACE_SERVICE_FIELDS = gql`\n fragment MarketplaceServiceFields on HousingVistaMarketplaceService {\n id\n name\n providerName\n category\n description\n rating\n reviewCount\n priceRange\n availableAreas\n responseTime\n verified\n imageUrl\n featured\n }\n`;\n\nconst GET_MARKETPLACE_SERVICES = gql`\n ${MARKETPLACE_SERVICE_FIELDS}\n query GetMarketplaceServices(\n $filter: HousingVistaMarketplaceServiceFilterInput\n $pagination: HousingVistaPaginationInput\n ) {\n housingvistaMarketplaceServices(filter: $filter, pagination: $pagination) {\n ...MarketplaceServiceFields\n }\n }\n`;\n\nconst GET_MARKETPLACE_SERVICE = gql`\n ${MARKETPLACE_SERVICE_FIELDS}\n query GetMarketplaceService($id: ID!) {\n housingvistaMarketplaceService(id: $id) {\n ...MarketplaceServiceFields\n }\n }\n`;\n\nconst VERIFICATION_FIELDS = gql`\n fragment VerificationFields on HousingVistaVerificationItem {\n id\n entityType\n entityId\n entityLabel\n status\n submittedDate\n reviewerName\n priority\n notes\n createdAt\n updatedAt\n }\n`;\n\nconst GET_VERIFICATIONS = gql`\n ${VERIFICATION_FIELDS}\n query GetVerifications($filter: HousingVistaVerificationItemFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaVerificationItems(filter: $filter, pagination: $pagination) {\n ...VerificationFields\n }\n }\n`;\n\nconst GET_VERIFICATION = gql`\n ${VERIFICATION_FIELDS}\n query GetVerification($id: ID!) {\n housingvistaVerificationItem(id: $id) {\n ...VerificationFields\n }\n }\n`;\n\nconst LEGAL_SERVICE_FIELDS = gql`\n fragment LegalServiceFields on HousingVistaLegalService {\n id\n title\n category\n description\n providerName\n providerRating\n estimatedDuration\n priceRange\n status\n consultationFee\n documentsRequired\n }\n`;\n\nconst GET_LEGAL_SERVICES = gql`\n ${LEGAL_SERVICE_FIELDS}\n query GetLegalServices($filter: HousingVistaLegalServiceFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaLegalServices(filter: $filter, pagination: $pagination) {\n ...LegalServiceFields\n }\n }\n`;\n\nconst GET_LEGAL_SERVICE = gql`\n ${LEGAL_SERVICE_FIELDS}\n query GetLegalService($id: ID!) {\n housingvistaLegalService(id: $id) {\n ...LegalServiceFields\n }\n }\n`;\n\nconst HOME_LOAN_FIELDS = gql`\n fragment HomeLoanFields on HousingVistaHomeLoanOffer {\n id\n bankName\n bankLogo\n interestRate\n maxTenure\n maxAmount\n processingFee\n emiPerLakh\n features\n rating\n specialOffer\n prepaymentCharges\n }\n`;\n\nconst GET_HOME_LOANS = gql`\n ${HOME_LOAN_FIELDS}\n query GetHomeLoans($pagination: HousingVistaPaginationInput) {\n housingvistaHomeLoanOffers(pagination: $pagination) {\n ...HomeLoanFields\n }\n }\n`;\n\nconst GET_HOME_LOAN = gql`\n ${HOME_LOAN_FIELDS}\n query GetHomeLoan($id: ID!) {\n housingvistaHomeLoanOffer(id: $id) {\n ...HomeLoanFields\n }\n }\n`;\n\nconst GET_MARKET_TRENDS = gql`\n query GetMarketTrends($pagination: HousingVistaPaginationInput) {\n housingvistaMarketTrends(pagination: $pagination) {\n month\n avgPrice\n avgRent\n demandIndex\n supplyIndex\n priceChangePercent\n }\n }\n`;\n\nconst GET_AREA_INSIGHTS = gql`\n query GetAreaInsights($pagination: HousingVistaPaginationInput) {\n housingvistaAreaInsights(pagination: $pagination) {\n id\n areaName\n city\n avgPropertyPrice\n avgRentalYield\n appreciationRate\n safetyScore\n connectivityScore\n amenitiesScore\n schoolsNearby\n hospitalsNearby\n population\n greenCoverPercent\n upcomingProjects\n }\n }\n`;\n\nconst GET_ANALYTICS = gql`\n query GetHousingvistaAnalytics {\n housingvistaAnalytics {\n kpis {\n id\n label\n value\n previousValue\n unit\n trend\n changePercent\n }\n revenueByMonth {\n month\n revenue\n expenses\n }\n propertyTypeDistribution {\n type\n count\n value\n }\n occupancyRate {\n month\n rate\n }\n }\n }\n`;\n\nconst SHORTLIST_FIELDS = gql`\n ${PROPERTY_FIELDS}\n fragment ShortlistFields on HousingVistaShortlist {\n id\n propertyId\n notes\n createdAt\n property {\n ...PropertyFields\n }\n }\n`;\n\nconst GET_SHORTLISTS = gql`\n ${SHORTLIST_FIELDS}\n query GetShortlists($pagination: HousingVistaPaginationInput) {\n housingvistaShortlists(pagination: $pagination) {\n ...ShortlistFields\n }\n }\n`;\n\nconst OFFER_FIELDS = gql`\n fragment OfferFields on HousingVistaOffer {\n id\n propertyId\n amount\n counterAmount\n currency\n status\n notes\n respondedAt\n createdAt\n updatedAt\n property {\n id\n title\n location {\n city\n state\n }\n images {\n id\n url\n isPrimary\n }\n price {\n amount\n currency\n }\n }\n }\n`;\n\nconst GET_OFFERS = gql`\n ${OFFER_FIELDS}\n query GetOffers($filter: HousingVistaOfferFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaOffers(filter: $filter, pagination: $pagination) {\n ...OfferFields\n }\n }\n`;\n\nconst GET_OFFER = gql`\n ${OFFER_FIELDS}\n query GetOffer($id: ID!) {\n housingvistaOffer(id: $id) {\n ...OfferFields\n }\n }\n`;\n\nconst VIEWING_FIELDS = gql`\n fragment ViewingFields on HousingVistaViewing {\n id\n propertyId\n scheduledAt\n type\n status\n attendeeName\n attendeeEmail\n notes\n createdAt\n updatedAt\n property {\n id\n title\n location {\n city\n state\n }\n images {\n id\n url\n isPrimary\n }\n }\n }\n`;\n\nconst GET_VIEWINGS = gql`\n ${VIEWING_FIELDS}\n query GetViewings($filter: HousingVistaViewingFilterInput, $pagination: HousingVistaPaginationInput) {\n housingvistaViewings(filter: $filter, pagination: $pagination) {\n ...ViewingFields\n }\n }\n`;\n\nconst GET_VIEWING = gql`\n ${VIEWING_FIELDS}\n query GetViewing($id: ID!) {\n housingvistaViewing(id: $id) {\n ...ViewingFields\n }\n }\n`;\n\nconst RENTAL_APPLICATION_FIELDS = gql`\n fragment RentalApplicationFields on HousingVistaRentalApplication {\n id\n rentalUnitId\n applicantName\n applicantEmail\n applicantPhone\n monthlyIncome\n moveInDate\n status\n reviewNotes\n reviewedAt\n createdAt\n updatedAt\n rentalUnit {\n id\n unitNumber\n propertyTitle\n monthlyRent\n }\n }\n`;\n\nconst GET_RENTAL_APPLICATIONS = gql`\n ${RENTAL_APPLICATION_FIELDS}\n query GetRentalApplications(\n $filter: HousingVistaRentalApplicationFilterInput\n $pagination: HousingVistaPaginationInput\n ) {\n housingvistaRentalApplications(filter: $filter, pagination: $pagination) {\n ...RentalApplicationFields\n }\n }\n`;\n\nconst MAINTENANCE_FIELDS = gql`\n fragment MaintenanceFields on HousingVistaMaintenanceRequest {\n id\n propertyId\n rentalUnitId\n title\n description\n category\n priority\n status\n resolutionNotes\n resolvedAt\n createdAt\n updatedAt\n }\n`;\n\nconst GET_MAINTENANCE_REQUESTS = gql`\n ${MAINTENANCE_FIELDS}\n query GetMaintenanceRequests(\n $filter: HousingVistaMaintenanceRequestFilterInput\n $pagination: HousingVistaPaginationInput\n ) {\n housingvistaMaintenanceRequests(filter: $filter, pagination: $pagination) {\n ...MaintenanceFields\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Mutation documents\n// ---------------------------------------------------------------------------\n\nconst CREATE_PROPERTY = gql`\n ${PROPERTY_FIELDS}\n mutation CreateHousingvistaProperty($input: HousingVistaCreatePropertyInput!) {\n createHousingvistaProperty(input: $input) {\n ...PropertyFields\n }\n }\n`;\n\nconst UPDATE_PROPERTY = gql`\n ${PROPERTY_FIELDS}\n mutation UpdateHousingvistaProperty($id: ID!, $input: HousingVistaUpdatePropertyInput!) {\n updateHousingvistaProperty(id: $id, input: $input) {\n ...PropertyFields\n }\n }\n`;\n\nconst DELETE_PROPERTY = gql`\n mutation DeleteHousingvistaProperty($id: ID!) {\n deleteHousingvistaProperty(id: $id)\n }\n`;\n\nconst SAVE_SHORTLIST = gql`\n ${SHORTLIST_FIELDS}\n mutation SaveHousingvistaShortlist($input: HousingVistaSaveShortlistInput!) {\n saveHousingvistaShortlist(input: $input) {\n ...ShortlistFields\n }\n }\n`;\n\nconst REMOVE_SHORTLIST = gql`\n mutation RemoveHousingvistaShortlist($propertyId: ID!) {\n removeHousingvistaShortlist(propertyId: $propertyId)\n }\n`;\n\nconst BOOK_VIEWING = gql`\n mutation BookHousingvistaViewing($input: HousingVistaBookViewingInput!) {\n bookHousingvistaViewing(input: $input) {\n id\n propertyId\n scheduledAt\n type\n status\n attendeeName\n attendeeEmail\n notes\n }\n }\n`;\n\nconst CANCEL_VIEWING = gql`\n mutation CancelHousingvistaViewing($id: ID!) {\n cancelHousingvistaViewing(id: $id) {\n id\n status\n }\n }\n`;\n\nconst SUBMIT_OFFER = gql`\n mutation SubmitHousingvistaOffer($input: HousingVistaSubmitOfferInput!) {\n submitHousingvistaOffer(input: $input) {\n id\n propertyId\n amount\n currency\n status\n notes\n createdAt\n }\n }\n`;\n\nconst RESPOND_OFFER = gql`\n mutation RespondHousingvistaOffer($id: ID!, $input: HousingVistaRespondOfferInput!) {\n respondHousingvistaOffer(id: $id, input: $input) {\n id\n status\n counterAmount\n respondedAt\n }\n }\n`;\n\nconst CREATE_TRANSACTION = gql`\n ${TRANSACTION_FIELDS}\n mutation CreateHousingvistaTransaction($input: HousingVistaCreateTransactionInput!) {\n createHousingvistaTransaction(input: $input) {\n ...TransactionFields\n }\n }\n`;\n\nconst CREATE_INVESTMENT = gql`\n ${INVESTMENT_FIELDS}\n mutation CreateHousingvistaInvestment($input: HousingVistaCreateInvestmentInput!) {\n createHousingvistaInvestment(input: $input) {\n ...InvestmentFields\n }\n }\n`;\n\nconst CREATE_RENTAL_UNIT = gql`\n mutation CreateHousingvistaRentalUnit($input: HousingVistaCreateRentalUnitInput!) {\n createHousingvistaRentalUnit(input: $input) {\n id\n propertyTitle\n unitNumber\n tenantName\n monthlyRent\n status\n }\n }\n`;\n\nconst SUBMIT_RENTAL_APPLICATION = gql`\n mutation SubmitHousingvistaRentalApplication($input: HousingVistaSubmitRentalApplicationInput!) {\n submitHousingvistaRentalApplication(input: $input) {\n id\n rentalUnitId\n applicantName\n status\n }\n }\n`;\n\nconst CREATE_AMC_CONTRACT = gql`\n mutation CreateHousingvistaAmcContract($input: HousingVistaCreateAmcContractInput!) {\n createHousingvistaAmcContract(input: $input) {\n id\n propertyTitle\n packageName\n providerName\n monthlyCost\n status\n }\n }\n`;\n\nconst CREATE_MAINTENANCE_REQUEST = gql`\n mutation CreateHousingvistaMaintenanceRequest($input: HousingVistaCreateMaintenanceRequestInput!) {\n createHousingvistaMaintenanceRequest(input: $input) {\n id\n title\n category\n priority\n status\n }\n }\n`;\n\nconst APPROVE_VERIFICATION = gql`\n mutation ApproveHousingvistaVerificationItem($id: ID!, $notes: String) {\n approveHousingvistaVerificationItem(id: $id, notes: $notes) {\n id\n status\n reviewerName\n notes\n }\n }\n`;\n\nconst REJECT_VERIFICATION = gql`\n mutation RejectHousingvistaVerificationItem($id: ID!, $notes: String) {\n rejectHousingvistaVerificationItem(id: $id, notes: $notes) {\n id\n status\n reviewerName\n notes\n }\n }\n`;\n\nconst WITHDRAW_OFFER = gql`\n mutation WithdrawHousingvistaOffer($id: ID!) {\n withdrawHousingvistaOffer(id: $id) {\n id\n status\n }\n }\n`;\n\nconst UPDATE_VIEWING = gql`\n mutation UpdateHousingvistaViewing($id: ID!, $input: HousingVistaUpdateViewingInput!) {\n updateHousingvistaViewing(id: $id, input: $input) {\n id\n scheduledAt\n status\n type\n notes\n }\n }\n`;\n\nconst UPDATE_INVESTMENT = gql`\n ${INVESTMENT_FIELDS}\n mutation UpdateHousingvistaInvestment($id: ID!, $input: HousingVistaUpdateInvestmentInput!) {\n updateHousingvistaInvestment(id: $id, input: $input) {\n ...InvestmentFields\n }\n }\n`;\n\nconst DELETE_INVESTMENT = gql`\n mutation DeleteHousingvistaInvestment($id: ID!) {\n deleteHousingvistaInvestment(id: $id)\n }\n`;\n\nconst CREATE_ASSET = gql`\n ${ASSET_FIELDS}\n mutation CreateHousingvistaAsset($input: HousingVistaCreateAssetInput!) {\n createHousingvistaAsset(input: $input) {\n ...AssetFields\n }\n }\n`;\n\nconst UPDATE_ASSET = gql`\n ${ASSET_FIELDS}\n mutation UpdateHousingvistaAsset($id: ID!, $input: HousingVistaUpdateAssetInput!) {\n updateHousingvistaAsset(id: $id, input: $input) {\n ...AssetFields\n }\n }\n`;\n\nconst DELETE_ASSET = gql`\n mutation DeleteHousingvistaAsset($id: ID!) {\n deleteHousingvistaAsset(id: $id)\n }\n`;\n\nconst UPDATE_AMC_CONTRACT = gql`\n mutation UpdateHousingvistaAmcContract($id: ID!, $input: HousingVistaUpdateAmcContractInput!) {\n updateHousingvistaAmcContract(id: $id, input: $input) {\n id\n status\n packageName\n providerName\n monthlyCost\n }\n }\n`;\n\nconst DELETE_AMC_CONTRACT = gql`\n mutation DeleteHousingvistaAmcContract($id: ID!) {\n deleteHousingvistaAmcContract(id: $id)\n }\n`;\n\nconst UPDATE_TRANSACTION = gql`\n ${TRANSACTION_FIELDS}\n mutation UpdateHousingvistaTransaction($id: ID!, $input: HousingVistaUpdateTransactionInput!) {\n updateHousingvistaTransaction(id: $id, input: $input) {\n ...TransactionFields\n }\n }\n`;\n\nconst DELETE_TRANSACTION = gql`\n mutation DeleteHousingvistaTransaction($id: ID!) {\n deleteHousingvistaTransaction(id: $id)\n }\n`;\n\nconst RESOLVE_MAINTENANCE = gql`\n ${MAINTENANCE_FIELDS}\n mutation ResolveHousingvistaMaintenanceRequest($id: ID!, $resolutionNotes: String) {\n resolveHousingvistaMaintenanceRequest(id: $id, resolutionNotes: $resolutionNotes) {\n ...MaintenanceFields\n }\n }\n`;\n\nconst REVIEW_RENTAL_APPLICATION = gql`\n ${RENTAL_APPLICATION_FIELDS}\n mutation ReviewHousingvistaRentalApplication($id: ID!, $input: HousingVistaReviewRentalApplicationInput!) {\n reviewHousingvistaRentalApplication(id: $id, input: $input) {\n ...RentalApplicationFields\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Query-result row shapes (as selected above)\n// ---------------------------------------------------------------------------\n\ninterface PropertyRow {\n id: string;\n title: string;\n description: string | null;\n type: Property['type'];\n status: Property['status'];\n category: string;\n verificationStatus: string;\n imageUrl: string | null;\n createdAt: string;\n updatedAt: string;\n price: Property['price'];\n location: Omit<Property['location'], 'coordinates'> & {\n coordinates: { latitude: number; longitude: number } | null;\n };\n specifications: Property['specifications'];\n amenities: Property['amenities'];\n images: Property['images'];\n}\n\ninterface TransactionRow {\n id: string;\n title: string;\n type: string;\n status: string;\n amount: number;\n currency: string;\n documents: unknown;\n milestones: unknown;\n parties: unknown;\n escrow: unknown;\n createdAt: string;\n updatedAt: string;\n property: PropertyRow | null;\n buyer: TxParty | null;\n seller: TxParty | null;\n tenant: TxParty | null;\n landlord: TxParty | null;\n}\n\ninterface TxParty {\n id: string | null;\n firstName: string | null;\n lastName: string | null;\n avatar: string | null;\n}\n\ninterface InvestmentRow {\n id: string;\n title: string;\n investmentType: string;\n totalValue: number;\n status: string;\n startDate: string;\n maturityDate: string | null;\n riskLevel: string;\n investors: unknown;\n returns: unknown;\n property: PropertyRow | null;\n}\n\ninterface ShortlistRow {\n id: string;\n propertyId: string;\n notes: string | null;\n createdAt: string;\n property: PropertyRow;\n}\n\n// ---------------------------------------------------------------------------\n// Mappers: GraphQL row → MFE domain type\n// ---------------------------------------------------------------------------\n\n/**\n * The domain `Property` carries display-only fields the subgraph does not\n * resolve (owner/documents/features/virtualTours/availability). We fill the\n * present fields from the query and default the rest to empty so consumers can\n * render honest empty-states rather than crashing on `undefined`.\n */\nconst mapProperty = (row: PropertyRow): Property => ({\n id: row.id,\n title: row.title,\n description: row.description ?? '',\n type: row.type,\n status: row.status,\n category: row.category as Property['category'],\n price: row.price,\n location: {\n ...row.location,\n coordinates: row.location.coordinates ?? { latitude: 0, longitude: 0 },\n },\n specifications: row.specifications,\n amenities: row.amenities ?? [],\n images: row.images ?? [],\n documents: [],\n virtualTours: [],\n owner: { id: '', name: '', email: '', phone: '', verified: false },\n features: [],\n verificationStatus: (row.verificationStatus as Property['verificationStatus']) ?? 'pending',\n availability: { available: true },\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n});\n\n// ---------------------------------------------------------------------------\n// Query hooks\n// ---------------------------------------------------------------------------\n\nexport const useDashboardStats = () => {\n const { data, loading, error } = useQuery<{ housingvistaDashboardStats: DashboardStats }>(GET_DASHBOARD_STATS);\n const empty: DashboardStats = {\n totalProperties: 0,\n totalValue: 0,\n occupancyRate: 0,\n monthlyRevenue: 0,\n activeTransactions: 0,\n pendingVerifications: 0,\n totalInvestments: 0,\n investmentReturns: 0,\n totalTenants: 0,\n maintenanceRequests: 0,\n unreadMessages: 0,\n upcomingViewings: 0,\n };\n return { data: data?.housingvistaDashboardStats ?? empty, loading, error };\n};\n\nexport const useRecentActivities = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaTransactions: TransactionRow[] }>(GET_TRANSACTIONS, {\n variables: getPaginationVariables(pagination),\n });\n const activities: RecentActivity[] = (data?.housingvistaTransactions ?? []).map((txn) => ({\n id: `act-${txn.id}`,\n type: 'transaction_update',\n title: `Transaction: ${txn.type}`,\n description: `${txn.property?.title ?? 'Property'} - ${txn.status}`,\n timestamp: txn.updatedAt || txn.createdAt,\n entityId: txn.id,\n entityType: 'transaction',\n actorName: txn.buyer\n ? `${txn.buyer.firstName ?? ''} ${txn.buyer.lastName ?? ''}`.trim()\n : txn.tenant\n ? `${txn.tenant.firstName ?? ''} ${txn.tenant.lastName ?? ''}`.trim()\n : 'System',\n actorAvatar: txn.buyer?.avatar ?? txn.tenant?.avatar ?? undefined,\n }));\n return { data: activities, loading, error };\n};\n\nexport const useProperties = (options?: { filter?: PropertyFilterInput; pagination?: PaginationInput }) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaProperties: PropertyRow[] }>(GET_PROPERTIES, {\n variables: {\n filter: options?.filter,\n ...getPaginationVariables(options?.pagination),\n },\n });\n return {\n data: (data?.housingvistaProperties ?? []).map(mapProperty),\n loading,\n error,\n refetch,\n };\n};\n\nexport const useProperty = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaProperty: PropertyRow | null }>(GET_PROPERTY, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return {\n data: data?.housingvistaProperty ? mapProperty(data.housingvistaProperty) : null,\n loading,\n error,\n };\n};\n\nexport const useTransactions = (options?: ListOptions<TransactionFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaTransactions: TransactionRow[] }>(GET_TRANSACTIONS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n // Transaction JSON columns (documents/milestones/parties/escrow) are opaque to\n // the schema; the page guards their runtime shape. Cast is localized here.\n return { data: (data?.housingvistaTransactions ?? []) as unknown as Transaction[], loading, error, refetch };\n};\n\nexport const useTransaction = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaTransaction: TransactionRow | null }>(GET_TRANSACTION, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return {\n data: (data?.housingvistaTransaction ?? null) as unknown as Transaction | null,\n loading,\n error,\n };\n};\n\nexport const useInvestments = (options?: ListOptions<InvestmentFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaInvestments: InvestmentRow[] }>(GET_INVESTMENTS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: (data?.housingvistaInvestments ?? []) as unknown as Investment[], loading, error, refetch };\n};\n\nexport const useInvestment = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaInvestment: InvestmentRow | null }>(GET_INVESTMENT, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: (data?.housingvistaInvestment ?? null) as unknown as Investment | null, loading, error };\n};\n\nexport const useRentalUnits = (options?: ListOptions<RentalUnitFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaRentalUnits: RentalUnit[] }>(GET_RENTAL_UNITS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaRentalUnits ?? [], loading, error, refetch };\n};\n\nexport const useAssets = (options?: ListOptions<AssetFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaAssets: Asset[] }>(GET_ASSETS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaAssets ?? [], loading, error, refetch };\n};\n\nexport const useAsset = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaAsset: Asset | null }>(GET_ASSET, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaAsset ?? null, loading, error };\n};\n\nexport const useAMCContracts = (options?: ListOptions<AmcContractFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaAmcContracts: AMCContract[] }>(GET_AMC_CONTRACTS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaAmcContracts ?? [], loading, error, refetch };\n};\n\nexport const useMarketplaceServices = (options?: ListOptions<MarketplaceServiceFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaMarketplaceServices: MarketplaceService[] }>(\n GET_MARKETPLACE_SERVICES,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaMarketplaceServices ?? [], loading, error, refetch };\n};\n\nexport const useMarketplaceService = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaMarketplaceService: MarketplaceService | null }>(\n GET_MARKETPLACE_SERVICE,\n { variables: { id: id ?? '' }, skip: !id }\n );\n return { data: data?.housingvistaMarketplaceService ?? null, loading, error };\n};\n\nexport const useVerifications = (options?: ListOptions<VerificationItemFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaVerificationItems: VerificationItem[] }>(\n GET_VERIFICATIONS,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaVerificationItems ?? [], loading, error, refetch };\n};\n\n/**\n * Single verification item. The detail view needs the audit timestamps\n * (`createdAt`/`updatedAt`) that the list type omits, so the result is typed as\n * `VerificationItem` extended with those ISO-string fields.\n */\nexport type VerificationItemDetail = VerificationItem & {\n createdAt: string;\n updatedAt: string;\n};\n\nexport const useVerificationItem = (id: string | undefined) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaVerificationItem: VerificationItemDetail | null }>(\n GET_VERIFICATION,\n { variables: { id: id ?? '' }, skip: !id }\n );\n return { data: data?.housingvistaVerificationItem ?? null, loading, error, refetch };\n};\n\nexport const useLegalServices = (options?: ListOptions<LegalServiceFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaLegalServices: LegalService[] }>(\n GET_LEGAL_SERVICES,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaLegalServices ?? [], loading, error, refetch };\n};\n\nexport const useLegalService = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaLegalService: LegalService | null }>(GET_LEGAL_SERVICE, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaLegalService ?? null, loading, error };\n};\n\nexport const useHomeLoans = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaHomeLoanOffers: HomeLoan[] }>(GET_HOME_LOANS, {\n variables: getPaginationVariables(pagination),\n });\n return { data: data?.housingvistaHomeLoanOffers ?? [], loading, error };\n};\n\nexport const useHomeLoanOffer = (id: string | undefined) => {\n const { data, loading, error } = useQuery<{ housingvistaHomeLoanOffer: HomeLoan | null }>(GET_HOME_LOAN, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaHomeLoanOffer ?? null, loading, error };\n};\n\nexport const useMarketTrends = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaMarketTrends: MarketTrend[] }>(GET_MARKET_TRENDS, {\n variables: getPaginationVariables(pagination),\n });\n return { data: data?.housingvistaMarketTrends ?? [], loading, error };\n};\n\nexport const useAreaInsights = (pagination?: PaginationInput) => {\n const { data, loading, error } = useQuery<{ housingvistaAreaInsights: AreaInsight[] }>(GET_AREA_INSIGHTS, {\n variables: getPaginationVariables(pagination),\n });\n return { data: data?.housingvistaAreaInsights ?? [], loading, error };\n};\n\nexport const useShortlists = (pagination?: PaginationInput) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaShortlists: ShortlistRow[] }>(GET_SHORTLISTS, {\n variables: getPaginationVariables(pagination),\n });\n const shortlists = (data?.housingvistaShortlists ?? []).map((row) => ({\n id: row.id,\n propertyId: row.propertyId,\n notes: row.notes ?? undefined,\n createdAt: row.createdAt,\n property: mapProperty(row.property),\n }));\n return { data: shortlists, loading, error, refetch };\n};\n\nexport const useAnalyticsData = () => {\n const { data, loading, error } = useQuery<{ housingvistaAnalytics: AnalyticsChartData }>(GET_ANALYTICS);\n return { data: data?.housingvistaAnalytics ?? null, loading, error };\n};\n\n// ---------------------------------------------------------------------------\n// Offers / Viewings / Rental applications / Maintenance — query hooks\n// ---------------------------------------------------------------------------\n\nexport interface OfferRow {\n id: string;\n propertyId: string;\n amount: number;\n counterAmount: number | null;\n currency: string;\n status: 'submitted' | 'countered' | 'accepted' | 'rejected' | 'withdrawn';\n notes: string | null;\n respondedAt: string | null;\n createdAt: string;\n updatedAt: string;\n property: {\n id: string;\n title: string;\n location: { city: string; state: string };\n images: { id: string; url: string; isPrimary: boolean }[];\n price: { amount: number; currency: string };\n } | null;\n}\n\nexport const useOffers = (options?: ListOptions<OfferFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaOffers: OfferRow[] }>(GET_OFFERS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaOffers ?? [], loading, error, refetch };\n};\n\nexport const useOffer = (id: string | undefined) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaOffer: OfferRow | null }>(GET_OFFER, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaOffer ?? null, loading, error, refetch };\n};\n\nexport interface ViewingRow {\n id: string;\n propertyId: string;\n scheduledAt: string;\n type: 'in_person' | 'virtual';\n status: 'requested' | 'confirmed' | 'completed' | 'cancelled';\n attendeeName: string | null;\n attendeeEmail: string | null;\n notes: string | null;\n createdAt: string;\n updatedAt: string;\n property: {\n id: string;\n title: string;\n location: { city: string; state: string };\n images: { id: string; url: string; isPrimary: boolean }[];\n } | null;\n}\n\nexport const useViewings = (options?: ListOptions<ViewingFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaViewings: ViewingRow[] }>(GET_VIEWINGS, {\n variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) },\n });\n return { data: data?.housingvistaViewings ?? [], loading, error, refetch };\n};\n\nexport const useViewing = (id: string | undefined) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaViewing: ViewingRow | null }>(GET_VIEWING, {\n variables: { id: id ?? '' },\n skip: !id,\n });\n return { data: data?.housingvistaViewing ?? null, loading, error, refetch };\n};\n\nexport interface RentalApplicationRow {\n id: string;\n rentalUnitId: string;\n applicantName: string;\n applicantEmail: string;\n applicantPhone: string | null;\n monthlyIncome: number | null;\n moveInDate: string | null;\n status: 'submitted' | 'screening' | 'approved' | 'rejected';\n reviewNotes: string | null;\n reviewedAt: string | null;\n createdAt: string;\n updatedAt: string;\n rentalUnit: {\n id: string;\n unitNumber: string;\n propertyTitle: string;\n monthlyRent: number;\n } | null;\n}\n\nexport const useRentalApplications = (options?: ListOptions<RentalApplicationFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaRentalApplications: RentalApplicationRow[] }>(\n GET_RENTAL_APPLICATIONS,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaRentalApplications ?? [], loading, error, refetch };\n};\n\nexport interface MaintenanceRequestRow {\n id: string;\n propertyId: string | null;\n rentalUnitId: string | null;\n title: string;\n description: string | null;\n category: string;\n priority: 'low' | 'medium' | 'high';\n status: 'open' | 'in_progress' | 'resolved';\n resolutionNotes: string | null;\n resolvedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport const useMaintenanceRequests = (options?: ListOptions<MaintenanceRequestFilterInput>) => {\n const { data, loading, error, refetch } = useQuery<{ housingvistaMaintenanceRequests: MaintenanceRequestRow[] }>(\n GET_MAINTENANCE_REQUESTS,\n { variables: { filter: options?.filter, ...getPaginationVariables(options?.pagination) } }\n );\n return { data: data?.housingvistaMaintenanceRequests ?? [], loading, error, refetch };\n};\n\n// ---------------------------------------------------------------------------\n// Mutation hooks\n// ---------------------------------------------------------------------------\n\nexport interface CreatePropertyInput {\n title: string;\n description?: string;\n status: PropertyStatus;\n type: PropertyType;\n category: string;\n address?: string;\n city: string;\n state: string;\n country?: string;\n pincode?: string;\n neighborhood?: string;\n landmarks?: string[];\n price: number;\n currency?: string;\n priceType?: string;\n pricePeriod?: string;\n negotiable?: boolean;\n pricePerSqft?: number;\n bedrooms: number;\n bathrooms: number;\n totalArea: number;\n carpetArea?: number;\n builtUpArea?: number;\n floors?: number;\n totalFloors?: number;\n parking?: number;\n balconies?: number;\n furnishingStatus?: string;\n ageOfProperty?: number;\n facing?: string;\n amenities?: { name: string; category: string; available?: boolean }[];\n images?: { url: string; title?: string; type?: string; order?: number; isPrimary?: boolean }[];\n imageUrl?: string;\n}\n\nexport type UpdatePropertyInput = Partial<CreatePropertyInput>;\n\nexport const useCreateProperty = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaProperty: PropertyRow },\n { input: CreatePropertyInput }\n >(CREATE_PROPERTY, { refetchQueries: ['GetProperties'], awaitRefetchQueries: true });\n const createProperty = async (input: CreatePropertyInput): Promise<Property> => {\n const res = await mutate({ variables: { input } });\n if (!res.data) throw new Error('Property was not created');\n return mapProperty(res.data.createHousingvistaProperty);\n };\n return { createProperty, loading };\n};\n\nexport const useUpdateProperty = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaProperty: PropertyRow },\n { id: string; input: UpdatePropertyInput }\n >(UPDATE_PROPERTY);\n const updateProperty = async (id: string, input: UpdatePropertyInput): Promise<Property> => {\n const res = await mutate({ variables: { id, input } });\n if (!res.data) throw new Error('Property was not updated');\n return mapProperty(res.data.updateHousingvistaProperty);\n };\n return { updateProperty, loading };\n};\n\nexport const useDeleteProperty = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaProperty: boolean }, { id: string }>(DELETE_PROPERTY, {\n refetchQueries: ['GetProperties'],\n awaitRefetchQueries: true,\n });\n const deleteProperty = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaProperty ?? false;\n };\n return { deleteProperty, loading };\n};\n\nexport const useSaveShortlist = () => {\n const [mutate, { loading }] = useMutation<\n { saveHousingvistaShortlist: ShortlistRow },\n { input: { propertyId: string; notes?: string } }\n >(SAVE_SHORTLIST, { refetchQueries: ['GetShortlists'], awaitRefetchQueries: true });\n const saveShortlist = async (propertyId: string, notes?: string) => {\n await mutate({ variables: { input: { propertyId, notes } } });\n };\n return { saveShortlist, loading };\n};\n\nexport const useRemoveShortlist = () => {\n const [mutate, { loading }] = useMutation<{ removeHousingvistaShortlist: boolean }, { propertyId: string }>(\n REMOVE_SHORTLIST,\n { refetchQueries: ['GetShortlists'], awaitRefetchQueries: true }\n );\n const removeShortlist = async (propertyId: string) => {\n await mutate({ variables: { propertyId } });\n };\n return { removeShortlist, loading };\n};\n\nexport interface BookViewingInput {\n propertyId: string;\n scheduledAt: string;\n type?: 'in_person' | 'virtual';\n attendeeName?: string;\n attendeeEmail?: string;\n notes?: string;\n}\n\nexport const useBookViewing = () => {\n const [mutate, { loading }] = useMutation<{ bookHousingvistaViewing: { id: string } }, { input: BookViewingInput }>(\n BOOK_VIEWING\n );\n const bookViewing = async (input: BookViewingInput) => {\n await mutate({ variables: { input } });\n };\n return { bookViewing, loading };\n};\n\nexport const useCancelViewing = () => {\n const [mutate, { loading }] = useMutation<{ cancelHousingvistaViewing: { id: string } }, { id: string }>(\n CANCEL_VIEWING\n );\n const cancelViewing = async (id: string) => {\n await mutate({ variables: { id } });\n };\n return { cancelViewing, loading };\n};\n\nexport interface SubmitOfferInput {\n propertyId: string;\n amount: number;\n currency?: string;\n notes?: string;\n}\n\nexport const useSubmitOffer = () => {\n const [mutate, { loading }] = useMutation<{ submitHousingvistaOffer: { id: string } }, { input: SubmitOfferInput }>(\n SUBMIT_OFFER\n );\n const submitOffer = async (input: SubmitOfferInput) => {\n await mutate({ variables: { input } });\n };\n return { submitOffer, loading };\n};\n\nexport const useRespondOffer = () => {\n const [mutate, { loading }] = useMutation<\n { respondHousingvistaOffer: { id: string } },\n { id: string; input: { action: 'accept' | 'reject' | 'counter'; counterAmount?: number; notes?: string } }\n >(RESPOND_OFFER);\n const respondOffer = async (\n id: string,\n input: { action: 'accept' | 'reject' | 'counter'; counterAmount?: number; notes?: string }\n ) => {\n await mutate({ variables: { id, input } });\n };\n return { respondOffer, loading };\n};\n\nexport interface CreateTransactionInput {\n propertyId: string;\n title: string;\n type: string;\n status: string;\n amount: number;\n currency?: string;\n}\n\nexport const useCreateTransaction = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaTransaction: TransactionRow },\n { input: CreateTransactionInput }\n >(CREATE_TRANSACTION, { refetchQueries: ['GetTransactions'], awaitRefetchQueries: true });\n const createTransaction = async (input: CreateTransactionInput) => {\n await mutate({ variables: { input } });\n };\n return { createTransaction, loading };\n};\n\nexport interface CreateInvestmentInput {\n propertyId: string;\n title: string;\n status: string;\n investmentType: string;\n riskLevel: string;\n totalValue: number;\n startDate?: string;\n maturityDate?: string;\n}\n\nexport const useCreateInvestment = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaInvestment: InvestmentRow },\n { input: CreateInvestmentInput }\n >(CREATE_INVESTMENT, { refetchQueries: ['GetInvestments'], awaitRefetchQueries: true });\n const createInvestment = async (input: CreateInvestmentInput) => {\n await mutate({ variables: { input } });\n };\n return { createInvestment, loading };\n};\n\nexport interface CreateRentalUnitInput {\n propertyId?: string;\n propertyTitle: string;\n unitNumber: string;\n tenantName: string;\n tenantEmail: string;\n tenantPhone?: string;\n monthlyRent: number;\n leaseStart: string;\n leaseEnd: string;\n status: string;\n paymentStatus: string;\n securityDeposit?: number;\n}\n\nexport const useCreateRentalUnit = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaRentalUnit: { id: string } },\n { input: CreateRentalUnitInput }\n >(CREATE_RENTAL_UNIT, { refetchQueries: ['GetRentalUnits'], awaitRefetchQueries: true });\n const createRentalUnit = async (input: CreateRentalUnitInput) => {\n await mutate({ variables: { input } });\n };\n return { createRentalUnit, loading };\n};\n\nexport interface SubmitRentalApplicationInput {\n rentalUnitId: string;\n applicantName: string;\n applicantEmail: string;\n applicantPhone?: string;\n monthlyIncome?: number;\n moveInDate?: string;\n}\n\nexport const useSubmitRentalApplication = () => {\n const [mutate, { loading }] = useMutation<\n { submitHousingvistaRentalApplication: { id: string } },\n { input: SubmitRentalApplicationInput }\n >(SUBMIT_RENTAL_APPLICATION);\n const submitRentalApplication = async (input: SubmitRentalApplicationInput) => {\n await mutate({ variables: { input } });\n };\n return { submitRentalApplication, loading };\n};\n\nexport interface CreateAmcContractInput {\n propertyId?: string;\n propertyTitle: string;\n packageName: string;\n providerName: string;\n monthlyCost: number;\n startDate: string;\n endDate: string;\n nextServiceDate?: string;\n status: string;\n servicesIncluded?: string[];\n}\n\nexport const useCreateAmcContract = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaAmcContract: { id: string } },\n { input: CreateAmcContractInput }\n >(CREATE_AMC_CONTRACT, { refetchQueries: ['GetAmcContracts'], awaitRefetchQueries: true });\n const createAmcContract = async (input: CreateAmcContractInput) => {\n await mutate({ variables: { input } });\n };\n return { createAmcContract, loading };\n};\n\nexport interface CreateMaintenanceRequestInput {\n propertyId?: string;\n rentalUnitId?: string;\n title: string;\n description?: string;\n category: string;\n priority?: 'low' | 'medium' | 'high';\n}\n\nexport const useCreateMaintenanceRequest = () => {\n const [mutate, { loading }] = useMutation<\n { createHousingvistaMaintenanceRequest: { id: string } },\n { input: CreateMaintenanceRequestInput }\n >(CREATE_MAINTENANCE_REQUEST);\n const createMaintenanceRequest = async (input: CreateMaintenanceRequestInput) => {\n await mutate({ variables: { input } });\n };\n return { createMaintenanceRequest, loading };\n};\n\nexport const useApproveVerification = () => {\n const [mutate, { loading }] = useMutation<\n { approveHousingvistaVerificationItem: { id: string } },\n { id: string; notes?: string }\n >(APPROVE_VERIFICATION, { refetchQueries: ['GetVerifications'], awaitRefetchQueries: true });\n const approveVerification = async (id: string, notes?: string) => {\n await mutate({ variables: { id, notes } });\n };\n return { approveVerification, loading };\n};\n\nexport const useRejectVerification = () => {\n const [mutate, { loading }] = useMutation<\n { rejectHousingvistaVerificationItem: { id: string } },\n { id: string; notes?: string }\n >(REJECT_VERIFICATION, { refetchQueries: ['GetVerifications'], awaitRefetchQueries: true });\n const rejectVerification = async (id: string, notes?: string) => {\n await mutate({ variables: { id, notes } });\n };\n return { rejectVerification, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Offer / Viewing owner-side + lifecycle mutation hooks\n// ---------------------------------------------------------------------------\n\nexport const useWithdrawOffer = () => {\n const [mutate, { loading }] = useMutation<{ withdrawHousingvistaOffer: { id: string } }, { id: string }>(\n WITHDRAW_OFFER,\n { refetchQueries: ['GetOffers', 'GetOffer'], awaitRefetchQueries: true }\n );\n const withdrawOffer = async (id: string) => {\n await mutate({ variables: { id } });\n };\n return { withdrawOffer, loading };\n};\n\nexport interface UpdateViewingInput {\n scheduledAt?: string;\n status?: 'requested' | 'confirmed' | 'completed' | 'cancelled';\n type?: 'in_person' | 'virtual';\n attendeeName?: string;\n attendeeEmail?: string;\n notes?: string;\n}\n\nexport const useUpdateViewing = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaViewing: { id: string } },\n { id: string; input: UpdateViewingInput }\n >(UPDATE_VIEWING, { refetchQueries: ['GetViewings', 'GetViewing'], awaitRefetchQueries: true });\n const updateViewing = async (id: string, input: UpdateViewingInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateViewing, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Investment update / delete\n// ---------------------------------------------------------------------------\n\nexport interface UpdateInvestmentInput {\n title?: string;\n investmentType?: string;\n status?: string;\n riskLevel?: string;\n totalValue?: number;\n startDate?: string;\n maturityDate?: string;\n}\n\nexport const useUpdateInvestment = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaInvestment: InvestmentRow },\n { id: string; input: UpdateInvestmentInput }\n >(UPDATE_INVESTMENT, { refetchQueries: ['GetInvestments', 'GetInvestment'], awaitRefetchQueries: true });\n const updateInvestment = async (id: string, input: UpdateInvestmentInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateInvestment, loading };\n};\n\nexport const useDeleteInvestment = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaInvestment: boolean }, { id: string }>(\n DELETE_INVESTMENT,\n { refetchQueries: ['GetInvestments'], awaitRefetchQueries: true }\n );\n const deleteInvestment = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaInvestment ?? false;\n };\n return { deleteInvestment, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Asset create / update / delete\n// ---------------------------------------------------------------------------\n\nexport interface CreateAssetInput {\n title: string;\n type: string;\n category: string;\n location: string;\n currentValue: number;\n purchasePrice: number;\n purchaseDate?: string;\n appreciationPercent?: number;\n rentalYield?: number;\n status: string;\n imageUrl?: string;\n lastValuationDate?: string;\n}\n\nexport const useCreateAsset = () => {\n const [mutate, { loading }] = useMutation<{ createHousingvistaAsset: Asset }, { input: CreateAssetInput }>(\n CREATE_ASSET,\n { refetchQueries: ['GetAssets'], awaitRefetchQueries: true }\n );\n const createAsset = async (input: CreateAssetInput) => {\n await mutate({ variables: { input } });\n };\n return { createAsset, loading };\n};\n\nexport type UpdateAssetInput = Partial<CreateAssetInput>;\n\nexport const useUpdateAsset = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaAsset: Asset },\n { id: string; input: UpdateAssetInput }\n >(UPDATE_ASSET, { refetchQueries: ['GetAssets', 'GetAsset'], awaitRefetchQueries: true });\n const updateAsset = async (id: string, input: UpdateAssetInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateAsset, loading };\n};\n\nexport const useDeleteAsset = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaAsset: boolean }, { id: string }>(DELETE_ASSET, {\n refetchQueries: ['GetAssets'],\n awaitRefetchQueries: true,\n });\n const deleteAsset = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaAsset ?? false;\n };\n return { deleteAsset, loading };\n};\n\n// ---------------------------------------------------------------------------\n// AMC update / delete\n// ---------------------------------------------------------------------------\n\nexport type UpdateAmcContractInput = Partial<CreateAmcContractInput>;\n\nexport const useUpdateAmcContract = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaAmcContract: { id: string } },\n { id: string; input: UpdateAmcContractInput }\n >(UPDATE_AMC_CONTRACT, { refetchQueries: ['GetAmcContracts'], awaitRefetchQueries: true });\n const updateAmcContract = async (id: string, input: UpdateAmcContractInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateAmcContract, loading };\n};\n\nexport const useDeleteAmcContract = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaAmcContract: boolean }, { id: string }>(\n DELETE_AMC_CONTRACT,\n { refetchQueries: ['GetAmcContracts'], awaitRefetchQueries: true }\n );\n const deleteAmcContract = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaAmcContract ?? false;\n };\n return { deleteAmcContract, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Transaction update / delete\n// ---------------------------------------------------------------------------\n\nexport interface UpdateTransactionInput {\n title?: string;\n type?: string;\n status?: string;\n amount?: number;\n currency?: string;\n documents?: unknown;\n}\n\nexport const useUpdateTransaction = () => {\n const [mutate, { loading }] = useMutation<\n { updateHousingvistaTransaction: TransactionRow },\n { id: string; input: UpdateTransactionInput }\n >(UPDATE_TRANSACTION, { refetchQueries: ['GetTransactions', 'GetTransaction'], awaitRefetchQueries: true });\n const updateTransaction = async (id: string, input: UpdateTransactionInput) => {\n await mutate({ variables: { id, input } });\n };\n return { updateTransaction, loading };\n};\n\nexport const useDeleteTransaction = () => {\n const [mutate, { loading }] = useMutation<{ deleteHousingvistaTransaction: boolean }, { id: string }>(\n DELETE_TRANSACTION,\n { refetchQueries: ['GetTransactions'], awaitRefetchQueries: true }\n );\n const deleteTransaction = async (id: string): Promise<boolean> => {\n const res = await mutate({ variables: { id } });\n return res.data?.deleteHousingvistaTransaction ?? false;\n };\n return { deleteTransaction, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Maintenance resolve + Rental-application review\n// ---------------------------------------------------------------------------\n\nexport const useResolveMaintenanceRequest = () => {\n const [mutate, { loading }] = useMutation<\n { resolveHousingvistaMaintenanceRequest: MaintenanceRequestRow },\n { id: string; resolutionNotes?: string }\n >(RESOLVE_MAINTENANCE, { refetchQueries: ['GetMaintenanceRequests'], awaitRefetchQueries: true });\n const resolveMaintenanceRequest = async (id: string, resolutionNotes?: string) => {\n await mutate({ variables: { id, resolutionNotes } });\n };\n return { resolveMaintenanceRequest, loading };\n};\n\nexport interface ReviewRentalApplicationInput {\n decision: 'approved' | 'rejected' | 'screening' | 'submitted';\n reviewNotes?: string;\n}\n\nexport const useReviewRentalApplication = () => {\n const [mutate, { loading }] = useMutation<\n { reviewHousingvistaRentalApplication: RentalApplicationRow },\n { id: string; input: ReviewRentalApplicationInput }\n >(REVIEW_RENTAL_APPLICATION, { refetchQueries: ['GetRentalApplications'], awaitRefetchQueries: true });\n const reviewRentalApplication = async (id: string, input: ReviewRentalApplicationInput) => {\n await mutate({ variables: { id, input } });\n };\n return { reviewRentalApplication, loading };\n};\n\n// ---------------------------------------------------------------------------\n// Platform-service reuse (conversations / files) — re-exported from ./platform\n// ---------------------------------------------------------------------------\n\nexport {\n useContactConversation,\n useSendMessage,\n useConversationMessages,\n useEntityComments,\n useCreateEntityComment,\n useFileUpload,\n} from './platform';\nexport type { HvContextTarget, HvConversationMessage, HvEntityComment, HvUploadedFile } from './platform';\n\n// Analytics\nexport { useHousingVistaAnalytics } from './useHousingVistaAnalytics';\n"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { useCallback as e, useEffect as t } from "react";
2
+ import { useEventBus as n } from "@burdenoff/fe-libs/shared/events";
3
+ //#region src/housingvista/hooks/useHousingVistaAnalytics.ts
4
+ function r() {
5
+ try {
6
+ let e = localStorage.getItem("burdenoff-active-context-workspace");
7
+ if (e) return e;
8
+ let t = sessionStorage.getItem("bf-active-profile");
9
+ if (!t) return;
10
+ let n = localStorage.getItem(`bf-p-${t}-context`);
11
+ return n ? JSON.parse(n).workspaceId : void 0;
12
+ } catch {
13
+ return;
14
+ }
15
+ }
16
+ function i() {
17
+ let t = n(), i = r(), a = e((e, n = {}) => {
18
+ t.emit(e, {
19
+ workspaceId: i,
20
+ ...n
21
+ });
22
+ }, [t, i]), o = e((e, n) => {
23
+ t.emit(e, {
24
+ workspaceId: i,
25
+ id: n
26
+ });
27
+ }, [t, i]);
28
+ return {
29
+ emit: a,
30
+ emitResource: o,
31
+ emitSearch: e((e) => {
32
+ t.emit("housingvista.search.performed", {
33
+ workspaceId: i,
34
+ category: e
35
+ });
36
+ }, [t, i]),
37
+ emitExport: e((e) => {
38
+ t.emit("housingvista.export.requested", {
39
+ workspaceId: i,
40
+ entityType: e
41
+ });
42
+ }, [t, i]),
43
+ trackPageView: e((e, t) => {
44
+ o(e, t);
45
+ }, [o])
46
+ };
47
+ }
48
+ function a(e, n) {
49
+ let { trackPageView: r } = i();
50
+ t(() => {
51
+ r(e, n);
52
+ }, [e, n]);
53
+ }
54
+ //#endregion
55
+ export { i as useHousingVistaAnalytics, a as useTrackPageView };
56
+
57
+ //# sourceMappingURL=useHousingVistaAnalytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHousingVistaAnalytics.js","names":[],"sources":["../../../src/housingvista/hooks/useHousingVistaAnalytics.ts"],"sourcesContent":["/**\n * HousingVista analytics helpers.\n *\n * Emits events on the shared shell event bus. The app shell's RybbitSink\n * forwards allow-listed fact events to Rybbit Cloud for product analytics.\n */\n\nimport { useCallback, useEffect } from 'react';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\nimport type {\n HousingVistaWorkspacePayload,\n HousingVistaResourcePayload,\n HousingVistaSearchPayload,\n HousingVistaExportPayload,\n} from '@burdenoff/fe-libs/shared/events';\n\ntype EventName =\n | 'housingvista.dashboard.viewed'\n | 'housingvista.property.create_clicked'\n | 'housingvista.property.created'\n | 'housingvista.property.updated'\n | 'housingvista.property.deleted'\n | 'housingvista.property.viewed'\n | 'housingvista.shortlist.property_added'\n | 'housingvista.transaction.create_clicked'\n | 'housingvista.transaction.created'\n | 'housingvista.transaction.updated'\n | 'housingvista.transaction.viewed'\n | 'housingvista.investment.create_clicked'\n | 'housingvista.investment.created'\n | 'housingvista.investment.viewed'\n | 'housingvista.offer.create_clicked'\n | 'housingvista.offer.created'\n | 'housingvista.offer.viewed'\n | 'housingvista.viewing.schedule_clicked'\n | 'housingvista.viewing.scheduled'\n | 'housingvista.chat.conversation_opened'\n | 'housingvista.chat.message_sent'\n | 'housingvista.analytics.viewed'\n | 'housingvista.rental.viewed'\n | 'housingvista.asset.create_clicked'\n | 'housingvista.asset.created'\n | 'housingvista.asset.updated'\n | 'housingvista.asset.viewed'\n | 'housingvista.amc.purchased'\n | 'housingvista.amc.viewed'\n | 'housingvista.marketplace.viewed'\n | 'housingvista.marketplace.service_contact_clicked'\n | 'housingvista.verification.submit_clicked'\n | 'housingvista.verification.submitted'\n | 'housingvista.verification.viewed'\n | 'housingvista.legal.viewed'\n | 'housingvista.legal.service_contact_clicked'\n | 'housingvista.home_loan.apply_clicked'\n | 'housingvista.home_loan.viewed'\n | 'housingvista.market_analytics.viewed'\n | 'housingvista.market_analytics.area_viewed'\n | 'housingvista.search.performed'\n | 'housingvista.export.requested';\n\nfunction useWorkspaceId(): string | undefined {\n try {\n const activeContextValue = localStorage.getItem('burdenoff-active-context-workspace');\n if (activeContextValue) return activeContextValue;\n\n const activeProfileId = sessionStorage.getItem('bf-active-profile');\n if (!activeProfileId) return undefined;\n const raw = localStorage.getItem(`bf-p-${activeProfileId}-context`);\n if (!raw) return undefined;\n const context = JSON.parse(raw) as { workspaceId?: string };\n return context.workspaceId;\n } catch {\n return undefined;\n }\n}\n\nexport function useHousingVistaAnalytics() {\n const bus = useEventBus();\n const workspaceId = useWorkspaceId();\n\n const emit = useCallback(\n (name: EventName, payload: HousingVistaWorkspacePayload = {}) => {\n bus.emit(name, { workspaceId, ...payload });\n },\n [bus, workspaceId]\n );\n\n const emitResource = useCallback(\n (name: EventName, id?: string) => {\n bus.emit(name, { workspaceId, id } as HousingVistaResourcePayload);\n },\n [bus, workspaceId]\n );\n\n const emitSearch = useCallback(\n (category?: string) => {\n bus.emit('housingvista.search.performed', { workspaceId, category } as HousingVistaSearchPayload);\n },\n [bus, workspaceId]\n );\n\n const emitExport = useCallback(\n (entityType?: string) => {\n bus.emit('housingvista.export.requested', { workspaceId, entityType } as HousingVistaExportPayload);\n },\n [bus, workspaceId]\n );\n\n const trackPageView = useCallback(\n (name: EventName, id?: string) => {\n emitResource(name, id);\n },\n [emitResource]\n );\n\n return { emit, emitResource, emitSearch, emitExport, trackPageView };\n}\n\n/**\n * Emit a page-view event once on mount.\n */\nexport function useTrackPageView(name: EventName, id?: string) {\n const { trackPageView } = useHousingVistaAnalytics();\n useEffect(() => {\n trackPageView(name, id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, id]);\n}\n"],"mappings":";;;AA4DA,SAAS,IAAqC;AAC5C,KAAI;EACF,IAAM,IAAqB,aAAa,QAAQ,qCAAqC;AACrF,MAAI,EAAoB,QAAO;EAE/B,IAAM,IAAkB,eAAe,QAAQ,oBAAoB;AACnE,MAAI,CAAC,EAAiB;EACtB,IAAM,IAAM,aAAa,QAAQ,QAAQ,EAAgB,UAAU;AAGnE,SAFK,IACW,KAAK,MAAM,EAAI,CAChB,cAFL;SAGJ;AACN;;;AAIJ,SAAgB,IAA2B;CACzC,IAAM,IAAM,GAAa,EACnB,IAAc,GAAgB,EAE9B,IAAO,GACV,GAAiB,IAAwC,EAAE,KAAK;AAC/D,IAAI,KAAK,GAAM;GAAE;GAAa,GAAG;GAAS,CAAC;IAE7C,CAAC,GAAK,EAAY,CACnB,EAEK,IAAe,GAClB,GAAiB,MAAgB;AAChC,IAAI,KAAK,GAAM;GAAE;GAAa;GAAI,CAAgC;IAEpE,CAAC,GAAK,EAAY,CACnB;AAuBD,QAAO;EAAE;EAAM;EAAc,YArBV,GAChB,MAAsB;AACrB,KAAI,KAAK,iCAAiC;IAAE;IAAa;IAAU,CAA8B;KAEnG,CAAC,GAAK,EAAY,CACnB;EAgBwC,YAdtB,GAChB,MAAwB;AACvB,KAAI,KAAK,iCAAiC;IAAE;IAAa;IAAY,CAA8B;KAErG,CAAC,GAAK,EAAY,CACnB;EASoD,eAP/B,GACnB,GAAiB,MAAgB;AAChC,KAAa,GAAM,EAAG;KAExB,CAAC,EAAa,CACf;EAEmE;;AAMtE,SAAgB,EAAiB,GAAiB,GAAa;CAC7D,IAAM,EAAE,qBAAkB,GAA0B;AACpD,SAAgB;AACd,IAAc,GAAM,EAAG;IAEtB,CAAC,GAAM,EAAG,CAAC"}
@@ -1,3 +1,5 @@
1
1
  import "./context/HousingVistaContext.js";
2
+ import "./hooks/useHousingVistaAnalytics.js";
2
3
  import "./HousingVistaRoot.js";
4
+ import "./services/createSandboxAssistantTransport.js";
3
5
  import "./store/housingvistaStore.js";