commit
dcc186ffc1
18 changed files with 37146 additions and 57 deletions
9
.claude/settings.local.json
Normal file
9
.claude/settings.local.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(find:*)",
|
||||||
|
"Bash(ls:*)"
|
||||||
|
],
|
||||||
|
"deny": []
|
||||||
|
}
|
||||||
|
}
|
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -43,3 +43,8 @@ next-env.d.ts
|
||||||
# firebase
|
# firebase
|
||||||
firebase-debug.log
|
firebase-debug.log
|
||||||
firestore-debug.log
|
firestore-debug.log
|
||||||
|
|
||||||
|
# amplify
|
||||||
|
.amplify
|
||||||
|
amplify_outputs*
|
||||||
|
amplifyconfiguration*
|
||||||
|
|
11
amplify/auth/resource.ts
Normal file
11
amplify/auth/resource.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { defineAuth } from '@aws-amplify/backend';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define and configure your auth resource
|
||||||
|
* @see https://docs.amplify.aws/gen2/build-a-backend/auth
|
||||||
|
*/
|
||||||
|
export const auth = defineAuth({
|
||||||
|
loginWith: {
|
||||||
|
email: true,
|
||||||
|
},
|
||||||
|
});
|
11
amplify/backend.ts
Normal file
11
amplify/backend.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { defineBackend } from '@aws-amplify/backend';
|
||||||
|
import { auth } from './auth/resource';
|
||||||
|
import { data } from './data/resource';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see https://docs.amplify.aws/react/build-a-backend/ to add storage, functions, and more
|
||||||
|
*/
|
||||||
|
defineBackend({
|
||||||
|
auth,
|
||||||
|
data,
|
||||||
|
});
|
53
amplify/data/resource.ts
Normal file
53
amplify/data/resource.ts
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
|
||||||
|
|
||||||
|
/*== STEP 1 ===============================================================
|
||||||
|
The section below creates a Todo database table with a "content" field. Try
|
||||||
|
adding a new "isDone" field as a boolean. The authorization rule below
|
||||||
|
specifies that any unauthenticated user can "create", "read", "update",
|
||||||
|
and "delete" any "Todo" records.
|
||||||
|
=========================================================================*/
|
||||||
|
const schema = a.schema({
|
||||||
|
Todo: a
|
||||||
|
.model({
|
||||||
|
content: a.string(),
|
||||||
|
})
|
||||||
|
.authorization((allow) => [allow.guest()]),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Schema = ClientSchema<typeof schema>;
|
||||||
|
|
||||||
|
export const data = defineData({
|
||||||
|
schema,
|
||||||
|
authorizationModes: {
|
||||||
|
defaultAuthorizationMode: 'identityPool',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/*== STEP 2 ===============================================================
|
||||||
|
Go to your frontend source code. From your client-side code, generate a
|
||||||
|
Data client to make CRUDL requests to your table. (THIS SNIPPET WILL ONLY
|
||||||
|
WORK IN THE FRONTEND CODE FILE.)
|
||||||
|
|
||||||
|
Using JavaScript or Next.js React Server Components, Middleware, Server
|
||||||
|
Actions or Pages Router? Review how to generate Data clients for those use
|
||||||
|
cases: https://docs.amplify.aws/gen2/build-a-backend/data/connect-to-API/
|
||||||
|
=========================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
"use client"
|
||||||
|
import { generateClient } from "aws-amplify/data";
|
||||||
|
import type { Schema } from "@/amplify/data/resource";
|
||||||
|
|
||||||
|
const client = generateClient<Schema>() // use this Data client for CRUDL requests
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*== STEP 3 ===============================================================
|
||||||
|
Fetch records from the database and use them in your frontend component.
|
||||||
|
(THIS SNIPPET WILL ONLY WORK IN THE FRONTEND CODE FILE.)
|
||||||
|
=========================================================================*/
|
||||||
|
|
||||||
|
/* For example, in a React component, you can use this snippet in your
|
||||||
|
function's RETURN statement */
|
||||||
|
// const { data: todos } = await client.models.Todo.list()
|
||||||
|
|
||||||
|
// return <ul>{todos.map(todo => <li key={todo.id}>{todo.content}</li>)}</ul>
|
3
amplify/package.json
Normal file
3
amplify/package.json
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"type": "module"
|
||||||
|
}
|
17
amplify/tsconfig.json
Normal file
17
amplify/tsconfig.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es2022",
|
||||||
|
"module": "es2022",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"paths": {
|
||||||
|
"$amplify/*": [
|
||||||
|
"../.amplify/generated/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36974
package-lock.json
generated
36974
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -36,6 +36,7 @@
|
||||||
"@radix-ui/react-tabs": "^1.1.3",
|
"@radix-ui/react-tabs": "^1.1.3",
|
||||||
"@radix-ui/react-toast": "^1.2.6",
|
"@radix-ui/react-toast": "^1.2.6",
|
||||||
"@radix-ui/react-tooltip": "^1.1.8",
|
"@radix-ui/react-tooltip": "^1.1.8",
|
||||||
|
"aws-amplify": "^6.15.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"date-fns": "^3.6.0",
|
"date-fns": "^3.6.0",
|
||||||
|
@ -57,12 +58,18 @@
|
||||||
"zod": "^3.24.2"
|
"zod": "^3.24.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@aws-amplify/backend": "^1.16.1",
|
||||||
|
"@aws-amplify/backend-cli": "^1.8.0",
|
||||||
"@types/node": "^20",
|
"@types/node": "^20",
|
||||||
"@types/react": "^18",
|
"@types/react": "^18",
|
||||||
"@types/react-dom": "^18",
|
"@types/react-dom": "^18",
|
||||||
|
"aws-cdk-lib": "^2.189.1",
|
||||||
|
"constructs": "^10.4.2",
|
||||||
|
"esbuild": "^0.25.5",
|
||||||
"genkit-cli": "^1.13.0",
|
"genkit-cli": "^1.13.0",
|
||||||
"postcss": "^8",
|
"postcss": "^8",
|
||||||
"tailwindcss": "^3.4.1",
|
"tailwindcss": "^3.4.1",
|
||||||
"typescript": "^5"
|
"tsx": "^4.20.3",
|
||||||
|
"typescript": "^5.8.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
public/404-cat.jpg
Normal file
BIN
public/404-cat.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
|
@ -1,4 +0,0 @@
|
||||||
User-agent: *
|
|
||||||
Allow: /
|
|
||||||
|
|
||||||
Sitemap: https://cheatingchelsea.com/sitemap.xml
|
|
|
@ -1,18 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
||||||
<url>
|
|
||||||
<loc>https://cheatingchelsea.com/</loc>
|
|
||||||
<lastmod>2025-07-29</lastmod>
|
|
||||||
<priority>1.00</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://cheatingchelsea.com/long-story</loc>
|
|
||||||
<lastmod>2025-07-29</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://cheatingchelsea.com/gallery</loc>
|
|
||||||
<lastmod>2025-07-29</lastmod>
|
|
||||||
<priority>0.80</priority>
|
|
||||||
</url>
|
|
||||||
</urlset>
|
|
|
@ -30,7 +30,6 @@ const videoIds = [
|
||||||
const fallbackData: Video[] = [
|
const fallbackData: Video[] = [
|
||||||
{ id: 'dbPXoZ_cri8', title: 'Placeholder Dadvocate Video 1' },
|
{ id: 'dbPXoZ_cri8', title: 'Placeholder Dadvocate Video 1' },
|
||||||
{ id: 'y2SfYffLZQ4', title: 'Placeholder Dadvocate Video 2' },
|
{ id: 'y2SfYffLZQ4', title: 'Placeholder Dadvocate Video 2' },
|
||||||
{ id: 'CdJLCln1Kjg', title: 'Placeholder Dadvocate Video 3' },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
async function getYouTubeVideos(ids: string[]): Promise<Video[]> {
|
async function getYouTubeVideos(ids: string[]): Promise<Video[]> {
|
||||||
|
|
|
@ -29,7 +29,6 @@ const videoIds = [
|
||||||
const fallbackData: Video[] = [
|
const fallbackData: Video[] = [
|
||||||
{ id: 'DK14VZ4Fyl4', title: 'Life Coach CHELSEA SMALLWOOD Is SUING Her HUSBANDS Ex Wife... It Gets WORSE' },
|
{ id: 'DK14VZ4Fyl4', title: 'Life Coach CHELSEA SMALLWOOD Is SUING Her HUSBANDS Ex Wife... It Gets WORSE' },
|
||||||
{ id: '-6Zftd8C7NE', title: "The Husband Stealing, Cheating, \"TikTok Life Coach\"" },
|
{ id: '-6Zftd8C7NE', title: "The Husband Stealing, Cheating, \"TikTok Life Coach\"" },
|
||||||
{ id: '1f_u41c3y_s', title: "The Bizarre Story of Chelsea Smallwood: The Cheating 'Coach'" },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
async function getYouTubeVideos(ids: string[]): Promise<Video[]> {
|
async function getYouTubeVideos(ids: string[]): Promise<Video[]> {
|
||||||
|
|
28
src/app/not-found.tsx
Normal file
28
src/app/not-found.tsx
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
import Link from 'next/link';
|
||||||
|
import { Button } from '@/components/ui/button';
|
||||||
|
import Image from 'next/image';
|
||||||
|
|
||||||
|
export default function NotFound() {
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col items-center justify-center min-h-screen bg-background text-foreground">
|
||||||
|
<main className="text-center p-8 max-w-2xl mx-auto">
|
||||||
|
<div className="bg-black p-4 inline-block rounded-lg border-2 border-gray-700 shadow-2xl">
|
||||||
|
<Image
|
||||||
|
src="/404-cat.jpg"
|
||||||
|
alt="A calico cat's tail is sticking out from under a pile of papers, resembling the '404 Not Found' cat meme."
|
||||||
|
width={750}
|
||||||
|
height={600}
|
||||||
|
className="object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<p className="text-muted-foreground mt-8 mb-8 text-xl">
|
||||||
|
Oops! It looks like the page you're looking for has gone into hiding.
|
||||||
|
</p>
|
||||||
|
<Button asChild size="lg">
|
||||||
|
<Link href="/">Go Back to Home</Link>
|
||||||
|
</Button>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
12
src/app/robots.ts
Normal file
12
src/app/robots.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import type { MetadataRoute } from 'next';
|
||||||
|
|
||||||
|
export default function robots(): MetadataRoute.Robots {
|
||||||
|
const baseUrl = 'https://cheatingchelsea.com';
|
||||||
|
return {
|
||||||
|
rules: {
|
||||||
|
userAgent: '*',
|
||||||
|
allow: '/',
|
||||||
|
},
|
||||||
|
sitemap: `${baseUrl}/sitemap.xml`,
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,5 +0,0 @@
|
||||||
# https://www.robotstxt.org/robotstxt.html
|
|
||||||
User-agent: *
|
|
||||||
Allow: /
|
|
||||||
|
|
||||||
Sitemap: https://cheatingchelsea.com/sitemap.xml
|
|
|
@ -1,32 +1,32 @@
|
||||||
import { MetadataRoute } from 'next'
|
import type { MetadataRoute } from 'next';
|
||||||
|
|
||||||
export const dynamic = "force-static";
|
|
||||||
|
|
||||||
export default function sitemap(): MetadataRoute.Sitemap {
|
export default function sitemap(): MetadataRoute.Sitemap {
|
||||||
|
const baseUrl = 'https://cheatingchelsea.com';
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
url: 'https://cheatingchelsea.com',
|
url: `${baseUrl}/`,
|
||||||
lastModified: new Date(),
|
lastModified: new Date(),
|
||||||
changeFrequency: 'weekly',
|
changeFrequency: 'yearly',
|
||||||
priority: 1,
|
priority: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
url: 'https://cheatingchelsea.com/gallery',
|
url: `${baseUrl}/long-story`,
|
||||||
lastModified: new Date(),
|
|
||||||
changeFrequency: 'weekly',
|
|
||||||
priority: 0.8,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
url: 'https://cheatingchelsea.com/dadvocate',
|
|
||||||
lastModified: new Date(),
|
|
||||||
changeFrequency: 'weekly',
|
|
||||||
priority: 0.8,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
url: 'https://cheatingchelsea.com/long-story',
|
|
||||||
lastModified: new Date(),
|
lastModified: new Date(),
|
||||||
changeFrequency: 'monthly',
|
changeFrequency: 'monthly',
|
||||||
|
priority: 0.8,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: `${baseUrl}/gallery`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'weekly',
|
||||||
priority: 0.5,
|
priority: 0.5,
|
||||||
},
|
},
|
||||||
]
|
{
|
||||||
|
url: `${baseUrl}/dadvocate`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: 'weekly',
|
||||||
|
priority: 0.5,
|
||||||
|
},
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue