diff --git a/src/app/portfolio/[slug]/remote-assessment/AddressSearch.tsx b/src/app/portfolio/[slug]/remote-assessment/AddressSearch.tsx new file mode 100644 index 0000000..d434f79 --- /dev/null +++ b/src/app/portfolio/[slug]/remote-assessment/AddressSearch.tsx @@ -0,0 +1,133 @@ +"use client"; + +import { useState } from "react"; +import { Button } from "@/app/shadcn_components/ui/button"; +import { Input } from "@/app/shadcn_components/ui/input"; +import { Card } from "@/app/shadcn_components/ui/card"; +import { Pencil } from "lucide-react"; +import { + Select, + SelectTrigger, + SelectContent, + SelectItem, + SelectValue, +} from "@/app/shadcn_components/ui/select"; + +export default function AddressSearch({ + onAddressSelect, +}: { + onAddressSelect?: (address: string | null) => void; +}) { + const [postcode, setPostcode] = useState(""); + const [addresses, setAddresses] = useState([]); + const [selectedAddress, setSelectedAddress] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [showDropdown, setShowDropdown] = useState(false); + + async function handleSearch() { + setError(null); + setAddresses([]); + if (!postcode.trim()) { + setError("Please enter a postcode"); + return; + } + + setLoading(true); + await new Promise((r) => setTimeout(r, 800)); + + // ✅ Replace with OS Places or postcode.io lookup later + setAddresses([ + "10 Downing Street, London, SW1A 2AA", + "11 Downing Street, London, SW1A 2AA", + "12 Downing Street, London, SW1A 2AA", + ]); + + setLoading(false); + setShowDropdown(true); + } + + function handleSelectAddress(value: string) { + setSelectedAddress(value); + setShowDropdown(false); + if (onAddressSelect) onAddressSelect(value); + } + + function handleChangeAddress() { + setSelectedAddress(null); + setShowDropdown(true); + if (onAddressSelect) onAddressSelect(null); + } + + return ( + +

+ Step 1: Search for Address +

+ + {/* Hide postcode/search once address is selected */} + {!selectedAddress && ( +
+ setPostcode(e.target.value.toUpperCase())} + className="text-lg" + /> + +
+ )} + + {error &&

{error}

} + + {/* Address Dropdown */} + {showDropdown && addresses.length > 0 && ( +
+ + +
+ )} + + {/* Selected Address */} + {selectedAddress && !showDropdown && ( +
+

+ Selected Address +

+

{selectedAddress}

+ +
+ )} +
+ ); +} diff --git a/src/app/portfolio/[slug]/remote-assessment/RemoteAssessmentClient.tsx b/src/app/portfolio/[slug]/remote-assessment/RemoteAssessmentClient.tsx new file mode 100644 index 0000000..dcc81e4 --- /dev/null +++ b/src/app/portfolio/[slug]/remote-assessment/RemoteAssessmentClient.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { useState } from "react"; +import AddressSearch from "./AddressSearch"; +import ScenarioSetup from "./ScenarioSetup"; +import RunAssessment from "./RunAssessment"; + +export default function RemoteAssessmentClient({ + portfolioId, + scenarios, +}: { + portfolioId: string; + scenarios: { + id: string; + name: string; + housingType: string; + goal: string; + goalValue: string | null; + }[]; +}) { + const [selectedAddress, setSelectedAddress] = useState(null); + + return ( +
+

+ Remote Assessment +

+ + + +
+ +
+ +
+ +
+
+ ); +} diff --git a/src/app/portfolio/[slug]/remote-assessment/RunAssessment.tsx b/src/app/portfolio/[slug]/remote-assessment/RunAssessment.tsx new file mode 100644 index 0000000..6a5f584 --- /dev/null +++ b/src/app/portfolio/[slug]/remote-assessment/RunAssessment.tsx @@ -0,0 +1,18 @@ +"use client"; + +import { Card } from "@/app/shadcn_components/ui/card"; +import { Button } from "@/app/shadcn_components/ui/button"; +import { Play } from "lucide-react"; + +export default function RunAssessment() { + return ( + +

+ Step 3: Run Assessment +

+ +
+ ); +} diff --git a/src/app/portfolio/[slug]/remote-assessment/ScenarioSetup.tsx b/src/app/portfolio/[slug]/remote-assessment/ScenarioSetup.tsx new file mode 100644 index 0000000..a12a51c --- /dev/null +++ b/src/app/portfolio/[slug]/remote-assessment/ScenarioSetup.tsx @@ -0,0 +1,76 @@ +"use client"; + +import { useState } from "react"; +import { Card } from "@/app/shadcn_components/ui/card"; +import { Input } from "@/app/shadcn_components/ui/input"; +import { Button } from "@/app/shadcn_components/ui/button"; +import { SelectDropdown } from "@/app/portfolio/[slug]/components/RemoteAssessmentDropdowns"; + +export default function ScenarioSetup({ + portfolioId, + scenarios, + disabled = false, +}: { + portfolioId: string; + scenarios: { + id: string; + name: string; + housingType: string; + goal: string; + goalValue: string | null; + }[]; + disabled?: boolean; +}) { + const [selectedScenario, setSelectedScenario] = useState(null); + + return ( + +

+ Step 2: Select or Create Scenario +

+ + ({ + label: s.name, + value: s.id, + })), + ]} + selectedOption={selectedScenario || ""} + onSelectOption={(opt) => setSelectedScenario(opt.value)} + /> + +
+ + + +
+ + +
+ ); +} diff --git a/src/app/portfolio/[slug]/remote-assessment/page.tsx b/src/app/portfolio/[slug]/remote-assessment/page.tsx index 51276c8..d1b4c62 100644 --- a/src/app/portfolio/[slug]/remote-assessment/page.tsx +++ b/src/app/portfolio/[slug]/remote-assessment/page.tsx @@ -1,132 +1,22 @@ -"use client"; - -import { useState } from "react"; -import { Input } from "@/app/shadcn_components/ui/input"; -import { Button } from "@/app/shadcn_components/ui/button"; +import RemoteAssessmentClient from "./RemoteAssessmentClient"; import { - Select, - SelectTrigger, - SelectContent, - SelectItem, - SelectValue, -} from "@/app/shadcn_components/ui/select"; -import { Card } from "@/app/shadcn_components/ui/card"; -import { Pencil } from "lucide-react"; // ✅ already available from lucide-react + getPortfolio, + getPortfolioScenarios, +} from "@/app/portfolio/[slug]/utils"; -export default function RemoteAssessmentPage() { - const [postcode, setPostcode] = useState(""); - const [isLoading, setIsLoading] = useState(false); - const [addresses, setAddresses] = useState([]); - const [selectedAddress, setSelectedAddress] = useState(null); - const [error, setError] = useState(null); +export default async function RemoteAssessmentPage(props: { + params: Promise<{ slug: string }>; + searchParams: Promise<{ + [key: string]: string | string[] | undefined | number; + }>; +}) { + const params = await props.params; + const portfolioId = params.slug; - async function handleSearch() { - setError(null); - setAddresses([]); - setSelectedAddress(null); - - if (!postcode.trim()) { - setError("Please enter a postcode"); - return; - } - - setIsLoading(true); - await new Promise((r) => setTimeout(r, 800)); // simulate delay - - const fakeResults = [ - "10 Downing Street, London, SW1A 2AA", - "11 Downing Street, London, SW1A 2AA", - "12 Downing Street, London, SW1A 2AA", - ]; - - setAddresses(fakeResults); - setIsLoading(false); - } - - function handleChangeAddress() { - setSelectedAddress(null); - } + // 🔹 Replace this with your real Drizzle query + const scenarios = await getPortfolioScenarios(portfolioId); return ( -
- -

- Remote Assessment -

-

- Search for your property using its postcode to start your assessment. -

- - {/* Step 1: Postcode input */} - {!selectedAddress && ( - <> -
- setPostcode(e.target.value.toUpperCase())} - placeholder="Enter postcode (e.g. SW1A 2AA)" - className="text-lg" - /> - -
- - {error &&

{error}

} - - {/* Step 2: Dropdown of addresses */} - {addresses.length > 0 && ( -
- - -
- )} - - )} - - {/* Step 3: Confirmation card */} - {selectedAddress && ( -
-
-

- Selected Address -

-

{selectedAddress}

-
- - -
- )} -
-
+ ); }