Upgrade to latest Ember, etc.
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
|
||||
root = true
|
||||
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
|
||||
+9
-3
@@ -1,8 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
root: true,
|
||||
parser: 'babel-eslint',
|
||||
parserOptions: {
|
||||
ecmaVersion: 2018,
|
||||
sourceType: 'module'
|
||||
sourceType: 'module',
|
||||
ecmaFeatures: {
|
||||
legacyDecorators: true
|
||||
}
|
||||
},
|
||||
globals: {
|
||||
console: true
|
||||
@@ -20,6 +26,7 @@ module.exports = {
|
||||
rules: {
|
||||
'ember/avoid-leaking-state-in-ember-objects': 'warn',
|
||||
'no-console': 'off'
|
||||
'ember/no-jquery': 'error'
|
||||
},
|
||||
overrides: [
|
||||
// node files
|
||||
@@ -35,8 +42,7 @@ module.exports = {
|
||||
'server/**/*.js'
|
||||
],
|
||||
parserOptions: {
|
||||
sourceType: 'script',
|
||||
ecmaVersion: 2015
|
||||
sourceType: 'script'
|
||||
},
|
||||
env: {
|
||||
browser: false,
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
extends: 'recommended',
|
||||
extends: 'octane',
|
||||
|
||||
rules: {
|
||||
'simple-unless': false,
|
||||
|
||||
+4
-2
@@ -23,7 +23,9 @@ env:
|
||||
# See https://git.io/vdao3 for details.
|
||||
- JOBS=1
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
script:
|
||||
- npm run lint:hbs
|
||||
- npm run lint:js
|
||||
- npm test
|
||||
|
||||
+6
-8
@@ -1,14 +1,12 @@
|
||||
import Application from '@ember/application';
|
||||
import Resolver from './resolver';
|
||||
import Resolver from 'ember-resolver';
|
||||
import loadInitializers from 'ember-load-initializers';
|
||||
import config from './config/environment';
|
||||
|
||||
const App = Application.extend({
|
||||
modulePrefix: config.modulePrefix,
|
||||
podModulePrefix: config.podModulePrefix,
|
||||
Resolver
|
||||
});
|
||||
export default class App extends Application {
|
||||
modulePrefix = config.modulePrefix;
|
||||
podModulePrefix = config.podModulePrefix;
|
||||
Resolver = Resolver;
|
||||
}
|
||||
|
||||
loadInitializers(App, config.modulePrefix);
|
||||
|
||||
export default App;
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
import Resolver from 'ember-resolver';
|
||||
|
||||
export default Resolver;
|
||||
+4
-6
@@ -1,10 +1,10 @@
|
||||
import EmberRouter from '@ember/routing/router';
|
||||
import config from './config/environment';
|
||||
|
||||
const Router = EmberRouter.extend({
|
||||
location: config.locationType,
|
||||
rootURL: config.rootURL
|
||||
});
|
||||
export default class Router extends EmberRouter {
|
||||
location = config.locationType;
|
||||
rootURL = config.rootURL;
|
||||
}
|
||||
|
||||
Router.map(function() {
|
||||
this.route('dashboard', function() {
|
||||
@@ -33,5 +33,3 @@ Router.map(function() {
|
||||
this.route('complete');
|
||||
});
|
||||
});
|
||||
|
||||
export default Router;
|
||||
|
||||
@@ -1 +1 @@
|
||||
{{loading-spinner}}
|
||||
<LoadingSpinner />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<header id="topbar">
|
||||
<h1>{{link-to "Kosmos Kredits" "dashboard"}}</h1>
|
||||
{{topbar-account-panel}}
|
||||
<h1><LinkTo @route="dashboard">Kosmos Kredits</LinkTo></h1>
|
||||
<TopbarAccountPanel />
|
||||
</header>
|
||||
|
||||
{{outlet}}
|
||||
|
||||
@@ -6,9 +6,7 @@
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
{{add-contribution contributors=sortedContributors
|
||||
attributes=model.params
|
||||
save=(action "save")}}
|
||||
<AddContribution @contributors={{sortedContributors}} @attributes={{model.params}} @save={{action "save"}} />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
{{add-contribution attributes=attributes contributors=sortedContributors save=(action "save")}}
|
||||
<AddContribution @attributes={{attributes}} @contributors={{sortedContributors}} @save={{action "save"}} />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
{{add-contributor attributes=attributes save=(action "save")}}
|
||||
<AddContributor @attributes={{attributes}} @save={{action "save"}} />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
{{add-contributor save=(action "save")}}
|
||||
<AddContributor @save={{action "save"}} />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
check out the
|
||||
<a href="https://wiki.kosmos.org/Kredits" target="_blank" rel="noopener">Kredits documentation</a>.
|
||||
If you want to start earning kredits for your contributions,
|
||||
{{link-to "create a contributor profile" "signup"}}.
|
||||
<LinkTo @route="signup">create a contributor profile</LinkTo>.
|
||||
</p>
|
||||
</div>
|
||||
{{/if}}
|
||||
@@ -22,21 +22,19 @@
|
||||
<h2>Contributors</h2>
|
||||
{{#if kredits.hasAccounts}}
|
||||
<nav>
|
||||
{{link-to "add" "contributors.new" title="Add contributor profile" class="button small green"}}
|
||||
<LinkTo @route="contributors.new" @title="Add contributor profile" class="button small green">add</LinkTo>
|
||||
</nav>
|
||||
{{/if}}
|
||||
</header>
|
||||
<div class="content">
|
||||
{{contributor-list contributorList=kreditsToplist
|
||||
showUnconfirmedKredits=showUnconfirmedKredits
|
||||
selectedContributorId=selectedContributorId}}
|
||||
<ContributorList @contributorList={{kreditsToplist}} @showUnconfirmedKredits={{showUnconfirmedKredits}} @selectedContributorId={{selectedContributorId}} />
|
||||
|
||||
<p class="stats">
|
||||
<span class="number">{{await kredits.totalKreditsEarned}}</span> kredits confirmed and issued to
|
||||
<span class="number">{{contributorsWithKredits.length}}</span> contributors
|
||||
</p>
|
||||
<p class="stats">
|
||||
{{input type="checkbox" id="hide-unnconfirmed-kredits" checked=showUnconfirmedKredits}}
|
||||
<Input @type="checkbox" @id="hide-unnconfirmed-kredits" @checked={{showUnconfirmedKredits}} />
|
||||
<label for="hide-unnconfirmed-kredits">Show unconfirmed kredits in toplist</label>
|
||||
</p>
|
||||
</div>
|
||||
@@ -47,7 +45,7 @@
|
||||
<h2>Contributions by type</h2>
|
||||
</header>
|
||||
<div class="content">
|
||||
{{chart-contributions-by-type contributions=contributions}}
|
||||
<ChartContributionsByType @contributions={{contributions}} />
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
@@ -60,17 +58,13 @@
|
||||
<nav>
|
||||
<button {{action "toggleQuickFilterUnconfirmed"}} class="small {{if showQuickFilterUnconfirmed "active"}}">filter</button>
|
||||
{{#if kredits.hasAccounts}}
|
||||
{{link-to "add" "contributions.new" title="Submit a contribution" class="button small green"}}
|
||||
<LinkTo @route="contributions.new" @title="Submit a contribution" class="button small green">add</LinkTo>
|
||||
{{/if}}
|
||||
</nav>
|
||||
</header>
|
||||
<div class="content">
|
||||
{{!-- TODO: We need a better naming for kredits.hasAccounts --}}
|
||||
{{contribution-list contributions=contributionsUnconfirmedSorted
|
||||
vetoContribution=(action "vetoContribution")
|
||||
contractInteractionEnabled=kredits.hasAccounts
|
||||
selectedContributionId=selectedContributionId
|
||||
showQuickFilter=showQuickFilterUnconfirmed}}
|
||||
<ContributionList @contributions={{contributionsUnconfirmedSorted}} @vetoContribution={{action "vetoContribution"}} @contractInteractionEnabled={{kredits.hasAccounts}} @selectedContributionId={{selectedContributionId}} @showQuickFilter={{showQuickFilterUnconfirmed}} />
|
||||
</div>
|
||||
</section>
|
||||
{{/if}}
|
||||
@@ -83,10 +77,7 @@
|
||||
</nav>
|
||||
</header>
|
||||
<div class="content">
|
||||
{{contribution-list contributions=contributionsConfirmedSorted
|
||||
vetoContribution=(action "vetoContribution")
|
||||
selectedContributionId=selectedContributionId
|
||||
showQuickFilter=showQuickFilterConfirmed}}
|
||||
<ContributionList @contributions={{contributionsConfirmedSorted}} @vetoContribution={{action "vetoContribution"}} @selectedContributionId={{selectedContributionId}} @showQuickFilter={{showQuickFilterConfirmed}} />
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<div class="content">
|
||||
<p class="who-what-when">
|
||||
<span class="contributor">
|
||||
{{user-avatar contributor=model.contributor}}
|
||||
{{link-to model.contributor.name "dashboard.contributors.show" model.contributor}}
|
||||
<UserAvatar @contributor={{model.contributor}} />
|
||||
<LinkTo @route="dashboard.contributors.show" @model={{model.contributor}}>{{model.contributor.name}}</LinkTo>
|
||||
</span>
|
||||
contributed
|
||||
<span class="date" title={{model.iso8601Date}}>{{moment-from model.iso8601Date}}</span>:
|
||||
@@ -35,14 +35,14 @@
|
||||
{{#if model.vetoed}}
|
||||
<div class="hint vetoed">
|
||||
<div class="icon">
|
||||
{{icon-warning}}
|
||||
<IconWarning />
|
||||
</div>
|
||||
<p>
|
||||
This contribution has been vetoed, meaning no
|
||||
kredits will be issued.
|
||||
</p>
|
||||
<p>
|
||||
{{link-to "Re-submit contribution …" "contributions.resubmit" model class="button small green"}}
|
||||
<LinkTo @route="contributions.resubmit" @model={{model}} class="button small green">Re-submit contribution …</LinkTo>
|
||||
</p>
|
||||
</div>
|
||||
{{/if}}
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
<div class="actions">
|
||||
<p>
|
||||
{{link-to "Copy & edit as new" "contributions.resubmit" model class="button small"}}
|
||||
<LinkTo @route="contributions.resubmit" @model={{model}} class="button small">Copy & edit as new</LinkTo>
|
||||
{{#if model.ipfsHash}}
|
||||
<a href="{{ipfsGatewayUrl}}/{{model.ipfsHash}}"
|
||||
class="button small" target="_blank" rel="noopener">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<section id="contributor-profile">
|
||||
<header>
|
||||
{{user-avatar contributor=model size="medium"}}
|
||||
<UserAvatar @contributor={{model}} @size="medium" />
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
@@ -10,23 +10,21 @@
|
||||
<ul class="external-accounts">
|
||||
{{#each model.accounts as |account|}}
|
||||
<li>
|
||||
{{external-account-link account=account}}
|
||||
<ExternalAccountLink @account={{account}} />
|
||||
</li>
|
||||
{{/each}}
|
||||
{{#if model.url}}
|
||||
<li>
|
||||
<a href={{model.url}} target="_blank" rel="noopener" title="Website">
|
||||
<span class="site">Web</span>
|
||||
{{icon-web-globe}}
|
||||
<IconWebGlobe />
|
||||
</a>
|
||||
</li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
<div class="actions">
|
||||
<p>
|
||||
{{link-to "♥ Give kredits" "contributions.new"
|
||||
(query-params contributorId=model.id)
|
||||
class="button green"}}
|
||||
<LinkTo @route="contributions.new" @query={{hash contributorId=model.id}} class="button green">♥ Give kredits</LinkTo>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -37,7 +35,7 @@
|
||||
{{#if model.ipfsHash}}
|
||||
<a href="{{ipfsGatewayUrl}}/{{model.ipfsHash}}" class="button small" target="_blank" rel="noopener">Inspect IPFS profile</a>
|
||||
{{/if}}
|
||||
{{link-to "Edit profile" "contributors.edit" model class="button small"}}
|
||||
<LinkTo @route="contributors.edit" @model={{model}} class="button small">Edit profile</LinkTo>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
</header>
|
||||
|
||||
<div class="content">
|
||||
{{add-proposal contributors=minedContributors save=(action "save")}}
|
||||
<AddProposal @contributors={{minedContributors}} @save={{action "save"}} />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
<a href="https://wiki.kosmos.org/Main_Page#Community_.2F_Getting_in_touch_.2F_Getting_involved">in one of our chat rooms</a>?.
|
||||
</p>
|
||||
<p class="actions">
|
||||
{{#link-to "dashboard" class="button small"}}Return to dashboard{{/link-to}}
|
||||
<LinkTo @route="dashboard" class="button small">Return to dashboard</LinkTo>
|
||||
</p>
|
||||
</div>
|
||||
@@ -10,9 +10,7 @@
|
||||
<p>
|
||||
<label>
|
||||
Ethereum account:<br>
|
||||
{{input type="text" value=ethAddress
|
||||
placeholder="0xF18E631Ea191aE4ebE70046Fcb01a436554421BA4"
|
||||
class=(if isValidEthAccount "valid" "")}}
|
||||
<Input @type="text" @value={{ethAddress}} placeholder="0xF18E631Ea191aE4ebE70046Fcb01a436554421BA4" class={{if isValidEthAccount "valid" ""}} />
|
||||
</label>
|
||||
</p>
|
||||
</form>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</p>
|
||||
<p class="actions">
|
||||
<button {{action "connectGithub"}} class="icon">
|
||||
{{icon-account-github-com}}
|
||||
<IconAccountGithubCom />
|
||||
Connect GitHub
|
||||
</button>
|
||||
</p>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
2020-05-09T13:41:58.543Z [warn] WARNING: {{await}} was not converted as it has positional parameters which can't be automatically converted. Source: app/templates/dashboard.hbs
|
||||
2020-05-09T13:41:58.919Z [warn] WARNING: {{contribution-status}} was not converted as it has positional parameters which can't be automatically converted. Source: app/templates/dashboard/contributions/show.hbs
|
||||
2020-05-09T14:59:55.142Z [warn] WARNING: {{contribution-status}} was not converted as it has positional parameters which can't be automatically converted. Source: app/templates/dashboard/contributions/show.hbs
|
||||
2020-05-09T14:59:56.285Z [warn] WARNING: {{await}} was not converted as it has positional parameters which can't be automatically converted. Source: app/templates/dashboard.hbs
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"schemaVersion": "1.0.0",
|
||||
"packages": [
|
||||
{
|
||||
"name": "ember-cli",
|
||||
"version": "3.18.0",
|
||||
"blueprints": [
|
||||
{
|
||||
"name": "app",
|
||||
"outputRepo": "https://github.com/ember-cli/ember-new-output",
|
||||
"codemodsSource": "ember-app-codemods-manifest@1",
|
||||
"isBaseBlueprint": true,
|
||||
"options": [
|
||||
"--no-welcome"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1,6 @@
|
||||
{
|
||||
"jquery-integration": true
|
||||
"application-template-wrapper": false,
|
||||
"default-async-observers": true,
|
||||
"jquery-integration": false,
|
||||
"template-only-glimmer-components": true
|
||||
}
|
||||
|
||||
Generated
+8595
-2552
File diff suppressed because it is too large
Load Diff
+38
-30
@@ -11,12 +11,14 @@
|
||||
"test": "tests"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*",
|
||||
"lint:hbs": "ember-template-lint .",
|
||||
"lint:js": "eslint .",
|
||||
"test": "ember test",
|
||||
"start": "ember serve",
|
||||
"test": "npm-run-all lint:* test:*",
|
||||
"test:ember": "ember test",
|
||||
"start:local": "WEB3_PROVIDER_URL=http://localhost:7545 ember serve",
|
||||
"build": "ember build",
|
||||
"build": "ember build --environment=production",
|
||||
"build-prod": "rm -rf release/* && ember build -prod --output-path release",
|
||||
"preversion": "npm test",
|
||||
"version": "npm run build-prod && git add release/",
|
||||
@@ -24,53 +26,59 @@
|
||||
"deploy": "git push 5apps master"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@ember/jquery": "^0.6.0",
|
||||
"@ember/optional-features": "^0.7.0",
|
||||
"@ember/optional-features": "^1.3.0",
|
||||
"@glimmer/component": "^1.0.0",
|
||||
"@glimmer/tracking": "^1.0.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"babel-preset-es2015": "^6.22.0",
|
||||
"babelify": "^7.3.0",
|
||||
"brfs": "^2.0.2",
|
||||
"broccoli-asset-rev": "^3.0.0",
|
||||
"ember-ajax": "^5.0.0",
|
||||
"ember-auto-import": "^1.5.3",
|
||||
"ember-awesome-macros": "0.41.0",
|
||||
"ember-cli": "~3.10.1",
|
||||
"ember-cli": "~3.18.0",
|
||||
"ember-cli-app-version": "^3.2.0",
|
||||
"ember-cli-babel": "^7.7.3",
|
||||
"ember-cli-chart": "^3.4.0",
|
||||
"ember-cli-dependency-checker": "^3.1.0",
|
||||
"ember-cli-eslint": "^5.1.0",
|
||||
"ember-cli-htmlbars": "^3.0.1",
|
||||
"ember-cli-htmlbars-inline-precompile": "^2.1.0",
|
||||
"ember-cli-inject-live-reload": "^1.8.2",
|
||||
"ember-cli-babel": "^7.19.0",
|
||||
"ember-cli-chart": "^3.6.0",
|
||||
"ember-cli-dependency-checker": "^3.2.0",
|
||||
"ember-cli-htmlbars": "^4.3.1",
|
||||
"ember-cli-inject-live-reload": "^2.0.2",
|
||||
"ember-cli-moment-shim": "^3.7.1",
|
||||
"ember-cli-sass": "^7.2.0",
|
||||
"ember-cli-sass": "^10.0.1",
|
||||
"ember-cli-sri": "^2.1.1",
|
||||
"ember-cli-template-lint": "^1.0.0-beta.1",
|
||||
"ember-cli-uglify": "^2.1.0",
|
||||
"ember-export-application-global": "^2.0.0",
|
||||
"ember-flatpickr": "^2.14.0",
|
||||
"ember-load-initializers": "^2.0.0",
|
||||
"ember-cli-uglify": "^3.0.0",
|
||||
"ember-export-application-global": "^2.0.1",
|
||||
"ember-fetch": "^8.0.1",
|
||||
"ember-flatpickr": "^2.16.2",
|
||||
"ember-load-initializers": "^2.1.1",
|
||||
"ember-macro-helpers": "0.17.0",
|
||||
"ember-maybe-import-regenerator": "^0.1.6",
|
||||
"ember-moment": "^7.8.1",
|
||||
"ember-promise-helpers": "1.0.6",
|
||||
"ember-qunit": "^4.4.1",
|
||||
"ember-resolver": "^5.0.1",
|
||||
"ember-source": "~3.10.0",
|
||||
"ember-promise-helpers": "^1.0.9",
|
||||
"ember-qunit": "^4.6.0",
|
||||
"ember-resolver": "^8.0.0",
|
||||
"ember-source": "~3.18.0",
|
||||
"ember-template-lint": "^2.6.0",
|
||||
"ember-truth-helpers": "github:jmurphyau/ember-truth-helpers#31a14373a31f1f82c77537720549b47a95c28e5f",
|
||||
"eslint-plugin-ember": "^6.2.0",
|
||||
"eslint-plugin-node": "^9.0.1",
|
||||
"ethers": "^4.0.27",
|
||||
"kosmos-schemas": "^2.0.0",
|
||||
"eslint": "^7.0.0",
|
||||
"eslint-plugin-ember": "^8.4.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"ethers": "^4.0.47",
|
||||
"kosmos-schemas": "^2.1.0",
|
||||
"kredits-contracts": "^5.5.0",
|
||||
"loader.js": "^4.7.0",
|
||||
"ndjson": "github:hugomrdias/ndjson#feat/readable-stream3",
|
||||
"qunit-dom": "^0.8.4",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"qunit-dom": "^1.2.0",
|
||||
"sass": "^1.26.5",
|
||||
"transform-loader": "^0.2.4",
|
||||
"tv4": "^1.3.0",
|
||||
"web3-utils": "^1.0.0"
|
||||
"web3-utils": "^1.2.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "8.* || >= 10.*"
|
||||
"node": "10.* || >= 12"
|
||||
},
|
||||
"ember": {
|
||||
"edition": "octane"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
test_page: 'tests/index.html?hidepassed',
|
||||
disable_watching: true,
|
||||
@@ -7,13 +9,13 @@ module.exports = {
|
||||
launch_in_dev: [
|
||||
'Chrome'
|
||||
],
|
||||
browser_start_timeout: 120,
|
||||
browser_args: {
|
||||
Chrome: {
|
||||
ci: [
|
||||
// --no-sandbox is needed when running Chrome inside a container
|
||||
process.env.CI ? '--no-sandbox' : null,
|
||||
'--headless',
|
||||
'--disable-gpu',
|
||||
'--disable-dev-shm-usage',
|
||||
'--disable-software-rasterizer',
|
||||
'--mute-audio',
|
||||
|
||||
@@ -29,7 +29,7 @@ module('Integration | Component | topbar-account-panel', function(hooks) {
|
||||
});
|
||||
await render(hbs`<TopbarAccountPanel />`);
|
||||
|
||||
assert.equal(this.element.textContent.trim(), 'Dorian Nakamoto');
|
||||
assert.dom(this.element).hasText('Dorian Nakamoto');
|
||||
|
||||
service.set('currentUser.isCore', true);
|
||||
await render(hbs`<TopbarAccountPanel />`);
|
||||
|
||||
Reference in New Issue
Block a user