-
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adds: Symfony UX Controller online/offline status (#98)
adds: Symfony UX Controller online/offline status
- Loading branch information
Showing
21 changed files
with
549 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
name: Exported files | ||
|
||
on: [push] | ||
|
||
jobs: | ||
tests: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: "Checkout code" | ||
uses: "actions/checkout@v4" | ||
|
||
- name: "Check exported files" | ||
run: | | ||
EXPECTED="LICENSE,README.md,RELEASES.md,SECURITY.md,composer.json,package.json" | ||
CURRENT="$(git archive HEAD | tar --list --exclude="assets" --exclude="assets/*" --exclude="src" --exclude="src/*" | paste -s -d ",")" | ||
echo "CURRENT =${CURRENT}" | ||
echo "EXPECTED=${EXPECTED}" | ||
test "${CURRENT}" == "${EXPECTED}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,8 @@ | ||
/vendor/ | ||
.phpunit.result.cache | ||
*.cache | ||
*.log | ||
node_modules | ||
package-lock.json | ||
/composer.lock | ||
/.phpunit.cache | ||
/vendor | ||
/.phpunit.cache/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { Controller } from '@hotwired/stimulus'; | ||
export default class extends Controller { | ||
static targets: string[]; | ||
static values: { | ||
onlineMessage: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
offlineMessage: { | ||
type: StringConstructor; | ||
default: string; | ||
}; | ||
}; | ||
readonly onlineMessageValue: string; | ||
readonly offlineMessageValue: string; | ||
readonly attributeTargets: HTMLElement[]; | ||
readonly messageTargets: HTMLElement[]; | ||
connect(): void; | ||
dispatchEvent(name: any, payload: any): void; | ||
statusChanged(data: any): void; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import { Controller } from '@hotwired/stimulus'; | ||
|
||
var Status; | ||
(function (Status) { | ||
Status["OFFLINE"] = "OFFLINE"; | ||
Status["ONLINE"] = "ONLINE"; | ||
})(Status || (Status = {})); | ||
class default_1 extends Controller { | ||
connect() { | ||
this.dispatchEvent('connect', {}); | ||
if (navigator.onLine) { | ||
this.statusChanged({ | ||
status: Status.ONLINE, | ||
message: this.onlineMessageValue, | ||
}); | ||
} | ||
else { | ||
this.statusChanged({ | ||
status: Status.OFFLINE, | ||
message: this.offlineMessageValue, | ||
}); | ||
} | ||
window.addEventListener("offline", () => { | ||
this.statusChanged({ | ||
status: Status.OFFLINE, | ||
message: this.offlineMessageValue, | ||
}); | ||
}); | ||
window.addEventListener("online", () => { | ||
this.statusChanged({ | ||
status: Status.ONLINE, | ||
message: this.onlineMessageValue, | ||
}); | ||
}); | ||
} | ||
dispatchEvent(name, payload) { | ||
this.dispatch(name, { detail: payload, prefix: 'connection-status' }); | ||
} | ||
statusChanged(data) { | ||
this.messageTargets.forEach((element) => { | ||
element.innerHTML = data.message; | ||
}); | ||
this.attributeTargets.forEach((element) => { | ||
element.setAttribute('data-connection-status', data.status); | ||
}); | ||
this.dispatchEvent('status-changed', { detail: data }); | ||
} | ||
} | ||
default_1.targets = ['message', 'attribute']; | ||
default_1.values = { | ||
onlineMessage: { type: String, default: 'You are online.' }, | ||
offlineMessage: { type: String, default: 'You are offline.' }, | ||
}; | ||
|
||
export { default_1 as default }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
module.exports = require('../jest.config.js'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
{ | ||
"name": "@pwa/connection-status", | ||
"description": "PWA for Symfony", | ||
"license": "MIT", | ||
"version": "1.0.0", | ||
"main": "dist/controller.js", | ||
"types": "dist/controller.d.ts", | ||
"symfony": { | ||
"controllers": { | ||
"connection-status": { | ||
"main": "dist/controller.js", | ||
"name": "pwa/connection-status", | ||
"webpackMode": "eager", | ||
"fetch": "eager", | ||
"enabled": true | ||
} | ||
}, | ||
"importmap": { | ||
"@hotwired/stimulus": "^3.0.0" | ||
} | ||
}, | ||
"peerDependencies": { | ||
"@hotwired/stimulus": "^3.0.0" | ||
}, | ||
"devDependencies": { | ||
"@hotwired/stimulus": "^3.0.0" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
'use strict'; | ||
|
||
import { Controller } from '@hotwired/stimulus'; | ||
|
||
enum Status { | ||
OFFLINE = 'OFFLINE', | ||
ONLINE = 'ONLINE', | ||
} | ||
export default class extends Controller { | ||
static targets = ['message', 'attribute']; | ||
static values = { | ||
onlineMessage: { type: String, default: 'You are online.' }, | ||
offlineMessage: { type: String, default: 'You are offline.' }, | ||
}; | ||
|
||
declare readonly onlineMessageValue: string; | ||
declare readonly offlineMessageValue: string; | ||
declare readonly attributeTargets: HTMLElement[]; | ||
declare readonly messageTargets: HTMLElement[]; | ||
|
||
connect() { | ||
this.dispatchEvent('connect', {}); | ||
if (navigator.onLine) { | ||
this.statusChanged({ | ||
status: Status.ONLINE, | ||
message: this.onlineMessageValue, | ||
}); | ||
} else { | ||
this.statusChanged({ | ||
status: Status.OFFLINE, | ||
message: this.offlineMessageValue, | ||
}); | ||
} | ||
|
||
window.addEventListener('offline', () => { | ||
this.statusChanged({ | ||
status: Status.OFFLINE, | ||
message: this.offlineMessageValue, | ||
}); | ||
}); | ||
window.addEventListener('online', () => { | ||
this.statusChanged({ | ||
status: Status.ONLINE, | ||
message: this.onlineMessageValue, | ||
}); | ||
}); | ||
} | ||
dispatchEvent(name, payload) { | ||
this.dispatch(name, { detail: payload, prefix: 'connection-status' }); | ||
} | ||
|
||
statusChanged(data) { | ||
this.messageTargets.forEach((element) => { | ||
element.innerHTML = data.message; | ||
}); | ||
this.attributeTargets.forEach((element) => { | ||
element.setAttribute('data-connection-status', data.status); | ||
}); | ||
this.dispatchEvent('status-changed', { detail: data }); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
'use strict'; | ||
|
||
import {Application, Controller} from '@hotwired/stimulus'; | ||
import {getByTestId, waitFor} from '@testing-library/dom'; | ||
import {clearDOM, mountDOM} from '@symfony/stimulus-testing'; | ||
import StatusController from '../src/controller'; | ||
|
||
// Controller used to check the actual controller was properly booted | ||
class CheckController extends Controller { | ||
connect() { | ||
this.element.addEventListener('pwa-status:connect', () => { | ||
this.element.classList.add('connected'); | ||
}); | ||
} | ||
} | ||
|
||
const startStimulus = () => { | ||
const application: Application = Application.start(); | ||
application.register('check', CheckController); | ||
application.register('pwa-status', StatusController); | ||
}; | ||
|
||
describe('StatusController', () => { | ||
let container: any; | ||
|
||
beforeEach(() => { | ||
container = mountDOM(` | ||
<html lang="en"> | ||
<head> | ||
<title>Symfony UX</title> | ||
</head> | ||
<body> | ||
<form | ||
data-testid="pwa-status" | ||
data-controller="check pwa-status" | ||
> | ||
</form> | ||
</body> | ||
</html> | ||
`); | ||
}); | ||
|
||
afterEach(() => { | ||
clearDOM(); | ||
}); | ||
|
||
it('connect', async () => { | ||
expect(getByTestId(container, 'pwa-status')).not.toHaveClass('connected'); | ||
|
||
startStimulus(); | ||
await waitFor(() => expect(getByTestId(container, 'pwa-status')).toHaveClass('connected')); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
module.exports = { | ||
presets: [ | ||
['@babel/preset-env', {targets: {node: 'current'}}], | ||
'@babel/react', | ||
['@babel/preset-typescript', { allowDeclareFields: true }] | ||
], | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/** | ||
* This file is used to compile the TypeScript files in the assets/src directory | ||
* of each package. | ||
* | ||
* It allows each package to spawn its own rollup process, which is necessary | ||
* to keep memory usage down. | ||
*/ | ||
const { spawnSync } = require('child_process'); | ||
const glob = require('glob'); | ||
|
||
const files = [ | ||
...glob.sync('assets/src/*controller.ts'), | ||
]; | ||
|
||
files.forEach((file) => { | ||
const result = spawnSync('node', [ | ||
'node_modules/.bin/rollup', | ||
'-c', | ||
'--environment', | ||
`INPUT_FILE:${file}`, | ||
], { | ||
stdio: 'inherit', | ||
shell: true | ||
}); | ||
|
||
if (result.error) { | ||
console.error(`Error compiling ${file}:`, result.error); | ||
} | ||
}); |
Oops, something went wrong.