Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,5 @@ SUPABASE_ANON_KEY=your-anon-key
# RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxxxxxx
# RESEND_FROM_EMAIL="Power Platform ToolBox <notifications@example.com>"
# RESEND_ADMIN_RECIPIENTS=ops@example.com,admin@example.com
# RESEND_TOOL_SUBMISSION_TEMPLATE_ID=8ee40255-741c-4c05-af92-126dc587aa40
# RESEND_TOOL_UPDATE_TEMPLATE_ID=570914fe-6c9f-4246-9c8c-4dc5dc2e75f2
# RESEND_TOOL_UPDATE_DEV_TEMPLATE_ID=00000000-0000-0000-0000-000000000000
# RESEND_TOOL_REVIEW_CHANGES_TEMPLATE_ID=11111111-1111-1111-1111-111111111111

```
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,4 @@ vite.config.ts.timestamp-*
# Next JS Typescript Env file
# see https://nextjs.org/docs/app/api-reference/config/typescript#next-envdts for additional reference
next-env.d.ts
.playwright-mcp/page-2026-08-25T17-28-50-591Z.yml
334 changes: 334 additions & 0 deletions app/(authenticated)/admin/verification-requests/page.tsx

Large diffs are not rendered by default.

134 changes: 120 additions & 14 deletions app/(authenticated)/dashboard/page.tsx

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions app/(public)/tools/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ import Link from "next/link";
import { useParams, useRouter } from "next/navigation";
import { useEffect, useState } from "react";

import "github-markdown-css/github-markdown-light.css";
import Markdown from "react-markdown";
import remarkGfm from "remark-gfm";
import "github-markdown-css/github-markdown-light.css";

import { Container } from "@/components/Container";
import { VerifiedCheckmark } from "@/components/VerifiedCheckmark";
import { FadeIn } from "@/components/animations";

interface Tool {
Expand All @@ -29,6 +30,7 @@ interface Tool {
lastUpdated?: string;
repository?: string;
website?: string;
tool_maturity?: { status: "unverified" | "verified" };
}

// Mock data for a tool (will be replaced with Supabase data)
Expand Down Expand Up @@ -166,6 +168,7 @@ export default function ToolDetailsPage() {
mau: (toolData.tool_analytics as any)?.mau || 0,
repository: (toolData as any).repository,
website: (toolData as any).website,
tool_maturity: toolData.tool_maturity || { status: "unverified" },
});
} else if (mockTools[toolId]) {
setTool(mockTools[toolId]);
Expand Down Expand Up @@ -245,7 +248,10 @@ export default function ToolDetailsPage() {
<span className="text-4xl sm:text-5xl">{tool.icon || "📦"}</span>
)}
</div>
<h1 className="text-3xl font-bold tracking-tight text-slate-900 sm:text-4xl">{tool.name}</h1>
<div className="flex items-center gap-2">
<h1 className="text-3xl font-bold tracking-tight text-slate-900 sm:text-4xl">{tool.name}</h1>
{tool.tool_maturity?.status === "verified" && <VerifiedCheckmark className="h-6 w-6 sm:h-7 sm:w-7" />}
</div>
</div>
<div className="flex flex-wrap gap-2 sm:gap-3">
{tool.categories.map((category) => (
Expand Down
13 changes: 10 additions & 3 deletions app/(public)/tools/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { Container } from "@/components/Container";
import { VerifiedCheckmark } from "@/components/VerifiedCheckmark";
import { FadeIn, SlideIn } from "@/components/animations";
import Image from "next/image";
import Link from "next/link";
Expand All @@ -16,6 +17,7 @@ interface Tool {
rating: number;
contributors: string[];
mau?: number;
tool_maturity?: { status: "unverified" | "verified" };
}

// Mock data for tools (fallback if API fails)
Expand Down Expand Up @@ -110,6 +112,7 @@ export default function ToolsPage() {
tool_analytics?: unknown;
tool_categories?: Array<{ categories: unknown }>;
tool_contributors?: Array<{ contributors: unknown }>;
tool_maturity?: { status: "unverified" | "verified" };
}) => ({
id: tool.id,
name: tool.name,
Expand All @@ -120,6 +123,7 @@ export default function ToolsPage() {
downloads: (tool.tool_analytics as { downloads: number; rating: number; mau?: number })?.downloads || 0,
rating: (tool.tool_analytics as { downloads: number; rating: number; mau?: number })?.rating || 0,
mau: (tool.tool_analytics as { downloads: number; rating: number; mau?: number })?.mau || 0,
tool_maturity: tool.tool_maturity || { status: "unverified" },
}),
);
setTools(transformed);
Expand Down Expand Up @@ -266,9 +270,12 @@ export default function ToolsPage() {
)}
</div>
<div className="flex-1 flex flex-col justify-between">
<p className="text-lg font-semibold text-slate-900 group-hover:text-gradient transition-colors line-clamp-2" title={tool.name}>
{tool.name}
</p>
<div className="flex items-start gap-1.5">
<p className="text-lg font-semibold text-slate-900 group-hover:text-gradient transition-colors line-clamp-2" title={tool.name}>
{tool.name}
</p>
{tool.tool_maturity?.status === "verified" && <VerifiedCheckmark className="mt-1 h-4 w-4" />}
</div>
<p className="text-xs text-slate-600">
by {tool.contributors.slice(0, 2).join(", ")}
{tool.contributors.length > 2 && ` +${tool.contributors.length - 2}`}
Expand Down
Loading
Loading