aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobody <nobody@zotlabs.com>2021-08-28 01:09:11 -0700
committernobody <nobody@zotlabs.com>2021-08-28 01:09:11 -0700
commit2866c0b1737f571c77731eabb0d60d6660caee3b (patch)
treeef72556613187c611f6b131210621cc4a11a108a
parent05152ac8c88711a74e61f75feae2c0a43dd40cc4 (diff)
parent5eaabbdb18b392478b6782fb580f22b3a1e666f2 (diff)
downloadvolse-hubzilla-2866c0b1737f571c77731eabb0d60d6660caee3b.tar.gz
volse-hubzilla-2866c0b1737f571c77731eabb0d60d6660caee3b.tar.bz2
volse-hubzilla-2866c0b1737f571c77731eabb0d60d6660caee3b.zip
Merge branch 'dev' of https://framagit.org/hubzilla/core into dev
-rw-r--r--ServiceWorker.js10
-rw-r--r--Zotlabs/Lib/Apps.php3
-rw-r--r--Zotlabs/Module/Manifest.php52
-rw-r--r--Zotlabs/Module/Poke.php96
-rw-r--r--Zotlabs/Module/Pubstream.php66
-rw-r--r--Zotlabs/Module/Randprof.php10
-rw-r--r--Zotlabs/Module/Rpost.php67
-rw-r--r--app/bugreport.apd3
-rw-r--r--app/network.apd3
-rw-r--r--app/poke.apd3
-rw-r--r--app/post.apd3
-rw-r--r--app/probe.apd3
-rw-r--r--app/pubstream.apd3
-rw-r--r--app/randprof.apd3
-rw-r--r--app/search.apd3
-rw-r--r--boot.php4
-rw-r--r--images/app/hz-120.pngbin0 -> 5552 bytes
-rw-r--r--images/app/hz-128.pngbin0 -> 5885 bytes
-rw-r--r--images/app/hz-144.pngbin0 -> 6692 bytes
-rw-r--r--images/app/hz-152.pngbin0 -> 7050 bytes
-rw-r--r--images/app/hz-180.pngbin0 -> 8522 bytes
-rw-r--r--images/app/hz-192.pngbin0 -> 9058 bytes
-rw-r--r--images/app/hz-384.pngbin0 -> 19032 bytes
-rw-r--r--images/app/hz-512.pngbin0 -> 26021 bytes
-rw-r--r--images/app/hz-72.pngbin0 -> 3332 bytes
-rw-r--r--images/app/hz-96.pngbin0 -> 4430 bytes
-rw-r--r--images/app/hz.svg112
-rw-r--r--view/js/main.js33
-rw-r--r--view/js/mod_hq.js8
29 files changed, 374 insertions, 111 deletions
diff --git a/ServiceWorker.js b/ServiceWorker.js
new file mode 100644
index 000000000..1b84fdfb7
--- /dev/null
+++ b/ServiceWorker.js
@@ -0,0 +1,10 @@
+// This file should be served from the web root to avoid scope and cookie related issues with some browsers
+self.addEventListener('install', function(e) {
+ console.log('install event');
+});
+
+self.addEventListener('fetch', function(e) {
+ // nothing here yet
+ return;
+});
+
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index ba854197f..3c09adaa5 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -78,7 +78,8 @@ class Apps {
'Search',
'Help',
'Profile Photo',
- 'HQ'
+ 'HQ',
+ 'Post'
]);
/**
diff --git a/Zotlabs/Module/Manifest.php b/Zotlabs/Module/Manifest.php
new file mode 100644
index 000000000..30a091172
--- /dev/null
+++ b/Zotlabs/Module/Manifest.php
@@ -0,0 +1,52 @@
+<?php
+namespace Zotlabs\Module;
+
+use App;
+use Zotlabs\Web\Controller;
+use Zotlabs\Lib\System;
+
+class Manifest extends Controller {
+
+ function init() {
+
+ $ret = [
+ 'name' => ucfirst(System::get_platform_name()),
+ 'short_name' => ucfirst(System::get_platform_name()),
+ 'icons' => [
+ [ 'src' => '/images/app/hz-72.png', 'sizes' => '72x72', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-96.png', 'sizes' => '96x96', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-128.png', 'sizes' => '128x128', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-144.png', 'sizes' => '144x144', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-152.png', 'sizes' => '152x152', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-192.png', 'sizes' => '192x192', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-348.png', 'sizes' => '384x384', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz-512.png', 'sizes' => '512x512', 'type' => 'image/png' ],
+ [ 'src' => '/images/app/hz.svg', 'sizes' => '64x64', 'type' => 'image/xml+svg' ]
+ ],
+ 'scope' => '/',
+ 'start_url' => z_root(),
+ 'display' => 'standalone',
+ 'orientation' => 'any',
+ 'theme_color' => '#343a40',
+ 'background_color' => '#ccccc',
+ 'share_target' => [
+ 'action' => '/rpost',
+ 'method' => 'POST',
+ 'enctype' => 'multipart/form-data',
+ 'params' => [
+ 'title' => 'title',
+ 'text' => 'body',
+ 'url' => 'url',
+ 'files' => [
+ [ 'name' => 'userfile',
+ 'accept' => [ 'image/*', 'audio/*', 'video/*', 'text/*', 'application/*' ]
+ ]
+ ]
+ ]
+ ]
+ ];
+
+ json_return_and_die($ret,'application/manifest+json');
+ }
+
+}
diff --git a/Zotlabs/Module/Poke.php b/Zotlabs/Module/Poke.php
index 1f1edfa18..d60a7f426 100644
--- a/Zotlabs/Module/Poke.php
+++ b/Zotlabs/Module/Poke.php
@@ -9,11 +9,11 @@ use Zotlabs\Web\Controller;
*
* Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book
* This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or
- * other web request. You must be logged in and connected to a channel.
+ * other web request. You must be logged in and connected to a channel.
* If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb.
* parent is a special argument which let's you attach this activity as a comment to an existing conversation, which
* may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult
- * plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
+ * plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
*
* private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used.
*
@@ -25,41 +25,41 @@ require_once('include/items.php');
class Poke extends Controller {
function init() {
-
+
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'Poke')) {
return;
}
-
+
$uid = local_channel();
$channel = App::get_channel();
-
+
$verb = notags(trim($_REQUEST['verb']));
-
- if(! $verb)
+
+ if(! $verb)
return;
-
+
$verbs = get_poke_verbs();
-
+
if(! array_key_exists($verb,$verbs))
return;
-
+
$activity = ACTIVITY_POKE . '#' . urlencode($verbs[$verb][0]);
-
+
$contact_id = intval($_REQUEST['cid']);
$xchan = trim($_REQUEST['xchan']);
if(! ($contact_id || $xchan))
return;
-
+
$parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
-
+
logger('poke: verb ' . $verb . ' contact ' . $contact_id, LOGGER_DEBUG);
-
-
+
+
if($contact_id) {
$r = q("SELECT * FROM abook left join xchan on xchan_hash = abook_xchan where abook_id = %d and abook_channel = %d LIMIT 1",
intval($contact_id),
@@ -71,17 +71,17 @@ class Poke extends Controller {
dbesc($xchan . '%')
);
}
-
+
if(! $r) {
logger('poke: no target.');
return;
}
-
+
$target = $r[0];
$parent_item = null;
-
+
if($parent) {
- $r = q("select mid, item_private, owner_xchan, allow_cid, allow_gid, deny_cid, deny_gid
+ $r = q("select mid, item_private, owner_xchan, allow_cid, allow_gid, deny_cid, deny_gid
from item where id = %d and parent = %d and uid = %d limit 1",
intval($parent),
intval($parent),
@@ -98,18 +98,18 @@ class Poke extends Controller {
}
}
elseif($contact_id) {
-
+
$item_private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
-
+
$allow_cid = (($item_private) ? '<' . $target['abook_xchan']. '>' : $channel['channel_allow_cid']);
$allow_gid = (($item_private) ? '' : $channel['channel_allow_gid']);
$deny_cid = (($item_private) ? '' : $channel['channel_deny_cid']);
$deny_gid = (($item_private) ? '' : $channel['channel_deny_gid']);
}
-
-
+
+
$arr = array();
-
+
$arr['item_wall'] = 1;
@@ -124,7 +124,7 @@ class Poke extends Controller {
$arr['item_private'] = $item_private;
$arr['obj_type'] = ACTIVITY_OBJ_PERSON;
$arr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t($verbs[$verb][0]) . ' ' . '[zrl=' . $target['xchan_url'] . ']' . $target['xchan_name'] . '[/zrl]';
-
+
$obj = array(
'type' => ACTIVITY_OBJ_PERSON,
'title' => $target['xchan_name'],
@@ -134,25 +134,25 @@ class Poke extends Controller {
array('rel' => 'photo', 'type' => $target['xchan_photo_mimetype'], 'href' => $target['xchan_photo_l'])
),
);
-
+
$arr['obj'] = json_encode($obj);
-
+
$arr['item_origin'] = 1;
$arr['item_wall'] = 1;
$arr['item_unseen'] = 1;
if(! $parent_item)
$item['item_thread_top'] = 1;
-
-
+
+
post_activity_item($arr);
-
+
return;
}
-
-
-
+
+
+
function get() {
-
+
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
@@ -161,19 +161,17 @@ class Poke extends Controller {
if(! Apps::system_app_installed(local_channel(), 'Poke')) {
//Do not display any associated widgets at this point
App::$pdl = '';
-
- $o = '<b>' . t('Poke App') . ' (' . t('Not Installed') . '):</b><br>';
- $o .= t('Poke somebody in your addressbook');
- return $o;
+ $papp = Apps::get_papp('Poke');
+ return Apps::app_render($papp, 'module');
}
nav_set_selected('Poke');
-
+
$name = '';
$id = '';
-
+
if(intval($_REQUEST['c'])) {
- $r = q("select abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash
+ $r = q("select abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash
where abook_id = %d and abook_channel = %d limit 1",
intval($_REQUEST['c']),
intval(local_channel())
@@ -183,17 +181,17 @@ class Poke extends Controller {
$id = $r[0]['abook_id'];
}
}
-
+
$parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : '0');
-
+
$verbs = get_poke_verbs();
-
+
$shortlist = array();
foreach($verbs as $k => $v)
if($v[1] !== 'NOTRANSLATION')
$shortlist[] = array($k,$v[1]);
-
-
+
+
$poke_basic = get_config('system','poke_basic');
if($poke_basic) {
$title = t('Poke');
@@ -203,7 +201,7 @@ class Poke extends Controller {
$title = t('Poke/Prod');
$desc = t('Poke, prod or do other things to somebody');
}
-
+
$o = replace_macros(get_markup_template('poke_content.tpl'),array(
'$title' => $title,
'$poke_basic' => $poke_basic,
@@ -218,8 +216,8 @@ class Poke extends Controller {
'$name' => $name,
'$id' => $id
));
-
+
return $o;
-
+
}
}
diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php
index 9c63c735d..32023d6cc 100644
--- a/Zotlabs/Module/Pubstream.php
+++ b/Zotlabs/Module/Pubstream.php
@@ -16,10 +16,8 @@ class Pubstream extends \Zotlabs\Web\Controller {
if(! Apps::system_app_installed(local_channel(), 'Public Stream')) {
//Do not display any associated widgets at this point
App::$pdl = '';
-
- $o = '<b>' . t('Public Stream App') . ' (' . t('Not Installed') . '):</b><br>';
- $o .= t('The unmoderated public stream of this hub');
- return $o;
+ $papp = Apps::get_papp('Public Stream');
+ return Apps::app_render($papp, 'module');
}
}
@@ -65,15 +63,15 @@ class Pubstream extends \Zotlabs\Web\Controller {
$o = (($hashtags) ? $title : '');
if(local_channel() && (! $update)) {
-
+
$channel = \App::get_channel();
$channel_acl = array(
- 'allow_cid' => $channel['channel_allow_cid'],
- 'allow_gid' => $channel['channel_allow_gid'],
- 'deny_cid' => $channel['channel_deny_cid'],
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
'deny_gid' => $channel['channel_deny_gid']
- );
+ );
$x = array(
'is_owner' => true,
@@ -94,12 +92,12 @@ class Pubstream extends \Zotlabs\Web\Controller {
'jotnets' => true,
'reset' => t('Reset form')
);
-
+
$o .= '<div id="jot-popup">';
$o .= status_editor($a,$x,false,'Pubstream');
$o .= '</div>';
}
-
+
if(! $update && !$load) {
nav_set_selected(t('Public Stream'));
@@ -110,13 +108,13 @@ class Pubstream extends \Zotlabs\Web\Controller {
$maxheight = get_config('system','home_divmore_height');
if(! $maxheight)
$maxheight = 400;
-
+
$o .= '<div id="live-pubstream"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
- . "; var profile_page = " . \App::$pager['page']
+ $o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
+ . "; var profile_page = " . \App::$pager['page']
. "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
-
- //if we got a decoded hash we must encode it again before handing to javascript
+
+ //if we got a decoded hash we must encode it again before handing to javascript
if($decoded)
$mid = 'b64.' . base64url_encode($mid);
@@ -151,7 +149,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
'$dbegin' => ''
));
}
-
+
if($update && ! $load) {
// only setup pagination on initial page view
$pager_sql = '';
@@ -160,10 +158,10 @@ class Pubstream extends \Zotlabs\Web\Controller {
\App::set_pager_itemspage(10);
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
}
-
+
require_once('include/channel.php');
require_once('include/security.php');
-
+
if($site_firehose) {
$uids = " and item.uid in ( " . stream_perms_api_uids(PERMS_PUBLIC) . " ) and item_private = 0 and item_wall = 1 ";
}
@@ -173,7 +171,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
$sql_extra = item_permissions_sql($sys['channel_id']);
\App::$data['firehose'] = intval($sys['channel_id']);
}
-
+
if(get_config('system','public_list_mode'))
$page_mode = 'list';
else
@@ -184,7 +182,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
$sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
}
- $net_query = (($net) ? " left join xchan on xchan_hash = author_xchan " : '');
+ $net_query = (($net) ? " left join xchan on xchan_hash = author_xchan " : '');
$net_query2 = (($net) ? " and xchan_network = '" . protect_sprintf(dbesc($net)) . "' " : '');
$abook_uids = " and abook.abook_channel = " . intval(\App::$profile['profile_uid']) . " ";
@@ -196,13 +194,13 @@ class Pubstream extends \Zotlabs\Web\Controller {
//logger('update: ' . $update . ' load: ' . $load);
if($update) {
-
+
$ordering = get_config('system', 'pubstream_ordering', 'commented');
-
+
if($load) {
if($mid) {
$r = q("SELECT parent AS item_id FROM item
- left join abook on item.author_xchan = abook.abook_xchan
+ left join abook on item.author_xchan = abook.abook_xchan
$net_query
WHERE mid = '%s' $uids $item_normal
and (abook.abook_blocked = 0 or abook.abook_flags is null)
@@ -212,7 +210,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
}
else {
// Fetch a page full of parent items for this page
- $r = q("SELECT item.id AS item_id FROM item
+ $r = q("SELECT item.id AS item_id FROM item
left join abook on ( item.author_xchan = abook.abook_xchan $abook_uids )
$net_query
WHERE true $uids and item.item_thread_top = 1 $item_normal
@@ -247,20 +245,20 @@ class Pubstream extends \Zotlabs\Web\Controller {
// Then fetch all the children of the parents that are on this page
$parents_str = '';
-
+
if($r) {
-
+
$parents_str = ids_to_querystr($r,'item_id');
-
+
$items = q("SELECT item.*, item.id AS item_id FROM item
WHERE true $uids $item_normal
AND item.parent IN ( %s )
$sql_extra ",
dbesc($parents_str)
);
-
+
// use effective_uid param of xchan_query to help sort out comment permission
- // for sys_channel owned items.
+ // for sys_channel owned items.
xchan_query($items,true,(($sys) ? local_channel() : 0));
$items = fetch_post_tags($items,true);
@@ -269,9 +267,9 @@ class Pubstream extends \Zotlabs\Web\Controller {
else {
$items = array();
}
-
+
}
-
+
// fake it
$mode = (($hashtags) ? 'search' : 'pubstream');
@@ -279,13 +277,13 @@ class Pubstream extends \Zotlabs\Web\Controller {
if($mid)
$o .= '<div id="content-complete"></div>';
-
+
if(($items) && (! $update))
$o .= alt_pager(count($items));
$_SESSION['loadtime'] = datetime_convert();
return $o;
-
+
}
}
diff --git a/Zotlabs/Module/Randprof.php b/Zotlabs/Module/Randprof.php
index c38b07ead..731d3aece 100644
--- a/Zotlabs/Module/Randprof.php
+++ b/Zotlabs/Module/Randprof.php
@@ -15,7 +15,7 @@ class Randprof extends \Zotlabs\Web\Controller {
$x = random_profile();
if($x)
goaway(chanlink_hash($x));
-
+
/** FIXME this doesn't work at the moment as a fallback */
goaway(z_root() . '/profile');
}
@@ -25,13 +25,11 @@ class Randprof extends \Zotlabs\Web\Controller {
if(! Apps::system_app_installed(local_channel(), 'Random Channel')) {
//Do not display any associated widgets at this point
App::$pdl = '';
-
- $o = '<b>' . t('Random Channel App') . ' (' . t('Not Installed') . '):</b><br>';
- $o .= t('Visit a random channel in the $Projectname network');
- return $o;
+ $papp = Apps::get_papp('Random Channel');
+ return Apps::app_render($papp, 'module');
}
}
}
-
+
}
diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php
index 80ad289b2..013817597 100644
--- a/Zotlabs/Module/Rpost.php
+++ b/Zotlabs/Module/Rpost.php
@@ -66,6 +66,73 @@ class Rpost extends \Zotlabs\Web\Controller {
nav_set_selected('Post');
+ if (local_channel() && array_key_exists('userfile',$_FILES)) {
+
+ $channel = App::get_channel();
+ $observer = App::get_observer();
+
+ $def_album = get_pconfig($channel['channel_id'],'system','photo_path');
+ $def_attach = get_pconfig($channel['channel_id'],'system','attach_path');
+
+ $r = attach_store($channel, (($observer) ? $observer['xchan_hash'] : ''), '', [
+ 'source' => 'editor',
+ 'visible' => 0,
+ 'album' => $def_album,
+ 'directory' => $def_attach,
+ 'flags' => 1, // indicates temporary permissions are created
+ 'allow_cid' => '<' . $channel['channel_hash'] . '>'
+ ]);
+
+ if (! $r['success']) {
+ notice( $r['message'] . EOL);
+ }
+
+ $s = EMPTY_STR;
+
+ if (intval($r['data']['is_photo'])) {
+ $s .= "\n\n" . $r['body'] . "\n\n";
+ }
+
+ $url = z_root() . '/cloud/' . $channel['channel_address'] . '/' . $r['data']['display_path'];
+
+ if (strpos($r['data']['filetype'],'video') === 0) {
+ $s .= "\n\n" . '[zvideo]' . $url . '[/zvideo]' . "\n\n";
+ }
+
+ if (strpos($r['data']['filetype'],'audio') === 0) {
+ $s .= "\n\n" . '[zaudio]' . $url . '[/zaudio]' . "\n\n";
+ }
+
+ if ($r['data']['filetype'] === 'image/svg+xml') {
+ $x = @file_get_contents('store/' . $channel['channel_address'] . '/' . $r['data']['os_path']);
+ if ($x) {
+ $bb = svg2bb($x);
+ if ($bb) {
+ $s .= "\n\n" . $bb;
+ }
+ else {
+ logger('empty return from svgbb');
+ }
+ }
+ else {
+ logger('unable to read svg data file: ' . 'store/' . $channel['channel_address'] . '/' . $r['data']['os_path']);
+ }
+ }
+
+ if ($r['data']['filetype'] === 'text/calendar') {
+ $content = @file_get_contents('store/' . $channel['channel_address'] . '/' . $r['data']['os_path']);
+ if ($content) {
+ $ev = ical_to_ev($content);
+ if ($ev) {
+ $s .= "\n\n" . format_event_bbcode($ev[0]) . "\n\n";
+ }
+ }
+ }
+
+ $s .= "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n";
+ $_REQUEST['body'] = ((array_key_exists('body',$_REQUEST)) ? $_REQUEST['body'] . $s : $s);
+ }
+
// If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables
if((! array_key_exists('body',$_REQUEST)) && (array_key_exists('rpost',$_SESSION))) {
diff --git a/app/bugreport.apd b/app/bugreport.apd
index f1f328013..52a2ba19c 100644
--- a/app/bugreport.apd
+++ b/app/bugreport.apd
@@ -1,5 +1,6 @@
-version: 2
+version: 3
url: https://framagit.org/hubzilla/core/issues
name: Report Bug
photo: icon:bug
categories: System
+desc: Provides a link to the Hubzilla bug tracker.
diff --git a/app/network.apd b/app/network.apd
index f67b48ffe..cbce18153 100644
--- a/app/network.apd
+++ b/app/network.apd
@@ -1,6 +1,7 @@
-version: 2
+version: 3
url: $baseurl/network, $baseurl/settings/network
requires: local_channel
name: Network
photo: icon:th
categories: nav_featured_app, Networking
+desc: Your network activity in a traditional timeline view.
diff --git a/app/poke.apd b/app/poke.apd
index cf23c29b4..490f98740 100644
--- a/app/poke.apd
+++ b/app/poke.apd
@@ -1,6 +1,7 @@
-version: 2
+version: 3
url: $baseurl/poke
requires: local_channel
name: Poke
photo: icon:hand-o-right
categories: Social
+desc: Poke somebody in your addressbook.
diff --git a/app/post.apd b/app/post.apd
index d3ce88454..d5ea7ce88 100644
--- a/app/post.apd
+++ b/app/post.apd
@@ -1,6 +1,7 @@
-version: 2
+version: 3
url: $baseurl/rpost?f=&body=
requires: observer
name: Post
photo: icon:pencil-square
categories: Productivity
+desc: A separate post editor.
diff --git a/app/probe.apd b/app/probe.apd
index 1cc8bd991..9a78f4cde 100644
--- a/app/probe.apd
+++ b/app/probe.apd
@@ -1,6 +1,7 @@
-version: 3
+version: 4
url: $baseurl/zot_probe
requires: local_channel
name: Remote Diagnostics
photo: icon:user-md
categories: Developer
+desc: A diagnose tool useful for developers.
diff --git a/app/pubstream.apd b/app/pubstream.apd
index 4447ca750..9631a19fd 100644
--- a/app/pubstream.apd
+++ b/app/pubstream.apd
@@ -1,6 +1,7 @@
-version: 2
+version: 3
url: $baseurl/pubstream
requires: public_stream
name: Public Stream
photo: icon:globe
categories: Social, nav_featured_app
+desc: View the unmoderated public content known to this hub.
diff --git a/app/randprof.apd b/app/randprof.apd
index 60281d909..4979a15c1 100644
--- a/app/randprof.apd
+++ b/app/randprof.apd
@@ -1,6 +1,7 @@
-version: 2
+version: 3
url: $baseurl/randprof
name: Random Channel
target: randprof
photo: icon:random
categories: Networking
+desc: Visit a random channel in the network.
diff --git a/app/search.apd b/app/search.apd
index 462561f33..6cf51f11f 100644
--- a/app/search.apd
+++ b/app/search.apd
@@ -1,4 +1,5 @@
-version: 2
+version: 3
url: $baseurl/search
name: Search
photo: icon:search
+desc: A separate search app to look up content, channels, tags, documentation or remote content depending on the search string prefix.
diff --git a/boot.php b/boot.php
index ab23365c4..c2d08f87a 100644
--- a/boot.php
+++ b/boot.php
@@ -1198,6 +1198,10 @@ class App {
}
}
+ // webmanifest
+ head_add_link(['rel' => 'manifest', 'href' => '/manifest.json']);
+ self::$meta->set('application-name', Zotlabs\Lib\System::get_platform_name());
+
self::$meta->set('generator', Zotlabs\Lib\System::get_platform_name());
head_add_link(['rel' => 'shortcut icon', 'href' => head_get_icon()]);
diff --git a/images/app/hz-120.png b/images/app/hz-120.png
new file mode 100644
index 000000000..a9acf1f17
--- /dev/null
+++ b/images/app/hz-120.png
Binary files differ
diff --git a/images/app/hz-128.png b/images/app/hz-128.png
new file mode 100644
index 000000000..327d1cc27
--- /dev/null
+++ b/images/app/hz-128.png
Binary files differ
diff --git a/images/app/hz-144.png b/images/app/hz-144.png
new file mode 100644
index 000000000..58b9b205a
--- /dev/null
+++ b/images/app/hz-144.png
Binary files differ
diff --git a/images/app/hz-152.png b/images/app/hz-152.png
new file mode 100644
index 000000000..bdd9e81c4
--- /dev/null
+++ b/images/app/hz-152.png
Binary files differ
diff --git a/images/app/hz-180.png b/images/app/hz-180.png
new file mode 100644
index 000000000..f43d39af1
--- /dev/null
+++ b/images/app/hz-180.png
Binary files differ
diff --git a/images/app/hz-192.png b/images/app/hz-192.png
new file mode 100644
index 000000000..e10aa6502
--- /dev/null
+++ b/images/app/hz-192.png
Binary files differ
diff --git a/images/app/hz-384.png b/images/app/hz-384.png
new file mode 100644
index 000000000..687500cee
--- /dev/null
+++ b/images/app/hz-384.png
Binary files differ
diff --git a/images/app/hz-512.png b/images/app/hz-512.png
new file mode 100644
index 000000000..86206a0da
--- /dev/null
+++ b/images/app/hz-512.png
Binary files differ
diff --git a/images/app/hz-72.png b/images/app/hz-72.png
new file mode 100644
index 000000000..52e3baf76
--- /dev/null
+++ b/images/app/hz-72.png
Binary files differ
diff --git a/images/app/hz-96.png b/images/app/hz-96.png
new file mode 100644
index 000000000..f2590eedc
--- /dev/null
+++ b/images/app/hz-96.png
Binary files differ
diff --git a/images/app/hz.svg b/images/app/hz.svg
new file mode 100644
index 000000000..61ca9e1d4
--- /dev/null
+++ b/images/app/hz.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="64.0px"
+ height="64.0px"
+ viewBox="0 0 64.0 64.0"
+ version="1.1"
+ id="SVGRoot"
+ sodipodi:docname="hz.svg"
+ inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview61"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:document-units="px"
+ showgrid="true"
+ inkscape:zoom="6.0069951"
+ inkscape:cx="16.980204"
+ inkscape:cy="24.970888"
+ inkscape:window-width="1440"
+ inkscape:window-height="831"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g141">
+ <inkscape:grid
+ type="xygrid"
+ id="grid67" />
+ </sodipodi:namedview>
+ <defs
+ id="defs56" />
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g141"
+ transform="matrix(3.7795276,0,0,3.7795276,22.748366,-1063.1931)">
+ <circle
+ style="fill:#43488a;stroke-width:0.264583;stop-color:#000000;fill-opacity:1"
+ id="path3823"
+ cx="2.4478281"
+ cy="289.76984"
+ r="8.4666662"
+ inkscape:export-filename="/run/user/1000/gvfs/sftp:host=10.3.0.14,user=root/srv/http/hub.somaton.com/www/images/app/hz-180.png"
+ inkscape:export-xdpi="270.00003"
+ inkscape:export-ydpi="270.00003" />
+ <g
+ id="g141-7"
+ transform="matrix(2.1038824,0,0,2.1655785,0.49257199,-333.55376)"
+ style="fill:#ffffff;stroke-width:0.468493;fill-opacity:1"
+ inkscape:export-filename="/run/user/1000/gvfs/sftp:host=10.3.0.14,user=root/srv/http/hub.somaton.com/www/images/app/hz-144.png"
+ inkscape:export-xdpi="276.47998"
+ inkscape:export-ydpi="276.47998">
+ <g
+ id="g2037"
+ inkscape:export-filename="/home/mario/Downloads/hz-icons/hz-512.png"
+ inkscape:export-xdpi="983.03998"
+ inkscape:export-ydpi="983.03998"
+ style="fill:#ffffff;stroke-width:0.468493;fill-opacity:1"
+ transform="translate(-4.3232614,-4.7489871)">
+ <ellipse
+ ry="1.0883039"
+ rx="1.0802424"
+ cy="292.92801"
+ cx="3.5032701"
+ id="path828-53"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0235165" />
+ <ellipse
+ ry="1.5397485"
+ rx="1.4994409"
+ cy="291.37213"
+ cx="6.5827665"
+ id="path828-5"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0329556" />
+ <ellipse
+ ry="0.78196651"
+ rx="0.79002792"
+ cy="294.54837"
+ cx="5.9217243"
+ id="path828-5-6"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0170471" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path871"
+ d="m 4.0465627,292.41576 1.3137706,-0.7355 0.1162183,0.24151 -1.2935591,0.74648 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0276335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path873"
+ d="m 4.2605136,293.26434 1.2691295,0.89108 -0.141557,0.20603 -1.2642478,-0.86532 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.02631px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path875"
+ d="m 5.8411078,293.86314 0.361292,-1.12861 0.2956026,0.0605 -0.3886627,1.11652 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0246474px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/view/js/main.js b/view/js/main.js
index 68f3415ee..f54dbf593 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -34,6 +34,7 @@ if(localStorage.getItem('uid') !== localUser.toString()) {
sessionStorage.clear();
localStorage.setItem('uid', localUser.toString());
}
+
window.onstorage = function(e) {
if(e.key === 'uid' && parseInt(e.newValue) !== localUser) {
if(window_needs_alert) {
@@ -45,6 +46,14 @@ window.onstorage = function(e) {
}
}
+if ('serviceWorker' in navigator) {
+ navigator.serviceWorker.register('/ServiceWorker.js', { scope: '/' }).then(function(registration) {
+ console.log('Service worker registered. scope is', registration.scope);
+ }).catch(function(error) {
+ console.log('Service worker registration failed because ' + error);
+ });
+}
+
$.ajaxSetup({cache: false});
$(document).ready(function() {
@@ -228,6 +237,13 @@ $(document).ready(function() {
cache_next_page();
});
+ $(document).on('hz:handleNetworkNotificationsItems', function(e, obj) {
+ push_notification(
+ obj.name,
+ $('<p>' + obj.message + '</p>').text(),
+ obj.b64mid
+ );
+ });
});
function getConversationSettings() {
@@ -890,7 +906,7 @@ function prepareLiveUpdate(b64mid, notify_id) {
if (module == 'hq') {
liveUpdate(notify_id);
}
- if (module == 'display'|| module == 'dm') {
+ if (module == 'display') {
liveUpdate();
}
}
@@ -1719,16 +1735,23 @@ function push_notification_request(e) {
}
-function push_notification(title, body, href) {
+function push_notification(title, body, b64mid) {
let options = {
body: body,
- data: href,
- icon: '/images/hz-64.png',
+ data: b64mid,
+ icon: '/images/app/hz-96.png',
silent: false
}
let n = new Notification(title, options);
n.onclick = function (e) {
- window.location.href = e.target.data;
+ if(module === 'hq') {
+ prepareLiveUpdate(e.target.data);
+ }
+ else {
+ window.location.href = baseurl + '/hq/' + e.target.data;
+ }
}
}
+
+
diff --git a/view/js/mod_hq.js b/view/js/mod_hq.js
index ad77e0af0..5f8430b4d 100644
--- a/view/js/mod_hq.js
+++ b/view/js/mod_hq.js
@@ -14,12 +14,4 @@ $(document).ready(function() {
$('#note-text').focus();
});
- $(document).on('hz:handleNetworkNotificationsItems', function(e, obj) {
- push_notification(
- obj.name,
- $('<p>' + obj.message + '</p>').text(),
- baseurl + '/hq/' + obj.b64mid
- );
- });
-
});