qewqwe
This commit is contained in:
@@ -477,9 +477,6 @@
|
||||
daily_cost_currency: 'EUR',
|
||||
report_currency: 'EUR',
|
||||
crypto_currency: 'DOGE',
|
||||
crypto_base_price_amount: '',
|
||||
crypto_base_price_currency: 'USD',
|
||||
fiat_base_price_amount: '',
|
||||
preferred_currencies: ['DOGE', 'USD', 'EUR'],
|
||||
cost_plans: [],
|
||||
currencies: [],
|
||||
@@ -890,6 +887,7 @@
|
||||
crypto_base_price_currency: 'USD',
|
||||
fiat_base_price_amount: '',
|
||||
});
|
||||
const [offerBasisHistory, setOfferBasisHistory] = useState([]);
|
||||
const [previewMinerOffers, setPreviewMinerOffers] = useState([]);
|
||||
const [previewOffersLoading, setPreviewOffersLoading] = useState(false);
|
||||
const [moduleAuthForm, setModuleAuthForm] = useState({
|
||||
@@ -1029,6 +1027,9 @@
|
||||
const selectableCurrencies = preferredSelectableCurrencies.length ? preferredSelectableCurrencies : currencies;
|
||||
const evaluatedMinerOffers = Array.isArray(previewMinerOffers) ? previewMinerOffers : [];
|
||||
const selectedOfferType = String(minerOfferFilters.offer_type || 'crypto').toLowerCase() === 'fiat' ? 'fiat' : 'crypto';
|
||||
const visibleOfferBasisHistory = (Array.isArray(offerBasisHistory) ? offerBasisHistory : [])
|
||||
.filter((entry) => String(entry.offer_type || '').toLowerCase() === selectedOfferType)
|
||||
.slice(0, 6);
|
||||
const hasCryptoOfferBasis = Number(offerPreviewForm.crypto_base_price_amount) > 0;
|
||||
const hasFiatOfferBasis = Number(offerPreviewForm.fiat_base_price_amount) > 0;
|
||||
const filteredMinerOffers = evaluatedMinerOffers.filter((offer) => {
|
||||
@@ -1188,7 +1189,7 @@
|
||||
} finally {
|
||||
setPreviewOffersLoading(false);
|
||||
}
|
||||
}, 250);
|
||||
}, selectedOfferType === 'crypto' ? 1000 : 250);
|
||||
|
||||
return () => window.clearTimeout(timeoutId);
|
||||
}, [
|
||||
@@ -1532,8 +1533,24 @@
|
||||
return;
|
||||
}
|
||||
loadFxHistory(projectKey);
|
||||
loadOfferBasisHistory(projectKey);
|
||||
}, [activeTab, projectKey]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!Array.isArray(offerBasisHistory) || offerBasisHistory.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const latestCrypto = offerBasisHistory.find((entry) => String(entry.offer_type || '').toLowerCase() === 'crypto') || null;
|
||||
const latestFiat = offerBasisHistory.find((entry) => String(entry.offer_type || '').toLowerCase() === 'fiat') || null;
|
||||
|
||||
setOfferPreviewForm((current) => ({
|
||||
crypto_base_price_amount: current.crypto_base_price_amount || (latestCrypto && latestCrypto.base_price_amount !== null && latestCrypto.base_price_amount !== undefined ? String(latestCrypto.base_price_amount) : ''),
|
||||
crypto_base_price_currency: current.crypto_base_price_currency || latestCrypto?.base_price_currency || 'USD',
|
||||
fiat_base_price_amount: current.fiat_base_price_amount || (latestFiat && latestFiat.base_price_amount !== null && latestFiat.base_price_amount !== undefined ? String(latestFiat.base_price_amount) : ''),
|
||||
}));
|
||||
}, [offerBasisHistory]);
|
||||
|
||||
useEffect(() => {
|
||||
if (activeTab !== 'wallet') {
|
||||
return;
|
||||
@@ -2398,6 +2415,37 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function loadOfferBasisHistory(key) {
|
||||
try {
|
||||
const result = await request(`${apiBase}/projects/${encodeURIComponent(key)}/offer-basis-history`, { timeoutMs: 6000 });
|
||||
setOfferBasisHistory(Array.isArray(result) ? result : []);
|
||||
} catch (err) {
|
||||
setOfferBasisHistory([]);
|
||||
}
|
||||
}
|
||||
|
||||
async function rememberOfferBasisInput(offerType, amount, currency) {
|
||||
const numericAmount = Number(amount);
|
||||
if (!Number.isFinite(numericAmount) || numericAmount <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await request(`${apiBase}/projects/${encodeURIComponent(projectKey)}/offer-basis-history`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
offer_type: offerType,
|
||||
base_price_amount: numericAmount,
|
||||
base_price_currency: offerType === 'crypto' ? (currency || 'USD') : 'EUR',
|
||||
}),
|
||||
});
|
||||
await loadOfferBasisHistory(projectKey);
|
||||
} catch (err) {
|
||||
setError(err.message);
|
||||
}
|
||||
}
|
||||
|
||||
function resetReportCurrencyOverride() {
|
||||
setReportCurrencyOverride('');
|
||||
setCookie('mining_checker_report_currency', '', 0);
|
||||
@@ -3075,10 +3123,32 @@
|
||||
[
|
||||
h('div', { key: 'filters', className: 'mc-filter-grid' }, [
|
||||
selectedOfferType === 'crypto'
|
||||
? inputField('Basispreis fuer 50 kH/s auf 3 Monate', 'number', offerPreviewForm.crypto_base_price_amount, (value) => setOfferPreviewForm({ ...offerPreviewForm, crypto_base_price_amount: value }), '0.000001')
|
||||
: inputField('Basispreis fuer 100 kH/s auf 3 Monate in EUR', 'number', offerPreviewForm.fiat_base_price_amount, (value) => setOfferPreviewForm({ ...offerPreviewForm, fiat_base_price_amount: value }), '0.000001'),
|
||||
? fieldWrapper('Basispreis fuer 50 kH/s auf 3 Monate', h('input', {
|
||||
className: 'mc-input',
|
||||
type: 'number',
|
||||
step: '0.000001',
|
||||
value: offerPreviewForm.crypto_base_price_amount,
|
||||
onChange: (event) => setOfferPreviewForm({ ...offerPreviewForm, crypto_base_price_amount: event.target.value }),
|
||||
onBlur: () => rememberOfferBasisInput('crypto', offerPreviewForm.crypto_base_price_amount, offerPreviewForm.crypto_base_price_currency || 'USD'),
|
||||
}))
|
||||
: fieldWrapper('Basispreis fuer 100 kH/s auf 3 Monate in EUR', h('input', {
|
||||
className: 'mc-input',
|
||||
type: 'number',
|
||||
step: '0.000001',
|
||||
value: offerPreviewForm.fiat_base_price_amount,
|
||||
onChange: (event) => setOfferPreviewForm({ ...offerPreviewForm, fiat_base_price_amount: event.target.value }),
|
||||
onBlur: () => rememberOfferBasisInput('fiat', offerPreviewForm.fiat_base_price_amount, 'EUR'),
|
||||
})),
|
||||
selectedOfferType === 'crypto'
|
||||
? selectField('Basiswaehrung', offerPreviewForm.crypto_base_price_currency || 'USD', Array.from(new Set(['USD', String(currentSettings.crypto_currency || 'DOGE').toUpperCase()])), (value) => setOfferPreviewForm({ ...offerPreviewForm, crypto_base_price_currency: value || 'USD' }))
|
||||
? fieldWrapper('Basiswaehrung', h('select', {
|
||||
className: 'mc-select',
|
||||
value: offerPreviewForm.crypto_base_price_currency || 'USD',
|
||||
onChange: async (event) => {
|
||||
const nextCurrency = event.target.value || 'USD';
|
||||
setOfferPreviewForm({ ...offerPreviewForm, crypto_base_price_currency: nextCurrency });
|
||||
await rememberOfferBasisInput('crypto', offerPreviewForm.crypto_base_price_amount, nextCurrency);
|
||||
},
|
||||
}, Array.from(new Set(['USD', String(currentSettings.crypto_currency || 'DOGE').toUpperCase()])).map((value) => h('option', { key: value, value }, value))))
|
||||
: displayField('Basiswaehrung', 'EUR'),
|
||||
selectField('Angebotsart', minerOfferFilters.offer_type, [
|
||||
{ value: 'crypto', label: 'Crypto' },
|
||||
@@ -3095,6 +3165,14 @@
|
||||
label: `${value} Monate`,
|
||||
}))), (value) => setMinerOfferFilters({ ...minerOfferFilters, runtime_months: value })),
|
||||
]),
|
||||
visibleOfferBasisHistory.length ? h('div', { key: 'basis-history', className: 'mc-mini-grid' }, visibleOfferBasisHistory.map((entry) => h('div', {
|
||||
key: `basis-${entry.id}`,
|
||||
className: 'mc-mini-card',
|
||||
}, [
|
||||
h('div', { key: 'label', className: 'mc-field-label' }, selectedOfferType === 'crypto' ? 'Crypto-Basis' : 'Fiat-Basis'),
|
||||
h('div', { key: 'value' }, `${fmtNumber(entry.base_price_amount, 6)} ${entry.base_price_currency}`),
|
||||
h('div', { key: 'sub', className: 'mc-kicker' }, entry.created_at ? fmtDate(entry.created_at) : 'Zeitpunkt unbekannt'),
|
||||
]))) : null,
|
||||
h('div', { key: 'offers-table', className: 'mc-table-shell' }, [
|
||||
h('table', { key: 'table', className: 'mc-table' }, [
|
||||
h('thead', { key: 'head' }, h('tr', null, ['Label', 'Hashrate', 'Preis', 'Erwartet/Tag', 'Break-even', 'Empfehlung', 'Aktion'].map((label) => h('th', { key: label }, label)))),
|
||||
@@ -3102,18 +3180,41 @@
|
||||
filteredMinerOffers.length
|
||||
? filteredMinerOffers.map((offer) => h('tr', { key: offer.id }, [
|
||||
h('td', { key: 'label' }, offer.label),
|
||||
h('td', { key: 'hashrate' }, formatAdaptiveSpeed(offer.offer_hashrate_mh)),
|
||||
h('td', { key: 'hashrate' }, [
|
||||
h('div', { key: 'base' }, formatSpeed(offer.mining_speed_value, offer.mining_speed_unit, 'Basis') || 'n/a'),
|
||||
Number(offer.bonus_speed_value) > 0
|
||||
? h('div', { key: 'bonus', className: 'mc-kicker' }, formatSpeed(offer.bonus_speed_value, offer.bonus_speed_unit, 'Bonus'))
|
||||
: h('div', { key: 'bonus', className: 'mc-kicker' }, 'Bonus 0'),
|
||||
h('div', { key: 'total', className: 'mc-kicker' }, `Gesamt ${formatAdaptiveSpeed(offer.offer_hashrate_mh)}`),
|
||||
]),
|
||||
h('td', { key: 'price' }, [
|
||||
h('div', { key: 'price-main' }, [
|
||||
h('div', { key: 'amount' }, `${fmtNumber(offer.effective_price_amount, 6)} ${offer.effective_price_currency}`),
|
||||
h('div', { key: 'label', className: 'mc-kicker' }, 'Zu zahlen'),
|
||||
]),
|
||||
offer.base_price_amount !== null && offer.base_price_currency
|
||||
? h('div', { key: 'price-base' }, [
|
||||
h('div', { key: 'amount' }, `${fmtNumber(offer.base_price_amount, 6)} ${offer.base_price_currency}`),
|
||||
h('div', { key: 'label', className: 'mc-kicker' }, 'Gegenwert'),
|
||||
])
|
||||
: null,
|
||||
offer.payment_type === 'crypto'
|
||||
? [
|
||||
offer.crypto_display_price_amount !== null && offer.crypto_display_price_currency
|
||||
? h('div', { key: 'price-crypto' }, [
|
||||
h('div', { key: 'amount' }, `${fmtNumber(offer.crypto_display_price_amount, 6)} ${offer.crypto_display_price_currency}`),
|
||||
h('div', { key: 'label', className: 'mc-kicker' }, 'Zu zahlen in Krypto'),
|
||||
])
|
||||
: null,
|
||||
offer.usd_display_price_amount !== null && offer.usd_display_price_currency
|
||||
? h('div', { key: 'price-usd' }, [
|
||||
h('div', { key: 'amount' }, `${fmtNumber(offer.usd_display_price_amount, 6)} ${offer.usd_display_price_currency}`),
|
||||
h('div', { key: 'label', className: 'mc-kicker' }, 'Zu zahlen in USD'),
|
||||
])
|
||||
: null,
|
||||
]
|
||||
: [
|
||||
h('div', { key: 'price-main' }, [
|
||||
h('div', { key: 'amount' }, `${fmtNumber(offer.effective_price_amount, 6)} ${offer.effective_price_currency}`),
|
||||
h('div', { key: 'label', className: 'mc-kicker' }, 'Zu zahlen'),
|
||||
]),
|
||||
offer.base_price_amount !== null && offer.base_price_currency
|
||||
? h('div', { key: 'price-base' }, [
|
||||
h('div', { key: 'amount' }, `${fmtNumber(offer.base_price_amount, 6)} ${offer.base_price_currency}`),
|
||||
h('div', { key: 'label', className: 'mc-kicker' }, 'Gegenwert'),
|
||||
])
|
||||
: null,
|
||||
],
|
||||
]),
|
||||
h('td', { key: 'day' }, offer.expected_doge_per_day !== null ? `${fmtNumber(offer.expected_doge_per_day, 6)} ${currentCoinCurrency}` : 'n/a'),
|
||||
h('td', { key: 'break' }, offer.break_even_days !== null ? `${fmtNumber(offer.break_even_days, 2)} Tage` : 'n/a'),
|
||||
|
||||
Reference in New Issue
Block a user