From aa39ff0a37d68a9578a171f102653dae9578f7c0 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Sun, 5 Feb 2023 15:26:28 +0800 Subject: [PATCH] rewrite components with Svelte --- .../invitation-codes/assets/CodeField.svelte | 29 +++++ plugins/invitation-codes/assets/register.ts | 11 ++ plugins/invitation-codes/assets/register.tsx | 50 --------- .../assets/RegistrationLinksList.svelte | 75 +++++++++++++ .../assets/generate.ts | 5 + .../assets/generate.tsx | 84 -------------- .../assets/BindPlayer.svelte | 100 +++++++++++++++++ .../single-player-limit/assets/BindPlayer.tsx | 103 ------------------ plugins/single-player-limit/assets/bind.ts | 3 + plugins/single-player-limit/bootstrap.php | 2 +- 10 files changed, 224 insertions(+), 238 deletions(-) create mode 100644 plugins/invitation-codes/assets/CodeField.svelte create mode 100644 plugins/invitation-codes/assets/register.ts delete mode 100644 plugins/invitation-codes/assets/register.tsx create mode 100644 plugins/share-registration-link/assets/RegistrationLinksList.svelte create mode 100644 plugins/share-registration-link/assets/generate.ts delete mode 100644 plugins/share-registration-link/assets/generate.tsx create mode 100644 plugins/single-player-limit/assets/BindPlayer.svelte delete mode 100644 plugins/single-player-limit/assets/BindPlayer.tsx create mode 100644 plugins/single-player-limit/assets/bind.ts diff --git a/plugins/invitation-codes/assets/CodeField.svelte b/plugins/invitation-codes/assets/CodeField.svelte new file mode 100644 index 00000000..b0974e46 --- /dev/null +++ b/plugins/invitation-codes/assets/CodeField.svelte @@ -0,0 +1,29 @@ + + + +
+
+ +
+
diff --git a/plugins/invitation-codes/assets/register.ts b/plugins/invitation-codes/assets/register.ts new file mode 100644 index 00000000..62a13e49 --- /dev/null +++ b/plugins/invitation-codes/assets/register.ts @@ -0,0 +1,11 @@ +import CodeField from './CodeField.svelte' + +globalThis.blessing.event.on('mounted', () => { + const div = document.createElement('div') + div.className = 'input-group mb-3' + new CodeField({ target: div }) + + setTimeout(() => { + document.querySelector('.input-group:nth-child(4)')?.after(div) + }, 0) +}) diff --git a/plugins/invitation-codes/assets/register.tsx b/plugins/invitation-codes/assets/register.tsx deleted file mode 100644 index 5e25d709..00000000 --- a/plugins/invitation-codes/assets/register.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React, { useState, useEffect } from 'react' -import * as ReactDOM from 'react-dom' -import { event, t } from 'blessing-skin' - -const CodeField: React.FC = () => { - const [code, setCode] = useState('') - - useEffect(() => { - const off = event.on( - 'beforeFetch', - (request: { data: Record }) => { - request.data.invitationCode = code - }, - ) - - return off - }, [code]) - - const handleCodeChange = (event: React.ChangeEvent) => { - setCode(event.target.value) - } - - return ( - <> - -
-
- -
-
- - ) -} - -event.on('mounted', () => { - const div = document.createElement('div') - div.className = 'input-group mb-3' - ReactDOM.render(, div) - - setTimeout(() => { - document.querySelector('.input-group:nth-child(4)')?.after(div) - }, 0) -}) diff --git a/plugins/share-registration-link/assets/RegistrationLinksList.svelte b/plugins/share-registration-link/assets/RegistrationLinksList.svelte new file mode 100644 index 00000000..f3ce1d73 --- /dev/null +++ b/plugins/share-registration-link/assets/RegistrationLinksList.svelte @@ -0,0 +1,75 @@ + + +
+
+

分享注册链接

+
+
+

+ 分享注册链接,当新用户使用此链接时,您将获得 {sharer} 积分。 同时新用户可获得 + {sharee} 积分。 +

+ {#if records.length > 0} +

可用的链接:

+
    + {#each records as record (record.id)} +
  • + {record.url} + +
  • + {/each} +
+ {:else} + 还没有已生成的链接。 + {/if} +
+ +
+ + diff --git a/plugins/share-registration-link/assets/generate.ts b/plugins/share-registration-link/assets/generate.ts new file mode 100644 index 00000000..31117a89 --- /dev/null +++ b/plugins/share-registration-link/assets/generate.ts @@ -0,0 +1,5 @@ +import RegistrationLinksList from './RegistrationLinksList.svelte' + +new RegistrationLinksList({ + target: document.querySelector('#registration-links')!, +}) diff --git a/plugins/share-registration-link/assets/generate.tsx b/plugins/share-registration-link/assets/generate.tsx deleted file mode 100644 index b2e049b4..00000000 --- a/plugins/share-registration-link/assets/generate.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import * as React from 'react' -import * as ReactDOM from 'react-dom' -import { fetch } from 'blessing-skin' - -type CodeRecord = { - id: number - sharer: number - code: string - url: string -} - -const RegistrationLinksList = () => { - const [records, setRecords] = React.useState([]) - const [sharer, setSharer] = React.useState(0) - const [sharee, setSharee] = React.useState(0) - - React.useEffect(() => { - const getLinks = async () => { - const response: { - records: CodeRecord[] - sharer: number - sharee: number - } = await fetch.get('/user/reg-links') - setRecords(response.records) - setSharer(response.sharer) - setSharee(response.sharee) - } - getLinks() - }, []) - - const handleDeleteClick = async (record: CodeRecord) => { - const { id } = record - await fetch.del(`/user/reg-links/${id}`) - setRecords((records) => records.filter((record) => record.id !== id)) - } - - const handleGenerateClick = async () => { - const { - data: { record }, - }: { data: { record: CodeRecord } } = await fetch.post('/user/reg-links') - setRecords((records) => [...records, record]) - } - - return ( -
-
-

分享注册链接

-
-
-

- 分享注册链接,当新用户使用此链接时,您将获得 {sharer} 积分。 - 同时新用户可获得 {sharee} 积分。 -

- {records.length > 0 ? ( - <> -

可用的链接:

- - - ) : ( - '还没有已生成的链接。' - )} -
-
- -
-
- ) -} - -ReactDOM.render( - , - document.querySelector('#registration-links'), -) diff --git a/plugins/single-player-limit/assets/BindPlayer.svelte b/plugins/single-player-limit/assets/BindPlayer.svelte new file mode 100644 index 00000000..9dc6cb66 --- /dev/null +++ b/plugins/single-player-limit/assets/BindPlayer.svelte @@ -0,0 +1,100 @@ + + +{#if isLoading} +

Loading...

+{:else} +
+ {#if players.length > 0} +

{t('single-player-limit.bindExistedPlayer')}

+
+ {#each players as player (player)} + + {/each} +
+ {:else} +

{t('single-player-limit.bindNewPlayer')}

+ (selected = e.currentTarget.value)} + /> + {/if} + + +{/if} diff --git a/plugins/single-player-limit/assets/BindPlayer.tsx b/plugins/single-player-limit/assets/BindPlayer.tsx deleted file mode 100644 index 1193109f..00000000 --- a/plugins/single-player-limit/assets/BindPlayer.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import * as React from 'react' -import * as ReactDOM from 'react-dom' -import { fetch, notify, base_url, t } from 'blessing-skin' - -type Player = { - pid: number - name: string - uid: number - tid_skin: number - tid_cape: number - last_modified: string -} - -const BindPlayer: React.FC = () => { - const [players, setPlayers] = React.useState([]) - const [selected, setSelected] = React.useState('') - const [isLoading, setIsLoading] = React.useState(false) - const [isPending, setIsPending] = React.useState(false) - - React.useEffect(() => { - const getPlayers = async () => { - setIsLoading(true) - const data = await fetch.get('/user/player/list') - const players = data.map((player) => player.name) - setPlayers(players) - setSelected(players[0]) - setIsLoading(false) - } - getPlayers() - }, []) - - const handleSubmit = async (event: React.FormEvent) => { - event.preventDefault() - setIsPending(true) - - const { - code, - message, - }: { - code: number - message: string - } = await fetch.post('/user/player/bind', { player: selected }) - if (code === 0) { - await notify.showModal({ mode: 'alert', text: message }) - window.location.href = `${base_url}/user` - } else { - notify.showModal({ mode: 'alert', text: message }) - } - - setIsPending(false) - } - - return isLoading ? ( -

Loading...

- ) : ( -
- {players.length > 0 ? ( - <> -

{t('single-player-limit.bindExistedPlayer')}

-
- {players.map((player) => ( - - ))} -
- - ) : ( - <> -

{t('single-player-limit.bindNewPlayer')}

- setSelected(e.target.value)} - /> - - )} - -
- ) -} - -ReactDOM.render(, document.querySelector('#form')) diff --git a/plugins/single-player-limit/assets/bind.ts b/plugins/single-player-limit/assets/bind.ts new file mode 100644 index 00000000..dfd7d3dd --- /dev/null +++ b/plugins/single-player-limit/assets/bind.ts @@ -0,0 +1,3 @@ +import BindPlayer from './BindPlayer.svelte' + +new BindPlayer({ target: document.querySelector('#form')! }) diff --git a/plugins/single-player-limit/bootstrap.php b/plugins/single-player-limit/bootstrap.php index 5e4bee98..d7f923ab 100644 --- a/plugins/single-player-limit/bootstrap.php +++ b/plugins/single-player-limit/bootstrap.php @@ -37,7 +37,7 @@ $user->save(); }); - Hook::addScriptFileToPage($plugin->assets('BindPlayer.js'), ['user/player/bind']); + Hook::addScriptFileToPage($plugin->assets('bind.js'), ['user/player/bind']); Hook::addRoute(function () { Route::namespace('SinglePlayerLimit') ->middleware(['web', 'authorize'])