login fix
This commit is contained in:
@@ -15,7 +15,7 @@ import {
|
||||
getAccountDisplayName,
|
||||
} from "../services/accountService";
|
||||
import { fetchManagedAccounts, createManagedAccount, updateManagedAccount, determineRefreshStatus, calculateDataFreshness, getLastSuccessfulAccountMetric } from "../services/accountsService";
|
||||
import { upsertAccountMetric, fetchAccountMetricsForMonth } from "../services/accountMetricsService";
|
||||
import { upsertAccountMetric } from "../services/accountMetricsService";
|
||||
import { getAuthUser, databases, databaseId } from "../lib/appwrite";
|
||||
import { parseEbayAccount, parseViaExtensionExtended } from "../services/ebayParserService";
|
||||
import { BentoGrid, BentoGridItem } from "../components/ui/bento-grid";
|
||||
@@ -242,174 +242,6 @@ function RangCard({ rank, className }) {
|
||||
);
|
||||
}
|
||||
|
||||
function RefreshActivityCard({ monthMetrics = new Map(), className }) {
|
||||
// monthMetrics: Map von date (yyyy-mm-dd) -> metric document
|
||||
|
||||
const today = new Date();
|
||||
const currentMonth = today.getMonth();
|
||||
const currentYear = today.getFullYear();
|
||||
const currentDate = today.getDate();
|
||||
|
||||
// Erstelle Kalenderstruktur für aktuellen Monat
|
||||
const getMonthCalendar = () => {
|
||||
const firstDay = new Date(currentYear, currentMonth, 1);
|
||||
const lastDay = new Date(currentYear, currentMonth + 1, 0);
|
||||
const daysInMonth = lastDay.getDate();
|
||||
const startDayOfWeek = firstDay.getDay(); // 0 = Sonntag, 1 = Montag, etc.
|
||||
|
||||
// Wochen beginnen mit Montag (1) statt Sonntag (0)
|
||||
const adjustedStartDay = startDayOfWeek === 0 ? 6 : startDayOfWeek - 1;
|
||||
|
||||
const calendar = [];
|
||||
let currentWeek = [];
|
||||
|
||||
// Leere Felder für Tage vor Monatsbeginn
|
||||
for (let i = 0; i < adjustedStartDay; i++) {
|
||||
currentWeek.push(null);
|
||||
}
|
||||
|
||||
// Tage des Monats
|
||||
for (let day = 1; day <= daysInMonth; day++) {
|
||||
const date = new Date(currentYear, currentMonth, day);
|
||||
currentWeek.push(date);
|
||||
|
||||
if (currentWeek.length === 7) {
|
||||
calendar.push(currentWeek);
|
||||
currentWeek = [];
|
||||
}
|
||||
}
|
||||
|
||||
// Leere Felder für restliche Woche
|
||||
if (currentWeek.length > 0) {
|
||||
while (currentWeek.length < 7) {
|
||||
currentWeek.push(null);
|
||||
}
|
||||
calendar.push(currentWeek);
|
||||
}
|
||||
|
||||
return calendar;
|
||||
};
|
||||
|
||||
const getDayData = (date) => {
|
||||
if (!date) return { refreshStatus: null, salesBucket: null };
|
||||
|
||||
const dateStr = date.toISOString().split('T')[0];
|
||||
const metric = monthMetrics.get(dateStr);
|
||||
|
||||
if (!metric) {
|
||||
return {
|
||||
refreshStatus: 'not-refreshed',
|
||||
salesBucket: null
|
||||
};
|
||||
}
|
||||
|
||||
// Bestimme refreshStatus aus metric
|
||||
let refreshStatus = 'not-refreshed';
|
||||
if (metric.account_metrics_refresh_status === 'failed') {
|
||||
refreshStatus = 'failed';
|
||||
} else if (metric.account_metrics_refreshed === true && metric.account_metrics_refresh_status === 'success') {
|
||||
refreshStatus = 'refreshed';
|
||||
}
|
||||
|
||||
return {
|
||||
refreshStatus: refreshStatus,
|
||||
salesBucket: metric.account_metrics_sales_bucket || null
|
||||
};
|
||||
};
|
||||
|
||||
const getStatusColor = (status, isToday) => {
|
||||
if (isToday) {
|
||||
// Aktueller Tag: dezente Umrandung
|
||||
switch (status) {
|
||||
case 'refreshed':
|
||||
return 'bg-green-500/30 border-2 border-green-600 dark:bg-green-500/20 dark:border-green-500';
|
||||
case 'failed':
|
||||
return 'bg-red-500/20 border-2 border-red-600 dark:bg-red-500/10 dark:border-red-500';
|
||||
default:
|
||||
return 'bg-neutral-100 border-2 border-neutral-400 dark:bg-neutral-800 dark:border-neutral-500';
|
||||
}
|
||||
}
|
||||
|
||||
switch (status) {
|
||||
case 'refreshed':
|
||||
return 'bg-green-500/30 border border-green-500/50 dark:bg-green-500/20 dark:border-green-500/40';
|
||||
case 'failed':
|
||||
return 'bg-red-500/20 border border-red-500/30 dark:bg-red-500/10 dark:border-red-500/20';
|
||||
default:
|
||||
return 'bg-neutral-100 border border-neutral-200 dark:bg-neutral-800 dark:border-neutral-700';
|
||||
}
|
||||
};
|
||||
|
||||
const calendar = getMonthCalendar();
|
||||
const isTodayDate = (date) => {
|
||||
if (!date) return false;
|
||||
return date.getDate() === currentDate &&
|
||||
date.getMonth() === currentMonth &&
|
||||
date.getFullYear() === currentYear;
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
"row-span-1 flex h-full min-h-[12rem] flex-col rounded-xl border border-neutral-200 bg-white p-4 shadow-md transition duration-200 hover:shadow-xl dark:border-white/[0.2] dark:bg-neutral-900 dark:shadow-none md:min-h-[18rem]",
|
||||
className
|
||||
)}
|
||||
>
|
||||
<div className="flex h-full flex-col">
|
||||
{/* Titel oben links */}
|
||||
<div className="mb-2 flex items-baseline gap-2">
|
||||
<div className="text-xs font-medium text-[var(--muted)]">Refresh Activity</div>
|
||||
</div>
|
||||
|
||||
{/* Wochenraster: 7 Spalten x 5 Zeilen */}
|
||||
<div className="grid h-full grid-cols-7 grid-rows-5 gap-0.5 flex-1">
|
||||
{calendar.map((week, weekIndex) => (
|
||||
<React.Fragment key={weekIndex}>
|
||||
{week.map((date, dayIndex) => {
|
||||
if (!date) {
|
||||
return (
|
||||
<div
|
||||
key={`empty-${weekIndex}-${dayIndex}`}
|
||||
className="border border-transparent"
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
const dayData = getDayData(date);
|
||||
const isToday = isTodayDate(date);
|
||||
const dayNumber = date.getDate();
|
||||
|
||||
return (
|
||||
<div
|
||||
key={`${weekIndex}-${dayIndex}`}
|
||||
className={cn(
|
||||
"relative flex items-center justify-center rounded-sm min-h-[20px]",
|
||||
getStatusColor(dayData.refreshStatus, isToday),
|
||||
"transition-colors"
|
||||
)}
|
||||
title={`${date.toLocaleDateString('de-DE')}: ${dayData.refreshStatus === 'not-refreshed' ? 'Not refreshed' : dayData.refreshStatus === 'refreshed' ? 'Refreshed' : 'Refresh failed'}${dayData.salesBucket ? `, Sales: ${dayData.salesBucket}` : ''}`}
|
||||
>
|
||||
{/* Tag-Nummer (klein, oben links) */}
|
||||
<div className="absolute top-0.5 left-0.5 text-[8px] text-[var(--muted)] leading-none">
|
||||
{dayNumber}
|
||||
</div>
|
||||
|
||||
{/* Sales-Bucket (zentriert) */}
|
||||
{dayData.salesBucket && (
|
||||
<div className="text-[10px] font-semibold text-[var(--text)] leading-none">
|
||||
{dayData.salesBucket}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</React.Fragment>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function AccountRefreshCard({
|
||||
onRefresh,
|
||||
@@ -461,7 +293,14 @@ function AccountRefreshCard({
|
||||
{/* Bereich B (Zeilen 2-3, Spalten 1-5) */}
|
||||
<div className="col-span-5 row-span-2 flex items-center justify-center">
|
||||
<button
|
||||
onClick={onRefresh}
|
||||
onClick={() => {
|
||||
// #region agent log
|
||||
fetch('http://127.0.0.1:7243/ingest/2cdae91e-9f0b-48c7-8e02-a970375bdaff',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({sessionId:'debug-session',runId:'run1',hypothesisId:'H1',location:'AccountsPage.jsx:297',message:'AccountRefreshCard click',data:{isRefreshing,hasOnRefresh:!!onRefresh},timestamp:Date.now()})}).catch(()=>{});
|
||||
// #endregion
|
||||
if (onRefresh) {
|
||||
onRefresh();
|
||||
}
|
||||
}}
|
||||
disabled={isRefreshing}
|
||||
className={cn(
|
||||
"w-full h-full rounded-xl border transition-all active:translate-y-[1px] disabled:opacity-50 disabled:cursor-not-allowed",
|
||||
@@ -631,8 +470,6 @@ export const AccountsPage = () => {
|
||||
// Nur ein Account wird angezeigt; Wechsel über Dropdown
|
||||
const [displayedAccountId, setDisplayedAccountId] = useState(null);
|
||||
|
||||
// Monats-Metriken für Kalender (Map: date -> metric)
|
||||
const [monthMetrics, setMonthMetrics] = useState(new Map());
|
||||
|
||||
// Form-Felder (nur noch URL)
|
||||
const [formData, setFormData] = useState({
|
||||
@@ -659,14 +496,6 @@ export const AccountsPage = () => {
|
||||
}
|
||||
}, [accounts]);
|
||||
|
||||
// Lade Monats-Metriken wenn displayedAccountId sich ändert
|
||||
useEffect(() => {
|
||||
if (displayedAccountId) {
|
||||
loadMonthMetrics(displayedAccountId);
|
||||
} else {
|
||||
setMonthMetrics(new Map());
|
||||
}
|
||||
}, [displayedAccountId]);
|
||||
|
||||
async function loadAccounts() {
|
||||
setLoading(true);
|
||||
@@ -687,24 +516,6 @@ export const AccountsPage = () => {
|
||||
}
|
||||
}
|
||||
|
||||
async function loadMonthMetrics(accountId) {
|
||||
if (!accountId) {
|
||||
setMonthMetrics(new Map());
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const today = new Date();
|
||||
const year = today.getFullYear();
|
||||
const month = today.getMonth() + 1; // 1-12
|
||||
|
||||
const metrics = await fetchAccountMetricsForMonth(accountId, year, month);
|
||||
setMonthMetrics(metrics);
|
||||
} catch (e) {
|
||||
console.error("Fehler beim Laden der Monats-Metriken:", e);
|
||||
setMonthMetrics(new Map());
|
||||
}
|
||||
}
|
||||
|
||||
const handleDisplayedAccountChange = (accountId) => {
|
||||
setDisplayedAccountId(accountId);
|
||||
@@ -1087,10 +898,6 @@ export const AccountsPage = () => {
|
||||
streak={account.account_refresh_streak || null}
|
||||
dataFreshness={calculateDataFreshness(account.account_last_refresh_at) || 'Aging'}
|
||||
/>
|
||||
<RefreshActivityCard
|
||||
monthMetrics={monthMetrics}
|
||||
className="md:col-span-3"
|
||||
/>
|
||||
</BentoGrid>
|
||||
);
|
||||
})()
|
||||
|
||||
Reference in New Issue
Block a user