Implemented Stripe Embedded Checkout Component;

Inclusion of .env files;
This commit is contained in:
Chris-1010
2025-01-22 22:39:33 +00:00
parent a36c745a4f
commit 92fdf3f3f3
19 changed files with 270 additions and 233 deletions

7
.env.example Normal file
View File

@@ -0,0 +1,7 @@
# Flask Backend Variables
FLASK_SECRET_KEY=your_secret_key_here
STRIPE_SECRET_KEY=sk_test_51QikGl...
# React Frontend Variables
VITE_API_URL=http://127.0.0.1:1234
VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51112222...

3
.gitignore vendored
View File

@@ -19,7 +19,7 @@ wheels/
*.egg-info/ *.egg-info/
.installed.cfg .installed.cfg
*.egg *.egg
.env *.env
venv/ venv/
ENV/ ENV/
.venv .venv
@@ -56,5 +56,6 @@ Thumbs.db
hls/ hls/
sockets/ sockets/
dev-env/ dev-env/
project_structure.txt
*.db *.db
flask_session/ flask_session/

View File

@@ -1,4 +1,4 @@
version: '3.9'
services: services:
nginx: nginx:
build: build:
@@ -15,9 +15,14 @@ services:
build: build:
context: ./web_server context: ./web_server
ports: ports:
- "5000" - "5000:5000"
networks: networks:
- app_network - app_network
env_file:
- .env
environment:
- FLASK_APP=backend.blueprints.__init__
- FLASK_DEBUG=True
networks: networks:
app_network: app_network:

View File

@@ -3,6 +3,14 @@ FROM python:3.10
# Set the working directory # Set the working directory
WORKDIR /web_server WORKDIR /web_server
# Args that can be passed during build
ARG FLASK_SECRET_KEY
ARG STRIPE_SECRET_KEY
# Set as environment variables
ENV FLASK_SECRET_KEY=${FLASK_SECRET_KEY}
ENV STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
# Install dependencies # Install dependencies
COPY requirements.txt requirements.txt COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt RUN pip install --no-cache-dir -r requirements.txt

View File

@@ -0,0 +1,5 @@
# Example backend variables (for git)
FLASK_SECRET_KEY=your_secret_key_here
STRIPE_SECRET_KEY=sk_test_51112222...
DATABASE_URL=postgresql://user:password@localhost:5432/db_name

View File

@@ -2,10 +2,16 @@ from flask import Flask
from flask_session import Session from flask_session import Session
from backend.blueprints.utils import logged_in_user from backend.blueprints.utils import logged_in_user
from flask_cors import CORS from flask_cors import CORS
import os
print("Environment variables:")
print(f"FLASK_SECRET_KEY: {os.getenv('FLASK_SECRET_KEY')}")
print(f"STRIPE_SECRET_KEY: {os.getenv('STRIPE_SECRET_KEY')}")
def create_app(): def create_app():
app = Flask(__name__) app = Flask(__name__)
app.config["SECRET_KEY"] = "" app.config["SECRET_KEY"] = os.getenv("FLASK_SECRET_KEY")
app.config["SESSION_PERMANENT"] = False app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem" app.config["SESSION_TYPE"] = "filesystem"
#! ↓↓↓ For development purposes only #! ↓↓↓ For development purposes only

View File

@@ -1,4 +1,4 @@
from flask import render_template, Blueprint from flask import Blueprint
main_bp = Blueprint("app", __name__) main_bp = Blueprint("app", __name__)

View File

@@ -1,13 +1,13 @@
from flask import render_template, Blueprint, request, jsonify from flask import Blueprint, request, jsonify
import os, stripe
import stripe
stripe_bp = Blueprint("stripe", __name__) stripe_bp = Blueprint("stripe", __name__)
stripe.api_key = 'sk_test_51QikGlGk6yuk3uA8muEMPjMhUvbZWZiMCYQArZRXcFVn26hbt1kTz5yUVWkk3RQlltArbAXmVmkfEHU2z1Ch5Obv00Y03oT127' stripe.api_key = os.getenv("STRIPE_SECRET_KEY")
@stripe_bp.route('/create-checkout-session', methods=['POST']) @stripe_bp.route('/create-checkout-session', methods=['POST'])
def create_checkout_session(): def create_checkout_session():
print("Creating checkout session")
try: try:
session = stripe.checkout.Session.create( session = stripe.checkout.Session.create(
ui_mode = 'embedded', ui_mode = 'embedded',
@@ -32,7 +32,3 @@ def session_status():
session = stripe.checkout.Session.retrieve(request.args.get('session_id')) session = stripe.checkout.Session.retrieve(request.args.get('session_id'))
return jsonify(status=session.status, customer_email=session.customer_details.email) return jsonify(status=session.status, customer_email=session.customer_details.email)
@stripe_bp.route('/checkout', methods=['GET'])
def checkout():
return render_template("checkout.html")

View File

@@ -0,0 +1,4 @@
# Example frontend variables (for git)
VITE_API_URL=http://127.0.0.1:1234
VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51112223...

View File

@@ -8,6 +8,8 @@
"name": "frontend", "name": "frontend",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@stripe/react-stripe-js": "^3.1.1",
"@stripe/stripe-js": "^5.5.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-router-dom": "^7.1.3" "react-router-dom": "^7.1.3"
@@ -1356,6 +1358,29 @@
"win32" "win32"
] ]
}, },
"node_modules/@stripe/react-stripe-js": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-3.1.1.tgz",
"integrity": "sha512-+JzYFgUivVD7koqYV7LmLlt9edDMAwKH7XhZAHFQMo7NeRC+6D2JmQGzp9tygWerzwttwFLlExGp4rAOvD6l9g==",
"license": "MIT",
"dependencies": {
"prop-types": "^15.7.2"
},
"peerDependencies": {
"@stripe/stripe-js": "^1.44.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
"react": ">=16.8.0 <20.0.0",
"react-dom": ">=16.8.0 <20.0.0"
}
},
"node_modules/@stripe/stripe-js": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-5.5.0.tgz",
"integrity": "sha512-lkfjyAd34aeMpTKKcEVfy8IUyEsjuAT3t9EXr5yZDtdIUncnZpedl/xLV16Dkd4z+fQwixScsCCDxSMNtBOgpQ==",
"license": "MIT",
"engines": {
"node": ">=12.16"
}
},
"node_modules/@types/babel__core": { "node_modules/@types/babel__core": {
"version": "7.20.5", "version": "7.20.5",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -3106,7 +3131,6 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
@@ -3443,6 +3467,17 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"node_modules/punycode": { "node_modules/punycode": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -3499,6 +3534,12 @@
"react": "^18.3.1" "react": "^18.3.1"
} }
}, },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"license": "MIT"
},
"node_modules/react-refresh": { "node_modules/react-refresh": {
"version": "0.14.2", "version": "0.14.2",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",

View File

@@ -9,8 +9,10 @@
"lint": "eslint .", "lint": "eslint .",
"preview": "vite preview" "preview": "vite preview"
}, },
"proxy": "http://localhost:5000", "proxy": "http://127.0.0.1:8080",
"dependencies": { "dependencies": {
"@stripe/react-stripe-js": "^3.1.1",
"@stripe/stripe-js": "^5.5.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-router-dom": "^7.1.3" "react-router-dom": "^7.1.3"

View File

@@ -1,10 +1,10 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom'; import { BrowserRouter, Routes, Route } from "react-router-dom";
import HomePage from './pages/HomePage'; import HomePage from "./pages/HomePage";
import VideoPage from './pages/VideoPage'; import VideoPage from "./pages/VideoPage";
import LoginPage from './pages/LoginPage'; import LoginPage from "./pages/LoginPage";
import SignupPage from './pages/SignupPage'; import SignupPage from "./pages/SignupPage";
import CheckoutPage from './pages/CheckoutPage'; // import CheckoutPage from "./pages/CheckoutPage";
import NotFoundPage from './pages/NotFoundPage'; import NotFoundPage from "./pages/NotFoundPage";
function App() { function App() {
return ( return (
@@ -14,7 +14,11 @@ function App() {
<Route path="/video" element={<VideoPage />} /> <Route path="/video" element={<VideoPage />} />
<Route path="/login" element={<LoginPage />} /> <Route path="/login" element={<LoginPage />} />
<Route path="/signup" element={<SignupPage />} /> <Route path="/signup" element={<SignupPage />} />
<Route path="/checkout" element={<CheckoutPage />} /> {/* <Route path="/checkout" element={<CheckoutPage />} /> */}
{/* <Route path="/checkout" element={<CheckoutForm />} /> */}
{/* <Route path="/return" element={<Return />} /> */}
<Route path="*" element={<NotFoundPage />} /> <Route path="*" element={<NotFoundPage />} />
</Routes> </Routes>
</BrowserRouter> </BrowserRouter>

View File

@@ -2,6 +2,24 @@
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: hsl(242, 100%, 10%);
border-radius: 5px;
}
::-webkit-scrollbar-thumb {
background: #ff9900;
border-radius: 5px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
/* /*
:root { :root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;

View File

@@ -1 +1,95 @@
// checkout.html import React, { useState, useEffect } from "react";
import { loadStripe } from "@stripe/stripe-js";
import {
EmbeddedCheckoutProvider,
EmbeddedCheckout,
} from "@stripe/react-stripe-js";
import { Navigate } from "react-router-dom";
const API_URL = import.meta.env.VITE_API_URL;
// Initialize Stripe once
const stripePromise = loadStripe(import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY);
export const Return: React.FC = () => {
const [status, setStatus] = useState<string | null>(null);
const [customerEmail, setCustomerEmail] = useState("");
useEffect(() => {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const sessionId = urlParams.get("session_id");
if (sessionId) {
fetch(`${API_URL}/session-status?session_id=${sessionId}`)
.then((res) => res.json())
.then((data) => {
setStatus(data.status);
setCustomerEmail(data.customer_email);
});
}
}, []);
if (status === "open") {
return <Navigate to="/checkout" />;
}
if (status === "complete") {
return (
<section id="success">
<p>
We appreciate your business! A confirmation email will be sent to{" "}
{customerEmail}. If you have any questions, please email{" "}
<a href="mailto:orders@example.com">orders@example.com</a>.
</p>
</section>
);
}
return null;
};
// Main CheckoutForm component
interface CheckoutFormProps {
onClose: () => void;
}
const CheckoutForm: React.FC<CheckoutFormProps> = ({ onClose }) => {
const fetchClientSecret = () => {
return fetch(`${API_URL}/create-checkout-session`, {
method: "POST",
})
.then((res) => res.json())
.then((data) => data.clientSecret);
};
const options = { fetchClientSecret };
return (
<>
<div className="blurring-layer fixed z-10 inset-0 w-screen h-screen backdrop-blur-sm"></div>
<div className="fixed inset-0 bg-black/30 flex items-center justify-center z-50 h-[70vh] m-auto w-fit py-[50px] px-[100px] rounded-[2rem]">
<button
onClick={onClose}
className="absolute top-[1rem] right-[3rem] text-[2rem] text-red-600 font-black hover:text-[2.5rem] transition-all"
>
</button>
<div className="bg-white p-6 rounded-lg w-full max-w-2xl relative h-full rounded-[2rem]">
<div
id="checkout"
className="h-full overflow-auto min-w-[30vw]"
style={{ width: "clamp(300px, 60vw, 800px)" }}
>
<EmbeddedCheckoutProvider stripe={stripePromise} options={options}>
<EmbeddedCheckout />
</EmbeddedCheckoutProvider>
</div>
</div>
</div>
</>
);
};
export default CheckoutForm;

View File

@@ -1,17 +1,21 @@
import React from 'react' import React from "react";
interface ButtonProps { interface ButtonProps {
title?: string; title?: string;
alt?: string;
onClick?: () => void; onClick?: () => void;
} }
const Button = ({ title, alt, onClick }: ButtonProps) => { const Button: React.FC<ButtonProps> = ({
title = "Submit",
onClick,
}) => {
return ( return (
<div> <div>
<button onClick={onClick}>
{title}
</button>
</div> </div>
) );
} };
export default Button export default Button;

View File

@@ -1,10 +0,0 @@
import React from 'react';
const CheckoutPage: React.FC = () => {
return (
<div>
</div>
);
};
export default CheckoutPage;

View File

@@ -3,6 +3,8 @@ import Navbar from "../components/Layout/Navbar";
import ListRow from "../components/Layout/ListRow"; import ListRow from "../components/Layout/ListRow";
// import { data, Link } from "react-router-dom"; // import { data, Link } from "react-router-dom";
const API_URL = import.meta.env.VITE_API_URL;
const handleStreamClick = (streamId: string) => { const handleStreamClick = (streamId: string) => {
// Handle navigation to stream page // Handle navigation to stream page
console.log(`Navigating to stream ${streamId}`); console.log(`Navigating to stream ${streamId}`);
@@ -22,13 +24,13 @@ const HomePage: React.FC = () => {
// ↓↓ runs twice when in development mode // ↓↓ runs twice when in development mode
useEffect(() => { useEffect(() => {
fetch("http://127.0.0.1:5000/get_loggedin_status") fetch(`${API_URL}/get_loggedin_status`)
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
setLoggedInStatus(data); setLoggedInStatus(data);
console.log(data); console.log(data);
}); });
fetch("http://127.0.0.1:5000/get_streams") fetch(`${API_URL}/get_streams`)
.then((response) => response.json()) .then((response) => response.json())
.then((data: StreamItem[]) => { .then((data: StreamItem[]) => {
setFeaturedStreams(data); setFeaturedStreams(data);
@@ -37,7 +39,10 @@ const HomePage: React.FC = () => {
}, []); }, []);
return ( return (
<div className="home-page bg-repeat" style={{ backgroundImage: "url(/images/background-pattern.svg)" }}> <div
className="home-page bg-repeat"
style={{ backgroundImage: "url(/images/background-pattern.svg)" }}
>
<Navbar logged_in={loggedInStatus} /> <Navbar logged_in={loggedInStatus} />
<ListRow <ListRow

View File

@@ -1,9 +1,34 @@
import React from 'react'; import React, { useState, useEffect } from 'react';
import Button from '../components/Layout/Button';
import CheckoutForm, { Return } from '../components/Checkout/CheckoutForm';
const VideoPage: React.FC = () => { const VideoPage: React.FC = () => {
const [showCheckout, setShowCheckout] = useState(false);
const showReturn = window.location.search.includes('session_id');
useEffect(() => {
if (showCheckout) {
document.body.style.overflow = "hidden";
} else {
document.body.style.overflow = "unset";
}
// Cleanup function to ensure overflow is restored when component unmounts
return () => {
document.body.style.overflow = "unset";
};
}, [showCheckout]);
return ( return (
<div> <div>
<h1>Hello!</h1> <h1>Hello!</h1>
<Button
title="Payment Screen Test"
onClick={() => setShowCheckout(true)}
/>
{showCheckout && <CheckoutForm onClose={() => setShowCheckout(false)} />}
{showReturn && <Return />}
</div> </div>
); );
}; };

View File

@@ -1,178 +0,0 @@
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 21/01/2025 17:22 __pycache__
lar-- 21/01/2025 17:31 backend
lar-- 21/01/2025 18:14 flask_session
l---- 21/01/2025 17:09 frontend
la--- 21/01/2025 17:30 55 .flaskenv
la--- 21/01/2025 17:21 435 Dockerfile
-a--- 21/01/2025 18:37 0 project_structure.txt
la--- 20/01/2025 16:53 383 requirements.txt
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\backend
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 21/01/2025 17:32 __pycache__
lar-- 21/01/2025 17:22 blueprints
lar-- 21/01/2025 17:22 database
la--- 21/01/2025 17:21 749 forms.py
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\backend\blueprints
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 21/01/2025 18:14 __pycache__
la--- 21/01/2025 18:14 907 __init__.py
la--- 21/01/2025 17:31 3626 authentication.py
la--- 21/01/2025 17:21 325 main.py
la--- 21/01/2025 17:21 1294 stripe.py
la--- 21/01/2025 17:21 844 utils.py
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\backend\blueprints\__pycache__
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 21/01/2025 18:08 1155 __init__.cpython-310.pyc
la--- 21/01/2025 17:21 1673 __init__.cpython-311.pyc
la--- 21/01/2025 18:14 1572 __init__.cpython-312.pyc
la--- 21/01/2025 17:21 562 app.cpython-310.pyc
la--- 21/01/2025 17:21 2594 authentication.cpython-310.pyc
la--- 21/01/2025 17:21 5120 authentication.cpython-311.pyc
la--- 21/01/2025 17:31 4750 authentication.cpython-312.pyc
la--- 21/01/2025 17:21 564 main.cpython-310.pyc
la--- 21/01/2025 17:21 800 main.cpython-311.pyc
la--- 21/01/2025 17:31 767 main.cpython-312.pyc
la--- 21/01/2025 17:21 2457 stripe.cpython-311.pyc
la--- 21/01/2025 17:31 2347 stripe.cpython-312.pyc
la--- 21/01/2025 18:08 1393 utils.cpython-310.pyc
la--- 21/01/2025 17:21 2018 utils.cpython-311.pyc
la--- 21/01/2025 17:30 1892 utils.cpython-312.pyc
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\backend\database
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 21/01/2025 17:31 __pycache__
la--- 21/01/2025 17:21 28672 app.db
la--- 21/01/2025 17:21 588 database.py
la--- 21/01/2025 17:21 5 requirements.txt
la--- 21/01/2025 17:21 990 schema.sql
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\backend\database\__pycache__
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 21/01/2025 17:21 2082 database.cpython-311.pyc
la--- 21/01/2025 17:31 1936 database.cpython-312.pyc
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\backend\__pycache__
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 21/01/2025 17:31 1418 forms.cpython-312.pyc
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\flask_session
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 21/01/2025 18:14 9 2029240f6d1128be89ddc327294631
29
la--- 21/01/2025 17:21 37 bd9d4040a2dcd9c9d4ed85d3dc2d6b
a7
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 20/01/2025 17:44 src
la--- 20/01/2025 17:15 734 eslint.config.js
la--- 21/01/2025 16:58 370 index.html
la--- 20/01/2025 17:21 149648 package-lock.json
la--- 21/01/2025 18:07 837 package.json
la--- 20/01/2025 17:16 80 postcss.config.js
la--- 20/01/2025 17:16 126 tailwind.config.js
la--- 20/01/2025 17:15 665 tsconfig.app.json
la--- 20/01/2025 17:15 119 tsconfig.json
la--- 20/01/2025 17:15 593 tsconfig.node.json
la--- 20/01/2025 17:15 161 vite.config.ts
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 20/01/2025 17:15 assets
lar-- 20/01/2025 17:46 components
lar-- 21/01/2025 16:29 pages
la--- 20/01/2025 17:15 606 App.css
la--- 21/01/2025 16:30 799 App.tsx
la--- 20/01/2025 17:15 1161 index.css
la--- 20/01/2025 17:15 230 main.tsx
la--- 20/01/2025 17:15 38 vite-env.d.ts
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\assets
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 20/01/2025 17:15 4126 react.svg
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\components
Mode LastWriteTime Length Name
---- ------------- ------ ----
lar-- 20/01/2025 17:47 Auth
lar-- 20/01/2025 17:47 Checkout
lar-- 20/01/2025 17:47 Layout
lar-- 20/01/2025 17:48 Video
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\components\Auth
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 20/01/2025 17:47 13 LoginForm.tsx
la--- 20/01/2025 17:47 14 SignupForm.tsx
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\components\Checkout
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 20/01/2025 17:48 16 CheckoutForm.tsx
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\components\Layout
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 20/01/2025 17:49 533 BaseLayout.tsx
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\components\Video
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 20/01/2025 17:48 709 VideoPlayer.tsx
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\frontend\src\pages
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 21/01/2025 16:28 139 CheckoutPage.tsx
la--- 21/01/2025 16:27 309 HomePage.tsx
la--- 21/01/2025 16:28 133 LoginPage.tsx
la--- 21/01/2025 16:29 139 NotFoundPage.tsx
la--- 21/01/2025 16:29 135 SignupPage.tsx
la--- 21/01/2025 16:49 153 VideoPage.tsx
Directory: C:\Users\chris\OneDrive - University College Cork\Documents\School\Year 3\Semester 2\CS3305 - Team Software Project\cs3305-team11\Team-Software-Project\web_server\__pycache__
Mode LastWriteTime Length Name
---- ------------- ------ ----
la--- 21/01/2025 17:21 551 app.cpython-310.pyc
la--- 21/01/2025 17:21 6641 app.cpython-313.pyc
la--- 21/01/2025 17:21 976 database.cpython-310.pyc
la--- 21/01/2025 17:21 1036 forms.cpython-310.pyc
la--- 21/01/2025 17:21 1727 forms.cpython-311.pyc
la--- 21/01/2025 17:21 1291 forms.cpython-312.pyc
la--- 21/01/2025 17:21 1342 forms.cpython-313.pyc