From ba06f3043f284a1bbeb631a2301167993b966948 Mon Sep 17 00:00:00 2001 From: ekzyis Date: Tue, 22 Oct 2024 21:07:09 +0200 Subject: [PATCH 1/5] Color send & recv badges --- components/wallet-card.js | 16 ++++++++++++---- styles/wallet.module.css | 8 ++++++++ wallets/blink/index.js | 2 +- wallets/cln/index.js | 2 +- wallets/lightning-address/index.js | 2 +- wallets/lnbits/index.js | 2 +- wallets/lnc/index.js | 2 +- wallets/lnd/index.js | 2 +- wallets/nwc/index.js | 2 +- wallets/phoenixd/index.js | 2 +- wallets/webln/index.js | 2 +- 11 files changed, 29 insertions(+), 13 deletions(-) diff --git a/components/wallet-card.js b/components/wallet-card.js index aedd792c..e1ae443c 100644 --- a/components/wallet-card.js +++ b/components/wallet-card.js @@ -51,10 +51,18 @@ export default function WalletCard ({ wallet, draggable, onDragStart, onDragEnte {title} {badges?.map( - badge => - - {badge} - )} + badge => { + let style = '' + switch (badge) { + case 'receive': style = styles.receive; break + case 'send': style = styles.send; break + } + return ( + + {badge} + + ) + })} diff --git a/styles/wallet.module.css b/styles/wallet.module.css index e4e8744a..133734d4 100644 --- a/styles/wallet.module.css +++ b/styles/wallet.module.css @@ -40,6 +40,14 @@ margin-right: 0.2rem; } +.receive { + color: #20c997 !important; +} + +.send { + color: var(--bs-primary) !important; +} + .attach { color: var(--bs-body-color) !important; text-align: center; diff --git a/wallets/blink/index.js b/wallets/blink/index.js index 6cbc3ff8..dc93d042 100644 --- a/wallets/blink/index.js +++ b/wallets/blink/index.js @@ -28,7 +28,7 @@ export const fields = [ export const card = { title: 'Blink', subtitle: 'use [Blink](https://blink.sv/) for payments', - badges: ['send only'] + badges: ['send'] } export const fieldValidation = blinkSchema diff --git a/wallets/cln/index.js b/wallets/cln/index.js index 644b7748..31e05606 100644 --- a/wallets/cln/index.js +++ b/wallets/cln/index.js @@ -36,7 +36,7 @@ export const fields = [ export const card = { title: 'CLN', subtitle: 'autowithdraw to your Core Lightning node via [CLNRest](https://docs.corelightning.org/docs/rest)', - badges: ['receive only'] + badges: ['receive'] } export const fieldValidation = CLNAutowithdrawSchema diff --git a/wallets/lightning-address/index.js b/wallets/lightning-address/index.js index ff502a3a..9a881d03 100644 --- a/wallets/lightning-address/index.js +++ b/wallets/lightning-address/index.js @@ -15,7 +15,7 @@ export const fields = [ export const card = { title: 'lightning address', subtitle: 'autowithdraw to a lightning address', - badges: ['receive only'] + badges: ['receive'] } export const fieldValidation = lnAddrAutowithdrawSchema diff --git a/wallets/lnbits/index.js b/wallets/lnbits/index.js index 3473f47e..a4425911 100644 --- a/wallets/lnbits/index.js +++ b/wallets/lnbits/index.js @@ -29,7 +29,7 @@ export const fields = [ export const card = { title: 'LNbits', subtitle: 'use [LNbits](https://lnbits.com/) for payments', - badges: ['send & receive'] + badges: ['send', 'receive'] } export const fieldValidation = lnbitsSchema diff --git a/wallets/lnc/index.js b/wallets/lnc/index.js index e349b6dd..b86153da 100644 --- a/wallets/lnc/index.js +++ b/wallets/lnc/index.js @@ -33,7 +33,7 @@ export const fields = [ export const card = { title: 'LNC', subtitle: 'use Lightning Node Connect for LND payments', - badges: ['send only', 'budgetable'] + badges: ['send', 'budgetable'] } export const fieldValidation = lncSchema diff --git a/wallets/lnd/index.js b/wallets/lnd/index.js index c884b909..21123cb5 100644 --- a/wallets/lnd/index.js +++ b/wallets/lnd/index.js @@ -37,7 +37,7 @@ export const fields = [ export const card = { title: 'LND', subtitle: 'autowithdraw to your Lightning Labs node', - badges: ['receive only'] + badges: ['receive'] } export const fieldValidation = LNDAutowithdrawSchema diff --git a/wallets/nwc/index.js b/wallets/nwc/index.js index fe443968..cd125769 100644 --- a/wallets/nwc/index.js +++ b/wallets/nwc/index.js @@ -27,7 +27,7 @@ export const fields = [ export const card = { title: 'NWC', subtitle: 'use Nostr Wallet Connect for payments', - badges: ['send & receive', 'budgetable'] + badges: ['send', 'receive', 'budgetable'] } export const fieldValidation = nwcSchema diff --git a/wallets/phoenixd/index.js b/wallets/phoenixd/index.js index 51625937..5a24e304 100644 --- a/wallets/phoenixd/index.js +++ b/wallets/phoenixd/index.js @@ -33,7 +33,7 @@ export const fields = [ export const card = { title: 'phoenixd', subtitle: 'use [phoenixd](https://phoenix.acinq.co/server) for payments', - badges: ['send & receive'] + badges: ['send', 'receive'] } // phoenixd::TODO diff --git a/wallets/webln/index.js b/wallets/webln/index.js index 6bfb26d5..75ca3dd8 100644 --- a/wallets/webln/index.js +++ b/wallets/webln/index.js @@ -20,7 +20,7 @@ export const fieldValidation = ({ enabled }) => { export const card = { title: 'WebLN', subtitle: 'use a [WebLN provider](https://www.webln.guide/ressources/webln-providers) for payments', - badges: ['send only'] + badges: ['send'] } export default function WebLnProvider ({ children }) { From 383272f1c2456dd9f34d7fd2bbeae255f9ad485e Mon Sep 17 00:00:00 2001 From: ekzyis Date: Thu, 24 Oct 2024 21:47:29 +0200 Subject: [PATCH 2/5] Fix description of wrapped invoices don't respect privacy setting --- api/paidAction/index.js | 4 +++- wallets/wrap.js | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/api/paidAction/index.js b/api/paidAction/index.js index 424198be..fcbfb4e3 100644 --- a/api/paidAction/index.js +++ b/api/paidAction/index.js @@ -258,8 +258,10 @@ export async function createLightningInvoice (actionType, args, context) { expiry: INVOICE_EXPIRE_SECS }, { 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( - bolt11, { msats: cost, description }, { lnd }) + bolt11, { msats: cost, description }, { me, lnd }) return { bolt11, diff --git a/wallets/wrap.js b/wallets/wrap.js index ae63a6ed..b470587b 100644 --- a/wallets/wrap.js +++ b/wallets/wrap.js @@ -22,7 +22,7 @@ const ZAP_SYBIL_FEE_MULT = 10 / 7 // the fee for the zap sybil service maxFee: number } */ -export default async function wrapInvoice (bolt11, { msats, description, descriptionHash }, { lnd }) { +export default async function wrapInvoice (bolt11, { msats, description, descriptionHash }, { me, lnd }) { try { console.group('wrapInvoice', description) @@ -112,6 +112,11 @@ export default async function wrapInvoice (bolt11, { msats, description, descrip wrapped.description = inv.description } + if (me?.hideInvoiceDesc) { + wrapped.description = undefined + wrapped.description_hash = undefined + } + // validate the expiration if (new Date(inv.expires_at) < new Date(Date.now() + INCOMING_EXPIRATION_BUFFER_MSECS)) { throw new Error('Invoice expiration is too soon') From 739509de4fe9dc7ac6642ff0f567511a83d18ede Mon Sep 17 00:00:00 2001 From: ekzyis Date: Fri, 25 Oct 2024 22:02:12 +0200 Subject: [PATCH 3/5] Don't hide cancel if still in edit mode --- components/comment.js | 1 + components/item-info.js | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/components/comment.js b/components/comment.js index 176ab6f1..6449b2a3 100644 --- a/components/comment.js +++ b/components/comment.js @@ -180,6 +180,7 @@ export default function Comment ({ } } + edit={edit} onEdit={e => { setEdit(!edit) }} editText={edit ? 'cancel' : 'edit'} />} diff --git a/components/item-info.js b/components/item-info.js index ba0c3732..6772334e 100644 --- a/components/item-info.js +++ b/components/item-info.js @@ -30,7 +30,7 @@ import classNames from 'classnames' export default function ItemInfo ({ item, full, commentsText = 'comments', - commentTextSingular = 'comment', className, embellishUser, extraInfo, onEdit, editText, + commentTextSingular = 'comment', className, embellishUser, extraInfo, edit, onEdit, editText, onQuoteReply, extraBadges, nested, pinnable, showActionDropdown = true, showUser = true, setDisableRetry, disableRetry }) { @@ -151,7 +151,7 @@ export default function ItemInfo ({ showActionDropdown && <> @@ -311,7 +311,7 @@ function PaymentInfo ({ item, disableRetry, setDisableRetry }) { ) } -function EditInfo ({ item, canEdit, setCanEdit, onEdit, editText, editThreshold }) { +function EditInfo ({ item, edit, canEdit, setCanEdit, onEdit, editText, editThreshold }) { const router = useRouter() if (canEdit) { @@ -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 ( + <> + \ + setEdit(false)} + > + cancel + 00:00 + + + ) + } + return null } From 146f578d3d943ee469550bbcc05d1b15b3553b8f Mon Sep 17 00:00:00 2001 From: ekzyis Date: Fri, 25 Oct 2024 22:10:15 +0200 Subject: [PATCH 4/5] Rename onEdit to toggleEdit --- components/comment.js | 2 +- components/item-info.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/comment.js b/components/comment.js index 6449b2a3..62e455f3 100644 --- a/components/comment.js +++ b/components/comment.js @@ -181,7 +181,7 @@ export default function Comment ({ } edit={edit} - onEdit={e => { setEdit(!edit) }} + toggleEdit={e => { setEdit(!edit) }} editText={edit ? 'cancel' : 'edit'} />} diff --git a/components/item-info.js b/components/item-info.js index 6772334e..921d57f5 100644 --- a/components/item-info.js +++ b/components/item-info.js @@ -30,7 +30,7 @@ import classNames from 'classnames' export default function ItemInfo ({ item, full, commentsText = 'comments', - commentTextSingular = 'comment', className, embellishUser, extraInfo, edit, onEdit, editText, + commentTextSingular = 'comment', className, embellishUser, extraInfo, edit, toggleEdit, editText, onQuoteReply, extraBadges, nested, pinnable, showActionDropdown = true, showUser = true, setDisableRetry, disableRetry }) { @@ -152,7 +152,7 @@ export default function ItemInfo ({ <> @@ -311,7 +311,7 @@ function PaymentInfo ({ item, disableRetry, setDisableRetry }) { ) } -function EditInfo ({ item, edit, canEdit, setCanEdit, onEdit, editText, editThreshold }) { +function EditInfo ({ item, edit, canEdit, setCanEdit, toggleEdit, editText, editThreshold }) { const router = useRouter() if (canEdit) { @@ -320,7 +320,7 @@ function EditInfo ({ item, edit, canEdit, setCanEdit, onEdit, editText, editThre \ onEdit ? onEdit() : router.push(`/items/${item.id}/edit`)} + onClick={() => toggleEdit ? toggleEdit() : router.push(`/items/${item.id}/edit`)} > {editText || 'edit'} {(!item.invoice?.actionState || item.invoice?.actionState === 'PAID') @@ -341,7 +341,7 @@ function EditInfo ({ item, edit, canEdit, setCanEdit, onEdit, editText, editThre \ setEdit(false)} + onClick={() => toggleEdit ? toggleEdit() : router.push(`/items/${item.id}`)} > cancel 00:00 From a73ac8896e1daba6e374176bb0fbf758595e763f Mon Sep 17 00:00:00 2001 From: k00b Date: Fri, 1 Nov 2024 13:38:04 -0500 Subject: [PATCH 5/5] fix territory revenue attribution for one founder and multiple terrtories --- .../migration.sql | 28 +++++++++++++++++++ worker/territory.js | 13 +++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 prisma/migrations/20241101151907_fix_territory_revenue/migration.sql diff --git a/prisma/migrations/20241101151907_fix_territory_revenue/migration.sql b/prisma/migrations/20241101151907_fix_territory_revenue/migration.sql new file mode 100644 index 00000000..0a92b67f --- /dev/null +++ b/prisma/migrations/20241101151907_fix_territory_revenue/migration.sql @@ -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"; diff --git a/worker/territory.js b/worker/territory.js index 21bb87b7..d7a7f479 100644 --- a/worker/territory.js +++ b/worker/territory.js @@ -72,10 +72,17 @@ export async function territoryRevenue ({ models }) { FROM revenue WHERE revenue > 1000 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 - FROM "SubActResult" - WHERE users.id = "SubActResult"."userId"`, + UPDATE users + SET msats = users.msats + "SubActResultTotal".total_msats, + "stackedMsats" = users."stackedMsats" + "SubActResultTotal".total_msats + FROM "SubActResultTotal" + WHERE users.id = "SubActResultTotal"."userId"`, { models } ) }