mirror of
https://github.com/MewoLab/AquaDX.git
synced 2026-02-05 04:17:26 +08:00
139 lines
4.2 KiB
Svelte
139 lines
4.2 KiB
Svelte
<!-- Svelte 4.2.11 -->
|
|
|
|
<script lang="ts">
|
|
import { slide } from "svelte/transition"
|
|
import { clz } from "../libs/ui";
|
|
import type { UserMe } from "../libs/generalTypes";
|
|
import { USER } from "../libs/sdk";
|
|
import moment from "moment"
|
|
|
|
let error: string = ""
|
|
let me: UserMe | null = null
|
|
|
|
// Fetch data for current user
|
|
USER.me().then(m => me = m).catch(e => error = e.message)
|
|
|
|
// Access code input
|
|
const inputACRegex = /^(\d{4} ){0,4}\d{0,4}$/
|
|
const inputACRegexFull = /^(\d{4} ){4}\d{4}$/
|
|
let inputAC = ""
|
|
|
|
function inputACChange(e: any) {
|
|
e = e as InputEvent
|
|
// Add spaces to the input
|
|
if (e.inputType === "insertText" && inputAC.length % 5 === 4 && inputAC.length < 24)
|
|
inputAC += " "
|
|
inputAC = inputAC.slice(0, 24)
|
|
}
|
|
|
|
function bindAC() {
|
|
if (inputACRegexFull.test(inputAC)) {
|
|
console.log("Binding access code", inputAC)
|
|
inputAC = ""
|
|
}
|
|
}
|
|
|
|
// Serial number input
|
|
const inputSNRegex = /^([0-9A-Fa-f]{0,2}:){0,7}[0-9A-Fa-f]{0,2}$/
|
|
const inputSNRegexFull = /^([0-9A-Fa-f]{2}:){4,7}[0-9A-Fa-f]{2}$/
|
|
let inputSN = ""
|
|
|
|
function inputSNChange(e: any) {
|
|
e = e as InputEvent
|
|
// Add colons to the input
|
|
if (e.inputType === "insertText" && inputSN.length % 3 === 2 && inputSN.length < 23)
|
|
inputSN += ":"
|
|
inputSN = inputSN.toUpperCase().slice(0, 23)
|
|
}
|
|
|
|
function bindSN() {
|
|
if (inputSNRegexFull.test(inputSN)) {
|
|
console.log("Binding serial number", inputSN)
|
|
inputSN = ""
|
|
}
|
|
}
|
|
|
|
function formatLUID(luid: string) {
|
|
// Check if LUID is Felica SN
|
|
if (luid.startsWith("00")) {
|
|
return (+luid).toString(16).toUpperCase().padStart(16, "0").match(/.{1,2}/g)!.join(":")
|
|
}
|
|
|
|
// Check if LUID is a 20-digit access code
|
|
if (luid.length === 20) {
|
|
return luid.match(/.{4}/g)!.join(" ")
|
|
}
|
|
|
|
// Ghost card
|
|
return luid
|
|
}
|
|
</script>
|
|
|
|
<div class="bind-card">
|
|
<h2>Your Cards</h2>
|
|
<p>Here are the cards you have linked to your account:</p>
|
|
|
|
{#if me}
|
|
{#each me.cards as card}
|
|
<div>
|
|
<span class="register">Registered: {moment(card.registerTime).format("YYYY MMM DD")}</span>
|
|
<span class="last">Last used: {moment(card.accessTime).format("YYYY MMM DD")}</span>
|
|
<span class="id">ID: {formatLUID(card.luid)}</span>
|
|
</div>
|
|
{/each}
|
|
{:else if error}
|
|
<p>{error}</p>
|
|
{:else}
|
|
<p>Loading...</p>
|
|
{/if}
|
|
|
|
<h2>Link Card</h2>
|
|
<p>Please enter the following information:</p>
|
|
<p>1. The 20-digit access code on the back of your card. </p>
|
|
<label>
|
|
<!-- DO NOT change the order of bind:value and on:input. Their order determines the order of reactivity -->
|
|
<input placeholder="e.g. 5200 1234 5678 9012 3456"
|
|
on:keydown={(e) => {
|
|
e.key === "Enter" && bindAC()
|
|
// Ensure key is numeric
|
|
if (e.key.length === 1 && !/[\d ]/.test(e.key)) e.preventDefault()
|
|
}}
|
|
bind:value={inputAC}
|
|
on:input={inputACChange}
|
|
class={clz({error: (inputAC && !inputACRegex.test(inputAC))})}>
|
|
{#if inputAC.length > 0}
|
|
<button transition:slide={{axis: 'x'}} on:click={bindAC}>Bind</button>
|
|
{/if}
|
|
</label>
|
|
<p>2. Download the NFC Tools app on your phone
|
|
(<a href="https://play.google.com/store/apps/details?id=com.wakdev.wdnfc">Android</a> /
|
|
<a href="https://apps.apple.com/us/app/nfc-tools/id1252962749">Apple</a>) and scan your card.
|
|
Then, enter the Serial Number.
|
|
</p>
|
|
<label>
|
|
<input placeholder="e.g. 01:2E:1A:2B:3C:4D:5E:6F"
|
|
on:keydown={(e) => {
|
|
e.key === "Enter" && bindSN()
|
|
// Ensure key is hex or colon
|
|
if (e.key.length === 1 && !/[0-9A-Fa-f:]/.test(e.key)) e.preventDefault()
|
|
}}
|
|
bind:value={inputSN}
|
|
on:input={inputSNChange}
|
|
class={clz({error: (inputSN && !inputSNRegex.test(inputSN))})}>
|
|
{#if inputSN.length > 0}
|
|
<button transition:slide={{axis: 'x'}} on:click={bindSN}>Bind</button>
|
|
{/if}
|
|
</label>
|
|
</div>
|
|
|
|
<style lang="sass">
|
|
.bind-card
|
|
input
|
|
width: 100%
|
|
|
|
label
|
|
display: flex
|
|
|
|
button
|
|
margin-left: 1rem
|
|
</style> |