Updated stores

This commit is contained in:
Roman Krček
2025-08-06 13:45:03 +02:00
parent 2f730fdbbb
commit d8b4eea3ef
2 changed files with 83 additions and 100 deletions

View File

@@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import { availableSheets, selectedSheet, currentStep } from '$lib/stores'; import { selectedSheet, currentStep } from '$lib/stores';
import type { SheetInfoType } from '$lib/stores';
import { searchSheets } from '$lib/google'; import { searchSheets } from '$lib/google';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import Navigator from './subcomponents/Navigator.svelte'; import Navigator from './subcomponents/Navigator.svelte';
@@ -25,19 +26,11 @@
try { try {
searchResults = await searchSheets(searchQuery); searchResults = await searchSheets(searchQuery);
availableSheets.set(
searchResults.map((sheet) => ({
spreadsheetId: sheet.spreadsheetId || sheet.id,
name: sheet.name,
url: sheet.webViewLink
}))
);
hasSearched = true; hasSearched = true;
} catch (err) { } catch (err) {
console.error('Error searching sheets:', err); console.error('Error searching sheets:', err);
error = 'Failed to search sheets. Please check your connection and try again.'; error = 'Failed to search sheets. Please check your connection and try again.';
searchResults = []; searchResults = [];
availableSheets.set([]);
} finally { } finally {
isLoading = false; isLoading = false;
} }
@@ -57,11 +50,24 @@
} }
} }
function saveRecentSheet(sheet) {
// Remove duplicates
recentSheets = recentSheets.filter(s => s.id !== sheet.id);
recentSheets.unshift(sheet);
// Limit to 5 recent sheets
if (recentSheets.length > 5) {
recentSheets.pop();
}
localStorage.setItem(RECENT_SHEETS_KEY, JSON.stringify(recentSheets));
}
function handleSelectSheet(sheet) { function handleSelectSheet(sheet) {
const sheetData = { const sheetData: SheetInfoType = {
spreadsheetId: sheet.spreadsheetId || sheet.id, id: sheet.id,
name: sheet.name, name: sheet.name,
url: sheet.webViewLink || sheet.url webViewLink: sheet.webViewLink
}; };
selectedSheet.set(sheetData); selectedSheet.set(sheetData);
} }
@@ -264,5 +270,6 @@
textBack="Back to Auth" textBack="Back to Auth"
textForwardDisabled="Select a sheet" textForwardDisabled="Select a sheet"
textForwardEnabled="Continue" textForwardEnabled="Continue"
onForward={() => saveRecentSheet($selectedSheet)}
/> />
</div> </div>

View File

@@ -1,45 +1,42 @@
import { writable, derived } from 'svelte/store'; import { writable, derived } from 'svelte/store';
// This file is holy and shall not be edited by Copilot!
// User session and authentication // User session and authentication
export const session = writable<{ export const session = writable<{
token?: string; token?: string;
user?: { name: string; email: string }; user?: { name: string; email: string };
}>({}); }>({});
// Raw sheet data after import // Data structure column mapping
export const rawSheetData = writable<string[][]>([]); export interface ColumnMappingType {
name: number;
surname: number;
nationality: number;
birthday: number;
pictureUrl: number;
alreadyPrinted: number;
sheetName: string;
}
// Filtered sheet data after row selection // Data structure for a row in the sheet
export const filteredSheetData = writable<any[]>([]);
// Column mapping configuration
export const columnMapping = writable<{
name?: number;
surname?: number;
nationality?: number;
birthday?: number;
pictureUrl?: number;
alreadyPrinted?: number;
}>({});
// Processed row data after mapping and validation
export interface RowData { export interface RowData {
id: string; id: string; // Unique identifier
name: string; name: string;
surname: string; surname: string;
nationality: string; nationality: string;
birthday: string; birthday: string;
pictureUrl: string; pictureUrl: string;
valid: boolean; alreadyPrinted: boolean;
included: boolean; _rowIndex: number;
age?: number; _checked: boolean;
validationErrors: string[]; _valid: boolean;
} }
export const sheetData = writable<RowData[]>([]);
// Picture storage and metadata // Picture storage and metadata
export interface PictureBlobInfo { export interface PictureBlobInfoType {
id: string; id: string;
blob: Blob; blob: Blob;
url: string; url: string;
@@ -48,17 +45,55 @@ export interface PictureBlobInfo {
faceCount: number; faceCount: number;
} }
export const pictures = writable<Record<string, PictureBlobInfo>>({}); // CropType rectangles for each photo
export interface CropType {
// Crop rectangles for each photo
export interface Crop {
x: number; x: number;
y: number; y: number;
width: number; width: number;
height: number; height: number;
} }
export const cropRects = writable<Record<string, Crop>>({}); // Google Sheets list for search
export interface SheetInfoType {
id: string;
name: string;
webViewLink: string;
}
// Card details type
export interface CardDetailsType {
homeSection: string;
validityStart: string;
}
// Column mapping configuration
export const columnMapping = writable<ColumnMappingType>(
{
name: -1,
surname: -1,
nationality: -1,
birthday: -1,
pictureUrl: -1,
alreadyPrinted: -1,
sheetName: ''
});
// Store to hold the processed sheet data
export const sheetData = writable<RowData[]>([]);
// Store and hold the processed picture data
export const pictures = writable<Record<string, PictureBlobInfoType>>({});
// Store and hold the crop rectangles from face detection
export const CropRects = writable<Record<string, CropType>>({});
// Store and hold the selected sheet
export const selectedSheet = writable<SheetInfoType | null>(null);
// Card details for generation
export const cardDetails = writable<CardDetailsType | null>(null);
// Wizard state management // Wizard state management
export const currentStep = writable<number>(0); export const currentStep = writable<number>(0);
@@ -94,62 +129,3 @@ export const progress = writable<ProgressState>({
total: 0, total: 0,
message: '' message: ''
}); });
// Google Sheets list for search
export interface SheetInfo {
spreadsheetId: string;
name: string;
url: string;
}
export const availableSheets = writable<SheetInfo[]>([]);
// Selected sheet
export const selectedSheet = writable<SheetInfo | null>(null);
// Validation derived stores
export const validRowCount = derived(
sheetData,
($sheetData) => $sheetData.filter(row => row.valid && row.included).length
);
export const invalidRowCount = derived(
sheetData,
($sheetData) => $sheetData.filter(row => !row.valid).length
);
export const totalRowCount = derived(
sheetData,
($sheetData) => $sheetData.length
);
// Face detection status
export const faceDetectionProgress = writable<{
completed: number;
total: number;
currentImage: string;
}>({
completed: 0,
total: 0,
currentImage: ''
});
// PDF generation status
export const pdfGenerationStatus = writable<{
generating: boolean;
stage: 'preparing' | 'text-pdf' | 'photo-pdf' | 'complete';
progress: number;
}>({
generating: false,
stage: 'preparing',
progress: 0
});
// Card details for generation
export const cardDetails = writable<{
homeSection: string;
validityStart: string;
}>({
homeSection: '',
validityStart: ''
});