UNPKG

vue3-stripe-kit

Version:

Complete Vue 3 Stripe integration with Payment Elements, Checkout, Subscriptions. TypeScript support, composables, components, modular architecture for payments, billing, and e-commerce

1 lines 27.9 kB
{"version":3,"file":"StripeWebhookMonitor-C71OKIoD.mjs","sources":["../src/components/StripeWebhookMonitor.vue"],"sourcesContent":["<template>\n <div class=\"webhook-monitor\">\n <div class=\"webhook-header\">\n <h3>Stripe Webhook Monitor</h3>\n <div class=\"webhook-controls\">\n <button \n @click=\"isMonitoring ? stopMonitoring() : startMonitoring()\"\n :class=\"['monitoring-btn', isMonitoring ? 'stop' : 'start']\"\n :disabled=\"loading\"\n >\n {{ isMonitoring ? '⏹️ Stop' : '▶️ Start' }} Monitoring\n </button>\n <button @click=\"refreshEvents\" :disabled=\"loading\" class=\"refresh-btn\">\n 🔄 Refresh\n </button>\n <button @click=\"clearEvents\" class=\"clear-btn\">\n 🗑️ Clear\n </button>\n <button @click=\"exportData('json')\" class=\"export-btn\">\n 📥 Export JSON\n </button>\n </div>\n </div>\n\n <div class=\"webhook-stats\">\n <div class=\"stat-card\">\n <div class=\"stat-number\">{{ stats.totalEvents }}</div>\n <div class=\"stat-label\">Total Events</div>\n </div>\n <div class=\"stat-card success\">\n <div class=\"stat-number\">{{ stats.successfulEvents }}</div>\n <div class=\"stat-label\">Successful</div>\n </div>\n <div class=\"stat-card error\">\n <div class=\"stat-number\">{{ stats.failedEvents }}</div>\n <div class=\"stat-label\">Failed</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-number\">{{ formatDate(stats.lastEventTime) }}</div>\n <div class=\"stat-label\">Last Event</div>\n </div>\n </div>\n\n <div class=\"webhook-filters\">\n <select v-model=\"selectedEventType\" class=\"filter-select\">\n <option value=\"\">All Event Types</option>\n <option v-for=\"eventType in eventTypes\" :key=\"eventType\" :value=\"eventType\">\n {{ eventType }}\n </option>\n </select>\n <input \n v-model=\"searchTerm\" \n type=\"text\" \n placeholder=\"Search events...\" \n class=\"search-input\"\n >\n </div>\n\n <div v-if=\"error\" class=\"error-message\">\n <strong>Error:</strong> {{ error.message }}\n </div>\n\n <div v-if=\"loading && !isMonitoring\" class=\"loading\">\n Loading webhook events...\n </div>\n\n <div class=\"webhook-events\">\n <div \n v-for=\"event in filteredEvents\" \n :key=\"event.id\"\n :class=\"['event-card', getEventTypeClass(event.type)]\"\n @click=\"selectEvent(event)\"\n >\n <div class=\"event-header\">\n <span class=\"event-type\">{{ event.type }}</span>\n <span class=\"event-time\">{{ formatDate(event.created) }}</span>\n <span :class=\"['event-status', event.livemode ? 'live' : 'test']\">\n {{ event.livemode ? 'LIVE' : 'TEST' }}\n </span>\n </div>\n <div class=\"event-id\">{{ event.id }}</div>\n <div v-if=\"event.pending_webhooks > 0\" class=\"pending-webhooks\">\n ⏳ {{ event.pending_webhooks }} pending\n </div>\n </div>\n </div>\n\n <!-- Event Detail Modal -->\n <div v-if=\"selectedEvent\" class=\"event-modal\" @click.self=\"closeEventModal\">\n <div class=\"event-modal-content\">\n <div class=\"event-modal-header\">\n <h4>{{ selectedEvent.type }}</h4>\n <button @click=\"closeEventModal\" class=\"close-btn\">✕</button>\n </div>\n <div class=\"event-modal-body\">\n <div class=\"event-detail-section\">\n <h5>Event Information</h5>\n <div class=\"event-details\">\n <div><strong>ID:</strong> {{ selectedEvent.id }}</div>\n <div><strong>Type:</strong> {{ selectedEvent.type }}</div>\n <div><strong>Created:</strong> {{ formatDate(selectedEvent.created) }}</div>\n <div><strong>Live Mode:</strong> {{ selectedEvent.livemode ? 'Yes' : 'No' }}</div>\n <div><strong>Pending Webhooks:</strong> {{ selectedEvent.pending_webhooks }}</div>\n </div>\n </div>\n \n <div class=\"event-detail-section\">\n <h5>Event Data</h5>\n <pre class=\"event-data\">{{ JSON.stringify(selectedEvent.data, null, 2) }}</pre>\n </div>\n \n <div v-if=\"selectedEvent.data.previous_attributes\" class=\"event-detail-section\">\n <h5>Previous Attributes</h5>\n <pre class=\"event-data\">{{ JSON.stringify(selectedEvent.data.previous_attributes, null, 2) }}</pre>\n </div>\n </div>\n <div class=\"event-modal-actions\">\n <button @click=\"simulateSelectedEvent\" class=\"simulate-btn\">\n 🧪 Simulate Event\n </button>\n <button @click=\"copyEventData\" class=\"copy-btn\">\n 📋 Copy Data\n </button>\n </div>\n </div>\n </div>\n\n <!-- Webhook Testing Panel -->\n <div v-if=\"showTestingPanel\" class=\"testing-panel\">\n <h4>Webhook Testing</h4>\n <div class=\"testing-controls\">\n <select v-model=\"testEventType\" class=\"test-select\">\n <option value=\"\">Select Event Type</option>\n <option v-for=\"eventType in eventTypes\" :key=\"eventType\" :value=\"eventType\">\n {{ eventType }}\n </option>\n </select>\n <button @click=\"simulateTestEvent\" :disabled=\"!testEventType\" class=\"test-btn\">\n 🧪 Simulate Event\n </button>\n </div>\n <textarea \n v-model=\"customTestData\"\n placeholder=\"Custom test data (JSON)...\"\n class=\"test-data-input\"\n ></textarea>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, onMounted } from 'vue'\nimport { useWebhooks } from '@/composables/useWebhooks'\nimport type { WebhookEvent, WebhookEventType } from '@/types'\n\ninterface Props {\n config?: any\n maxEvents?: number\n autoStart?: boolean\n showTesting?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n maxEvents: 100,\n autoStart: false,\n showTesting: true\n})\n\n// Composable\nconst {\n loading,\n error,\n events,\n stats,\n isMonitoring,\n startMonitoring,\n stopMonitoring,\n fetchEvents,\n clearEvents,\n exportEvents,\n simulateEvent,\n registerEventHandler\n} = useWebhooks(props.config)\n\n// Component state\nconst selectedEvent = ref<WebhookEvent | null>(null)\nconst selectedEventType = ref<string>('')\nconst searchTerm = ref<string>('')\nconst showTestingPanel = ref(props.showTesting)\nconst testEventType = ref<WebhookEventType | ''>('')\nconst customTestData = ref<string>('')\n\n// Event types for filtering\nconst eventTypes: WebhookEventType[] = [\n 'customer.created', 'customer.updated', 'customer.deleted',\n 'customer.subscription.created', 'customer.subscription.updated',\n 'customer.subscription.deleted', 'customer.subscription.trial_will_end',\n 'invoice.created', 'invoice.finalized', 'invoice.payment_succeeded',\n 'invoice.payment_failed', 'payment_intent.created', 'payment_intent.succeeded',\n 'checkout.session.completed', 'checkout.session.expired'\n]\n\n// Computed\nconst filteredEvents = computed(() => {\n let filtered = events.value\n\n if (selectedEventType.value) {\n filtered = filtered.filter(event => event.type === selectedEventType.value)\n }\n\n if (searchTerm.value) {\n const search = searchTerm.value.toLowerCase()\n filtered = filtered.filter(event =>\n event.id.toLowerCase().includes(search) ||\n event.type.toLowerCase().includes(search)\n )\n }\n\n return filtered.slice(0, props.maxEvents)\n})\n\n// Methods\nconst refreshEvents = async () => {\n await fetchEvents(props.maxEvents)\n}\n\nconst selectEvent = (event: WebhookEvent) => {\n selectedEvent.value = event\n}\n\nconst closeEventModal = () => {\n selectedEvent.value = null\n}\n\nconst getEventTypeClass = (eventType: string): string => {\n if (eventType.includes('failed') || eventType.includes('expired')) return 'error'\n if (eventType.includes('succeeded') || eventType.includes('completed')) return 'success'\n if (eventType.includes('trial') || eventType.includes('created')) return 'info'\n return 'default'\n}\n\nconst formatDate = (timestamp?: number): string => {\n if (!timestamp) return 'Never'\n return new Date(timestamp * 1000).toLocaleString()\n}\n\nconst exportData = (format: 'json' | 'csv') => {\n const data = exportEvents(format)\n const blob = new Blob([data], { type: format === 'json' ? 'application/json' : 'text/csv' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `webhook-events.${format}`\n a.click()\n URL.revokeObjectURL(url)\n}\n\nconst simulateTestEvent = async () => {\n if (!testEventType.value) return\n\n let testData = undefined\n if (customTestData.value) {\n try {\n testData = JSON.parse(customTestData.value)\n } catch (error) {\n console.error('Invalid JSON in test data:', error)\n return\n }\n }\n\n await simulateEvent(testEventType.value as WebhookEventType, testData)\n}\n\nconst simulateSelectedEvent = async () => {\n if (!selectedEvent.value) return\n await simulateEvent(selectedEvent.value.type, selectedEvent.value.data.object)\n closeEventModal()\n}\n\nconst copyEventData = () => {\n if (!selectedEvent.value) return\n navigator.clipboard.writeText(JSON.stringify(selectedEvent.value, null, 2))\n}\n\n// Register default event handlers for demo\nconst setupDefaultHandlers = () => {\n registerEventHandler({\n eventType: 'customer.subscription.created',\n handler: (event) => {\n console.log('🎉 New subscription created:', event.data.object.id)\n },\n description: 'Log new subscription creations'\n })\n\n registerEventHandler({\n eventType: 'invoice.payment_failed',\n handler: (event) => {\n console.log('❌ Payment failed:', event.data.object.id)\n },\n description: 'Log payment failures'\n })\n}\n\n// Lifecycle\nonMounted(() => {\n setupDefaultHandlers()\n refreshEvents()\n \n if (props.autoStart) {\n startMonitoring()\n }\n})\n</script>\n\n<style scoped>\n.webhook-monitor {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.webhook-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n}\n\n.webhook-header h3 {\n margin: 0;\n color: #1a1a1a;\n}\n\n.webhook-controls {\n display: flex;\n gap: 10px;\n}\n\n.monitoring-btn, .refresh-btn, .clear-btn, .export-btn {\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n transition: all 0.2s;\n}\n\n.monitoring-btn.start {\n background: #28a745;\n color: white;\n}\n\n.monitoring-btn.stop {\n background: #dc3545;\n color: white;\n}\n\n.refresh-btn {\n background: #007bff;\n color: white;\n}\n\n.clear-btn {\n background: #6c757d;\n color: white;\n}\n\n.export-btn {\n background: #17a2b8;\n color: white;\n}\n\n.webhook-controls button:hover:not(:disabled) {\n opacity: 0.8;\n}\n\n.webhook-controls button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.webhook-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 15px;\n margin-bottom: 20px;\n}\n\n.stat-card {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n text-align: center;\n border: 2px solid transparent;\n}\n\n.stat-card.success {\n border-color: #28a745;\n}\n\n.stat-card.error {\n border-color: #dc3545;\n}\n\n.stat-number {\n font-size: 24px;\n font-weight: bold;\n color: #1a1a1a;\n}\n\n.stat-label {\n font-size: 12px;\n color: #6c757d;\n margin-top: 5px;\n}\n\n.webhook-filters {\n display: flex;\n gap: 15px;\n margin-bottom: 20px;\n}\n\n.filter-select, .search-input {\n padding: 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n}\n\n.filter-select {\n min-width: 200px;\n}\n\n.search-input {\n flex: 1;\n max-width: 300px;\n}\n\n.error-message {\n background: #f8d7da;\n color: #721c24;\n padding: 15px;\n border-radius: 6px;\n margin-bottom: 20px;\n border: 1px solid #f5c6cb;\n}\n\n.loading {\n text-align: center;\n padding: 40px;\n color: #6c757d;\n}\n\n.webhook-events {\n display: grid;\n gap: 15px;\n}\n\n.event-card {\n background: white;\n border: 1px solid #ddd;\n border-radius: 8px;\n padding: 15px;\n cursor: pointer;\n transition: all 0.2s;\n border-left: 4px solid #ddd;\n}\n\n.event-card:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n}\n\n.event-card.success {\n border-left-color: #28a745;\n}\n\n.event-card.error {\n border-left-color: #dc3545;\n}\n\n.event-card.info {\n border-left-color: #17a2b8;\n}\n\n.event-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.event-type {\n font-weight: bold;\n color: #1a1a1a;\n}\n\n.event-time {\n font-size: 12px;\n color: #6c757d;\n}\n\n.event-status {\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: bold;\n}\n\n.event-status.live {\n background: #dc3545;\n color: white;\n}\n\n.event-status.test {\n background: #28a745;\n color: white;\n}\n\n.event-id {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 12px;\n color: #6c757d;\n margin-bottom: 5px;\n}\n\n.pending-webhooks {\n font-size: 12px;\n color: #ffc107;\n font-weight: bold;\n}\n\n.event-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 1000;\n}\n\n.event-modal-content {\n background: white;\n border-radius: 8px;\n width: 90%;\n max-width: 800px;\n max-height: 80vh;\n overflow-y: auto;\n}\n\n.event-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px;\n border-bottom: 1px solid #ddd;\n}\n\n.event-modal-header h4 {\n margin: 0;\n}\n\n.close-btn {\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n padding: 5px;\n}\n\n.event-modal-body {\n padding: 20px;\n}\n\n.event-detail-section {\n margin-bottom: 20px;\n}\n\n.event-detail-section h5 {\n margin: 0 0 10px 0;\n color: #1a1a1a;\n}\n\n.event-details {\n display: grid;\n gap: 8px;\n font-size: 14px;\n}\n\n.event-data {\n background: #f8f9fa;\n border: 1px solid #ddd;\n border-radius: 6px;\n padding: 15px;\n font-size: 12px;\n overflow-x: auto;\n max-height: 300px;\n}\n\n.event-modal-actions {\n padding: 20px;\n border-top: 1px solid #ddd;\n display: flex;\n gap: 10px;\n}\n\n.simulate-btn, .copy-btn {\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.simulate-btn {\n background: #ffc107;\n color: #1a1a1a;\n}\n\n.copy-btn {\n background: #6c757d;\n color: white;\n}\n\n.testing-panel {\n background: #f8f9fa;\n border: 1px solid #ddd;\n border-radius: 8px;\n padding: 20px;\n margin-top: 20px;\n}\n\n.testing-panel h4 {\n margin: 0 0 15px 0;\n}\n\n.testing-controls {\n display: flex;\n gap: 10px;\n margin-bottom: 15px;\n}\n\n.test-select {\n padding: 8px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n min-width: 200px;\n}\n\n.test-btn {\n padding: 8px 16px;\n background: #ffc107;\n color: #1a1a1a;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.test-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.test-data-input {\n width: 100%;\n min-height: 120px;\n padding: 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 12px;\n resize: vertical;\n}\n</style>"],"names":["error","_openBlock","_createElementBlock","_createElementVNode","_unref","_toDisplayString","_Fragment","_renderList","_normalizeClass","_createTextVNode"],"mappings":"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"}