├── .gitignore
├── app
├── components
│ ├── friends.js
│ ├── new-user.js
│ └── user.js
├── dist
│ └── .keep
├── elements
│ └── status-box.js
├── index.html
├── index.js
├── models
│ ├── friends.js
│ └── user.js
└── style.css
├── index.js
├── package.json
├── readme.md
└── screenshot.png
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .aya.db
3 | app/dist/bundle.css
--------------------------------------------------------------------------------
/app/components/friends.js:
--------------------------------------------------------------------------------
1 | const html = require('choo/html')
2 | const statusBox = require('../elements/status-box')
3 |
4 | module.exports = (state, prev, send) => {
5 | return html`
6 |
10 | ${state.user.newUser ? newUser(state, prev, send) : user()}
11 |
12 | `
13 |
14 | function user () {
15 | return html`
16 | send('initDb')}
53 | class=''>
54 |
55 |
56 | Are You Around?
57 |
58 | Welcome ${state.user.name}!
59 |
60 |
61 |
62 |
63 | ${user(state, prev, send)}
64 |
65 |
66 | ${state.user.newUser ? '' : friends(state, prev, send)}
67 |
68 |
69 |
70 | `
71 | }
72 |
73 | app.router((route) => [
74 | route('/', mainView)
75 | ])
76 |
77 | const tree = app.start()
78 | document.body.appendChild(tree)
79 |
--------------------------------------------------------------------------------
/app/models/friends.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | namespace: 'group',
3 | state: {
4 | loading: [],
5 | friends : {
6 | // hypercorekeyasdlkfj: {
7 | // name: 'fred',
8 | // message: 'I am around!',
9 | // status: 'online'
10 | // }
11 | }
12 | },
13 | reducers: {
14 | receiveFriend: (data, state) => {
15 | const key = data.key
16 | const status = data.data
17 | const friends = state.friends
18 | const loading = state.loading
19 | loading.splice(loading.indexOf(key), 1)
20 | friends[key] = { name: status.name, message: status.message, status: status.status }
21 | return { friends: friends, loading: loading}
22 | },
23 | loadingFriend: (data, state) => {
24 | return { loading: state.loading.concat(data) }
25 | }
26 | },
27 | effects: {
28 | addFriend: (data, state, send, done) => {
29 | send('group:loadingFriend', data.key, () => {
30 | send('addFriendFeed', data.key, done)
31 | })
32 | },
33 | friendData: (data, state, send, done) => {
34 | console.log('got friend data', data)
35 | send('group:receiveFriend', data, done)
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/app/models/user.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | namespace: 'user',
3 | state: {
4 | message: 'I am around!',
5 | status: 'offline', // 'busy', 'offline'
6 | name: null,
7 | key: null,
8 | newUser: true,
9 | loading: true
10 | },
11 | reducers: {
12 | newUser: (data, state) => {
13 | return {
14 | loading: false,
15 | newUser: true
16 | }
17 | },
18 | receiveKey: (data, state) => {
19 | return {key: data}
20 | },
21 | receiveName: (data, state) => {
22 | return { loading: false, newUser: false, name: data }
23 | },
24 | receiveStatus: (data, state) => {
25 | return { loading: false, status: data.status, message: data.message }
26 | }
27 | },
28 | effects: {
29 | createNew: (data, state, send, done) => {
30 | send('user:receiveName', data.name, () => {
31 | // put new users online
32 | send('user:updateStatus', {
33 | name: data.name,
34 | status: 'online',
35 | message: state.message
36 | }, done)
37 | })
38 | },
39 | updateStatus: (data, state, send, done) => {
40 | send('appendStatus', data, () => {
41 | send('user:receiveStatus', data, done)
42 | })
43 | }
44 | }
45 | }
--------------------------------------------------------------------------------
/app/style.css:
--------------------------------------------------------------------------------
1 | input {
2 | background-color: transparent;
3 | border: none;
4 | border-bottom: 1px solid #9e9e9e;
5 | border-radius: 0;
6 | outline: none;
7 | padding: 0;
8 | box-shadow: none;
9 | transition: all 0.3s;
10 | text-align: center;
11 | }
12 |
13 | input:focus {
14 | border-bottom: 1px solid blue;
15 | }
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const {app, BrowserWindow, ipcMain, Menu, shell} = require('electron')
2 |
3 | const env = process.env.NODE_ENV
4 |
5 | let win
6 |
7 | ipcMain.on('ready', () => {
8 |
9 | })
10 |
11 | function createWindow () {
12 | win = new BrowserWindow({ width: 400 })
13 | win.loadURL(`file://${__dirname}/app/index.html`)
14 | if (env === 'development') {
15 | win.webContents.openDevTools({
16 | mode: 'detach'
17 | })
18 | }
19 | win.on('closed', () => { win = null })
20 | }
21 |
22 | app.on('ready', createWindow)
23 | app.on('window-all-closed', () => {
24 | if (process.platform !== 'darwin') app.quit()
25 | })
26 | app.on('activate', () => {
27 | if (!win) createWindow()
28 | })
29 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "are-you-around",
3 | "version": "1.1.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "npm run build && electron .",
8 | "start:dev": "npm run watch & NODE_ENV=development electron .",
9 | "test": "standard",
10 | "build": "browserify app/index.js -p [ css-extract -o app/dist/bundle.css ] -o /dev/null",
11 | "watch": "watchify app/index.js -p [ css-extract -o app/dist/bundle.css ] -o /dev/null",
12 | "rebuild": "npm rebuild --runtime=electron --target=1.3.4 --disturl=https://atom.io/download/atom-shell --build-from-source"
13 | },
14 | "browserify": {
15 | "transform": [
16 | "sheetify/transform"
17 | ]
18 | },
19 | "repository": {
20 | "type": "git",
21 | "url": "git+https://github.com/joehand/are-you-around.git"
22 | },
23 | "author": "Joe Hand