Skip to content

Commit c42373a

Browse files
authored
Merge branch 'main' into feat/multistage-docker
2 parents 519703d + 03898ed commit c42373a

File tree

15 files changed

+220
-61
lines changed

15 files changed

+220
-61
lines changed

Dockerfile.prod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ FROM node:20-alpine AS base
44
FROM base AS deps
55
RUN apk add --no-cache libc6-compat
66

7+
RUN set -ex; \
8+
apk update; \
9+
apk add --no-cache \
10+
openssl
11+
712
WORKDIR /usr/src/app
813

914
COPY package.json yarn.lock* ./

README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,43 @@
11
# Quick Setup Locally
22

3-
* Docker
3+
## Option 1: Using Docker
44

5-
```
5+
```bash
66
docker compose watch
77
```
88

9-
OR
10-
11-
> Install the Dependencies
9+
## Option 2: Manual Setup
1210

13-
```
11+
### 1. Install Dependencies
12+
```bash
1413
cd daily-code
1514
yarn install
1615
```
1716

18-
> Setup DB
19-
For Mac and Linux users
20-
```
17+
### 2. Setup Database
18+
19+
#### For Mac and Linux users
20+
```bash
2121
cd packages/db
2222
chmod +x ./setupDB.sh
2323
./setupDB.sh
2424
```
2525

26-
For Windows users (using docker to start db locally)
27-
```
26+
#### For Windows users
27+
```bash
2828
cd packages/db
2929
copy .env.example .env
3030
docker-compose up
3131

32-
now, write the connection string in DATABASE_URL
32+
# Configure the database connection
33+
# Add your connection string to DATABASE_URL
3334

3435
yarn prisma migrate dev
3536
yarn prisma db seed
3637
```
3738

38-
> Run locally
39-
40-
```
39+
### 3. Run Locally
40+
```bash
4141
cd ../..
4242
yarn run dev
4343
```

apps/web/app/api/AddTracks/route.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export async function POST(req: NextRequest) {
1414
const notion = new NotionAPI();
1515
try {
1616
const recordMap = await notion.getPage(notionId);
17-
const data = Object.keys(recordMap.block).map((key) => {
17+
const data = Object.keys(recordMap.block).filter((key) => {
18+
const block = recordMap.block[key];
19+
return block?.role !== "none"
20+
}).map((key) => {
1821
const block = recordMap.block[key];
1922
return {
2023
notionDocId: block?.value.id,
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"use client";
2+
3+
import React from "react";
4+
import { useSearchParams } from "next/navigation";
5+
import { motion } from "framer-motion";
6+
import Link from "next/link";
7+
import Image from "next/image";
8+
9+
const Header = ({ title }: { title: string }) => (
10+
<motion.div
11+
className={`z-[50] flex w-full flex-col justify-between gap-2 p-6 md:flex-row`}
12+
initial={{ y: 0 }}
13+
animate={{ y: 0 }}
14+
transition={{ duration: 0.3 }}
15+
>
16+
<div className="flex items-center gap-2">
17+
<motion.div
18+
initial={{ y: -20, opacity: 0 }}
19+
animate={{ y: 0, opacity: 1 }}
20+
transition={{ duration: 0.5, ease: "easeInOut", type: "spring", damping: 10 }}
21+
className="flex justify-between gap-2"
22+
>
23+
<div
24+
className={`border-primary/10 flex items-center gap-4 rounded-lg border bg-black/10 p-2 backdrop-blur-lg transition-all duration-500 ease-in-out`}
25+
>
26+
<Link href={"/"} className="cursor-pointer items-center gap-4">
27+
<Image
28+
src={"https://appx-wsb-gcp.akamai.net.in/subject/2023-01-17-0.17044360120951185.jpg"}
29+
alt="Logo"
30+
width={200}
31+
height={200}
32+
className="size-8 rounded-full"
33+
/>
34+
</Link>
35+
<h4 className="flex items-center gap-2 font-medium tracking-tighter md:max-w-[50vw] md:text-lg">{title}</h4>
36+
</div>
37+
</motion.div>
38+
</div>
39+
</motion.div>
40+
);
41+
42+
export default function CanvaTrack() {
43+
const searchParams = useSearchParams();
44+
const canvaLink = searchParams.get("canvaLink");
45+
const title = searchParams.get("title");
46+
47+
const embedUrl = canvaLink?.includes("?embed") ? canvaLink : `${canvaLink}?embed`;
48+
49+
console.log({ canvaLink, embedUrl });
50+
51+
if (!embedUrl) {
52+
return <div>No Canva presentation link provided</div>;
53+
}
54+
55+
return (
56+
<div className="flex h-screen w-full flex-col overflow-hidden">
57+
<Header title={title ?? ""} />
58+
<div className="w-full flex-1">
59+
<div className="relative h-full w-full">
60+
<iframe
61+
loading="lazy"
62+
className="absolute left-0 top-0 h-full w-full border-none"
63+
src={embedUrl}
64+
allowFullScreen={true}
65+
allow="fullscreen"
66+
/>
67+
</div>
68+
</div>
69+
</div>
70+
);
71+
}

apps/web/components/ContentSearch.tsx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export function ContentSearch({ tracks }: { tracks: TrackPros[] }) {
144144
<span className="sr-only">Close</span>
145145
</DialogClose>
146146
</div>
147-
<div className="h-[400px] py-4 space-y-4 overflow-y-scroll" ref={scrollableContainerRef}>
147+
<div className="h-[500px] py-4 space-y-4 overflow-y-scroll" ref={scrollableContainerRef}>
148148
{searchTracks.length > 0 &&
149149
searchTracks.map((track, index) => (
150150
<div key={track.payload.problemId} className={`p-2 ${index === selectedIndex ? "bg-blue-600/20" : ""}`}>
@@ -155,17 +155,18 @@ export function ContentSearch({ tracks }: { tracks: TrackPros[] }) {
155155
passHref
156156
>
157157
<Card className="p-2 w-full mx-2">
158-
<div className="flex my-2">
159-
<img
160-
alt={track.payload.problemTitle}
161-
src={track.payload.image}
162-
className="flex mx-2 w-1/6 rounded-xl"
163-
/>
164-
165-
<div>
166-
<CardHeader>
167-
<CardTitle>{track.payload.problemTitle}</CardTitle>
168-
<CardDescription>{track.payload.trackTitle}</CardDescription>
158+
<div className="flex items-center gap-4 py-1 sm:py-2">
159+
<div className="w-16 h-16 sm:w-20 sm:h-20 flex-shrink-0 overflow-hidden rounded-xl">
160+
<img
161+
alt={track.payload.problemTitle}
162+
src={track.payload.image}
163+
className="w-full h-full object-cover"
164+
/>
165+
</div>
166+
<div className="flex-1 min-w-0">
167+
<CardHeader className="p-0">
168+
<CardTitle className="text-base sm:text-lg md:text-xl">{track.payload.problemTitle}</CardTitle>
169+
<CardDescription className="text-sm truncate">Track: {track.payload.trackTitle}</CardDescription>
169170
</CardHeader>
170171
</div>
171172
</div>

apps/web/components/Hero.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,13 @@ export default function Hero({ tracks }: { tracks: TrackPros[] }) {
115115
gradientUnits="userSpaceOnUse"
116116
gradientTransform="matrix(12.12436 -7 4.2 7.27461 16 16)"
117117
>
118-
<stop stop-color="#7D7D7D" />
119-
<stop offset=".267" stop-color="#7E7C7A" />
120-
<stop offset=".45" stop-color="#817871" />
121-
<stop offset=".608" stop-color="#867162" />
122-
<stop offset=".753" stop-color="#8D684C" />
123-
<stop offset=".886" stop-color="#965C30" />
124-
<stop offset="1" stop-color="#A04F12" />
118+
<stop stopColor="#7D7D7D" />
119+
<stop offset=".267" stopColor="#7E7C7A" />
120+
<stop offset=".45" stopColor="#817871" />
121+
<stop offset=".608" stopColor="#867162" />
122+
<stop offset=".753" stopColor="#8D684C" />
123+
<stop offset=".886" stopColor="#965C30" />
124+
<stop offset="1" stopColor="#A04F12" />
125125
</radialGradient>
126126
</defs>
127127
</motion.svg>

apps/web/components/TrackCard-2.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { motion, useAnimation } from "framer-motion";
33
import { Track, Problem } from "@prisma/client";
44
import { TrackPreview } from "./TrackPreview";
55
import { formatDistanceToNow } from "date-fns";
6+
import { useRouter } from "next/navigation";
67

78
interface TrackCardProps extends Track {
89
problems: Problem[];
@@ -15,10 +16,24 @@ interface TrackCardProps extends Track {
1516
}
1617

1718
export function TrackCard2({ track }: { track: TrackCardProps }) {
19+
const router = useRouter();
1820
const controls = useAnimation();
1921
const ref = useRef<HTMLDivElement | null>(null);
2022
const [showPreview, setShowPreview] = useState<boolean>(false);
2123

24+
const handleTrackClick = () => {
25+
if (track.trackType === "CANVA") {
26+
const searchParams = new URLSearchParams();
27+
if (track.canvaLink) {
28+
searchParams.set("canvaLink", track.canvaLink);
29+
searchParams.set("title", track.title);
30+
}
31+
router.push(`/canva-track/${track.id}?${searchParams.toString()}`);
32+
} else {
33+
setShowPreview(true);
34+
}
35+
};
36+
2237
useEffect(() => {
2338
const observer = new IntersectionObserver(
2439
([entry]) => {
@@ -52,8 +67,8 @@ export function TrackCard2({ track }: { track: TrackCardProps }) {
5267
initial="hidden"
5368
animate={controls}
5469
variants={variants}
55-
className="flex items-start flex-row gap-4 cursor-pointer transition-all bg-primary/5 backdrop-blur-xl duration-300 hover:-translate-y-1 rounded-xl p-4 justify-between md:items-center"
56-
onClick={() => setShowPreview(true)}
70+
className="bg-primary/5 flex cursor-pointer flex-row items-start justify-between gap-4 rounded-xl p-4 backdrop-blur-xl transition-all duration-300 hover:-translate-y-1 md:items-center"
71+
onClick={handleTrackClick}
5772
>
5873
<img src={track.image} alt={track.title} className="size-20 aspect-square object-cover rounded-xl" />
5974
<div className="flex flex-col md:flex-row gap-4 w-full md:items-center justify-between">

apps/web/components/Tracks.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,7 @@ export const Tracks = ({ tracks, categories }: TracksWithCategoriesProps) => {
6161

6262
const filterTracks = () => {
6363
setLoading(true);
64-
let newFilteredTracks = tracks;
65-
if (selectedCohort) {
66-
newFilteredTracks = newFilteredTracks.filter((t) => t.cohort === selectedCohort);
67-
}
68-
if (selectedCategory && selectedCategory !== "All") {
69-
newFilteredTracks = newFilteredTracks.filter((t) =>
70-
t.categories.some((c) => c.category.category === selectedCategory)
71-
);
72-
}
73-
setFilteredTracks(newFilteredTracks);
64+
setFilteredTracks(tracks.filter((t) => selectedCohort === 3 ? t.cohort === 3 : t.cohort !== 3));
7465
setCurrentPage(1); // Reset to first page on filtering
7566
setLoading(false);
7667
};

apps/web/components/admin/AddTrackCard.tsx

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const AddTrackCard = ({ categories }: { categories: Categories[] }) => {
1414
const [hidden, setHidden] = useState(false);
1515
const [selectedCategory, setSelectedCategory] = useState<string[]>([]);
1616
const [cohort, setCohort] = useState(3);
17+
const [canvaLink, setCanvaLink] = useState("");
1718
const { toast } = useToast();
1819

1920
function handleFilterButton(category: string) {
@@ -26,7 +27,7 @@ const AddTrackCard = ({ categories }: { categories: Categories[] }) => {
2627

2728
return (
2829
<div>
29-
<Card className="cols-span-4 p-4 m-2 w-full">
30+
<Card className="cols-span-4 m-2 w-full p-4">
3031
<Input
3132
type="text"
3233
placeholder="Track Id"
@@ -68,7 +69,16 @@ const AddTrackCard = ({ categories }: { categories: Categories[] }) => {
6869
setCohort(parseInt(event.target.value));
6970
}}
7071
/>
71-
<div className="flex lg:flex-row justify-evenly mx-auto py-1">
72+
<Input
73+
type="text"
74+
placeholder="Canva Link"
75+
className="my-2"
76+
value={canvaLink}
77+
onChange={(event) => {
78+
setCanvaLink(event.target.value);
79+
}}
80+
/>
81+
<div className="mx-auto flex justify-evenly py-1 lg:flex-row">
7282
{categories.map((category, i) => (
7383
<Button
7484
key={i}
@@ -85,12 +95,32 @@ const AddTrackCard = ({ categories }: { categories: Categories[] }) => {
8595
</Button>
8696
<Button
8797
disabled={!title || !description || !image}
88-
className="w-full mt-4"
98+
className="mt-4 w-full"
8999
onClick={async () => {
90-
await createTrack({ problems: [], id, title, description, image, hidden, selectedCategory });
100+
await createTrack({
101+
problems: [],
102+
id,
103+
title,
104+
description,
105+
image,
106+
hidden,
107+
selectedCategory,
108+
canvaLink,
109+
trackType: canvaLink ? "CANVA" : "NOTION",
110+
});
91111
setNewProblems((prev) => [
92112
...prev,
93-
{ id, title, description, image, hidden, cohort, createdAt: new Date() },
113+
{
114+
id,
115+
title,
116+
description,
117+
image,
118+
hidden,
119+
cohort,
120+
createdAt: new Date(),
121+
canvaLink,
122+
trackType: canvaLink ? "CANVA" : "NOTION",
123+
},
94124
]);
95125
toast({
96126
title: "Added a Track",
@@ -107,7 +137,7 @@ const AddTrackCard = ({ categories }: { categories: Categories[] }) => {
107137
<div className="grid grid-cols-6">
108138
<img
109139
src={Track.image}
110-
className="flex m-4 min-h-[130px] sm:h-[130px] min-w-[130px] sm:w-[130px] rounded-xl"
140+
className="m-4 flex min-h-[130px] min-w-[130px] rounded-xl sm:h-[130px] sm:w-[130px]"
111141
/>
112142
<div className="col-span-5">
113143
<CardHeader>

apps/web/components/admin/CompleteTrackCard.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const CompleteTrackCard = ({ notionId, TrackData }: { notionId: string; TrackDat
3434
problems: problems,
3535
selectedCategory: TrackData.selectedCategory,
3636
cohort: parseInt(TrackData.cohort),
37+
trackType: "NOTION",
3738
});
3839
await insertData(TrackData.trackId);
3940
setIsSubmitting(true);

0 commit comments

Comments
 (0)