Merge branch 'master' into clearbug
This commit is contained in:
commit
3b523fe949
|
@ -1,35 +0,0 @@
|
||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Report a problem
|
|
||||||
title: ''
|
|
||||||
labels: bug
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Note: this template is meant to help you report the bug so that we can fix it faster, ie not all of these sections are required*
|
|
||||||
|
|
||||||
**Description**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**Steps to Reproduce**
|
|
||||||
A clear and concise way we might be able to reproduce the bug.
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Logs**
|
|
||||||
If applicable, add your browsers console logs.
|
|
||||||
|
|
||||||
**Environment:**
|
|
||||||
If you only experience the issue on certain devices or browsers, provide that info.
|
|
||||||
- Device: [e.g. iPhone6]
|
|
||||||
- OS: [e.g. iOS]
|
|
||||||
- Browser [e.g. chrome, safari]
|
|
||||||
- Version [e.g. 22]
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
name: 🐞 Bug report
|
||||||
|
description: Create a bug report to help us fix it
|
||||||
|
title: "bug report"
|
||||||
|
labels: [bug]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this?
|
||||||
|
description: Please search to see if an issue already exists for the bug you encountered.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is. Include images if relevant.
|
||||||
|
placeholder: I accidentally deleted the internet. Here's my story ...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Screenshots
|
||||||
|
description: |
|
||||||
|
Add screenshots to help explain your problem. You can also add a video here.
|
||||||
|
|
||||||
|
Tip: You can attach images or video files by clicking this area to highlight it and then dragging files in.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce
|
||||||
|
description: Steps to reproduce the bug.
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '...'
|
||||||
|
3. Scroll to '...'
|
||||||
|
4. See error
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: A clear and concise description of what you expected to happen
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Logs
|
||||||
|
description: If applicable, add your browser's console logs here
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Device information
|
||||||
|
placeholder: |
|
||||||
|
- OS: [e.g. Windows]
|
||||||
|
- Browser: [e.g. chrome, safari, firefox]
|
||||||
|
- Browser Version: [e.g. 22]
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Do you have links to discussions about this on SN or other references?
|
||||||
|
validations:
|
||||||
|
required: false
|
|
@ -0,0 +1,5 @@
|
||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Questions
|
||||||
|
url: https://stacker.news/~meta
|
||||||
|
about: If you simply have a question, you can ask it in ~meta or the saloon.
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest a feature
|
|
||||||
title: ''
|
|
||||||
labels: feature
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
name: ✨ Feature request
|
||||||
|
description: Request a feature you'd like to see in SN!
|
||||||
|
title: "feature request"
|
||||||
|
labels: [feature]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
We're always looking for suggestions on how we could improve SN!
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the problem you're trying to solve
|
||||||
|
description: |
|
||||||
|
Is your feature request related to a problem? Add a clear and concise description of what the problem is.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the solution you'd like
|
||||||
|
description: A clear and concise description of what you want to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe alternatives you've considered
|
||||||
|
description: |
|
||||||
|
A clear and concise description of any alternative solutions or features you have considered.
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Add any other additional context or screenshots about the feature request here.
|
|
@ -1,45 +1,22 @@
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
<!--
|
_A clear and concise description of what you changed and why._
|
||||||
A clear and concise description of what you changed and why.
|
|
||||||
Don't forget to mention which tickets this closes (if any).
|
|
||||||
Use following syntax to close them automatically on merge: closes #<number>
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
<!--
|
|
||||||
If your changes are user facing, please add screenshots of the new UI.
|
|
||||||
You can also create a video to showcase your changes (useful to show UX).
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Additional Context
|
## Additional Context
|
||||||
|
|
||||||
<!--
|
_Was anything unclear during your work on this PR? Anything we should definitely take a closer look at?_
|
||||||
You can mention here anything that you think is relevant for this PR. Some examples:
|
|
||||||
* You encountered something that you didn't understand while working on this PR
|
|
||||||
* You were not sure about something you did but did not find a better way
|
|
||||||
* You initially had a different approach but went with a different approach for some reason
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
**Are your changes backwards compatible? Please answer below:**
|
**Are your changes backwards compatible? Please answer below:**
|
||||||
|
|
||||||
<!-- put your answer about backwards compatibility here -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
If your PR is not ready for review yet, please mark your PR as a draft.
|
|
||||||
If changes were requested, request a new review when you incorporated the feedback.
|
|
||||||
-->
|
|
||||||
**On a scale of 1-10 how well and how have you QA'd this change and any features it might affect? Please answer below:**
|
**On a scale of 1-10 how well and how have you QA'd this change and any features it might affect? Please answer below:**
|
||||||
|
|
||||||
<!-- put your answer about QA here -->
|
|
||||||
|
|
||||||
**For frontend changes: Tested on mobile? Please answer below:**
|
**For frontend changes: Tested on mobile? Please answer below:**
|
||||||
|
|
||||||
<!-- put your answer about mobile QA here -->
|
|
||||||
|
|
||||||
**Did you introduce any new environment variables? If so, call them out explicitly here:**
|
**Did you introduce any new environment variables? If so, call them out explicitly here:**
|
||||||
|
|
||||||
<!-- put your answer about env vars here -->
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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'}
|
||||||
/>}
|
/>}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import ItemPopover from './item-popover'
|
||||||
import classNames from 'classnames'
|
import classNames from 'classnames'
|
||||||
import { CarouselProvider, useCarousel } from './carousel'
|
import { CarouselProvider, useCarousel } from './carousel'
|
||||||
import rehypeSN from '@/lib/rehype-sn'
|
import rehypeSN from '@/lib/rehype-sn'
|
||||||
|
import remarkUnicode from '@/lib/remark-unicode'
|
||||||
import Embed from './embed'
|
import Embed from './embed'
|
||||||
import remarkMath from 'remark-math'
|
import remarkMath from 'remark-math'
|
||||||
import rehypeMathjax from 'rehype-mathjax'
|
import rehypeMathjax from 'rehype-mathjax'
|
||||||
|
@ -33,7 +34,7 @@ const rehypeSNStyled = () => rehypeSN({
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
|
|
||||||
const remarkPlugins = [gfm, [remarkMath, { singleDollarTextMath: false }]]
|
const remarkPlugins = [gfm, remarkUnicode, [remarkMath, { singleDollarTextMath: false }]]
|
||||||
const rehypePlugins = [rehypeSNStyled, rehypeMathjax]
|
const rehypePlugins = [rehypeSNStyled, rehypeMathjax]
|
||||||
|
|
||||||
export function SearchText ({ text }) {
|
export function SearchText ({ text }) {
|
||||||
|
|
|
@ -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}`}>
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { visit } from 'unist-util-visit'
|
||||||
|
|
||||||
|
export default function remarkFilterUnicode () {
|
||||||
|
return (tree) => {
|
||||||
|
try {
|
||||||
|
visit(tree, 'paragraph', (node) => {
|
||||||
|
node.children = node.children.map(child => {
|
||||||
|
if (child.type !== 'inlineMath') return child
|
||||||
|
|
||||||
|
// if inline math contains currency symbols, rehypeMathjax will throw
|
||||||
|
// see https://github.com/stackernews/stacker.news/issues/1525
|
||||||
|
// and https://github.com/stackernews/stacker.news/pull/1526
|
||||||
|
|
||||||
|
let { hChildren } = child.data
|
||||||
|
hChildren = hChildren.map(child2 => {
|
||||||
|
return { ...child2, value: filterUnicode(child2.value) }
|
||||||
|
})
|
||||||
|
child.data.hChildren = hChildren
|
||||||
|
|
||||||
|
return { ...child, value: filterUnicode(child.value) }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterUnicode (text) {
|
||||||
|
return text.replace(/\p{Sc}/u, '')
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ function InviteForm () {
|
||||||
fields: {
|
fields: {
|
||||||
invites (existingInviteRefs = []) {
|
invites (existingInviteRefs = []) {
|
||||||
const newInviteRef = cache.writeFragment({
|
const newInviteRef = cache.writeFragment({
|
||||||
|
fragmentName: 'InviteFields',
|
||||||
data: createInvite,
|
data: createInvite,
|
||||||
fragment: INVITE_FIELDS
|
fragment: INVITE_FIELDS
|
||||||
})
|
})
|
||||||
|
|
|
@ -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";
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 }) {
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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 }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue