@liberfi.io/ui-launchpad 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,6 @@
1
+ # @liberfi.io/ui-launchpad
2
+
3
+ Launchpad widgets for Liberfi React SDK.
4
+
5
+ Depends on `@liberfi.io/react-launchpad` and base UI. Does not depend on
6
+ ChainStream, Privy, Next, or `@liberfi.io/ui-media-track/client`.
@@ -0,0 +1,81 @@
1
+ import { LaunchpadCreateStatus, LaunchPadPlatform, LaunchpadCreateSnapshot, LaunchpadCreateRuntime } from '@liberfi.io/react-launchpad';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import * as react from 'react';
4
+ import { PropsWithChildren } from 'react';
5
+ import { Chain } from '@liberfi.io/types';
6
+
7
+ declare function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {
8
+ status: LaunchpadCreateStatus;
9
+ canSubmit: boolean;
10
+ };
11
+
12
+ interface LaunchPadHomeProps {
13
+ prompt?: string;
14
+ image?: string;
15
+ }
16
+ declare function LaunchPadHome({ prompt, image }: LaunchPadHomeProps): react_jsx_runtime.JSX.Element;
17
+
18
+ type LaunchPadCreateFormValues = {
19
+ name: string;
20
+ ticker: string;
21
+ image: string;
22
+ description: string;
23
+ website: string;
24
+ twitter: string;
25
+ telegram: string;
26
+ supply: number;
27
+ raised: number;
28
+ sold: number;
29
+ locked: number;
30
+ shareFee: boolean;
31
+ };
32
+ declare function LaunchPadCreateForm({ platform, suggestedImage, suggestedName, suggestedSymbol, className, onPreviewChange, }: {
33
+ platform: LaunchPadPlatform;
34
+ suggestedImage?: string;
35
+ suggestedName?: string;
36
+ suggestedSymbol?: string;
37
+ className?: string;
38
+ onPreviewChange?: (values: LaunchPadCreateFormValues) => void;
39
+ }): react_jsx_runtime.JSX.Element;
40
+
41
+ type GeneratedMemeInfo = {
42
+ symbol: string;
43
+ name?: string;
44
+ image?: string;
45
+ };
46
+ type LaunchpadUiPorts = {
47
+ chain: Chain;
48
+ requireAuth: (action: () => Promise<void>) => Promise<void>;
49
+ uploadImage: (file: File) => Promise<string>;
50
+ createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;
51
+ generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;
52
+ onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;
53
+ };
54
+ declare function LaunchpadUiProvider({ ports, children, }: PropsWithChildren<{
55
+ ports: LaunchpadUiPorts;
56
+ }>): react.FunctionComponentElement<react.ProviderProps<LaunchpadUiPorts | null>>;
57
+ declare function useLaunchpadUiPorts(): LaunchpadUiPorts;
58
+ declare function createInMemoryLaunchpadUiPorts(options?: {
59
+ chain?: Chain;
60
+ generateMeme?: LaunchpadUiPorts["generateMeme"];
61
+ signError?: Error;
62
+ uploadError?: Error;
63
+ }): LaunchpadUiPorts;
64
+
65
+ type MagicLaunchProps = {
66
+ prompt?: string;
67
+ onGenerate?: (result: GeneratedMemeInfo) => void;
68
+ };
69
+ declare function MagicLaunch({ prompt, onGenerate }: MagicLaunchProps): react_jsx_runtime.JSX.Element;
70
+
71
+ declare function LaunchPadCurvePreview({ platform, supply, raised, soldPercent, }: {
72
+ platform: LaunchPadPlatform;
73
+ supply?: number;
74
+ raised?: number;
75
+ soldPercent?: number;
76
+ }): react_jsx_runtime.JSX.Element;
77
+
78
+ declare const PACKAGE_NAME: "@liberfi.io/ui-launchpad";
79
+ declare function LaunchpadReadyWidget(): "@liberfi.io/ui-launchpad";
80
+
81
+ export { type GeneratedMemeInfo, LaunchPadCreateForm, LaunchPadCurvePreview, LaunchPadHome, type LaunchPadHomeProps, LaunchpadCreateStatusView, LaunchpadReadyWidget, type LaunchpadUiPorts, LaunchpadUiProvider, MagicLaunch, type MagicLaunchProps, PACKAGE_NAME, createInMemoryLaunchpadUiPorts, useLaunchpadUiPorts };
@@ -0,0 +1,81 @@
1
+ import { LaunchpadCreateStatus, LaunchPadPlatform, LaunchpadCreateSnapshot, LaunchpadCreateRuntime } from '@liberfi.io/react-launchpad';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import * as react from 'react';
4
+ import { PropsWithChildren } from 'react';
5
+ import { Chain } from '@liberfi.io/types';
6
+
7
+ declare function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {
8
+ status: LaunchpadCreateStatus;
9
+ canSubmit: boolean;
10
+ };
11
+
12
+ interface LaunchPadHomeProps {
13
+ prompt?: string;
14
+ image?: string;
15
+ }
16
+ declare function LaunchPadHome({ prompt, image }: LaunchPadHomeProps): react_jsx_runtime.JSX.Element;
17
+
18
+ type LaunchPadCreateFormValues = {
19
+ name: string;
20
+ ticker: string;
21
+ image: string;
22
+ description: string;
23
+ website: string;
24
+ twitter: string;
25
+ telegram: string;
26
+ supply: number;
27
+ raised: number;
28
+ sold: number;
29
+ locked: number;
30
+ shareFee: boolean;
31
+ };
32
+ declare function LaunchPadCreateForm({ platform, suggestedImage, suggestedName, suggestedSymbol, className, onPreviewChange, }: {
33
+ platform: LaunchPadPlatform;
34
+ suggestedImage?: string;
35
+ suggestedName?: string;
36
+ suggestedSymbol?: string;
37
+ className?: string;
38
+ onPreviewChange?: (values: LaunchPadCreateFormValues) => void;
39
+ }): react_jsx_runtime.JSX.Element;
40
+
41
+ type GeneratedMemeInfo = {
42
+ symbol: string;
43
+ name?: string;
44
+ image?: string;
45
+ };
46
+ type LaunchpadUiPorts = {
47
+ chain: Chain;
48
+ requireAuth: (action: () => Promise<void>) => Promise<void>;
49
+ uploadImage: (file: File) => Promise<string>;
50
+ createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;
51
+ generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;
52
+ onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;
53
+ };
54
+ declare function LaunchpadUiProvider({ ports, children, }: PropsWithChildren<{
55
+ ports: LaunchpadUiPorts;
56
+ }>): react.FunctionComponentElement<react.ProviderProps<LaunchpadUiPorts | null>>;
57
+ declare function useLaunchpadUiPorts(): LaunchpadUiPorts;
58
+ declare function createInMemoryLaunchpadUiPorts(options?: {
59
+ chain?: Chain;
60
+ generateMeme?: LaunchpadUiPorts["generateMeme"];
61
+ signError?: Error;
62
+ uploadError?: Error;
63
+ }): LaunchpadUiPorts;
64
+
65
+ type MagicLaunchProps = {
66
+ prompt?: string;
67
+ onGenerate?: (result: GeneratedMemeInfo) => void;
68
+ };
69
+ declare function MagicLaunch({ prompt, onGenerate }: MagicLaunchProps): react_jsx_runtime.JSX.Element;
70
+
71
+ declare function LaunchPadCurvePreview({ platform, supply, raised, soldPercent, }: {
72
+ platform: LaunchPadPlatform;
73
+ supply?: number;
74
+ raised?: number;
75
+ soldPercent?: number;
76
+ }): react_jsx_runtime.JSX.Element;
77
+
78
+ declare const PACKAGE_NAME: "@liberfi.io/ui-launchpad";
79
+ declare function LaunchpadReadyWidget(): "@liberfi.io/ui-launchpad";
80
+
81
+ export { type GeneratedMemeInfo, LaunchPadCreateForm, LaunchPadCurvePreview, LaunchPadHome, type LaunchPadHomeProps, LaunchpadCreateStatusView, LaunchpadReadyWidget, type LaunchpadUiPorts, LaunchpadUiProvider, MagicLaunch, type MagicLaunchProps, PACKAGE_NAME, createInMemoryLaunchpadUiPorts, useLaunchpadUiPorts };
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ 'use strict';var react=require('react'),ui=require('@liberfi.io/ui'),reactLaunchpad=require('@liberfi.io/react-launchpad'),i18n=require('@liberfi.io/i18n'),types=require('@liberfi.io/types'),jsxRuntime=require('react/jsx-runtime');function V(n){return {status:n,canSubmit:n!=="signing"&&n!=="submitting"&&n!=="uploading"&&n!=="succeeded"}}var W=react.createContext(null);function re({ports:n,children:d}){return react.createElement(W.Provider,{value:n},d)}function L(){let n=react.useContext(W);if(!n)throw new Error("useLaunchpadUiPorts must be used within LaunchpadUiProvider");return n}function oe(n={}){let d=reactLaunchpad.createInMemoryLaunchpadPorts({signError:n.signError,uploadError:n.uploadError});return {chain:n.chain??types.Chain.SOLANA,requireAuth:async o=>{await o();},uploadImage:async o=>{if(n.uploadError)throw n.uploadError;return "https://ipfs.io/ipfs/memory-image"},generateMeme:n.generateMeme,createRuntime:o=>reactLaunchpad.createLaunchpadCreateRuntime({...d,onChange:o})}}var j={name:"",ticker:"",image:"",description:"",website:"",twitter:"",telegram:"",supply:1e9,raised:85,sold:51,locked:0,shareFee:false};function U({platform:n,suggestedImage:d,suggestedName:o,suggestedSymbol:c,className:u,onPreviewChange:m}){let{t}=i18n.useTranslation(),l=L(),[e,p]=react.useState(j),[r,f]=react.useState({}),[b,i]=react.useState({status:"idle"}),[_,M]=react.useState(false),N=react.useRef(null),B=n===reactLaunchpad.LaunchPadPlatform.RAYDIUM,F=V(b.status);react.useEffect(()=>{p(a=>({...a,name:o||a.name,ticker:c||a.ticker,image:d||a.image}));},[d,o,c]),react.useEffect(()=>{m?.(e);},[m,e]);let z=react.useMemo(()=>!e.name.trim()||!e.ticker.trim()||!e.image.trim()||!F.canSubmit||_,[_,e.image,e.name,e.ticker,F.canSubmit]),g=(a,v)=>{p(h=>({...h,[a]:v})),f(h=>({...h,[a]:void 0}));},J=()=>{let a={};return e.name.trim()?e.name.length>24&&(a.name=t("extend.launchpad.error_name_length")):a.name=t("extend.launchpad.error_name_required"),e.ticker.trim()?e.ticker.length>10&&(a.ticker=t("extend.launchpad.error_ticker_length")):a.ticker=t("extend.launchpad.error_ticker_required"),e.image.trim()||(a.image=t("extend.launchpad.error_image_required")),B&&((Number.isNaN(e.raised)||e.raised<30)&&(a.raised=t("extend.launchpad.error_raised_min")),(e.sold<51||e.sold>80)&&(a.sold=t("extend.launchpad.error_sold_min")),(e.locked<0||e.locked>30)&&(a.locked=t("extend.launchpad.error_locked_max")),e.sold+e.locked>80&&(a.sold=t("extend.launchpad.error_locked_sum_by_sold"))),f(a),Object.keys(a).length===0};return jsxRuntime.jsxs("form",{className:ui.cn("flex flex-col gap-4",u),onSubmit:a=>{a.preventDefault(),J()&&l.requireAuth(async()=>{let h=await l.createRuntime(i).submit({chain:l.chain,name:e.name.trim(),symbol:e.ticker.trim(),platform:n,imageUri:e.image,description:e.description||void 0,website:e.website||void 0,twitter:e.twitter||void 0,telegram:e.telegram||void 0});if(h.status==="succeeded"){l.onCreated?.(h),p(j),ui.toast.success(t("extend.launchpad.mint_transaction_submitted"));return}ui.toast.error(h.error?.message??t("extend.launchpad.mint_transaction_error"));});},children:[jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.name_label"),value:e.name,isInvalid:!!r.name,errorMessage:r.name,onValueChange:a=>g("name",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.ticker_label"),value:e.ticker,isInvalid:!!r.ticker,errorMessage:r.ticker,onValueChange:a=>g("ticker",a)}),jsxRuntime.jsxs("div",{className:"space-y-1.5",children:[jsxRuntime.jsx("h3",{className:ui.cn("text-sm",r.image&&"text-danger"),children:t("extend.launchpad.image_label")}),jsxRuntime.jsx(ui.Upload,{ref:N,accept:{"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"],"image/webp":[".webp"]},maxFiles:1,maxSize:10*1024*1024,noClick:true,noKeyboard:true,onDropAccepted:a=>{let v=a[0];v&&(M(true),l.uploadImage(v).then(h=>g("image",h)).catch(h=>{ui.toast.error(h instanceof Error?h.message:t("extend.launchpad.error_image_upload"));}).finally(()=>M(false)));},children:jsxRuntime.jsx("button",{type:"button",className:"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden",onClick:()=>N.current?.open(),children:e.image?jsxRuntime.jsx(ui.Image,{src:e.image,alt:"",className:"h-full w-full object-cover"}):jsxRuntime.jsx(ui.ImageGalleryIcon,{width:24,height:24,className:"text-neutral"})})}),r.image?jsxRuntime.jsx("p",{className:"text-xs text-danger",children:r.image}):null]}),jsxRuntime.jsx(ui.Textarea,{label:t("extend.launchpad.description_label"),placeholder:t("extend.launchpad.description_placeholder"),value:e.description,onValueChange:a=>g("description",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.website_label"),value:e.website,onValueChange:a=>g("website",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.twitter_label"),value:e.twitter,onValueChange:a=>g("twitter",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.telegram_label"),value:e.telegram,onValueChange:a=>g("telegram",a)}),B?jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.supply_label"),value:e.supply,onValueChange:a=>g("supply",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.raised_label"),value:e.raised,isInvalid:!!r.raised,errorMessage:r.raised,onValueChange:a=>g("raised",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.sold_label"),value:e.sold,isInvalid:!!r.sold,errorMessage:r.sold,onValueChange:a=>g("sold",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.locked_label"),value:e.locked,isInvalid:!!r.locked,errorMessage:r.locked,onValueChange:a=>g("locked",Number(a??0))}),jsxRuntime.jsxs("div",{className:"col-span-2 flex items-center justify-between",children:[jsxRuntime.jsx("span",{className:"text-sm",children:t("extend.launchpad.share_fee_label")}),jsxRuntime.jsx(ui.Switch,{isSelected:e.shareFee,onValueChange:a=>g("shareFee",a)})]})]}):null,jsxRuntime.jsx(ui.Button,{type:"submit",color:"primary",isDisabled:z,isLoading:!F.canSubmit,children:t("extend.launchpad.submit")})]})}var A=6,$=9,ve="1000000000000000",Le="793100000000000",ye="35000000000",Ce="20000000";function T({platform:n,supply:d=1e9,raised:o=35,soldPercent:c=79.31}){let{t:u}=i18n.useTranslation(),m=react.useMemo(()=>{let l=n===reactLaunchpad.LaunchPadPlatform.PUMPFUN,e=l?ve:String(Math.round(d*10**A)),p=l?Le:String(Math.round(d*(c/100)*10**A)),r=l?ye:String(Math.round(o*10**$));try{return reactLaunchpad.Curve.getPoolCurvePointByInit({curveType:reactLaunchpad.CurveType.CONSTANT_PRODUCT,supply:e,totalSell:p,totalLockedAmount:0,totalFundRaising:r,migrateFee:Ce,decimalA:A,decimalB:$,pointCount:24})}catch{return []}},[n,o,c,d]),t=react.useMemo(()=>{if(m.length===0)return "";let l=m.map(i=>Number(i.totalSellSupply)),e=m.map(i=>Number(i.price)),p=Math.min(...l),r=Math.max(...l)||1,f=Math.min(...e),b=Math.max(...e)||1;return m.map((i,_)=>{let M=(Number(i.totalSellSupply)-p)/(r-p||1)*320,N=120-(Number(i.price)-f)/(b-f||1)*100;return `${_===0?"M":"L"}${M.toFixed(1)},${N.toFixed(1)}`}).join(" ")},[m]);return jsxRuntime.jsxs("div",{className:"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden",children:[jsxRuntime.jsx("h2",{className:"text-sm font-medium",children:u("extend.launchpad.curve_preview")}),jsxRuntime.jsx("svg",{viewBox:"0 0 320 140",className:"w-full h-40",role:"img","aria-label":u("extend.launchpad.curve_preview"),children:jsxRuntime.jsx("path",{d:t,fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-primary"})})]})}function K({prompt:n="",onGenerate:d}){let{t:o}=i18n.useTranslation(),c=L(),[u,m]=react.useState(n),[t,l]=react.useState(false),e=u.length>300,p=u.length>0&&!e&&!!c.generateMeme&&!t;return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsxs("div",{className:"flex justify-between items-center",children:[jsxRuntime.jsx("span",{className:"font-semibold text-sm",style:{backgroundImage:"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:o("extend.launchpad.magic_launch")}),jsxRuntime.jsxs("span",{className:ui.cn("text-xs",e?"text-danger":"text-neutral"),children:[u.length,"/300"]})]}),jsxRuntime.jsx(ui.Textarea,{minRows:2,value:u,onValueChange:m,placeholder:o("extend.launchpad.magic_launch_explained")}),jsxRuntime.jsx(ui.Button,{color:"primary",isDisabled:!p,isLoading:t,onPress:()=>{c.requireAuth(async()=>{if(c.generateMeme){l(true);try{let r=await c.generateMeme(u);d?.(r);}finally{l(false);}}});},children:o("extend.launchpad.magic_launch_submit")})]})}var Ve=[{platform:reactLaunchpad.LaunchPadPlatform.PUMPFUN,name:"Pump",icon:"/images/launchpad/pumpfun.svg"},{platform:reactLaunchpad.LaunchPadPlatform.RAYDIUM,name:"Raydium",icon:"/images/launchpad/raydium.svg"}];function Ee({prompt:n,image:d}){let[o,c]=react.useState(reactLaunchpad.LaunchPadPlatform.PUMPFUN),[u,m]=react.useState(d),[t,l]=react.useState(void 0),[e,p]=react.useState(void 0),[r,f]=react.useState(null),b=react.useCallback(i=>{m(i.image),l(i.name),p(i.symbol);},[]);return jsxRuntime.jsxs("div",{className:"flex flex-col gap-4",children:[jsxRuntime.jsx(K,{prompt:n,onGenerate:b}),jsxRuntime.jsxs("div",{className:"flex-1 flex items-start justify-center gap-4",children:[jsxRuntime.jsxs("div",{className:ui.cn("h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2"),children:[jsxRuntime.jsx(ui.Tabs,{fullWidth:true,selectedKey:o,onSelectionChange:i=>c(String(i)),disableAnimation:true,children:Ve.map(i=>jsxRuntime.jsx(ui.Tab,{title:jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx(ui.Image,{src:i.icon,alt:i.name,width:20,height:20}),jsxRuntime.jsx("span",{children:i.name})]})},i.platform))}),jsxRuntime.jsx(U,{platform:reactLaunchpad.LaunchPadPlatform.PUMPFUN,className:ui.cn({hidden:o!==reactLaunchpad.LaunchPadPlatform.PUMPFUN}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f}),jsxRuntime.jsx(U,{platform:reactLaunchpad.LaunchPadPlatform.RAYDIUM,className:ui.cn({hidden:o!==reactLaunchpad.LaunchPadPlatform.RAYDIUM}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f})]}),jsxRuntime.jsx(T,{platform:o,supply:r?.supply,raised:r?.raised,soldPercent:r?.sold})]})]})}var Ae="@liberfi.io/ui-launchpad";function ga(){return Ae}
2
+ exports.LaunchPadCreateForm=U;exports.LaunchPadCurvePreview=T;exports.LaunchPadHome=Ee;exports.LaunchpadCreateStatusView=V;exports.LaunchpadReadyWidget=ga;exports.LaunchpadUiProvider=re;exports.MagicLaunch=K;exports.PACKAGE_NAME=Ae;exports.createInMemoryLaunchpadUiPorts=oe;exports.useLaunchpadUiPorts=L;//# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/create-status.view.ts","../src/ports.tsx","../src/LaunchPadCreateForm.tsx","../src/LaunchPadCurvePreview.tsx","../src/MagicLaunch.tsx","../src/LaunchPadHome.tsx","../src/index.ts"],"names":["LaunchpadCreateStatusView","status","LaunchpadUiPortsContext","createContext","LaunchpadUiProvider","ports","children","createElement","useLaunchpadUiPorts","useContext","createInMemoryLaunchpadUiPorts","options","memory","createInMemoryLaunchpadPorts","Chain","action","file","onChange","createLaunchpadCreateRuntime","DEFAULT_VALUES","LaunchPadCreateForm","platform","suggestedImage","suggestedName","suggestedSymbol","className","onPreviewChange","useTranslation","values","setValues","useState","errors","setErrors","snapshot","setSnapshot","uploading","setUploading","uploaderRef","useRef","isRaydium","LaunchPadPlatform","view","useEffect","current","disabled","useMemo","setField","key","value","validate","next","jsxs","cn","event","result","toast","jsx","Input","Upload","files","url","error","Image","ImageGalleryIcon","Textarea","NumberInput","Switch","Button","NEW_TOKEN_DECIMALS","SOL_TOKEN_DECIMALS","PUMP_SUPPLY","PUMP_SOLD","PUMP_RAISED","PUMP_MIGRATE_FEE","LaunchPadCurvePreview","supply","raised","soldPercent","t","points","isPump","supplyValue","soldValue","raisedValue","Curve","CurveType","path","xs","point","ys","minX","maxX","minY","maxY","index","x","y","MagicLaunch","prompt","onGenerate","setValue","pending","setPending","tooLong","canGenerate","PLATFORMS","LaunchPadHome","image","setPlatform","setSuggestedImage","setSuggestedName","setSuggestedSymbol","preview","setPreview","useCallback","Tabs","item","Tab","PACKAGE_NAME","LaunchpadReadyWidget"],"mappings":"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","file":"index.js","sourcesContent":["import type { LaunchpadCreateStatus } from \"@liberfi.io/react-launchpad\";\n\nexport function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {\n status: LaunchpadCreateStatus;\n canSubmit: boolean;\n} {\n return {\n status,\n canSubmit:\n status !== \"signing\" &&\n status !== \"submitting\" &&\n status !== \"uploading\" &&\n status !== \"succeeded\",\n };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type PropsWithChildren,\n} from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n createInMemoryLaunchpadPorts,\n createLaunchpadCreateRuntime,\n type LaunchpadCreateRuntime,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\n\nexport type GeneratedMemeInfo = {\n symbol: string;\n name?: string;\n image?: string;\n};\n\nexport type LaunchpadUiPorts = {\n chain: Chain;\n requireAuth: (action: () => Promise<void>) => Promise<void>;\n uploadImage: (file: File) => Promise<string>;\n createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;\n generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;\n onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;\n};\n\nconst LaunchpadUiPortsContext = createContext<LaunchpadUiPorts | null>(null);\n\nexport function LaunchpadUiProvider({\n ports,\n children,\n}: PropsWithChildren<{ ports: LaunchpadUiPorts }>) {\n return createElement(LaunchpadUiPortsContext.Provider, { value: ports }, children);\n}\n\nexport function useLaunchpadUiPorts(): LaunchpadUiPorts {\n const ports = useContext(LaunchpadUiPortsContext);\n if (!ports) {\n throw new Error(\"useLaunchpadUiPorts must be used within LaunchpadUiProvider\");\n }\n return ports;\n}\n\nexport function createInMemoryLaunchpadUiPorts(\n options: {\n chain?: Chain;\n generateMeme?: LaunchpadUiPorts[\"generateMeme\"];\n signError?: Error;\n uploadError?: Error;\n } = {},\n): LaunchpadUiPorts {\n const memory = createInMemoryLaunchpadPorts({\n signError: options.signError,\n uploadError: options.uploadError,\n });\n return {\n chain: options.chain ?? Chain.SOLANA,\n requireAuth: async (action) => {\n await action();\n },\n uploadImage: async (file) => {\n void file;\n if (options.uploadError) throw options.uploadError;\n return \"https://ipfs.io/ipfs/memory-image\";\n },\n generateMeme: options.generateMeme,\n createRuntime: (onChange) =>\n createLaunchpadCreateRuntime({\n ...memory,\n onChange,\n }),\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n LaunchPadPlatform,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\nimport {\n Button,\n cn,\n Image,\n ImageGalleryIcon,\n Input,\n NumberInput,\n Switch,\n Textarea,\n toast,\n Upload,\n type UploadRef,\n} from \"@liberfi.io/ui\";\nimport { LaunchpadCreateStatusView } from \"./create-status.view\";\nimport { useLaunchpadUiPorts } from \"./ports\";\n\nexport type LaunchPadCreateFormValues = {\n name: string;\n ticker: string;\n image: string;\n description: string;\n website: string;\n twitter: string;\n telegram: string;\n supply: number;\n raised: number;\n sold: number;\n locked: number;\n shareFee: boolean;\n};\n\nconst DEFAULT_VALUES: LaunchPadCreateFormValues = {\n name: \"\",\n ticker: \"\",\n image: \"\",\n description: \"\",\n website: \"\",\n twitter: \"\",\n telegram: \"\",\n supply: 1e9,\n raised: 85,\n sold: 51,\n locked: 0,\n shareFee: false,\n};\n\nexport function LaunchPadCreateForm({\n platform,\n suggestedImage,\n suggestedName,\n suggestedSymbol,\n className,\n onPreviewChange,\n}: {\n platform: LaunchPadPlatform;\n suggestedImage?: string;\n suggestedName?: string;\n suggestedSymbol?: string;\n className?: string;\n onPreviewChange?: (values: LaunchPadCreateFormValues) => void;\n}) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [values, setValues] = useState<LaunchPadCreateFormValues>(DEFAULT_VALUES);\n const [errors, setErrors] = useState<Partial<Record<keyof LaunchPadCreateFormValues, string>>>({});\n const [snapshot, setSnapshot] = useState<LaunchpadCreateSnapshot>({ status: \"idle\" });\n const [uploading, setUploading] = useState(false);\n const uploaderRef = useRef<UploadRef>(null);\n const isRaydium = platform === LaunchPadPlatform.RAYDIUM;\n const view = LaunchpadCreateStatusView(snapshot.status);\n\n useEffect(() => {\n setValues((current) => ({\n ...current,\n name: suggestedName || current.name,\n ticker: suggestedSymbol || current.ticker,\n image: suggestedImage || current.image,\n }));\n }, [suggestedImage, suggestedName, suggestedSymbol]);\n\n useEffect(() => {\n onPreviewChange?.(values);\n }, [onPreviewChange, values]);\n\n const disabled = useMemo(\n () =>\n !values.name.trim() ||\n !values.ticker.trim() ||\n !values.image.trim() ||\n !view.canSubmit ||\n uploading,\n [uploading, values.image, values.name, values.ticker, view.canSubmit],\n );\n\n const setField = <K extends keyof LaunchPadCreateFormValues>(\n key: K,\n value: LaunchPadCreateFormValues[K],\n ) => {\n setValues((current) => ({ ...current, [key]: value }));\n setErrors((current) => ({ ...current, [key]: undefined }));\n };\n\n const validate = (): boolean => {\n const next: Partial<Record<keyof LaunchPadCreateFormValues, string>> = {};\n if (!values.name.trim()) next.name = t(\"extend.launchpad.error_name_required\");\n else if (values.name.length > 24) next.name = t(\"extend.launchpad.error_name_length\");\n if (!values.ticker.trim()) next.ticker = t(\"extend.launchpad.error_ticker_required\");\n else if (values.ticker.length > 10) next.ticker = t(\"extend.launchpad.error_ticker_length\");\n if (!values.image.trim()) next.image = t(\"extend.launchpad.error_image_required\");\n if (isRaydium) {\n if (Number.isNaN(values.raised) || values.raised < 30) {\n next.raised = t(\"extend.launchpad.error_raised_min\");\n }\n if (values.sold < 51 || values.sold > 80) next.sold = t(\"extend.launchpad.error_sold_min\");\n if (values.locked < 0 || values.locked > 30) next.locked = t(\"extend.launchpad.error_locked_max\");\n if (values.sold + values.locked > 80) next.sold = t(\"extend.launchpad.error_locked_sum_by_sold\");\n }\n setErrors(next);\n return Object.keys(next).length === 0;\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event) => {\n event.preventDefault();\n if (!validate()) return;\n void ports.requireAuth(async () => {\n const runtime = ports.createRuntime(setSnapshot);\n const result = await runtime.submit({\n chain: ports.chain,\n name: values.name.trim(),\n symbol: values.ticker.trim(),\n platform,\n imageUri: values.image,\n description: values.description || undefined,\n website: values.website || undefined,\n twitter: values.twitter || undefined,\n telegram: values.telegram || undefined,\n });\n if (result.status === \"succeeded\") {\n ports.onCreated?.(result);\n setValues(DEFAULT_VALUES);\n toast.success(t(\"extend.launchpad.mint_transaction_submitted\"));\n return;\n }\n toast.error(result.error?.message ?? t(\"extend.launchpad.mint_transaction_error\"));\n });\n }}\n >\n <Input\n label={t(\"extend.launchpad.name_label\")}\n value={values.name}\n isInvalid={!!errors.name}\n errorMessage={errors.name}\n onValueChange={(value) => setField(\"name\", value)}\n />\n <Input\n label={t(\"extend.launchpad.ticker_label\")}\n value={values.ticker}\n isInvalid={!!errors.ticker}\n errorMessage={errors.ticker}\n onValueChange={(value) => setField(\"ticker\", value)}\n />\n <div className=\"space-y-1.5\">\n <h3 className={cn(\"text-sm\", errors.image && \"text-danger\")}>\n {t(\"extend.launchpad.image_label\")}\n </h3>\n <Upload\n ref={uploaderRef}\n accept={{ \"image/jpeg\": [\".jpg\", \".jpeg\"], \"image/png\": [\".png\"], \"image/webp\": [\".webp\"] }}\n maxFiles={1}\n maxSize={10 * 1024 * 1024}\n noClick\n noKeyboard\n onDropAccepted={(files) => {\n const file = files[0];\n if (!file) return;\n setUploading(true);\n void ports\n .uploadImage(file)\n .then((url) => setField(\"image\", url))\n .catch((error: unknown) => {\n toast.error(\n error instanceof Error ? error.message : t(\"extend.launchpad.error_image_upload\"),\n );\n })\n .finally(() => setUploading(false));\n }}\n >\n <button\n type=\"button\"\n className=\"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden\"\n onClick={() => uploaderRef.current?.open()}\n >\n {values.image ? (\n <Image src={values.image} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <ImageGalleryIcon width={24} height={24} className=\"text-neutral\" />\n )}\n </button>\n </Upload>\n {errors.image ? <p className=\"text-xs text-danger\">{errors.image}</p> : null}\n </div>\n <Textarea\n label={t(\"extend.launchpad.description_label\")}\n placeholder={t(\"extend.launchpad.description_placeholder\")}\n value={values.description}\n onValueChange={(value) => setField(\"description\", value)}\n />\n <Input\n label={t(\"extend.launchpad.website_label\")}\n value={values.website}\n onValueChange={(value) => setField(\"website\", value)}\n />\n <Input\n label={t(\"extend.launchpad.twitter_label\")}\n value={values.twitter}\n onValueChange={(value) => setField(\"twitter\", value)}\n />\n <Input\n label={t(\"extend.launchpad.telegram_label\")}\n value={values.telegram}\n onValueChange={(value) => setField(\"telegram\", value)}\n />\n {isRaydium ? (\n <div className=\"grid grid-cols-2 gap-3\">\n <NumberInput\n label={t(\"extend.launchpad.supply_label\")}\n value={values.supply}\n onValueChange={(value) => setField(\"supply\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.raised_label\")}\n value={values.raised}\n isInvalid={!!errors.raised}\n errorMessage={errors.raised}\n onValueChange={(value) => setField(\"raised\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.sold_label\")}\n value={values.sold}\n isInvalid={!!errors.sold}\n errorMessage={errors.sold}\n onValueChange={(value) => setField(\"sold\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.locked_label\")}\n value={values.locked}\n isInvalid={!!errors.locked}\n errorMessage={errors.locked}\n onValueChange={(value) => setField(\"locked\", Number(value ?? 0))}\n />\n <div className=\"col-span-2 flex items-center justify-between\">\n <span className=\"text-sm\">{t(\"extend.launchpad.share_fee_label\")}</span>\n <Switch\n isSelected={values.shareFee}\n onValueChange={(value) => setField(\"shareFee\", value)}\n />\n </div>\n </div>\n ) : null}\n <Button type=\"submit\" color=\"primary\" isDisabled={disabled} isLoading={!view.canSubmit}>\n {t(\"extend.launchpad.submit\")}\n </Button>\n </form>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Curve, CurveType, LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\n\nconst NEW_TOKEN_DECIMALS = 6;\nconst SOL_TOKEN_DECIMALS = 9;\nconst PUMP_SUPPLY = \"1000000000000000\";\nconst PUMP_SOLD = \"793100000000000\";\nconst PUMP_RAISED = \"35000000000\";\nconst PUMP_MIGRATE_FEE = \"20000000\";\n\nexport function LaunchPadCurvePreview({\n platform,\n supply = 1e9,\n raised = 35,\n soldPercent = 79.31,\n}: {\n platform: LaunchPadPlatform;\n supply?: number;\n raised?: number;\n soldPercent?: number;\n}) {\n const { t } = useTranslation();\n const points = useMemo(() => {\n const isPump = platform === LaunchPadPlatform.PUMPFUN;\n const supplyValue = isPump\n ? PUMP_SUPPLY\n : String(Math.round(supply * 10 ** NEW_TOKEN_DECIMALS));\n const soldValue = isPump\n ? PUMP_SOLD\n : String(Math.round(supply * (soldPercent / 100) * 10 ** NEW_TOKEN_DECIMALS));\n const raisedValue = isPump\n ? PUMP_RAISED\n : String(Math.round(raised * 10 ** SOL_TOKEN_DECIMALS));\n try {\n return Curve.getPoolCurvePointByInit({\n curveType: CurveType.CONSTANT_PRODUCT,\n supply: supplyValue,\n totalSell: soldValue,\n totalLockedAmount: 0,\n totalFundRaising: raisedValue,\n migrateFee: PUMP_MIGRATE_FEE,\n decimalA: NEW_TOKEN_DECIMALS,\n decimalB: SOL_TOKEN_DECIMALS,\n pointCount: 24,\n });\n } catch {\n return [];\n }\n }, [platform, raised, soldPercent, supply]);\n\n const path = useMemo(() => {\n if (points.length === 0) return \"\";\n const xs = points.map((point) => Number(point.totalSellSupply));\n const ys = points.map((point) => Number(point.price));\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs) || 1;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys) || 1;\n return points\n .map((point, index) => {\n const x = ((Number(point.totalSellSupply) - minX) / (maxX - minX || 1)) * 320;\n const y = 120 - ((Number(point.price) - minY) / (maxY - minY || 1)) * 100;\n return `${index === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [points]);\n\n return (\n <div className=\"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden\">\n <h2 className=\"text-sm font-medium\">{t(\"extend.launchpad.curve_preview\")}</h2>\n <svg viewBox=\"0 0 320 140\" className=\"w-full h-40\" role=\"img\" aria-label={t(\"extend.launchpad.curve_preview\")}>\n <path d={path} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"text-primary\" />\n </svg>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Textarea } from \"@liberfi.io/ui\";\nimport { useLaunchpadUiPorts, type GeneratedMemeInfo } from \"./ports\";\n\nexport type MagicLaunchProps = {\n prompt?: string;\n onGenerate?: (result: GeneratedMemeInfo) => void;\n};\n\nexport function MagicLaunch({ prompt = \"\", onGenerate }: MagicLaunchProps) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [value, setValue] = useState(prompt);\n const [pending, setPending] = useState(false);\n const tooLong = value.length > 300;\n const canGenerate = value.length > 0 && !tooLong && !!ports.generateMeme && !pending;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center\">\n <span\n className=\"font-semibold text-sm\"\n style={{\n backgroundImage: \"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {t(\"extend.launchpad.magic_launch\")}\n </span>\n <span className={cn(\"text-xs\", tooLong ? \"text-danger\" : \"text-neutral\")}>\n {value.length}/300\n </span>\n </div>\n <Textarea\n minRows={2}\n value={value}\n onValueChange={setValue}\n placeholder={t(\"extend.launchpad.magic_launch_explained\")}\n />\n <Button\n color=\"primary\"\n isDisabled={!canGenerate}\n isLoading={pending}\n onPress={() => {\n void ports.requireAuth(async () => {\n if (!ports.generateMeme) return;\n setPending(true);\n try {\n const result = await ports.generateMeme(value);\n onGenerate?.(result);\n } finally {\n setPending(false);\n }\n });\n }}\n >\n {t(\"extend.launchpad.magic_launch_submit\")}\n </Button>\n </div>\n );\n}\n","import { useCallback, useState, type Key } from \"react\";\nimport { Image, Tab, Tabs, cn } from \"@liberfi.io/ui\";\nimport { LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\nimport { LaunchPadCreateForm, type LaunchPadCreateFormValues } from \"./LaunchPadCreateForm\";\nimport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nimport { MagicLaunch } from \"./MagicLaunch\";\nimport type { GeneratedMemeInfo } from \"./ports\";\n\nconst PLATFORMS = [\n { platform: LaunchPadPlatform.PUMPFUN, name: \"Pump\", icon: \"/images/launchpad/pumpfun.svg\" },\n { platform: LaunchPadPlatform.RAYDIUM, name: \"Raydium\", icon: \"/images/launchpad/raydium.svg\" },\n] as const;\n\nexport interface LaunchPadHomeProps {\n prompt?: string;\n image?: string;\n}\n\nexport function LaunchPadHome({ prompt, image }: LaunchPadHomeProps) {\n const [platform, setPlatform] = useState<LaunchPadPlatform>(LaunchPadPlatform.PUMPFUN);\n const [suggestedImage, setSuggestedImage] = useState<string | undefined>(image);\n const [suggestedName, setSuggestedName] = useState<string | undefined>(undefined);\n const [suggestedSymbol, setSuggestedSymbol] = useState<string | undefined>(undefined);\n const [preview, setPreview] = useState<LaunchPadCreateFormValues | null>(null);\n\n const onGenerate = useCallback((result: GeneratedMemeInfo) => {\n setSuggestedImage(result.image);\n setSuggestedName(result.name);\n setSuggestedSymbol(result.symbol);\n }, []);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <MagicLaunch prompt={prompt} onGenerate={onGenerate} />\n <div className=\"flex-1 flex items-start justify-center gap-4\">\n <div className={cn(\"h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2\")}>\n <Tabs\n fullWidth\n selectedKey={platform}\n onSelectionChange={(key: Key) => setPlatform(String(key) as LaunchPadPlatform)}\n disableAnimation\n >\n {PLATFORMS.map((item) => (\n <Tab\n key={item.platform}\n title={\n <div className=\"flex items-center gap-2\">\n <Image src={item.icon} alt={item.name} width={20} height={20} />\n <span>{item.name}</span>\n </div>\n }\n />\n ))}\n </Tabs>\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.PUMPFUN}\n className={cn({ hidden: platform !== LaunchPadPlatform.PUMPFUN })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.RAYDIUM}\n className={cn({ hidden: platform !== LaunchPadPlatform.RAYDIUM })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n </div>\n <LaunchPadCurvePreview\n platform={platform}\n supply={preview?.supply}\n raised={preview?.raised}\n soldPercent={preview?.sold}\n />\n </div>\n </div>\n );\n}\n","export const PACKAGE_NAME = \"@liberfi.io/ui-launchpad\" as const;\n\nexport function LaunchpadReadyWidget() {\n return PACKAGE_NAME;\n}\n\nexport { LaunchpadCreateStatusView } from \"./create-status.view\";\nexport { LaunchPadHome, type LaunchPadHomeProps } from \"./LaunchPadHome\";\nexport { LaunchPadCreateForm } from \"./LaunchPadCreateForm\";\nexport { MagicLaunch, type MagicLaunchProps } from \"./MagicLaunch\";\nexport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nexport {\n LaunchpadUiProvider,\n useLaunchpadUiPorts,\n createInMemoryLaunchpadUiPorts,\n type LaunchpadUiPorts,\n type GeneratedMemeInfo,\n} from \"./ports\";\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,3 @@
1
+ import {createContext,createElement,useContext,useState,useRef,useEffect,useMemo,useCallback}from'react';import {cn,Input,Upload,Image,ImageGalleryIcon,toast,Textarea,NumberInput,Switch,Button,Tabs,Tab}from'@liberfi.io/ui';import {LaunchPadPlatform,createInMemoryLaunchpadPorts,createLaunchpadCreateRuntime,Curve,CurveType}from'@liberfi.io/react-launchpad';import {useTranslation}from'@liberfi.io/i18n';import {Chain}from'@liberfi.io/types';import {jsxs,jsx}from'react/jsx-runtime';function V(n){return {status:n,canSubmit:n!=="signing"&&n!=="submitting"&&n!=="uploading"&&n!=="succeeded"}}var W=createContext(null);function re({ports:n,children:d}){return createElement(W.Provider,{value:n},d)}function L(){let n=useContext(W);if(!n)throw new Error("useLaunchpadUiPorts must be used within LaunchpadUiProvider");return n}function oe(n={}){let d=createInMemoryLaunchpadPorts({signError:n.signError,uploadError:n.uploadError});return {chain:n.chain??Chain.SOLANA,requireAuth:async o=>{await o();},uploadImage:async o=>{if(n.uploadError)throw n.uploadError;return "https://ipfs.io/ipfs/memory-image"},generateMeme:n.generateMeme,createRuntime:o=>createLaunchpadCreateRuntime({...d,onChange:o})}}var j={name:"",ticker:"",image:"",description:"",website:"",twitter:"",telegram:"",supply:1e9,raised:85,sold:51,locked:0,shareFee:false};function U({platform:n,suggestedImage:d,suggestedName:o,suggestedSymbol:c,className:u,onPreviewChange:m}){let{t}=useTranslation(),l=L(),[e,p]=useState(j),[r,f]=useState({}),[b,i]=useState({status:"idle"}),[_,M]=useState(false),N=useRef(null),B=n===LaunchPadPlatform.RAYDIUM,F=V(b.status);useEffect(()=>{p(a=>({...a,name:o||a.name,ticker:c||a.ticker,image:d||a.image}));},[d,o,c]),useEffect(()=>{m?.(e);},[m,e]);let z=useMemo(()=>!e.name.trim()||!e.ticker.trim()||!e.image.trim()||!F.canSubmit||_,[_,e.image,e.name,e.ticker,F.canSubmit]),g=(a,v)=>{p(h=>({...h,[a]:v})),f(h=>({...h,[a]:void 0}));},J=()=>{let a={};return e.name.trim()?e.name.length>24&&(a.name=t("extend.launchpad.error_name_length")):a.name=t("extend.launchpad.error_name_required"),e.ticker.trim()?e.ticker.length>10&&(a.ticker=t("extend.launchpad.error_ticker_length")):a.ticker=t("extend.launchpad.error_ticker_required"),e.image.trim()||(a.image=t("extend.launchpad.error_image_required")),B&&((Number.isNaN(e.raised)||e.raised<30)&&(a.raised=t("extend.launchpad.error_raised_min")),(e.sold<51||e.sold>80)&&(a.sold=t("extend.launchpad.error_sold_min")),(e.locked<0||e.locked>30)&&(a.locked=t("extend.launchpad.error_locked_max")),e.sold+e.locked>80&&(a.sold=t("extend.launchpad.error_locked_sum_by_sold"))),f(a),Object.keys(a).length===0};return jsxs("form",{className:cn("flex flex-col gap-4",u),onSubmit:a=>{a.preventDefault(),J()&&l.requireAuth(async()=>{let h=await l.createRuntime(i).submit({chain:l.chain,name:e.name.trim(),symbol:e.ticker.trim(),platform:n,imageUri:e.image,description:e.description||void 0,website:e.website||void 0,twitter:e.twitter||void 0,telegram:e.telegram||void 0});if(h.status==="succeeded"){l.onCreated?.(h),p(j),toast.success(t("extend.launchpad.mint_transaction_submitted"));return}toast.error(h.error?.message??t("extend.launchpad.mint_transaction_error"));});},children:[jsx(Input,{label:t("extend.launchpad.name_label"),value:e.name,isInvalid:!!r.name,errorMessage:r.name,onValueChange:a=>g("name",a)}),jsx(Input,{label:t("extend.launchpad.ticker_label"),value:e.ticker,isInvalid:!!r.ticker,errorMessage:r.ticker,onValueChange:a=>g("ticker",a)}),jsxs("div",{className:"space-y-1.5",children:[jsx("h3",{className:cn("text-sm",r.image&&"text-danger"),children:t("extend.launchpad.image_label")}),jsx(Upload,{ref:N,accept:{"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"],"image/webp":[".webp"]},maxFiles:1,maxSize:10*1024*1024,noClick:true,noKeyboard:true,onDropAccepted:a=>{let v=a[0];v&&(M(true),l.uploadImage(v).then(h=>g("image",h)).catch(h=>{toast.error(h instanceof Error?h.message:t("extend.launchpad.error_image_upload"));}).finally(()=>M(false)));},children:jsx("button",{type:"button",className:"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden",onClick:()=>N.current?.open(),children:e.image?jsx(Image,{src:e.image,alt:"",className:"h-full w-full object-cover"}):jsx(ImageGalleryIcon,{width:24,height:24,className:"text-neutral"})})}),r.image?jsx("p",{className:"text-xs text-danger",children:r.image}):null]}),jsx(Textarea,{label:t("extend.launchpad.description_label"),placeholder:t("extend.launchpad.description_placeholder"),value:e.description,onValueChange:a=>g("description",a)}),jsx(Input,{label:t("extend.launchpad.website_label"),value:e.website,onValueChange:a=>g("website",a)}),jsx(Input,{label:t("extend.launchpad.twitter_label"),value:e.twitter,onValueChange:a=>g("twitter",a)}),jsx(Input,{label:t("extend.launchpad.telegram_label"),value:e.telegram,onValueChange:a=>g("telegram",a)}),B?jsxs("div",{className:"grid grid-cols-2 gap-3",children:[jsx(NumberInput,{label:t("extend.launchpad.supply_label"),value:e.supply,onValueChange:a=>g("supply",Number(a??0))}),jsx(NumberInput,{label:t("extend.launchpad.raised_label"),value:e.raised,isInvalid:!!r.raised,errorMessage:r.raised,onValueChange:a=>g("raised",Number(a??0))}),jsx(NumberInput,{label:t("extend.launchpad.sold_label"),value:e.sold,isInvalid:!!r.sold,errorMessage:r.sold,onValueChange:a=>g("sold",Number(a??0))}),jsx(NumberInput,{label:t("extend.launchpad.locked_label"),value:e.locked,isInvalid:!!r.locked,errorMessage:r.locked,onValueChange:a=>g("locked",Number(a??0))}),jsxs("div",{className:"col-span-2 flex items-center justify-between",children:[jsx("span",{className:"text-sm",children:t("extend.launchpad.share_fee_label")}),jsx(Switch,{isSelected:e.shareFee,onValueChange:a=>g("shareFee",a)})]})]}):null,jsx(Button,{type:"submit",color:"primary",isDisabled:z,isLoading:!F.canSubmit,children:t("extend.launchpad.submit")})]})}var A=6,$=9,ve="1000000000000000",Le="793100000000000",ye="35000000000",Ce="20000000";function T({platform:n,supply:d=1e9,raised:o=35,soldPercent:c=79.31}){let{t:u}=useTranslation(),m=useMemo(()=>{let l=n===LaunchPadPlatform.PUMPFUN,e=l?ve:String(Math.round(d*10**A)),p=l?Le:String(Math.round(d*(c/100)*10**A)),r=l?ye:String(Math.round(o*10**$));try{return Curve.getPoolCurvePointByInit({curveType:CurveType.CONSTANT_PRODUCT,supply:e,totalSell:p,totalLockedAmount:0,totalFundRaising:r,migrateFee:Ce,decimalA:A,decimalB:$,pointCount:24})}catch{return []}},[n,o,c,d]),t=useMemo(()=>{if(m.length===0)return "";let l=m.map(i=>Number(i.totalSellSupply)),e=m.map(i=>Number(i.price)),p=Math.min(...l),r=Math.max(...l)||1,f=Math.min(...e),b=Math.max(...e)||1;return m.map((i,_)=>{let M=(Number(i.totalSellSupply)-p)/(r-p||1)*320,N=120-(Number(i.price)-f)/(b-f||1)*100;return `${_===0?"M":"L"}${M.toFixed(1)},${N.toFixed(1)}`}).join(" ")},[m]);return jsxs("div",{className:"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden",children:[jsx("h2",{className:"text-sm font-medium",children:u("extend.launchpad.curve_preview")}),jsx("svg",{viewBox:"0 0 320 140",className:"w-full h-40",role:"img","aria-label":u("extend.launchpad.curve_preview"),children:jsx("path",{d:t,fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-primary"})})]})}function K({prompt:n="",onGenerate:d}){let{t:o}=useTranslation(),c=L(),[u,m]=useState(n),[t,l]=useState(false),e=u.length>300,p=u.length>0&&!e&&!!c.generateMeme&&!t;return jsxs("div",{className:"flex flex-col gap-2",children:[jsxs("div",{className:"flex justify-between items-center",children:[jsx("span",{className:"font-semibold text-sm",style:{backgroundImage:"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:o("extend.launchpad.magic_launch")}),jsxs("span",{className:cn("text-xs",e?"text-danger":"text-neutral"),children:[u.length,"/300"]})]}),jsx(Textarea,{minRows:2,value:u,onValueChange:m,placeholder:o("extend.launchpad.magic_launch_explained")}),jsx(Button,{color:"primary",isDisabled:!p,isLoading:t,onPress:()=>{c.requireAuth(async()=>{if(c.generateMeme){l(true);try{let r=await c.generateMeme(u);d?.(r);}finally{l(false);}}});},children:o("extend.launchpad.magic_launch_submit")})]})}var Ve=[{platform:LaunchPadPlatform.PUMPFUN,name:"Pump",icon:"/images/launchpad/pumpfun.svg"},{platform:LaunchPadPlatform.RAYDIUM,name:"Raydium",icon:"/images/launchpad/raydium.svg"}];function Ee({prompt:n,image:d}){let[o,c]=useState(LaunchPadPlatform.PUMPFUN),[u,m]=useState(d),[t,l]=useState(void 0),[e,p]=useState(void 0),[r,f]=useState(null),b=useCallback(i=>{m(i.image),l(i.name),p(i.symbol);},[]);return jsxs("div",{className:"flex flex-col gap-4",children:[jsx(K,{prompt:n,onGenerate:b}),jsxs("div",{className:"flex-1 flex items-start justify-center gap-4",children:[jsxs("div",{className:cn("h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2"),children:[jsx(Tabs,{fullWidth:true,selectedKey:o,onSelectionChange:i=>c(String(i)),disableAnimation:true,children:Ve.map(i=>jsx(Tab,{title:jsxs("div",{className:"flex items-center gap-2",children:[jsx(Image,{src:i.icon,alt:i.name,width:20,height:20}),jsx("span",{children:i.name})]})},i.platform))}),jsx(U,{platform:LaunchPadPlatform.PUMPFUN,className:cn({hidden:o!==LaunchPadPlatform.PUMPFUN}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f}),jsx(U,{platform:LaunchPadPlatform.RAYDIUM,className:cn({hidden:o!==LaunchPadPlatform.RAYDIUM}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f})]}),jsx(T,{platform:o,supply:r?.supply,raised:r?.raised,soldPercent:r?.sold})]})]})}var Ae="@liberfi.io/ui-launchpad";function ga(){return Ae}
2
+ export{U as LaunchPadCreateForm,T as LaunchPadCurvePreview,Ee as LaunchPadHome,V as LaunchpadCreateStatusView,ga as LaunchpadReadyWidget,re as LaunchpadUiProvider,K as MagicLaunch,Ae as PACKAGE_NAME,oe as createInMemoryLaunchpadUiPorts,L as useLaunchpadUiPorts};//# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/create-status.view.ts","../src/ports.tsx","../src/LaunchPadCreateForm.tsx","../src/LaunchPadCurvePreview.tsx","../src/MagicLaunch.tsx","../src/LaunchPadHome.tsx","../src/index.ts"],"names":["LaunchpadCreateStatusView","status","LaunchpadUiPortsContext","createContext","LaunchpadUiProvider","ports","children","createElement","useLaunchpadUiPorts","useContext","createInMemoryLaunchpadUiPorts","options","memory","createInMemoryLaunchpadPorts","Chain","action","file","onChange","createLaunchpadCreateRuntime","DEFAULT_VALUES","LaunchPadCreateForm","platform","suggestedImage","suggestedName","suggestedSymbol","className","onPreviewChange","useTranslation","values","setValues","useState","errors","setErrors","snapshot","setSnapshot","uploading","setUploading","uploaderRef","useRef","isRaydium","LaunchPadPlatform","view","useEffect","current","disabled","useMemo","setField","key","value","validate","next","jsxs","cn","event","result","toast","jsx","Input","Upload","files","url","error","Image","ImageGalleryIcon","Textarea","NumberInput","Switch","Button","NEW_TOKEN_DECIMALS","SOL_TOKEN_DECIMALS","PUMP_SUPPLY","PUMP_SOLD","PUMP_RAISED","PUMP_MIGRATE_FEE","LaunchPadCurvePreview","supply","raised","soldPercent","t","points","isPump","supplyValue","soldValue","raisedValue","Curve","CurveType","path","xs","point","ys","minX","maxX","minY","maxY","index","x","y","MagicLaunch","prompt","onGenerate","setValue","pending","setPending","tooLong","canGenerate","PLATFORMS","LaunchPadHome","image","setPlatform","setSuggestedImage","setSuggestedName","setSuggestedSymbol","preview","setPreview","useCallback","Tabs","item","Tab","PACKAGE_NAME","LaunchpadReadyWidget"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { LaunchpadCreateStatus } from \"@liberfi.io/react-launchpad\";\n\nexport function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {\n status: LaunchpadCreateStatus;\n canSubmit: boolean;\n} {\n return {\n status,\n canSubmit:\n status !== \"signing\" &&\n status !== \"submitting\" &&\n status !== \"uploading\" &&\n status !== \"succeeded\",\n };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type PropsWithChildren,\n} from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n createInMemoryLaunchpadPorts,\n createLaunchpadCreateRuntime,\n type LaunchpadCreateRuntime,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\n\nexport type GeneratedMemeInfo = {\n symbol: string;\n name?: string;\n image?: string;\n};\n\nexport type LaunchpadUiPorts = {\n chain: Chain;\n requireAuth: (action: () => Promise<void>) => Promise<void>;\n uploadImage: (file: File) => Promise<string>;\n createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;\n generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;\n onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;\n};\n\nconst LaunchpadUiPortsContext = createContext<LaunchpadUiPorts | null>(null);\n\nexport function LaunchpadUiProvider({\n ports,\n children,\n}: PropsWithChildren<{ ports: LaunchpadUiPorts }>) {\n return createElement(LaunchpadUiPortsContext.Provider, { value: ports }, children);\n}\n\nexport function useLaunchpadUiPorts(): LaunchpadUiPorts {\n const ports = useContext(LaunchpadUiPortsContext);\n if (!ports) {\n throw new Error(\"useLaunchpadUiPorts must be used within LaunchpadUiProvider\");\n }\n return ports;\n}\n\nexport function createInMemoryLaunchpadUiPorts(\n options: {\n chain?: Chain;\n generateMeme?: LaunchpadUiPorts[\"generateMeme\"];\n signError?: Error;\n uploadError?: Error;\n } = {},\n): LaunchpadUiPorts {\n const memory = createInMemoryLaunchpadPorts({\n signError: options.signError,\n uploadError: options.uploadError,\n });\n return {\n chain: options.chain ?? Chain.SOLANA,\n requireAuth: async (action) => {\n await action();\n },\n uploadImage: async (file) => {\n void file;\n if (options.uploadError) throw options.uploadError;\n return \"https://ipfs.io/ipfs/memory-image\";\n },\n generateMeme: options.generateMeme,\n createRuntime: (onChange) =>\n createLaunchpadCreateRuntime({\n ...memory,\n onChange,\n }),\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n LaunchPadPlatform,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\nimport {\n Button,\n cn,\n Image,\n ImageGalleryIcon,\n Input,\n NumberInput,\n Switch,\n Textarea,\n toast,\n Upload,\n type UploadRef,\n} from \"@liberfi.io/ui\";\nimport { LaunchpadCreateStatusView } from \"./create-status.view\";\nimport { useLaunchpadUiPorts } from \"./ports\";\n\nexport type LaunchPadCreateFormValues = {\n name: string;\n ticker: string;\n image: string;\n description: string;\n website: string;\n twitter: string;\n telegram: string;\n supply: number;\n raised: number;\n sold: number;\n locked: number;\n shareFee: boolean;\n};\n\nconst DEFAULT_VALUES: LaunchPadCreateFormValues = {\n name: \"\",\n ticker: \"\",\n image: \"\",\n description: \"\",\n website: \"\",\n twitter: \"\",\n telegram: \"\",\n supply: 1e9,\n raised: 85,\n sold: 51,\n locked: 0,\n shareFee: false,\n};\n\nexport function LaunchPadCreateForm({\n platform,\n suggestedImage,\n suggestedName,\n suggestedSymbol,\n className,\n onPreviewChange,\n}: {\n platform: LaunchPadPlatform;\n suggestedImage?: string;\n suggestedName?: string;\n suggestedSymbol?: string;\n className?: string;\n onPreviewChange?: (values: LaunchPadCreateFormValues) => void;\n}) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [values, setValues] = useState<LaunchPadCreateFormValues>(DEFAULT_VALUES);\n const [errors, setErrors] = useState<Partial<Record<keyof LaunchPadCreateFormValues, string>>>({});\n const [snapshot, setSnapshot] = useState<LaunchpadCreateSnapshot>({ status: \"idle\" });\n const [uploading, setUploading] = useState(false);\n const uploaderRef = useRef<UploadRef>(null);\n const isRaydium = platform === LaunchPadPlatform.RAYDIUM;\n const view = LaunchpadCreateStatusView(snapshot.status);\n\n useEffect(() => {\n setValues((current) => ({\n ...current,\n name: suggestedName || current.name,\n ticker: suggestedSymbol || current.ticker,\n image: suggestedImage || current.image,\n }));\n }, [suggestedImage, suggestedName, suggestedSymbol]);\n\n useEffect(() => {\n onPreviewChange?.(values);\n }, [onPreviewChange, values]);\n\n const disabled = useMemo(\n () =>\n !values.name.trim() ||\n !values.ticker.trim() ||\n !values.image.trim() ||\n !view.canSubmit ||\n uploading,\n [uploading, values.image, values.name, values.ticker, view.canSubmit],\n );\n\n const setField = <K extends keyof LaunchPadCreateFormValues>(\n key: K,\n value: LaunchPadCreateFormValues[K],\n ) => {\n setValues((current) => ({ ...current, [key]: value }));\n setErrors((current) => ({ ...current, [key]: undefined }));\n };\n\n const validate = (): boolean => {\n const next: Partial<Record<keyof LaunchPadCreateFormValues, string>> = {};\n if (!values.name.trim()) next.name = t(\"extend.launchpad.error_name_required\");\n else if (values.name.length > 24) next.name = t(\"extend.launchpad.error_name_length\");\n if (!values.ticker.trim()) next.ticker = t(\"extend.launchpad.error_ticker_required\");\n else if (values.ticker.length > 10) next.ticker = t(\"extend.launchpad.error_ticker_length\");\n if (!values.image.trim()) next.image = t(\"extend.launchpad.error_image_required\");\n if (isRaydium) {\n if (Number.isNaN(values.raised) || values.raised < 30) {\n next.raised = t(\"extend.launchpad.error_raised_min\");\n }\n if (values.sold < 51 || values.sold > 80) next.sold = t(\"extend.launchpad.error_sold_min\");\n if (values.locked < 0 || values.locked > 30) next.locked = t(\"extend.launchpad.error_locked_max\");\n if (values.sold + values.locked > 80) next.sold = t(\"extend.launchpad.error_locked_sum_by_sold\");\n }\n setErrors(next);\n return Object.keys(next).length === 0;\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event) => {\n event.preventDefault();\n if (!validate()) return;\n void ports.requireAuth(async () => {\n const runtime = ports.createRuntime(setSnapshot);\n const result = await runtime.submit({\n chain: ports.chain,\n name: values.name.trim(),\n symbol: values.ticker.trim(),\n platform,\n imageUri: values.image,\n description: values.description || undefined,\n website: values.website || undefined,\n twitter: values.twitter || undefined,\n telegram: values.telegram || undefined,\n });\n if (result.status === \"succeeded\") {\n ports.onCreated?.(result);\n setValues(DEFAULT_VALUES);\n toast.success(t(\"extend.launchpad.mint_transaction_submitted\"));\n return;\n }\n toast.error(result.error?.message ?? t(\"extend.launchpad.mint_transaction_error\"));\n });\n }}\n >\n <Input\n label={t(\"extend.launchpad.name_label\")}\n value={values.name}\n isInvalid={!!errors.name}\n errorMessage={errors.name}\n onValueChange={(value) => setField(\"name\", value)}\n />\n <Input\n label={t(\"extend.launchpad.ticker_label\")}\n value={values.ticker}\n isInvalid={!!errors.ticker}\n errorMessage={errors.ticker}\n onValueChange={(value) => setField(\"ticker\", value)}\n />\n <div className=\"space-y-1.5\">\n <h3 className={cn(\"text-sm\", errors.image && \"text-danger\")}>\n {t(\"extend.launchpad.image_label\")}\n </h3>\n <Upload\n ref={uploaderRef}\n accept={{ \"image/jpeg\": [\".jpg\", \".jpeg\"], \"image/png\": [\".png\"], \"image/webp\": [\".webp\"] }}\n maxFiles={1}\n maxSize={10 * 1024 * 1024}\n noClick\n noKeyboard\n onDropAccepted={(files) => {\n const file = files[0];\n if (!file) return;\n setUploading(true);\n void ports\n .uploadImage(file)\n .then((url) => setField(\"image\", url))\n .catch((error: unknown) => {\n toast.error(\n error instanceof Error ? error.message : t(\"extend.launchpad.error_image_upload\"),\n );\n })\n .finally(() => setUploading(false));\n }}\n >\n <button\n type=\"button\"\n className=\"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden\"\n onClick={() => uploaderRef.current?.open()}\n >\n {values.image ? (\n <Image src={values.image} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <ImageGalleryIcon width={24} height={24} className=\"text-neutral\" />\n )}\n </button>\n </Upload>\n {errors.image ? <p className=\"text-xs text-danger\">{errors.image}</p> : null}\n </div>\n <Textarea\n label={t(\"extend.launchpad.description_label\")}\n placeholder={t(\"extend.launchpad.description_placeholder\")}\n value={values.description}\n onValueChange={(value) => setField(\"description\", value)}\n />\n <Input\n label={t(\"extend.launchpad.website_label\")}\n value={values.website}\n onValueChange={(value) => setField(\"website\", value)}\n />\n <Input\n label={t(\"extend.launchpad.twitter_label\")}\n value={values.twitter}\n onValueChange={(value) => setField(\"twitter\", value)}\n />\n <Input\n label={t(\"extend.launchpad.telegram_label\")}\n value={values.telegram}\n onValueChange={(value) => setField(\"telegram\", value)}\n />\n {isRaydium ? (\n <div className=\"grid grid-cols-2 gap-3\">\n <NumberInput\n label={t(\"extend.launchpad.supply_label\")}\n value={values.supply}\n onValueChange={(value) => setField(\"supply\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.raised_label\")}\n value={values.raised}\n isInvalid={!!errors.raised}\n errorMessage={errors.raised}\n onValueChange={(value) => setField(\"raised\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.sold_label\")}\n value={values.sold}\n isInvalid={!!errors.sold}\n errorMessage={errors.sold}\n onValueChange={(value) => setField(\"sold\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.locked_label\")}\n value={values.locked}\n isInvalid={!!errors.locked}\n errorMessage={errors.locked}\n onValueChange={(value) => setField(\"locked\", Number(value ?? 0))}\n />\n <div className=\"col-span-2 flex items-center justify-between\">\n <span className=\"text-sm\">{t(\"extend.launchpad.share_fee_label\")}</span>\n <Switch\n isSelected={values.shareFee}\n onValueChange={(value) => setField(\"shareFee\", value)}\n />\n </div>\n </div>\n ) : null}\n <Button type=\"submit\" color=\"primary\" isDisabled={disabled} isLoading={!view.canSubmit}>\n {t(\"extend.launchpad.submit\")}\n </Button>\n </form>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Curve, CurveType, LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\n\nconst NEW_TOKEN_DECIMALS = 6;\nconst SOL_TOKEN_DECIMALS = 9;\nconst PUMP_SUPPLY = \"1000000000000000\";\nconst PUMP_SOLD = \"793100000000000\";\nconst PUMP_RAISED = \"35000000000\";\nconst PUMP_MIGRATE_FEE = \"20000000\";\n\nexport function LaunchPadCurvePreview({\n platform,\n supply = 1e9,\n raised = 35,\n soldPercent = 79.31,\n}: {\n platform: LaunchPadPlatform;\n supply?: number;\n raised?: number;\n soldPercent?: number;\n}) {\n const { t } = useTranslation();\n const points = useMemo(() => {\n const isPump = platform === LaunchPadPlatform.PUMPFUN;\n const supplyValue = isPump\n ? PUMP_SUPPLY\n : String(Math.round(supply * 10 ** NEW_TOKEN_DECIMALS));\n const soldValue = isPump\n ? PUMP_SOLD\n : String(Math.round(supply * (soldPercent / 100) * 10 ** NEW_TOKEN_DECIMALS));\n const raisedValue = isPump\n ? PUMP_RAISED\n : String(Math.round(raised * 10 ** SOL_TOKEN_DECIMALS));\n try {\n return Curve.getPoolCurvePointByInit({\n curveType: CurveType.CONSTANT_PRODUCT,\n supply: supplyValue,\n totalSell: soldValue,\n totalLockedAmount: 0,\n totalFundRaising: raisedValue,\n migrateFee: PUMP_MIGRATE_FEE,\n decimalA: NEW_TOKEN_DECIMALS,\n decimalB: SOL_TOKEN_DECIMALS,\n pointCount: 24,\n });\n } catch {\n return [];\n }\n }, [platform, raised, soldPercent, supply]);\n\n const path = useMemo(() => {\n if (points.length === 0) return \"\";\n const xs = points.map((point) => Number(point.totalSellSupply));\n const ys = points.map((point) => Number(point.price));\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs) || 1;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys) || 1;\n return points\n .map((point, index) => {\n const x = ((Number(point.totalSellSupply) - minX) / (maxX - minX || 1)) * 320;\n const y = 120 - ((Number(point.price) - minY) / (maxY - minY || 1)) * 100;\n return `${index === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [points]);\n\n return (\n <div className=\"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden\">\n <h2 className=\"text-sm font-medium\">{t(\"extend.launchpad.curve_preview\")}</h2>\n <svg viewBox=\"0 0 320 140\" className=\"w-full h-40\" role=\"img\" aria-label={t(\"extend.launchpad.curve_preview\")}>\n <path d={path} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"text-primary\" />\n </svg>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Textarea } from \"@liberfi.io/ui\";\nimport { useLaunchpadUiPorts, type GeneratedMemeInfo } from \"./ports\";\n\nexport type MagicLaunchProps = {\n prompt?: string;\n onGenerate?: (result: GeneratedMemeInfo) => void;\n};\n\nexport function MagicLaunch({ prompt = \"\", onGenerate }: MagicLaunchProps) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [value, setValue] = useState(prompt);\n const [pending, setPending] = useState(false);\n const tooLong = value.length > 300;\n const canGenerate = value.length > 0 && !tooLong && !!ports.generateMeme && !pending;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center\">\n <span\n className=\"font-semibold text-sm\"\n style={{\n backgroundImage: \"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {t(\"extend.launchpad.magic_launch\")}\n </span>\n <span className={cn(\"text-xs\", tooLong ? \"text-danger\" : \"text-neutral\")}>\n {value.length}/300\n </span>\n </div>\n <Textarea\n minRows={2}\n value={value}\n onValueChange={setValue}\n placeholder={t(\"extend.launchpad.magic_launch_explained\")}\n />\n <Button\n color=\"primary\"\n isDisabled={!canGenerate}\n isLoading={pending}\n onPress={() => {\n void ports.requireAuth(async () => {\n if (!ports.generateMeme) return;\n setPending(true);\n try {\n const result = await ports.generateMeme(value);\n onGenerate?.(result);\n } finally {\n setPending(false);\n }\n });\n }}\n >\n {t(\"extend.launchpad.magic_launch_submit\")}\n </Button>\n </div>\n );\n}\n","import { useCallback, useState, type Key } from \"react\";\nimport { Image, Tab, Tabs, cn } from \"@liberfi.io/ui\";\nimport { LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\nimport { LaunchPadCreateForm, type LaunchPadCreateFormValues } from \"./LaunchPadCreateForm\";\nimport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nimport { MagicLaunch } from \"./MagicLaunch\";\nimport type { GeneratedMemeInfo } from \"./ports\";\n\nconst PLATFORMS = [\n { platform: LaunchPadPlatform.PUMPFUN, name: \"Pump\", icon: \"/images/launchpad/pumpfun.svg\" },\n { platform: LaunchPadPlatform.RAYDIUM, name: \"Raydium\", icon: \"/images/launchpad/raydium.svg\" },\n] as const;\n\nexport interface LaunchPadHomeProps {\n prompt?: string;\n image?: string;\n}\n\nexport function LaunchPadHome({ prompt, image }: LaunchPadHomeProps) {\n const [platform, setPlatform] = useState<LaunchPadPlatform>(LaunchPadPlatform.PUMPFUN);\n const [suggestedImage, setSuggestedImage] = useState<string | undefined>(image);\n const [suggestedName, setSuggestedName] = useState<string | undefined>(undefined);\n const [suggestedSymbol, setSuggestedSymbol] = useState<string | undefined>(undefined);\n const [preview, setPreview] = useState<LaunchPadCreateFormValues | null>(null);\n\n const onGenerate = useCallback((result: GeneratedMemeInfo) => {\n setSuggestedImage(result.image);\n setSuggestedName(result.name);\n setSuggestedSymbol(result.symbol);\n }, []);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <MagicLaunch prompt={prompt} onGenerate={onGenerate} />\n <div className=\"flex-1 flex items-start justify-center gap-4\">\n <div className={cn(\"h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2\")}>\n <Tabs\n fullWidth\n selectedKey={platform}\n onSelectionChange={(key: Key) => setPlatform(String(key) as LaunchPadPlatform)}\n disableAnimation\n >\n {PLATFORMS.map((item) => (\n <Tab\n key={item.platform}\n title={\n <div className=\"flex items-center gap-2\">\n <Image src={item.icon} alt={item.name} width={20} height={20} />\n <span>{item.name}</span>\n </div>\n }\n />\n ))}\n </Tabs>\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.PUMPFUN}\n className={cn({ hidden: platform !== LaunchPadPlatform.PUMPFUN })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.RAYDIUM}\n className={cn({ hidden: platform !== LaunchPadPlatform.RAYDIUM })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n </div>\n <LaunchPadCurvePreview\n platform={platform}\n supply={preview?.supply}\n raised={preview?.raised}\n soldPercent={preview?.sold}\n />\n </div>\n </div>\n );\n}\n","export const PACKAGE_NAME = \"@liberfi.io/ui-launchpad\" as const;\n\nexport function LaunchpadReadyWidget() {\n return PACKAGE_NAME;\n}\n\nexport { LaunchpadCreateStatusView } from \"./create-status.view\";\nexport { LaunchPadHome, type LaunchPadHomeProps } from \"./LaunchPadHome\";\nexport { LaunchPadCreateForm } from \"./LaunchPadCreateForm\";\nexport { MagicLaunch, type MagicLaunchProps } from \"./MagicLaunch\";\nexport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nexport {\n LaunchpadUiProvider,\n useLaunchpadUiPorts,\n createInMemoryLaunchpadUiPorts,\n type LaunchpadUiPorts,\n type GeneratedMemeInfo,\n} from \"./ports\";\n"]}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@liberfi.io/ui-launchpad",
3
+ "version": "1.0.1",
4
+ "description": "Launchpad widgets for Liberfi React SDK",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.mts",
12
+ "default": "./dist/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "dependencies": {
28
+ "@liberfi.io/hooks": "0.1.266",
29
+ "@liberfi.io/types": "0.4.74",
30
+ "@liberfi.io/utils": "0.2.73"
31
+ },
32
+ "devDependencies": {
33
+ "@tanstack/react-query": "^5.90.2",
34
+ "@testing-library/jest-dom": "^6.9.1",
35
+ "@testing-library/react": "^16.3.0",
36
+ "@types/jest": "^30.0.0",
37
+ "@types/react": "^19.1.13",
38
+ "@types/react-dom": "^19.1.9",
39
+ "jest": "^30.2.0",
40
+ "jest-environment-jsdom": "^30.2.0",
41
+ "react": "^19.1.1",
42
+ "react-dom": "^19.1.1",
43
+ "ts-jest": "^29.4.5",
44
+ "tsup": "^8.5.0",
45
+ "typescript": "^5.9.2",
46
+ "@liberfi.io/i18n": "0.1.271",
47
+ "@liberfi.io/react-launchpad": "0.1.1",
48
+ "@liberfi.io/ui": "0.3.74",
49
+ "tsconfig": "0.1.257"
50
+ },
51
+ "peerDependencies": {
52
+ "react": ">=18",
53
+ "react-dom": ">=18",
54
+ "@liberfi.io/i18n": "0.1.271",
55
+ "@liberfi.io/react-launchpad": "0.1.1",
56
+ "@liberfi.io/ui": "0.3.74"
57
+ },
58
+ "scripts": {
59
+ "dev": "tsup --watch",
60
+ "build": "tsup",
61
+ "test": "jest --config jest.config.cjs --runInBand --detectOpenHandles",
62
+ "typecheck": "tsc --noEmit -p tsconfig.json",
63
+ "lint": "eslint src"
64
+ }
65
+ }