tetratto/crates/app/src/public/html/economy/wallet.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 %}")