diff --git a/src/app/components/building-passport/Toolbar.tsx b/src/app/components/building-passport/Toolbar.tsx index 655c86d..8f57d21 100644 --- a/src/app/components/building-passport/Toolbar.tsx +++ b/src/app/components/building-passport/Toolbar.tsx @@ -5,7 +5,7 @@ import { NewspaperIcon, HomeModernIcon, WrenchScrewdriverIcon, - LightBulbIcon, + SunIcon, } from "@heroicons/react/24/outline"; import { NavigationMenu, @@ -29,10 +29,6 @@ export function Toolbar({ propertyId, portfolioId }: ToolbarProps) { console.log("Settings were clicked, implement me"); } - function handleClickPortfolioPlan() { - console.log("Opt Plan was clicked, implement me"); - } - const preAssessmentReportButton = ( ); + const solarAnalysisButton = ( + + + Solar Analysis + + ); + const recommendationsButton = ( {preAssessmentReportButton} + {solarAnalysisButton} {recommendationsButton} {/* ; -export type NewApiResponse = InferModel; +export type Solar = InferModel; + +interface Center { + latitude: number; + longitude: number; +} + +interface BoundingBox { + ne: Center; + sw: Center; +} + +interface ImageryDate { + day: number; + year: number; + month: number; +} + +interface SolarPanelConfig { + panelsCount: number; + yearlyEnergyDcKwh: number; + roofSegmentSummaries: any[]; +} + +interface SolarPotential { + solarPanels: any[]; + buildingStats: any; + wholeRoofStats: any; + panelWidthMeters: number; + roofSegmentStats: any[]; + panelHeightMeters: number; + solarPanelConfigs: SolarPanelConfig[]; + panelCapacityWatts: number; + panelLifetimeYears: number; + maxArrayAreaMeters2: number; + maxArrayPanelsCount: number; + maxSunshineHoursPerYear: number; + carbonOffsetFactorKgPerMwh: number; +} + +interface GoogleApiResponse { + name: string; + center: Center; + regionCode: string; + boundingBox: BoundingBox; + imageryDate: ImageryDate; + imageryQuality: string; + solarPotential: SolarPotential; + imageryProcessedDate: ImageryDate; +} + +export interface SolarInterface { + id: bigint; + longitude: number; + latitude: number; + uprn: bigint; + createdAt: Date; + updatedAt: Date; + googleApiResponse: GoogleApiResponse; +} diff --git a/src/app/portfolio/[slug]/building-passport/[propertyId]/solar-analysis/page.tsx b/src/app/portfolio/[slug]/building-passport/[propertyId]/solar-analysis/page.tsx new file mode 100644 index 0000000..fd4d10e --- /dev/null +++ b/src/app/portfolio/[slug]/building-passport/[propertyId]/solar-analysis/page.tsx @@ -0,0 +1,77 @@ +import { + FlagIcon, + LightBulbIcon, + SunIcon, + InformationCircleIcon, +} from "@heroicons/react/24/outline"; +import { getPropertyMeta } from "../utils"; +import { getSolarData } from "./utils"; + +export default async function SolarAnalysisPage({ + params, +}: { + params: { slug: string; propertyId: string }; +}) { + const propertyMeta = await getPropertyMeta(params.propertyId); + const solarData = await getSolarData(Number(propertyMeta.uprn)); + + if (!solarData) { + return ( +
+
+
+ No Solar Analysis Data Available +
+

Please check back later for updates.

+
+
+ ); + } + + const { + panelWidthMeters, + panelHeightMeters, + panelCapacityWatts, + panelLifetimeYears, + } = solarData.googleApiResponse.solarPotential; + + return ( +
+
Solar Analysis
+
+
+

+ Simulation Panel Configuration +

+
+
+ +

+ Dimensions: {panelWidthMeters}m x {panelHeightMeters}m +

+
+
+ +

+ Wattage: {panelCapacityWatts}W +

+
+
+ +

+ Lifetime: {panelLifetimeYears} years +

+
+
+ +

+ Region: {solarData.googleApiResponse.regionCode} +

+
+
+
+ {/* Add more sections here as needed */} +
+
+ ); +} diff --git a/src/app/portfolio/[slug]/building-passport/[propertyId]/solar-analysis/utils.tsx b/src/app/portfolio/[slug]/building-passport/[propertyId]/solar-analysis/utils.tsx new file mode 100644 index 0000000..7388bb5 --- /dev/null +++ b/src/app/portfolio/[slug]/building-passport/[propertyId]/solar-analysis/utils.tsx @@ -0,0 +1,15 @@ +import { db } from "@/app/db/db"; +import { SolarInterface, solar } from "@/app/db/schema/solar"; +import { eq } from "drizzle-orm"; + +export async function getSolarData(uprn: number): Promise { + const data = await db.query.solar.findFirst({ + where: eq(solar.uprn, BigInt(uprn)), + }); + + if (!data) { + throw new Error("Network response was not ok"); + } + + return data as SolarInterface; +}