Skip to content

Commit 9e3e7e0

Browse files
committed
feat: multi-tokenscript improvements WIP
- Add styled cards for selector dialog - Implement new resolver cache - Add script selector to viewer-popover
1 parent 4e2a2a9 commit 9e3e7e0

File tree

8 files changed

+55
-14
lines changed

8 files changed

+55
-14
lines changed

javascript/engine-js/src/Engine.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,15 @@ export class TokenScriptEngine {
126126

127127
/**
128128
* Create a new TokenScript instance from a repo source
129-
* @param tsId The unique identifier for the TokenScript file
129+
* @param sourceId The unique identifier for the TokenScript file
130130
* @param viewBinding The view binding implementation to be used for this TokenScript
131131
* @param forceRefresh Bypass cache and re-resolve the TokenScript XML
132132
*/
133-
public async getTokenScript(tsId: string, viewBinding?: IViewBinding, forceRefresh?: true){
133+
public async getTokenScript(sourceId: string, viewBinding?: IViewBinding, forceRefresh?: true){
134134

135-
const resolveResult = await this.repo.getTokenScript(tsId, forceRefresh);
135+
const resolveResult = await this.repo.getTokenScript(sourceId, forceRefresh);
136136

137-
return await this.initializeTokenScriptObject(resolveResult.xml, resolveResult.type, tsId, resolveResult.sourceUrl, resolveResult, viewBinding);
137+
return await this.initializeTokenScriptObject(resolveResult.xml, resolveResult.type, resolveResult.sourceId, resolveResult.sourceUrl, resolveResult, viewBinding);
138138
}
139139

140140
/**
@@ -197,6 +197,7 @@ export class TokenScriptEngine {
197197
parser = new DOMParser();
198198
}
199199
let tokenXml = parser.parseFromString(xml,"text/xml");
200+
200201
return new TokenScript(this, tokenXml, xml, source, sourceId, sourceUrl, scriptInfo, viewBinding);
201202
} catch (e){
202203
throw new Error("Failed to parse tokenscript definition: " + e.message);

javascript/engine-js/src/TokenScript.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export class TokenScript {
122122
public getSourceInfo(){
123123
return {
124124
// TODO: Use better UID for non-resolved tokenscripts
125-
tsId: this.sourceId ?? this.getName(),
125+
tsId: this.sourceId + (this.scriptInfo.scriptId ? '-' + this.scriptInfo.scriptId : '') ?? this.getName(),
126126
source: this.source,
127127
sourceUrl: this.sourceUrl,
128128
scriptInfo: this.scriptInfo

javascript/engine-js/src/repo/Repo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class Repo {
5959
* @param tsPath
6060
* @param forceRefresh
6161
*/
62-
public async resolveAllScripts(tsPath: string, forceRefresh = false){
62+
public async resolveAllScripts(tsPath: string, forceRefresh = false): Promise<ScriptInfo[]> {
6363

6464
if (!forceRefresh && this.scriptLookupCache[tsPath] && (Date.now() < this.scriptLookupCache[tsPath].timestamp + (Repo.REPO_TTL * 1000)))
6565
return this.scriptLookupCache[tsPath].scripts;

javascript/engine-js/src/repo/sources/ScriptURI.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class ScriptURI implements SourceInterface {
3434
icon: tokenScript.getMetadata().iconUrl,
3535
order: 0,
3636
authenticated: true,
37-
sourceId: tsPath,
37+
sourceId: chain + "-" + contractAddr,
3838
scriptId: "5169_" + tokenScript.getName(),
3939
sourceUrl: uri,
4040
type: ScriptSourceType.SCRIPT_URI

javascript/tokenscript-viewer/src/components.d.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { JSX } from "@stencil/core";
1414
import { TokenScript as TokenScript1 } from "@tokenscript/engine-js/src/TokenScript";
1515
import { IntegrationViewer } from "./components/viewers/integration/integration-viewer";
1616
import { ITxValidationInfo } from "../../engine-js/src/security/TransactionValidator";
17+
import { TokenScript as TokenScript2 } from "@tokenscript/engine-js/dist/lib.esm/TokenScript";
1718
import { ScriptInfo } from "@tokenscript/engine-js/src/repo/sources/SourceInterface";
1819
import { Card } from "@tokenscript/engine-js/src/tokenScript/Card";
1920
import { TabbedViewer } from "./components/viewers/tabbed/tabbed-viewer";
@@ -29,6 +30,7 @@ export { JSX } from "@stencil/core";
2930
export { TokenScript as TokenScript1 } from "@tokenscript/engine-js/src/TokenScript";
3031
export { IntegrationViewer } from "./components/viewers/integration/integration-viewer";
3132
export { ITxValidationInfo } from "../../engine-js/src/security/TransactionValidator";
33+
export { TokenScript as TokenScript2 } from "@tokenscript/engine-js/dist/lib.esm/TokenScript";
3234
export { ScriptInfo } from "@tokenscript/engine-js/src/repo/sources/SourceInterface";
3335
export { Card } from "@tokenscript/engine-js/src/tokenScript/Card";
3436
export { TabbedViewer } from "./components/viewers/tabbed/tabbed-viewer";
@@ -106,6 +108,9 @@ export namespace Components {
106108
interface OpenseaViewer {
107109
"app": AppRoot;
108110
}
111+
interface OtherTappsButton {
112+
"tokenScript": TokenScript2;
113+
}
109114
interface PopoverDialog {
110115
"closeDialog": () => Promise<void>;
111116
"dialogClasses": string[];
@@ -485,6 +490,12 @@ declare global {
485490
prototype: HTMLOpenseaViewerElement;
486491
new (): HTMLOpenseaViewerElement;
487492
};
493+
interface HTMLOtherTappsButtonElement extends Components.OtherTappsButton, HTMLStencilElement {
494+
}
495+
var HTMLOtherTappsButtonElement: {
496+
prototype: HTMLOtherTappsButtonElement;
497+
new (): HTMLOtherTappsButtonElement;
498+
};
488499
interface HTMLPopoverDialogElement extends Components.PopoverDialog, HTMLStencilElement {
489500
}
490501
var HTMLPopoverDialogElement: {
@@ -684,6 +695,7 @@ declare global {
684695
"showToast": ShowToastEventArgs;
685696
"showLoader": void;
686697
"hideLoader": void;
698+
"showScriptSelector": ScriptInfo[];
687699
}
688700
interface HTMLViewerPopoverElement extends Components.ViewerPopover, HTMLStencilElement {
689701
addEventListener<K extends keyof HTMLViewerPopoverElementEventMap>(type: K, listener: (this: HTMLViewerPopoverElement, ev: ViewerPopoverCustomEvent<HTMLViewerPopoverElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
@@ -748,6 +760,7 @@ declare global {
748760
"mooar-viewer": HTMLMooarViewerElement;
749761
"new-viewer": HTMLNewViewerElement;
750762
"opensea-viewer": HTMLOpenseaViewerElement;
763+
"other-tapps-button": HTMLOtherTappsButtonElement;
751764
"popover-dialog": HTMLPopoverDialogElement;
752765
"script-select-dialog": HTMLScriptSelectDialogElement;
753766
"security-status": HTMLSecurityStatusElement;
@@ -854,6 +867,9 @@ declare namespace LocalJSX {
854867
"onShowLoader"?: (event: OpenseaViewerCustomEvent<void>) => void;
855868
"onShowToast"?: (event: OpenseaViewerCustomEvent<ShowToastEventArgs>) => void;
856869
}
870+
interface OtherTappsButton {
871+
"tokenScript"?: TokenScript2;
872+
}
857873
interface PopoverDialog {
858874
"dialogClasses"?: string[];
859875
"dialogStyles"?: {[cssProp: string]: string};
@@ -967,6 +983,7 @@ declare namespace LocalJSX {
967983
interface ViewerPopover {
968984
"onHideLoader"?: (event: ViewerPopoverCustomEvent<void>) => void;
969985
"onShowLoader"?: (event: ViewerPopoverCustomEvent<void>) => void;
986+
"onShowScriptSelector"?: (event: ViewerPopoverCustomEvent<ScriptInfo[]>) => void;
970987
"onShowToast"?: (event: ViewerPopoverCustomEvent<ShowToastEventArgs>) => void;
971988
}
972989
interface ViewerTab {
@@ -999,6 +1016,7 @@ declare namespace LocalJSX {
9991016
"mooar-viewer": MooarViewer;
10001017
"new-viewer": NewViewer;
10011018
"opensea-viewer": OpenseaViewer;
1019+
"other-tapps-button": OtherTappsButton;
10021020
"popover-dialog": PopoverDialog;
10031021
"script-select-dialog": ScriptSelectDialog;
10041022
"security-status": SecurityStatus;
@@ -1050,6 +1068,7 @@ declare module "@stencil/core" {
10501068
"mooar-viewer": LocalJSX.MooarViewer & JSXBase.HTMLAttributes<HTMLMooarViewerElement>;
10511069
"new-viewer": LocalJSX.NewViewer & JSXBase.HTMLAttributes<HTMLNewViewerElement>;
10521070
"opensea-viewer": LocalJSX.OpenseaViewer & JSXBase.HTMLAttributes<HTMLOpenseaViewerElement>;
1071+
"other-tapps-button": LocalJSX.OtherTappsButton & JSXBase.HTMLAttributes<HTMLOtherTappsButtonElement>;
10531072
"popover-dialog": LocalJSX.PopoverDialog & JSXBase.HTMLAttributes<HTMLPopoverDialogElement>;
10541073
"script-select-dialog": LocalJSX.ScriptSelectDialog & JSXBase.HTMLAttributes<HTMLScriptSelectDialogElement>;
10551074
"security-status": LocalJSX.SecurityStatus & JSXBase.HTMLAttributes<HTMLSecurityStatusElement>;

javascript/tokenscript-viewer/src/components/viewers/new/add/script-select-dialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export class ScriptSelectDialog {
4343
return (
4444
<Host>
4545
<popover-dialog ref={(el) => this.dialog = el as HTMLPopoverDialogElement} dialogStyles={{ background: "#fff !important", color: "#000 !important" }}>
46-
<p>Select from the available TApps below</p>
46+
<p>Select from the available TApps for this contract below</p>
4747
<div class="select-list">
4848
{this.scripts.map((script, index) => {
4949
return <tokenscript-button

javascript/tokenscript-viewer/src/components/viewers/new/new-viewer.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Component, Event, EventEmitter, h, Host, Prop, State, Watch} from "@stencil/core";
1+
import {Component, Event, EventEmitter, h, Host, Listen, Prop, State, Watch} from "@stencil/core";
22
import {AppRoot, ShowToastEventArgs, TokenScriptSource} from "../../app/app";
33
import {getKnownTokenScriptMetaById, knownTokenScripts} from "../../../constants/knownTokenScripts";
44
import {dbProvider, TokenScriptsMeta} from "../../../providers/databaseProvider";
@@ -48,6 +48,11 @@ export class NewViewer {
4848
bubbles: true,
4949
}) showToast: EventEmitter<ShowToastEventArgs>;
5050

51+
@Listen("showScriptSelector")
52+
showScriptSelector(event: CustomEvent<ScriptInfo[]>){
53+
this.scriptSelectDialog.open(event.detail)
54+
}
55+
5156
componentWillLoad(){
5257
Web3WalletProvider.registerWalletChangeListener(async (walletConnection?: WalletConnection) => {
5358
for (const id in this.myTokenScripts){
@@ -294,8 +299,6 @@ export class NewViewer {
294299
}
295300
}
296301

297-
console.log("Adding TSID: ", tokenScriptId);
298-
299302
await this.addTokenScript(meta, tokenScript);
300303

301304
await this.addDialog.closeDialog();
@@ -408,8 +411,8 @@ export class NewViewer {
408411
<viewer-popover ref={el => this.viewerPopover = el as HTMLViewerPopoverElement}></viewer-popover>
409412
<script-select-dialog ref={el => this.scriptSelectDialog = el as HTMLScriptSelectDialogElement}
410413
onScriptSelect={(scriptInfo: ScriptInfo) => {
411-
const tsMeta = this.addFormSubmit("resolve", {tsId: scriptInfo.sourceId + "-" + scriptInfo.scriptId})
412-
//this.viewerPopover.open(tsMeta.tokenScript);
414+
this.viewerPopover.close();
415+
this.addFormSubmit("resolve", {tsId: scriptInfo.sourceId + "-" + scriptInfo.scriptId})
413416
}}></script-select-dialog>
414417
<popover-dialog ref={el => this.aboutDialog = el as HTMLPopoverDialogElement}>
415418
<about-tokenscript></about-tokenscript>

javascript/tokenscript-viewer/src/components/viewers/new/viewer-popover/viewer-popover.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {handleTransactionError, showTransactionNotification} from "../../util/sh
66
import {ShowToastEventArgs} from "../../../app/app";
77
import {TokenGridContext} from "../../util/getTokensFlat";
88
import {ScriptSourceType} from "../../../../../../engine-js/src/Engine";
9-
import { getTgUrl } from '../../util/tgUrl';
9+
import {ScriptInfo} from "@tokenscript/engine-js/src/repo/sources/SourceInterface";
1010

1111
@Component({
1212
tag: 'viewer-popover',
@@ -46,6 +46,13 @@ export class ViewerPopover {
4646
bubbles: true,
4747
}) hideLoader: EventEmitter<void>;
4848

49+
@Event({
50+
eventName: 'showScriptSelector',
51+
composed: true,
52+
cancelable: true,
53+
bubbles: true,
54+
}) showScriptSelector: EventEmitter<ScriptInfo[]>;
55+
4956
@State()
5057
private overflowCardButtons: JSX.Element[];
5158
private overflowDialog: HTMLActionOverflowModalElement;
@@ -185,6 +192,17 @@ export class ViewerPopover {
185192
<h3>{this.tokenScript.getLabel(2) ?? this.tokenScript.getName()}</h3>
186193
</div>
187194
<div class="view-toolbar-buttons">
195+
<button class="btn btn-secondary" style={{marginRight: "15px", minWidth: "35px", fontSize: "16px"}} onClick={async () =>{
196+
this.showLoader.emit();
197+
try {
198+
const scripts = await this.tokenScript.getEngine().resolveAllScripts(this.tokenScript.getSourceInfo().tsId);
199+
this.showScriptSelector.emit(scripts);
200+
} catch (e){
201+
202+
}
203+
this.hideLoader.emit();
204+
205+
}}>Other TApps</button>
188206
<share-to-tg-button></share-to-tg-button>
189207
<security-status tokenScript={this.tokenScript}/>
190208
<div>

0 commit comments

Comments
 (0)