Merge pull request #5 from derekslenk/more-updates

More updates
This commit is contained in:
Derek Slenk 2025-06-27 14:41:15 -04:00 committed by GitHub
commit dcc186ffc1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 37146 additions and 57 deletions

View file

@ -0,0 +1,9 @@
{
"permissions": {
"allow": [
"Bash(find:*)",
"Bash(ls:*)"
],
"deny": []
}
}

7
.gitignore vendored
View file

@ -42,4 +42,9 @@ next-env.d.ts
# firebase
firebase-debug.log
firestore-debug.log
firestore-debug.log
# amplify
.amplify
amplify_outputs*
amplifyconfiguration*

11
amplify/auth/resource.ts Normal file
View 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
View 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
View 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
View file

@ -0,0 +1,3 @@
{
"type": "module"
}

17
amplify/tsconfig.json Normal file
View 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

File diff suppressed because it is too large Load diff

View file

@ -36,6 +36,7 @@
"@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-toast": "^1.2.6",
"@radix-ui/react-tooltip": "^1.1.8",
"aws-amplify": "^6.15.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^3.6.0",
@ -57,12 +58,18 @@
"zod": "^3.24.2"
},
"devDependencies": {
"@aws-amplify/backend": "^1.16.1",
"@aws-amplify/backend-cli": "^1.8.0",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"aws-cdk-lib": "^2.189.1",
"constructs": "^10.4.2",
"esbuild": "^0.25.5",
"genkit-cli": "^1.13.0",
"postcss": "^8",
"tailwindcss": "^3.4.1",
"typescript": "^5"
"tsx": "^4.20.3",
"typescript": "^5.8.3"
}
}

BIN
public/404-cat.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View file

@ -1,4 +0,0 @@
User-agent: *
Allow: /
Sitemap: https://cheatingchelsea.com/sitemap.xml

View file

@ -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>

View file

@ -30,7 +30,6 @@ const videoIds = [
const fallbackData: Video[] = [
{ id: 'dbPXoZ_cri8', title: 'Placeholder Dadvocate Video 1' },
{ id: 'y2SfYffLZQ4', title: 'Placeholder Dadvocate Video 2' },
{ id: 'CdJLCln1Kjg', title: 'Placeholder Dadvocate Video 3' },
];
async function getYouTubeVideos(ids: string[]): Promise<Video[]> {

View file

@ -29,12 +29,11 @@ const videoIds = [
const fallbackData: Video[] = [
{ 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: '1f_u41c3y_s', title: "The Bizarre Story of Chelsea Smallwood: The Cheating 'Coach'" },
];
async function getYouTubeVideos(ids: string[]): Promise<Video[]> {
const apiKey = process.env.YOUTUBE_API_KEY;
if (!apiKey) {
console.warn("YOUTUBE_API_KEY environment variable not set. Using hardcoded video titles as fallback.");
return fallbackData;

28
src/app/not-found.tsx Normal file
View 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
View 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`,
};
}

View file

@ -1,5 +0,0 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Allow: /
Sitemap: https://cheatingchelsea.com/sitemap.xml

View file

@ -1,32 +1,32 @@
import { MetadataRoute } from 'next'
export const dynamic = "force-static";
import type { MetadataRoute } from 'next';
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = 'https://cheatingchelsea.com';
return [
{
url: 'https://cheatingchelsea.com',
url: `${baseUrl}/`,
lastModified: new Date(),
changeFrequency: 'weekly',
changeFrequency: 'yearly',
priority: 1,
},
{
url: 'https://cheatingchelsea.com/gallery',
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',
url: `${baseUrl}/long-story`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.8,
},
{
url: `${baseUrl}/gallery`,
lastModified: new Date(),
changeFrequency: 'weekly',
priority: 0.5,
},
]
{
url: `${baseUrl}/dadvocate`,
lastModified: new Date(),
changeFrequency: 'weekly',
priority: 0.5,
},
];
}