Skip to content

Commit

Permalink
Merge pull request #222 from SFTtech/milo/fix-position-view
Browse files Browse the repository at this point in the history
fix(web): #209 fix position usages not being updated properly
  • Loading branch information
mikonse committed Aug 16, 2024
2 parents e726082 + 6abd17b commit d92f3b8
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 48 deletions.
8 changes: 3 additions & 5 deletions frontend/apps/mobile/src/screens/groups/TransactionDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
selectCurrentUserPermissions,
selectTransactionById,
selectTransactionHasPositions,
selectWipTransactionPositions,
useWipTransactionPositions,
wipTransactionUpdated,
} from "@abrechnung/redux";
import { TransactionPosition, TransactionValidator } from "@abrechnung/types";
Expand Down Expand Up @@ -49,14 +49,12 @@ export const TransactionDetail: React.FC<GroupStackScreenProps<"TransactionDetai

const transaction = useAppSelector((state) =>
selectTransactionById({ state: selectTransactionSlice(state), groupId, transactionId })
);
)!;
const [showPositions, setShowPositions] = React.useState(false);
const hasPositions = useAppSelector((state) =>
selectTransactionHasPositions({ state: selectTransactionSlice(state), groupId, transactionId })
);
const positions = useAppSelector((state) =>
selectWipTransactionPositions({ state: selectTransactionSlice(state), groupId, transactionId })
);
const positions = useWipTransactionPositions(transaction);
const totalPositionValue = positions.reduce((acc, curr) => acc + curr.price, 0);

const permissions = useAppSelector((state) => selectCurrentUserPermissions({ state: state, groupId }));
Expand Down
22 changes: 11 additions & 11 deletions frontend/apps/web/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import { ConfigProvider } from "./core/config";

const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
root.render(
// <React.StrictMode>
<Provider store={store}>
<PersistGate loading={<Loading />} persistor={persistor}>
<React.Suspense fallback={<Loading />}>
<ConfigProvider>
<App />
</ConfigProvider>
</React.Suspense>
</PersistGate>
</Provider>
// </React.StrictMode>
<React.StrictMode>
<Provider store={store}>
<PersistGate loading={<Loading />} persistor={persistor}>
<React.Suspense fallback={<Loading />}>
<ConfigProvider>
<App />
</ConfigProvider>
</React.Suspense>
</PersistGate>
</Provider>
</React.StrictMode>
);
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { AccountSelect } from "@/components/AccountSelect";
import { MobilePaper } from "@/components/style/mobile";
import { useFormatCurrency } from "@/hooks";
import { RootState, selectAccountSlice, selectTransactionSlice, useAppDispatch, useAppSelector } from "@/store";
import { selectAccountSlice, selectTransactionSlice, useAppDispatch, useAppSelector } from "@/store";
import { getAccountSortFunc } from "@abrechnung/core";
import {
positionDeleted,
selectAccountIdToAccountMap,
selectGroupAccounts,
selectTransactionBalanceEffect,
selectTransactionById,
selectWipTransactionPositions,
useWipTransactionPositions,
wipPositionAdded,
wipPositionUpdated,
} from "@abrechnung/redux";
Expand All @@ -28,7 +28,6 @@ import {
TableRow,
Typography,
} from "@mui/material";
import memoize from "proxy-memoize";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { ValidationErrors } from "./types";
Expand All @@ -40,24 +39,6 @@ interface TransactionPositionsProps {
validationErrors?: ValidationErrors;
}

const selectPositions = memoize(
({ state, groupId, transactionId }: { state: RootState; groupId: number; transactionId: number }) => {
const positions = selectWipTransactionPositions({
state: selectTransactionSlice(state),
groupId,
transactionId,
});
const positionsHaveComplexShares = positions.reduce(
(hasComplex, position) =>
hasComplex ||
(position.communist_shares !== 0 && position.communist_shares !== 1) ||
Object.values(position.usages).reduce((nonOne, usage) => nonOne || (usage !== 0 && usage !== 1), false),
false
);
return { positions, positionsHaveComplexShares };
}
);

export const TransactionPositions: React.FC<TransactionPositionsProps> = ({
groupId,
transactionId,
Expand All @@ -73,9 +54,17 @@ export const TransactionPositions: React.FC<TransactionPositionsProps> = ({
const transaction = useAppSelector((state) =>
selectTransactionById({ state: selectTransactionSlice(state), groupId, transactionId })
)!;
const { positions, positionsHaveComplexShares } = useAppSelector((state) =>
selectPositions({ state, groupId, transactionId })
);
const positions = useWipTransactionPositions(transaction);
const positionsHaveComplexShares = React.useMemo(() => {
return positions.reduce(
(hasComplex, position) =>
hasComplex ||
(position.communist_shares !== 0 && position.communist_shares !== 1) ||
Object.values(position.usages).reduce((nonOne, usage) => nonOne || (usage !== 0 && usage !== 1), false),
false
);
}, [positions]);

const transactionBalanceEffect = useAppSelector((state) =>
selectTransactionBalanceEffect({ state: selectTransactionSlice(state), groupId, transactionId })
);
Expand Down Expand Up @@ -210,7 +199,7 @@ export const TransactionPositions: React.FC<TransactionPositionsProps> = ({
</TableHead>
<TableBody>
{transaction.is_wip
? positions.map((position, idx) => (
? positions.map((position) => (
<PositionTableRow
key={position.id}
position={position}
Expand Down
15 changes: 8 additions & 7 deletions frontend/libs/redux/src/lib/transactions/transactionSlice.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import * as React from "react";
import {
Api,
NewFile,
Expand All @@ -20,6 +21,7 @@ import memoize from "proxy-memoize";
import { leaveGroup } from "../groups";
import { IRootState, StateStatus, TransactionSliceState, TransactionState } from "../types";
import { addEntity, getGroupScopedState, removeEntity } from "../utils";
import { useSelector } from "react-redux";

export const initializeGroupState = (state: Draft<TransactionSliceState>, groupId: number) => {
if (state.byGroupId[groupId]) {
Expand Down Expand Up @@ -101,17 +103,16 @@ export const selectNextLocalPositionId = memoize((args: { state: TransactionSlic
return state.nextLocalPositionId;
});

export const selectWipTransactionPositions = memoize(
(args: { state: TransactionSliceState; groupId: number; transactionId: number }): TransactionPosition[] => {
const { state, groupId, transactionId } = args;
const transaction = selectTransactionByIdInternal({ state, groupId, transactionId });
export const useWipTransactionPositions = (transaction: Transaction): TransactionPosition[] => {
const nextLocalPositionId = useSelector((state: IRootState) => state.transactions.nextLocalPositionId);
return React.useMemo(() => {
const positions =
transaction?.position_ids.map((id) => transaction.positions[id]).filter((p) => !p.deleted) ?? [];
if (transaction?.is_wip) {
return [
...positions,
{
id: state.nextLocalPositionId,
id: nextLocalPositionId,
name: "",
communist_shares: 0,
is_changed: false,
Expand All @@ -124,8 +125,8 @@ export const selectWipTransactionPositions = memoize(
} else {
return positions;
}
}
);
}, [transaction, nextLocalPositionId]);
};

export const selectTransactionHasPositions = memoize(
(args: { state: TransactionSliceState; groupId: number; transactionId: number }): boolean => {
Expand Down

0 comments on commit d92f3b8

Please sign in to comment.