AppkySearchPage.tsx1 match
8}
910export function SearchPage({ onViewPackage }: SearchPageProps) {
11// Search form state
12const [destination, setDestination] = useState('');
AppkyPackageCard.tsx1 match
9}
1011export function PackageCard({ travelPackage, onClick }: PackageCardProps) {
12const {
13title,
AppkyDashboard.tsx1 match
11}
1213export function Dashboard({ featuredPackages, onViewPackage, onSearch }: DashboardProps) {
14const [destination, setDestination] = useState('');
15const [startDate, setStartDate] = useState('');
AppkyHeader.tsx1 match
9}
1011export function Header({ user, onNavigate, onLogout }: HeaderProps) {
12const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
13
2425// App component
26export function App({ initialData }: AppProps) {
27// State for current page/route
28const [currentPage, setCurrentPage] = useState('home');
23// Format currency with proper symbol and decimal places
4export function formatCurrency(amount: number, currency = "USD"): string {
5const currencySymbols: Record<string, string> = {
6USD: "$",
2425// Format date to a user-friendly string
26export function formatDate(dateString: string): string {
27const date = new Date(dateString);
28return date.toLocaleDateString("en-US", {
3435// Calculate the number of days between two dates
36export function calculateDays(startDate: string, endDate: string): number {
37const start = new Date(startDate);
38const end = new Date(endDate);
4243// Parse JSON string to UserPreferences object
44export function parsePreferences(preferencesJson: string | undefined): UserPreferences | undefined {
45if (!preferencesJson) return undefined;
46
5455// Stringify UserPreferences object to JSON string
56export function stringifyPreferences(preferences: UserPreferences | undefined): string | undefined {
57if (!preferences) return undefined;
58
6667// Generate a random transaction ID for payment simulation
68export function generateTransactionId(): string {
69return `TXN-${Math.random().toString(36).substring(2, 10).toUpperCase()}`;
70}
7172// Truncate text to a specific length with ellipsis
73export function truncateText(text: string, maxLength: number): string {
74if (text.length <= maxLength) return text;
75return text.substring(0, maxLength) + "...";
7778// Validate email format
79export function isValidEmail(email: string): boolean {
80const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
81return emailRegex.test(email);
8384// Validate password strength
85export function isStrongPassword(password: string): boolean {
86// At least 8 characters, with at least one uppercase, one lowercase, and one number
87const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/;
Appkyqueries.ts14 matches
45// User queries
6export async function getUserByEmail(email: string): Promise<User | null> {
7const result = await sqlite.execute(
8`SELECT * FROM ${USERS_TABLE} WHERE email = ?`,
13}
1415export async function getUserById(id: number): Promise<User | null> {
16const result = await sqlite.execute(
17`SELECT * FROM ${USERS_TABLE} WHERE id = ?`,
22}
2324export async function createUser(user: Omit<User, 'id' | 'created_at'>): Promise<number> {
25const result = await sqlite.execute(
26`INSERT INTO ${USERS_TABLE} (email, password_hash, name, preferences)
3435// Agency queries
36export async function getAllAgencies(): Promise<Agency[]> {
37const result = await sqlite.execute(`SELECT * FROM ${AGENCIES_TABLE}`);
38return result.rows as Agency[];
39}
4041export async function getAgencyById(id: number): Promise<Agency | null> {
42const result = await sqlite.execute(
43`SELECT * FROM ${AGENCIES_TABLE} WHERE id = ?`,
4950// Travel package queries
51export async function getAllPackages(limit = 20, offset = 0): Promise<TravelPackage[]> {
52const result = await sqlite.execute(
53`SELECT p.*, a.name as agency_name
62}
6364export async function getPackageById(id: number): Promise<TravelPackage | null> {
65const result = await sqlite.execute(
66`SELECT p.*, a.name as agency_name
74}
7576export async function searchPackages(params: SearchParams): Promise<TravelPackage[]> {
77let query = `
78SELECT p.*, a.name as agency_name
126}
127128export async function getFeaturedPackages(limit = 6): Promise<TravelPackage[]> {
129const result = await sqlite.execute(
130`SELECT p.*, a.name as agency_name
141142// Booking queries
143export async function createBooking(booking: Omit<Booking, 'id' | 'booking_date'>): Promise<number> {
144const result = await sqlite.execute(
145`INSERT INTO ${BOOKINGS_TABLE} (
162}
163164export async function getBookingById(id: number): Promise<Booking | null> {
165const result = await sqlite.execute(
166`SELECT b.*, p.title as package_title, p.destination, p.image_url, p.start_date, p.end_date
174}
175176export async function getUserBookings(userId: number): Promise<Booking[]> {
177const result = await sqlite.execute(
178`SELECT b.*, p.title as package_title, p.destination, p.image_url, p.start_date, p.end_date
187}
188189export async function updateBookingStatus(id: number, status: string, paymentId?: string): Promise<boolean> {
190const updateFields = paymentId
191? `status = ?, payment_id = ?, payment_status = 'completed'`
207208// Update available spots when booking is confirmed
209export async function updatePackageAvailability(packageId: number, travelerCount: number): Promise<boolean> {
210const result = await sqlite.execute(
211`UPDATE ${PACKAGES_TABLE}
Appkymigrations.ts2 matches
7export const BOOKINGS_TABLE = "travel_bookings_v1";
89export async function runMigrations() {
10// Users table
11await sqlite.execute(`
76}
7778async function insertSampleData() {
79// Check if we already have sample data
80const agencyCount = await sqlite.execute(`SELECT COUNT(*) as count FROM ${AGENCIES_TABLE}`);
17โ โโโ database/
18โ โ โโโ migrations.ts # Schema definitions
19โ โ โโโ queries.ts # DB query functions
20โ โโโ routes/ # API route handlers
21โ โ โโโ agencies.ts # Agency-related endpoints
31โ โ โโโ Header.tsx # Navigation header
32โ โ โโโ PackageCard.tsx # Travel package display card
33โ โ โโโ SearchForm.tsx # Search functionality
34โ โ โโโ BookingFlow.tsx # Booking and payment process
35โ โโโ index.html # Main HTML template
37โโโ shared/
38โโโ types.ts # Shared type definitions
39โโโ utils.ts # Shared utility functions
40```
41
LiveStormMCPREADME.md1 match
2122- `index.ts`: Main entry point with HTTP trigger
23- `livestormApi.ts`: Functions to fetch and parse the OpenAPI definition
24- `mcp.ts`: MCP server setup and configuration