Skip to content

Commit addbed0

Browse files
committed
Get settings working
1 parent fa5f2cf commit addbed0

5 files changed

Lines changed: 64 additions & 22 deletions

File tree

src/pages/Settings.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,100 @@
1+
import { useStore } from "../store";
2+
import ListErrors from "../components/ListErrors";
3+
import { createState } from "solid-js";
4+
15
export default () => {
6+
const [store, { logout, updateUser }] = useStore(),
7+
[state, setState] = createState({
8+
image: store.currentUser.image || "",
9+
username: store.currentUser.username,
10+
bio: store.currentUser.bio || "",
11+
email: store.currentUser.email,
12+
password: ""
13+
}),
14+
updateState = field => ev => setState(field, ev.target.value),
15+
submitForn = ev => {
16+
ev.preventDefault();
17+
const user = Object.assign({}, state);
18+
if (!user.password) {
19+
delete user.password;
20+
}
21+
setState({ updatingUser: true });
22+
updateUser(user)
23+
.then(() => location.hash = `/@${user.username}`)
24+
.catch(errors => setState({ errors }))
25+
.finally(() => setState({ updatingUser: false }));
26+
};
27+
228
return (
329
<div class="settings-page">
430
<div class="container page">
531
<div class="row">
632
<div class="col-md-6 offset-md-3 col-xs-12">
733
<h1 class="text-xs-center">Your Settings</h1>
8-
<form>
34+
<ListErrors errors={state.errors} />
35+
<form onSubmit={submitForn}>
936
<fieldset>
1037
<fieldset class="form-group">
1138
<input
1239
class="form-control"
1340
type="text"
1441
placeholder="URL of profile picture"
42+
value={state.image}
43+
onChange={updateState("image")}
1544
/>
1645
</fieldset>
1746
<fieldset class="form-group">
1847
<input
1948
class="form-control form-control-lg"
2049
type="text"
2150
placeholder="Your Name"
51+
value={state.username}
52+
onChange={updateState("username")}
2253
/>
2354
</fieldset>
2455
<fieldset class="form-group">
2556
<textarea
2657
class="form-control form-control-lg"
2758
rows="8"
2859
placeholder="Short bio about you"
60+
value={state.bio}
61+
onChange={updateState("bio")}
2962
></textarea>
3063
</fieldset>
3164
<fieldset class="form-group">
3265
<input
3366
class="form-control form-control-lg"
3467
type="text"
3568
placeholder="Email"
69+
value={state.email}
70+
onChange={updateState("email")}
3671
/>
3772
</fieldset>
3873
<fieldset class="form-group">
3974
<input
4075
class="form-control form-control-lg"
4176
type="password"
4277
placeholder="Password"
78+
value={state.password}
79+
onChange={updateState("password")}
4380
/>
4481
</fieldset>
45-
<button class="btn btn-lg btn-primary pull-xs-right">
82+
<button
83+
class="btn btn-lg btn-primary pull-xs-right"
84+
type="submit"
85+
disabled={state.updatingUser}
86+
>
4687
Update Settings
4788
</button>
4889
</fieldset>
4990
</form>
91+
<hr/>
92+
<button
93+
class="btn btn-outline-danger"
94+
onClick={() => (logout(), location.hash = "/")}
95+
>
96+
Or click here to logout.
97+
</button>
5098
</div>
5199
</div>
52100
</div>

src/store/createArticles.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@ export default function createArticles(
2727
const article = state.articles[slug];
2828
if (article) return article;
2929
}
30-
const p = agent.Articles.get(slug);
31-
loadArticle({ [slug]: p });
32-
return p;
30+
loadArticle({ [slug]: agent.Articles.get(slug) });
3331
},
3432
async makeFavorite(slug) {
3533
const article = state.articles[slug];
@@ -39,7 +37,7 @@ export default function createArticles(
3937
favoritesCount: s.favoritesCount + 1
4038
}));
4139
try {
42-
return await agent.Articles.favorite(slug);
40+
await agent.Articles.favorite(slug);
4341
} catch (err) {
4442
setState("articles", slug, s => ({
4543
favorited: false,
@@ -57,7 +55,7 @@ export default function createArticles(
5755
favoritesCount: s.favoritesCount - 1
5856
}));
5957
try {
60-
return await agent.Articles.unfavorite(slug);
58+
await agent.Articles.unfavorite(slug);
6159
} catch (err) {
6260
setState("articles", slug, s => ({
6361
favorited: true,
@@ -81,7 +79,7 @@ export default function createArticles(
8179
const article = state.articles[slug];
8280
setState("articles", { [slug]: undefined });
8381
try {
84-
return await agent.Articles.del(slug);
82+
await agent.Articles.del(slug);
8583
} catch (err) {
8684
setState("articles", { [slug]: article });
8785
throw err;

src/store/createEditor.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
export default function createEditor(store) {
2-
store.actions = {
3-
...store.actions,
2+
const [, actions] = store;
3+
store[1] = {
4+
...actions,
45
async loadInitialData(articleSlug) {
5-
const article = await store.actions.loadArticle(articleSlug, {
6+
const article = await actions.loadArticle(articleSlug, {
67
acceptCached: true
78
});
89
if (!article) throw new Error("Can't load original article");
910
return article;
1011
},
1112
async submit(article) {
1213
await (article.slug
13-
? store.actions.updateArticle(article)
14-
: store.actions.createArticle(article));
14+
? actions.updateArticle(article)
15+
: actions.createArticle(article));
1516
}
1617
};
17-
return store;
1818
}

src/store/createUser.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@ export default function createUser(agent, store, loadState, setState) {
88
return p;
99
},
1010
async updateUser(newUser) {
11-
setState({ updatingUser: true });
12-
try {
13-
const { user } = await agent.Auth.save(newUser);
14-
setState({ currentUser: user });
15-
} finally {
16-
setState({ updatingUser: false });
17-
}
11+
const { user, errors } = await agent.Auth.save(newUser);
12+
if (errors) throw errors;
13+
setState({ currentUser: user });
1814
}
1915
};
2016
}

src/store/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export function Provider(props) {
2828
createArticles(agent, store, loadState, setState, loadArticles);
2929
createComments(agent, store, loadState, setState);
3030
createCommon(agent, store, loadState, setState);
31-
// createEditor(store, setState);
31+
createEditor(store, setState);
3232
createProfile(agent, store, loadState, setState);
3333
createUser(agent, store, loadState, setState);
3434
createAuth(agent, store, loadState, setState);

0 commit comments

Comments
 (0)