{"version":3,"sources":["config.tsx","app/Content.tsx","components/PackageInfo.tsx","app/SetupAccount.tsx","page/GetPackagesPage.tsx","page/CreatePackagePageV2.tsx","demo/Authenticate.tsx","components/GiftInfo.tsx","page/MyGiftsPage.tsx","app/Header.tsx","assets/logo.png","app/Authenticate.tsx","App.tsx","serviceWorker.js","index.tsx"],"names":["adminAddress","nonFungibleTokenAddress","flowTokenAddress","fungibleTokenAddress","fcl","put","ReplaceAddress","source","replace","StyledMainContent","styled","div","ContentWrapper","Title","Content","props","title","children","PackageInfoWrapper","Header","TotalAmount","TimeWrapper","LockStatus","DeadLine","Body","Image","Tail","ResultButton","button","PackageInfo","packageData","data","useState","imgUrl","setImgUrl","ref","useRef","content","setContent","useExternal","type","target","load","toggle","unload","useEffect","url","retweet","keyword","totalNumber","className","isLocked","date","deadline","onClick","alert","options","text","size","PopBackground","InfoCard","InfoTitle","InfoText","OperateButton","setUpAccountTransaction","SetupAccount","useLocalStorageState","userInitStatus","setUserInitStatus","setTransactionText","setTransaction","sendSetupAccountTransaction","a","blockResponse","block","authorization","id","transactionId","unsub","subscribe","transaction","isSealed","undefined","GetPackageWrapper","getPackagesScript","GetPackagesPage","setData","displayData","setDisplayData","useContext","PackageInfoContext","dispatch","state","res","decodeRes","displayDataArray","map","meta","JSON","parse","metadata","console","log","keyWord","locked","Date","result","fetchAndRenderPackages","sort","b","packageDisplay","key","registerLocale","zh","Container","CreateForm","PreviewWrapper","Field","TitleInput","input","UrlInput","ContentTextera","textarea","KeyWordInput","TotalNumberInput","DatePickerWrapper","Confirm","ConfirmButton","CreatePackagePageV2","sessionUser","SessionUserContext","packageID","setTitle","setUrl","setRetweet","setKeyword","setTotalNumber","createAt","setDeadline","status","setStatus","window","location","href","OnSubmit","event","stringify","now","getTime","preventDefault","t","Number","onChange","e","value","placeholder","addr","min","max","currentTarget","locale","isClearable","name","selected","minDate","maxDate","showTimeSelect","timeFormat","timeIntervals","timeCaption","dateFormat","LoginButton","SignInOutButton","signInOrOut","user","loggedIn","localStorage","removeItem","GiftInfoWrapper","SeriesNumber","GiftInfo","giftInfo","seriesText","setSeriesText","seriesNum","getGiftsScript","getGiftInfoScriptScript","GetGiftsWrapper","GetGiftsPage","giftsData","setGiftsData","resGiftsID","resDataGiftsID","length","resGiftsInfo","resDataGiftsInfo","giftsDataList","giftResInfo","packageInfo","filter","NFTID","serialNumber","push","useMemo","process","giftDisplay","HeaderWrapper","Logo","Nav","NavItem","StyledLink","NavLink","initialState","createContext","reducer","action","useReducer","Provider","to","activeClassName","exact","path","render","MyGiftsPage","SessionUserDefault","Authenticate","setUser","FontWrapper","App","Boolean","hostname","match","ReactDOM","StrictMode","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","error","message"],"mappings":"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","file":"static/js/main.14fed09f.chunk.js","sourcesContent":["import * as fcl from '@onflow/fcl'\n\nconst ISTESTNET = true\nexport let adminAddress = '0xf8d6e0586b0a20c7'\nexport let nonFungibleTokenAddress = '0xf8d6e0586b0a20c7'\nexport let flowTokenAddress = '0x0ae53cb6e3f42a79'\nexport let fungibleTokenAddress = '0xee82856bf20e2aa6'\nconst nonFungibleTokenPath = '\"../../contracts/NonFungibleToken.cdc\"'\nconst fanNFTPath = '\"../../contracts/FanNFT.cdc\"'\nconst flowTokenPath = '\"../../contracts/FlowToken.cdc\"'\nconst fungibleTokenPath = '\"../../contracts/FungibleToken.cdc\"'\n\nif (ISTESTNET) {\n adminAddress = '0x3d23f5f79a6df524'\n nonFungibleTokenAddress = '0x631e88ae7f1d7c20'\n flowTokenAddress = '0x7e60df042a9c0868'\n fungibleTokenAddress = '0x9a0766d93b6608b7'\n fcl\n .config()\n .put('accessNode.api', 'https://access-testnet.onflow.org') // Flow testnet\n .put('challenge.handshake', 'https://fcl-discovery.onflow.org/testnet/authn')\n} else {\n // 模拟器\n fcl\n .config()\n .put('accessNode.api', 'http://localhost:8080') // local Flow emulator\n .put('discovery.wallet', 'http://localhost:3000/fcl/authn')\n}\n\nexport const ReplaceAddress = (source: string) => {\n return source\n .replace(nonFungibleTokenPath, fcl.withPrefix(nonFungibleTokenAddress))\n .replace(fanNFTPath, fcl.withPrefix(adminAddress))\n .replace(flowTokenPath, fcl.withPrefix(flowTokenAddress))\n .replace(fungibleTokenPath, fcl.withPrefix(fungibleTokenAddress))\n}\n","import { ReactNode } from 'react'\nimport styled from 'styled-components'\n\ninterface ContentProps {\n title: string\n children?: ReactNode\n}\n\nconst StyledMainContent = styled.div`\n /* border: 2px solid black; */\n`\n\nconst ContentWrapper = styled.div`\n min-width: 640px;\n /* border: 2px solid black; */\n display: flex;\n justify-content: flex-start;\n flex-direction: column;\n`\n\nconst Title = styled.div`\n /* border: 2px solid black; */\n font-size: 1.4rem;\n padding-left: 16px;\n`\n\nconst Content = (props: ContentProps) => {\n return (\n \n {props.title}\n {props.children}\n \n )\n}\n\nexport default Content\n","import styled from 'styled-components'\nimport { useEffect, useRef, useState } from 'react'\nimport Countdown from 'react-countdown'\nimport { useExternal } from 'ahooks'\nimport { Share } from 'react-twitter-widgets'\nimport { PackageInfoProps } from '../interfaces'\n\nconst PackageInfoWrapper = styled.div`\n border: 1px solid transparent;\n box-shadow: 0 2px 5px 1px rgb(64 60 67 / 16%);\n border-radius: 12px;\n height: 300px;\n width: 600px;\n margin: 10px 40px;\n display: flex;\n flex-direction: column;\n padding: 5px;\n`\n\nconst Header = styled.div`\n /* border: 1px solid black; */\n display: flex;\n justify-content: space-around;\n height: 50px;\n`\n\nconst Title = styled.div`\n /* border: 1px solid black; */\n flex: 5;\n font-size: 2rem;\n padding: 10px 20px;\n /* border-bottom: 1px solid rgb(196, 207, 214); */\n`\n\nconst PackageID = styled.div`\n /* border: 1px solid black; */\n font-size: 1rem;\n flex: 1;\n color: grey;\n`\n\nconst TotalAmount = styled.div`\n /* border: 1px solid black; */\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n & > span {\n font-size: 1.5rem;\n }\n`\n\nconst TimeWrapper = styled.div`\n /* border: 1px solid black; */\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 5px;\n`\n\nconst LockStatus = styled.div`\n /* border: 1px solid black; */\n &.locked {\n color: red;\n }\n &.notLocked {\n color: green;\n }\n`\n\nconst DeadLine = styled.div`\n /* border: 1px solid black; */\n margin-top: 5px;\n flex: 1;\n`\n\nconst Body = styled.div`\n /* border: 1px solid black; */\n height: 200px;\n display: flex;\n /* border-bottom: 1px solid rgb(196, 207, 214); */\n`\n\nconst Content = styled.div`\n /* border: 1px solid black; */\n width: 500px;\n padding: 10px 20px;\n font-size: 18px;\n .tag {\n color: rgb(27, 149, 224);\n }\n`\n\nconst Image = styled.div`\n width: 200px;\n min-width: 200px;\n height: 200px;\n min-height: 200px;\n & > img {\n width: 100%;\n height: 100%;\n }\n`\n\nconst Tail = styled.div`\n /* border: 1px solid black; */\n height: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst ResultButton = styled.button`\n /* background-color: RGB(245, 192, 237);\n height: 28px;\n border-radius: 4px;\n padding: 1px 10px 1px 9px;\n font-weight: 500;\n color: #fff;\n box-sizing: border-box; */\n margin: 10px;\n color: #fff;\n background: transparent;\n border: 0px solid gray;\n border-radius: 4px;\n height: 28px;\n background-color: RGB(245, 192, 237);\n width: 80px;\n font-weight: 500;\n &:hover {\n background-color: #d6c1f5;\n color: white;\n }\n`\n\nconst PackageInfo = (props: PackageInfoProps) => {\n const packageData = props.data\n const [imgUrl, setImgUrl] = useState('')\n const ref = useRef(null)\n const [content, setContent] = useState('')\n\n const [status, { toggle, unload, load }] = useExternal(imgUrl, {\n type: 'img',\n target: ref,\n })\n\n useEffect(() => {\n setImgUrl(packageData.url)\n load()\n }, [packageData.url])\n\n useEffect(() => {\n setContent(packageData.retweet + ' ' + packageData.keyword)\n }, [packageData.retweet, packageData.keyword])\n\n return (\n \n
\n {packageData.title}\n \n Max: {packageData.totalNumber}\n \n \n \n {packageData.isLocked ? '已结束' : '进行中'}\n \n {!packageData.isLocked && (\n \n \n \n )}\n \n
\n \n {content}\n \n \n \n {packageData.isLocked ? (\n alert('未实现')}>查看结果\n ) : (\n \n )}\n \n
\n )\n}\n\nexport default PackageInfo\n","import { ReplaceAddress } from '../config'\nimport { useState } from 'react'\nimport { useLocalStorageState } from 'ahooks'\nimport * as fcl from '@onflow/fcl'\nimport styled from 'styled-components'\n\nconst setUpAccountTransactionSource = `\\\nimport NonFungibleToken from \"../../contracts/NonFungibleToken.cdc\"\nimport FanNFT from \"../../contracts/FanNFT.cdc\"\n\npub fun hasGifts(_ address: Address): Bool {\n return getAccount(address)\n .getCapability<&FanNFT.Collection{NonFungibleToken.CollectionPublic, FanNFT.GiftCollectionPublic}>(FanNFT.GiftPublicPath)\n .check()\n}\n\ntransaction {\n prepare(signer: AuthAccount) {\n if !hasGifts(signer.address){\n log(\"account init start\")\n if signer.borrow<&FanNFT.Collection>(from: FanNFT.GiftStoragePath) == nil {\n signer.save(<-FanNFT.createEmptyCollection(), to: FanNFT.GiftStoragePath)\n }\n signer.unlink(FanNFT.GiftPublicPath)\n signer.link<&{NonFungibleToken.CollectionPublic,FanNFT.GiftCollectionPublic}>\n (FanNFT.GiftPublicPath,target: FanNFT.GiftStoragePath)\n }else{\n log(\"account init already\")\n }\n }\n}\n`\n\nconst PopBackground = styled.div`\n position: fixed;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 5000;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst InfoCard = styled.div`\n width: 500px;\n height: 200px;\n border-radius: 12px;\n background-color: white;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n`\n\nconst InfoTitle = styled.div`\n font-size: 2rem;\n flex: 1;\n`\n\nconst InfoText = styled.div`\n color: grey;\n margin-top: 20px;\n font-size: 1.5rem;\n flex: 4;\n`\n\nconst OperateButton = styled.button`\n width: 100px;\n height: 60px;\n flex: 1;\n margin: 10px;\n color: gray;\n background: transparent;\n border: 2px solid gray;\n border-radius: 12px;\n font-size: 16px;\n &:hover {\n background-color: RGB(245, 192, 237);\n color: white;\n }\n`\n\nconst setUpAccountTransaction = ReplaceAddress(setUpAccountTransactionSource)\n\nconst SetupAccount = () => {\n const [userInitStatus, setUserInitStatus] = useLocalStorageState('userInitStatus', false)\n const [transactionText, setTransactionText] = useState('')\n const [transaction, setTransaction] = useState(null)\n\n const sendSetupAccountTransaction = async () => {\n const blockResponse = await fcl.send([fcl.getLatestBlock()])\n const block = await fcl.decode(blockResponse)\n\n try {\n const { transactionId } = await fcl.send([\n fcl.transaction(setUpAccountTransaction),\n fcl.proposer(fcl.currentUser().authorization),\n fcl.authorizations([fcl.currentUser().authorization]),\n fcl.payer(fcl.currentUser().authorization),\n fcl.ref(block.id),\n fcl.limit(999),\n ])\n\n setTransactionText('Transaction sent, waiting for confirmation' + ' trxId: ' + transactionId)\n\n const unsub = fcl.tx({ transactionId }).subscribe((transaction: React.SetStateAction) => {\n setTransaction(transaction)\n\n if (fcl.tx.isSealed(transaction)) {\n setTransactionText('Transaction is Sealed')\n unsub()\n setUserInitStatus(true)\n }\n })\n } catch (error) {\n alert('Transaction failed: ' + error)\n setTransactionText('Transaction failed: ' + error)\n }\n }\n\n return (\n <>\n {(userInitStatus === false || userInitStatus === undefined) && (\n \n \n 提示\n 需要初始化账户存储才能收到礼物\n Approve\n \n \n )}\n \n )\n}\n\nexport default SetupAccount\n","import { useState, useEffect, useContext } from 'react'\nimport * as fcl from '@onflow/fcl'\nimport { ReplaceAddress } from '../config'\nimport Content from '../app/Content'\nimport PackageInfo from '../components/PackageInfo'\nimport { IMetaData, IPackageInfo, PackageInfoDisplay } from '../interfaces'\nimport styled from 'styled-components'\nimport { PackageInfoContext } from '../app/Header'\nimport SetupAccount from '../app/SetupAccount'\n\nconst getPackagesScriptSource = `\nimport FanNFT from \"../../contracts/FanNFT.cdc\"\n\n// 获取所有package的数据\npub fun main(): [FanNFT.PackageData] {\n let packageDatas = FanNFT.getAllPackages()\n\n return packageDatas\n}\n`\n\nconst GetPackageWrapper = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-around;\n`\n\nconst getPackagesScript = ReplaceAddress(getPackagesScriptSource)\n\nconst GetPackagesPage = () => {\n const [data, setData] = useState([])\n const [displayData, setDisplayData] = useState([])\n const { state, dispatch } = useContext(PackageInfoContext)\n\n useEffect(() => {\n async function fetchAndRenderPackages() {\n const decodeRes: IPackageInfo[] = []\n try {\n const res = await fcl.send([fcl.script(getPackagesScript)])\n const decodeRes = await fcl.decode(res)\n if (decodeRes !== []) {\n const displayDataArray = decodeRes.map((packageData: IPackageInfo) => {\n const meta = JSON.parse(packageData.metadata) as IMetaData\n console.log('meta', meta)\n const display = {\n title: meta.title,\n url: meta.url,\n retweet: meta.content,\n keyword: meta.keyWord,\n isLocked: packageData.locked,\n totalNumber: packageData.totalNumber,\n deadline: new Date(meta.deadline * 1000),\n } as PackageInfoDisplay\n return display\n })\n\n setDisplayData(displayDataArray)\n } else {\n alert('请求的PackageData为空')\n setDisplayData([])\n }\n setData(decodeRes)\n dispatch({ type: 'UPDATE', result: decodeRes })\n } catch (error) {\n setData([])\n }\n }\n fetchAndRenderPackages()\n }, [])\n\n return (\n <>\n \n \n \n <>\n {displayData\n .sort((a: any, b: any) => (a.deadline > b.deadline ? -1 : b.deadline > a.deadline ? 1 : 0))\n .map((packageDisplay, key) => (\n \n ))}\n \n \n \n \n )\n}\n\nexport default GetPackagesPage\n","import { useState, useContext, useEffect } from 'react'\nimport styled from 'styled-components'\nimport Content from '../app/Content'\nimport PackageInfo from '../components/PackageInfo'\nimport DatePicker, { registerLocale } from 'react-datepicker'\nimport 'react-datepicker/dist/react-datepicker.css'\nimport zh from 'date-fns/locale/zh-CN'\nimport { SessionUserContext } from '../app/Authenticate'\nimport { ReplaceAddress, adminAddress } from '../config'\nimport * as fcl from '@onflow/fcl'\nimport * as t from '@onflow/types'\nimport { PackageInfoDisplay } from '../interfaces'\n\nregisterLocale('zh', zh)\n\nconst Container = styled.div`\n /* border: 1px solid green; */\n display: flex;\n`\n\nconst CreateForm = styled.div`\n /* border: 1px solid red; */\n margin-left: 20px;\n margin-top: 8px;\n display: flex;\n flex-direction: column;\n flex: 1;\n`\n\nconst PreviewWrapper = styled.div`\n /* border: 1px solid yellow; */\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: flex-start;\n`\n\nconst Field = styled.div`\n /* border: 1px solid purple; */\n display: flex;\n margin-bottom: 20px;\n`\n\nconst Title = styled.div`\n display: flex;\n color: gray;\n min-width: 100px;\n font-size: 1.4rem;\n`\n\nconst TitleInput = styled.input`\n width: 300px;\n`\n\nconst UrlInput = styled.input`\n width: 500px;\n`\n\nconst ContentTextera = styled.textarea`\n width: 500px;\n height: 150px;\n`\n\nconst KeyWordInput = styled.input`\n width: 100px;\n`\n\nconst TotalNumberInput = styled.input`\n width: 100px;\n`\n\nconst DatePickerWrapper = styled.div`\n & .form-control {\n width: 180px;\n height: 32px;\n }\n`\n\nconst Confirm = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nconst ConfirmButton = styled.button`\n margin: 10px;\n color: gray;\n background: transparent;\n border: 2px solid gray;\n border-radius: 16px;\n height: 50px;\n width: 100px;\n font-size: 16px;\n &:hover {\n background-color: RGB(245, 192, 237);\n color: white;\n }\n`\n\nconst createPackageTransactionSource = `\\\nimport NonFungibleToken from \"../../contracts/NonFungibleToken.cdc\"\nimport FanNFT from \"../../contracts/FanNFT.cdc\"\nimport FlowToken from \"../../contracts/FlowToken.cdc\"\n// import FlowToken from 0x0ae53cb6e3f42a79 // 模拟器\n// import FlowToken from 0x7e60df042a9c0868 // 测试网\nimport FungibleToken from \"../../contracts/FungibleToken.cdc\"\n// import FungibleToken from 0xee82856bf20e2aa6 // 模拟器\n// import FungibleToken from 0x9a0766d93b6608b7 // 测试网\n\ntransaction(metadata: String, totalNumber: UInt32, adminAccount: Address) {\n let sentVault: @FungibleToken.Vault\n \n prepare(acct: AuthAccount){\n let amount = FanNFT.createFee\n let vaultRef = acct.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault)\n\t\t\t?? panic(\"Could not borrow reference to the owner's Vault!\")\n self.sentVault <- vaultRef.withdraw(amount: amount)\n }\n\n execute {\n let admin = getAccount(adminAccount)\n let adminRef = admin.getCapability(FanNFT.AdminPublicPath).borrow<&{FanNFT.AdminPublic}>()!\n let receiverRef = admin\n .getCapability(/public/flowTokenReceiver)\n .borrow<&{FungibleToken.Receiver}>()\n\t\t\t?? panic(\"Could not borrow receiver reference to the recipient's Vault\")\n receiverRef.deposit(from: <-self.sentVault)\n\n adminRef.createPackage(metadata: metadata, totalNumber: totalNumber)\n }\n}\n \n`\n\nconst setUpAccountTransaction = ReplaceAddress(createPackageTransactionSource)\n\nconst CreatePackagePageV2 = () => {\n const sessionUser = useContext(SessionUserContext)\n\n const [packageID, setPackageID] = useState(-1)\n const [title, setTitle] = useState('')\n const [url, setUrl] = useState('')\n const [retweet, setRetweet] = useState('')\n const [keyword, setKeyword] = useState('')\n const [totalNumber, setTotalNumber] = useState(0)\n const [createAt, setCreateAt] = useState(new Date())\n const [deadline, setDeadline] = useState(new Date())\n const [isLocked, setIsLocked] = useState(false)\n const [transaction, setTransaction] = useState(null)\n const [status, setStatus] = useState('Not started')\n\n useEffect(() => {\n if (status === 'Transaction is Sealed') {\n window.location.href = '/home'\n }\n }, [status])\n\n const OnSubmit = async (event: any) => {\n if (title === '' || url === '' || retweet === '' || keyword === '') {\n alert('部分参数未填写请检查参数')\n return\n }\n if (totalNumber < 1 || totalNumber > 99) {\n alert('礼物数量为1-99')\n return\n }\n const metadata = JSON.stringify({\n title,\n url,\n content: retweet,\n keyWord: keyword,\n createAt: (Date.now() / 1000) | 0,\n deadline: (deadline.getTime() / 1000) | 0,\n })\n\n event.preventDefault()\n const blockResponse = await fcl.send([fcl.getLatestBlock()])\n const block = await fcl.decode(blockResponse)\n\n try {\n const { transactionId } = await fcl.send([\n fcl.transaction(setUpAccountTransaction),\n fcl.args([\n fcl.arg(metadata, t.String),\n fcl.arg(Number(totalNumber), t.UInt32),\n fcl.arg(adminAddress, t.Address),\n ]),\n fcl.proposer(fcl.currentUser().authorization),\n fcl.authorizations([fcl.currentUser().authorization]),\n fcl.payer(fcl.currentUser().authorization),\n fcl.ref(block.id),\n fcl.limit(999),\n ])\n\n setStatus('Transaction sent, waiting for confirmation' + ' trxId: ' + transactionId)\n\n const unsub = fcl.tx({ transactionId }).subscribe((transaction: React.SetStateAction) => {\n setTransaction(transaction)\n\n if (fcl.tx.isSealed(transaction)) {\n setStatus('Transaction is Sealed')\n console.log(`Transaction ${transactionId} is Sealed`)\n unsub()\n }\n })\n } catch (error) {\n alert('Transaction failed: ' + error)\n setStatus('Transaction failed: ' + error)\n }\n }\n\n return (\n <>\n \n \n \n \n 礼包标题\n setTitle(e.target.value)}\n placeholder=\"例如:the gift to Flow fans\"\n >\n \n \n NFT资源\n setUrl(e.target.value)} placeholder=\"输入URL\">\n \n \n 转发内容\n setRetweet(e.target.value + ' ' + sessionUser.addr)}\n placeholder=\"填写转发内容\"\n >\n \n \n 关键词\n setKeyword('#FanNFT #' + e.target.value)}\n placeholder=\"填写关键词\"\n >\n \n \n 礼物总数\n setTotalNumber((e.currentTarget as any).value)}\n placeholder=\"填写礼物总数\"\n >\n \n \n 截止日\n \n {\n setDeadline(date)\n }}\n minDate={createAt}\n maxDate={new Date(Date.now() + 3600 * 1000 * 24 * 7)}\n showTimeSelect\n timeFormat=\"HH:mm\"\n timeIntervals={5}\n timeCaption=\"time\"\n dateFormat=\"yyyy-MM-dd h:mm aa\"\n />\n \n \n \n \n \n \n \n \n 确认创建\n \n \n \n )\n}\n\nexport default CreatePackagePageV2\n","import React, { useState, useEffect } from 'react'\nimport * as fcl from '@onflow/fcl'\nimport styled from 'styled-components'\n\ninterface SignInOutButtonProps {\n user: User\n}\n\ninterface User {\n loggedIn: boolean | null\n}\n\ninterface IUserContext {\n address: string\n}\n\nconst initUserContext: IUserContext = {\n address: '',\n}\n\nconst LoginButton = styled.button`\n margin: 10px;\n color: gray;\n background: transparent;\n border: 2px solid gray;\n border-radius: 16px;\n height: 50px;\n width: 100px;\n font-size: 16px;\n &:hover {\n background-color: RGB(245, 192, 237);\n color: white;\n }\n`\n\nexport const SignInOutButton = (props: SignInOutButtonProps) => {\n const signInOrOut = async (event: any) => {\n event.preventDefault()\n\n if (props.user.loggedIn) {\n fcl.unauthenticate()\n localStorage.removeItem('userInitStatus')\n } else {\n fcl.authenticate()\n }\n }\n\n return (\n <>\n {props.user.loggedIn ? '注销' : '登录/注册'}\n \n )\n}\n\nconst CurrentUser = () => {\n const [user, setUser] = useState({ loggedIn: false })\n useEffect(\n () =>\n fcl.currentUser().subscribe((user: any) => {\n setUser({ ...user })\n }),\n []\n )\n\n return (\n <>\n \n \n )\n}\n\nexport default CurrentUser\n","import { useExternal } from 'ahooks'\nimport { useEffect, useRef, useState } from 'react'\nimport styled from 'styled-components'\nimport { GiftInfoProps } from '../interfaces'\n\nconst GiftInfoWrapper = styled.div`\n border: 1px solid transparent;\n box-shadow: 0 2px 5px 1px rgb(64 60 67 / 16%);\n border-radius: 12px;\n padding: 10px;\n height: 300px;\n width: 300px;\n display: flex;\n flex-direction: column;\n margin: 20px;\n`\n\nconst Title = styled.div`\n max-height: 50px;\n font-size: 2rem;\n display: flex;\n align-self: center;\n`\n\nconst Image = styled.div`\n width: 200px;\n min-width: 200px;\n height: 200px;\n min-height: 200px;\n margin-top: 10px;\n display: flex;\n align-self: center;\n & > img {\n width: 100%;\n height: 100%;\n }\n`\nconst SeriesNumber = styled.div`\n color: grey;\n display: flex;\n align-self: center;\n font-size: 1rem;\n padding: 5px;\n margin-top: 10px;\n`\n\nconst GiftInfo = (props: GiftInfoProps) => {\n const giftInfo = props.data\n const [imgUrl, setImgUrl] = useState('')\n const ref = useRef(null)\n const [seriesText, setSeriesText] = useState('')\n\n const [status, { toggle, unload, load }] = useExternal(imgUrl, {\n type: 'img',\n target: ref,\n })\n\n useEffect(() => {\n setImgUrl(giftInfo.url)\n setSeriesText(`# ${giftInfo.seriesNum}/${giftInfo.totalNumber}`)\n load()\n }, [])\n\n return (\n \n {giftInfo.title}\n \n {seriesText}\n \n )\n}\n\nexport default GiftInfo\n","import { useContext, useState, useEffect, useMemo } from 'react'\nimport * as fcl from '@onflow/fcl'\nimport * as t from '@onflow/types'\nimport { ReplaceAddress } from '../config'\nimport Content from '../app/Content'\nimport { SessionUserContext } from '../app/Authenticate'\nimport { PackageInfoContext } from '../app/Header'\nimport { GiftInfoDisplay, GiftDataRes, IPackageInfo, IMetaData } from '../interfaces'\nimport styled from 'styled-components'\nimport GiftInfo from '../components/GiftInfo'\nimport SetupAccount from '../app/SetupAccount'\n\nconst getGiftsScriptSource = `\nimport FanNFT from \"../../contracts/FanNFT.cdc\"\nimport NonFungibleToken from \"../../contracts/NonFungibleToken.cdc\"\n\n// 用于获取账户下的giftID\n\npub fun main(address: Address): [UInt64] {\n let account = getAccount(address)\n let collectionRef = account.getCapability(FanNFT.GiftPublicPath)\n .borrow<&{FanNFT.GiftCollectionPublic}>()\n ?? panic(\"Could not borrow capability from public collection\")\n return collectionRef.getIDs()\n}\n`\n\nconst getGiftInfoScriptSource = `\nimport FanNFT from \"../../contracts/FanNFT.cdc\"\nimport NonFungibleToken from \"../../contracts/NonFungibleToken.cdc\"\n\n// 返回用户持有的giftNFT信息\n\npub fun main(address: Address, giftIDs: [UInt64]): [FanNFT.GiftData] {\n let collectionRef = getAccount(address).getCapability(FanNFT.GiftPublicPath)\n .borrow<&{FanNFT.GiftCollectionPublic}>()\n ?? panic(\"Could not borrow capability from public collection\")\n\n let giftsData:[FanNFT.GiftData] = []\n\n for giftID in giftIDs{\n let giftItem = collectionRef.borrowGift(id: giftID)\n ?? panic(\"No such giftID in that collection\")\n giftsData.append(giftItem.data)\n }\n\n return giftsData\n}\n`\n\nconst getGiftsScript = ReplaceAddress(getGiftsScriptSource)\nconst getGiftInfoScriptScript = ReplaceAddress(getGiftInfoScriptSource)\n\nconst GetGiftsWrapper = styled.div`\n display: flex;\n flex-wrap: wrap;\n`\n\nconst GetGiftsPage = () => {\n const { state, dispatch } = useContext(PackageInfoContext)\n const sessionUser = useContext(SessionUserContext)\n const [giftsData, setGiftsData] = useState([])\n\n useMemo(() => {\n process()\n }, [])\n\n async function process() {\n try {\n const resGiftsID = await fcl.send([fcl.script(getGiftsScript), fcl.args([fcl.arg(sessionUser.addr, t.Address)])])\n const resDataGiftsID = (await fcl.decode(resGiftsID)) as number[]\n if (resDataGiftsID.length === 0) {\n setGiftsData([])\n return\n }\n const resGiftsInfo = await fcl.send([\n fcl.script(getGiftInfoScriptScript),\n fcl.args([fcl.arg(sessionUser.addr, t.Address), fcl.arg(resDataGiftsID, t.Array(t.UInt64))]),\n ])\n const resDataGiftsInfo = (await fcl.decode(resGiftsInfo)) as GiftDataRes[]\n const giftsDataList = []\n for (const giftResInfo of resDataGiftsInfo) {\n const packageInfo = state.data?.filter((packageInfo) => {\n return packageInfo.packageID === giftResInfo.packageID\n })[0]\n const metadata = JSON.parse(packageInfo!.metadata) as IMetaData\n const giftInfo: GiftInfoDisplay = {\n title: metadata.title,\n url: metadata.url,\n createAt: new Date(metadata.createAt),\n packageID: packageInfo!.packageID,\n totalNumber: packageInfo!.totalNumber,\n NFTID: giftResInfo.id,\n seriesNum: giftResInfo.serialNumber,\n }\n giftsDataList.push(giftInfo)\n }\n setGiftsData(giftsDataList)\n console.log(giftsDataList)\n } catch (error) {\n alert(error)\n }\n }\n\n return (\n <>\n \n \n \n <>\n {giftsData.map((giftDisplay, key) => (\n \n ))}\n \n \n \n \n // \n //
Get Gifts
\n\n // {getGiftsScript}\n\n // \n\n // {giftsData && {JSON.stringify(giftsData, null, 2)}}\n //
\n )\n}\n\nexport default GetGiftsPage\n","import React, { createContext, useContext, useReducer } from 'react'\nimport styled from 'styled-components'\nimport logoPic from '../assets/logo.png'\nimport { BrowserRouter as Router, NavLink, Switch, Route, Redirect } from 'react-router-dom'\nimport GetPackagesPage from '../page/GetPackagesPage'\nimport CreatePackagePageV2 from '../page/CreatePackagePageV2'\nimport { SignInOutButton } from '../demo/Authenticate'\nimport { SessionUserContext } from '../app/Authenticate'\nimport GetPackages from '../demo/GetPackages'\nimport SetUpAccount from '../demo/SetUpAccount'\nimport GetGifts from '../demo/GetGifts'\nimport { IPackageInfo } from '../interfaces'\nimport MyGiftsPage from '../page/MyGiftsPage'\n\nconst HeaderWrapper = styled.div`\n padding: 0 10px;\n height: 100px;\n background: white;\n display: flex;\n justify-content: space-around;\n`\nconst Logo = styled.a`\n display: flex;\n width: 100px;\n background: url(${logoPic});\n background-size: cover;\n padding-top: 10px;\n`\nconst Nav = styled.div`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n flex: 1;\n`\n\nconst NavItem = styled.div`\n margin-left: 20px;\n font-size: 17px;\n color: #333;\n justify-content: space-around;\n`\n\nconst AuthenticateWrapper = styled.div`\n display: flex;\n width: 100px;\n align-items: center;\n`\n\nconst StyledLink = styled(NavLink)`\n text-decoration: none;\n color: RGB(245, 192, 237);\n &:focus,\n &:hover,\n &:visited,\n &:link,\n &:active {\n text-decoration: none;\n }\n\n &.current {\n border-bottom: 2px solid black;\n }\n`\n\nconst initialState: State = {\n data: [],\n}\n\nexport const PackageInfoContext = createContext<{\n state: State\n dispatch: React.Dispatch\n}>({\n state: initialState,\n dispatch: () => undefined,\n})\n\ntype Action = { type: 'UPDATE'; result: IPackageInfo[] }\ntype State = { data?: IPackageInfo[] }\n\nconst reducer = (state: State, action: Action) => {\n switch (action.type) {\n case 'UPDATE':\n return {\n data: action.result,\n }\n default:\n return initialState\n }\n}\n\nconst Header = () => {\n const sessionUser = useContext(SessionUserContext)\n const [state, dispatch] = useReducer(reducer, initialState)\n\n return (\n \n \n \n \n \n \n \n {\n return \n }}\n />\n \n \n \n {/* \n \n \n \n \n */}\n \n \n \n {/* \n \n */}\n \n \n \n \n \n \n )\n}\n\nexport default Header\n","export default \"data:image/png;base64,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\"","import { useState, useEffect, createContext } from 'react'\nimport * as fcl from '@onflow/fcl'\nimport Header from './Header'\nimport SetupAccount from './SetupAccount'\n\nexport type SessionUser = {\n addr: string | null\n cid?: string | null\n expiresAt?: string | null\n f_type?: 'USER' | 'User'\n f_vsn?: '1.0.0'\n loggedIn: boolean | null\n services?: []\n}\n\nexport const SessionUserDefault = { loggedIn: false, addr: '' }\n\nexport const SessionUserContext = createContext(SessionUserDefault)\n\nconst Authenticate = () => {\n const [user, setUser] = useState(SessionUserDefault)\n\n useEffect(() => {\n fcl.currentUser().subscribe((user: SessionUser) => {\n if (user.loggedIn === null) {\n fcl.authenticate()\n } else {\n setUser({ ...user })\n }\n })\n }, [user.addr])\n return (\n \n
\n \n )\n}\n\nexport default Authenticate\n","import styled from 'styled-components'\nimport Header from './app/Header'\nimport Authenticate from './app/Authenticate'\nconst FontWrapper = styled.div`\n font-size: 15px;\n font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC,\n Noto Sans CJK SC, WenQuanYi Micro Hei, sans-serif;\n`\n\nfunction App() {\n return (\n \n \n \n )\n}\n\nexport default App\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n)\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config)\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n )\n })\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n if (installingWorker == null) {\n return\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n )\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration)\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.')\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration)\n }\n }\n }\n }\n }\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type')\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config)\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.')\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister()\n })\n .catch((error) => {\n console.error(error.message)\n })\n }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport './config'\nimport * as serviceWorker from './serviceWorker'\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n)\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister()\n"],"sourceRoot":""}