Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unify memo handling for sent and received payments (invoice and payment) #2723

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 15 additions & 20 deletions models/Invoice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,24 @@ export default class Invoice extends BaseModel {
);
}

@computed public get getMemo(): string {
@computed public get getKeysendMessage(): string | undefined {
if (this.htlcs?.[0]?.custom_records?.[keySendMessageType]) {
return Base64Utils.base64ToUtf8(
this.htlcs[0].custom_records[keySendMessageType]
);
}
return undefined;
}

myxmaster marked this conversation as resolved.
Show resolved Hide resolved
@computed public get getMemo(): string | undefined {
const memo = this.memo || this.description;
if (typeof memo === 'string') return memo;
if (Array.isArray(memo)) return memo[0];
return '';
return undefined;
}

@computed public get getKeysendMessageOrMemo(): string | undefined {
return this.getKeysendMessage || this.getMemo;
}

@computed public get isPaid(): boolean {
Expand Down Expand Up @@ -262,24 +275,6 @@ export default class Invoice extends BaseModel {
return getExpiryTimestamp * 1000 <= Date.now();
}

@computed public get getKeysendMessage(): string {
if (
this.htlcs?.length > 0 &&
this.htlcs[0].custom_records &&
this.htlcs[0].custom_records[keySendMessageType]
) {
const encodedMessage =
this.htlcs[0].custom_records[keySendMessageType];
try {
return Base64Utils.base64ToUtf8(encodedMessage);
} catch (e) {
return '';
}
}

return '';
}

@computed public get isZeusPay(): boolean {
if (this.getMemo?.toLowerCase().startsWith('zeus pay')) return true;
return false;
Expand Down
18 changes: 14 additions & 4 deletions models/Payment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,21 @@ export default class Payment extends BaseModel {
}
}

@computed public get getMemo(): string | undefined {
@computed public get getKeysendMessage(): string | undefined {
if (
this.htlcs?.[0]?.route?.hops?.[0]?.custom_records?.[
keySendMessageType
]
) {
const customRecords = this.htlcs[0].route.hops[0].custom_records;
return Base64Utils.base64ToUtf8(customRecords[keySendMessageType]);
} else if (this.getPaymentRequest) {
return Base64Utils.base64ToUtf8(
this.htlcs[0].route.hops[0].custom_records[keySendMessageType]
);
}
return undefined;
}

@computed public get getMemo(): string | undefined {
if (this.getPaymentRequest) {
try {
const decoded: any = bolt11.decode(this.getPaymentRequest);
for (let i = 0; i < decoded.tags.length; i++) {
Expand All @@ -102,6 +108,10 @@ export default class Payment extends BaseModel {
return undefined;
}

@computed public get getKeysendMessageOrMemo(): string | undefined {
return this.getKeysendMessage || this.getMemo;
}

@computed public get model(): string {
return localeString('views.Payment.title');
}
Expand Down
16 changes: 10 additions & 6 deletions views/Activity/Activity.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -346,12 +346,14 @@ export default class Activity extends React.PureComponent<
: localeString(
'views.PaymentRequest.title'
)}
{item.memo ? ': ' : ''}
{item.memo ? (
{item.getKeysendMessageOrMemo
? ': '
: ''}
{item.getKeysendMessageOrMemo ? (
<Text
style={{ fontStyle: 'italic' }}
>
{item.memo}
{item.getKeysendMessageOrMemo}
</Text>
) : (
''
Expand All @@ -374,12 +376,14 @@ export default class Activity extends React.PureComponent<
subTitle = (
<Text>
{localeString('general.lightning')}
{item.getMemo ? ': ' : ''}
{item.getMemo ? (
{item.getKeysendMessageOrMemo
? ': '
: ''}
{item.getKeysendMessageOrMemo ? (
<Text
style={{ fontStyle: 'italic' }}
>
{item.getMemo}
{item.getKeysendMessageOrMemo}
</Text>
) : (
''
Expand Down
32 changes: 16 additions & 16 deletions views/Invoice.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ export default class InvoiceView extends React.Component<
fallback_addr,
getRHash,
isPaid,
getKeysendMessage,
getMemo,
receipt,
creation_date,
Expand All @@ -71,7 +72,6 @@ export default class InvoiceView extends React.Component<
formattedOriginalTimeUntilExpiry,
formattedTimeUntilExpiry,
getPaymentRequest,
getKeysendMessage,
is_amp,
value,
getNoteKey,
Expand Down Expand Up @@ -151,35 +151,35 @@ export default class InvoiceView extends React.Component<
</View>

<View style={styles.content}>
{getKeysendMessage && (
{is_amp && isPaid && (
<KeyValue
keyValue={localeString(
'views.Invoices.keysendMessage'
'views.Invoice.invoiceAmount'
)}
value={getKeysendMessage}
value={
<Amount sats={value} sensitive toggleable />
}
sensitive
/>
)}

{is_amp && isPaid && (
{getKeysendMessage && (
<KeyValue
keyValue={localeString(
'views.Invoice.invoiceAmount'
'views.Invoices.keysendMessage'
)}
value={
<Amount sats={value} sensitive toggleable />
}
value={getKeysendMessage}
sensitive
/>
)}

<KeyValue
keyValue={localeString('views.Invoice.memo')}
value={
getMemo || localeString('models.Invoice.noMemo')
}
sensitive
/>
{getMemo && (
<KeyValue
keyValue={localeString('views.Invoice.memo')}
myxmaster marked this conversation as resolved.
Show resolved Hide resolved
value={getMemo}
sensitive
/>
)}

{!!receipt && (
<KeyValue
Expand Down
13 changes: 12 additions & 1 deletion views/Payment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export default class PaymentView extends React.Component<
getPreimage,
getDestination,
enhancedPath,
getKeysendMessage,
getMemo,
isIncomplete,
isInTransit,
Expand Down Expand Up @@ -207,9 +208,19 @@ export default class PaymentView extends React.Component<
/>
)}

{getKeysendMessage && (
<KeyValue
keyValue={localeString(
'views.Invoices.keysendMessage'
)}
value={getKeysendMessage}
sensitive
/>
)}

{getMemo && (
<KeyValue
keyValue={localeString('views.Receive.memo')}
keyValue={localeString('views.Invoice.memo')}
value={getMemo}
sensitive
/>
Expand Down
Loading