Merge branch 'master' into trace

This commit is contained in:
Riccardo Balbo 2024-11-02 11:43:16 +01:00 committed by GitHub
commit 2cd16a68c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 99 additions and 24 deletions

View File

@ -258,8 +258,10 @@ export async function createLightningInvoice (actionType, args, context) {
expiry: INVOICE_EXPIRE_SECS expiry: INVOICE_EXPIRE_SECS
}, { models }) }, { models })
// the sender (me) decides if the wrapped invoice has a description
// whereas the recipient decides if their invoice has a description
const { invoice: wrappedInvoice, maxFee } = await wrapInvoice( const { invoice: wrappedInvoice, maxFee } = await wrapInvoice(
bolt11, { msats: cost, description }, { lnd }) bolt11, { msats: cost, description }, { me, lnd })
return { return {
bolt11, bolt11,

View File

@ -180,7 +180,8 @@ export default function Comment ({
</ActionTooltip>} </ActionTooltip>}
</> </>
} }
onEdit={e => { setEdit(!edit) }} edit={edit}
toggleEdit={e => { setEdit(!edit) }}
editText={edit ? 'cancel' : 'edit'} editText={edit ? 'cancel' : 'edit'}
/>} />}

View File

@ -30,7 +30,7 @@ import classNames from 'classnames'
export default function ItemInfo ({ export default function ItemInfo ({
item, full, commentsText = 'comments', item, full, commentsText = 'comments',
commentTextSingular = 'comment', className, embellishUser, extraInfo, onEdit, editText, commentTextSingular = 'comment', className, embellishUser, extraInfo, edit, toggleEdit, editText,
onQuoteReply, extraBadges, nested, pinnable, showActionDropdown = true, showUser = true, onQuoteReply, extraBadges, nested, pinnable, showActionDropdown = true, showUser = true,
setDisableRetry, disableRetry setDisableRetry, disableRetry
}) { }) {
@ -151,8 +151,8 @@ export default function ItemInfo ({
showActionDropdown && showActionDropdown &&
<> <>
<EditInfo <EditInfo
item={item} canEdit={canEdit} item={item} edit={edit} canEdit={canEdit}
setCanEdit={setCanEdit} onEdit={onEdit} editText={editText} editThreshold={editThreshold} setCanEdit={setCanEdit} toggleEdit={toggleEdit} editText={editText} editThreshold={editThreshold}
/> />
<PaymentInfo item={item} disableRetry={disableRetry} setDisableRetry={setDisableRetry} /> <PaymentInfo item={item} disableRetry={disableRetry} setDisableRetry={setDisableRetry} />
<ActionDropdown> <ActionDropdown>
@ -311,7 +311,7 @@ function PaymentInfo ({ item, disableRetry, setDisableRetry }) {
) )
} }
function EditInfo ({ item, canEdit, setCanEdit, onEdit, editText, editThreshold }) { function EditInfo ({ item, edit, canEdit, setCanEdit, toggleEdit, editText, editThreshold }) {
const router = useRouter() const router = useRouter()
if (canEdit) { if (canEdit) {
@ -320,7 +320,7 @@ function EditInfo ({ item, canEdit, setCanEdit, onEdit, editText, editThreshold
<span> \ </span> <span> \ </span>
<span <span
className='text-reset pointer fw-bold' className='text-reset pointer fw-bold'
onClick={() => onEdit ? onEdit() : router.push(`/items/${item.id}/edit`)} onClick={() => toggleEdit ? toggleEdit() : router.push(`/items/${item.id}/edit`)}
> >
<span>{editText || 'edit'} </span> <span>{editText || 'edit'} </span>
{(!item.invoice?.actionState || item.invoice?.actionState === 'PAID') {(!item.invoice?.actionState || item.invoice?.actionState === 'PAID')
@ -334,5 +334,21 @@ function EditInfo ({ item, canEdit, setCanEdit, onEdit, editText, editThreshold
) )
} }
if (edit && !canEdit) {
// if we're still editing after timer ran out
return (
<>
<span> \ </span>
<span
className='text-reset pointer fw-bold'
onClick={() => toggleEdit ? toggleEdit() : router.push(`/items/${item.id}`)}
>
<span>cancel </span>
<span>00:00</span>
</span>
</>
)
}
return null return null
} }

View File

@ -51,10 +51,18 @@ export default function WalletCard ({ wallet, draggable, onDragStart, onDragEnte
<Card.Title>{title}</Card.Title> <Card.Title>{title}</Card.Title>
<Card.Subtitle className='mt-2'> <Card.Subtitle className='mt-2'>
{badges?.map( {badges?.map(
badge => badge => {
<Badge className={styles.badge} key={badge} bg={null}> let style = ''
{badge} switch (badge) {
</Badge>)} case 'receive': style = styles.receive; break
case 'send': style = styles.send; break
}
return (
<Badge className={`${styles.badge} ${style}`} key={badge} bg={null}>
{badge}
</Badge>
)
})}
</Card.Subtitle> </Card.Subtitle>
</Card.Body> </Card.Body>
<Link href={`/settings/wallets/${wallet.name}`}> <Link href={`/settings/wallets/${wallet.name}`}>

View File

@ -0,0 +1,28 @@
-- fix revenue for users who have multiple revenue entries for the same day
WITH revenue_days AS (
SELECT coalesce(sum(msats), 0) as revenue_msats, "userId", created_at
FROM "SubAct"
WHERE type = 'REVENUE'
GROUP BY "userId", created_at
HAVING COUNT(*) > 1
),
revenue_total AS (
SELECT coalesce(sum(revenue_msats), 0) as revenue_msats, "userId"
FROM revenue_days
GROUP BY "userId"
)
UPDATE users SET msats = users.msats + revenue_total.revenue_msats
FROM revenue_total
WHERE users.id = revenue_total."userId";
-- fix stacked msats for users who have territory revenue
-- prior to this, we were not updating stacked msats for territory revenue
WITH territory_revenue AS (
SELECT coalesce(sum(msats), 0) as revenue_msats, "userId"
FROM "SubAct"
WHERE type = 'REVENUE'
GROUP BY "userId"
)
UPDATE users SET "stackedMsats" = users."stackedMsats" + territory_revenue.revenue_msats
FROM territory_revenue
WHERE users.id = territory_revenue."userId";

View File

@ -40,6 +40,14 @@
margin-right: 0.2rem; margin-right: 0.2rem;
} }
.receive {
color: #20c997 !important;
}
.send {
color: var(--bs-primary) !important;
}
.attach { .attach {
color: var(--bs-body-color) !important; color: var(--bs-body-color) !important;
text-align: center; text-align: center;

View File

@ -28,7 +28,7 @@ export const fields = [
export const card = { export const card = {
title: 'Blink', title: 'Blink',
subtitle: 'use [Blink](https://blink.sv/) for payments', subtitle: 'use [Blink](https://blink.sv/) for payments',
badges: ['send only'] badges: ['send']
} }
export const fieldValidation = blinkSchema export const fieldValidation = blinkSchema

View File

@ -36,7 +36,7 @@ export const fields = [
export const card = { export const card = {
title: 'CLN', title: 'CLN',
subtitle: 'autowithdraw to your Core Lightning node via [CLNRest](https://docs.corelightning.org/docs/rest)', subtitle: 'autowithdraw to your Core Lightning node via [CLNRest](https://docs.corelightning.org/docs/rest)',
badges: ['receive only'] badges: ['receive']
} }
export const fieldValidation = CLNAutowithdrawSchema export const fieldValidation = CLNAutowithdrawSchema

View File

@ -15,7 +15,7 @@ export const fields = [
export const card = { export const card = {
title: 'lightning address', title: 'lightning address',
subtitle: 'autowithdraw to a lightning address', subtitle: 'autowithdraw to a lightning address',
badges: ['receive only'] badges: ['receive']
} }
export const fieldValidation = lnAddrAutowithdrawSchema export const fieldValidation = lnAddrAutowithdrawSchema

View File

@ -29,7 +29,7 @@ export const fields = [
export const card = { export const card = {
title: 'LNbits', title: 'LNbits',
subtitle: 'use [LNbits](https://lnbits.com/) for payments', subtitle: 'use [LNbits](https://lnbits.com/) for payments',
badges: ['send & receive'] badges: ['send', 'receive']
} }
export const fieldValidation = lnbitsSchema export const fieldValidation = lnbitsSchema

View File

@ -33,7 +33,7 @@ export const fields = [
export const card = { export const card = {
title: 'LNC', title: 'LNC',
subtitle: 'use Lightning Node Connect for LND payments', subtitle: 'use Lightning Node Connect for LND payments',
badges: ['send only', 'budgetable'] badges: ['send', 'budgetable']
} }
export const fieldValidation = lncSchema export const fieldValidation = lncSchema

View File

@ -37,7 +37,7 @@ export const fields = [
export const card = { export const card = {
title: 'LND', title: 'LND',
subtitle: 'autowithdraw to your Lightning Labs node', subtitle: 'autowithdraw to your Lightning Labs node',
badges: ['receive only'] badges: ['receive']
} }
export const fieldValidation = LNDAutowithdrawSchema export const fieldValidation = LNDAutowithdrawSchema

View File

@ -27,7 +27,7 @@ export const fields = [
export const card = { export const card = {
title: 'NWC', title: 'NWC',
subtitle: 'use Nostr Wallet Connect for payments', subtitle: 'use Nostr Wallet Connect for payments',
badges: ['send & receive', 'budgetable'] badges: ['send', 'receive', 'budgetable']
} }
export const fieldValidation = nwcSchema export const fieldValidation = nwcSchema

View File

@ -33,7 +33,7 @@ export const fields = [
export const card = { export const card = {
title: 'phoenixd', title: 'phoenixd',
subtitle: 'use [phoenixd](https://phoenix.acinq.co/server) for payments', subtitle: 'use [phoenixd](https://phoenix.acinq.co/server) for payments',
badges: ['send & receive'] badges: ['send', 'receive']
} }
// phoenixd::TODO // phoenixd::TODO

View File

@ -20,7 +20,7 @@ export const fieldValidation = ({ enabled }) => {
export const card = { export const card = {
title: 'WebLN', title: 'WebLN',
subtitle: 'use a [WebLN provider](https://www.webln.guide/ressources/webln-providers) for payments', subtitle: 'use a [WebLN provider](https://www.webln.guide/ressources/webln-providers) for payments',
badges: ['send only'] badges: ['send']
} }
export default function WebLnProvider ({ children }) { export default function WebLnProvider ({ children }) {

View File

@ -22,7 +22,7 @@ const ZAP_SYBIL_FEE_MULT = 10 / 7 // the fee for the zap sybil service
maxFee: number maxFee: number
} }
*/ */
export default async function wrapInvoice (bolt11, { msats, description, descriptionHash }, { lnd }) { export default async function wrapInvoice (bolt11, { msats, description, descriptionHash }, { me, lnd }) {
try { try {
console.group('wrapInvoice', description) console.group('wrapInvoice', description)
@ -112,6 +112,11 @@ export default async function wrapInvoice (bolt11, { msats, description, descrip
wrapped.description = inv.description wrapped.description = inv.description
} }
if (me?.hideInvoiceDesc) {
wrapped.description = undefined
wrapped.description_hash = undefined
}
// validate the expiration // validate the expiration
if (new Date(inv.expires_at) < new Date(Date.now() + INCOMING_EXPIRATION_BUFFER_MSECS)) { if (new Date(inv.expires_at) < new Date(Date.now() + INCOMING_EXPIRATION_BUFFER_MSECS)) {
throw new Error('Invoice expiration is too soon') throw new Error('Invoice expiration is too soon')

View File

@ -72,10 +72,17 @@ export async function territoryRevenue ({ models }) {
FROM revenue FROM revenue
WHERE revenue > 1000 WHERE revenue > 1000
RETURNING * RETURNING *
),
"SubActResultTotal" AS (
SELECT coalesce(sum(msats), 0) as total_msats, "userId"
FROM "SubActResult"
GROUP BY "userId"
) )
UPDATE users SET msats = users.msats + "SubActResult".msats UPDATE users
FROM "SubActResult" SET msats = users.msats + "SubActResultTotal".total_msats,
WHERE users.id = "SubActResult"."userId"`, "stackedMsats" = users."stackedMsats" + "SubActResultTotal".total_msats
FROM "SubActResultTotal"
WHERE users.id = "SubActResultTotal"."userId"`,
{ models } { models }
) )
} }