mirror of
https://github.com/onsonr/sonr.git
synced 2025-03-10 21:09:11 +00:00
- **refactor: move session-related code to middleware package** - **refactor: update PKL build process and adjust related configurations** - **feat: integrate base.cosmos.v1 Genesis module** - **refactor: pass session context to modal rendering functions** - **refactor: move nebula package to app directory and update templ version** - **refactor: Move home section video view to dedicated directory** - **refactor: remove unused views file** - **refactor: move styles and UI components to global scope** - **refactor: Rename images.go to cdn.go** - **feat: Add Empty State Illustrations** - **refactor: Consolidate Vault Index Logic** - **fix: References to App.wasm and remove Vault Directory embedded CDN files** - **refactor: Move CDN types to Models** - **fix: Correct line numbers in templ error messages for arch_templ.go** - **refactor: use common types for peer roles** - **refactor: move common types and ORM to a shared package** - **fix: Config import dwn** - **refactor: move nebula directory to app** - **feat: Rebuild nebula** - **fix: correct file paths in panels templates** - **feat: Remove duplicate types** - **refactor: Move dwn to pkg/core** - **refactor: Binary Structure** - **feat: Introduce Crypto Pkg** - **fix: Broken Process Start** - **feat: Update pkg/* structure** - **feat: Refactor PKL Structure** - **build: update pkl build process** - **chore: Remove Empty Files** - **refactor: remove unused macaroon package** - **feat: Add WebAwesome Components** - **refactor: consolidate build and generation tasks into a single taskfile, remove redundant makefile targets** - **refactor: refactor server and move components to pkg/core/dwn** - **build: update go modules** - **refactor: move gateway logic into dedicated hway command** - **feat: Add KSS (Krawczyk-Song-Song) MPC cryptography module** - **feat: Implement MPC-based JWT signing and UCAN token generation** - **feat: add support for MPC-based JWT signing** - **feat: Implement MPC-based UCAN capabilities for smart accounts** - **feat: add address field to keyshareSource** - **feat: Add comprehensive MPC test suite for keyshares, UCAN tokens, and token attenuations** - **refactor: improve MPC keyshare management and signing process** - **feat: enhance MPC capability hierarchy documentation** - **refactor: rename GenerateKeyshares function to NewKeyshareSource for clarity** - **refactor: remove unused Ethereum address computation** - **feat: Add HasHandle and IsAuthenticated methods to HTTPContext** - **refactor: Add context.Context support to session HTTPContext** - **refactor: Resolve context interface conflicts in HTTPContext** - **feat: Add session ID context key and helper functions** - **feat: Update WebApp Page Rendering** - **refactor: Simplify context management by using single HTTPContext key** - **refactor: Simplify HTTPContext creation and context management in session middleware** - **refactor: refactor session middleware to use a single data structure** - **refactor: Simplify HTTPContext implementation and session data handling** - **refactor: Improve session context handling and prevent nil pointer errors** - **refactor: Improve session context handling with nil safety and type support** - **refactor: improve session data injection** - **feat: add full-screen modal component and update registration flow** - **chore: add .air.toml to .gitignore** - **feat: add Air to devbox and update dependencies**
151 lines
5.1 KiB
Plaintext
151 lines
5.1 KiB
Plaintext
|
|
package payments
|
|
|
|
var paymentsHandle = templ.NewOnceHandle()
|
|
|
|
// Payment types
|
|
type PaymentMethodData struct {
|
|
SupportedMethods string `json:"supportedMethods"`
|
|
Data map[string]any `json:"data,omitempty"`
|
|
}
|
|
|
|
type PaymentItem struct {
|
|
Label string `json:"label"`
|
|
Amount Money `json:"amount"`
|
|
}
|
|
|
|
type Money struct {
|
|
Currency string `json:"currency"`
|
|
Value string `json:"value"` // Decimal as string for precision
|
|
}
|
|
|
|
type PaymentOptions struct {
|
|
RequestPayerName bool `json:"requestPayerName,omitempty"`
|
|
RequestPayerEmail bool `json:"requestPayerEmail,omitempty"`
|
|
RequestPayerPhone bool `json:"requestPayerPhone,omitempty"`
|
|
RequestShipping bool `json:"requestShipping,omitempty"`
|
|
}
|
|
|
|
type PaymentDetails struct {
|
|
Total PaymentItem `json:"total"`
|
|
DisplayItems []PaymentItem `json:"displayItems,omitempty"`
|
|
ShippingOptions []ShippingOption `json:"shippingOptions,omitempty"`
|
|
}
|
|
|
|
type ShippingOption struct {
|
|
ID string `json:"id"`
|
|
Label string `json:"label"`
|
|
Amount Money `json:"amount"`
|
|
Selected bool `json:"selected,omitempty"`
|
|
}
|
|
|
|
type PaymentRequest struct {
|
|
MethodData []PaymentMethodData `json:"methodData"`
|
|
Details PaymentDetails `json:"details"`
|
|
Options PaymentOptions `json:"options,omitempty"`
|
|
}
|
|
|
|
// Base payments script template
|
|
templ PaymentsScripts() {
|
|
@paymentsHandle.Once() {
|
|
<script type="text/javascript">
|
|
// Check if Payment Request API is supported
|
|
function isPaymentRequestSupported() {
|
|
return window.PaymentRequest !== undefined;
|
|
}
|
|
|
|
// Create and show payment request
|
|
async function showPaymentRequest(request) {
|
|
try {
|
|
const paymentMethods = request.methodData;
|
|
const details = request.details;
|
|
const options = request.options || {};
|
|
|
|
const paymentRequest = new PaymentRequest(
|
|
paymentMethods,
|
|
details,
|
|
options
|
|
);
|
|
|
|
// Handle shipping address changes if shipping is requested
|
|
if (options.requestShipping) {
|
|
paymentRequest.addEventListener('shippingaddresschange', event => {
|
|
event.updateWith(Promise.resolve(details));
|
|
});
|
|
}
|
|
|
|
// Handle shipping option changes
|
|
if (details.shippingOptions && details.shippingOptions.length > 0) {
|
|
paymentRequest.addEventListener('shippingoptionchange', event => {
|
|
event.updateWith(Promise.resolve(details));
|
|
});
|
|
}
|
|
|
|
const response = await paymentRequest.show();
|
|
|
|
// Create response object
|
|
const result = {
|
|
methodName: response.methodName,
|
|
details: response.details,
|
|
};
|
|
|
|
if (options.requestPayerName) {
|
|
result.payerName = response.payerName;
|
|
}
|
|
if (options.requestPayerEmail) {
|
|
result.payerEmail = response.payerEmail;
|
|
}
|
|
if (options.requestPayerPhone) {
|
|
result.payerPhone = response.payerPhone;
|
|
}
|
|
if (options.requestShipping) {
|
|
result.shippingAddress = response.shippingAddress;
|
|
result.shippingOption = response.shippingOption;
|
|
}
|
|
|
|
// Complete the payment
|
|
await response.complete('success');
|
|
|
|
// Dispatch success event
|
|
window.dispatchEvent(new CustomEvent('paymentComplete', {
|
|
detail: result
|
|
}));
|
|
|
|
} catch (err) {
|
|
// Dispatch error event
|
|
window.dispatchEvent(new CustomEvent('paymentError', {
|
|
detail: err.message
|
|
}));
|
|
}
|
|
}
|
|
|
|
// Abort payment request
|
|
function abortPaymentRequest() {
|
|
if (window.currentPaymentRequest) {
|
|
window.currentPaymentRequest.abort();
|
|
}
|
|
}
|
|
</script>
|
|
}
|
|
}
|
|
|
|
// StartPayment for initiating payment request
|
|
templ StartPayment(request PaymentRequest) {
|
|
@PaymentsScripts()
|
|
<script>
|
|
(async () => {
|
|
try {
|
|
if (!isPaymentRequestSupported()) {
|
|
throw new Error("Payment Request API is not supported in this browser");
|
|
}
|
|
const request = { templ.JSONString(request) };
|
|
await showPaymentRequest(request);
|
|
} catch (err) {
|
|
window.dispatchEvent(new CustomEvent('paymentError', {
|
|
detail: err.message
|
|
}));
|
|
}
|
|
})();
|
|
</script>
|
|
}
|