Show sent and received payments for squeak (#2081)

* Add backend endpoint for get sent payments for squeak and get received payments for squeak.

* Improved look of sats spent and sats earned text in squeak page

* Got spending modal working on squeak page

* Got sent payments working for squeak page

* Got received payments working for squeak page

* Update frontend build
This commit is contained in:
Jonathan Zernik 2022-03-30 01:58:11 -07:00 committed by GitHub
parent dff40ef55e
commit 65f53bc938
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 400 additions and 104 deletions

View file

@ -145,6 +145,10 @@ import {
DecryptSqueakReply,
GetPaymentSummaryForSqueakRequest,
GetPaymentSummaryForSqueakReply,
GetSentPaymentsForSqueakRequest,
GetSentPaymentsForSqueakReply,
GetReceivedPaymentsForSqueakRequest,
GetReceivedPaymentsForSqueakReply,
} from '../proto/squeak_admin_pb';
import axios from 'axios'
@ -384,8 +388,24 @@ export const getSentPayments = (limit, lastSentPayment) => {
});
}
export const getSentPaymentsForSqueak = (squeakHash, limit, lastSentPayment) => {
console.log('Calling getSentPaymentsForSqueak');
const request = new GetSentPaymentsForSqueakRequest();
request.setSqueakHash(squeakHash);
request.setLimit(limit);
if (lastSentPayment) {
request.setLastSentPayment(lastSentPayment);
}
const deser = GetSentPaymentsForSqueakReply.deserializeBinary;
return baseRequest({
url: '/getsentpaymentsforsqueak',
req: request,
deser: deser,
});
}
export const getReceivedPayments = (limit, lastReceivedPayment) => {
console.log('Calling getSentPayments');
console.log('Calling getReceivedPayments');
const request = new GetReceivedPaymentsRequest();
request.setLimit(limit);
if (lastReceivedPayment) {
@ -399,6 +419,22 @@ export const getReceivedPayments = (limit, lastReceivedPayment) => {
});
}
export const getReceivedPaymentsForSqueak = (squeakHash, limit, lastReceivedPayment) => {
console.log('Calling getReceivedPaymentsForSqueak');
const request = new GetReceivedPaymentsForSqueakRequest();
request.setSqueakHash(squeakHash);
request.setLimit(limit);
if (lastReceivedPayment) {
request.setLastReceivedPayment(lastReceivedPayment);
}
const deser = GetReceivedPaymentsForSqueakReply.deserializeBinary;
return baseRequest({
url: '/getreceivedpaymentsforsqueak',
req: request,
deser: deser,
});
}
export const getSearchSqueaks = (searchText, limit, lastSqueak) => {
console.log('Calling getSearchSqueaks');
const request = new GetSearchSqueakDisplaysRequest();

View file

@ -127,16 +127,25 @@
padding: 15px 5px;
border-top: 1px solid rgb(230, 236, 240);
border-bottom: 1px solid rgb(230, 236, 240);
div{
display: flex;
cursor: pointer;
&:hover{
text-decoration: underline;
}
}
}
.int-num{
font-weight: bold;
margin-right: 5px;
cursor: pointer;
}
.int-text{
color: rgb(101, 119, 134);
margin-right: 20px;
cursor: pointer;
}
.squeak-interactions{

View file

@ -28,13 +28,15 @@ const ReceivedPayments = (props) => {
console.log('fetchReceivedPayments');
dispatch(clearReceivedPayments());
dispatch(fetchReceivedPayments({
squeakHash: props.squeakHash,
limit: 10,
lastReceivedPayment: null,
}));
}, [])
}, [props.squeakHash])
const fetchMore = () => {
dispatch(fetchReceivedPayments({
squeakHash: props.squeakHash,
limit: 10,
lastReceivedPayment: lastReceivedPayment,
}));

View file

@ -28,13 +28,15 @@ const SentPayments = (props) => {
console.log('fetchSentPayments');
dispatch(clearSentPayments());
dispatch(fetchSentPayments({
squeakHash: props.squeakHash,
limit: 10,
lastSentPayment: null,
}));
}, [])
}, [props.squeakHash])
const fetchMore = () => {
dispatch(fetchSentPayments({
squeakHash: props.squeakHash,
limit: 10,
lastSentPayment: lastSentPayment,
}));

View file

@ -6,7 +6,9 @@ import {
} from '@reduxjs/toolkit'
import {
getSentPayments,
getSentPaymentsForSqueak,
getReceivedPayments,
getReceivedPaymentsForSqueak,
getPaymentSummary,
getPaymentSummaryForSqueak,
} from '../../api/client'
@ -24,7 +26,12 @@ const initialState = {
export const fetchSentPayments = createAsyncThunk(
'payments/fetchSentPayments',
async (values) => {
const response = await getSentPayments(
const response = values.squeakHash ? await getSentPaymentsForSqueak(
values.squeakHash,
values.limit,
values.lastSentPayment,
)
: await getSentPayments(
values.limit,
values.lastSentPayment,
);
@ -35,7 +42,12 @@ export const fetchSentPayments = createAsyncThunk(
export const fetchReceivedPayments = createAsyncThunk(
'payments/fetchReceivedPayments',
async (values) => {
const response = await getReceivedPayments(
const response = values.squeakHash ? await getReceivedPaymentsForSqueak(
values.squeakHash,
values.limit,
values.lastReceivedPayment,
)
: await getReceivedPayments(
values.limit,
values.lastReceivedPayment,
);

View file

@ -46,6 +46,10 @@ import { ICON_ARROWBACK, ICON_HEART, ICON_REPLY, ICON_RETWEET, ICON_HEARTFULL,
selectPaymentSummaryForSqueak,
} from '../../features/payments/paymentsSlice'
import SentPayments from '../../features/payments/SentPayments'
import ReceivedPayments from '../../features/payments/ReceivedPayments'
import store from '../../store'
@ -63,6 +67,8 @@ import { ICON_ARROWBACK, ICON_HEART, ICON_REPLY, ICON_RETWEET, ICON_HEARTFULL,
const [modalOpen, setModalOpen] = useState(false)
const [buyModalOpen, setBuyModalOpen] = useState(false)
const [spendingModalOpen, setSpendingModalOpen] = useState(false)
const [tab, setTab] = useState('Sats Spent')
const [offer, setOffer] = useState(null)
@ -97,6 +103,12 @@ import { ICON_ARROWBACK, ICON_HEART, ICON_REPLY, ICON_RETWEET, ICON_HEARTFULL,
setBuyModalOpen(!buyModalOpen)
}
const toggleSpendingModal = (param, type) => {
console.log('Toggle spending modal');
if(type){setTab(type)}
setTimeout(()=>{ setSpendingModalOpen(!spendingModalOpen) },20)
}
const handleModalClick = (e) => {
e.stopPropagation()
}
@ -228,10 +240,14 @@ import { ICON_ARROWBACK, ICON_HEART, ICON_REPLY, ICON_RETWEET, ICON_HEARTFULL,
</a>
</div>
<div className="squeak-stats">
<div className="int-num"> {paymentSummary && paymentSummary.getAmountSpentMsat() / 1000} </div>
<div className="int-text"> Sats Spent </div>
<div className="int-num"> {paymentSummary && paymentSummary.getAmountEarnedMsat() / 1000} </div>
<div className="int-text"> Sats Earned </div>
<div onClick={()=>toggleSpendingModal('members','Sats Spent')} >
<div className="int-num"> {paymentSummary && paymentSummary.getAmountSpentMsat() / 1000} </div>
<div className="int-text"> Sats Spent </div>
</div>
<div onClick={()=>toggleSpendingModal('members','Sats Earned')} >
<div className="int-num"> {paymentSummary && paymentSummary.getAmountEarnedMsat() / 1000} </div>
<div className="int-text"> Sats Earned </div>
</div>
</div>
<div className="squeak-interactions">
<div onClick={()=>toggleModal()} className="squeak-int-icon">
@ -393,7 +409,54 @@ import { ICON_ARROWBACK, ICON_HEART, ICON_REPLY, ICON_RETWEET, ICON_HEARTFULL,
</div>
</div> : null}
</div>:null}
</>
}
export default withRouter(Squeak)
{/* Modal for sats spent and earned */}
{squeak &&
<div onClick={()=>toggleSpendingModal()} style={{display: spendingModalOpen ? 'block' : 'none'}} className="modal-edit">
<div onClick={(e)=>handleModalClick(e)} className="modal-content">
<div className="modal-header no-b-border">
<div className="modal-closeIcon">
<div onClick={()=>toggleSpendingModal()} className="modal-closeIcon-wrap">
<ICON_CLOSE />
</div>
</div>
<p className="modal-title">{null}</p>
</div>
<div className="modal-body">
<div className="explore-nav-menu">
<div onClick={()=>setTab('Sats Spent')} className={tab =='Sats Spent' ? `explore-nav-item activeTab` : `explore-nav-item`}>
Sats Spent
</div>
<div onClick={()=>setTab('Sats Earned')} className={tab =='Sats Earned' ? `explore-nav-item activeTab` : `explore-nav-item`}>
Sats Earned
</div>
</div>
<div className="modal-scroll">
{tab === 'Sats Spent' ?
<>
<SentPayments squeakHash={props.id} />
</>
:
tab === 'Sats Earned' ?
<>
<ReceivedPayments squeakHash={props.id} />
</>
: <div className="try-searching">
Nothing to see here ..
<div/>
Try searching for people, usernames, or keywords
</div>
}
</div>
</div>
</div>
</div>}
</>
}
export default withRouter(Squeak)

View file

@ -228,6 +228,10 @@ service SqueakAdmin {
*/
rpc GetSentPayments (GetSentPaymentsRequest) returns (GetSentPaymentsReply) {}
/** sqkadmin: `getsentpaymentsforsqueak`
*/
rpc GetSentPaymentsForSqueak (GetSentPaymentsForSqueakRequest) returns (GetSentPaymentsForSqueakReply) {}
/** sqkadmin: `getsentpayment`
*/
rpc GetSentPayment (GetSentPaymentRequest) returns (GetSentPaymentReply) {}
@ -240,6 +244,10 @@ service SqueakAdmin {
*/
rpc GetReceivedPayments (GetReceivedPaymentsRequest) returns (GetReceivedPaymentsReply) {}
/** sqkadmin: `getreceivedpaymentsforsqueak`
*/
rpc GetReceivedPaymentsForSqueak (GetReceivedPaymentsForSqueakRequest) returns (GetReceivedPaymentsForSqueakReply) {}
/** sqkadmin: `subscribereceivedpayments`
*/
rpc SubscribeReceivedPayments (SubscribeReceivedPaymentsRequest) returns (stream ReceivedPayment) {}
@ -943,6 +951,22 @@ message GetSentPaymentsReply {
repeated SentPayment sent_payments = 1;
}
message GetSentPaymentsForSqueakRequest {
/// Hash of the squeak.
string squeak_hash = 1;
/// Limit number of results
int32 limit = 2;
/// Last entry
SentPayment last_sent_payment = 3;
}
message GetSentPaymentsForSqueakReply {
/// The sent payments
repeated SentPayment sent_payments = 1;
}
message GetSentPaymentRequest {
/// Sent payment id
int32 sent_payment_id = 1;
@ -1057,6 +1081,22 @@ message GetReceivedPaymentsReply {
repeated ReceivedPayment received_payments = 1;
}
message GetReceivedPaymentsForSqueakRequest {
/// Hash of the squeak.
string squeak_hash = 1;
/// Limit number of results
int32 limit = 2;
/// Last entry
ReceivedPayment last_received_payment = 3;
}
message GetReceivedPaymentsForSqueakReply {
/// The received payments
repeated ReceivedPayment received_payments = 1;
}
message ReceivedPayment {
/// The received payment id
int32 received_payment_id = 1;

View file

@ -738,6 +738,39 @@ class SqueakAdminServerHandler(object):
sent_payments=sent_payment_msgs,
)
def handle_get_sent_payments_for_squeak(self, request):
squeak_hash_str = request.squeak_hash
squeak_hash = bytes.fromhex(squeak_hash_str)
limit = request.limit
last_sent_payment = message_to_sent_payment(request.last_sent_payment) if request.HasField(
"last_sent_payment") else None
logger.info("""Handle get sent payments with
squeak_hash: {}
limit: {}
last_sent_payment: {}
""".format(
squeak_hash_str,
limit,
last_sent_payment,
))
sent_payments = self.squeak_controller.get_sent_payments_for_squeak(
squeak_hash,
limit,
last_sent_payment,
)
logger.info(
"Got number of sent payments: {}".format(
len(sent_payments)
)
)
sent_payment_msgs = [
sent_payment_to_message(sent_payment)
for sent_payment in sent_payments
]
return squeak_admin_pb2.GetSentPaymentsReply(
sent_payments=sent_payment_msgs,
)
def handle_get_sent_payment(self, request):
sent_payment_id = request.sent_payment_id
logger.info(
@ -786,6 +819,39 @@ class SqueakAdminServerHandler(object):
received_payments=received_payment_msgs,
)
def handle_get_received_payments_for_squeak(self, request):
squeak_hash_str = request.squeak_hash
squeak_hash = bytes.fromhex(squeak_hash_str)
limit = request.limit
last_received_payment = message_to_received_payment(request.last_received_payment) if request.HasField(
"last_received_payment") else None
logger.info("""Handle get received payments with
squeak_hash: {}
limit: {}
last_received_payment: {}
""".format(
squeak_hash,
limit,
last_received_payment,
))
received_payments = self.squeak_controller.get_received_payments_for_squeak(
squeak_hash,
limit,
last_received_payment,
)
logger.info(
"Got number of received payments: {}".format(
len(received_payments)
)
)
received_payment_msgs = [
received_payment_to_message(received_payment)
for received_payment in received_payments
]
return squeak_admin_pb2.GetReceivedPaymentsReply(
received_payments=received_payment_msgs,
)
def handle_subscribe_received_payments(self, request, stopped):
payment_index = request.payment_index
logger.info(

View file

@ -215,6 +215,9 @@ class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer):
def GetSentPayments(self, request, context):
return self.handler.handle_get_sent_payments(request)
def GetSentPaymentsForSqueak(self, request, context):
return self.handler.handle_get_sent_payments_for_squeak(request)
def GetSentPayment(self, request, context):
return self.handler.handle_get_sent_payment(request)
@ -224,6 +227,9 @@ class SqueakAdminServerServicer(squeak_admin_pb2_grpc.SqueakAdminServicer):
def GetReceivedPayments(self, request, context):
return self.handler.handle_get_received_payments(request)
def GetReceivedPaymentsForSqueak(self, request, context):
return self.handler.handle_get_received_payments_for_squeak(request)
def SubscribeReceivedPayments(self, request, context):
stopped = threading.Event()

View file

@ -421,6 +421,12 @@ def create_app(handler, username, password):
def getsentpayments(msg):
return handler.handle_get_sent_payments(msg)
@app.route("/getsentpaymentsforsqueak", methods=["POST"])
@login_required
@protobuf_serialized(squeak_admin_pb2.GetSentPaymentsForSqueakRequest())
def getsentpaymentsforsqueak(msg):
return handler.handle_get_sent_payments_for_squeak(msg)
@app.route("/getsentoffers", methods=["POST"])
@login_required
@protobuf_serialized(squeak_admin_pb2.GetSentOffersRequest())
@ -433,6 +439,12 @@ def create_app(handler, username, password):
def getreceivedpayments(msg):
return handler.handle_get_received_payments(msg)
@app.route("/getreceivedpaymentsforsqueak", methods=["POST"])
@login_required
@protobuf_serialized(squeak_admin_pb2.GetReceivedPaymentsForSqueakRequest())
def getreceivedpaymentsforsqueak(msg):
return handler.handle_get_received_payments_for_squeak(msg)
@app.route("/getnetwork", methods=["POST"])
@login_required
@protobuf_serialized(squeak_admin_pb2.GetNetworkRequest())

View file

@ -1,35 +1,35 @@
{
"files": {
"main.css": "/static/css/main.a68e0912.chunk.css",
"main.js": "/static/js/main.7f01080a.chunk.js",
"main.js.map": "/static/js/main.7f01080a.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.c059a2f2.js",
"runtime-main.js.map": "/static/js/runtime-main.c059a2f2.js.map",
"static/js/2.d77fac84.chunk.js": "/static/js/2.d77fac84.chunk.js",
"static/js/2.d77fac84.chunk.js.map": "/static/js/2.d77fac84.chunk.js.map",
"main.css": "/static/css/main.be11d9c8.chunk.css",
"main.js": "/static/js/main.c7ca5a55.chunk.js",
"main.js.map": "/static/js/main.c7ca5a55.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.f97cd83d.js",
"runtime-main.js.map": "/static/js/runtime-main.f97cd83d.js.map",
"static/js/2.02f1cb70.chunk.js": "/static/js/2.02f1cb70.chunk.js",
"static/js/2.02f1cb70.chunk.js.map": "/static/js/2.02f1cb70.chunk.js.map",
"static/css/3.1f6bb621.chunk.css": "/static/css/3.1f6bb621.chunk.css",
"static/js/3.f8daaa08.chunk.js": "/static/js/3.f8daaa08.chunk.js",
"static/js/3.f8daaa08.chunk.js.map": "/static/js/3.f8daaa08.chunk.js.map",
"static/css/4.6512f3a3.chunk.css": "/static/css/4.6512f3a3.chunk.css",
"static/js/4.57c210f1.chunk.js": "/static/js/4.57c210f1.chunk.js",
"static/js/4.57c210f1.chunk.js.map": "/static/js/4.57c210f1.chunk.js.map",
"static/js/4.5d28b4fe.chunk.js": "/static/js/4.5d28b4fe.chunk.js",
"static/js/4.5d28b4fe.chunk.js.map": "/static/js/4.5d28b4fe.chunk.js.map",
"static/css/5.3aaab79d.chunk.css": "/static/css/5.3aaab79d.chunk.css",
"static/js/5.074d222a.chunk.js": "/static/js/5.074d222a.chunk.js",
"static/js/5.074d222a.chunk.js.map": "/static/js/5.074d222a.chunk.js.map",
"static/js/5.01c68ef6.chunk.js": "/static/js/5.01c68ef6.chunk.js",
"static/js/5.01c68ef6.chunk.js.map": "/static/js/5.01c68ef6.chunk.js.map",
"index.html": "/index.html",
"precache-manifest.ac8e3e78eb255de1a032c5d4d7de13ff.js": "/precache-manifest.ac8e3e78eb255de1a032c5d4d7de13ff.js",
"precache-manifest.deaf13e5d22178a630902b47b020507a.js": "/precache-manifest.deaf13e5d22178a630902b47b020507a.js",
"service-worker.js": "/service-worker.js",
"static/css/3.1f6bb621.chunk.css.map": "/static/css/3.1f6bb621.chunk.css.map",
"static/css/4.6512f3a3.chunk.css.map": "/static/css/4.6512f3a3.chunk.css.map",
"static/css/5.3aaab79d.chunk.css.map": "/static/css/5.3aaab79d.chunk.css.map",
"static/css/main.a68e0912.chunk.css.map": "/static/css/main.a68e0912.chunk.css.map",
"static/js/2.d77fac84.chunk.js.LICENSE.txt": "/static/js/2.d77fac84.chunk.js.LICENSE.txt",
"static/css/main.be11d9c8.chunk.css.map": "/static/css/main.be11d9c8.chunk.css.map",
"static/js/2.02f1cb70.chunk.js.LICENSE.txt": "/static/js/2.02f1cb70.chunk.js.LICENSE.txt",
"static/media/icon.a0c2d343.svg": "/static/media/icon.a0c2d343.svg"
},
"entrypoints": [
"static/js/runtime-main.c059a2f2.js",
"static/js/2.d77fac84.chunk.js",
"static/css/main.a68e0912.chunk.css",
"static/js/main.7f01080a.chunk.js"
"static/js/runtime-main.f97cd83d.js",
"static/js/2.02f1cb70.chunk.js",
"static/css/main.be11d9c8.chunk.css",
"static/js/main.c7ca5a55.chunk.js"
]
}

View file

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#1da1f2"/><meta nam="description" content="Squeaknode!"/><meta name="og:title" content="Squeaknode"/><meta name="og:description" content="check out my the Squeaknode I made"/><link href="https://fonts.googleapis.com/css2?family=Assistant&display=swap" rel="stylesheet"><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>Squeaknode</title><link href="/static/css/main.a68e0912.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,o,i=t[0],c=t[1],l=t[2],f=0,d=[];f<i.length;f++)o=i[f],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&d.push(a[o][0]),a[o]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(s&&s(t);d.length;)d.shift()();return u.push.apply(u,l||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},a={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{3:1,4:1,5:1}[e]&&t.push(o[e]=new Promise((function(t,r){for(var n="static/css/"+({}[e]||e)+"."+{3:"1f6bb621",4:"6512f3a3",5:"3aaab79d"}[e]+".chunk.css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var l=(s=u[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(l===n||l===a))return t()}var f=document.getElementsByTagName("style");for(c=0;c<f.length;c++){var s;if((l=(s=f[c]).getAttribute("data-href"))===n||l===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"f8daaa08",4:"57c210f1",5:"074d222a"}[e]+".chunk.js"}(e);var l=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",l.name="ChunkLoadError",l.type=n,l.request=o,r[1](l)}a[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var c=this["webpackJsonptwitter-frontend"]=this["webpackJsonptwitter-frontend"]||[],l=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var s=l;r()}([])</script><script src="/static/js/2.d77fac84.chunk.js"></script><script src="/static/js/main.7f01080a.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#1da1f2"/><meta nam="description" content="Squeaknode!"/><meta name="og:title" content="Squeaknode"/><meta name="og:description" content="check out my the Squeaknode I made"/><link href="https://fonts.googleapis.com/css2?family=Assistant&display=swap" rel="stylesheet"><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>Squeaknode</title><link href="/static/css/main.be11d9c8.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function t(t){for(var n,o,i=t[0],c=t[1],l=t[2],f=0,d=[];f<i.length;f++)o=i[f],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&d.push(a[o][0]),a[o]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(s&&s(t);d.length;)d.shift()();return u.push.apply(u,l||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},a={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{3:1,4:1,5:1}[e]&&t.push(o[e]=new Promise((function(t,r){for(var n="static/css/"+({}[e]||e)+"."+{3:"1f6bb621",4:"6512f3a3",5:"3aaab79d"}[e]+".chunk.css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var l=(s=u[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(l===n||l===a))return t()}var f=document.getElementsByTagName("style");for(c=0;c<f.length;c++){var s;if((l=(s=f[c]).getAttribute("data-href"))===n||l===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"f8daaa08",4:"5d28b4fe",5:"01c68ef6"}[e]+".chunk.js"}(e);var l=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",l.name="ChunkLoadError",l.type=n,l.request=o,r[1](l)}a[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var c=this["webpackJsonptwitter-frontend"]=this["webpackJsonptwitter-frontend"]||[],l=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var s=l;r()}([])</script><script src="/static/js/2.02f1cb70.chunk.js"></script><script src="/static/js/main.c7ca5a55.chunk.js"></script></body></html>

View file

@ -1,54 +0,0 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "2ca4165e9aad20ec48180592a0b60c86",
"url": "/index.html"
},
{
"revision": "54c1e9d2b8060e37a08a",
"url": "/static/css/3.1f6bb621.chunk.css"
},
{
"revision": "19b2fac41bfd8bf51af9",
"url": "/static/css/4.6512f3a3.chunk.css"
},
{
"revision": "7d6b2117b26399d58d97",
"url": "/static/css/5.3aaab79d.chunk.css"
},
{
"revision": "84baeb5dc00bd43631d1",
"url": "/static/css/main.a68e0912.chunk.css"
},
{
"revision": "4d41818ed1adf7440230",
"url": "/static/js/2.d77fac84.chunk.js"
},
{
"revision": "a569361d31625f49e7e30aea21628ed5",
"url": "/static/js/2.d77fac84.chunk.js.LICENSE.txt"
},
{
"revision": "54c1e9d2b8060e37a08a",
"url": "/static/js/3.f8daaa08.chunk.js"
},
{
"revision": "19b2fac41bfd8bf51af9",
"url": "/static/js/4.57c210f1.chunk.js"
},
{
"revision": "7d6b2117b26399d58d97",
"url": "/static/js/5.074d222a.chunk.js"
},
{
"revision": "84baeb5dc00bd43631d1",
"url": "/static/js/main.7f01080a.chunk.js"
},
{
"revision": "53961c4b3a57de4fe006",
"url": "/static/js/runtime-main.c059a2f2.js"
},
{
"revision": "a0c2d343127a93b025409da6fd970700",
"url": "/static/media/icon.a0c2d343.svg"
}
]);

View file

@ -0,0 +1,54 @@
self.__precacheManifest = (self.__precacheManifest || []).concat([
{
"revision": "50ff99f611aae6aa430cedbdcc246108",
"url": "/index.html"
},
{
"revision": "54c1e9d2b8060e37a08a",
"url": "/static/css/3.1f6bb621.chunk.css"
},
{
"revision": "e706ac77a63cb706fbf7",
"url": "/static/css/4.6512f3a3.chunk.css"
},
{
"revision": "906887393fd03dc9f3bd",
"url": "/static/css/5.3aaab79d.chunk.css"
},
{
"revision": "b16c9afd5ad8c66a26af",
"url": "/static/css/main.be11d9c8.chunk.css"
},
{
"revision": "2f5c8fbe8561a635891f",
"url": "/static/js/2.02f1cb70.chunk.js"
},
{
"revision": "a569361d31625f49e7e30aea21628ed5",
"url": "/static/js/2.02f1cb70.chunk.js.LICENSE.txt"
},
{
"revision": "54c1e9d2b8060e37a08a",
"url": "/static/js/3.f8daaa08.chunk.js"
},
{
"revision": "e706ac77a63cb706fbf7",
"url": "/static/js/4.5d28b4fe.chunk.js"
},
{
"revision": "906887393fd03dc9f3bd",
"url": "/static/js/5.01c68ef6.chunk.js"
},
{
"revision": "b16c9afd5ad8c66a26af",
"url": "/static/js/main.c7ca5a55.chunk.js"
},
{
"revision": "40ad6039c0c397469cff",
"url": "/static/js/runtime-main.f97cd83d.js"
},
{
"revision": "a0c2d343127a93b025409da6fd970700",
"url": "/static/media/icon.a0c2d343.svg"
}
]);

View file

@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
importScripts(
"/precache-manifest.ac8e3e78eb255de1a032c5d4d7de13ff.js"
"/precache-manifest.deaf13e5d22178a630902b47b020507a.js"
);
self.addEventListener('message', (event) => {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,2 @@
!function(e){function t(t){for(var n,o,i=t[0],c=t[1],l=t[2],f=0,d=[];f<i.length;f++)o=i[f],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&d.push(a[o][0]),a[o]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(s&&s(t);d.length;)d.shift()();return u.push.apply(u,l||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},a={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{3:1,4:1,5:1}[e]&&t.push(o[e]=new Promise((function(t,r){for(var n="static/css/"+({}[e]||e)+"."+{3:"1f6bb621",4:"6512f3a3",5:"3aaab79d"}[e]+".chunk.css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var l=(s=u[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(l===n||l===a))return t()}var f=document.getElementsByTagName("style");for(c=0;c<f.length;c++){var s;if((l=(s=f[c]).getAttribute("data-href"))===n||l===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"f8daaa08",4:"57c210f1",5:"074d222a"}[e]+".chunk.js"}(e);var l=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",l.name="ChunkLoadError",l.type=n,l.request=o,r[1](l)}a[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var c=this["webpackJsonptwitter-frontend"]=this["webpackJsonptwitter-frontend"]||[],l=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var s=l;r()}([]);
//# sourceMappingURL=runtime-main.c059a2f2.js.map
!function(e){function t(t){for(var n,o,i=t[0],c=t[1],l=t[2],f=0,d=[];f<i.length;f++)o=i[f],Object.prototype.hasOwnProperty.call(a,o)&&a[o]&&d.push(a[o][0]),a[o]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(s&&s(t);d.length;)d.shift()();return u.push.apply(u,l||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},a={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{3:1,4:1,5:1}[e]&&t.push(o[e]=new Promise((function(t,r){for(var n="static/css/"+({}[e]||e)+"."+{3:"1f6bb621",4:"6512f3a3",5:"3aaab79d"}[e]+".chunk.css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var l=(s=u[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(l===n||l===a))return t()}var f=document.getElementsByTagName("style");for(c=0;c<f.length;c++){var s;if((l=(s=f[c]).getAttribute("data-href"))===n||l===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)})).then((function(){o[e]=0})));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=a[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=function(e){return i.p+"static/js/"+({}[e]||e)+"."+{3:"f8daaa08",4:"5d28b4fe",5:"01c68ef6"}[e]+".chunk.js"}(e);var l=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;l.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",l.name="ChunkLoadError",l.type=n,l.request=o,r[1](l)}a[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var c=this["webpackJsonptwitter-frontend"]=this["webpackJsonptwitter-frontend"]||[],l=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var s=l;r()}([]);
//# sourceMappingURL=runtime-main.f97cd83d.js.map

View file

@ -218,6 +218,18 @@ class SqueakController:
last_sent_payment,
)
def get_sent_payments_for_squeak(
self,
squeak_hash: bytes,
limit: int,
last_sent_payment: Optional[SentPayment],
) -> List[SentPayment]:
return self.squeak_store.get_sent_payments_for_squeak(
squeak_hash,
limit,
last_sent_payment,
)
def get_sent_payment(self, sent_payment_id: int) -> Optional[SentPayment]:
return self.squeak_store.get_sent_payment(sent_payment_id)
@ -234,6 +246,18 @@ class SqueakController:
last_received_payment,
)
def get_received_payments_for_squeak(
self,
squeak_hash: bytes,
limit: int,
last_received_payment: Optional[ReceivedPayment],
) -> List[ReceivedPayment]:
return self.squeak_store.get_received_payments_for_squeak(
squeak_hash,
limit,
last_received_payment,
)
def delete_all_expired_offers(self):
self.squeak_store.delete_all_expired_offers()

View file

@ -406,6 +406,18 @@ class SqueakStore:
last_sent_payment,
)
def get_sent_payments_for_squeak(
self,
squeak_hash: bytes,
limit: int,
last_sent_payment: Optional[SentPayment],
) -> List[SentPayment]:
return self.squeak_db.get_sent_payments_for_squeak(
squeak_hash,
limit,
last_sent_payment,
)
def get_sent_payment(self, sent_payment_id: int) -> Optional[SentPayment]:
return self.squeak_db.get_sent_payment(sent_payment_id)
@ -425,6 +437,18 @@ class SqueakStore:
last_received_payment,
)
def get_received_payments_for_squeak(
self,
squeak_hash: bytes,
limit: int,
last_received_payment: Optional[ReceivedPayment],
) -> List[ReceivedPayment]:
return self.squeak_db.get_received_payments_for_squeak(
squeak_hash,
limit,
last_received_payment,
)
def delete_all_expired_offers(self):
self.delete_all_expired_received_offers()
self.delete_all_expired_sent_offers()