prepare shopping cart feature

This commit is contained in:
2026-06-27 21:08:25 +02:00
parent c4884a6d65
commit 24f866f2bc
6 changed files with 89 additions and 24 deletions
+1 -1
View File
@@ -16,7 +16,7 @@
"linter": { "linter": {
"enabled": true, "enabled": true,
"rules": { "rules": {
"recommended": true "preset": "recommended"
} }
}, },
"javascript": { "javascript": {
-13
View File
@@ -83,19 +83,6 @@ export default function Dashboard() {
<Card icon="🍁" name="420"> <Card icon="🍁" name="420">
<FourTwenty /> <FourTwenty />
</Card> </Card>
<Card icon="🌐" name="GCP Dot">
<iframe
src="https://global-mind.org/gcpdot/gcp.html"
title="GCP Dot"
style={{
width: "112",
height: "112",
border: "none",
margin: "0",
scrollbarWidth: "none",
}}
></iframe>
</Card>
</CardRow> </CardRow>
<Card icon="🔔" name="Terminal" active={true}> <Card icon="🔔" name="Terminal" active={true}>
+24
View File
@@ -43,6 +43,9 @@ function choreItem(chore: FlatasticChore, idToNameMap: Record<number, string>) {
export default function Flatastic() { export default function Flatastic() {
const fetchFlatasticData = useFlatasticStore((state) => state.fetch); const fetchFlatasticData = useFlatasticStore((state) => state.fetch);
const flatasticData = useFlatasticStore((state) => state.flatasticData); const flatasticData = useFlatasticStore((state) => state.flatasticData);
console.log("flatasticData", flatasticData);
const chores = (flatasticData?.chores as FlatasticChore[]) || []; const chores = (flatasticData?.chores as FlatasticChore[]) || [];
const regularChores: FlatasticChore[] = []; const regularChores: FlatasticChore[] = [];
const irregularChores: FlatasticChore[] = []; const irregularChores: FlatasticChore[] = [];
@@ -81,12 +84,33 @@ export default function Flatastic() {
return choreItem(chore, idToNameMap); return choreItem(chore, idToNameMap);
}); });
// TODO: implement shopping list
// const shoppingList = flatasticData?.shoppingList || [];
// const shoppingListRender = shoppingList.map((item) => {
// return (
// <li key={item.id} className={style.shoppingListItem}>
// {item.itemName}
// </li>
// );
// });
// const shoppingListContainer = shoppingList.length > 0 && (
// <div className={style.shoppingListContainer}>
// <h1>Shopping List</h1>
// <ul className={style.shoppingList}>{shoppingListRender}</ul>
// </div>
// );
return ( return (
<div className={style.container}> <div className={style.container}>
<div className={style.choreContainer}>
<h1>Chores</h1> <h1>Chores</h1>
<ul className={style.choreList}> <ul className={style.choreList}>
{[...regularChoresRender, ...irregularChoresRender]} {[...regularChoresRender, ...irregularChoresRender]}
</ul> </ul>
</div> </div>
{/* {shoppingListContainer} */}
</div>
); );
} }
+16
View File
@@ -1,5 +1,21 @@
.container { .container {
padding: 1px 100px 30px 100px; padding: 1px 100px 30px 100px;
display: flex;
flex-direction: row;
}
.choreContainer {
flex: 7;
}
.shoppingListContainer {
flex: 3;
padding-left: 20px;
}
.shoppingList {
list-style-type: none;
padding: 10px 0;
} }
.choreList { .choreList {
+27 -5
View File
@@ -1,7 +1,12 @@
import { create } from "zustand"; import { create } from "zustand";
import { devtools } from "zustand/middleware"; import { devtools } from "zustand/middleware";
import Flatastic from "@/api/flatastic"; import Flatastic from "@/api/flatastic";
import type { FlatasticChore, FlatasticUser } from "@/types/flatasticChore"; import type {
FlatasticChore,
FlatasticShoppingItem,
FlatasticShoppingList,
FlatasticUser,
} from "@/types/flatasticChore";
// biome-ignore format: deep // biome-ignore format: deep
function parseInformationData(data): FlatasticUser[] { function parseInformationData(data): FlatasticUser[] {
@@ -17,6 +22,7 @@ const useFlatasticStore = create(
flatasticData: { flatasticData: {
chores: [] as FlatasticChore[], chores: [] as FlatasticChore[],
users: [] as FlatasticUser[], users: [] as FlatasticUser[],
shoppingList: [] as FlatasticShoppingList[],
}, },
fetch: async () => { fetch: async () => {
if (!import.meta.env.VITE_FLATTASTIC_API_KEY) { if (!import.meta.env.VITE_FLATTASTIC_API_KEY) {
@@ -25,13 +31,29 @@ const useFlatasticStore = create(
const flatastic = new Flatastic( const flatastic = new Flatastic(
import.meta.env.VITE_FLATTASTIC_API_KEY, import.meta.env.VITE_FLATTASTIC_API_KEY,
); );
const data = await flatastic.getTaskList(); const taskList = await flatastic.getTaskList();
const dataB = await flatastic.getInformation(); const generalInformatiom = await flatastic.getInformation();
const shoppingList = await flatastic.getShoppingList();
const filteredShoppingList = [];
for (const item of shoppingList) {
if (!item.bought) {
const shoppingItem: FlatasticShoppingItem = {
itemName: item.itemName,
bought: item.bought,
id: item.id,
};
filteredShoppingList.push(shoppingItem);
}
}
set({ set({
flatasticData: { flatasticData: {
chores: data as FlatasticChore[], chores: taskList as FlatasticChore[],
users: parseInformationData(dataB), users: parseInformationData(generalInformatiom),
shoppingList:
filteredShoppingList as FlatasticShoppingList[],
}, },
}); });
}, },
+17 -1
View File
@@ -8,6 +8,16 @@ interface FlatasticUser {
firstName: string; firstName: string;
} }
interface FlatasticShoppingItem {
itemName: string;
bought: boolean;
id: string;
}
interface FlatasticShoppingList {
items: Array<FlatasticShoppingItem>;
}
interface FlatasticChore { interface FlatasticChore {
id: number; id: number;
title: string; title: string;
@@ -20,4 +30,10 @@ interface FlatasticChore {
timeLeftNext: number; timeLeftNext: number;
} }
export type { Flatastic, FlatasticChore, FlatasticUser }; export type {
Flatastic,
FlatasticChore,
FlatasticShoppingItem,
FlatasticShoppingList,
FlatasticUser,
};