diff --git a/public/images/generic_logo.jpg b/public/images/generic_logo.jpg
new file mode 100644
index 0000000..6012302
Binary files /dev/null and b/public/images/generic_logo.jpg differ
diff --git a/public/images/logo-tcg-love.png b/public/images/logo-tcg-love.png
deleted file mode 100644
index 54ab053..0000000
Binary files a/public/images/logo-tcg-love.png and /dev/null differ
diff --git a/src/app/admin/AdminClient.tsx b/src/app/admin/AdminClient.tsx
index b416133..6df383e 100644
--- a/src/app/admin/AdminClient.tsx
+++ b/src/app/admin/AdminClient.tsx
@@ -5,131 +5,144 @@ import handleUpdateCoins from "./AdminServer";
import GiveawayManagement from "./GiveawayManagementCards";
interface AdminClientProps {
- email: string;
+ email: string;
}
export default function AdminClient({ email }: AdminClientProps) {
- const [giveaway, setGiveaway] = useState({
- title: "",
- description: "",
- value: 0,
- prize: "",
- entryCost: 70000000,
- duration: 0,
- endsAt: new Date(Date.now() + 24 * 60 * 60 * 1000).getTime() // Set to tomorrow
+ const [giveaway, setGiveaway] = useState({
+ title: "",
+ description: "",
+ value: 0,
+ prize: "",
+ entryCost: 70000000,
+ duration: 0,
+ endsAt: new Date(Date.now() + 24 * 60 * 60 * 1000).getTime(),
+ });
+ const [youtube_url, setYoutubeUrl] = useState("");
+ const [coin_value, setCoinValue] = useState(0);
+ const [showGiveawayManagement, setShowGiveawayManagement] = useState(false);
+
+ const handleCreateGiveaway = async () => {
+ const response = await fetch("/api/admin/create-giveaway", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(giveaway),
});
- const [youtube_url, setYoutubeUrl] = useState("");
- const [coin_value, setCoinValue] = useState(0);
- const [showGiveawayManagement, setShowGiveawayManagement] = useState(false);
+ if (response.ok) {
+ alert("Giveaway created successfully!");
+ setGiveaway({
+ title: "",
+ description: "",
+ value: 0,
+ prize: "",
+ entryCost: 70000000,
+ duration: 0,
+ endsAt: new Date(Date.now() + 24 * 60 * 60 * 1000).getTime(),
+ });
+ } else {
+ const error = await response.json();
+ alert(`Failed to create giveaway: ${error.error}`);
+ }
+ };
- const handleCreateGiveaway = async () => {
- const response = await fetch("/api/admin/create-giveaway", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(giveaway),
- });
- if (response.ok) {
- alert("Giveaway created successfully!");
-
- setGiveaway({ title: "", description: "", value: 0, prize: "", entryCost: 70000000, duration: 0, endsAt: new Date(Date.now() + 24 * 60 * 60 * 1000).getTime() }); // Reset form
- } else {
- const error = await response.json();
- alert(`Failed to create giveaway: ${error.error}`);
- }
- };
+ return (
+
+
+
Admin Dashboard
+
+ Welcome, {email}!
+
- return (
-
-
-
Admin Dashboard
-
Welcome, {email}!
-
- {/* Create Giveaway Form */}
-
-
๐ Create Giveaway
-
- setGiveaway({ ...giveaway, title: e.target.value })}
- className="w-full p-3 border border-pink-200 rounded-lg bg-white text-gray-700 focus:outline-none focus:ring-2 focus:ring-pink-400"
- />
-
-
-
- {/* Update User Coins Form */}
-
-
- {/* Toggle Giveaway Management */}
-
-
๐ฎ Giveaway Management
+ {/* Create Giveaway Form */}
+
+
๐ Create Giveaway
+
+ setGiveaway({ ...giveaway, title: e.target.value })}
+ className="w-full p-3 border border-gray-600 rounded-lg bg-gray-900 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-white"
+ />
+
+
+ {/* Update User Coins Form */}
+
+
+ {/* Toggle Giveaway Management */}
+
+
๐ฎ Giveaway Management
+
+ {showGiveawayManagement && (
+
+
+
+ )}
+
- );
-}
\ No newline at end of file
+
+ );
+}
diff --git a/src/app/giveaways/page.tsx b/src/app/giveaways/page.tsx
index d96e286..2724e36 100644
--- a/src/app/giveaways/page.tsx
+++ b/src/app/giveaways/page.tsx
@@ -8,7 +8,7 @@ export default async function GiveawaysPage() {
const session = await getServerSession(authOptions);
if (!session?.user?.email) {
- redirect("/api/auth/signin");
+ redirect("/api/auth/signin");
}
const giveaways = await db.giveaway.findMany({
@@ -35,64 +35,63 @@ export default async function GiveawaysPage() {
});
return (
-
+
{/* Header */}
- ๐
- {" "}
-
+ ๐{" "}
+
Active Giveaways
-
+
{/* Grid of Cards */}
- {giveaways
+ {giveaways
.filter((giveaway) => {
const remainingTime =
- new Date(giveaway.endsAt ?? 0).getTime() - Date.now();
+ new Date(giveaway.endsAt ?? 0).getTime() - Date.now();
return remainingTime > 0;
})
.map((giveaway) => {
const remainingTime = Math.max(
- 0,
- new Date(giveaway.endsAt ?? 0).getTime() - Date.now()
+ 0,
+ new Date(giveaway.endsAt ?? 0).getTime() - Date.now()
);
const days = Math.floor(remainingTime / (1000 * 60 * 60 * 24));
const hours = Math.floor(
- (remainingTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
+ (remainingTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
);
const minutes = Math.floor(
- (remainingTime % (1000 * 60 * 60)) / (1000 * 60)
+ (remainingTime % (1000 * 60 * 60)) / (1000 * 60)
);
const countdownText =
- days > 0
- ? `${days}d ${hours}h ${minutes}m left`
- : hours > 0
- ? `${hours}h ${minutes}m left`
- : `${minutes}m left`;
+ days > 0
+ ? `${days}d ${hours}h ${minutes}m left`
+ : hours > 0
+ ? `${hours}h ${minutes}m left`
+ : `${minutes}m left`;
return (
-
-
-
+
+
+
);
})}
);
-}
\ No newline at end of file
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 776d62f..d12cea3 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -7,78 +7,73 @@ export default function GiveawaySystem() {
const [activeTab, setActiveTab] = useState("how");
return (
-
+
{/* Header */}
-
- ๐{" "}
-
- TCG Love Giveaway System
-
-
-
Comment. Collect Coins. Win MTG Cards!
+
๐ Giveaway System
+
Earn points. Join raffles. Win rewards.
{/* Tabs */}
- {["how", "lottery", "entries", "patreon"].map((tab) => (
+ {["how", "lottery", "entries", "perks"].map((tab) => (
))}
{/* Tab Content */}
-
+
{activeTab === "how" && (
-
How It Works
-
- - ๐ฌ Comment on any TCG Love video to earn its coin value.
- - ๐ Use coins to join giveaways (10% of prize value = 1 entry).
- - ๐ Entry costs increase after 50, 100, 150 entries.
- - ๐ฅ Some high-value giveaways require you to burn coins.
+ How It Works
+
+ - ๐ฌ Interact to earn points.
+ - ๐ Spend points to enter giveaways.
+ - ๐ Entry cost increases with volume.
+ - ๐ฅ Premium rewards may require point burning.
)}
{activeTab === "lottery" && (
-
Weighted Lottery
+
Weighted Lottery
{[
- { label: "First 100 coins", value: "1x", percent: 100, color: "bg-yellow-400" },
- { label: "Next 100 coins", value: "0.5x", percent: 50, color: "bg-green-400" },
- { label: "Next 100 coins", value: "0.25x", percent: 25, color: "bg-blue-400" },
- { label: "Coins beyond 300", value: "0.1x", percent: 10, color: "bg-red-400" },
+ { label: "First 100 points", value: "1x", percent: 100 },
+ { label: "Next 100 points", value: "0.5x", percent: 50 },
+ { label: "Next 100 points", value: "0.25x", percent: 25 },
+ { label: "Beyond 300 points", value: "0.1x", percent: 10 },
].map((tier, i) => (
-
+
{tier.label}
{tier.value}
-
+
@@ -90,47 +85,45 @@ export default function GiveawaySystem() {
{activeTab === "entries" && (
-
Entry Scaling & Burning
-
- Each giveaway has a base coin cost for one entry. As more entries are added, the cost increases:
+
Entry Scaling
+
+ Entry costs rise as more participants join:
-
- - ๐น First 50 entries: 10% of prize value
- - ๐ธ 51โ100 entries: 15%
- - ๐ฅ 100+ entries: 20% + potential coin burn for top-tier cards
+
+ - ๐น First 50 entries: standard rate
+ - ๐ธ 51โ100 entries: higher rate
+ - ๐ฅ 100+ entries: premium rate + possible point burn
-
- ๐ก Some $50+ giveaways will ask you to burn coins (e.g., +50 coins per extra entry).
+
+ ๐ก High-value giveaways may require additional point expenditure.
)}
- {activeTab === "patreon" && (
+ {activeTab === "perks" && (
-
Support Us on Patreon
-
- Become a patron and receive coins automatically every month โ no commenting required!
+
Supporter Perks
+
+ Get automatic point rewards and exclusive access by supporting us.
-
- - ๐ Monthly coin drops based on your tier
- - ๐๏ธ Access to patron-only giveaways
- - ๐ Helps keep the pack openings flowing!
+
+ - ๐ Monthly point drops
+ - ๐๏ธ Private giveaways
+ - ๐ Support the systemโs growth
- Join Patreon
+ Learn More
)}
{/* Footer */}
-
-
โ ๏ธ This system is evolving โ always check our Discord or YouTube for updates.
+
+
โ ๏ธ This system is evolving. Stay tuned for updates.
diff --git a/src/app/profile/ProfileClient.tsx b/src/app/profile/ProfileClient.tsx
index 49bb5d9..3551d1e 100644
--- a/src/app/profile/ProfileClient.tsx
+++ b/src/app/profile/ProfileClient.tsx
@@ -8,62 +8,66 @@ interface User {
}
export default function ProfileClient({ user }: { user: User }) {
-
return (
-
+
-
+
{/* Profile Header */}
-
-
-
- {user.name?.[0]?.toUpperCase() || 'U'}
+
+
+
+ {user.name?.[0]?.toUpperCase() || "U"}
{user.name}
-
๐ Premium Member
+
๐ Premium Member
-
+
{/* Profile Info & Wallet */}
{/* Info Block */}
- {[["๐ค", "Full Name", user.name], ["๐ง", "Email Address", user.email], ["๐บ", "YouTube Handle", user.youtubeHandle]].map(
- ([icon, label, value], index) => (
-
- )
- )}
-
-
- {/* Wallet */}
-
-
-
-
Available Balance
-
-
๐ฐ
-
{user.coins}
+ {[
+ ["๐ค", "Full Name", user.name],
+ ["๐ง", "Email Address", user.email],
+ ["๐บ", "YouTube Handle", user.youtubeHandle],
+ ].map(([icon, label, value], index) => (
+
+
{icon}
+
+
{label}
+
{value || "โ"}
-
+
+ {/* Wallet */}
+
+
+
+
Available Balance
+
+ ๐ฐ
+ {user.coins}
+
+
+
-
+
{/* Achievements */}
-
-
+
+
โญ
Achievements
@@ -73,9 +77,12 @@ export default function ProfileClient({ user }: { user: User }) {
["12", "Active Days"],
["3", "Badges Earned"],
].map(([value, label], idx) => (
-
-
{value}
-
{label}
+
))}
@@ -84,5 +91,5 @@ export default function ProfileClient({ user }: { user: User }) {
- );
+ );
}