@swingby-protocol/widget
Version:
Small util to load Swingby's swap widget in your app.
70 lines (65 loc) • 1.7 kB
text/typescript
import type {
SkybridgeBridge,
SkybridgeCoin,
SkybridgeMode,
SkybridgeResource,
} from '@swingby-protocol/sdk';
import { stringifyUrl } from 'query-string';
import type { Size } from './Size';
import type { Widget } from './Widget';
import { getHeight } from './getHeight';
type Options<R extends SkybridgeResource, M extends SkybridgeMode> = {
resource: R;
mode: M;
size: Size;
iframeTitle?: string;
defaultCurrencyDeposit?: SkybridgeCoin<R, M, 'in'>;
defaultCurrencyReceiving?: SkybridgeCoin<R, M, 'out'>;
defaultAddressReceiving?: string;
defaultAmountDesired?: string;
affiliateCode?: string;
locale?: string;
hash?: string;
/** @default `auto` */
theme?: 'light' | 'dark' | 'auto';
primaryColor?: string;
bridge?: SkybridgeBridge;
};
export const createWidget = <R extends SkybridgeResource, M extends SkybridgeMode>({
resource,
mode,
iframeTitle = 'Skybridge Swap Widget',
size,
hash,
theme = 'auto',
locale,
defaultCurrencyDeposit,
defaultCurrencyReceiving,
defaultAddressReceiving,
defaultAmountDesired,
affiliateCode,
bridge,
}: Options<R, M>): Widget => {
const url = stringifyUrl({
url: 'https://widget.skybridge.exchange',
query: {
mode,
resource,
hash,
locale,
defaultCurrencyDeposit,
defaultCurrencyReceiving,
defaultAddressReceiving,
defaultAmountDesired,
theme,
aff: affiliateCode,
bridge,
},
});
return {
__sswi__url: url,
__sswi__iframe: `<iframe allow="clipboard-write" title="${iframeTitle}" src="${url}" style="border: none; display: block; width: 100%; height: ${getHeight(
{ size },
)};"></iframe>`,
};
};