added balance manipulation

This commit is contained in:
FIRST_NAME LAST_NAME 2025-10-12 21:11:37 +03:00
parent 86d9ac8689
commit 5724d30ce0
6 changed files with 225 additions and 4 deletions

View File

@ -18,7 +18,7 @@
showMenu = !showMenu;
}}
tabindex="0"
class="btn btn-ghost lg:hidden w-[54px] max-w-[54px] p-1"
class="btn btn-ghost 2xl:hidden w-[54px] max-w-[54px] p-1"
>
{#if !showMenu}
<svg
@ -45,7 +45,7 @@
{jwtDecode(getAuthInfo()?.a)?.role == "4" ? "Admin" : "Moder"}
</p>
</div>
<div class="navbar-center hidden lg:flex font-semibold">
<div class="navbar-center hidden 2xl:flex font-semibold">
<ul class="menu menu-horizontal px-1">
<li>
<a href="/admin/userslist">Пользователи</a>
@ -61,6 +61,7 @@
<li><a href="/admin/currencies">Валюты</a></li>
<li><a href="/admin/sms">СМС</a></li>
<li><a href="/admin/withdrawals">Вывод средств</a></li>
<li><a href="/admin/change-balance/0">Управление балансом</a></li>
{/if}
<!-- <li><a>Item 3</a></li> -->
</ul>
@ -83,7 +84,7 @@
</div>
<div
class={"fixed inset-0 top-16 z-50 px-5 flex flex-col items-center justify-center bg-base-100 transition-all duration-150 lg:hidden " +
class={"fixed inset-0 top-16 z-50 px-5 flex flex-col items-center justify-center bg-base-100 transition-all duration-150 2xl:hidden " +
(showMenu ? "" : "-translate-x-full")}
>
<ul
@ -222,6 +223,21 @@
<ChevronRightIcon />
</div>
</li>
<div
class="h-[1px] w-full bg-neutral flex-shrink-0 opacity-50 my-[5px]"
></div>
<li class="relative">
<a
class="text-lg"
on:click={() => {
showMenu = false;
}}
href="/admin/change-balance/0">Управление балансом</a
>
<div class="absolute right-0 top-[2px] pointer-events-none">
<ChevronRightIcon />
</div>
</li>
{/if}
</ul>
</div>

View File

@ -1,4 +1,4 @@
export const prerender = true;
export const ssr = false;
console.log = () => {};
// console.log = () => {};

View File

@ -0,0 +1,9 @@
import { browser } from "$app/environment";
export async function load({ params }) {
if (!browser) return;
let { token } = params;
return {
token: token,
};
}

View File

@ -0,0 +1,191 @@
<script>
import { makeAuthHeaderForAxios, getAuthInfo } from "$lib/auth/Auth.js";
import { makePost } from "$lib/tools/requests/requests.js";
import { sayError, sayInfo } from "$lib/tools/toaster/Toaster.js";
import { onMount } from "svelte";
export let data;
let { token } = data;
let tokenValue = "";
let disableContinueButton = false;
let syncUserBalance = false;
let syncUserBalanceSuccess = false;
let syncedBalance = "";
let syncedCode = "";
let changeAmount = 0;
let balanceChanged = false;
async function getUserInfo() {
if (syncUserBalance) return;
balanceChanged = false;
syncUserBalance = true;
syncUserBalanceSuccess = false;
const res = await makePost(
"getUser",
{
token: tokenValue.trim(),
},
// @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
if (res.error) {
syncUserBalanceSuccess = false;
syncUserBalance = false;
sayError("Не удалось получить баланс пользователя");
return;
}
// syncedBalance = Number(res.data.balance);
syncedCode = res.data.code;
disableContinueButton = true;
syncUserBalance = false;
syncUserBalanceSuccess = true;
console.log(res.data);
}
let inProcess = false;
async function increaseBalance() {
inProcess = true;
balanceChanged = false;
const res = await makePost(
"admin/user/debit",
{
token: tokenValue,
amount: changeAmount.toString(),
},
// @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
if (res.error) {
inProcess = false;
balanceChanged = false;
sayError("Не удалось пополнить баланс");
return;
}
inProcess = false;
syncedBalance = Number(res.data.balance)
.toLocaleString("en-US", {
maximumFractionDigits: 10,
})
.replace(/,/g, " ");
balanceChanged = true;
sayInfo("Успешное пополнение");
}
async function decreaseBalance() {
inProcess = true;
balanceChanged = false;
const res = await makePost(
"admin/user/credit",
{
token: tokenValue,
amount: changeAmount.toString(),
},
// @ts-ignore
makeAuthHeaderForAxios(getAuthInfo()?.a)
);
if (res.error) {
inProcess = false;
balanceChanged = false;
sayError("Не удалось списать баланс");
return;
}
inProcess = false;
syncedBalance = Number(res.data.balance)
.toLocaleString("en-US", {
maximumFractionDigits: 10,
})
.replace(/,/g, " ");
balanceChanged = true;
sayInfo("Успешное списание");
}
onMount(() => {
if (token && typeof token === "string" && token.length >= 12) {
tokenValue = token;
// console.log(tokenValue);
}
});
</script>
<div class="w-full flex flex-col gap-8">
<div class="flex gap-4">
<div class="bg-accent rounded-[4px] w-[10px] h-full"></div>
<h1 class="text-2xl font-semibold">Изменение баланса пользователя</h1>
</div>
<div class="w-full grid grid-cols-1 gap-4 p-4 rounded-box bg-base-300">
<label class={"input input-bordered flex items-center gap-2 "}>
Токен:
<input
bind:value={tokenValue}
type="text"
class="grow text-lg text-info"
/>
</label>
<button
on:click={() => {
getUserInfo();
}}
class="btn btn-info"
>
{#if syncUserBalance}
<span class="loading loading-md"></span>
{:else if !disableContinueButton}
Продолжить
{:else}
Обновить токен
{/if}
</button>
{#if syncUserBalanceSuccess}
{#if balanceChanged}
<p class="text-xl">
Новый баланс: <span class="font-bold"
>{syncedBalance} {syncedCode}</span
>
</p>
{/if}
<p class="text-xl">
Валюта токена: <span class="font-bold">{syncedCode}</span>
</p>
Укажите сумму списания/пополнения:
<label class={"input input-bordered flex items-center gap-2 "}>
<input
bind:value={changeAmount}
type="text"
class="grow text-lg text-info"
/>
</label>
<div class="w-full grid grid-cols-2 gap-4">
<button
class="btn btn-success"
on:click={() => {
if (inProcess) return;
increaseBalance();
}}
>
{#if inProcess}
<span class="loading loading-md"></span>
{:else}
Пополнить
{/if}
</button>
<button
class="btn btn-warning"
on:click={() => {
if (inProcess) return;
decreaseBalance();
}}
>
{#if inProcess}
<span class="loading loading-md"></span>
{:else}
Списать
{/if}
</button>
</div>
{/if}
</div>
</div>

View File

@ -314,6 +314,10 @@
href={window.location.pathname.replace("profile", "change")}
class="btn btn-info btn-outline rounded-lg btn-sm">Изменить</a
>
<a
href={`/admin/change-balance/${token}`}
class="btn btn-neutral btn-outline rounded-lg btn-sm">Изменить баланс</a
>
<button
on:click={() => {
if (confirm("Вы уверены, что хотите удалить пользователя?"))

View File

@ -24,6 +24,7 @@ const config = {
"/user/edit/req/sampleToken/sampleReqID",
"/user/neworder/sampleToken",
"/user/profile/sampleToken",
"/change-balance/sampleToken",
"/",
"/login",
"/newuser",