Skip to content

Commit a721df0

Browse files
committed
feat: add removeMember function
1 parent 62a02c2 commit a721df0

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

src/components/button/button.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ export default component$(
77
size = "regular",
88
customClass = "",
99
variant = "primary",
10+
disabledBtn = false,
1011
}: {
1112
onClick$?: QRL<() => void>;
1213
size?: "regular" | "big";
1314
customClass?: string;
1415
variant?: "primary" | "secondary" | "danger";
16+
disabledBtn?: boolean;
1517
}) => {
1618
const colors: Record<typeof variant, string> = {
1719
primary: "bg-blue-500 hover:bg-blue-700",
@@ -20,6 +22,7 @@ export default component$(
2022
};
2123
return (
2224
<button
25+
disabled={disabledBtn}
2326
class={`bg-blue-500 hover:bg-blue-700 text-white font-bold ${
2427
size === "regular" ? "py-2 px-4" : "py-4 px-8"
2528
} rounded w-auto ${colors[variant]} ${customClass}`}

src/components/member-data/member-data.tsx

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import { $, component$, useComputed$ } from "@builder.io/qwik";
2-
import type { MemberDataStore } from "~/routes/start/[...id]";
2+
import type { MemberDataStore, BillStore } from "~/routes/start/[...id]";
33
import Button from "../button/button";
44
import { sum } from "~/utils/math";
55

66
export default component$(
7-
({ store, number }: { store: MemberDataStore; number: number }) => {
7+
({
8+
store,
9+
billStore,
10+
number,
11+
}: {
12+
store: MemberDataStore;
13+
billStore: BillStore;
14+
number: number;
15+
}) => {
816
const total = useComputed$(() =>
917
sum(store.items.map(({ price }) => price)),
1018
);
@@ -52,6 +60,13 @@ export default component$(
5260
Total: {total}
5361
</div>
5462
<Button onClick$={$(() => store.add())}>Add item</Button>
63+
<Button
64+
disabledBtn={billStore.members.length < 3}
65+
variant="danger"
66+
onClick$={$(() => billStore.deleteMember(store.id!))}
67+
>
68+
Remove member
69+
</Button>
5570
</div>
5671
</div>
5772
);

src/routes/start/[...id]/index.tsx

+26-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export type MemberDataStore = Member & {
2424
};
2525

2626
const initialStore: () => MemberDataStore = () => ({
27+
id: Math.random().toString(36).slice(2),
2728
items: [{ id: Math.random().toString(36).slice(2) }],
2829
add: $(function (this: MemberDataStore) {
2930
this.items = this.items.concat({
@@ -38,10 +39,11 @@ const initialStore: () => MemberDataStore = () => ({
3839
}),
3940
});
4041

41-
type BillStore = {
42+
export type BillStore = {
4243
name: string;
4344
members: MemberDataStore[];
4445
clearAll: QRL<() => void>;
46+
deleteMember: QRL<(id: string) => void>;
4547
};
4648

4749
const BILL_NAME_DEFAULT = "Untitled Bill";
@@ -54,6 +56,11 @@ export default component$(() => {
5456
clearAll: $(function (this: BillStore) {
5557
this.members.forEach((member) => member.clear());
5658
}),
59+
deleteMember: $(function (this: BillStore, id: string) {
60+
this.members = this.members.filter(
61+
(member: MemberDataStore) => member.id !== id,
62+
);
63+
}),
5764
});
5865
const nav = useNavigate();
5966
const isDirty = useSignal(true);
@@ -109,10 +116,21 @@ export default component$(() => {
109116
isDirty.value = false;
110117
transactions.value = await computeSplit(store.members);
111118

119+
nav(
120+
`/start/?billName=${
121+
searchParams.get("billName") || BILL_NAME_DEFAULT
122+
}&memberCount=${
123+
store.members.length ||
124+
searchParams.get("memberCount") ||
125+
MEMBER_COUNT_DEFAULT.toString()
126+
}`,
127+
);
128+
112129
const { id } = await billsStore.save({
113130
id: params.id || undefined,
114131
name: store.name,
115-
members: store.members.map(({ name, items }) => ({
132+
members: store.members.map(({ id, name, items }) => ({
133+
id,
116134
name,
117135
items,
118136
})),
@@ -122,7 +140,6 @@ export default component$(() => {
122140
id,
123141
name: store.name,
124142
});
125-
126143
if (!params.id) {
127144
nav(`/start/${id}`);
128145
}
@@ -134,7 +151,12 @@ export default component$(() => {
134151
<div class="flex flex-col md:flex-row gap-8">
135152
<div class="flex flex-col gap-4 flex-1 items-center">
136153
{store.members.map((member, i) => (
137-
<MemberData key={i} store={member} number={i + 1} />
154+
<MemberData
155+
billStore={store}
156+
key={i}
157+
store={member}
158+
number={i + 1}
159+
/>
138160
))}
139161
</div>
140162
<div class="flex-1 text-center ">

src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export type Bill = {
66
};
77

88
export type Member = {
9+
id: string;
910
name?: string;
1011
items: BillItem[];
1112
};

0 commit comments

Comments
 (0)