mirror of
https://github.com/kevachat/webapp.git
synced 2025-03-10 04:21:01 +00:00
implement view modes support, add stream mode
This commit is contained in:
parent
8b4d8d1825
commit
4d54186891
2
.env
2
.env
@ -19,7 +19,7 @@ APP_ENV=dev
|
||||
APP_SECRET=EDIT_ME
|
||||
###< symfony/framework-bundle ###
|
||||
|
||||
APP_VERSION=1.5.7
|
||||
APP_VERSION=1.6.0
|
||||
|
||||
APP_NAME=KevaChat
|
||||
|
||||
|
@ -50,6 +50,12 @@ Application package contain settings preset, just few steps required to launch:
|
||||
* Create at least one room namespace with Web UI or CLI `kevacoin-cli keva_namespace "sandbox"`
|
||||
* Provide at least one namespace for default chat room to `env`.`APP_KEVACOIN_ROOM_NAMESPACE_DEFAULT` (for homepage redirects)
|
||||
|
||||
## Modes
|
||||
|
||||
KevaChat supported following `mode` in `GET` requests:
|
||||
|
||||
* `stream` - useful for iframe integrations on external websites to create news feed or support chats
|
||||
|
||||
## Contribution
|
||||
|
||||
Project created by people for people: MIT License to use it for other needs e.g. new fork, chat instance or Kevacoin blockchain explorer.
|
||||
|
@ -209,4 +209,20 @@ footer > form > output
|
||||
display: block;
|
||||
font-weight: bolder;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/* apply mode corrections */
|
||||
body[data-mode="stream"] > header
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
body[data-mode="stream"] > main
|
||||
{
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
body[data-mode="stream"] > main ul li div a[name]
|
||||
{
|
||||
top: -16px;
|
||||
}
|
@ -120,13 +120,7 @@ class ModuleController extends AbstractController
|
||||
'list' => array_unique(
|
||||
$list
|
||||
),
|
||||
'form' =>
|
||||
[
|
||||
'namespace' =>
|
||||
[
|
||||
'value' => $request->get('namespace')
|
||||
]
|
||||
]
|
||||
'request' => $request
|
||||
]
|
||||
);
|
||||
}
|
||||
@ -169,6 +163,7 @@ class ModuleController extends AbstractController
|
||||
return $this->render(
|
||||
'default/module/post.html.twig',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'sign' => $request->get('sign'),
|
||||
'error' => $request->get('error'),
|
||||
@ -195,8 +190,7 @@ class ModuleController extends AbstractController
|
||||
return $this->render(
|
||||
'default/module/room.html.twig',
|
||||
[
|
||||
'name' => $request->get('name'),
|
||||
'error' => $request->get('error')
|
||||
'request' => $request
|
||||
]
|
||||
);
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace') ? $request->get('namespace') : $this->getParameter('app.kevacoin.room.namespace.default'),
|
||||
'_fragment' => 'latest'
|
||||
]
|
||||
@ -316,6 +317,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => $this->getParameter('app.maintenance'),
|
||||
@ -362,6 +364,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => $translator->trans('Namespace not found on this node!'),
|
||||
@ -390,6 +393,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => $translator->trans('Namespace for read only!'),
|
||||
@ -404,6 +408,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => sprintf(
|
||||
@ -421,6 +426,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => sprintf(
|
||||
@ -438,6 +444,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => $translator->trans('Message length out of KevaCoin protocol limits'),
|
||||
@ -452,6 +459,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => sprintf(
|
||||
@ -470,6 +478,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => sprintf(
|
||||
@ -487,6 +496,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => sprintf(
|
||||
@ -522,6 +532,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'error' => null,
|
||||
'message' => null,
|
||||
@ -534,6 +545,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => $translator->trans('Internal error! Please feedback'),
|
||||
@ -561,6 +573,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $request->get('namespace'),
|
||||
'message' => $request->get('message'),
|
||||
'error' => $this->getParameter('app.maintenance'),
|
||||
@ -604,8 +617,9 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => $translator->trans('Name length out of KevaCoin protocol limits')
|
||||
'error' => $translator->trans('Name length out of KevaCoin protocol limits')
|
||||
]
|
||||
);
|
||||
}
|
||||
@ -616,6 +630,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => sprintf(
|
||||
$translator->trans('Room name does not match node requirements: %s'),
|
||||
@ -638,6 +653,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => $translator->trans('Room with same name already exists on this node!')
|
||||
]
|
||||
@ -650,6 +666,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => sprintf(
|
||||
$translator->trans('Access denied for host %s!'),
|
||||
@ -665,6 +682,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => sprintf(
|
||||
$translator->trans('Access restricted for host %s!'),
|
||||
@ -681,6 +699,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => sprintf(
|
||||
$translator->trans('Please wait for %s seconds before add new room!'),
|
||||
@ -696,6 +715,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => sprintf(
|
||||
$translator->trans('Insufficient funds, wallet: %s'),
|
||||
@ -729,6 +749,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_namespace',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'namespace' => $namespace['namespaceId'],
|
||||
'error' => null,
|
||||
'message' => null,
|
||||
@ -741,6 +762,7 @@ class RoomController extends AbstractController
|
||||
return $this->redirectToRoute(
|
||||
'room_list',
|
||||
[
|
||||
'mode' => $request->get('mode'),
|
||||
'name' => $name,
|
||||
'error' => $translator->trans('Internal error! Please feedback')
|
||||
]
|
||||
|
@ -5,7 +5,7 @@
|
||||
<title>{% block head_title_content %}{{ 'KevaChat' | trans }}{% endblock %}</title>
|
||||
<link rel="stylesheet" type="text/css" href="{{ url('room_index') }}css/default.css?{{ app.version }}"/>
|
||||
</head>
|
||||
<body>
|
||||
<body data-mode="{% if request.get('mode') %}stream{% else %}webapp{% endif %}">
|
||||
{% block header_container %}
|
||||
<header>
|
||||
{% block header_content %}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{% if enabled %}
|
||||
<form name="post" action="{{ path('room_post', { namespace : namespace }) }}" method="post">
|
||||
<form name="post" action="{{ path('room_post', { mode : mode, namespace : namespace }) }}" method="post">
|
||||
{% if error %}
|
||||
<output name="error" for="form-post-message">{{ error }}</output>
|
||||
{% endif %}
|
||||
|
@ -1,7 +1,7 @@
|
||||
<form name="room" action="{{ path('room_add') }}" method="post">
|
||||
{% if error %}
|
||||
<output name="error" for="form-room-name">{{ error }}</output>
|
||||
<form name="room" action="{{ path('room_add', { mode : request.get('mode') }) }}" method="post">
|
||||
{% if request.get('error') %}
|
||||
<output name="error" for="form-room-name">{{ request.get('error') }}</output>
|
||||
{% endif %}
|
||||
<input type="text" name="name" id="form-room-name" value="{{ name }}" placeholder="{{ 'enter new room name...' | trans }}" />
|
||||
<input type="text" name="name" id="form-room-name" value="{{ request.get('name') }}" placeholder="{{ 'enter new room name...' | trans }}" />
|
||||
<button type="submit">{{ 'add' | trans }}</button>
|
||||
</form>
|
@ -1,14 +1,14 @@
|
||||
<form name="rooms" action="{{ path('room_index') }}" method="get">
|
||||
<input type="text" name="namespace" value="{{ form.namespace.value }}" placeholder="{{ 'join room by kevacoin namespace...' | trans }}" />
|
||||
<form name="rooms" action="{{ path('room_index', { mode : request.get('mode') }) }}" method="get">
|
||||
<input type="text" name="namespace" value="{{ request.get('namespace') }}" placeholder="{{ 'join room by kevacoin namespace...' | trans }}" />
|
||||
</form>
|
||||
{% if list %}
|
||||
{% for i, namespace in list %}
|
||||
{% if i %}•{% endif %}
|
||||
<h2>
|
||||
{% if namespace == form.namespace.value %}
|
||||
{% if namespace == request.get('namespace') %}
|
||||
{{ namespace | keva_namespace_value }}
|
||||
{% else %}
|
||||
<a href="{{ path('room_namespace', { namespace : namespace, _fragment : 'latest' }) }}">{{ namespace | keva_namespace_value }}</a>
|
||||
<a href="{{ path('room_namespace', { mode : request.get('mode'), namespace : namespace, _fragment : 'latest' }) }}">{{ namespace | keva_namespace_value }}</a>
|
||||
{% endif %}
|
||||
</h2>
|
||||
<sup>
|
||||
@ -22,8 +22,8 @@
|
||||
•
|
||||
{% endif %}
|
||||
<h2>
|
||||
{% if form.namespace.value %}
|
||||
<a href="{{ path('room_list') }}">{{ 'more...' | trans }}</a>
|
||||
{% if list %}
|
||||
<a href="{{ path('room_list', { mode : request.get('mode') }) }}">{{ 'more...' | trans }}</a>
|
||||
{% else %}
|
||||
{{ 'more...' | trans }}
|
||||
{% endif %}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% macro recursive_post_tree(namespace, tree) %}
|
||||
{% macro recursive_post_tree(mode, namespace, tree) %}
|
||||
{% import _self as self %}
|
||||
{% if tree | length %}
|
||||
<ul>
|
||||
@ -14,9 +14,9 @@
|
||||
</strong>
|
||||
{% endif %}
|
||||
•
|
||||
<a rel="nofollow" href="{{ path('room_namespace', { namespace : namespace, _fragment : post.id }) }}" title="{{ post.time | date('c') }}">{{ post.time | format_ago }}</a>
|
||||
<a rel="nofollow" href="{{ path('room_namespace', { mode : mode, namespace : namespace, _fragment : post.id }) }}" title="{{ post.time | date('c') }}">{{ post.time | format_ago }}</a>
|
||||
•
|
||||
<a rel="nofollow" href="{{ path('room_namespace', { namespace : namespace, txid : post.id, _fragment : post.id }) }}">{{ 'reply' | trans }}</a>
|
||||
<a rel="nofollow" href="{{ path('room_namespace', { mode : mode, namespace : namespace, txid : post.id, _fragment : post.id }) }}">{{ 'reply' | trans }}</a>
|
||||
{% if post.pending %}
|
||||
<span title="{{ 'pending in pool' | trans }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16">
|
||||
@ -36,7 +36,7 @@
|
||||
}}
|
||||
</div>
|
||||
{% if post.tree | length %}
|
||||
{{ self.recursive_post_tree(namespace, post.tree) }}
|
||||
{{ self.recursive_post_tree(mode, namespace, post.tree) }}
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
@ -48,7 +48,7 @@
|
||||
{% block head_title_content %}{{ request.get('namespace') | keva_namespace_value }} - {{ 'KevaChat' | trans }}{% endblock %}
|
||||
{% block main_content %}
|
||||
{% if tree %}
|
||||
{{ recursive_post_tree(request.get('namespace'), tree) }}
|
||||
{{ recursive_post_tree(request.get('mode'), request.get('namespace'), tree) }}
|
||||
<a name="latest"></a>
|
||||
{% else %}
|
||||
<ul>
|
||||
|
@ -7,7 +7,7 @@
|
||||
<li>
|
||||
<div>
|
||||
<strong>
|
||||
<a href="{{ path('room_namespace', { namespace : room.namespace, _fragment : 'latest' }) }}">{{ room.namespace | keva_namespace_value }}</a>
|
||||
<a href="{{ path('room_namespace', { mode : request.get('mode'), namespace : room.namespace, _fragment : 'latest' }) }}">{{ room.namespace | keva_namespace_value }}</a>
|
||||
</strong>
|
||||
{{ room.total }}
|
||||
<a href="{{ path('room_namespace', { namespace : room.namespace, feed : 'rss' }) }}" title="{{ 'RSS' | trans }}" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="currentColor" viewBox="0 0 16 16">
|
||||
|
Loading…
x
Reference in New Issue
Block a user