Skip to content

Commit 0c4e7b8

Browse files
authored
chore: Flarum 2.0 upgrade (#1)
* chore(2.0): update dependencies Update dependencies to Flarum 2.0 compatible versions. * chore(2.0): update infrastructure Update the extension infrastructure * chore(2.0): use new import from extension format Importing modules from an extension can now be done though `ext:vendor/extension/module-path` format. * chore(2.0): misc frontend changes Miscellaneous frontend changes * chore(2.0): misc backend changes Miscellaneous backend changes * chore(2.0): JSON:API changes Flarum 2.0 completely changes the JSON:API implementation * chore(2.0): `LESS` code changes Many variables have been renamed to light/dark specific names and most are now used as CSS variables instead. * chore: Flarum 2.0 upgrade * chore: update workflows
1 parent 6169969 commit 0c4e7b8

File tree

16 files changed

+1135
-220
lines changed

16 files changed

+1135
-220
lines changed

.github/workflows/backend.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ on: [workflow_dispatch, push, pull_request]
44

55
jobs:
66
run:
7-
uses: flarum/framework/.github/workflows/REUSABLE_backend.yml@1.x
7+
uses: flarum/framework/.github/workflows/REUSABLE_backend.yml@2.x
88
with:
99
enable_backend_testing: true
1010
enable_phpstan: true
11-
php_versions: '["8.2", "8.3", "8.4", "8.5"]'
1211

1312
backend_directory: .

.github/workflows/frontend.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on: [workflow_dispatch, push, pull_request]
44

55
jobs:
66
run:
7-
uses: flarum/framework/.github/workflows/REUSABLE_frontend.yml@1.x
7+
uses: flarum/framework/.github/workflows/REUSABLE_frontend.yml@2.x
88
with:
99
enable_bundlewatch: false
1010
enable_prettier: true
@@ -13,7 +13,7 @@ jobs:
1313
frontend_directory: ./js
1414
backend_directory: .
1515
js_package_manager: yarn
16-
main_git_branch: 1.x
16+
main_git_branch: 2.x
1717

1818
secrets:
1919
bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}

composer.json

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
"name": "fof/online-users-widget",
33
"description": "Forum Widget That Lists Online Users",
44
"keywords": [
5-
"flarum", "widget", "online", "users"
5+
"flarum",
6+
"widget",
7+
"online",
8+
"users"
69
],
710
"type": "flarum-extension",
811
"license": "MIT",
@@ -28,13 +31,12 @@
2831
"afrux/online-users-widget": "*"
2932
},
3033
"require": {
31-
"php": "^8.2",
32-
"flarum/core": "^1.8.0",
33-
"fof/forum-widgets-core": "^1.0.0"
34+
"flarum/core": "^2.0.0",
35+
"fof/forum-widgets-core": "^2.0.0"
3436
},
3537
"require-dev": {
36-
"flarum/testing": "^1.0.0",
37-
"flarum/phpstan": "*"
38+
"flarum/testing": "^2.0.0",
39+
"flarum/phpstan": "^2.0.0"
3840
},
3941
"autoload": {
4042
"psr-4": {
@@ -48,7 +50,7 @@
4850
},
4951
"extra": {
5052
"branch-alias": {
51-
"dev-1.x": "1.x-dev"
53+
"dev-2.x": "2.x-dev"
5254
},
5355
"flarum-extension": {
5456
"title": "FoF Online Users Widget",
@@ -82,5 +84,7 @@
8284
"test:integration": "Runs all integration tests.",
8385
"test:setup": "Sets up a database for use with integration tests. Execute this only once.",
8486
"analyse:phpstan": "Run static analysis"
85-
}
87+
},
88+
"minimum-stability": "beta",
89+
"prefer-stable": true
8690
}

extend.php

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111

1212
namespace FoF\OnlineUsers;
1313

14-
use Flarum\Api\Serializer as FlarumSerializer;
15-
use Flarum\Api\Controller\ShowForumController;
14+
use Flarum\Api\Context;
15+
use Flarum\Api\Endpoint;
16+
use Flarum\Api\Resource;
17+
use Flarum\Api\Schema;
1618
use Flarum\Extend;
1719

1820
return [
@@ -26,18 +28,20 @@
2628

2729
new Extend\Locales(__DIR__.'/locale'),
2830

29-
(new Extend\ApiSerializer(FlarumSerializer\ForumSerializer::class))
30-
->attribute('canViewOnlineUsersWidget', function ($serializer) {
31-
return $serializer->getActor()->hasPermission('viewOnlineUsersWidget');
32-
})
33-
->attribute('totalOnlineUsers', function (FlarumSerializer\ForumSerializer $serializer) {
34-
return resolve(UserRepository::class)->getOnlineUsers($serializer->getActor())['count'] ?? 0;
35-
})
36-
->hasMany('onlineUsers', FlarumSerializer\UserSerializer::class),
37-
38-
(new Extend\ApiController(ShowForumController::class))
39-
->addInclude(['onlineUsers'])
40-
->prepareDataForSerialization(LoadForumOnlineUsersRelationship::class),
31+
(new Extend\ApiResource(Resource\ForumResource::class))
32+
->fields(fn () => [
33+
Schema\Boolean::make('canViewOnlineUsersWidget')
34+
->get(fn ($model, Context $context) => $context->getActor()->hasPermission('viewOnlineUsersWidget')),
35+
36+
Schema\Integer::make('totalOnlineUsers')
37+
->get(fn ($model, Context $context) => resolve(UserRepository::class)->getOnlineUsers($context->getActor())['count'] ?? 0),
38+
39+
Schema\Relationship\ToMany::make('onlineUsers')
40+
->type('users')
41+
->includable()
42+
->get(fn ($model, Context $context) => resolve(UserRepository::class)->getOnlineUsers($context->getActor())['users'] ?? []),
43+
])
44+
->endpoint(Endpoint\Show::class, fn (Endpoint\Show $endpoint) => $endpoint->addDefaultInclude(['onlineUsers'])),
4145

4246
(new Extend\Settings)
4347
->default('fof-online-users-widget.max_users', 15)

js/package.json

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,26 @@
55
"prettier": "@flarum/prettier-config",
66
"devDependencies": {
77
"@flarum/prettier-config": "^1.0.0",
8-
"flarum-tsconfig": "^1.0.2",
9-
"flarum-webpack-config": "^2.0.0",
108
"webpack": "^5.0",
119
"webpack-cli": "^4.0",
10+
"flarum-webpack-config": "^3.0.0",
11+
"@types/sortablejs": "^1.10.7",
12+
"bundlewatch": "^0.3.2",
1213
"prettier": "^3.0.3",
13-
"typescript": "^4.5.4"
14+
"flarum-tsconfig": "^2.0.0",
15+
"typescript": "^4.5.4",
16+
"typescript-coverage-report": "^0.6.1"
1417
},
1518
"scripts": {
1619
"dev": "webpack --mode development --watch",
1720
"build": "webpack --mode production",
21+
"analyze": "cross-env ANALYZER=true npm run build",
1822
"format": "prettier --write src",
1923
"format-check": "prettier --check src",
20-
"check-typings": "tsc --noEmit --emitDeclarationOnly false"
24+
"clean-typings": "npx rimraf dist-typings && mkdir dist-typings",
25+
"build-typings": "npm run clean-typings && ([ -e src/@types ] && cp -r src/@types dist-typings/@types || true) && tsc && npm run post-build-typings",
26+
"post-build-typings": "find dist-typings -type f -name '*.d.ts' -print0 | xargs -0 sed -i '' 's,../src/@types,@types,g'",
27+
"check-typings": "tsc --noEmit --emitDeclarationOnly false",
28+
"check-typings-coverage": "typescript-coverage-report"
2129
}
2230
}

js/src/admin/extend.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import app from 'flarum/admin/app';
2+
import Extend from 'flarum/common/extenders';
3+
4+
export default [
5+
new Extend.Admin()
6+
.setting(() => ({
7+
setting: 'fof-online-users-widget.max_users',
8+
label: app.translator.trans('fof-online-users-widget.admin.settings.max_users'),
9+
type: 'number',
10+
}))
11+
.setting(() => ({
12+
setting: 'fof-online-users-widget.last_seen_interval',
13+
label: app.translator.trans('fof-online-users-widget.admin.settings.last_seen_interval'),
14+
type: 'number',
15+
}))
16+
.setting(() => ({
17+
setting: 'fof-online-users-widget.cache_ttl',
18+
label: app.translator.trans('fof-online-users-widget.admin.settings.cache_ttl'),
19+
type: 'number',
20+
}))
21+
.permission(
22+
() => ({
23+
icon: 'fas fa-user-clock',
24+
label: app.translator.trans('fof-online-users-widget.admin.permissions.view_online_users_widget'),
25+
permission: 'viewOnlineUsersWidget',
26+
allowGuest: true,
27+
}),
28+
'view'
29+
),
30+
];

js/src/admin/index.ts

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,8 @@
11
import app from 'flarum/admin/app';
22
import registerWidget from '../common/registerWidget';
33

4+
export { default as extend } from './extend';
5+
46
app.initializers.add('fof/online-users-widget', () => {
57
registerWidget(app);
6-
7-
app.extensionData
8-
.for('fof-online-users-widget')
9-
.registerSetting({
10-
setting: 'fof-online-users-widget.max_users',
11-
label: app.translator.trans('fof-online-users-widget.admin.settings.max_users'),
12-
type: 'number',
13-
})
14-
.registerSetting({
15-
setting: 'fof-online-users-widget.last_seen_interval',
16-
label: app.translator.trans('fof-online-users-widget.admin.settings.last_seen_interval'),
17-
type: 'number',
18-
})
19-
.registerSetting({
20-
setting: 'fof-online-users-widget.cache_ttl',
21-
label: app.translator.trans('fof-online-users-widget.admin.settings.cache_ttl'),
22-
type: 'number',
23-
})
24-
.registerPermission(
25-
{
26-
icon: 'fas fa-user-clock',
27-
label: app.translator.trans('fof-online-users-widget.admin.permissions.view_online_users_widget'),
28-
permission: 'viewOnlineUsersWidget',
29-
allowGuest: true,
30-
},
31-
'view'
32-
);
338
});

js/src/common/components/OnlineUsersWidget.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import app from 'flarum/common/app';
22
import type Mithril from 'mithril';
33
import LoadingIndicator from 'flarum/common/components/LoadingIndicator';
44
import Tooltip from 'flarum/common/components/Tooltip';
5-
import avatar from 'flarum/common/helpers/avatar';
5+
import Avatar from 'flarum/common/components/Avatar';
66
import Link from 'flarum/common/components/Link';
77
import extractText from 'flarum/common/utils/extractText';
88
import type User from 'flarum/common/models/User';
99

10-
import Widget, { type WidgetAttrs } from 'flarum/extensions/fof-forum-widgets-core/common/components/Widget';
10+
import Widget, { type WidgetAttrs } from 'ext:fof/forum-widgets-core/common/components/Widget';
1111

1212
export default class OnlineUsersWidget extends Widget<WidgetAttrs> {
1313
className(): string {
@@ -38,7 +38,9 @@ export default class OnlineUsersWidget extends Widget<WidgetAttrs> {
3838
<div className="FoF-OnlineUsersWidget-users-list">
3939
{users.map((user: User) => (
4040
<Link href={app.route('user', { username: user.slug() })} className="FoF-OnlineUsersWidget-users-item">
41-
<Tooltip text={user.displayName()}>{avatar(user)}</Tooltip>
41+
<Tooltip text={user.displayName()}>
42+
<Avatar user={user} />
43+
</Tooltip>
4244
</Link>
4345
))}
4446
{total > users.length ? (

js/src/common/registerWidget.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import Widgets from 'flarum/extensions/fof-forum-widgets-core/common/extend/Widgets';
1+
import Widgets from 'ext:fof/forum-widgets-core/common/extend/Widgets';
22
import OnlineUsersWidget from './components/OnlineUsersWidget';
33
import type AdminApplication from 'flarum/admin/AdminApplication';
44
import type ForumApplication from 'flarum/forum/ForumApplication';

js/tsconfig.json

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
{
2-
// Use Flarum's tsconfig as a starting point
3-
"extends": "flarum-tsconfig",
4-
// This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder
5-
// and also tells your Typescript server to read core's global typings for
6-
// access to `dayjs` and `$` in the global namespace.
7-
"include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"],
8-
"compilerOptions": {
9-
"declarationDir": "./dist-typings",
10-
"baseUrl": ".",
11-
"paths": {
12-
"flarum/*": ["../vendor/flarum/core/js/dist-typings/*"],
13-
"flarum/extensions/fof-forum-widgets-core/*": ["../vendor/fof/forum-widgets-core/js/dist-typings/*"]
14-
}
2+
"extends": "flarum-tsconfig",
3+
"include": [
4+
"src/**/*",
5+
"../vendor/flarum/core/js/dist-typings/@types/**/*",
6+
"../vendor/fof/forum-widgets-core/js/dist-typings/@types/**/*",
7+
],
8+
"compilerOptions": {
9+
"declarationDir": "./dist-typings",
10+
"baseUrl": ".",
11+
"paths": {
12+
"flarum/*": [
13+
"../vendor/flarum/core/js/dist-typings/*"
14+
],
15+
"ext:fof/forum-widgets-core/*": [
16+
"../vendor/fof/forum-widgets-core/js/dist-typings/*"
17+
]
1518
}
19+
}
1620
}

0 commit comments

Comments
 (0)