Move the feed page to the community section and add redirects
Update client-side routing and vercel.json to redirect the /feed endpoint to /community/feed, and integrate the Feed component into the Community page. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9203795e-937a-4306-b81d-b4d5c78c240e Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: a87bc4c4-2f36-45ef-9537-d97890015ee4 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7c94b7a0-29c7-4f2e-94ef-44b2153872b7/9203795e-937a-4306-b81d-b4d5c78c240e/duiWnI1 Replit-Helium-Checkpoint-Created: true
This commit is contained in:
parent
4577fd692e
commit
4077fac4c9
6 changed files with 39 additions and 7 deletions
2
.replit
2
.replit
|
|
@ -61,7 +61,7 @@ localPort = 40437
|
||||||
externalPort = 3001
|
externalPort = 3001
|
||||||
|
|
||||||
[[ports]]
|
[[ports]]
|
||||||
localPort = 43237
|
localPort = 45189
|
||||||
externalPort = 3002
|
externalPort = 3002
|
||||||
|
|
||||||
[deployment]
|
[deployment]
|
||||||
|
|
|
||||||
|
|
@ -224,7 +224,7 @@ const App = () => (
|
||||||
<Route path="/admin/feed" element={<AdminFeed />} />
|
<Route path="/admin/feed" element={<AdminFeed />} />
|
||||||
<Route path="/admin/docs-sync" element={<DocsSync />} />
|
<Route path="/admin/docs-sync" element={<DocsSync />} />
|
||||||
<Route path="/arms" element={<Arms />} />
|
<Route path="/arms" element={<Arms />} />
|
||||||
<Route path="/feed" element={<Feed />} />
|
<Route path="/feed" element={<Navigate to="/community/feed" replace />} />
|
||||||
<Route path="/teams" element={<Teams />} />
|
<Route path="/teams" element={<Teams />} />
|
||||||
<Route path="/squads" element={<Squads />} />
|
<Route path="/squads" element={<Squads />} />
|
||||||
<Route path="/mentee-hub" element={<MenteeHub />} />
|
<Route path="/mentee-hub" element={<MenteeHub />} />
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import Layout from "@/components/Layout";
|
import Layout from "@/components/Layout";
|
||||||
import SEO from "@/components/SEO";
|
import SEO from "@/components/SEO";
|
||||||
|
import Feed from "@/pages/Feed";
|
||||||
|
|
||||||
const API_BASE = import.meta.env.VITE_API_BASE || "";
|
const API_BASE = import.meta.env.VITE_API_BASE || "";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
|
|
@ -1255,6 +1256,7 @@ export default function Community() {
|
||||||
|
|
||||||
const communityTabItems = useMemo(
|
const communityTabItems = useMemo(
|
||||||
() => [
|
() => [
|
||||||
|
{ id: "feed", label: "Feed" },
|
||||||
{ id: "new-members", label: "New Members" },
|
{ id: "new-members", label: "New Members" },
|
||||||
{ id: "knowledge", label: "Knowledge Base" },
|
{ id: "knowledge", label: "Knowledge Base" },
|
||||||
{ id: "mentorship", label: "Mentorship" },
|
{ id: "mentorship", label: "Mentorship" },
|
||||||
|
|
@ -1937,6 +1939,12 @@ export default function Community() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{activeTab === "feed" && (
|
||||||
|
<TabsContent value="feed" className="mt-0">
|
||||||
|
<Feed embedded />
|
||||||
|
</TabsContent>
|
||||||
|
)}
|
||||||
|
|
||||||
{activeTab === "new-members" && (
|
{activeTab === "new-members" && (
|
||||||
<TabsContent value="new-members" className="mt-0">
|
<TabsContent value="new-members" className="mt-0">
|
||||||
{/* New Member Hub */}
|
{/* New Member Hub */}
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,11 @@ function parseContent(content: string): {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Feed() {
|
interface FeedProps {
|
||||||
|
embedded?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Feed({ embedded = false }: FeedProps) {
|
||||||
const { user, loading } = useAuth();
|
const { user, loading } = useAuth();
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
const composerRef = useRef<HTMLDivElement | null>(null);
|
const composerRef = useRef<HTMLDivElement | null>(null);
|
||||||
|
|
@ -486,9 +490,11 @@ export default function Feed() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
const content = (
|
||||||
<Layout>
|
<div className={cn(
|
||||||
<div className="min-h-screen bg-[radial-gradient(circle_at_top,_rgba(110,141,255,0.12),transparent_60%)]">
|
"bg-[radial-gradient(circle_at_top,_rgba(110,141,255,0.12),transparent_60%)]",
|
||||||
|
!embedded && "min-h-screen"
|
||||||
|
)}>
|
||||||
<div className="mx-auto flex w-full max-w-6xl flex-col gap-4 sm:gap-6 lg:gap-8 px-3 sm:px-4 pb-16 pt-6 sm:pt-10 lg:px-6">
|
<div className="mx-auto flex w-full max-w-6xl flex-col gap-4 sm:gap-6 lg:gap-8 px-3 sm:px-4 pb-16 pt-6 sm:pt-10 lg:px-6">
|
||||||
<section className="relative overflow-hidden rounded-2xl sm:rounded-3xl border border-border/40 bg-background/80 p-4 sm:p-6 lg:p-8 shadow-2xl backdrop-blur">
|
<section className="relative overflow-hidden rounded-2xl sm:rounded-3xl border border-border/40 bg-background/80 p-4 sm:p-6 lg:p-8 shadow-2xl backdrop-blur">
|
||||||
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(96,189,255,0.18),transparent_60%)]" />
|
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top_left,_rgba(96,189,255,0.18),transparent_60%)]" />
|
||||||
|
|
@ -942,6 +948,11 @@ export default function Feed() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (embedded) {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Layout>{content}</Layout>;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,14 @@ https://supabase.aethex.tech/auth/v1/callback
|
||||||
- `https://supabase.aethex.tech/auth/v1/callback`
|
- `https://supabase.aethex.tech/auth/v1/callback`
|
||||||
|
|
||||||
## Recent Changes (December 3, 2025)
|
## Recent Changes (December 3, 2025)
|
||||||
|
- ✅ **Discord-to-Feed Integration**: Messages from Discord FEED channel sync to AeThex community feed
|
||||||
|
- Bot listens to configured channel (DISCORD_MAIN_CHAT_CHANNELS env var)
|
||||||
|
- Posts display with purple Discord badge and channel name
|
||||||
|
- Supports images/videos from Discord messages
|
||||||
|
- Real-time updates via Supabase subscriptions
|
||||||
|
- ✅ **Moved /feed to /community/feed**: Feed is now a tab within the Community page
|
||||||
|
- Old /feed URL redirects to /community/feed
|
||||||
|
- Added redirect in vercel.json for production
|
||||||
- ✅ Fixed passport subdomain API to call aethex.foundation (identity authority)
|
- ✅ Fixed passport subdomain API to call aethex.foundation (identity authority)
|
||||||
- ✅ Fixed API paths: `subdomain-data` → `subdomain`, `project-data` → `project`
|
- ✅ Fixed API paths: `subdomain-data` → `subdomain`, `project-data` → `project`
|
||||||
- ✅ Restored wildcard rewrites in vercel.json for `*.aethex.me` and `*.aethex.space`
|
- ✅ Restored wildcard rewrites in vercel.json for `*.aethex.me` and `*.aethex.space`
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@
|
||||||
"has": [{ "type": "host", "value": "aethex.space" }],
|
"has": [{ "type": "host", "value": "aethex.space" }],
|
||||||
"destination": "https://aethex.dev/",
|
"destination": "https://aethex.dev/",
|
||||||
"permanent": true
|
"permanent": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/feed",
|
||||||
|
"destination": "/community/feed",
|
||||||
|
"permanent": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"rewrites": [
|
"rewrites": [
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue