Support super manager access

This commit is contained in:
Ruslan Bakiev
2026-04-04 09:41:36 +07:00
parent ecd92ef7e4
commit ad0bae79e8
8 changed files with 136 additions and 17 deletions

View File

@@ -2,9 +2,9 @@
import { useQuery } from '@vue/apollo-composable';
import {
ManagerBonusBalancesDocument,
ReferralStatsDocument,
ManagerWithdrawalRequestsDocument,
type ManagerBonusBalancesQuery,
type ReferralStatsQuery,
type ManagerWithdrawalRequestsQuery,
} from '~/composables/graphql/generated';
definePageMeta({
@@ -12,14 +12,16 @@ definePageMeta({
});
type BalanceItem = ManagerBonusBalancesQuery['managerBonusBalances'][number];
type WithdrawalItem = ReferralStatsQuery['referralStats']['pendingWithdrawals'][number];
type WithdrawalItem = ManagerWithdrawalRequestsQuery['managerWithdrawalRequests'][number];
const route = useRoute();
const router = useRouter();
const search = ref('');
const balancesQuery = useQuery(ManagerBonusBalancesDocument);
const bonusQuery = useQuery(ReferralStatsDocument);
const withdrawalsQuery = useQuery(ManagerWithdrawalRequestsDocument, {
status: 'PENDING',
});
const activeTab = computed<'balances' | 'withdrawals'>(() => (
route.query.tab === 'withdrawals' ? 'withdrawals' : 'balances'
@@ -35,7 +37,7 @@ function setTab(tab: 'balances' | 'withdrawals') {
}
const balances = computed<BalanceItem[]>(() => balancesQuery.result.value?.managerBonusBalances ?? []);
const withdrawals = computed<WithdrawalItem[]>(() => bonusQuery.result.value?.referralStats.pendingWithdrawals ?? []);
const withdrawals = computed<WithdrawalItem[]>(() => withdrawalsQuery.result.value?.managerWithdrawalRequests ?? []);
const filteredBalances = computed(() => {
const query = search.value.trim().toLowerCase();
@@ -67,7 +69,9 @@ const filteredWithdrawals = computed(() => {
}
return [
item.requesterId,
item.requesterFullName,
item.requesterEmail,
item.companyName || '',
String(item.amount),
item.status,
item.reviewComment || '',
@@ -133,7 +137,7 @@ const filteredWithdrawals = computed(() => {
</template>
<template v-else>
<div v-if="bonusQuery.loading.value" class="manager-empty-state">
<div v-if="withdrawalsQuery.loading.value" class="manager-empty-state">
Загружаем заявки...
</div>
<div v-else-if="filteredWithdrawals.length === 0" class="manager-empty-state">
@@ -147,7 +151,9 @@ const filteredWithdrawals = computed(() => {
>
<div class="flex flex-col gap-3 md:flex-row md:items-start md:justify-between">
<div class="space-y-1">
<p class="text-sm font-semibold text-[#123824]">Пользователь: {{ withdrawal.requesterId }}</p>
<p class="text-sm font-semibold text-[#123824]">{{ withdrawal.requesterFullName }}</p>
<p class="text-sm text-[#355947]">{{ withdrawal.requesterEmail }}</p>
<p v-if="withdrawal.companyName" class="text-sm text-[#355947]">{{ withdrawal.companyName }}</p>
<p class="text-sm text-[#355947]">Сумма: {{ withdrawal.amount }}</p>
<p class="text-xs text-[#5c7b69]">{{ new Date(withdrawal.createdAt).toLocaleString() }}</p>
</div>

View File

@@ -1,8 +1,9 @@
<script setup lang="ts">
import { useMutation, useQuery } from '@vue/apollo-composable';
import {
ReferralStatsDocument,
ManagerWithdrawalRequestsDocument,
ReviewRewardWithdrawalDocument,
type ManagerWithdrawalRequestsQuery,
} from '~/composables/graphql/generated';
definePageMeta({
@@ -11,8 +12,11 @@ definePageMeta({
const route = useRoute();
const withdrawalId = computed(() => String(route.params.id || ''));
type WithdrawalItem = ManagerWithdrawalRequestsQuery['managerWithdrawalRequests'][number];
const bonusQuery = useQuery(ReferralStatsDocument);
const withdrawalsQuery = useQuery(ManagerWithdrawalRequestsDocument, {
status: null,
});
const reviewMutation = useMutation(ReviewRewardWithdrawalDocument);
const decision = ref<'APPROVE' | 'REJECT'>('APPROVE');
@@ -20,7 +24,7 @@ const reviewComment = ref('');
const reviewResult = ref('');
const currentWithdrawal = computed(() =>
(bonusQuery.result.value?.referralStats.pendingWithdrawals ?? []).find((item) => item.id === withdrawalId.value),
(withdrawalsQuery.result.value?.managerWithdrawalRequests ?? []).find((item: WithdrawalItem) => item.id === withdrawalId.value),
);
async function reviewWithdrawal() {
@@ -37,7 +41,7 @@ async function reviewWithdrawal() {
});
reviewResult.value = response?.data?.reviewRewardWithdrawal.status ?? '';
await bonusQuery.refetch();
await withdrawalsQuery.refetch({ status: null });
}
</script>
@@ -45,7 +49,7 @@ async function reviewWithdrawal() {
<section class="space-y-6 max-w-3xl">
<NuxtLink to="/bonus-system" class="text-sm font-semibold text-[#0d854a]"> Назад к бонусам</NuxtLink>
<div v-if="bonusQuery.loading.value" class="manager-empty-state">
<div v-if="withdrawalsQuery.loading.value" class="manager-empty-state">
Загружаем заявку на вывод...
</div>
@@ -57,7 +61,9 @@ async function reviewWithdrawal() {
<div class="manager-hero">
<p class="manager-eyebrow">Вывод</p>
<h1 class="manager-title">Проверка заявки на вывод</h1>
<p class="manager-copy">Пользователь: {{ currentWithdrawal.requesterId }} · Сумма: {{ currentWithdrawal.amount }}</p>
<p class="manager-copy">
{{ currentWithdrawal.requesterFullName }} · {{ currentWithdrawal.requesterEmail }} · Сумма: {{ currentWithdrawal.amount }}
</p>
</div>
<div class="surface-card rounded-3xl p-5 space-y-3">