diff --git a/src/modules/events/components/CreateEventDialog.vue b/src/modules/events/components/CreateEventDialog.vue new file mode 100644 index 0000000..f658b9c --- /dev/null +++ b/src/modules/events/components/CreateEventDialog.vue @@ -0,0 +1,306 @@ + + + + + + + + + Create New Event + + + Create a new event with ticket sales. All fields are required. + + + + + + + + Wallet ID * + + + + Your LNbits wallet ID (admin key required) + + + + + + + + Event Name * + + + + + + + + + + + Event Description * + + + + Provide details about your event + + + + + + + + + Ticket Sales Close * + + + + When ticket sales end + + + + + + + Event Starts * + + + + + + + + + + Event Ends * + + + + + + + + + + + + + Total Tickets * + + + + + + + + + + Price per Ticket * + + + + + + + + + + Currency + + + + Default: sat + + + + + + + + + Banner Image URL (Optional) + + + + URL to an image for your event banner + + + + + + + + Cancel + + + + {{ isLoading ? 'Creating...' : 'Create Event' }} + + + + + + \ No newline at end of file diff --git a/src/modules/events/services/events-api.ts b/src/modules/events/services/events-api.ts index 3c81522..25722f8 100644 --- a/src/modules/events/services/events-api.ts +++ b/src/modules/events/services/events-api.ts @@ -1,5 +1,5 @@ // Events API service for the events module -import type { Event, Ticket } from '../types/event' +import type { Event, Ticket, CreateEventRequest } from '../types/event' export interface EventsApiConfig { baseUrl: string @@ -152,4 +152,34 @@ export class EventsApiService { throw error } } + + async createEvent(eventData: CreateEventRequest, adminKey: string): Promise { + try { + const response = await fetch( + `${this.config.baseUrl}/events/api/v1/events`, + { + method: 'POST', + headers: { + 'accept': 'application/json', + 'Content-Type': 'application/json', + 'X-API-KEY': adminKey, + }, + body: JSON.stringify(eventData), + } + ) + + if (!response.ok) { + const error = await response.json() + const errorMessage = typeof error.detail === 'string' + ? error.detail + : error.detail[0]?.msg || 'Failed to create event' + throw new Error(errorMessage) + } + + return await response.json() + } catch (error) { + console.error('Error creating event:', error) + throw error + } + } } \ No newline at end of file diff --git a/src/modules/events/types/event.ts b/src/modules/events/types/event.ts index 65a965b..f0a4de6 100644 --- a/src/modules/events/types/event.ts +++ b/src/modules/events/types/event.ts @@ -27,6 +27,19 @@ export interface Ticket { reg_timestamp: string } +export interface CreateEventRequest { + wallet: string + name: string + info: string + closing_date: string + event_start_date: string + event_end_date: string + currency: string + amount_tickets: number + price_per_ticket: number + banner?: string | null +} + export interface EventsApiError { detail: Array<{ loc: [string, number] diff --git a/src/modules/events/views/EventsPage.vue b/src/modules/events/views/EventsPage.vue index ae5a471..d474983 100644 --- a/src/modules/events/views/EventsPage.vue +++ b/src/modules/events/views/EventsPage.vue @@ -11,8 +11,12 @@ import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { format } from 'date-fns' import PurchaseTicketDialog from '../components/PurchaseTicketDialog.vue' -import { RefreshCw, User, LogIn } from 'lucide-vue-next' +import CreateEventDialog from '../components/CreateEventDialog.vue' +import { RefreshCw, User, LogIn, Plus } from 'lucide-vue-next' import { formatEventPrice } from '@/lib/utils/formatting' +import { injectService } from '@/core/di-container' +import { EVENTS_API_TOKEN } from '../composables/useEvents' +import type { CreateEventRequest } from '../types/event' // Simple reactive module loading const { isReady: moduleReady, isLoading: moduleLoading, error: moduleError } = useModuleReady('events') @@ -37,6 +41,9 @@ const selectedEvent = ref<{ currency: string } | null>(null) +// Create event dialog state +const showCreateDialog = ref(false) + function formatDate(dateStr: string) { if (!dateStr) return 'Date not available' @@ -68,6 +75,21 @@ function handlePurchaseClick(event: { function handleRetry() { window.location.reload() } + +// Create event handler +async function handleCreateEvent(eventData: CreateEventRequest) { + const eventsApi = injectService(EVENTS_API_TOKEN) + if (!eventsApi) { + throw new Error('Events API not available') + } + + // Use wallet as admin key for now - in production you'd want proper admin key management + await eventsApi.createEvent(eventData, eventData.wallet) +} + +function handleEventCreated() { + refresh?.() +} @@ -108,10 +130,16 @@ function handleRetry() { Please log in to purchase tickets - - - Refresh - + + + + Create Event + + + + Refresh + + @@ -213,5 +241,11 @@ function handleRetry() { +