Skip to content

Commit 1c86b73

Browse files
committed
Initial version
0 parents  commit 1c86b73

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+12532
-0
lines changed

.formatter.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[
2+
import_deps: [:ecto, :phoenix],
3+
inputs: ["*.{ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{ex,exs}"],
4+
subdirectories: ["priv/*/migrations"]
5+
]

.gitignore

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# The directory Mix will write compiled artifacts to.
2+
/_build/
3+
4+
# If you run "mix test --cover", coverage assets end up here.
5+
/cover/
6+
7+
# The directory Mix downloads your dependencies sources to.
8+
/deps/
9+
10+
# Where 3rd-party dependencies like ExDoc output generated docs.
11+
/doc/
12+
13+
# Ignore .fetch files in case you like to edit your project deps locally.
14+
/.fetch
15+
16+
# If the VM crashes, it generates a dump, let's ignore it too.
17+
erl_crash.dump
18+
19+
# Also ignore archive artifacts (built via "mix archive.build").
20+
*.ez
21+
22+
# Ignore package tarball (built via "mix hex.build").
23+
phone_db-*.tar
24+
25+
# If NPM crashes, it generates a log, let's ignore it too.
26+
npm-debug.log
27+
28+
# The directory NPM downloads your dependencies sources to.
29+
/assets/node_modules/
30+
31+
# Since we are building assets from assets/,
32+
# we ignore priv/static. You may want to comment
33+
# this depending on your deployment strategy.
34+
/priv/static/
35+
36+
# Files matching config/*.secret.exs pattern contain sensitive
37+
# data and you should not commit them into version control.
38+
#
39+
# Alternatively, you may comment the line below and commit the
40+
# secrets files as long as you replace their contents by environment
41+
# variables.
42+
/config/*.secret.exs

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# PhoneDb
2+
3+
To start your Phoenix server:
4+
5+
* Install dependencies with `mix deps.get`
6+
* Create and migrate your database with `mix ecto.setup`
7+
* Install Node.js dependencies with `cd assets && npm install`
8+
* Start Phoenix endpoint with `mix phx.server`
9+
10+
Now you can visit [`localhost:4000`](http://localhost:4000) from your browser.
11+
12+
Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html).
13+
14+
## Learn more
15+
16+
* Official website: http://www.phoenixframework.org/
17+
* Guides: https://hexdocs.pm/phoenix/overview.html
18+
* Docs: https://hexdocs.pm/phoenix
19+
* Mailing list: http://groups.google.com/group/phoenix-talk
20+
* Source: https://github.com/phoenixframework/phoenix

assets/.babelrc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"presets": [
3+
"@babel/preset-env"
4+
]
5+
}

assets/css/app.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/* This file is for your main application css. */
2+
3+
@import "./phoenix.css";

assets/css/phoenix.css

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
/* Includes some default style for the starter application.
2+
* This can be safely deleted to start fresh.
3+
*/
4+
5+
/* Milligram v1.3.0 https://milligram.github.io
6+
* Copyright (c) 2017 CJ Patoilo Licensed under the MIT license
7+
*/
8+
9+
*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#000000;font-family:'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#0069d9;border:0.1rem solid #0069d9;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#0069d9;border-color:#0069d9}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#0069d9}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#0069d9}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#0069d9}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#0069d9}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #0069d9;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#0069d9;outline:0}select{background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="14" viewBox="0 0 29 14" width="29"><path fill="%23d1d1d1" d="M9.37727 3.625l5.08154 6.93523L19.54036 3.625"/></svg>') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="14" viewBox="0 0 29 14" width="29"><path fill="%230069d9" d="M9.37727 3.625l5.08154 6.93523L19.54036 3.625"/></svg>')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#0069d9;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}
10+
11+
/* General style */
12+
h1{font-size: 3.6rem; line-height: 1.25}
13+
h2{font-size: 2.8rem; line-height: 1.3}
14+
h3{font-size: 2.2rem; letter-spacing: -.08rem; line-height: 1.35}
15+
h4{font-size: 1.8rem; letter-spacing: -.05rem; line-height: 1.5}
16+
h5{font-size: 1.6rem; letter-spacing: 0; line-height: 1.4}
17+
h6{font-size: 1.4rem; letter-spacing: 0; line-height: 1.2}
18+
19+
.container{
20+
margin: 0 auto;
21+
max-width: 80.0rem;
22+
padding: 0 2.0rem;
23+
position: relative;
24+
width: 100%
25+
}
26+
select {
27+
width: auto;
28+
}
29+
30+
/* Alerts and form errors */
31+
.alert {
32+
padding: 15px;
33+
margin-bottom: 20px;
34+
border: 1px solid transparent;
35+
border-radius: 4px;
36+
}
37+
.alert-info {
38+
color: #31708f;
39+
background-color: #d9edf7;
40+
border-color: #bce8f1;
41+
}
42+
.alert-warning {
43+
color: #8a6d3b;
44+
background-color: #fcf8e3;
45+
border-color: #faebcc;
46+
}
47+
.alert-danger {
48+
color: #a94442;
49+
background-color: #f2dede;
50+
border-color: #ebccd1;
51+
}
52+
.alert p {
53+
margin-bottom: 0;
54+
}
55+
.alert:empty {
56+
display: none;
57+
}
58+
.help-block {
59+
color: #a94442;
60+
display: block;
61+
margin: -1rem 0 2rem;
62+
}
63+
64+
/* Phoenix promo and logo */
65+
.phx-hero {
66+
text-align: center;
67+
border-bottom: 1px solid #e3e3e3;
68+
background: #eee;
69+
border-radius: 6px;
70+
padding: 3em;
71+
margin-bottom: 3rem;
72+
font-weight: 200;
73+
font-size: 120%;
74+
}
75+
.phx-hero p {
76+
margin: 0;
77+
}
78+
.phx-logo {
79+
min-width: 300px;
80+
margin: 1rem;
81+
display: block;
82+
}
83+
.phx-logo img {
84+
width: auto;
85+
display: block;
86+
}
87+
88+
/* Headers */
89+
header {
90+
width: 100%;
91+
background: #fdfdfd;
92+
border-bottom: 1px solid #eaeaea;
93+
margin-bottom: 2rem;
94+
}
95+
header section {
96+
align-items: center;
97+
display: flex;
98+
flex-direction: column;
99+
justify-content: space-between;
100+
}
101+
header section :first-child {
102+
order: 2;
103+
}
104+
header section :last-child {
105+
order: 1;
106+
}
107+
header nav ul,
108+
header nav li {
109+
margin: 0;
110+
padding: 0;
111+
display: block;
112+
text-align: right;
113+
white-space: nowrap;
114+
}
115+
header nav ul {
116+
margin: 1rem;
117+
margin-top: 0;
118+
}
119+
header nav a {
120+
display: block;
121+
}
122+
123+
@media (min-width: 40.0rem) { /* Small devices (landscape phones, 576px and up) */
124+
header section {
125+
flex-direction: row;
126+
}
127+
header nav ul {
128+
margin: 1rem;
129+
}
130+
.phx-logo {
131+
flex-basis: 527px;
132+
margin: 2rem 1rem;
133+
}
134+
}

assets/js/app.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// We need to import the CSS so that webpack will load it.
2+
// The MiniCssExtractPlugin is used to separate it out into
3+
// its own CSS file.
4+
import css from "../css/app.css"
5+
6+
// webpack automatically bundles all modules in your
7+
// entry points. Those entry points can be configured
8+
// in "webpack.config.js".
9+
//
10+
// Import dependencies
11+
//
12+
import "phoenix_html"
13+
14+
// Import local files
15+
//
16+
// Local files can be imported directly using relative paths, for example:
17+
// import socket from "./socket"

assets/js/socket.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// NOTE: The contents of this file will only be executed if
2+
// you uncomment its entry in "assets/js/app.js".
3+
4+
// To use Phoenix channels, the first step is to import Socket,
5+
// and connect at the socket path in "lib/web/endpoint.ex".
6+
//
7+
// Pass the token on params as below. Or remove it
8+
// from the params if you are not using authentication.
9+
import {Socket} from "phoenix"
10+
11+
let socket = new Socket("/socket", {params: {token: window.userToken}})
12+
13+
// When you connect, you'll often need to authenticate the client.
14+
// For example, imagine you have an authentication plug, `MyAuth`,
15+
// which authenticates the session and assigns a `:current_user`.
16+
// If the current user exists you can assign the user's token in
17+
// the connection for use in the layout.
18+
//
19+
// In your "lib/web/router.ex":
20+
//
21+
// pipeline :browser do
22+
// ...
23+
// plug MyAuth
24+
// plug :put_user_token
25+
// end
26+
//
27+
// defp put_user_token(conn, _) do
28+
// if current_user = conn.assigns[:current_user] do
29+
// token = Phoenix.Token.sign(conn, "user socket", current_user.id)
30+
// assign(conn, :user_token, token)
31+
// else
32+
// conn
33+
// end
34+
// end
35+
//
36+
// Now you need to pass this token to JavaScript. You can do so
37+
// inside a script tag in "lib/web/templates/layout/app.html.eex":
38+
//
39+
// <script>window.userToken = "<%= assigns[:user_token] %>";</script>
40+
//
41+
// You will need to verify the user token in the "connect/3" function
42+
// in "lib/web/channels/user_socket.ex":
43+
//
44+
// def connect(%{"token" => token}, socket, _connect_info) do
45+
// # max_age: 1209600 is equivalent to two weeks in seconds
46+
// case Phoenix.Token.verify(socket, "user socket", token, max_age: 1209600) do
47+
// {:ok, user_id} ->
48+
// {:ok, assign(socket, :user, user_id)}
49+
// {:error, reason} ->
50+
// :error
51+
// end
52+
// end
53+
//
54+
// Finally, connect to the socket:
55+
socket.connect()
56+
57+
// Now that you are connected, you can join channels with a topic:
58+
let channel = socket.channel("topic:subtopic", {})
59+
channel.join()
60+
.receive("ok", resp => { console.log("Joined successfully", resp) })
61+
.receive("error", resp => { console.log("Unable to join", resp) })
62+
63+
export default socket

0 commit comments

Comments
 (0)