Commit 8a2babab authored by XieChuanJin's avatar XieChuanJin

完结

parent 0eb658b8
...@@ -39,7 +39,6 @@ ...@@ -39,7 +39,6 @@
<script src="libs/modules/tween/tween.js"></script> <script src="libs/modules/tween/tween.js"></script>
<script src="libs/modules/game/game.min.js"></script> <script src="libs/modules/game/game.min.js"></script>
<script src="libs/modules/promise/promise.js"></script> <script src="libs/modules/promise/promise.js"></script>
<script src="libs/modules/egret/svga.egret.min.js"></script>
<script src="libs/zepto.min.js"></script> <script src="libs/zepto.min.js"></script>
<script src="libs/security.js"></script> <script src="libs/security.js"></script>
<script src="libs/physics.min.js"></script> <script src="libs/physics.min.js"></script>
...@@ -54,6 +53,9 @@ ...@@ -54,6 +53,9 @@
window['guidePrizePlugId'] = 1309; window['guidePrizePlugId'] = 1309;
var projectId = "3"; var projectId = "3";
var strategyId = "strategyId";
var toPlaywayId = "w624c4da9";
var toActionId = "doJoin";
var development = true; var development = true;
var gameId = 1; var gameId = 1;
......
...@@ -4,6 +4,8 @@ import { GConsole } from "../util/GConsole"; ...@@ -4,6 +4,8 @@ import { GConsole } from "../util/GConsole";
import { IData } from '../interface/IData'; import { IData } from '../interface/IData';
import { Data } from '../../tw/data/Data'; import { Data } from '../../tw/data/Data';
import { DataManager } from '../../tw/manager/DataManager'; import { DataManager } from '../../tw/manager/DataManager';
import PanelCtrl from '../../../src/ctrls/PanelCtrl';
export abstract class ABNetManager { export abstract class ABNetManager {
/** /**
* 接口底层错误 * 接口底层错误
...@@ -51,14 +53,15 @@ export abstract class ABNetManager { ...@@ -51,14 +53,15 @@ export abstract class ABNetManager {
}); });
} }
public sendGet(uri: string, param: any, callback: (res: any) => void) { public sendGet(uri: string, param: any, callback: (res: any) => void, pollingCheck?: (res: any) => boolean, pollingCount?: number) {
this.mSend("get", uri, param, callback); this.mSend("get", uri, param, callback, pollingCheck, pollingCount);
} }
public sendPost(uri: string, param: any, callback: (res: any) => void) { public sendPost(uri: string, param: any, callback: (res: any) => void, pollingCheck?: (res: any) => boolean, pollingCount?: number) {
this.mSend("post", uri, param, callback); this.mSend("post", uri, param, callback, pollingCheck, pollingCount);
} }
private mSend(type: string, uri: string, param: any, callback: (res: any) => void) { private mSend(type: string, uri: string, param: any, callback: (res: any) => void, pollingCheck?: (res: any) => boolean, pollingCount?: number) {
uri = uri.replace("{projectId}", window["projectId"].toString()) uri = uri.replace("{projectId}", window["projectId"].toString());
uri = uri.replace("{strategyId}", window["strategyId"].toString());
this.send({ this.send({
name: uri, name: uri,
uri: uri, uri: uri,
...@@ -73,7 +76,9 @@ export abstract class ABNetManager { ...@@ -73,7 +76,9 @@ export abstract class ABNetManager {
console.warn("response", uri, res); console.warn("response", uri, res);
} }
callback(res); callback(res);
} },
pollingCheck: pollingCheck,
pollingCount: pollingCount
}); });
console.log("requset", uri, param); console.log("requset", uri, param);
} }
......
{"options":{"layoutMath":"2","sizeMode":"2n","useExtension":1,"layoutGap":1,"extend":0},"projectName":"ListPage","version":5,"files":["..\\assets\\common\\back.png"]}
\ No newline at end of file
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
{ {
"keys":"not_winning_bg_png,not_winning_examplet_png", "keys":"not_winning_bg_png,not_winning_examplet_png",
"name":"not_winning_panel" "name":"not_winning_panel"
},
{
"keys":"back_png",
"name":"ListPage"
} }
], ],
"resources":[ "resources":[
...@@ -169,6 +173,11 @@ ...@@ -169,6 +173,11 @@
"name":"not_winning_examplet_png", "name":"not_winning_examplet_png",
"type":"image", "type":"image",
"url":"assets/not_winning_panel/not_winning_examplet.png" "url":"assets/not_winning_panel/not_winning_examplet.png"
},
{
"name":"back_png",
"type":"image",
"url":"assets/common/back.png"
} }
] ]
} }
\ No newline at end of file
...@@ -2,15 +2,15 @@ ...@@ -2,15 +2,15 @@
<e:Skin class="ListPageItem" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing"> <e:Skin class="ListPageItem" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing">
<e:Group left="0" right="0" height="150"> <e:Group left="0" right="0" height="150">
<e:Group left="0" top="0" width="150" bottom="0"> <e:Group left="0" top="0" width="150" bottom="0">
<e:Image id="img" source="main_reward0_png" width="100" height="100" scaleX="1" scaleY="1" horizontalCenter="0" verticalCenter="0"/> <e:Image id="img" source="main_reward0_png" width="100" height="100" scaleX="1" scaleY="1" horizontalCenter="0"
verticalCenter="0" />
</e:Group> </e:Group>
<e:Group top="0" bottom="0" left="150" right="100"> <e:Group top="0" bottom="0" left="150" right="100">
<e:Label id="text1" text="华为手机" verticalCenter="0" left="40" textColor="0x6B6B6B"/> <e:Label id="text1" text="华为手机" verticalCenter="0" left="40" textColor="0x6B6B6B" />
</e:Group> </e:Group>
<e:Group width="100" right="0" top="0" bottom="0"> <e:Group width="100" right="0" top="0" bottom="0">
<e:Label text="〉" size="50" scaleX="1" scaleY="1" horizontalCenter="20" verticalCenter="0" textColor="0x282828"/> <e:Image source="back_png" verticalCenter="0" horizontalCenter="0"/>
</e:Group> </e:Group>
<e:Rect left="26" right="26" bottom="0" height="1" fillColor="0xe0e0e0"/> <e:Rect left="26" right="26" bottom="0" height="1" fillColor="0xe0e0e0" />
</e:Group> </e:Group>
</e:Skin> </e:Skin>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<e:Skin class="RewardItem" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing"> <e:Skin class="RewardItem" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing">
<e:Group width="100" height="110"> <e:Group width="100" height="100">
<e:Image source="main_reward_item_bg_png" horizontalCenter="0" verticalCenter="0"/> <e:Image horizontalCenter="0" verticalCenter="0" source="main_reward_item_bg_png"/>
<e:Image id="imgPic" horizontalCenter="0" verticalCenter="0" width="100" height="100" <e:Image id="imgPic" horizontalCenter="0" verticalCenter="0" width="100" height="100"
source="main_reward_item_bg_png" /> source="main_reward_item_bg_png"/>
<e:Label id="labelName" text="华为手机" textColor="0x777777" size="24" bottom="-32" textAlign="center" <e:Label id="labelName" text="华为手机1234566" textColor="0x777777" size="24" bottom="-32" textAlign="center"
horizontalCenter="0" /> horizontalCenter="0" />
</e:Group> </e:Group>
</e:Skin> </e:Skin>
\ No newline at end of file
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</e:Skin> </e:Skin>
</e:skinName> </e:skinName>
</e:Button> </e:Button>
<e:Label text="活动需要消耗9积分参与哦~" x="204" y="376.5" textColor="0x437779" size="30" scaleX="1" scaleY="1"/> <e:Label id="text" text="活动需要消耗9积分参与哦~" x="204" y="376.5" textColor="0x437779" size="30" scaleX="1" scaleY="1"/>
<e:Button id="closeBtn" horizontalCenter="272" verticalCenter="-275.5" x="623" y="581" scaleX="1" scaleY="1"> <e:Button id="closeBtn" horizontalCenter="272" verticalCenter="-275.5" x="623" y="581" scaleX="1" scaleY="1">
<e:skinName> <e:skinName>
<e:Skin states="up,down,disabled"> <e:Skin states="up,down,disabled">
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<e:Skin class="ListPage" width="750" height="1624" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing"> <e:Skin class="ListPage" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing">
<e:Rect width="750" height="1624" fillColor="0xffffff" /> <e:Rect fillColor="0xffffff" left="0" right="0" top="0" bottom="0" />
<e:Group height="100" top="0" right="0" left="0"> <e:Group height="120" top="0" right="0" left="0">
<e:Rect height="2" left="0" right="0" bottom="0" fillColor="0xdddddd" /> <e:Rect height="2" left="0" right="0" bottom="0" fillColor="0xdddddd" />
<e:Label id="title" text="我的奖品" horizontalCenter="0" verticalCenter="0" size="36" fontFamily="Microsoft YaHei" <e:Label id="title" text="我的奖品" horizontalCenter="0" verticalCenter="0" size="36" fontFamily="Microsoft YaHei"
textColor="0x282828" /> textColor="0x282828" />
<e:Button id="btnBack" left="20" width="50" verticalCenter="0"> <e:Button id="btnBack" left="0" width="100" top="0" bottom="0">
<e:skinName> <e:skinName>
<e:Skin> <e:Skin>
<e:Label text="〈" size="50" horizontalCenter="-14" textColor="0x282828" /> <e:Image source="back_png" scaleX="-1" verticalCenter="0" horizontalCenter="0" />
</e:Skin> </e:Skin>
</e:skinName> </e:skinName>
</e:Button> </e:Button>
</e:Group> </e:Group>
<e:Scroller id="scroller" top="120" left="0" bottom="0" right="0"> <e:Scroller id="scroller" top="120" left="0" bottom="0" right="0">
<e:List id="list" itemRendererSkinName="ListPageItem"> <e:List id="list" itemRendererSkinName="ListPageItem"></e:List>
</e:List>
</e:Scroller> </e:Scroller>
</e:Skin> </e:Skin>
\ No newline at end of file
...@@ -14,28 +14,20 @@ ...@@ -14,28 +14,20 @@
</e:Skin> </e:Skin>
</e:skinName> </e:skinName>
</e:Button> </e:Button>
<e:Label id="labelLotteryTime" text="9积分/1次" y="296" size="26" horizontalCenter="0" textAlign="center" /> <e:Label id="costTip" text="" y="296" size="26" horizontalCenter="0" textAlign="center" />
</e:Group> </e:Group>
<e:Group width="670" height="232" x="39.69" y="858.33"> <e:Group width="670" height="232" x="39.69" y="858.33">
<e:Image source="main_reward_area_bg_png" /> <e:Image source="main_reward_area_bg_png" />
<e:Scroller width="574.34" height="150.99" x="49" y="65" anchorOffsetX="0" anchorOffsetY="0"> <e:Scroller width="663" height="150.99" x="2" y="65" anchorOffsetX="0" anchorOffsetY="0">
<e:DataGroup id="rewardArea" itemRendererSkinName="RewardItem" anchorOffsetX="0" anchorOffsetY="0"> <e:DataGroup id="rewardArea" itemRendererSkinName="RewardItem" anchorOffsetX="0" anchorOffsetY="0"
width="621.34" x="-47" y="0">
<e:layout> <e:layout>
<e:HorizontalLayout gap="57" paddingTop="0"/> <e:HorizontalLayout gap="60" paddingLeft="47" />
</e:layout> </e:layout>
<e:ArrayCollection>
<e:Array>
<e:Object test="null"/>
<e:Object test="null"/>
<e:Object test="null"/>
<e:Object test="null"/>
<e:Object test="null"/>
</e:Array>
</e:ArrayCollection>
</e:DataGroup> </e:DataGroup>
</e:Scroller> </e:Scroller>
</e:Group> </e:Group>
<e:Image source="main_foreground_png" touchEnabled="false" visible="false" /> <e:Image source="main_foreground_png" touchEnabled="false" />
<e:Button id="btnRule" label="" width="125" top="30" right="0"> <e:Button id="btnRule" label="" width="125" top="30" right="0">
<e:skinName> <e:skinName>
<e:Skin states="up,down,disabled"> <e:Skin states="up,down,disabled">
...@@ -52,5 +44,5 @@ ...@@ -52,5 +44,5 @@
</e:Skin> </e:Skin>
</e:skinName> </e:skinName>
</e:Button> </e:Button>
<e:Image source="main_example_png" horizontalCenter="0" verticalCenter="0" alpha="0.5" locked="true" visible="false"/> <e:Image source="main_example_png" horizontalCenter="0" verticalCenter="0" alpha="0.5" locked="true" visible="false" />
</e:Skin> </e:Skin>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<e:Skin class="RulePanel" width="750" height="1624" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing"> <e:Skin class="RulePanel" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing">
<w:Config id="16d19576d08" /> <w:Config id="16d19576d08" />
<e:Group width="560" height="600" horizontalCenter="0" verticalCenter="0"> <e:Rect left="0" right="0" top="0" bottom="0" fillAlpha="0.8"/>
<e:Rect left="0" right="0" top="0" bottom="0" fillAlpha="0.9" /> <e:Group height="638" width="560" verticalCenter="-50" horizontalCenter="0" alpha="0.9">
<e:Button id="closeBtn" scaleX="1" scaleY="1" height="50" horizontalCenter="253" verticalCenter="-271" width="50"> <e:Scroller left="50" right="50" top="100" height="450" bounces="false">
<e:Group>
<e:Label id="text"
text="我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。"
textColor="0xcccccc" left="0" right="0" size="30" lineSpacing="20" top="10" width="460" />
</e:Group>
</e:Scroller>
<e:Label id="title" text="活动规则" horizontalCenter="0" top="40" size="40" textAlign="center" textColor="0xcccccc" />
<e:Button id="closeBtn" horizontalCenter="0" verticalCenter="295">
<e:skinName> <e:skinName>
<e:Skin states="up,down,disabled"> <e:Skin states="up,down,disabled">
<e:Label horizontalCenter="0" verticalCenter="0" text="×" size="50" textColor="0xcccccc" scaleX.down="0.9" scaleY.down="0.9" /> <e:Image width="100%" height="100%" source="closeBtn_png" />
<e:Label id="labelDisplay" horizontalCenter="0" verticalCenter="0" />
</e:Skin> </e:Skin>
</e:skinName> </e:skinName>
</e:Button> </e:Button>
<e:Label id="text" text="我是,活动规则是活,动规则我是活动规则我是活动规则我是活动规则,我是活动规则。" left="50" right="50" top="120" bottom="50" textColor="0xcccccc"/>
<e:Label id="title" text="活动规则" horizontalCenter="0" top="40" size="40" textAlign="center" textColor="0xcccccc"/>
</e:Group> </e:Group>
</e:Skin> </e:Skin>
\ No newline at end of file
...@@ -40,16 +40,17 @@ export namespace Decorator { ...@@ -40,16 +40,17 @@ export namespace Decorator {
} }
} }
} }
export function ClassNameSkin(name: string) {
export function ClassNameSkin<T extends { new(...arg: any[]): {} }>(target: T) { return function <T extends { new(...arg: any[]): {} }>(target: T) {
return class extends target { return class extends target {
constructor(...arg: any[]) { constructor(...arg: any[]) {
super(); super();
this["skinName"] = `resource/skins/${super["constructor"]["name"]}.exml`; this["skinName"] = `resource/skins/${name}.exml`;
if (this["skin"]) { if (this["skin"]) {
this["onLoad"] && this["onLoad"](); this["onLoad"] && this["onLoad"]();
} else { } else {
this["addEventListener"](eui.UIEvent.COMPLETE, this["onLoad"] || (() => { }), this); this["addEventListener"](eui.UIEvent.COMPLETE, this["onLoad"] || (() => { }), this);
}
} }
} }
} }
......
...@@ -7,6 +7,6 @@ export default class RewardItem extends MItem { ...@@ -7,6 +7,6 @@ export default class RewardItem extends MItem {
async dataChanged() { async dataChanged() {
this.labelName.text = this.data["name"]; this.labelName.text = this.data["name"];
this.imgPic.texture = await MUtils.loadImage(this.data["icon"]); this.imgPic.source = await MUtils.loadImage(this.data["icon"]);
} }
} }
\ No newline at end of file
export const MUrl = { export const MUrl = {
GetPrizeList: "/projectx/{projectId}/strategyId12138.query", GetPrizeList: "/projectx/{projectId}/{strategyId}.query",
Lottery: "/projectx/{projectId}/w624c4da9/doJoin.do", Lottery: "/projectx/{projectId}/w624c4da9/doJoin.do",
GetLotteryTime: "/projectx/{projectId}/w624c4da9/a47972bc4.do", GetLotteryTime: "/projectx/{projectId}/w624c4da9/a47972bc4.do",
CreditsCost: "/projectx/{projectId}/credits/creditsCost.do", CreditsCost: "/projectx/{projectId}/credits/creditsCost.do",
GetMyPrize: "/projectx/{projectId}/records.query", GetMyPrize: "/projectx/{projectId}/records.query",
QueryPrize: "/projectx/{projectId}/prize.query", QueryPrize: "/projectx/{projectId}/prize.query",
GetPrizeNotCoupons: "/aaw/projectx/takePrize", GetDomain: "/projectx/getDomain.query",
QueryCreditsCost: "/projectx/{projectId}/credits/queryStatus.do",
GetPrizeCoupons: "/aaw/projectx/getCouponInfo", GetPrizeCoupons: "/aaw/projectx/getCouponInfo",
GetDomain: "/projectx/getDomain.query" GetProjectUserInfo: "/ctool/getProjectUserInfo"
} }
\ No newline at end of file
...@@ -13,28 +13,54 @@ export namespace MUtils { ...@@ -13,28 +13,54 @@ export namespace MUtils {
} }
const imageCache: { [key: string]: egret.Texture } = {} const imageCache: { [key: string]: egret.Texture } = {}
const loadImageCache: { [key: string]: egret.ImageLoader } = {}
export function loadImage(url: string) { export function loadImage(url: string) {
if (!url) return; if (!url) {
console.error("empty url");
return;
}
return new Promise<egret.Texture>((resolve) => { return new Promise<egret.Texture>((resolve) => {
if (imageCache[url]) { if (imageCache[url]) {
resolve(imageCache[url]); resolve(imageCache[url]);
return; return;
} }
let imgLoader: egret.ImageLoader = new egret.ImageLoader(); if (loadImageCache[url]) {
imgLoader.once(egret.Event.COMPLETE, (event: egret.Event) => { loadImageCache[url].once(egret.Event.COMPLETE, (event: egret.Event) => {
let loader: egret.ImageLoader = event.currentTarget; if (imageCache[url]) {
let texture = new egret.Texture(); resolve(imageCache[url]);
texture.bitmapData = loader.data; } else {
imageCache[url] = texture; console.error("get image cache fail");
resolve(texture); }
}, this); }, this);
imgLoader.load(url); } else {
console.warn(url); let imgLoader: egret.ImageLoader = new egret.ImageLoader();
imgLoader.once(egret.Event.COMPLETE, (event: egret.Event) => {
let loader: egret.ImageLoader = event.currentTarget;
let texture = new egret.Texture();
texture.bitmapData = loader.data;
imageCache[url] = texture;
resolve(texture);
}, this);
imgLoader.load(url);
loadImageCache[url] = imgLoader;
}
}); });
} }
let domain: string = null; /* function loadRemoteImage(url: string, callback: (tex: egret.Texture) => void) {
let imgLoader: egret.ImageLoader = new egret.ImageLoader();
imgLoader.once(egret.Event.COMPLETE, (event: egret.Event) => {
let loader: egret.ImageLoader = event.currentTarget;
let texture = new egret.Texture();
texture.bitmapData = loader.data;
callback(texture);
}, this);
imgLoader.load(url);
} */
export function getDomain() { export function getDomain() {
return new Promise<string>((resolve) => { return new Promise<string>((resolve) => {
if (!this.domain) { if (!this.domain) {
...@@ -46,4 +72,20 @@ export namespace MUtils { ...@@ -46,4 +72,20 @@ export namespace MUtils {
resolve(this.domain); resolve(this.domain);
}); });
} }
/* export function setItemImage(image: eui.Image, url: string) {
if (imageCache[url]) {
image.texture = imageCache[url];
} else {
loadRemoteImage(url, (tex) => {
imageCache[url] = tex;
image.texture = tex;
});
}
} */
export function jumpLink(url: string) {
window.location.href = url;
localStorage.setItem("jumpLink", "true");
}
} }
\ No newline at end of file
...@@ -42,6 +42,7 @@ class Main extends eui.UILayer { ...@@ -42,6 +42,7 @@ class Main extends eui.UILayer {
private async loadResource() { private async loadResource() {
try { try {
await RES.loadConfig("default.res.json", getResPath() + "resource/"); await RES.loadConfig("default.res.json", getResPath() + "resource/");
await RES.loadGroup("ListPage");
await this.loadTheme(); await this.loadTheme();
} }
catch (e) { catch (e) {
......
import Panel from "../views/Panel"; import Panel from "../views/Panel";
import { Decorator } from "../Decorator/Decorator";
abstract class CommonPanel extends Panel { abstract class CommonPanel extends Panel {
public btnOk: eui.Button; public btnOk: eui.Button;
...@@ -11,6 +12,6 @@ abstract class CommonPanel extends Panel { ...@@ -11,6 +12,6 @@ abstract class CommonPanel extends Panel {
} }
} }
export class LackPointPanel extends CommonPanel { } export class LackPointPanel extends CommonPanel { public get skinKey() { return 'LackPointPanel' } }
export class TimeRunOutPanel extends CommonPanel { } export class TimeRunOutPanel extends CommonPanel { public get skinKey() { return 'TimeRunOutPanel' }}
export class NotWinningPanel extends CommonPanel { } export class NotWinningPanel extends CommonPanel { public get skinKey() { return 'NotWinningPanel' }}
\ No newline at end of file \ No newline at end of file
...@@ -2,18 +2,48 @@ import Panel from "../views/Panel"; ...@@ -2,18 +2,48 @@ import Panel from "../views/Panel";
import { NetManager } from "../../libs/tw/manager/NetManager"; import { NetManager } from "../../libs/tw/manager/NetManager";
import MainScene from "../Scene/MainScene"; import MainScene from "../Scene/MainScene";
import { MUrl } from "../MConst"; import { MUrl } from "../MConst";
import PanelCtrl from "../ctrls/PanelCtrl";
import ToastPanel from "../components/ToastPanel";
import Loading from "../loading/Loading";
export default class CostTipPanel extends Panel { export default class CostTipPanel extends Panel {
public get skinKey() { return 'CostTipPanel' }
public text: eui.Label;
public btnOk: eui.Button; public btnOk: eui.Button;
onSkinComplete() {
private mainScene: MainScene = null;
async onSkinComplete() {
super.onSkinComplete(); super.onSkinComplete();
this.mainScene = this.data["mainScene"] as MainScene;
this.text.text = `活动需要消耗${await this.mainScene.getLotteryCost()}参与哦~`;
this.btnOk.onTap(this, () => { this.btnOk.onTap(this, () => {
NetManager.ins.sendPost(MUrl.CreditsCost, { NetManager.ins.sendPost(MUrl.CreditsCost, {
toPlaywayId: "w624c4da9", toPlaywayId: window["toPlaywayId"],
toActionId: "doJoin" toActionId: window["toActionId"]
}, (response) => { }, (response) => {
this.hidePanel(); this.hidePanel();
(this.data["mainScene"] as MainScene).lottery({ ticketNum: response["data"]["ticketNum"] }); let ticketNum = response["data"];
Loading.instace.show();
NetManager.ins.sendPost(MUrl.QueryCreditsCost, { ticketNum: ticketNum }, (res) => {
Loading.instace.show();
if (res["data"] == 1) {
this.mainScene.lottery({ ticketNum: ticketNum });
} else {
PanelCtrl.instance.show(ToastPanel, { msg: "积分不足" });
}
}, (res): boolean => {
switch (res["data"]) {
case 0:
return true;
case 1:
case 2:
return false;
default:
console.error("invalid state code");
break;
}
}, 10);
}); });
}); });
} }
......
import { Decorator } from "../Decorator/Decorator"; import { Decorator } from "../Decorator/Decorator";
@Decorator.ClassNameSkin @Decorator.ClassNameSkin("RulePanel")
export default class RulePanel extends eui.Component { export default class RulePanel extends eui.Component {
public closeBtn: eui.Button; public closeBtn: eui.Button;
constructor() {
super();
// this.horizontalCenter = 0;
// this.verticalCenter = 0;
this.top = 0
this.left = 0
this.right = 0
this.bottom = 0;
}
onLoad() { onLoad() {
this.closeBtn.onTap(this,this.destroy); this.closeBtn.onTap(this, this.destroy);
}
destroy() {
this.parent.visible = false;
super.destroy();
} }
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ import { MUtils } from "../MUtils"; ...@@ -3,6 +3,7 @@ import { MUtils } from "../MUtils";
import { Decorator } from "../Decorator/Decorator"; import { Decorator } from "../Decorator/Decorator";
import { NetManager } from "../../libs/tw/manager/NetManager"; import { NetManager } from "../../libs/tw/manager/NetManager";
import { MUrl } from "../MConst"; import { MUrl } from "../MConst";
import Loading from "../loading/Loading";
export default class WinningPanel extends Panel { export default class WinningPanel extends Panel {
public get skinKey() { return "WinningPanel" } public get skinKey() { return "WinningPanel" }
...@@ -12,27 +13,29 @@ export default class WinningPanel extends Panel { ...@@ -12,27 +13,29 @@ export default class WinningPanel extends Panel {
public btnReceive: eui.Button; public btnReceive: eui.Button;
public imgPrize: eui.Image; public imgPrize: eui.Image;
private prizeData = null;
async onSkinComplete() { async onSkinComplete() {
super.onSkinComplete(); super.onSkinComplete();
this.prizeData = this.data["prizeData"];
this.btnReceive.onTap(this, () => { let queryPrizeData = this.data["queryPrizeData"];
console.error(this.data); this.labelCommodity.text = queryPrizeData["name"];
if (this.data["prizeType"] == "coupon") { this.imgPrize.texture = await MUtils.loadImage(queryPrizeData["icon"]);
NetManager.ins.sendGet(MUrl.GetPrizeCoupons, { projectOrderNo: this.prizeData["userRecordId"] }, (res) => {
window.location.href = res["data"]["openUrl"]; this.btnReceive.onTap(this, async () => {
this.hidePanel(); let domain = await MUtils.getDomain();
}); if (queryPrizeData["refType"] != "coupon") {
localStorage.setItem("jumpLink", "true");
MUtils.jumpLink(domain + "/aaw/projectx/takePrize?projectOrderNo=" + this.data["userRecordId"]);
} else { } else {
NetManager.ins.sendGet(MUrl.GetPrizeNotCoupons, { projectOrderNo: this.prizeData["userRecordId"] }, (res) => { Loading.instace.show();
window.location.href = res["data"]; NetManager.ins.sendGet(MUrl.GetPrizeCoupons, { projectOrderNo: this.data["userRecordId"] }, (res) => {
this.hidePanel(); localStorage.setItem("jumpLink", "true");
}); MUtils.jumpLink(res["data"]["link"]);
Loading.instace.hide();
}, (res) => {
return !(res["code"] == "0000000000");
}, 10);
} }
}); });
this.labelCommodity.text = this.prizeData["name"];
this.imgPrize.texture = await MUtils.loadImage(this.prizeData["icon"]);
} }
} }
\ No newline at end of file
...@@ -11,6 +11,10 @@ import { UIManager } from "../Mgr/UIManager"; ...@@ -11,6 +11,10 @@ import { UIManager } from "../Mgr/UIManager";
import RulePanel from "../Panel/RulePanel"; import RulePanel from "../Panel/RulePanel";
import { MUtils } from "../MUtils"; import { MUtils } from "../MUtils";
import ToastPanel from "../components/ToastPanel"; import ToastPanel from "../components/ToastPanel";
import { DataManager } from "../../libs/tw/manager/DataManager";
import Loading from "../loading/Loading";
import layers from "../views/layers";
import { Data } from "../../libs/tw/data/Data";
const prizeIdKey = "prizeId"; const prizeIdKey = "prizeId";
...@@ -19,18 +23,50 @@ export default class MainScene extends Scene { ...@@ -19,18 +23,50 @@ export default class MainScene extends Scene {
public rewardArea: eui.DataGroup; public rewardArea: eui.DataGroup;
public btnRule: eui.Button; public btnRule: eui.Button;
public btnMyReward: eui.Button; public btnMyReward: eui.Button;
public labelLotteryTime: eui.Label; public costTip: eui.Label;
public get skinKey() { return "MainScene"; }
private myUILayer: eui.UILayer = null;
private readonly projectxString: string = "projectx/";
private getProjectId() {
let windowUrl = window.location.href;
let splitArr = windowUrl.split(this.projectxString);
if (splitArr.length != 2) {
console.error("get " + this.projectxString + " fail");
return;
}
let start = windowUrl.indexOf(this.projectxString) + this.projectxString.length;
let end = splitArr[1].indexOf("/");
window["projectId"] = windowUrl.substr(start, end);
}
onSkinComplete() { onSkinComplete() {
super.onSkinComplete(); super.onSkinComplete();
this.getProjectId();
this.myUILayer = layers.myLayer;
this.myUILayer.visible = false;
this.btnLottery.onTap(this, this.onClickBtnLottery); this.btnLottery.onTap(this, this.onClickBtnLottery);
this.btnMyReward.onTap(this, this.openMyReward); this.btnMyReward.onTap(this, this.openMyReward);
this.btnRule.onTap(this, () => { this.btnRule.onTap(this, () => {
UIManager.stage.addChild(new RulePanel()); this.myUILayer.addChild(new RulePanel());
this.myUILayer.visible = true;
}); });
this.rewardShow(); this.rewardShow();
this.updateLotteryTime(); this.updateLotteryTime();
if (localStorage.getItem("jumpLink") != "true") {
this.getLotteryTime((time) => {
if (time > 0) {
PanelCtrl.instance.show(ToastPanel, { msg: `恭喜你,获得${time}次免费抽奖机会` });
}
});
} else {
localStorage.removeItem("jumpLink");
}
} }
/** /**
...@@ -38,6 +74,7 @@ export default class MainScene extends Scene { ...@@ -38,6 +74,7 @@ export default class MainScene extends Scene {
*/ */
private rewardShow() { private rewardShow() {
this.rewardArea.itemRenderer = RewardItem; this.rewardArea.itemRenderer = RewardItem;
NetManager.ins.sendGet(MUrl.GetPrizeList, undefined, (res) => { NetManager.ins.sendGet(MUrl.GetPrizeList, undefined, (res) => {
let list = res["data"] as Array<object>; let list = res["data"] as Array<object>;
//创建奖品展示item //创建奖品展示item
...@@ -57,7 +94,8 @@ export default class MainScene extends Scene { ...@@ -57,7 +94,8 @@ export default class MainScene extends Scene {
*/ */
private openMyReward() { private openMyReward() {
//创建ListPage并添加到舞台 //创建ListPage并添加到舞台
UIManager.stage.addChild(new class extends ListPage { this.myUILayer.visible = true;
this.myUILayer.addChild(new class extends ListPage {
//重写方法以加载数据 //重写方法以加载数据
loadMore(array: any[]) { loadMore(array: any[]) {
//请求获取我的奖品 //请求获取我的奖品
...@@ -70,7 +108,17 @@ export default class MainScene extends Scene { ...@@ -70,7 +108,17 @@ export default class MainScene extends Scene {
onTap: async () => { //点击item后响应的操作 onTap: async () => { //点击item后响应的操作
//获取域名 //获取域名
let domain = await MUtils.getDomain(); let domain = await MUtils.getDomain();
window.location.href = domain + "/aaw/projectx/takePrize?projectOrderNo=" + i["id"]; if (i["extra"]["refType"] != "coupon") {
MUtils.jumpLink(domain + "/aaw/projectx/takePrize?projectOrderNo=" + i["id"])
} else {
Loading.instace.show();
NetManager.ins.sendGet(MUrl.GetPrizeCoupons, { projectOrderNo: i["id"] }, (res) => {
MUtils.jumpLink(res["data"]["link"]);
Loading.instace.hide();
}, (res) => {
return !(res["code"] == "0000000000");
}, 10);
}
} }
}); });
} }
...@@ -87,11 +135,11 @@ export default class MainScene extends Scene { ...@@ -87,11 +135,11 @@ export default class MainScene extends Scene {
* 更新剩余免费抽奖次数 * 更新剩余免费抽奖次数
*/ */
private updateLotteryTime() { private updateLotteryTime() {
this.getLotteryTime((lotteryTime) => { this.getLotteryTime(async (lotteryTime) => {
if (lotteryTime > 0) { if (lotteryTime > 0) {
this.labelLotteryTime.text = `恭喜你,获得${lotteryTime}次免费抽奖机会`; this.costTip.text = `今日免费抽奖:${lotteryTime}`;
} else { } else {
this.labelLotteryTime.text = "9积分/1次"; this.costTip.text = await this.getLotteryCost() + "/次";
} }
}); });
} }
...@@ -103,20 +151,19 @@ export default class MainScene extends Scene { ...@@ -103,20 +151,19 @@ export default class MainScene extends Scene {
public lottery(param: object = {}) { public lottery(param: object = {}) {
NetManager.ins.sendGet(MUrl.Lottery, param, (res) => { NetManager.ins.sendGet(MUrl.Lottery, param, (res) => {
if (!res["success"] || res["success"] == "false") { if (!res["success"] || res["success"] == "false") {
PanelCtrl.instance.show(ToastPanel, { msg: res["code"] }); PanelCtrl.instance.show(ToastPanel, { msg: res["message"] });
return; return;
} }
let prizeType = res["data"]["prizeType"]; let lotteryPrizeId = res["data"]["prizeId"];
NetManager.ins.sendGet(MUrl.QueryPrize, { ids: res["data"][prizeIdKey] }, (res) => { let userRecordId = res["data"]["userRecordId"];
let prize = res["data"][0]; if (lotteryPrizeId == "thanks") {
if (prizeType == "thanks") { PanelCtrl.instance.show(NotWinningPanel);
PanelCtrl.instance.show(NotWinningPanel); } else {
} else { NetManager.ins.sendGet(MUrl.QueryPrize, { ids: lotteryPrizeId }, async (res) => {
PanelCtrl.instance.show(WinningPanel, { prizeData: prize, prizeType: prizeType }); PanelCtrl.instance.show(WinningPanel, { queryPrizeData: res["data"][0], userRecordId: userRecordId });
} });
}); }
this.updateLotteryTime(); this.updateLotteryTime();
}); });
} }
...@@ -131,12 +178,22 @@ export default class MainScene extends Scene { ...@@ -131,12 +178,22 @@ export default class MainScene extends Scene {
}); });
} }
public getLotteryCost() {
return new Promise<string>((resolve) => {
NetManager.ins.sendGet(MUrl.GetProjectUserInfo, undefined, (res) => {
this.getLotteryTime((p1, credits) => {
resolve(`${credits}${res["data"]["unitName"]}`);
});
});
})
}
/** /**
* 获取免费抽奖次数 * 获取免费抽奖次数
*/ */
private getLotteryTime(callback: (lotteryTime: number) => void) { private getLotteryTime(callback: (lotteryTime: number, credits: number) => void) {
NetManager.ins.sendGet(MUrl.GetLotteryTime, undefined, (response) => { NetManager.ins.sendGet(MUrl.GetLotteryTime, undefined, (response) => {
callback(response["data"]); callback(response["data"]["remainTime"], response["data"]["credits"]);
}); });
} }
} }
...@@ -47,7 +47,7 @@ export default class ComponentBase extends eui.Component { ...@@ -47,7 +47,7 @@ export default class ComponentBase extends eui.Component {
this.skinName = getSkinPath(this.skinKey); this.skinName = getSkinPath(this.skinKey);
} }
public get skinKey() { return this["constructor"]["name"]; } public get skinKey() { return null; }
//获取资源组名字 //获取资源组名字
public get groupName() { return null } public get groupName() { return null }
......
import { Decorator } from "../Decorator/Decorator"; import { Decorator } from "../Decorator/Decorator";
import { MUtils } from "../MUtils"; import { MUtils } from "../MUtils";
@Decorator.ClassNameSkin @Decorator.ClassNameSkin("ListPage")
export default class ListPage extends eui.Component { export default class ListPage extends eui.Component {
public title: eui.Label; public title: eui.Label;
public btnBack: eui.Button; public btnBack: eui.Button;
...@@ -9,6 +9,15 @@ export default class ListPage extends eui.Component { ...@@ -9,6 +9,15 @@ export default class ListPage extends eui.Component {
public scroller: eui.Scroller; public scroller: eui.Scroller;
public readonly scrollDistanceToLoadMore = 200; public readonly scrollDistanceToLoadMore = 200;
private loadFinish = true;
constructor() {
super();
this.top = 0;
this.left = 0;
this.right = 0;
this.bottom = 0;
}
public loadMore(dataArray: any[]) { } public loadMore(dataArray: any[]) { }
...@@ -24,13 +33,15 @@ export default class ListPage extends eui.Component { ...@@ -24,13 +33,15 @@ export default class ListPage extends eui.Component {
private isLoadingMore = false; private isLoadingMore = false;
onLoad() { onLoad() {
this.title.text = "你的奖品"; // this.title.text = "你的奖品";
this.btnBack.onTap(this, () => { this.btnBack.onTap(this, () => {
//TODO
this.parent.visible = false;
this.destroy(); this.destroy();
}); });
this.scroller.addEventListener(egret.Event.CHANGE, () => { this.scroller.addEventListener(egret.Event.CHANGE, () => {
if (!this.isLoadingMore && (this.scroller.viewport.scrollV + this.scroller.height) >= (this.scroller.viewport.contentHeight - this.scrollDistanceToLoadMore)) { if (!this.loadFinish && !this.isLoadingMore && (this.scroller.viewport.scrollV + this.scroller.height) >= (this.scroller.viewport.contentHeight - this.scrollDistanceToLoadMore)) {
this.isLoadingMore = true; this.isLoadingMore = true;
this.onLoadMore(); this.onLoadMore();
} }
...@@ -49,8 +60,7 @@ export default class ListPage extends eui.Component { ...@@ -49,8 +60,7 @@ export default class ListPage extends eui.Component {
async dataChanged() { async dataChanged() {
this.onTap(this, this.data.onTap); this.onTap(this, this.data.onTap);
this.text1.text = this.data.text1; this.text1.text = this.data.text1;
this.img.texture = await MUtils.loadImage(this.data.imageUrl); this.img.source = await MUtils.loadImage(this.data.imageUrl);
this.validateNow();
} }
} }
......
...@@ -13,7 +13,7 @@ export default class PanelCtrl { ...@@ -13,7 +13,7 @@ export default class PanelCtrl {
this._parent = parent; this._parent = parent;
} }
show(type: any, data?:any, hasMask: boolean = true, time: number = 2500) { show(type: any, data?: any, hasMask: boolean = true, time: number = 2500) {
const cls = type; const cls = type;
Loading.instace.show(); Loading.instace.show();
const panel: Panel = new cls(data, hasMask, time); const panel: Panel = new cls(data, hasMask, time);
......
class Layers extends eui.UILayer { class Layers extends eui.UILayer {
private _topLayer: eui.UILayer; private _topLayer: eui.UILayer;
private _popupLayer: eui.UILayer; private _popupLayer: eui.UILayer;
private _sceneLayer: eui.UILayer; private _sceneLayer: eui.UILayer;
public myLayer: eui.UILayer;
init(root: eui.UILayer) { init(root: eui.UILayer) {
root.addChild(this); root.addChild(this);
this._topLayer = new eui.UILayer(); this._topLayer = new eui.UILayer();
this._popupLayer = new eui.UILayer(); this._popupLayer = new eui.UILayer();
this._sceneLayer = new eui.UILayer(); this._sceneLayer = new eui.UILayer();
this.myLayer = new eui.UILayer();
this.addChild(this._sceneLayer); this.addChild(this._sceneLayer);
this.addChild(this._popupLayer); this.addChild(this._popupLayer);
this.addChild(this.myLayer);
this.addChild(this._topLayer); this.addChild(this._topLayer);
this._popupLayer.visible = false; this._popupLayer.visible = false;
this._topLayer.visible = false; this._topLayer.visible = false;
// this._sceneLayer.percentHeight = 100; // this._sceneLayer.percentHeight = 100;
} }
......
...@@ -9,7 +9,7 @@ const config = { ...@@ -9,7 +9,7 @@ const config = {
"/projectx/{projectId}/credits/creditsCost.do": { "/projectx/{projectId}/credits/creditsCost.do": {
data: "CreditsCost" data: "CreditsCost"
}, },
"/projectx/{projectId}/strategyId12138.query": { "/projectx/{projectId}/strategyId.query": {
data: "GetPrizeList" data: "GetPrizeList"
}, },
"/projectx/{projectId}/records.query": { "/projectx/{projectId}/records.query": {
...@@ -26,15 +26,18 @@ const config = { ...@@ -26,15 +26,18 @@ const config = {
}, },
"/projectx/getDomain.query": { "/projectx/getDomain.query": {
data: "GetDomain" data: "GetDomain"
},
"/projectx/{projectId}/credits/queryStatus.query": {
data: "QueryCreditsCost"
} }
} }
let peojextId = "3"; let projectId = "3";
for (let item in config) { for (let item in config) {
if (config.hasOwnProperty(item)) { if (config.hasOwnProperty(item)) {
if (item.indexOf("{projectId}") != -1) { if (item.indexOf("{projectId}") != -1) {
let newKey = item.replace("{projectId}", peojextId); let newKey = item.replace("{projectId}", projectId);
config[newKey] = config[item]; config[newKey] = config[item];
delete config[item]; delete config[item];
item = newKey; item = newKey;
......
{ {
"success": false, "success": true,
"message": "", "message": "",
"code": "无免费次数", "code": "",
"data": { "data": {
"optionId": "r2324", "optionId": "r2324",
"prizeId": "ga58ef339", "prizeId": "1111111",
"prizeType": "thanks", "prizeType": "",
"userRecordId": 343, "userRecordId": 343,
"url": "" "url": ""
} }
......
{
"success": true,
"data": {
"state": 1
}
}
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"id": "g42b074e4", "id": "g42b074e4",
"name": "实物111", "name": "实物111",
"refId": "49356", "refId": "49356",
"refType": "object", "refType": "coupon",
"stock": 100, "stock": 100,
"type": 2 "type": 2
} }
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
"success": "true", "success": "true",
"message": "", "message": "",
"code": "", "code": "",
"data": 5 "data": 0
} }
\ No newline at end of file
<html>
<head>
<meta charset="utf-8">
<title>永辉种红包分享页</title>
<meta name="viewport"
content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="full-screen" content="true">
<meta name="screen-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="360-fullscreen" content="true">
<script>var __startTime__ = Date.now()</script>
</head>
<body>
<div style="margin: auto; width: 100%; height: 100%; overflow: hidden; position: absolute;" class="egret-player"
data-entry-class="Main" data-orientation="auto" data-scale-mode="showAll" data-frame-rate="60"
data-content-width="750" data-content-height="1624" data-multi-fingered="2" data-show-fps="false"
data-show-log="false" data-show-fps-style="x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9">
<canvas width="376" height="668"
style="cursor: inherit; position: absolute; top: -0.5px; bottom: 0px; left: -0.5px; right: 0px; transform-origin: 0% 0% 0px; transform: matrix(1, 0, 0, 1, 0, 0);"></canvas>
<div id="StageDelegateDiv"
style="position: absolute; left: -0.5px; top: -0.5px; border: none; padding: 0px; transform: matrix(1, 0, 0, 1, 0, 0); transform-origin: 0% 0% 0px;">
<div
style="position: absolute; left: 0px; top: -100px; border: none; padding: 0px; width: 0px; height: 0px; transform-origin: 0% 0% 0px;">
<textarea id="egretTextarea" tabindex="-1"
style="resize: none; width: 1px; height: 12px; position: absolute; left: 0px; top: 0px; border: none; padding: 0px; outline: thin; background: none; overflow: hidden; word-break: break-all; opacity: 0;"></textarea><input
id="egretInput" type="text" tabindex="-1"
style="width: 1px; height: 12px; position: absolute; left: 0px; top: 0px; border: none; padding: 0px; outline: thin; background: none; overflow: hidden; word-break: break-all; opacity: 0;">
</div>
</div>
</div>
<style>
html,
body {
-ms-touch-action: none;
background-repeat: no-repeat;
background-color: #ffffff;
background-size: 100%;
background-position: center;
padding: 0;
border: 0;
margin: 0;
height: 100%;
}
*:focus {
outline: none
}
* {
margin: 0;
padding: 0;
}
</style>
<script>
//资源路径
var projectId = "3";
var strategyId = "strategyId";
var toPlaywayId = "w624c4da9";
var toActionId = "doJoin";
var resPath = "https://yun.duiba.com.cn/db_games/activity/yangggou_yunji/1568102134/";
//record
var recordUrl = "/crecord/record";
function resolve(a) {
var b = eval(a);
return b;
}
</script>
<script crossorigin="anonymous" src="//yun.duiba.com.cn/db_games/lib2_game.min.js"></script>
<script crossorigin="anonymous" src="//yun.duiba.com.cn/db_games/howler.min.js"></script>
<script crossorigin="anonymous"
src="//yun.duiba.com.cn/db_games/activity/yangggou_yunji/1568102134/resource/default.thm.js"></script>
<script crossorigin="anonymous"
src="//yun.duiba.com.cn/db_games/activity/yangggou_yunji/1568103385/output.js"></script>
<script>
egret.ImageLoader.crossOrigin = "anonymous";
/**
* {
* "renderMode":, //Engine rendering mode, "canvas" or "webgl"
* "audioType": 0 //Use the audio type, 0: default, 2: web audio, 3: audio
* "antialias": //Whether the anti-aliasing is enabled in WebGL mode, true: on, false: off, defaults to false
* "calculateCanvasScaleFactor": //a function return canvas scale factor
* }
**/
egret.runEgret({
renderMode: "webgl", audioType: 0, calculateCanvasScaleFactor: function (context) {
var backingStore = context.backingStorePixelRatio ||
context.webkitBackingStorePixelRatio ||
context.mozBackingStorePixelRatio ||
context.msBackingStorePixelRatio ||
context.oBackingStorePixelRatio ||
context.backingStorePixelRatio || 1;
return (window.devicePixelRatio || 1) / backingStore;
}
});
</script>
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
</script>
</body>
</html>
\ No newline at end of file
angular.module('finance2', [])
.factory('currencyConverter', function () {
var currencies = ['USD', 'EUR', 'CNY'],
usdToForeignRates = {
USD: 1,
EUR: 0.74,
CNY: 6.09
};
return {
currencies: currencies,
convert: convert
};
function convert(amount, inCurr, outCurr) {
return amount * usdToForeignRates[outCurr] * 1 / usdToForeignRates[inCurr];
}
});
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment