Refaktoryzacja zarządzania stanem w raporcie administracji

- Zastąpienie `props` na `storeToRefs(useReportStore())` w komponentach administracji.
- Refaktoryzacja interfejsu `AccordionItem` do `AccordionItems` i dostosowanie typów.
- Usunięcie zbędnych właściwości `turn` i `state` z `AdministrationBurgCard.vue`.
- Przebudowa sposobu obliczania pojemności rządu w `administrationDetails.vue`.
- Poprawienie inicjalizacji `state` i `turn` w `reportStore.ts`.

Zmiany poprawiają zarządzanie stanem i czytelność kodu.
This commit is contained in:
installer
2025-02-04 10:28:47 +01:00
parent 8ac5e42199
commit 34885a2f3f
5 changed files with 36 additions and 39 deletions

View File

@@ -1,17 +1,18 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { StatesResponse, TurnsResponse } from '@/types/pb-types'; import type { BurgsResponse, ProvincesResponse } from '@/types/pb-types';
interface AccordionItem { interface AccordionItems {
title: string; title: string;
content: any[]; content:
| ProvincesResponse<unknown>[]
| BurgsResponse<unknown>[]
| { name: string; amount: number }[];
len: number; len: number;
type: 'provinces' | 'burgs' | 'chart'; type: 'provinces' | 'burgs' | 'chart';
} }
const props = defineProps<{ const props = defineProps<{
turn: TurnsResponse<unknown>; accordionItems: AccordionItems[];
state: StatesResponse<unknown, unknown, unknown, unknown, unknown>;
accordionItems: AccordionItem[];
}>(); }>();
const provinces = props.accordionItems.find(item => item.type === 'provinces')?.content ?? []; const provinces = props.accordionItems.find(item => item.type === 'provinces')?.content ?? [];
@@ -47,13 +48,7 @@ const burgs = props.accordionItems.find(item => item.type === 'burgs')?.content
<AccordionContent v-else-if="item.type === 'burgs'"> <AccordionContent v-else-if="item.type === 'burgs'">
<ScrollArea class="h-[500px]"> <ScrollArea class="h-[500px]">
<div class="flex flex-wrap justify-center gap-6"> <div class="flex flex-wrap justify-center gap-6">
<AdministrationBurgCard <AdministrationBurgCard v-for="burg in burgs" :key="burg.id" :burg="burg" />
v-for="burg in burgs"
:key="burg.id"
:burg="burg"
:turn="props.turn"
:state="props.state"
/>
</div> </div>
</ScrollArea> </ScrollArea>
</AccordionContent> </AccordionContent>

View File

@@ -1,14 +1,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { BurgsResponse, StatesResponse, TurnsResponse } from '@/types/pb-types'; import type { BurgsResponse } from '@/types/pb-types';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
const props = defineProps<{ const props = defineProps<{
burg: BurgsResponse<unknown>; burg: BurgsResponse<unknown>;
turn: TurnsResponse<unknown>;
state: StatesResponse<unknown, unknown, unknown, unknown, unknown>;
}>(); }>();
const { cultureNames, religionNames } = await useFetchAdministrationReport(props.turn, props.state); const { state, turn } = storeToRefs(useReportStore());
const { cultureNames, religionNames } = await useFetchAdministrationReport(turn.value, state.value);
</script> </script>
<template> <template>

View File

@@ -1,17 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { StatesResponse, TurnsResponse } from '@/types/pb-types'; const { state, turn } = storeToRefs(useReportStore());
const props = defineProps<{ const { cultureNames, burgsData } = await useFetchAdministrationReport(turn.value, state.value);
turn: TurnsResponse<unknown>;
state: StatesResponse<unknown, unknown, unknown, unknown, unknown>;
}>();
const { cultureNames, burgsData } = await useFetchAdministrationReport(props.turn, props.state); const primaryCulture = cultureNames.find(c => c.id === state.value.culture)?.id;
const primaryCulture = cultureNames.find(c => c.id === props.state.culture)?.id;
const nonPrimaryCultureCells: number = ( const nonPrimaryCultureCells: number = (
Object.entries(props.state.culturesCells as Record<string, string>) as [string, string][] Object.entries(state.value.culturesCells as Record<string, string>) as [string, string][]
).reduce( ).reduce(
(sum: number, [key, value]: [string, string]) => (sum: number, [key, value]: [string, string]) =>
key !== primaryCulture ? sum : sum + parseInt(value), key !== primaryCulture ? sum : sum + parseInt(value),
@@ -21,19 +16,19 @@ const nonPrimaryCultureCells: number = (
const nonPrimaryCultureBurgs = burgsData.value.filter(b => b.culture !== primaryCulture).length; const nonPrimaryCultureBurgs = burgsData.value.filter(b => b.culture !== primaryCulture).length;
const governmentCapacityPoints = const governmentCapacityPoints =
props.state.cells + nonPrimaryCultureCells + burgsData.value.length + nonPrimaryCultureBurgs; state.value.cells + nonPrimaryCultureCells + burgsData.value.length + nonPrimaryCultureBurgs;
const technologieGovernmentCapacityLimit = 1 * 50; const technologieGovernmentCapacityLimit = 1 * 50;
const governmentCapacityLimit = const governmentCapacityLimit =
(constGovernmentTypes.find(g => g.name === props.state.form)?.governmentCapacityLimit || 0) + (constGovernmentTypes.find(g => g.name === state.value.form)?.governmentCapacityLimit || 0) +
technologieGovernmentCapacityLimit; technologieGovernmentCapacityLimit;
const governmentCapacity = Math.round((governmentCapacityPoints / governmentCapacityLimit) * 100); const governmentCapacity = Math.round((governmentCapacityPoints / governmentCapacityLimit) * 100);
const progress = ref(Math.min(governmentCapacity, 100)); const progress = ref(Math.min(governmentCapacity, 100));
const governmentCapacityRows = [ const governmentCapacityRows = [
{ type: 'Kratki', points: 1, value: props.state.cells }, { type: 'Kratki', points: 1, value: state.value.cells },
{ type: 'Kratki ob. kultura', points: 1, value: nonPrimaryCultureCells }, { type: 'Kratki ob. kultura', points: 1, value: nonPrimaryCultureCells },
{ type: 'Miasta', points: 1, value: burgsData.value.length }, { type: 'Miasta', points: 1, value: burgsData.value.length },
{ type: 'Miasta ob. kultura', points: 1, value: nonPrimaryCultureBurgs } { type: 'Miasta ob. kultura', points: 1, value: nonPrimaryCultureBurgs }
@@ -42,7 +37,7 @@ const governmentCapacityRows = [
const governmentCapacityLimitRows = [ const governmentCapacityLimitRows = [
{ {
type: 'Forma rządu', type: 'Forma rządu',
value: constGovernmentTypes.find(g => g.name === props.state.form)?.governmentCapacityLimit || 0 value: constGovernmentTypes.find(g => g.name === state.value.form)?.governmentCapacityLimit || 0
}, },
{ type: 'Technologia', value: technologieGovernmentCapacityLimit } { type: 'Technologia', value: technologieGovernmentCapacityLimit }
]; ];

View File

@@ -2,6 +2,16 @@
// TODO: Administracja (GovCap, Prowincje, Miasta) // TODO: Administracja (GovCap, Prowincje, Miasta)
import type { BurgsResponse, ProvincesResponse } from '@/types/pb-types'; import type { BurgsResponse, ProvincesResponse } from '@/types/pb-types';
interface AccordionItems {
title: string;
content:
| ProvincesResponse<unknown>[]
| BurgsResponse<unknown>[]
| { name: string; amount: number }[];
len: number;
type: 'provinces' | 'burgs' | 'chart';
}
const { state, turn } = storeToRefs(useReportStore()); const { state, turn } = storeToRefs(useReportStore());
const { provincesData, burgsData } = await useFetchAdministrationReport(turn.value, state.value); const { provincesData, burgsData } = await useFetchAdministrationReport(turn.value, state.value);
@@ -10,7 +20,7 @@ const biomesChartData = prepareChartData(state.value.biomesCells as object);
const religionsChartData = prepareChartData(state.value.religionsCells as object); const religionsChartData = prepareChartData(state.value.religionsCells as object);
const culturesChartData = prepareChartData(state.value.culturesCells as object); const culturesChartData = prepareChartData(state.value.culturesCells as object);
const accordionItems = [ const accordionItems: AccordionItems[] = [
{ {
title: 'Prowincje', title: 'Prowincje',
content: provincesData.value as ProvincesResponse<unknown>[], content: provincesData.value as ProvincesResponse<unknown>[],
@@ -53,12 +63,7 @@ function prepareChartData(content: object) {
<template> <template>
<div class="grid grid-cols-12 gap-3"> <div class="grid grid-cols-12 gap-3">
<AdministrationAccordion <AdministrationAccordion class="col-span-4" :accordionItems="accordionItems" />
class="col-span-4"
:accordionItems="accordionItems"
:turn="turn"
:state="state"
/>
<AdministrationDetails <AdministrationDetails
class="col-span-8 flex w-full flex-col items-center justify-center" class="col-span-8 flex w-full flex-col items-center justify-center"

View File

@@ -1,8 +1,10 @@
import type { StatesResponse, TurnsResponse } from '@/types/pb-types'; import type { StatesResponse, TurnsResponse } from '@/types/pb-types';
export const useReportStore = defineStore('useReportStore', () => { export const useReportStore = defineStore('useReportStore', () => {
const state = ref<StatesResponse<unknown, unknown, unknown, unknown, unknown>>(); const state = ref<StatesResponse<unknown, unknown, unknown, unknown, unknown>>(
const turn = ref<TurnsResponse<unknown>>(); {} as StatesResponse<unknown, unknown, unknown, unknown, unknown>
);
const turn = ref<TurnsResponse<unknown>>({} as TurnsResponse<unknown>);
function setState(newState: StatesResponse<unknown, unknown, unknown, unknown, unknown>): void { function setState(newState: StatesResponse<unknown, unknown, unknown, unknown, unknown>): void {
state.value = newState; state.value = newState;