Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Run svelte-check
Alexis Sellier committed 5 years ago
commit fb1d496ed098e6e1a8f3faf69a02692972d72ea9
parent 8c623ceaed9eef1e787f146f8ce5d0bfec44978a
13 files changed +61 -59
modified src/App.svelte
@@ -1,8 +1,6 @@
<script lang="typescript">
  // TODO: Navigating directly to /vesting doesn't work.
-
  import { ethers } from 'ethers';
-
  import { get } from 'svelte/store';
-
  import { Router, Link, Route } from "svelte-routing";
+
  import { Router, Route } from "svelte-routing";
  import { getConfig } from '@app/config';
  import { session } from '@app/session';

@@ -16,7 +14,7 @@
  const query = new URLSearchParams(window.location.search);
  export let url = path === "/" ? defaultPath : path;

-
  function handleKeydown(event) {
+
  function handleKeydown(event: KeyboardEvent) {
    if (event.key === 'Enter') {
      (document.querySelector('button.primary') as HTMLElement).click();
    }
@@ -45,10 +43,10 @@
          <Vesting {config} session={$session} />
        </Route>
        <Register {config} {query} session={$session} />
-
        <Orgs {config} {query} />
+
        <Orgs {config} />
      </Router>
    </div>
  </div>
-
{:catch err}
+
{:catch}
  <!-- Show error -->
{/await}
modified src/Connect.svelte
@@ -1,9 +1,9 @@
<script lang="typescript">
-
  import { derived } from "svelte/store";
  import { Connection } from "@app/session";
  import { state } from '@app/session';
+
  import type { Config } from '@app/config';

-
  export let config;
+
  export let config: Config;
  export let caption = "Connect";
  export let className = "";
  export let style = "";
modified src/Header.svelte
@@ -3,8 +3,6 @@
  // TODO: Link to correct network on etherscan
  // TODO: There's a bug where sometimes on first load, the 'Connect' button
  //       won't display the address even though we're connected.
-
  import { derived } from "svelte/store";
-
  import { ethers } from "ethers";
  import { link } from "svelte-routing";
  import { formatBalance, formatAddress } from "@app/utils";
  import { error, Failure } from '@app/error';
modified src/base/orgs/Orgs.svelte
@@ -1,22 +1,12 @@
<script lang="typescript">
-
  import { onMount } from 'svelte';
-
  import { get } from 'svelte/store';
-
  import { Router, Link, Route, navigate } from "svelte-routing";
-
  import { ethers } from 'ethers';
-
  import { error } from '@app/error';
+
  import type { SvelteComponent } from 'svelte';
  import { session } from '@app/session';
  import CreateOrg from '@app/base/orgs/CreateOrg.svelte';
  import type { Config } from '@app/config';

-
  enum State {
-
    Idle,
-
  }
-

  export let config: Config;
-
  export const query = {};

-
  let modal = null;
-
  let state = State.Idle;
+
  let modal: typeof SvelteComponent | null = null;

  $: owner = $session && $session.address;
</script>
@@ -30,4 +20,4 @@
  </button>
</main>

-
<svelte:component this="{modal}" {owner} {config} on:close={() => modal = null} />
+
<svelte:component this={modal} {owner} {config} on:close={() => modal = null} />
modified src/base/orgs/Routes.svelte
@@ -4,7 +4,6 @@
  import type { Config } from '@app/config';

  export let config: Config;
-
  export let query;
</script>

<Route path="/orgs">
modified src/base/register/Register.svelte
@@ -1,10 +1,8 @@
<script lang="typescript">
  import { onMount } from 'svelte';
-
  import { get } from 'svelte/store';
  import { navigate } from "svelte-routing";
-
  import { ethers } from 'ethers';
-
  import { error } from '@app/error';
  import { registrar } from './registrar';
+
  import type { Config } from '@app/config';

  import Modal from '@app/Modal.svelte';

@@ -15,20 +13,20 @@
    NameUnavailable,
  }

-
  export let config;
+
  export let config: Config;

  let state = State.Idle;
-
  let inputValue;
-
  let inputElement;
+
  let inputValue: string;
+
  let inputElement: HTMLElement;

  onMount(() => {
    inputElement.focus();
  });

-
  function checkAvailability(name) {
+
  function checkAvailability(name: string) {
    state = State.CheckingAvailability;

-
    registrar(config).available(name).then(isAvailable => {
+
    registrar(config).available(name).then((isAvailable: boolean) => {
      if (isAvailable) {
        state = State.NameAvailable;
        navigate(`/register/${name}`);
modified src/base/register/Routes.svelte
@@ -3,10 +3,12 @@
  import Register from '@app/base/register/Register.svelte';
  import Begin from '@app/base/register/steps/Begin.svelte';
  import Submit from '@app/base/register/steps/Submit.svelte';
+
  import type { Config } from '@app/config';
+
  import type { Session } from '@app/session';

-
  export let session;
-
  export let config;
-
  export let query;
+
  export let session: Session | null;
+
  export let config: Config;
+
  export let query: Record<string, any>;
</script>

<Route path="register">
@@ -17,6 +19,8 @@
  <Begin {config} subdomain={params.name} {query} />
</Route>

-
<Route path="register/:name/submit" let:params>
-
  <Submit {config} subdomain={params.name} {query} {session} />
-
</Route>
+
{#if session}
+
  <Route path="register/:name/submit" let:params>
+
    <Submit {config} subdomain={params.name} {query} {session} />
+
  </Route>
+
{/if}
modified src/base/register/registrar.ts
@@ -45,7 +45,7 @@ export async function registerName(name: string, owner: string, config: Config)
      await commitAndRegister(name, owner, config);
    }
  } catch (e) {
-
    throw { type: Failure.TransactionFailed, message: e.message, hash: e.txHash };
+
    throw { type: Failure.TransactionFailed, message: e.message, txHash: e.txHash };
  }
}

modified src/base/register/steps/Begin.svelte
@@ -1,9 +1,9 @@
<script lang="typescript">
  import { navigate } from 'svelte-routing';
-
  import { error } from '@app/error';
  import { formatAddress } from '@app/utils';
  import { registrar } from '../registrar';
  import { session } from '@app/session';
+
  import type { Config } from '@app/config';

  import Connect from '@app/Connect.svelte';

@@ -13,9 +13,9 @@
    NameUnavailable,
  }

-
  export let config;
-
  export let subdomain;
-
  export let query;
+
  export let config: Config;
+
  export let subdomain: string;
+
  export let query: Record<string, any>;

  let state = State.Initial;
  $: registrationOwner = query.get("owner") || ($session && $session.address);
modified src/base/register/steps/Submit.svelte
@@ -3,19 +3,20 @@
  import { get } from 'svelte/store';
  import { navigate } from 'svelte-routing';
  import { ethers } from 'ethers';
-
  import { registrar, registerName, registrationFee } from '../registrar';
+
  import { registerName, registrationFee } from '../registrar';
  import { State, state } from '../state';
  import type { Session } from '@app/session';
+
  import type { Config } from '@app/config';

-
  export let config;
-
  export let subdomain;
-
  export let query;
+
  export let config: Config;
+
  export let subdomain: string;
+
  export let query: Record<string, any>;
  export let session: Session;

-
  let error = null;
+
  let error: Error | null = null;
  let registrationOwner = query.get("owner") || session.address;

-
  async function getFee(cfg) {
+
  async function getFee(cfg: Config) {
    let fee = await registrationFee(cfg);
    return ethers.utils.formatUnits(fee);
  }
modified src/base/vesting/Vesting.svelte
@@ -1,26 +1,25 @@
<script lang="typescript">
  import { onMount } from 'svelte';
-
  import { get, derived, writable } from 'svelte/store';
-
  import type { Writable } from 'svelte/store';
-
  import { ethers } from 'ethers';
  import { formatAddress } from '@app/utils';
  import { State, state } from './state';
  import { getInfo, withdrawVested } from './vesting';
+
  import type { VestingInfo } from './vesting';
  import type { Session } from '@app/session';
+
  import type { Config } from '@app/config';

-
  let input;
+
  let input: HTMLElement;

  onMount(() => {
    input.focus();
  });

-
  export let config;
-
  export let session: Session;
+
  export let config: Config;
+
  export let session: Session | null;

  let contractAddress = "";
-
  let info = null;
+
  let info: VestingInfo | null = null;

-
  async function loadContract(config) {
+
  async function loadContract(config: Config) {
    state.set(State.Loading);
    info = await getInfo(contractAddress, config);
    state.set(State.Idle);
modified src/base/vesting/vesting.ts
@@ -21,6 +21,15 @@ const tokenAbi = [
  "function symbol() view returns (string)",
];

+
export interface VestingInfo {
+
  token: string,
+
  symbol: string,
+
  beneficiary: string,
+
  totalVesting: string,
+
  withdrawableBalance: string,
+
  withdrawn: string
+
}
+

export async function withdrawVested(address: string, config: Config) {
  const contract = new ethers.Contract(address, abi, config.provider);
  const signer = config.provider.getSigner();
@@ -35,7 +44,7 @@ export async function withdrawVested(address: string, config: Config) {
  state.set(State.Withdrawn);
}

-
export async function getInfo(address: string, config: Config) {
+
export async function getInfo(address: string, config: Config): Promise<VestingInfo> {
  const contract = new ethers.Contract(address, abi, config.provider);
  const signer = config.provider.getSigner();

modified src/error.ts
@@ -1,10 +1,16 @@
import { writable } from "svelte/store";

+
export interface Err {
+
  type: Failure,
+
  txHash?: string,
+
  message?: string,
+
}
+

export enum Failure {
  TransactionFailed = 1,
}

-
export const error = writable(null);
+
export const error = writable<Err | null>(null);

export class Unreachable extends Error {
  constructor(value?: never) {