116 lines
4.6 KiB
Common Lisp
116 lines
4.6 KiB
Common Lisp
(text "{% extends \"root.html\" %} {% block head %}")
|
|
(title
|
|
(text "Wallet - {{ config.name }}"))
|
|
(text "{% endblock %} {% block body %} {{ macros::nav(selected=\"wallet\") }}")
|
|
(main
|
|
("class" "flex flex_col gap_2")
|
|
(div
|
|
("class" "card_nest")
|
|
(div
|
|
("class" "card small flex items_center justify_between gap_2")
|
|
(span
|
|
("class" "flex items_center gap_2")
|
|
(icon (text "piggy-bank"))
|
|
(span (str (text "general:link.wallet")))))
|
|
(div
|
|
("class" "card lowered flex flex_col gap_4")
|
|
(button
|
|
("class" "card button raised")
|
|
("onclick" "document.getElementById('buy_dialog').showModal()")
|
|
(b (text "Coin balance"))
|
|
(h3
|
|
("class" "flex gap_2 items_center")
|
|
("style" "height: 24px")
|
|
(icon (text "badge-cent"))
|
|
(text "{{ user.coins }}")))))
|
|
(div
|
|
("class" "card_nest")
|
|
(div
|
|
("class" "card small flex items_center justify_between gap_2")
|
|
(span
|
|
("class" "flex items_center gap_2")
|
|
(icon (text "clock"))
|
|
(span (str (text "economy:label.recent_transfers")))))
|
|
(div
|
|
("class" "card lowered flex flex_col gap_4")
|
|
(div
|
|
("class" "w_full")
|
|
("style" "overflow: auto")
|
|
(table
|
|
("class" "w_full")
|
|
(thead
|
|
(th (text "Created"))
|
|
(th (text "Sender"))
|
|
(th (text "Receiver"))
|
|
(th (text "Amount"))
|
|
(th (text "Product")))
|
|
(tbody
|
|
(text "{% for transfer in list -%}")
|
|
(tr
|
|
(td (span ("class" "date short") (text "{{ transfer[1] }}")))
|
|
(td ("class" "w_content") (text "{{ components::full_username(user=transfer[3]) }}"))
|
|
(td ("class" "w_content") (text "{{ components::full_username(user=transfer[4]) }}"))
|
|
(td
|
|
("class" "flex items_center gap_1")
|
|
(text "{{ transfer[2] }}")
|
|
(text "{% if transfer[6] -%}")
|
|
(span ("class" "flex items_center gap_1") ("title" "Pending") (icon (text "clock")))
|
|
(text "{%- endif %}"))
|
|
(td
|
|
(text "{% if transfer[5] -%}")
|
|
(a
|
|
("href" "/product/{{ transfer[5].id }}")
|
|
(icon (text "external-link")))
|
|
(text "{%- endif %}")))
|
|
(text "{%- endfor %}")))))))
|
|
|
|
(dialog
|
|
("id" "buy_dialog")
|
|
(div
|
|
("class" "inner flex flex_col gap_2")
|
|
(p (text "All coin purchases are one-time and will not recur."))
|
|
(p (text "If you do not receive your coins within a minute of purchase, please contact support."))
|
|
|
|
(button
|
|
("class" "lowered w_full justify_start")
|
|
("onclick" "checkout('Coins100')")
|
|
(text "100 coins ({{ config.stripe.price_texts.coins_100 }})"))
|
|
|
|
(button
|
|
("class" "w_full justify_start")
|
|
("onclick" "checkout('Coins400')")
|
|
(text "400 coins ({{ config.stripe.price_texts.coins_400 }})"))
|
|
|
|
(hr ("class" "margin"))
|
|
(div
|
|
("class" "flex gap_2 justify_between")
|
|
(div null?)
|
|
(button
|
|
("class" "lowered red")
|
|
("type" "button")
|
|
("onclick", "document.getElementById('buy_dialog').close()")
|
|
(icon (text "x"))
|
|
(str (text "dialog:action.cancel"))))))
|
|
|
|
(script
|
|
(text "globalThis.checkout = (product) => {
|
|
document.getElementById('buy_dialog').close();
|
|
fetch(\"/api/v1/service_hooks/stripe/checkout\", {
|
|
method: \"POST\",
|
|
headers: {
|
|
\"Content-Type\": \"application/json\",
|
|
},
|
|
body: JSON.stringify({
|
|
product,
|
|
}),
|
|
})
|
|
.then((res) => res.json())
|
|
.then((res) => {
|
|
trigger(\"atto::toast\", [res.ok ? \"success\" : \"error\", res.message]);
|
|
|
|
if (res.ok) {
|
|
window.location.href = res.payload;
|
|
}
|
|
});
|
|
}"))
|
|
(text "{% endblock %}")
|