import { useMemo, useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Building2, Gavel, MapPin } from "lucide-react"; import { api } from "@/api/client"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Skeleton } from "@/components/ui/skeleton"; import { SearchBar, SearchQuery } from "@/components/SearchBar"; import { DealsTable } from "@/components/DealsTable"; import { AppraisalsTable } from "@/components/AppraisalsTable"; function useAddressInfo(address: string | undefined) { return useQuery({ queryKey: ["address", address], queryFn: () => api.searchAddress(address!), enabled: !!address, }); } function useDeals(query: SearchQuery | null) { return useQuery({ queryKey: ["deals", query], queryFn: () => api.searchDeals({ address: query!.address!, years_back: 3, radius_meters: 100, max_deals: 50, }), enabled: !!query && query.mode === "address" && !!query.address, }); } function useAppraisals(query: SearchQuery | null, blockOverride?: string, plotOverride?: string) { // For "address" mode, we feed in block/plot resolved by the address lookup. const block = query?.block || blockOverride; const plot = query?.plot || plotOverride; const appraiser = query?.appraiser; return useQuery({ queryKey: ["appraisals", { block, plot, appraiser }], queryFn: () => api.searchAppraisals({ block, plot, decisive_appraiser: appraiser, max_results: 30, }), enabled: Boolean(block || appraiser), }); } export default function App() { const [query, setQuery] = useState(null); const addressInfo = useAddressInfo( query?.mode === "address" ? query.address : undefined ); const resolvedBlock = addressInfo.data?.gush_helka?.block ?? undefined; const resolvedPlot = addressInfo.data?.gush_helka?.plot ?? undefined; const deals = useDeals(query); const appraisals = useAppraisals(query, resolvedBlock, resolvedPlot); const isLoadingTopBar = addressInfo.isFetching || deals.isFetching || appraisals.isFetching; // Default tab: appraiser-only search → appraisals; otherwise → deals. const defaultTab = useMemo( () => (query?.mode === "appraiser" ? "appraisals" : "deals"), [query?.mode] ); return (

נדל"ן ושמאי מכריע

חיפוש עסקאות נדל"ן והחלטות שמאי מכריע — Marcus-Law

מקורות:{" "} Govmap ·{" "} משרד המשפטים
חיפוש חפש לפי כתובת מלאה (להצגת עסקאות נדל"ן + החלטות שמאי באותו גוש), לפי גוש וחלקה ספציפיים, או לפי שם של שמאי מכריע. {!query && ( הזן כתובת כדי להתחיל. עסקאות מתקבלות מ-Govmap, החלטות שמאי מ-gov.il. )} {query && ( <> {/* Address resolution summary */} {query.mode === "address" && ( {query.address} {addressInfo.isFetching && "מאתר את הכתובת..."} {addressInfo.data?.gush_helka && ( <> זוהה: גוש{" "} {addressInfo.data.gush_helka.block || "?"} {addressInfo.data.gush_helka.plot && ( <> {" "}חלקה{" "} {addressInfo.data.gush_helka.plot} )} )} {addressInfo.data && !addressInfo.data.gush_helka && ( לא נמצאו פרטי גוש/חלקה לכתובת זו — חיפוש שמאי לפי כתובת לא יבוצע. )} )} עסקאות נדל"ן {deals.data && ( {deals.data.total} )} שמאי מכריע {appraisals.data && ( {appraisals.data.returned} )} {deals.isFetching && } {deals.error && ( )} {deals.data && !deals.isFetching && ( )} {!deals.isFetching && !deals.error && !deals.data && (
חיפוש עסקאות זמין רק לפי כתובת.
)}
{appraisals.isFetching && } {appraisals.error && ( )} {appraisals.data && !appraisals.isFetching && ( )} {!appraisals.isFetching && !appraisals.error && !appraisals.data && (
{query.mode === "address" ? "ממתין לזיהוי גוש/חלקה..." : "אין נתונים."}
)}
)}
); } function TableSkeleton() { return (
{[...Array(5)].map((_, i) => ( ))}
); } function ErrorBox({ error }: { error: string }) { return (
שגיאה: {error}
); }