Giter Site home page Giter Site logo

naumanni / naumanni Goto Github PK

View Code? Open in Web Editor NEW
98.0 10.0 13.0 3.4 MB

Naumanni is a Web user interface specially designed for Mastodon.

Home Page: https://naumanni.com

License: GNU Affero General Public License v3.0

JavaScript 88.02% HTML 2.39% Shell 0.12% CSS 9.46%
mastodon

naumanni's Introduction

日本語

Naumanni

CircleCI Test Coverage😢

Naumanni is a Web user interface specially designed for Mastodon. Just like Mastodon, users can easily launch from Docker and install freely. Multiple instances can be managed horizontally, and in addition to easy-to-use SMS-like direct messaging functions, it plans to add AI and end-to-end encryption functions. 

Screenshot

Demo

https://naumanni.com/

Version

0.1.1

Features

Naumanni’s features include the following:

  • Multiple instance management
  • Docker functionality
  • SMS-style direct messaging
  • End-to-end message encryption (scheduled for 6/10 release)
  • Automated CW Function for Toots using AI (scheduled for 6/10 release [Japan only])
  • Automated NSFW function using AI (Scheduled for summer release)

Who made this?

Naumanni is a collaborative project between UEI Corporation. and glucose inc.

Setup

Dependency

  • docker >= 17.0.5

Docker

$ docker pull naumanni/naumanni-standalone
$ docker run -it -p 8080:80 naumanni/naumanni-standalone

Now you can access to http://localhost:8080/ via web browser.

See naumanni/naumanni-docker more details.

Setup for Developer

Install Prerequisites

$ brew install yarn

Development

Edit and create config files

for Welcome Screen:

$ pwd
/path/to/naumanni
$ cp config.es6.in config.es6
$ vi config.es6

for Plugin:

$ cp plugin_entries.ci.es6 plugin_entries.es6
$ touch plugin_entries.css

Build project

$ pwd
/path/to/naumanni
$ yarn
$ yarn run build

Serve project

Example (serve app with nginx)

Install nginx

$ brew install nginx
$ mkdir -p /usr/local/var/run/nginx/proxy_temp
$ echo '127.0.0.1 naumanniskine.localdev' >> /etc/hosts
$ nginx -p `pwd` -c `pwd`/etc/dev/nginx/nginx.conf -g "daemon off;"

project tree

.
├── README.md
├── coverage
│   ├── clover.xml
│   ├── coverage-final.json
│   ├── lcov-report
│   └── lcov.info
├── etc
│   └── s3cmd_maintenance.sh
│   ├── deploy.sh
│   ├── deploy_s3_alpha.sh
│   ├── dev
│   │   ├── logs
│   │   │   └── access.log
│   │   ├── nginx
│   │   │   ├── mime.types
│   │   │   ├── nginx.conf
│   │   │   └── uwsgi_params
│   │   ├── nginx.pid
│   │   └── tmp
│   │       └── client_tmp
├── dev.screenrc
├── exclude-files
└── s3cmd_maintenance.sh
├── nginx.conf
├── node_modules
│   ├── ***
├── package.json
├── postcss.config.js
├── raw
│   ├── copy-fonts.sh
│   └── fontello-c1112e15
├── src
│   ├── css
│   └── js
├── static
│   ├── font
│   ├── images
│   ├── main.bundle.js
│   ├── main.bundle.js.map
│   └── main.css
├── webpack.config.babel.js
├── www
│   ├── authorize
│   ├── favicon.ico
│   └── index.html
└── yarn.lock

etc/dev/nginx/mime.types

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/x-javascript              js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/java-archive              jar war ear;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.ms-excel              xls;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              eot;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}

etc/dev/nginx/uwsgi_params

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

etc/dev/nginx/nginx.conf
worker_processes    auto;

error_log    stderr warn;
pid          etc/dev/tmp/nginx.pid;

events {
    worker_connections 256;
}

http {
    default_type    application/octet-stream;

    log_format ltsv "time:$time_local"
                    "\thost:$remote_addr"
                    "\tforwardedfor:$http_x_forwarded_for"
                    "\treq:$request"
                    "\tstatus:$status"
                    "\tsize:$body_bytes_sent"
                    "\treferer:$http_referer"
                    "\tua:$http_user_agent"
                    "\treqtime:$request_time"
                    "\tupsttime:$upstream_response_time"
                    "\tcache:$upstream_http_x_cache"
                    "\truntime:$upstream_http_x_runtime"
                    "\tvhost:$host";
    access_log  etc/dev/logs/access.log ltsv;

    client_body_temp_path etc/dev/tmp/client_tmp;

    sendfile    on;
    #tcp_nopush on;

    keepalive_timeout   60;
    tcp_nodelay      on;

    gzip            on;

    # uwsgi
    proxy_intercept_errors on;  # proxyがエラーを返したときに、nginxのerror_pageを適用する
    # 7秒proxyが処理を返さなければ504: GatewayTimeoutにする。
    proxy_read_timeout 7;
    proxy_connect_timeout 7;
    proxy_redirect off;

    include uwsgi_params;
    include mime.types;

    server {
        listen     7654;
        charset    utf-8;
        server_name naumanniskine.localdev;

        access_log  /dev/stdout ltsv;

        # 1リクエストの大きさを10Mまで許可する
        proxy_max_temp_file_size    0;
        client_max_body_size        10M;

        # error_pages
        error_page 404 /static/error/notfound.html;
        error_page 503 /static/error/maintenance.html;
        error_page 504 /static/error/delay.html;
        error_page 403 /static/error/forbidden.html;
        error_page 500 501 502 /static/error/error.html;

        location /static {
            alias ./static;
        }

        location / {
            root ./www;
            try_files $uri /index.html;
            default_type text/html;
        }
    }

}

Lint

$ yarn run lint
$ yarn run flow

Test

$ yarn test

React Storybook

$ yarn run storybook

Contribution

Please write bugs and feature requests to the problem or tag with #naumanni. Pull requests are also welcome!

ToDo management uses Pivotal Tracker.

naumanni's People

Contributors

harukasan avatar hrfmmr avatar naumanni avatar neustrashimy avatar nnnnaho avatar shi3z avatar shnjp avatar zonuexe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

naumanni's Issues

トゥートするとエラーが出る

v. alpha-0.1.2-14-g0555e3d

warning.js:36 Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the TootPanel component.
printWarning @ warning.js:36
warning @ warning.js:60
getInternalInstanceReadyForUpdate @ ReactUpdateQueue.js:48
enqueueSetState @ ReactUpdateQueue.js:210
ReactComponent.setState @ ReactComponent.js:63
_this5.props.onSend.then._this5.setState.isSending @ TootPanel.es6:281

[要望] カラム移動はヘッダのみにして欲しい

Windows 10 Pro
Chrome 60.0.3112.90(Official Build)(64 ビット)
alpha-0.2-64-gb9516c3

現在、カラムのどこをドラッグしても移動が可能ですが、ヘッダ部だけにすることは出来ないでしょうか?
トゥート内容をコピーすることが出来なくなってしまいました。

ご検討のほど、よろしくお願いします。

起動時に TypeError: Cannot read property 'match' of null

Windows 10 / Google Chrome 61.0.3163.79(Official Build) (64 ビット)
Naumanni alpha-0.2-66-ga73e7f6

起動時に下記エラーが表示され、ホームタイムラインが表示されません。
Mastodon v1.6.0 のインスタンスにて発生しているようです。

(エラーログに、 #127 の分も含まれています)

PrintLogger.js:53 🔖 InitializeApplicationUseCase(includes "LoadTokensUseCase")
warning.js:36 Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `TimelineColumn`. See https://fb.me/react-warning-keys for more information.
    in ColumnFilterText (created by TimelineColumn)
    in TimelineColumn (created by DragSource(TimelineColumn))
    in DragSource(TimelineColumn) (created by DropTarget(DragSource(TimelineColumn)))
    in DropTarget(DragSource(TimelineColumn)) (created by ColumnContainer)
    in div (created by ColumnContainer)
    in ColumnContainer (created by DragDropContext(ColumnContainer))
    in DragDropContext(ColumnContainer) (created by Dashboard)
    in div (created by Dashboard)
    in div (created by Dashboard)
    in IntlProvider (created by Dashboard)
    in Dashboard
printWarning @ warning.js:36
warning @ warning.js:60
validateExplicitKey @ ReactElementValidator.js:103
validateChildKeys @ ReactElementValidator.js:123
createElement @ ReactElementValidator.js:209
renderMenuContent @ TimelineColumn.es6:150
render @ TimelineColumn.es6:104
(anonymous) @ ReactCompositeComponent.js:796
measureLifeCyclePerf @ ReactCompositeComponent.js:75
_renderValidatedComponentWithoutOwnerOrContext @ ReactCompositeComponent.js:795
_renderValidatedComponent @ ReactCompositeComponent.js:822
performInitialMount @ ReactCompositeComponent.js:362
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
mountChildren @ ReactMultiChild.js:238
_createInitialChildren @ ReactDOMComponent.js:697
mountComponent @ ReactDOMComponent.js:516
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
performInitialMount @ ReactCompositeComponent.js:371
mountComponent @ ReactCompositeComponent.js:258
mountComponent @ ReactReconciler.js:46
updateChildren @ ReactChildReconciler.js:121
_reconcilerUpdateChildren @ ReactMultiChild.js:208
_updateChildren @ ReactMultiChild.js:312
updateChildren @ ReactMultiChild.js:299
_updateDOMChildren @ ReactDOMComponent.js:936
updateComponent @ ReactDOMComponent.js:754
receiveComponent @ ReactDOMComponent.js:716
receiveComponent @ ReactReconciler.js:125
updateChildren @ ReactChildReconciler.js:109
_reconcilerUpdateChildren @ ReactMultiChild.js:208
_updateChildren @ ReactMultiChild.js:312
updateChildren @ ReactMultiChild.js:299
_updateDOMChildren @ ReactDOMComponent.js:936
updateComponent @ ReactDOMComponent.js:754
receiveComponent @ ReactDOMComponent.js:716
receiveComponent @ ReactReconciler.js:125
_updateRenderedComponent @ ReactCompositeComponent.js:754
_performComponentUpdate @ ReactCompositeComponent.js:724
updateComponent @ ReactCompositeComponent.js:645
receiveComponent @ ReactCompositeComponent.js:547
receiveComponent @ ReactReconciler.js:125
_updateRenderedComponent @ ReactCompositeComponent.js:754
_performComponentUpdate @ ReactCompositeComponent.js:724
updateComponent @ ReactCompositeComponent.js:645
performUpdateIfNecessary @ ReactCompositeComponent.js:561
performUpdateIfNecessary @ ReactReconciler.js:157
runBatchedUpdates @ ReactUpdates.js:150
perform @ Transaction.js:140
perform @ Transaction.js:140
perform @ ReactUpdates.js:89
flushBatchedUpdates @ ReactUpdates.js:172
closeAll @ Transaction.js:206
perform @ Transaction.js:153
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
enqueueUpdate @ ReactUpdates.js:200
enqueueUpdate @ ReactUpdateQueue.js:24
enqueueSetState @ ReactUpdateQueue.js:219
ReactComponent.setState @ ReactComponent.js:63
onAppInitialized @ Dashboard.es6:154
(anonymous) @ Dashboard.es6:311
Promise resolved (async)
componentDidMount @ Dashboard.es6:311
(anonymous) @ ReactCompositeComponent.js:265
measureLifeCyclePerf @ ReactCompositeComponent.js:75
(anonymous) @ ReactCompositeComponent.js:264
notifyAll @ CallbackQueue.js:76
close @ ReactReconcileTransaction.js:80
closeAll @ Transaction.js:206
perform @ Transaction.js:153
batchedMountComponentIntoNode @ ReactMount.js:126
perform @ Transaction.js:140
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates @ ReactUpdates.js:97
_renderNewRootComponent @ ReactMount.js:320
_renderSubtreeIntoContainer @ ReactMount.js:401
render @ ReactMount.js:422
_callee$ @ main.es6:54
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ main.es6:11
(anonymous) @ main.es6:11
(anonymous) @ main.es6:11
main @ main.bundle.js?_t=b9516c3:83435
(anonymous) @ main.es6:56
__webpack_require__ @ bootstrap f5e7b13a1c1ce5754444:49
(anonymous) @ main.bundle.js?_t=b9516c3:140176
__webpack_require__ @ bootstrap f5e7b13a1c1ce5754444:49
(anonymous) @ bootstrap f5e7b13a1c1ce5754444:147
(anonymous) @ bootstrap f5e7b13a1c1ce5754444:147
PrintLogger.js:53 🔖 ReplaceDialogsUseCase
NotificationCenter.es6:50 addListener
NotificationCenter.es6:50 addListener
NotificationCenter.es6:50 addListener
NotificationCenter.es6:50 addListener
PrintLogger.js:53 🔖 Store is changed
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:37 WebSocket connection to 'wss://mastodon.tld/api/v1/streaming/?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&stream=public' failed: 
conncetIfNeed @ WebsocketManager.es6:37
listen @ WebsocketManager.es6:109
addListener @ TimelineListener.es6:26
addListener @ TimelineListenerManager.es6:132
onTokenAdded @ TimelineListenerManager.es6:198
onTokenAdded @ TokenListener.es6:72
(anonymous) @ TokenListener.es6:43
updateTokens @ TokenListener.es6:35
updateTokens @ TimelineListenerManager.es6:101
onChangeContext @ ColumnContainer.es6:238
EventEmitter.emit @ events.js:96
emitChange @ StoreGroup.js:234
_requestEmitChange @ StoreGroup.js:222
(anonymous) @ StoreGroup.js:190
WebsocketManager.es6:51 websocket onError Event {isTrusted: true, type: "error", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:75 websocket onClose CloseEvent {isTrusted: true, wasClean: false, code: 1006, reason: "", type: "close", …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
MastodonAPISpec.es6:66 Uncaught (in promise) TypeError: Cannot read property 'match' of null
    at https://naumanni.tld/static/main.bundle.js?_t=b9516c3:16778:35
    at Array.reduce (<anonymous>)
    at normalizeResponse (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:16775:56)
    at MastodonAPISpec.normalize (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:16929:35)
    at OAuthAPIRequester._callee2$ (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:46773:56)
    at tryCatch (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:137254:40)
    at Generator.invoke [as _invoke] (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:137492:22)
    at Generator.prototype.(anonymous function) [as next] (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:137306:21)
    at step (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:46433:191)
    at https://naumanni.tld/static/main.bundle.js?_t=b9516c3:46433:361
    at <anonymous>
(anonymous) @ MastodonAPISpec.es6:66
normalizeResponse @ MastodonAPISpec.es6:62
normalize @ MastodonAPISpec.es6:208
_callee2$ @ APIRequester.es6:240
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ APIRequester.es6:4
(anonymous) @ APIRequester.es6:4
Promise rejected (async)
step @ TimelineLoader.es6:1
(anonymous) @ TimelineLoader.es6:1
(anonymous) @ TimelineLoader.es6:1
_load @ TimelineLoader.es6:45
loadInitial @ TimelineLoader.es6:19
onTokenAdded @ TimelineListenerManager.es6:202
onTokenAdded @ TokenListener.es6:72
(anonymous) @ TokenListener.es6:43
updateTokens @ TokenListener.es6:35
updateTokens @ TimelineListenerManager.es6:101
onChangeContext @ ColumnContainer.es6:238
EventEmitter.emit @ events.js:96
emitChange @ StoreGroup.js:234
_requestEmitChange @ StoreGroup.js:222
(anonymous) @ StoreGroup.js:190
requestAnimationFrame (async)
(anonymous) @ StoreGroup.js:188
EventEmitter.emit @ events.js:81
emitChange @ Store.js:145
(anonymous) @ PreferenceStore.es6:21
EventEmitter.emit @ events.js:84
dispatch @ Dispatcher.js:134
delegate-payload:StoreGroup-to-PreferenceStore @ Dispatcher.js:166
EventEmitter.emit @ events.js:96
dispatch @ Dispatcher.js:134
delegate-payload:Dispatcher-to-StoreGroup @ Dispatcher.js:166
EventEmitter.emit @ events.js:96
dispatch @ Dispatcher.js:134
delegate-payload:InitializeApplicationUseCase-to-Dispatcher @ Dispatcher.js:166
EventEmitter.emit @ events.js:84
dispatch @ Dispatcher.js:134
dispatch @ UseCase.js:147
delegate-payload:LoadTokensUseCase-to-InitializeApplicationUseCase @ Dispatcher.js:166
EventEmitter.emit @ events.js:84
dispatch @ Dispatcher.js:134
dispatch @ UseCase.js:147
_callee$ @ LoadTokensUseCase.es6:20
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
Promise resolved (async)
step @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
Promise resolved (async)
step @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
execute @ LoadTokensUseCase.es6:20
execute @ UseCaseExecutor.js:203
_callee$ @ InitializeApplicationUseCase.es6:42
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
Promise resolved (async)
step @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
Promise resolved (async)
step @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
execute @ main.bundle.js?_t=b9516c3:100093
execute @ UseCaseExecutor.js:203
componentDidMount @ Dashboard.es6:310
(anonymous) @ ReactCompositeComponent.js:265
measureLifeCyclePerf @ ReactCompositeComponent.js:75
(anonymous) @ ReactCompositeComponent.js:264
notifyAll @ CallbackQueue.js:76
close @ ReactReconcileTransaction.js:80
closeAll @ Transaction.js:206
perform @ Transaction.js:153
batchedMountComponentIntoNode @ ReactMount.js:126
perform @ Transaction.js:140
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates @ ReactUpdates.js:97
_renderNewRootComponent @ ReactMount.js:320
_renderSubtreeIntoContainer @ ReactMount.js:401
render @ ReactMount.js:422
_callee$ @ main.es6:54
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ main.es6:11
(anonymous) @ main.es6:11
(anonymous) @ main.es6:11
main @ main.bundle.js?_t=b9516c3:83435
(anonymous) @ main.es6:56
__webpack_require__ @ bootstrap f5e7b13a1c1ce5754444:49
(anonymous) @ main.bundle.js?_t=b9516c3:140176
__webpack_require__ @ bootstrap f5e7b13a1c1ce5754444:49
(anonymous) @ bootstrap f5e7b13a1c1ce5754444:147
(anonymous) @ bootstrap f5e7b13a1c1ce5754444:147
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}
MastodonAPISpec.es6:66 Uncaught (in promise) TypeError: Cannot read property 'match' of null
    at https://naumanni.tld/static/main.bundle.js?_t=b9516c3:16778:35
    at Array.reduce (<anonymous>)
    at normalizeResponse (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:16775:56)
    at MastodonAPISpec.normalize (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:16929:35)
    at OAuthAPIRequester._callee2$ (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:46773:56)
    at tryCatch (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:137254:40)
    at Generator.invoke [as _invoke] (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:137492:22)
    at Generator.prototype.(anonymous function) [as next] (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:137306:21)
    at step (https://naumanni.tld/static/main.bundle.js?_t=b9516c3:46433:191)
    at https://naumanni.tld/static/main.bundle.js?_t=b9516c3:46433:361
    at <anonymous>
(anonymous) @ MastodonAPISpec.es6:66
normalizeResponse @ MastodonAPISpec.es6:62
normalize @ MastodonAPISpec.es6:208
_callee2$ @ APIRequester.es6:240
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ APIRequester.es6:4
(anonymous) @ APIRequester.es6:4
Promise rejected (async)
step @ TimelineLoader.es6:1
(anonymous) @ TimelineLoader.es6:1
(anonymous) @ TimelineLoader.es6:1
_load @ TimelineLoader.es6:45
loadInitial @ TimelineLoader.es6:19
onTokenAdded @ TimelineListenerManager.es6:202
onTokenAdded @ TokenListener.es6:72
(anonymous) @ TokenListener.es6:43
updateTokens @ TokenListener.es6:35
updateTokens @ TimelineListenerManager.es6:101
onChangeContext @ ColumnContainer.es6:238
EventEmitter.emit @ events.js:96
emitChange @ StoreGroup.js:234
_requestEmitChange @ StoreGroup.js:222
(anonymous) @ StoreGroup.js:190
requestAnimationFrame (async)
(anonymous) @ StoreGroup.js:188
EventEmitter.emit @ events.js:81
emitChange @ Store.js:145
(anonymous) @ PreferenceStore.es6:21
EventEmitter.emit @ events.js:84
dispatch @ Dispatcher.js:134
delegate-payload:StoreGroup-to-PreferenceStore @ Dispatcher.js:166
EventEmitter.emit @ events.js:96
dispatch @ Dispatcher.js:134
delegate-payload:Dispatcher-to-StoreGroup @ Dispatcher.js:166
EventEmitter.emit @ events.js:96
dispatch @ Dispatcher.js:134
delegate-payload:InitializeApplicationUseCase-to-Dispatcher @ Dispatcher.js:166
EventEmitter.emit @ events.js:84
dispatch @ Dispatcher.js:134
dispatch @ UseCase.js:147
delegate-payload:LoadTokensUseCase-to-InitializeApplicationUseCase @ Dispatcher.js:166
EventEmitter.emit @ events.js:84
dispatch @ Dispatcher.js:134
dispatch @ UseCase.js:147
_callee$ @ LoadTokensUseCase.es6:20
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
Promise resolved (async)
step @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
Promise resolved (async)
step @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
(anonymous) @ main.bundle.js?_t=b9516c3:100156
execute @ LoadTokensUseCase.es6:20
execute @ UseCaseExecutor.js:203
_callee$ @ InitializeApplicationUseCase.es6:42
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
Promise resolved (async)
step @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
Promise resolved (async)
step @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
(anonymous) @ InitializeApplicationUseCase.es6:64
execute @ main.bundle.js?_t=b9516c3:100093
execute @ UseCaseExecutor.js:203
componentDidMount @ Dashboard.es6:310
(anonymous) @ ReactCompositeComponent.js:265
measureLifeCyclePerf @ ReactCompositeComponent.js:75
(anonymous) @ ReactCompositeComponent.js:264
notifyAll @ CallbackQueue.js:76
close @ ReactReconcileTransaction.js:80
closeAll @ Transaction.js:206
perform @ Transaction.js:153
batchedMountComponentIntoNode @ ReactMount.js:126
perform @ Transaction.js:140
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates @ ReactUpdates.js:97
_renderNewRootComponent @ ReactMount.js:320
_renderSubtreeIntoContainer @ ReactMount.js:401
render @ ReactMount.js:422
_callee$ @ main.es6:54
tryCatch @ runtime.js:65
invoke @ runtime.js:303
prototype.(anonymous function) @ runtime.js:117
step @ main.es6:11
(anonymous) @ main.es6:11
(anonymous) @ main.es6:11
main @ main.bundle.js?_t=b9516c3:83435
(anonymous) @ main.es6:56
__webpack_require__ @ bootstrap f5e7b13a1c1ce5754444:49
(anonymous) @ main.bundle.js?_t=b9516c3:140176
__webpack_require__ @ bootstrap f5e7b13a1c1ce5754444:49
(anonymous) @ bootstrap f5e7b13a1c1ce5754444:147
(anonymous) @ bootstrap f5e7b13a1c1ce5754444:147
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}

main.bundle.jsが生成されない

構築まで一通り終わるのですが、実際にブラウザからアクセスすると何も表示されません。

実行環境: CentOS 7.3

$ uname -a
Linux naumanni 3.10.0-514.16.1.el7.x86_64 #1 SMP Wed Apr 12 15:04:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

build_docker.sh実行結果

$ ./build_docker.sh 
+ yarn
yarn install v0.24.5
[1/4] Resolving packages...
success Already up-to-date.
Done in 7.22s.
+ yarn build
yarn build v0.24.5
$ run-s clean build:* 
yarn run v0.24.5
$ rm -f static/main.bundle.js static/main.css static/main.bundle.js.map static/*.LICENSE node_modules/.cache/babel-loader/* 
Done in 0.67s.
yarn run v0.24.5
$ webpack 
================================
[5/18/2017, 8:10:17 AM] Start compile
(node:17694) DeprecationWarning: loaderUtils.parseQuery() received a non-string value which can be problematic, see https://github.com/webpack/loader-utils/issues/56
parseQuery() will be replaced with getOptions() in the next major version of loader-utils.
Done in 88.00s.
yarn run v0.24.5
$ postcss src/css/main.css -d static 
✔ Finished src/css/main.css (519ms)
Done in 8.93s.
Done in 103.87s.
+ docker build -t naumanni.com/naumanni-standalone -f ./Dockerfile .
Sending build context to Docker daemon  7.018MB
Step 1/8 : FROM nginx
 ---> 3448f27c273f
Step 2/8 : MAINTAINER [email protected]
 ---> Using cache
 ---> ae61f8cab0c2
Step 3/8 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
 ---> a26266b5baa2
Step 4/8 : ADD ./etc/docker/nginx/naumanni.conf /etc/nginx/conf.d/
 ---> Using cache
 ---> d628ba325597
Step 5/8 : ADD ./www/index.html ./www/favicon.ico /var/www/naumanni/
 ---> Using cache
 ---> f889154d3052
Step 6/8 : ADD ./static /var/www/naumanni/static
 ---> Using cache
 ---> 81517c016eb5
Step 7/8 : EXPOSE 80
 ---> Using cache
 ---> 3661d568c413
Step 8/8 : CMD nginx -g daemon off;
 ---> Using cache
 ---> 604c4411f998
Successfully built 604c4411f998
Successfully tagged naumanni.com/naumanni-standalone:latest

staticディレクトリの中身

$ ls -l static/
total 56
drwxrwxr-x 2 naumanni naumanni   109 May 18 00:08 font
drwxrwxr-x 2 naumanni naumanni    85 May 18 00:08 images
-rw-rw-r-- 1 naumanni naumanni 53689 May 18 08:11 main.css

実行結果

$ docker run -it -p 80:80 naumanni.com/naumanni-standalone
123.xxx.xxx.xxx - - [17/May/2017:23:15:30 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-"
2017/05/17 23:15:30 [error] 5#5: *2 open() "/var/www/naumanni/static/main.bundle.js" failed (2: No such file or directory), client: 123.xxx.xxx.xxx, server: localhost, request: "GET /static/main.bundle.js?_t=__NAUMMANI_VERSION__ HTTP/1.1", host: "example.com", referrer: "http://example.com/"

HTMLソース

<!doctype html>
<html>

  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>naumanni</title>

    <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
    <link rel="stylesheet" href="/static/main.css?_t=__NAUMMANI_VERSION__">
    <meta name="viewport" content="width=device-width">

    <link rel="apple-touch-icon" href="/static/images/apple-touch-icon-152.png">
    <meta name="apple-mobile-web-app-title" content="naumanni">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
  </head>

  <body>
    <div id="appContainer"></div>
    <script src="/static/main.bundle.js?_t=__NAUMMANI_VERSION__"></script>
  </body>
</html>

手順の誤り、情報不足などありましたらご指摘いただけると幸いです。

I want to change the default color.

I want to change the color of header and title
Also, I want you to be able to change the character color and background color if possible.


ヘッダーやタイトル部分の色を変更したい。
また、可能であれば文字色や背景色も変更したい。

ログアウトできるようにしたい

現状ログアウトをしようとおもうとローカルストレージに保存してる内容を消去する必要があり、個別にログアウトさせたいのでログアウト機能がほしいです。

index.htmlの外部リソース呼び出しタグにプレースホルダが残っている

ブラウザからindex.htmlのソースを見たところ
CSS/JSの呼び出しタグ内のURLに、プレースホルダらしきものが残ってしまっています。
__NAUMMANI_VERSION__ の部分です。

<!doctype html>
<html>

  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>naumanni</title>

    <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
    <link rel="stylesheet" href="/static/main.css?_t=__NAUMMANI_VERSION__">
    <meta name="viewport" content="width=device-width">

    <link rel="apple-touch-icon" href="/static/images/apple-touch-icon-152.png">
    <meta name="apple-mobile-web-app-title" content="naumanni">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
  </head>

  <body>
    <div id="appContainer"></div>
    <script src="/static/main.bundle.js?_t=__NAUMMANI_VERSION__"></script>
  </body>
</html>

本家 naumanni.com のソースを見ると、バージョン番号らしきものに置換されています。

以下わたしの環境です。

  • CentOS 7.3
  • Node.js v7.10.1
  • yarn v0.24.5
  • docker 1.12.6, build 3a094bd

起動時に Failed to construct 'WebSocket'

Naumanni alpha-0.2-16-gbf34ef4
Windows 10 / Google Chrome バージョン: 59.0.3071.115(Official Build) (64 ビット)

起動時に、Websocketが作成できない旨のエラーが表示され、全タイムラインが空白になってしまいました。

Naumanniに4つのインスタンスが登録されている状況下で、
うち1つのインスタンスがバージョンアップのため一時停止→再開後に発生しました。

ブラウザをリロードしても復帰しません。

以下、コンソールのログです。

PrintLogger.js:53   InitializeApplicationUseCase(includes "LoadTokensUseCase")
PrintLogger.js:53   ReplaceDialogsUseCase
NotificationCenter.es6:50 addListener
NotificationCenter.es6:50 addListener
NotificationCenter.es6:50 addListener
WebsocketManager.es6:37 Uncaught DOMException: Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. 'https' is not allowed.
    at WebsocketConnection.conncetIfNeed (https://example.com/static/main.bundle.js?_t=f72be33:47104:20)
    at WebsocketManager.listen (https://example.com/static/main.bundle.js?_t=f72be33:47215:12)
    at NotificationCenter.addListener (https://example.com/static/main.bundle.js?_t=f72be33:81419:63)
    at NotificationCenter.onTokenAdded (https://example.com/static/main.bundle.js?_t=f72be33:81398:12)
    at TokenListener.onTokenAdded (https://example.com/static/main.bundle.js?_t=f72be33:55983:49)
    at https://example.com/static/main.bundle.js?_t=f72be33:55952:18
    at Array.forEach (<anonymous>)
    at TokenListener.updateTokens (https://example.com/static/main.bundle.js?_t=f72be33:55945:10)
    at NotificationCenter.onChangeContext (https://example.com/static/main.bundle.js?_t=f72be33:81393:26)
    at StoreGroup.EventEmitter.emit (https://example.com/static/main.bundle.js?_t=f72be33:13559:20)
    at StoreGroup.emitChange (https://example.com/static/main.bundle.js?_t=f72be33:80746:14)
    at StoreGroup._requestEmitChange (https://example.com/static/main.bundle.js?_t=f72be33:80734:14)
    at https://example.com/static/main.bundle.js?_t=f72be33:80702:24
conncetIfNeed @ WebsocketManager.es6:37
listen @ WebsocketManager.es6:109
addListener @ NotificationCenter.es6:52
onTokenAdded @ NotificationCenter.es6:36
onTokenAdded @ TokenListener.es6:72
(anonymous) @ TokenListener.es6:43
updateTokens @ TokenListener.es6:35
onChangeContext @ NotificationCenter.es6:32
EventEmitter.emit @ events.js:96
emitChange @ StoreGroup.js:234
_requestEmitChange @ StoreGroup.js:222
(anonymous) @ StoreGroup.js:190
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2…}bubbles: falsecancelBubble: falsecancelable: falsecomposed: falsecurrentTarget: WebSocketdefaultPrevented: falseeventPhase: 0isTrusted: truepath: Array(0)length: 0__proto__: Array(0)returnValue: truesrcElement: WebSockettarget: WebSockettimeStamp: 2247.42type: "open"__proto__: EventAT_TARGET: 2BUBBLING_PHASE: 3CAPTURING_PHASE: 1NONE: 0bubbles: (...)cancelBubble: (...)cancelable: (...)composed: (...)composedPath: function composedPath()currentTarget: (...)defaultPrevented: (...)eventPhase: (...)initEvent: function initEvent()path: (...)preventDefault: function preventDefault()returnValue: (...)srcElement: (...)stopImmediatePropagation: function stopImmediatePropagation()stopPropagation: function stopPropagation()target: (...)timeStamp: (...)type: (...)constructor: function Event()Symbol(Symbol.toStringTag): "Event"get bubbles: function ()get cancelBubble: function ()set cancelBubble: function ()get cancelable: function ()get composed: function ()get currentTarget: function ()get defaultPrevented: function ()get eventPhase: function ()get path: function ()get returnValue: function ()set returnValue: function ()get srcElement: function ()get target: function ()get timeStamp: function ()get type: function ()__proto__: Object
WebsocketManager.es6:70 websocket onOpen Event {isTrusted: true, type: "open", target: WebSocket, currentTarget: WebSocket, eventPhase: 2…}bubbles: falsecancelBubble: falsecancelable: falsecomposed: falsecurrentTarget: WebSocketdefaultPrevented: falseeventPhase: 0isTrusted: truepath: Array(0)returnValue: truesrcElement: WebSockettarget: WebSockettimeStamp: 4074.7300000000005type: "open"__proto__: Event

Missing Scrollbars 行方不明のスクロールバー

I'll be using Google Translate for this issue, so I apologize for any miscommunication.
I am using the current latest release of Mozilla Firefox for Ubuntu, version 54. Scrollbars do not appear on any column I add, so I cannot use Naumanni to scroll through my feed. This could be related to the following set of messages in the console:

websocket onClose close { target: WebSocket, isTrusted: true, wasClean: true, code: 1001, reason: "", currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, composed: false }  main.bundle.js:2:1526791
Successfully compiled asm.js code (loaded from cache in 30ms)  main.bundle.js
Successfully compiled asm.js code (total compilation time 3ms; not stored in cache (too small to benefit))  main.bundle.js
Successfully compiled asm.js code (total compilation time 2ms; not stored in cache (too small to benefit))  main.bundle.js
TypeError: asm.js link error: bad typed array constructor  main.bundle.js:2:264337
TypeError: asm.js type error: Disabled by 'asmjs' runtime option  main.bundle.js
TypeError: asm.js link error: bad typed array constructor  main.bundle.js:2:279612
TypeError: asm.js type error: Disabled by 'asmjs' runtime option  main.bundle.js
Successfully compiled asm.js code (loaded from cache in 21ms)  openpgp.js
Successfully compiled asm.js code (loaded from cache in 0ms)  openpgp.js
Successfully compiled asm.js code (total compilation time 2ms; not stored in cache (too small to benefit))  openpgp.js
addListener main.bundle.js:2:1526791
websocket onOpen open { target: WebSocket, isTrusted: true, currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 7859.871312, cancelBubble: false, originalTarget: WebSocket }  main.bundle.js:2:1526791
websocket onOpen open { target: WebSocket, isTrusted: true, currentTarget: WebSocket, eventPhase: 2, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 8778.090978, cancelBubble: false, originalTarget: WebSocket }  main.bundle.js:2:1526791

I have also taken a screen capture of this.
image

私はこの問題にGoogle翻訳を使用していますので、間違いがあればお詫び申し上げます。
私はUbuntuバージョン54用に最新のMozilla Firefoxを使用しています。スクロールバーは私が追加したカラムには表示されないので、Naumanniを使ってフィードをスクロールすることはできません。 これは、コンソール内の次のメッセージセットに関連する可能性があります。 (上記を参照)

私もこれをスクリーンキャプチャしました。 (上記を参照)

United Notificationでfavを行うと点灯しないことがある

Uncaught (in promise) TypeError: Cannot read property 'tag:pawoo.net,2017-05-24:objectId=14944859:objectType=Status' of undefined
    at TimelineActions._callee5$ (http://192.168.99.100:8080/static/main.bundle.js?_t=a4e8117:17768:68)
    at tryCatch (http://192.168.99.100:8080/static/main.bundle.js?_t=a4e8117:111260:40)
    at Generator.invoke [as _invoke] (http://192.168.99.100:8080/static/main.bundle.js?_t=a4e8117:111495:22)
    at Generator.prototype.(anonymous function) [as next] (http://192.168.99.100:8080/static/main.bundle.js?_t=a4e8117:111312:21)
    at step (http://192.168.99.100:8080/static/main.bundle.js?_t=a4e8117:17539:191)
    at http://192.168.99.100:8080/static/main.bundle.js?_t=a4e8117:17539:361
    at <anonymous>
_callee5$ @ main.bundle.js:17768
tryCatch @ main.bundle.js:111260
invoke @ main.bundle.js:111495
prototype.(anonymous function) @ main.bundle.js:111312
step @ main.bundle.js:17539
(anonymous) @ main.bundle.js:17539

pawoo同士のリプライにclubのアカウントからfavを送ろうとした所、発生。
再現性があるのも(試した限りでは)この組み合わせのみ。

ユーザーの「フォロー中」を開くとエラー

alpha-0.1.2-14-g0555e3d

2回目からは出ないようです。

routes.es6:51 routeUserDetail
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
warning.js:36 Warning: Failed prop type: The prop `onAvatarClicked` is marked as required in `AccountRow`, but its value is `undefined`.
    in AccountRow (created by UserDetailDialog)
    in UserDetailDialog (created by ModalDialogContainer)
    in div (created by ModalDialogContainer)
    in ModalDialogContainer (created by Dashboard)
    in div (created by Dashboard)
    in Dashboard
printWarning @ warning.js:36
warning @ warning.js:60
checkReactTypeSpec @ checkReactTypeSpec.js:80
validatePropTypes @ ReactElementValidator.js:161
createElement @ ReactElementValidator.js:213
(anonymous) @ UserDetailDialog.es6:197
renderAccounts @ UserDetailDialog.es6:195
renderFollowings @ UserDetailDialog.es6:179
renderTimeline @ UserDetailDialog.es6:141
render @ UserDetailDialog.es6:101
(anonymous) @ ReactCompositeComponent.js:796
measureLifeCyclePerf @ ReactCompositeComponent.js:75
_renderValidatedComponentWithoutOwnerOrContext @ ReactCompositeComponent.js:795
_renderValidatedComponent @ ReactCompositeComponent.js:822
_updateRenderedComponent @ ReactCompositeComponent.js:746
_performComponentUpdate @ ReactCompositeComponent.js:724
updateComponent @ ReactCompositeComponent.js:645
performUpdateIfNecessary @ ReactCompositeComponent.js:561
performUpdateIfNecessary @ ReactReconciler.js:157
runBatchedUpdates @ ReactUpdates.js:150
perform @ Transaction.js:140
perform @ Transaction.js:140
perform @ ReactUpdates.js:89
flushBatchedUpdates @ ReactUpdates.js:172
closeAll @ Transaction.js:206
perform @ Transaction.js:153
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
enqueueUpdate @ ReactUpdates.js:200
enqueueUpdate @ ReactUpdateQueue.js:24
enqueueSetState @ ReactUpdateQueue.js:219
ReactComponent.setState @ ReactComponent.js:63
_callee4$ @ UserDetailDialog.es6:307
tryCatch @ runtime.js:64
invoke @ runtime.js:299
prototype.(anonymous function) @ runtime.js:116
step @ UserDetailDialog.es6:13
(anonymous) @ UserDetailDialog.es6:13

リプライの時系列表示が欲しい

(要望)
現在の表示では、リプライ先のトゥートを辿ることが出来ず、混乱します。
リプライを時系列で表示できるような表示機能が欲しいです。

公開トゥートを行ったとき、ホームタイムラインに表示されないことがある

alpha-0.1.2-35-ga4e8117
Windows 10 / Google Chrome 58.0.3029.110 (64-bit)

公開トゥートを行った際、ホームタイムラインには表示されますが、ローカルタイムラインには表示されません。
(連合タイムラインは未確認です)
コンソールにエラー等メッセージは表示されませんでした。

以下ログです。

PrintLogger.js:53   InitializeApplicationUseCase(includes "LoadTokensUseCase")
PrintLogger.js:53   ReplaceDialogsUseCase
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
PrintLogger.js:53   Store is changed
routes.es6:51 routeUserDetail
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   PushDialogUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   CloseDialogUseCase
PrintLogger.js:53   Store is changed

ロード時に TimelineColumn render method でエラー

Windows 10 / Chrome 61.0.3163.79(Official Build)(64 ビット)
naumanni alpha-0.2-66-ga73e7f6

warning.js:36 Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `TimelineColumn`. See https://fb.me/react-warning-keys for more information.
    in ColumnFilterText (created by TimelineColumn)
    in TimelineColumn (created by DragSource(TimelineColumn))
    in DragSource(TimelineColumn) (created by DropTarget(DragSource(TimelineColumn)))
    in DropTarget(DragSource(TimelineColumn)) (created by ColumnContainer)
    in div (created by ColumnContainer)
    in ColumnContainer (created by DragDropContext(ColumnContainer))
    in DragDropContext(ColumnContainer) (created by Dashboard)
    in div (created by Dashboard)
    in div (created by Dashboard)
    in IntlProvider (created by Dashboard)
    in Dashboard

Build Error: Can't resolve naumanniConfig and naumanniPlugins

The errors occur while running yarn run build.

The error messages are the following.

WARNING in ./src/js/config.es6
Module not found: Error: Can't resolve 'naumanniConfig' in '/home/vagrant/naumanni/src/js'
 @ ./src/js/config.es6 18:17-42
 @ ./src/js/pages/Dashboard.es6
 @ ./src/js/main.es6
 @ multi babel-polyfill ./src/js/main.es6

ERROR in ./src/js/pages/Dashboard.es6
Module not found: Error: Can't resolve 'naumanniPlugins' in '/home/vagrant/naumanni/src/js/pages'
 @ ./src/js/pages/Dashboard.es6 116:36-62 385:37-63
 @ ./src/js/main.es6
 @ multi babel-polyfill ./src/js/main.es6

ERROR in ./src/js/usecases/InitializeApplicationUseCase.es6
Module not found: Error: Can't resolve 'naumanniPlugins' in '/home/vagrant/naumanni/src/js/usecases'
 @ ./src/js/usecases/InitializeApplicationUseCase.es6 104:37-63
 @ ./src/js/pages/Dashboard.es6
 @ ./src/js/main.es6
 @ multi babel-polyfill ./src/js/main.es6

According to above, the reason why errors occur is because src/js/naumanniConfig, src/js/pages/naumanniPlugins and src/js/usecases/naumanniPlugins are not found. These are not created by running yarn, and also not found in this repository.

How should it be fixed?

タイムラインがロードされない

環境
macOS Sierra 10.12.6
Firefox 56.0b3
Chrome 61.0.3163.49
naumanni alpha-0.2-20-g67d1ce1

全てのタイムラインがロード中で止まります。
これは、Firefox、Chromeどちらでも発生します。
スクリーンショット

以下コンソールログです。何度かInernal Server Errorが出ています。

Successfully compiled asm.js code (loaded from cache in 2ms) main.bundle.js
Successfully compiled asm.js code (total compilation time 3ms; not stored in cache (too small to benefit)) main.bundle.js
Successfully compiled asm.js code (total compilation time 1ms; not stored in cache (too small to benefit)) main.bundle.js
Successfully compiled asm.js code (loaded from cache in 11ms) openpgp.js
Successfully compiled asm.js code (loaded from cache in 3ms) openpgp.js
Successfully compiled asm.js code (total compilation time 2ms; not stored in cache (too small to benefit)) openpgp.js
addListener main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 1853.327414, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 2044.959564, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
addListener main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 3161.5716420000003, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 6721.237289000001, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 6788.947162, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 6859.036012, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 8370.218603, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 8442.693763, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
websocket onOpen open { target: WebSocket, isTrusted: true, eventPhase: 0, bubbles: false, cancelable: false, defaultPrevented: false, composed: false, timeStamp: 8521.897883, cancelBubble: false, originalTarget: WebSocket, explicitOriginalTarget: WebSocket } main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682
Unhandled promise rejection Error: Internal Server Error
スタックトレース:
l/<@https://naumanni.com/static/main.bundle.js:2:674571
r.prototype.emit@https://naumanni.com/static/main.bundle.js:2:1283474
l.prototype._end/t.onreadystatechange@https://naumanni.com/static/main.bundle.js:2:679253
r@https://naumanni.com/static/main.bundle.js:2:1535558
main.bundle.js:2:1529682

Home Timelineで、ブーストされたトゥートをお気に入りすることができない

以下、お気に入りをクリックした時に、Google ChromeのConsoleに出力されたエラーログです。

POST https://mstdn.oresys.nagoya/api/v1/statuses/206216/favourite 422 (Unprocessable Entity)
Request._end @ main.bundle.js?_t=__NAUMMANI_VERSION__:65854
Request.end @ main.bundle.js?_t=__NAUMMANI_VERSION__:65758
(anonymous) @ main.bundle.js?_t=__NAUMMANI_VERSION__:105034
then @ main.bundle.js?_t=__NAUMMANI_VERSION__:105033
main.bundle.js?_t=__NAUMMANI_VERSION__:65475

Uncaught (in promise) Error: Unprocessable Entity
    at RetriableRequest.<anonymous> (main.bundle.js?_t=__NAUMMANI_VERSION__:65475)
    at RetriableRequest.Emitter.emit (main.bundle.js?_t=__NAUMMANI_VERSION__:80899)
    at XMLHttpRequest.xhr.onreadystatechange (main.bundle.js?_t=__NAUMMANI_VERSION__:65787)
(anonymous) @ main.bundle.js?_t=__NAUMMANI_VERSION__:65475
Emitter.emit @ main.bundle.js?_t=__NAUMMANI_VERSION__:80899
xhr.onreadystatechange @ main.bundle.js?_t=__NAUMMANI_VERSION__:65787

openpgp.worker.js が生成されてない。

Chrome のデベロッパーツールで色々と確認してるときに気が付きましたが /static/openpgp.worker.js404 Not Found となっています。

再現方法
  1. 適当な場所に以下の内容で Dockerfile を用意する
    (ここでは etc/docker/yarn/Dockerfile とする)
FROM yarnpkg/node-yarn

WORKDIR /naumanni

COPY . /naumanni

RUN yarn
RUN yarn run build
  1. ビルド
    docker build -t naumanni.com/naumanni-yarn -f ./etc/docker/yarn/Dockerfile .

  2. 確認
    docker run naumanni.com/naumanni-yarn ls -l static/

を行ったところ生成されてませんでした

# docker run naumanni.com/naumanni-yarn ls -l static/
total 7680
drwxr-xr-x 2 root root    4096 May 18 12:23 font
drwxr-xr-x 2 root root    4096 May 18 12:23 images
-rw-r--r-- 1 root root 3620858 May 18 12:23 main.bundle.js
-rw-r--r-- 1 root root 4175882 May 18 12:23 main.bundle.js.map
-rw-r--r-- 1 root root   53689 May 18 12:23 main.css

リモートブーストやfavを行った場合、アイコンが点灯しない

・例
clubアカウントでclubのトゥートをブースト(fav)→点灯
clubアカウントでpawooのトゥート(非フォロー)をブースト(fav)→点灯せず
clubアカウントでpawooのトゥート(フォロワー)をブースト(fav)→点灯せず
clubアカウントでclubのユーザーがブーストしたpawooのトゥート(非フォロー)をブースト(fav)→点灯せず

club鯖以外でも発生したため、再現性はあると思われます。
最新版を自鯖に入れています。

2017/05/18追記
点灯しないもののブーストやfavは反映されています
また、Federated timelineでは正常に動いたのでUnited系が怪しいのかなと思います。

[要望] インスタンス毎の色分けが欲しい

複数インスタンスを登録していると、どのタイムラインがどのインスタンスのものか直感的に分かりづらいです。
ヘッダ部(ホーム・連合・通知・等)の色分けができればと思います。

Notifications欄スクロール時にassert.jsでエラーが出る

alpha-0.1.2-35-ga4e8117
Windows 10 / Google Chrome 58.0.3029.110 (64-bit)

Notifications欄を一旦下へスクロールした後、最上部へスクロールすると発生します。
(発生しない時もあります。。。)

PrintLogger.js:53   InitializeApplicationUseCase(includes "LoadTokensUseCase")
PrintLogger.js:53   ReplaceDialogsUseCase
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
PrintLogger.js:53   Store is changed
assert.js:195 Uncaught AssertionError {name: "AssertionError", actual: null, expected: true, operator: "==", message: "null == true"…}
fail @ assert.js:195
ok @ assert.js:215
loadMoreStatuses @ NotificationsColumn.es6:68
onTimelineScrolled @ PagingColumn.es6:299
ReactErrorUtils.invokeGuardedCallback @ ReactErrorUtils.js:69
executeDispatch @ EventPluginUtils.js:85
executeDispatchesInOrder @ EventPluginUtils.js:108
executeDispatchesAndRelease @ EventPluginHub.js:43
executeDispatchesAndReleaseTopLevel @ EventPluginHub.js:54
forEachAccumulated @ forEachAccumulated.js:24
processEventQueue @ EventPluginHub.js:257
runEventQueueInBatch @ ReactEventEmitterMixin.js:17
handleTopLevel @ ReactEventEmitterMixin.js:28
handleTopLevelImpl @ ReactEventListener.js:72
perform @ Transaction.js:140
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
batchedUpdates @ ReactUpdates.js:97
dispatchEvent @ ReactEventListener.js:147

No license text

Hello.
"package.json" states this software is released under MIT License.
But there is no license text in this repository.

However, according to this article
http://www.itmedia.co.jp/news/articles/1705/23/news160_2.html
Naumanni is released under the GNU Affero GPL(v3 or v3+).
I am confusing.

If you want to use the AGPL, please put LICNESE file and modify "package.json".
Add such a license header text into README file is more better.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Regards,

通知機能でエラーが出る

alpha-0.1.2-149-g0d8f84e
Windows 10 / Google Chrome 58.0.3029.110 (64-bit)

Fav/Mentionともにエラーが表示され止まります。

把握済みでしたら申し訳ありません。

PrintLogger.js:53   InitializeApplicationUseCase(includes "LoadTokensUseCase")
PrintLogger.js:53   ReplaceDialogsUseCase
NotificationCenter.es6:51 addListener
NotificationCenter.es6:51 addListener
PrintLogger.js:53   Store is changed
NotificationCenter.es6:83 on Object {host: "mstdn.jp", id: 9919879, type: "mention", created_at: "2017-05-27T15:20:40.751Z", account: "https://mstdn.oresys.nagoya/@kumasun"…} Object {id_by_host: Object, uri: "tag:mstdn.oresys.nagoya,2017-05-27:objectId=249342:objectType=Status", url: "https://mstdn.oresys.nagoya/users/kumasun/updates/4859", content: "<p><span class="h-card"><a href="https://mstdn.jp/…pan>kumasun</span></a></span><br>this is test</p>", created_at: "2017-05-27T15:20:40.000Z"…} Object {id_by_host: Object, username: "kumasun", acct: "[email protected]", display_name: "森野くますん", locked: false…}
WebsocketManager.es6:59 TypeError: Cannot read property 'mention' of undefined
    at NotificationCenter.notifyUser (NotificationCenter.es6:129)
    at NotificationCenter.onNotificationReceived (NotificationCenter.es6:102)
    at NotificationCenter.onWebsocketMessage (NotificationCenter.es6:85)
    at WebsocketConnection.emit (WebsocketManager.es6:77)
    at WebsocketConnection.onMessage (WebsocketManager.es6:57)
onMessage @ WebsocketManager.es6:59
NotificationCenter.es6:129 Uncaught TypeError: Cannot read property 'mention' of undefined
    at NotificationCenter.notifyUser (NotificationCenter.es6:129)
    at NotificationCenter.onNotificationReceived (NotificationCenter.es6:102)
    at NotificationCenter.onWebsocketMessage (NotificationCenter.es6:85)
    at WebsocketConnection.emit (WebsocketManager.es6:77)
    at WebsocketConnection.onMessage (WebsocketManager.es6:57)
notifyUser @ NotificationCenter.es6:129
onNotificationReceived @ NotificationCenter.es6:102
onWebsocketMessage @ NotificationCenter.es6:85
emit @ WebsocketManager.es6:77
onMessage @ WebsocketManager.es6:57
NotificationCenter.es6:83 on Object {host: "mstdn.jp", id: 9919905, type: "favourite", created_at: "2017-05-27T15:20:53.797Z", account: "https://mstdn.oresys.nagoya/@kumasun"…} Object {id_by_host: Object, uri: "tag:mstdn.jp,2017-05-27:objectId=14897482:objectType=Status", url: "https://mstdn.jp/@kumasun/14897482", content: "<p>ぐっもーにん。</p>", created_at: "2017-05-27T01:42:14.510Z"…} Object {id_by_host: Object, username: "kumasun", acct: "[email protected]", display_name: "森野くますん", locked: false…}
WebsocketManager.es6:59 TypeError: Cannot read property 'favourite' of undefined
    at NotificationCenter.notifyUser (NotificationCenter.es6:129)
    at NotificationCenter.onNotificationReceived (NotificationCenter.es6:102)
    at NotificationCenter.onWebsocketMessage (NotificationCenter.es6:85)
    at WebsocketConnection.emit (WebsocketManager.es6:77)
    at WebsocketConnection.onMessage (WebsocketManager.es6:57)
onMessage @ WebsocketManager.es6:59
NotificationCenter.es6:129 Uncaught TypeError: Cannot read property 'favourite' of undefined
    at NotificationCenter.notifyUser (NotificationCenter.es6:129)
    at NotificationCenter.onNotificationReceived (NotificationCenter.es6:102)
    at NotificationCenter.onWebsocketMessage (NotificationCenter.es6:85)
    at WebsocketConnection.emit (WebsocketManager.es6:77)
    at WebsocketConnection.onMessage (WebsocketManager.es6:57)
notifyUser @ NotificationCenter.es6:129
onNotificationReceived @ NotificationCenter.es6:102
onWebsocketMessage @ NotificationCenter.es6:85
emit @ WebsocketManager.es6:77
onMessage @ WebsocketManager.es6:57

openpgp.jsが存在しない

alpha-0.1.2-14-g0555e3d

Google Chrome Console

openpgp.js:1 GET http://example.com/static/openpgp.js 404 (Not Found)
openpgp.js:21066 Uncaught Error: Unhandled error in openpgp worker: Uncaught [object DOMException] (http://example.com/static/openpgp.worker.js:23)
    at Worker.AsyncProxy.worker.onerror (openpgp.js:21066)
AsyncProxy.worker.onerror @ openpgp.js:21066
openpgp.worker.js:23 Uncaught [object DOMException]
1 @ openpgp.worker.js:23
s @ openpgp.worker.js:1
e @ openpgp.worker.js:1
(anonymous) @ openpgp.worker.js:1

サーバのstaticディレクトリ内のファイル一覧

$ ls -l static/
total 8348
drwxrwxr-x. 2 naumanni naumanni     109 May 20 22:25 font
drwxrwxr-x. 2 naumanni naumanni      85 May 18 11:55 images
-rw-rw-r--. 1 naumanni naumanni 3762953 May 21 01:24 main.bundle.js
-rw-rw-r--. 1 naumanni naumanni 4381079 May 21 01:24 main.bundle.js.map
-rw-rw-r--. 1 naumanni naumanni   53971 May 21 01:24 main.css
-rw-r--r--. 1 naumanni naumanni  333136 May 21 01:22 openpgp.min.js
-rw-r--r--. 1 naumanni naumanni    3723 May 21 01:22 openpgp.worker.js
-rw-r--r--. 1 naumanni naumanni    1514 May 21 01:22 openpgp.worker.min.js

お知らせページ または ポップアップがほしい

(要望)
設置者情報などが表示されるページ、もしくはポップアップを出したい。

  • 公開サーバで不特定多数に使用してもらうとき、設置者が誰なのか分からないため。
  • 利用者に対して、メンテナンス・サービス情報等のお知らせを掲示したいため。

Notificationsスクロール時に、PagingColumn.es6でエラーが出る

alpha-0.1.2-35-ga4e8117
Windows 10 / Google Chrome 58.0.3029.110 (64-bit)

#41 再現実験時に発見しました
Notifications欄を下へスクロールした後、最上部へスクロールする動作を何度か繰り返すと発生します。
(発生しない時もあります。。。)

PrintLogger.js:53   InitializeApplicationUseCase(includes "LoadTokensUseCase")
PrintLogger.js:53   ReplaceDialogsUseCase
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
NotificationCenter.es6:49 addListener
PrintLogger.js:53   Store is changed
PagingColumn.es6:158 Uncaught (in promise) TypeError: Cannot convert undefined or null to object
    at Function.values (<anonymous>)
    at NotificationColumn.updateLoadingStatus (PagingColumn.es6:158)
    at loaderInfo.loader.loadNext.then.loaderInfo.loading (NotificationsColumn.es6:86)
    at <anonymous>
updateLoadingStatus @ PagingColumn.es6:158
loaderInfo.loader.loadNext.then.loaderInfo.loading @ NotificationsColumn.es6:86
PagingColumn.es6:158 Uncaught (in promise) TypeError: Cannot convert undefined or null to object
    at Function.values (<anonymous>)
    at NotificationColumn.updateLoadingStatus (PagingColumn.es6:158)
    at loaderInfo.loader.loadNext.then.loaderInfo.loading (NotificationsColumn.es6:86)
    at <anonymous>
updateLoadingStatus @ PagingColumn.es6:158
loaderInfo.loader.loadNext.then.loaderInfo.loading @ NotificationsColumn.es6:86
PagingColumn.es6:158 Uncaught (in promise) TypeError: Cannot convert undefined or null to object
    at Function.values (<anonymous>)
    at NotificationColumn.updateLoadingStatus (PagingColumn.es6:158)
    at loaderInfo.loader.loadNext.then.loaderInfo.loading (NotificationsColumn.es6:86)
    at <anonymous>
updateLoadingStatus @ PagingColumn.es6:158
loaderInfo.loader.loadNext.then.loaderInfo.loading @ NotificationsColumn.es6:86

[要望] 公開鍵について

公開鍵がプロフィールに書かれますが現在
PGP Key Fingerprint: <40桁の英数字>
となっており、160文字使えるうちの約60文字が使えなくなるので PGP Key Fingerprint の部分を短縮できませんでしょうか?

[要望] メモ機能が欲しい

他ユーザーのプロフィールに任意のメモを追加して保存出来るプライベートノート機能が欲しいです。

イメージとしては以下のような感じです。
https://gyazo.com/8c963329af72602d4cfee0bafb4c070e

リモートフォローするとエラーが出る

alpha-0.1.2-14-g0555e3d

あるユーザーをリモートフォローしようとしたところ、エラーが出力されました。
フォローそのものは成功しています。

routes.es6:51 routeUserDetail
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
MastodonAPISpec.es6:123 Uncaught (in promise) TypeError: Cannot read property '8175' of undefined
    at http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:15937:35
    at Array.map (native)
    at normalizeResponse (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:15936:46)
    at MastodonAPISpec.normalize (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:16003:35)
    at OAuthAPIRequester._callee2$ (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:43511:56)
    at tryCatch (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:111035:40)
    at Generator.invoke [as _invoke] (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:111270:22)
    at Generator.prototype.(anonymous function) [as next] (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:111087:21)
    at step (http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:43173:191)
    at http://example.com/static/main.bundle.js?_t=__NAUMMANI_VERSION__:43173:361
    at <anonymous>
(anonymous) @ MastodonAPISpec.es6:123
normalizeResponse @ MastodonAPISpec.es6:123
normalize @ MastodonAPISpec.es6:172
_callee2$ @ APIRequester.es6:234
tryCatch @ runtime.js:64
invoke @ runtime.js:299
prototype.(anonymous function) @ runtime.js:116
step @ APIRequester.es6:3
(anonymous) @ APIRequester.es6:3

フォローされると、WebsocketManager.es6でエラー

alpha-0.1.2-158-g77b517c
Windows 10/Google Chrome 58.0.3029.110 (64-bit)

他インスタンスのユーザーからフォローされたところ、エラーが発生しました。

PrintLogger.js:53   InitializeApplicationUseCase(includes "LoadTokensUseCase")
PrintLogger.js:53   ReplaceDialogsUseCase
NotificationCenter.es6:51 addListener
NotificationCenter.es6:51 addListener
NotificationCenter.es6:51 addListener
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
PrintLogger.js:53   ReplaceDialogsUseCase
PrintLogger.js:53   Store is changed
WebsocketManager.es6:59 TypeError: Cannot read property 'toJSON' of null
    at NotificationCenter.onWebsocketMessage (NotificationCenter.es6:83)
    at WebsocketConnection.emit (WebsocketManager.es6:77)
    at WebsocketConnection.onMessage (WebsocketManager.es6:57)
onMessage @ WebsocketManager.es6:59
NotificationCenter.es6:83 Uncaught TypeError: Cannot read property 'toJSON' of null
    at NotificationCenter.onWebsocketMessage (NotificationCenter.es6:83)
    at WebsocketConnection.emit (WebsocketManager.es6:77)
    at WebsocketConnection.onMessage (WebsocketManager.es6:57)
onWebsocketMessage @ NotificationCenter.es6:83
emit @ WebsocketManager.es6:77
onMessage @ WebsocketManager.es6:57

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.