1<?php
2
3class action_plugin_pwaoffline extends DokuWiki_Action_Plugin
4{
5
6    /**
7     * Registers a callback function for a given event
8     *
9     * @param Doku_Event_Handler $controller DokuWiki's event controller object
10     *
11     * @return void
12     */
13    public function register(Doku_Event_Handler $controller)
14    {
15        $controller->register_hook('MANIFEST_SEND', 'BEFORE', $this, 'add144pxImageToManifest');
16        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'collectPagesToCache');
17        $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'writeConfigToJSINFO');
18
19    }
20
21    /**
22     * [Custom event handler which performs action]
23     *
24     * Event: MANIFEST_SEND
25     *
26     * @param Doku_Event $event  event object by reference
27     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
28     *                           handler was registered]
29     *
30     * @return void
31     */
32    public function add144pxImageToManifest(Doku_Event $event, $param)
33    {
34        $event->data['icons'][] = [
35            'src' => DOKU_BASE . 'lib/plugins/pwaoffline/144.png',
36            'sizes' => '144x144',
37        ];
38    }
39
40    /**
41     * Event: AJAX_CALL_UNKNOWN
42     *
43     * @param Doku_Event $event
44     * @param            $param
45     */
46    public function collectPagesToCache(Doku_Event $event, $param)
47    {
48        if ($event->data !== 'plugin_pwaoffline') {
49            return;
50        }
51
52        global $conf, $INPUT;
53
54        // fixme do a full resync if the config was saved?
55        $ts = $INPUT->has('ts') ? $INPUT->int('ts') : 0;
56
57        search($pages, $conf['datadir'], 'search_allpages', ['skipacl' => false]);
58
59        $pagesToCache = [];
60        foreach ($pages as $pageData) {
61            if ($pageData['mtime'] < $ts) {
62                continue;
63            }
64            $pagesToCache[] = [
65                'link' => wl($pageData['id']),
66                'lastmod' => $pageData['mtime'],
67            ];
68        }
69
70        header('Content-Type:application/json');
71        echo json_encode($pagesToCache);
72
73        $event->preventDefault();
74        $event->stopPropagation();
75    }
76
77    /**
78     * Event: DOKUWIKI_STARTED
79     *
80     * @param Doku_Event $event
81     * @param            $param
82     */
83    public function writeConfigToJSINFO(Doku_Event $event, $param)
84    {
85        global $ACT;
86        if (act_clean($ACT) === 'pwaoffline_serviceworker') {
87            header('Content-Type:application/javascript');
88            $swjs = file_get_contents(__DIR__ . '/sw.js');
89            echo $swjs;
90            echo "const swHashVersion = '" . md5($swjs) . "';\n";
91            $idbKeyVal = file_get_contents(__DIR__ . '/node_modules/idb-keyval/dist/idb-keyval-iife.min.js');
92            echo $idbKeyVal;
93            exit();
94        }
95
96        global $JSINFO;
97        header('X-DWPLUGIN-PWAOFFLINE-ACT:' . act_clean($ACT));
98        if (empty($JSINFO['plugins'])) {
99            $JSINFO['plugins'] = [];
100        }
101
102        $JSINFO['plugins']['pwaoffline'] = [
103            'ts' => time(),
104            'swHashVersion' => md5(file_get_contents(__DIR__ . '/sw.js')),
105        ];
106    }
107
108}
109