Skip to content

Commit

Permalink
refactor(web): use better composition in urban project selectors
Browse files Browse the repository at this point in the history
  • Loading branch information
stephane-ruhlmann committed Jan 10, 2025
1 parent c9b82f6 commit 2824818
Showing 1 changed file with 88 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const selectCreationData = createSelector(

export const selectProjectName = createSelector(
selectCreationData,
(state): string => state.name ?? "",
(creationData): string => creationData.name ?? "",
);

export const selectCurrentStep = createSelector([selectSelf], (state): UrbanProjectCreationStep => {
Expand All @@ -43,8 +43,8 @@ export const selectCurrentStep = createSelector([selectSelf], (state): UrbanProj
export const selectCreateMode = createSelector([selectSelf], (state) => state.createMode);

export const selectSpacesCategories = createSelector(
[selectSelf],
(state): UrbanSpaceCategory[] => state.creationData.spacesCategories ?? [],
[selectCreationData],
(creationData): UrbanSpaceCategory[] => creationData.spacesCategories ?? [],
);

type SurfaceAreaDistributionWithUnit<TSurface extends string> = {
Expand All @@ -67,80 +67,80 @@ const getSurfaceAreaDistributionWithUnit = <TSurface extends string>(
};

export const selectSpacesCategoriesSurfaceDistribution = createSelector(
[selectSelf, selectAppSettings],
(state, appSettings) => {
[selectCreationData, selectAppSettings],
(creationData, appSettings) => {
return getSurfaceAreaDistributionWithUnit(
state.creationData.spacesCategoriesDistribution ?? {},
creationData.spacesCategoriesDistribution ?? {},
appSettings.surfaceAreaInputMode,
);
},
);

export const selectPublicSpacesDistribution = createSelector(
[selectSelf, selectAppSettings],
(state, appSettings) => {
[selectCreationData, selectAppSettings],
(creationData, appSettings) => {
return getSurfaceAreaDistributionWithUnit(
state.creationData.publicSpacesDistribution ?? {},
creationData.publicSpacesDistribution ?? {},
appSettings.surfaceAreaInputMode,
);
},
);

export const selectGreenSpacesDistribution = createSelector(
[selectSelf, selectAppSettings],
(state, appSettings) => {
[selectCreationData, selectAppSettings],
(creationData, appSettings) => {
return getSurfaceAreaDistributionWithUnit(
state.creationData.greenSpacesDistribution ?? {},
creationData.greenSpacesDistribution ?? {},
appSettings.surfaceAreaInputMode,
);
},
);

export const selectLivingAndActivitySpacessDistribution = createSelector(
[selectSelf, selectAppSettings],
(state, appSettings) => {
[selectCreationData, selectAppSettings],
(creationData, appSettings) => {
return getSurfaceAreaDistributionWithUnit(
state.creationData.livingAndActivitySpacesDistribution ?? {},
creationData.livingAndActivitySpacesDistribution ?? {},
appSettings.surfaceAreaInputMode,
);
},
);

export const selectSpaceCategorySurfaceArea = createSelector(
[selectSelf, (_state, spaceCategory: UrbanSpaceCategory) => spaceCategory],
(state, spaceCategory) => {
const surfaceAreaDistribution = state.creationData.spacesCategoriesDistribution;
[selectCreationData, (_state, spaceCategory: UrbanSpaceCategory) => spaceCategory],
(creationData, spaceCategory) => {
const surfaceAreaDistribution = creationData.spacesCategoriesDistribution;
if (!surfaceAreaDistribution) return 0;
return surfaceAreaDistribution[spaceCategory] ?? 0;
},
);

export const selectUrbanProjectSoilsDistribution = createSelector(
[selectSelf],
(state): SoilsDistribution => {
const { spacesCategoriesDistribution } = state.creationData;
[selectCreationData],
(creationData): SoilsDistribution => {
const { spacesCategoriesDistribution } = creationData;
if (!spacesCategoriesDistribution) return {};

const urbanSpacesByCategory: UrbanSpacesByCategory = [];
if (spacesCategoriesDistribution.GREEN_SPACES) {
urbanSpacesByCategory.push({
category: "GREEN_SPACES",
surfaceArea: spacesCategoriesDistribution.GREEN_SPACES,
spaces: state.creationData.greenSpacesDistribution ?? {},
spaces: creationData.greenSpacesDistribution ?? {},
});
}
if (spacesCategoriesDistribution.LIVING_AND_ACTIVITY_SPACES) {
urbanSpacesByCategory.push({
category: "LIVING_AND_ACTIVITY_SPACES",
surfaceArea: spacesCategoriesDistribution.LIVING_AND_ACTIVITY_SPACES,
spaces: state.creationData.livingAndActivitySpacesDistribution ?? {},
spaces: creationData.livingAndActivitySpacesDistribution ?? {},
});
}
if (spacesCategoriesDistribution.PUBLIC_SPACES) {
urbanSpacesByCategory.push({
category: "PUBLIC_SPACES",
surfaceArea: spacesCategoriesDistribution.PUBLIC_SPACES,
spaces: state.creationData.publicSpacesDistribution ?? {},
spaces: creationData.publicSpacesDistribution ?? {},
});
}
if (spacesCategoriesDistribution.URBAN_POND_OR_LAKE) {
Expand All @@ -155,87 +155,96 @@ export const selectUrbanProjectSoilsDistribution = createSelector(
},
);

export const selectBuildingsFootprintSurfaceArea = createSelector([selectSelf], (state): number => {
return state.creationData.livingAndActivitySpacesDistribution?.BUILDINGS ?? 0;
});
export const selectBuildingsFootprintSurfaceArea = createSelector(
[selectCreationData],
(creationData): number => {
return creationData.livingAndActivitySpacesDistribution?.BUILDINGS ?? 0;
},
);

export const selectBuildingsFloorSurfaceArea = createSelector([selectSelf], (state): number => {
return state.creationData.buildingsFloorSurfaceArea ?? 0;
});
export const selectBuildingsFloorSurfaceArea = createSelector(
[selectCreationData],
(creationData): number => {
return creationData.buildingsFloorSurfaceArea ?? 0;
},
);

export const selectBuildingsEconomicActivityUses = createSelector(
[selectSelf],
[selectCreationData],
(
state,
creationData,
): {
buildingsEconomicActivityUses: BuildingsEconomicActivityUse[];
buildingsEconomicActivityTotalSurfaceArea: number;
} => {
return {
buildingsEconomicActivityUses: state.creationData.buildingsEconomicActivityUses ?? [],
buildingsEconomicActivityUses: creationData.buildingsEconomicActivityUses ?? [],
buildingsEconomicActivityTotalSurfaceArea:
state.creationData.buildingsUseCategoriesDistribution?.ECONOMIC_ACTIVITY ?? 0,
creationData.buildingsUseCategoriesDistribution?.ECONOMIC_ACTIVITY ?? 0,
};
},
);

export const getUrbanProjectSpaceDistribution = createSelector(selectCreationData, (state) => {
const {
IMPERMEABLE_SURFACE = 0,
PERMEABLE_SURFACE = 0,
GRASS_COVERED_SURFACE = 0,
} = state.publicSpacesDistribution ?? {};
const {
URBAN_POND_OR_LAKE = 0,
LAWNS_AND_BUSHES = 0,
TREE_FILLED_SPACE = 0,
PAVED_ALLEY = 0,
GRAVEL_ALLEY = 0,
} = state.greenSpacesDistribution ?? {};
const publicGreenSpaces = URBAN_POND_OR_LAKE + LAWNS_AND_BUSHES + TREE_FILLED_SPACE;
const {
BUILDINGS = 0,
PAVED_ALLEY_OR_PARKING_LOT = 0,
GRAVEL_ALLEY_OR_PARKING_LOT = 0,
GARDEN_AND_GRASS_ALLEYS = 0,
TREE_FILLED_GARDEN_OR_ALLEY = 0,
} = state.livingAndActivitySpacesDistribution ?? {};
export const getUrbanProjectSpaceDistribution = createSelector(
selectCreationData,
(creationData) => {
const {
IMPERMEABLE_SURFACE = 0,
PERMEABLE_SURFACE = 0,
GRASS_COVERED_SURFACE = 0,
} = creationData.publicSpacesDistribution ?? {};
const {
URBAN_POND_OR_LAKE = 0,
LAWNS_AND_BUSHES = 0,
TREE_FILLED_SPACE = 0,
PAVED_ALLEY = 0,
GRAVEL_ALLEY = 0,
} = creationData.greenSpacesDistribution ?? {};
const publicGreenSpaces = URBAN_POND_OR_LAKE + LAWNS_AND_BUSHES + TREE_FILLED_SPACE;
const {
BUILDINGS = 0,
PAVED_ALLEY_OR_PARKING_LOT = 0,
GRAVEL_ALLEY_OR_PARKING_LOT = 0,
GARDEN_AND_GRASS_ALLEYS = 0,
TREE_FILLED_GARDEN_OR_ALLEY = 0,
} = creationData.livingAndActivitySpacesDistribution ?? {};

return filterObject(
{
BUILDINGS_FOOTPRINT: BUILDINGS,
PRIVATE_PAVED_ALLEY_OR_PARKING_LOT: PAVED_ALLEY_OR_PARKING_LOT,
PRIVATE_GRAVEL_ALLEY_OR_PARKING_LOT: GRAVEL_ALLEY_OR_PARKING_LOT,
PRIVATE_GARDEN_AND_GRASS_ALLEYS: GARDEN_AND_GRASS_ALLEYS,
PRIVATE_TREE_FILLED_GARDEN_AND_ALLEYS: TREE_FILLED_GARDEN_OR_ALLEY,
// public spaces
PUBLIC_GREEN_SPACES: publicGreenSpaces,
PUBLIC_PAVED_ROAD_OR_SQUARES_OR_SIDEWALKS: IMPERMEABLE_SURFACE + PAVED_ALLEY,
PUBLIC_GRAVEL_ROAD_OR_SQUARES_OR_SIDEWALKS: PERMEABLE_SURFACE + GRAVEL_ALLEY,
PUBLIC_GRASS_ROAD_OR_SQUARES_OR_SIDEWALKS: GRASS_COVERED_SURFACE,
},
([, value]) => !!value && value > 0,
);
});
return filterObject(
{
BUILDINGS_FOOTPRINT: BUILDINGS,
PRIVATE_PAVED_ALLEY_OR_PARKING_LOT: PAVED_ALLEY_OR_PARKING_LOT,
PRIVATE_GRAVEL_ALLEY_OR_PARKING_LOT: GRAVEL_ALLEY_OR_PARKING_LOT,
PRIVATE_GARDEN_AND_GRASS_ALLEYS: GARDEN_AND_GRASS_ALLEYS,
PRIVATE_TREE_FILLED_GARDEN_AND_ALLEYS: TREE_FILLED_GARDEN_OR_ALLEY,
// public spaces
PUBLIC_GREEN_SPACES: publicGreenSpaces,
PUBLIC_PAVED_ROAD_OR_SQUARES_OR_SIDEWALKS: IMPERMEABLE_SURFACE + PAVED_ALLEY,
PUBLIC_GRAVEL_ROAD_OR_SQUARES_OR_SIDEWALKS: PERMEABLE_SURFACE + GRAVEL_ALLEY,
PUBLIC_GRASS_ROAD_OR_SQUARES_OR_SIDEWALKS: GRASS_COVERED_SURFACE,
},
([, value]) => !!value && value > 0,
);
},
);

export const selectDefaultInstallationCosts = createSelector(selectSiteData, (state) => {
if (!state?.surfaceArea) {
export const selectDefaultInstallationCosts = createSelector(selectSiteData, (siteData) => {
if (!siteData?.surfaceArea) {
return undefined;
}
return computeDefaultInstallationCostsFromSiteSurfaceArea(state.surfaceArea);
return computeDefaultInstallationCostsFromSiteSurfaceArea(siteData.surfaceArea);
});

export const selectInstallationCosts = createSelector(selectCreationData, (creationData) => {
return creationData.installationExpenses ?? undefined;
});

export const selectContaminatedSurfaceAreaPercentageToDecontaminate = createSelector(
[selectSelf, selectSiteData],
(state, siteData): number => {
[selectCreationData, selectSiteData],
(creationData, siteData): number => {
const contaminatedSurfaceArea = siteData?.contaminatedSoilSurface;
if (!contaminatedSurfaceArea) return 0;

const surfaceAreaToDecontaminate = state.creationData.decontaminatedSurfaceArea ?? 0;
const surfaceAreaToDecontaminate = creationData.decontaminatedSurfaceArea ?? 0;
return (surfaceAreaToDecontaminate * 100) / contaminatedSurfaceArea;
},
);
Expand All @@ -245,8 +254,8 @@ type SitePurchaseAmounts = {
propertyTransferDuties?: number;
};
export const selectSitePurchaseAmounts = createSelector(
[selectSelf],
({ creationData }): SitePurchaseAmounts | undefined => {
[selectCreationData],
(creationData): SitePurchaseAmounts | undefined => {
if (!creationData.sitePurchaseSellingPrice) return undefined;
return {
sellingPrice: creationData.sitePurchaseSellingPrice,
Expand Down

0 comments on commit 2824818

Please sign in to comment.