2 Commits

Author SHA1 Message Date
arif 0fd2d05902 add shopping list to flatastic
CI / build (push) Successful in 16s
CI / lint (push) Failing after 11s
CI / create-and-publish-docker-image (push) Has been skipped
2026-06-27 21:20:12 +02:00
arif 24f866f2bc prepare shopping cart feature 2026-06-27 21:08:25 +02:00
6 changed files with 97 additions and 26 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}>
+33 -5
View File
@@ -1,7 +1,7 @@
import classNames from "classnames"; import classNames from "classnames";
import { useEffect } from "react"; import { useEffect } from "react";
import { useFlatasticStore } from "@/store/flatastic"; import { useFlatasticStore } from "@/store/flatastic";
import type { FlatasticChore, FlatasticUser } from "@/types/flatasticChore"; import type { FlatasticChore, FlatasticShoppingItem, FlatasticUser } from "@/types/flatasticChore";
import style from "./style.module.css"; import style from "./style.module.css";
function choreItem(chore: FlatasticChore, idToNameMap: Record<number, string>) { function choreItem(chore: FlatasticChore, idToNameMap: Record<number, string>) {
@@ -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,37 @@ export default function Flatastic() {
return choreItem(chore, idToNameMap); return choreItem(chore, idToNameMap);
}); });
const shoppingList = flatasticData?.shoppingList || [];
const shoppingListRender = shoppingList.map((item) => {
return shoppingItem(item);
});
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}>
<h1>Chores</h1> <div className={style.choreContainer}>
<ul className={style.choreList}> <h1>Chores</h1>
{[...regularChoresRender, ...irregularChoresRender]} <ul className={style.choreList}>
</ul> {[...regularChoresRender, ...irregularChoresRender]}
</ul>
</div>
{shoppingListContainer}
</div> </div>
); );
} }
function shoppingItem(item: FlatasticShoppingItem) {
return (
<li key={item.id} className={style.shoppingListItem}>
{item.itemName}
</li>
);
}
+29
View File
@@ -1,5 +1,34 @@
.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 {
display: flex;
flex-direction: column;
gap: 10px;
list-style-type: none;
padding: 10px 0;
}
.shoppingListItem {
padding: 5px 10px;
text-align: left;
border-top: 2px solid white;
border-left: 2px solid white;
border-bottom: 2px solid #828282;
border-right: 2px solid #828282;
} }
.choreList { .choreList {
+26 -5
View File
@@ -1,7 +1,11 @@
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,
FlatasticUser,
} from "@/types/flatasticChore";
// biome-ignore format: deep // biome-ignore format: deep
function parseInformationData(data): FlatasticUser[] { function parseInformationData(data): FlatasticUser[] {
@@ -17,6 +21,7 @@ const useFlatasticStore = create(
flatasticData: { flatasticData: {
chores: [] as FlatasticChore[], chores: [] as FlatasticChore[],
users: [] as FlatasticUser[], users: [] as FlatasticUser[],
shoppingList: [] as FlatasticShoppingItem[],
}, },
fetch: async () => { fetch: async () => {
if (!import.meta.env.VITE_FLATTASTIC_API_KEY) { if (!import.meta.env.VITE_FLATTASTIC_API_KEY) {
@@ -25,13 +30,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 FlatasticShoppingItem[],
}, },
}); });
}, },
+7 -1
View File
@@ -8,6 +8,12 @@ interface FlatasticUser {
firstName: string; firstName: string;
} }
interface FlatasticShoppingItem {
itemName: string;
bought: boolean;
id: string;
}
interface FlatasticChore { interface FlatasticChore {
id: number; id: number;
title: string; title: string;
@@ -20,4 +26,4 @@ interface FlatasticChore {
timeLeftNext: number; timeLeftNext: number;
} }
export type { Flatastic, FlatasticChore, FlatasticUser }; export type { Flatastic, FlatasticChore, FlatasticShoppingItem, FlatasticUser };