Files
Virtnet.bond/themes/lucentui/views/vendor/affiliates/index.blade.php
2025-11-30 11:57:22 +01:00

282 lines
14 KiB
PHP

<div class="container mx-auto px-4 py-8 sm:px-6 lg:px-8">
<x-navigation.breadcrumb />
@isset($affiliate)
<!-- Stats Grid -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-5 mt-4 mb-12">
<!-- Visitors Card -->
<div class="bg-primary/10 border border-neutral/50 rounded-xl p-6 shadow-lg transition-all duration-300 hover:scale-[1.01] hover:shadow-xl hover:border-primary/50">
<div class="flex items-center justify-between mb-4">
<div class="bg-primary/10 p-3 rounded-full flex-shrink-0 shadow-sm">
<x-ri-eye-line class="size-6 text-primary" />
</div>
<span class="text-sm font-medium text-primary bg-primary/20 px-3 py-1 rounded-full">
{{ __('affiliates::affiliate.visitors') }}
</span>
</div>
<div>
<p class="text-3xl font-bold text-color-base mb-1">{{ Number::format($affiliate->visitors) }}</p>
<p class="text-sm text-color-muted">{{ __('affiliates::affiliate.total-visitors') }}</p>
</div>
</div>
<!-- Signups Card -->
<div class="bg-success/10 border border-neutral/50 rounded-xl p-6 shadow-lg transition-all duration-300 hover:scale-[1.01] hover:shadow-xl hover:border-success/50">
<div class="flex items-center justify-between mb-4">
<div class="bg-success/10 p-3 rounded-full flex-shrink-0 shadow-sm">
<x-ri-user-add-line class="size-6 text-success" />
</div>
<span class="text-sm font-medium text-success bg-success/20 px-3 py-1 rounded-full">
{{ __('affiliates::affiliate.signups') }}
</span>
</div>
<div>
<p class="text-3xl font-bold text-color-base mb-1">{{ Number::format($affiliate->signups) }}</p>
<p class="text-sm text-color-muted">{{ __('affiliates::affiliate.total-signups') }}</p>
@if($affiliate->visitors > 0)
<div class="mt-2">
<span class="text-xs font-medium text-color-muted">
Rate:
<span class="text-success">{{ number_format(($affiliate->signups / $affiliate->visitors) * 100, 1) }}%</span>
</span>
</div>
@endif
</div>
</div>
<!-- Earnings Card -->
<div class="bg-warning/10 border border-neutral/50 rounded-xl p-6 shadow-lg transition-all duration-300 hover:scale-[1.01] hover:shadow-xl hover:border-warning/50">
<div class="flex items-center justify-between mb-4">
<div class="bg-warning/10 p-3 rounded-full flex-shrink-0 shadow-sm">
<x-ri-money-dollar-circle-line class="size-6 text-warning" />
</div>
<span class="text-sm font-medium text-warning bg-warning/20 px-3 py-1 rounded-full">
{{ __('affiliates::affiliate.earnings') }}
</span>
</div>
<div>
<p class="text-sm text-color-muted mb-2">{{ __('affiliates::affiliate.total-earnings') }}</p>
<div class="space-y-1">
@foreach ($affiliate->earnings as $currency => $amount)
<div class="flex justify-between items-center">
<span class="text-lg font-bold text-color-base">{{ $currency }}:</span>
<span class="text-lg font-bold text-warning">{{ $amount }}</span>
</div>
@endforeach
</div>
</div>
</div>
</div>
<!-- Affiliate Link Section -->
<div class="bg-background-secondary/50 border border-neutral/50 rounded-xl p-6 shadow-lg mb-8">
<div class="flex items-center mb-4">
<div class="bg-primary/10 p-3 rounded-full flex-shrink-0 shadow-sm mr-4">
<x-ri-link class="size-6 text-primary" />
</div>
<div>
<h3 class="text-xl font-bold text-color-base">{{ __('affiliates::affiliate.affiliate') }}</h3>
<p class="text-sm text-color-muted">{{ __('affiliates::affiliate.your-affiliate-link') }}</p>
</div>
</div>
<div class="flex flex-col sm:flex-row gap-3">
<div class="flex-1">
<x-form.input
value="{{ url('/') }}?ref={{ $affiliate->code }}"
name="ref"
divClass="!mt-0"
type="text"
readonly
class="bg-background/50 border-neutral/50 focus:ring-primary focus:border-primary"
/>
</div>
<div class="flex gap-2">
<button
class="inline-flex items-center px-6 py-3 border border-transparent text-base font-medium rounded-full shadow-sm text-white bg-primary hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary transition-colors duration-200"
type="button"
onclick="copyToClipboard('{{ url('/?ref=' . $affiliate->code) }}')"
>
<x-ri-file-copy-line class="size-4 mr-2" />
{{ __('affiliates::affiliate.copy') }}
</button>
<button
type="button"
onclick="shareAffiliateLink('{{ url('/?ref=' . $affiliate->code) }}')"
class="inline-flex items-center px-4 py-3 border border-neutral/50 text-base font-medium rounded-full shadow-sm text-color-base bg-background-secondary hover:bg-background transition-colors duration-200"
>
<x-ri-share-line class="size-4" />
</button>
</div>
</div>
<!-- Success Message -->
<div id="copy-success" class="hidden mt-4 p-4 bg-success/10 border border-neutral/50 rounded-xl">
<div class="flex items-center">
<x-ri-checkbox-circle-fill class="size-5 text-success mr-2" />
<p class="text-sm font-medium text-success">Link Copied</p>
</div>
</div>
</div>
<!-- Quick Stats Summary -->
<div class="bg-background-secondary/50 border border-neutral/50 rounded-xl p-6 shadow-lg">
<h3 class="text-xl font-bold text-color-base mb-6">Quick Stats</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div class="bg-primary/10 border border-neutral/50 rounded-xl p-4 text-center">
<div class="flex items-center justify-center mb-2">
<x-ri-hashtag class="size-6 text-primary mr-2" />
<span class="text-2xl font-bold text-primary">{{ $affiliate->code }}</span>
</div>
<p class="text-sm font-medium text-primary">{{ __('affiliates::affiliate.code') }}</p>
</div>
@if($affiliate->visitors > 0)
<div class="bg-success/10 border border-neutral/50 rounded-xl p-4 text-center">
<div class="flex items-center justify-center mb-2">
<x-ri-percent-line class="size-6 text-success mr-2" />
<span class="text-2xl font-bold text-success">{{ number_format(($affiliate->signups / $affiliate->visitors) * 100, 1) }}%</span>
</div>
<p class="text-sm font-medium text-success">Conversion Rate</p>
</div>
@endif
<div class="bg-warning/10 border border-neutral/50 rounded-xl p-4 text-center">
<div class="flex items-center justify-center mb-2">
<x-ri-coins-line class="size-6 text-warning mr-2" />
<span class="text-2xl font-bold text-warning">{{ count($affiliate->earnings) }}</span>
</div>
<p class="text-sm font-medium text-warning">Earnings</p>
</div>
<div class="bg-inactive/10 border border-neutral/50 rounded-xl p-4 text-center">
<div class="flex items-center justify-center mb-2">
<x-ri-calendar-line class="size-6 text-inactive mr-2" />
<span class="text-2xl font-bold text-inactive">{{ Carbon\Carbon::parse($affiliate->created_at)->diffForHumans() }}</span>
</div>
<p class="text-sm font-medium text-inactive">Member Since</p>
</div>
</div>
</div>
@else
<!-- Sign Up Section -->
<div class="max-w-md mx-auto">
<div class="bg-background-secondary/50 border border-neutral/50 rounded-xl shadow-lg p-8">
<div class="text-center mb-6">
<div class="bg-primary/10 p-4 rounded-full w-20 h-20 mx-auto mb-4 flex items-center justify-center">
<x-ri-team-line class="size-10 text-primary" />
</div>
<h2 class="text-3xl lg:text-4xl font-bold text-color-base mb-4">Join Program</h2>
<p class="text-lg text-color-muted font-light">You haven't signed up yet</p>
</div>
<form wire:submit.prevent="signup" method="POST" class="space-y-4">
@if ($signup_type === 'custom')
<div>
<x-form.input
name="referral_code"
type="text"
:label="__('affiliates::affiliate.code')"
wire:model="referral_code"
class="bg-background border-neutral/50 focus:ring-primary focus:border-primary"
required
/>
</div>
@endif
<button
type="submit"
class="w-full inline-flex items-center justify-center px-6 py-3 border border-transparent text-base font-medium rounded-full shadow-sm text-white bg-primary hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary transition-colors duration-200"
>
<x-ri-user-add-line class="size-5 mr-2" />
{{ __('auth.sign_up') }}
</button>
</form>
<!-- Benefits List -->
<div class="mt-6 pt-6 border-t border-neutral/50">
<h4 class="text-lg font-bold text-color-base mb-4">Benefits</h4>
<div class="space-y-3">
<div class="flex items-center">
<div class="bg-success/10 p-2 rounded-full mr-3">
<x-ri-checkbox-circle-fill class="size-4 text-success" />
</div>
<span class="text-color-muted">Earn Commissions</span>
</div>
<div class="flex items-center">
<div class="bg-success/10 p-2 rounded-full mr-3">
<x-ri-checkbox-circle-fill class="size-4 text-success" />
</div>
<span class="text-color-muted">Track Performance</span>
</div>
<div class="flex items-center">
<div class="bg-success/10 p-2 rounded-full mr-3">
<x-ri-checkbox-circle-fill class="size-4 text-success" />
</div>
<span class="text-color-muted">Easy Sharing</span>
</div>
</div>
</div>
</div>
</div>
@endisset
<script>
function copyToClipboard(textToCopy) {
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(textToCopy).then(() => {
showCopySuccess();
}).catch(err => {
console.error('Failed to copy: ', err);
fallbackCopyToClipboard(textToCopy);
});
} else {
fallbackCopyToClipboard(textToCopy);
}
}
function fallbackCopyToClipboard(textToCopy) {
const temp = document.createElement("input");
temp.type = "text";
temp.value = textToCopy;
temp.style.position = "absolute";
temp.style.left = "-9999px";
document.body.appendChild(temp);
temp.select();
temp.setSelectionRange(0, 99999);
try {
document.execCommand("copy");
showCopySuccess();
} catch (err) {
console.error('Fallback copy failed: ', err);
}
document.body.removeChild(temp);
}
function showCopySuccess() {
const successMsg = document.getElementById('copy-success');
successMsg.classList.remove('hidden');
setTimeout(() => {
successMsg.classList.add('hidden');
}, 3000);
}
function shareAffiliateLink(url) {
if (navigator.share) {
navigator.share({
title: '{{ __("affiliates::affiliate.share-title") }}',
text: '{{ __("affiliates::affiliate.share-text") }}',
url: url
}).catch(err => console.log('Error sharing:', err));
} else {
copyToClipboard(url);
}
};
</script>
</div>