Skip to content

Commit

Permalink
initial example
Browse files Browse the repository at this point in the history
  • Loading branch information
amk221 committed Aug 10, 2020
1 parent 24a7b59 commit 0124563
Show file tree
Hide file tree
Showing 22 changed files with 555 additions and 5 deletions.
16 changes: 16 additions & 0 deletions app/adapters/foo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import RESTAdapter from '@ember-data/adapter/rest';
import fetch from 'fetch';
import { AJAXError } from '../utils/errors';

export default class FooAdapter extends RESTAdapter {
ajax(path, method) {
return fetch(path, { method })
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new AJAXError(response.statusText)
}
})
}
}
7 changes: 7 additions & 0 deletions app/components/my-component.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Foo: {{@foo.name}}

{{#unless this.isSaved}}
<button type="button" {{on "click" this.save}}>
Save
</button>
{{/unless}}
24 changes: 24 additions & 0 deletions app/components/my-component.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';

export default class MyComponent extends Component {
@tracked isSaving;
@tracked isSaved;

@action
save() {
this.isSaving = true;

this.args.onSave()
.then(() => {
this.isSaved = true;
})
// .catch(error => {
// No need to catch, because already handled, flash message will be displayed (See services/foo.js)
// })
.finally(() => {
this.isSaving = false;
});
}
}
3 changes: 3 additions & 0 deletions app/controllers/application.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Controller from '@ember/controller';

export default class ApplicationController extends Controller {}
6 changes: 6 additions & 0 deletions app/models/foo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import Model from '@ember-data/model';
import { attr } from '@ember-data/model';

export default class FooModel extends Model {
@attr() name;
}
22 changes: 22 additions & 0 deletions app/routes/application.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import Route from '@ember/routing/route';
import { inject } from '@ember/service';
import { action } from '@ember/object';

export default class ApplicationRoute extends Route {
@inject store;
@inject('foo') fooService;


model() {
return this.store.findRecord('foo', 1);
}

setupController(controller, model) {
controller.foo = model;
}

@action
save() {
return this.fooService.saveFoo(this.controller.foo)
}
}
3 changes: 3 additions & 0 deletions app/serializers/foo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import RESTSerializer from '@ember-data/serializer/rest';

export default class Fooerializer extends RESTSerializer {}
18 changes: 18 additions & 0 deletions app/services/foo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import Service, { inject } from '@ember/service';

export default class FooService extends Service {
@inject('flash-message') flashMessageService;

saveFoo(foo) {
return foo.save().catch(error => {
// 'Handle error'
// Make sure if saving a foo fails, then the user always knows about it.
this.flashMessageService.add('error', error.message);

// Rethrow error, so that the `saveFoo` promise chain remains in an error
// state. This allows us to determine if `saveFoo` failed or succeeded
// later on in the code... (See my-component.js)
throw error;
});
}
}
3 changes: 3 additions & 0 deletions app/styles/app.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.flash-message .message__dismiss {
display: none;
}
8 changes: 4 additions & 4 deletions app/templates/application.hbs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{{!-- The following component displays Ember's default welcome message. --}}
<WelcomePage />
{{!-- Feel free to remove this! --}}
<FlashMessages />

{{outlet}}
<br><br>

<MyComponent @foo={{this.foo}} @onSave={{route-action "save"}} />
1 change: 1 addition & 0 deletions app/utils/errors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class AJAXError extends Error {}
20 changes: 20 additions & 0 deletions app/utils/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import Pretender from 'pretender';

const server = new Pretender();

server.prepareBody = JSON.stringify;

server.put('/foos/1', () => [500, {}, {}]);

server.get('/foos/1', () => [
200,
{},
{
foo: {
id: 1,
name: 'Foo 1',
},
},
]);

export default server;
Loading

0 comments on commit 0124563

Please sign in to comment.