remove wip component

This commit is contained in:
SrGooglo 2025-04-02 00:48:43 +00:00
parent 0ed4ad7241
commit c237b3b823
2 changed files with 490 additions and 515 deletions

View File

@ -15,370 +15,349 @@ import StepsContext from "./context"
import "./index.less" import "./index.less"
const RegisterNewTagSteps = [ const RegisterNewTagSteps = [CheckRegister, DataEditor, TagWritter, Success]
CheckRegister,
DataEditor,
TagWritter,
Success,
]
const RegisterNewTag = (props) => { const RegisterNewTag = (props) => {
const [step, setStep] = React.useState(0) const [step, setStep] = React.useState(0)
const [stepsValues, setStepsValues] = React.useState({ const [stepsValues, setStepsValues] = React.useState({
...props.tagData ?? {} ...(props.tagData ?? {}),
}) })
const nextStep = () => { const nextStep = () => {
setStep((step) => step + 1) setStep((step) => step + 1)
} }
const prevStep = () => { const prevStep = () => {
setStep((step) => step - 1) setStep((step) => step - 1)
} }
const finish = () => { const finish = () => {
if (typeof props.onFinish === "function") { if (typeof props.onFinish === "function") {
props.onFinish() props.onFinish()
} }
if (typeof props.close === "function") { if (typeof props.close === "function") {
props.close() props.close()
} }
} }
// create a react context for the steps // create a react context for the steps
const StepsContextValue = { const StepsContextValue = {
next: nextStep, next: nextStep,
prev: prevStep, prev: prevStep,
values: stepsValues, values: stepsValues,
setValue: (key, value) => { setValue: (key, value) => {
setStepsValues((stepsValues) => { setStepsValues((stepsValues) => {
return { return {
...stepsValues, ...stepsValues,
[key]: value [key]: value,
} }
}) })
}, },
onFinish: finish, onFinish: finish,
nfcReader: app.cores.nfc.instance(), nfcReader: app.cores.nfc.instance(),
close: props.close close: props.close,
} }
if (props.tagData) { if (props.tagData) {
return <div className="tap-share-register"> return (
<div className="tap-share-register-content"> <div className="tap-share-register">
<StepsContext.Provider value={StepsContextValue}> <div className="tap-share-register-content">
<DataEditor <StepsContext.Provider value={StepsContextValue}>
onFinish={finish} <DataEditor onFinish={finish} />
/> </StepsContext.Provider>
</StepsContext.Provider> </div>
</div> </div>
</div> )
} }
if (app.cores.nfc.incompatible) { if (app.cores.nfc.incompatible) {
return <antd.Result return (
status="error" <antd.Result
title="Error" status="error"
subTitle="Your device doesn't support NFC." title="Error"
/> subTitle="Your device doesn't support NFC."
} />
)
}
return <div return (
className={classnames( <div
"tap-share-register", className={classnames("tap-share-register", {
{ ["compact"]: step > 0,
["compact"]: step > 0 })}
} >
)} <div className="tap-share-register-header">
> <antd.Button
<div className="tap-share-register-header"> type="link"
<antd.Button onClick={prevStep}
type="link" disabled={step === 0}
onClick={prevStep} icon={<Icons.MdChevronLeft />}
disabled={step === 0} className={classnames("tap-share-register-header-back", {
icon={<Icons.MdChevronLeft />} ["hidden"]: step === 0,
className={classnames( })}
"tap-share-register-header-back", />
{
["hidden"]: step === 0
}
)}
/>
<div className="tap-share-register-header-icon"> <div className="tap-share-register-header-icon">
<Icons.MdNfc /> <Icons.MdNfc />
</div> </div>
<h1> <h1>Register new tag</h1>
Register new tag </div>
</h1>
</div>
<div className="tap-share-register-content"> <div className="tap-share-register-content">
<StepsContext.Provider value={StepsContextValue}> <StepsContext.Provider value={StepsContextValue}>
{ {React.createElement(RegisterNewTagSteps[step])}
React.createElement(RegisterNewTagSteps[step]) </StepsContext.Provider>
} </div>
</StepsContext.Provider> </div>
</div> )
</div>
} }
const TagItem = (props) => { const TagItem = (props) => {
return <div return (
key={props.tag.serialNumber} <div
id={props.tag.serialNumber} key={props.tag.serialNumber}
className="tap-share-own_tags-item" id={props.tag.serialNumber}
> className="tap-share-own_tags-item"
<div className="tap-share-own_tags-item-icon"> >
<Icons.MdNfc /> <div className="tap-share-own_tags-item-icon">
</div> <Icons.MdNfc />
</div>
<div className="tap-share-own_tags-item-title"> <div className="tap-share-own_tags-item-title">
<h4> <h4>{props.tag.alias}</h4>
{props.tag.alias}
</h4>
<span> <span>{props.tag.serial}</span>
{props.tag.serial} </div>
</span>
</div>
<div className="tap-share-own_tags-item-actions"> <div className="tap-share-own_tags-item-actions">
<antd.Button <antd.Button icon={<Icons.MdEdit />} onClick={props.onEdit} />
icon={<Icons.MdEdit />} <antd.Button
onClick={props.onEdit} icon={<Icons.MdDelete />}
/> danger
<antd.Button onClick={props.onDelete}
icon={<Icons.MdDelete />} />
danger </div>
onClick={props.onDelete} </div>
/> )
</div>
</div>
} }
class OwnTags extends React.Component { class OwnTags extends React.Component {
state = { state = {
loading: true, loading: true,
error: null, error: null,
data: null, data: null,
editorOpen: false, editorOpen: false,
} }
loadData = async () => { loadData = async () => {
this.setState({ this.setState({
loading: true, loading: true,
}) })
const result = await NFCModel.getOwnTags() const result = await NFCModel.getOwnTags().catch((err) => {
.catch((err) => { console.error(err)
console.error(err) this.setState({
this.setState({ error: err.message,
error: err.message, loading: false,
loading: false, data: null,
data: null })
}) return false
return false })
})
if (!result) { if (!result) {
return false return false
} }
this.setState({ this.setState({
loading: false, loading: false,
data: result, data: result,
error: null error: null,
}) })
} }
handleOpenEditor = (props) => { handleOpenEditor = (props) => {
this.setState({ this.setState({
editorOpen: true editorOpen: true,
}) })
OpenTagEditor({ OpenTagEditor({
...props, ...props,
onFinish: () => { onFinish: () => {
this.setState({ this.setState({
editorOpen: false editorOpen: false,
}) })
this.loadData() this.loadData()
} },
}) })
} }
handleTagDelete = (tag) => { handleTagDelete = (tag) => {
antd.Modal.confirm({ antd.Modal.confirm({
title: "Are you sure you want to delete this tag?", title: "Are you sure you want to delete this tag?",
content: `This action cannot be undone.`, content: `This action cannot be undone.`,
onOk: async () => { onOk: async () => {
NFCModel.deleteTag(tag._id) NFCModel.deleteTag(tag._id)
.then(() => { .then(() => {
app.message.success("Tag deleted") app.message.success("Tag deleted")
this.loadData() this.loadData()
}) })
.catch((err) => { .catch((err) => {
console.error(err) console.error(err)
app.message.error(err.message) app.message.error(err.message)
return false return false
}) })
} },
}) })
} }
handleTagRead = async (error, tag) => { handleTagRead = async (error, tag) => {
if (this.state.editorOpen) { if (this.state.editorOpen) {
return false return false
} }
if (error) { if (error) {
console.error(error) console.error(error)
return false return false
} }
const ownedTag = this.state.data.find((ownedTag) => { const ownedTag = this.state.data.find((ownedTag) => {
return ownedTag.serial === tag.serialNumber return ownedTag.serial === tag.serialNumber
}) })
if (!ownedTag) { if (!ownedTag) {
app.message.error("This tag is not registered or you don't have permission to edit it.") app.message.error(
return false "This tag is not registered or you don't have permission to edit it.",
} )
return false
}
return this.handleOpenEditor({ return this.handleOpenEditor({
tag: ownedTag tag: ownedTag,
}) })
} }
componentDidMount = async () => { componentDidMount = async () => {
await this.loadData() await this.loadData()
app.cores.nfc.subscribe(this.handleTagRead) app.cores.nfc.subscribe(this.handleTagRead)
} }
componentWillUnmount = () => { componentWillUnmount = () => {
app.cores.nfc.unsubscribe(this.handleTagRead) app.cores.nfc.unsubscribe(this.handleTagRead)
} }
render() { render() {
console.log(this.state) console.log(this.state)
if (this.state.loading) { if (this.state.loading) {
return <div className="tap-share-own_tags"> return (
<antd.Skeleton /> <div className="tap-share-own_tags">
</div> <antd.Skeleton />
} </div>
)
}
if (!this.state.data) { if (!this.state.data) {
return <antd.Empty return <antd.Empty description="You don't have any tags yet." />
description="You don't have any tags yet." }
/>
}
return <div className="tap-share-own_tags"> return (
{ <div className="tap-share-own_tags">
this.state.data.length === 0 && <antd.Empty {this.state.data.length === 0 && (
description="You don't have any tags yet." <antd.Empty description="You don't have any tags yet." />
/> )}
}
{ {this.state.data.length > 0 &&
this.state.data.length > 0 && this.state.data.map((tag) => { this.state.data.map((tag) => {
return <TagItem return (
key={tag.serialNumber} <TagItem
tag={tag} key={tag.serialNumber}
onEdit={() => { tag={tag}
this.handleOpenEditor({ onEdit={() => {
tag: tag this.handleOpenEditor({
}) tag: tag,
}} })
onDelete={() => { }}
this.handleTagDelete(tag) onDelete={() => {
}} this.handleTagDelete(tag)
/> }}
}) />
} )
})}
{ {app.isMobile && (
app.isMobile && <antd.Button <antd.Button
type="primary" type="primary"
icon={<Icons.FiPlus />} icon={<Icons.FiPlus />}
onClick={() => this.handleOpenEditor({})} onClick={() => this.handleOpenEditor({})}
className="tap-share-own_tags-add" className="tap-share-own_tags-add"
> >
Add new Add new
</antd.Button> </antd.Button>
} )}
</div> </div>
} )
}
} }
const OpenTagEditor = ({ tag, onFinish = () => app.navigation.softReload() } = {}) => { const OpenTagEditor = ({
if (!app.layout.draggable) { tag,
return app.layout.drawer.open("tag_register", RegisterNewTag, { onFinish = () => app.navigation.softReload(),
props: { } = {}) => {
onFinish: onFinish, if (!app.layout.draggable) {
tagData: tag, return app.layout.drawer.open("tag_register", RegisterNewTag, {
} props: {
}) onFinish: onFinish,
} tagData: tag,
},
})
}
return app.layout.draggable.open("tag_register", RegisterNewTag, { return app.layout.draggable.open("tag_register", RegisterNewTag, {
componentProps: { componentProps: {
onFinish: onFinish, onFinish: onFinish,
tagData: tag, tagData: tag,
} },
}) })
} }
const TapShareRender = () => { const TapShareRender = () => {
return <div className="tap-share-render"> return (
{ <div className="tap-share-render">
!app.cores.nfc.scanning && app.isMobile && <antd.Alert {!app.cores.nfc.scanning && app.isMobile && (
type="warning" <antd.Alert
message="NFC is disabled" type="warning"
description="You can enable it in your device settings." message="NFC is disabled"
/> description="You can enable it in your device settings."
} />
)}
<div className="tap-share-field"> <div className="tap-share-field">
<div className="tap-share-field_header"> <div className="tap-share-field_header">
<h1> <h1>
<Icons.MdSpoke /> Registered Tags <Icons.MdSpoke /> Registered Tags
</h1> </h1>
</div> </div>
{ {app.cores.nfc.scanning && (
app.cores.nfc.scanning && <span className="tip"> <span className="tip">
<Icons.MdInfo /> You can quickly edit your tags by tapping them. <Icons.MdInfo /> You can quickly edit your tags by
</span> tapping them.
} </span>
)}
<OwnTags /> <OwnTags />
</div> </div>
</div>
<div className="tap-share-field"> )
<div className="tap-share-field_header">
<h1>
<Icons.MdBadge /> Your Badge
</h1>
</div>
<UserShareBadge
user={app.userData}
editMode
/>
</div>
</div>
} }
export default { export default {
id: "tap_share", id: "tap_share",
icon: "MdNfc", icon: "MdNfc",
label: "Tap Share", label: "Tap Share",
group: "app", group: "app",
render: TapShareRender render: TapShareRender,
} }

View File

@ -1,290 +1,286 @@
.tap-share-render { .tap-share-render {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 20px; gap: 20px;
.tap-share-field { .tap-share-field {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background-color: var(--background-color-accent); background-color: var(--background-color-accent);
padding: 20px; padding: 15px;
border-radius: 12px; border-radius: 12px;
gap: 10px; gap: 10px;
span { span {
font-size: 0.8rem; font-size: 0.8rem;
opacity: 0.8; opacity: 0.8;
} }
.tap-share-field_header { .tap-share-field_header {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
h1, h1,
p { p {
margin: 0; margin: 0;
} }
gap: 10px; gap: 10px;
} }
} }
} }
.tap-share-own_tags { .tap-share-own_tags {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
gap: 10px;
.tap-share-own_tags-add { gap: 10px;
width: 100%;
}
.tap-share-own_tags-item { .tap-share-own_tags-add {
display: flex; width: 100%;
flex-direction: row; }
align-items: center; .tap-share-own_tags-item {
display: flex;
flex-direction: row;
width: 100%; align-items: center;
gap: 10px; width: 100%;
padding: 10px;
background-color: var(--background-color-primary); gap: 10px;
padding: 10px;
border-radius: 8px; background-color: var(--background-color-primary);
.tap-share-own_tags-item-icon { border-radius: 8px;
font-size: 2rem;
}
.tap-share-own_tags-item-title { .tap-share-own_tags-item-icon {
display: flex; font-size: 2rem;
flex-direction: column; }
width: 100%; .tap-share-own_tags-item-title {
display: flex;
flex-direction: column;
gap: 10px; width: 100%;
color: var(--text-color); gap: 10px;
h1, color: var(--text-color);
h2,
h3,
h4,
h5,
h6,
p,
span {
margin: 0;
}
span { h1,
font-size: 0.7rem; h2,
opacity: 0.7px; h3,
} h4,
} h5,
h6,
p,
span {
margin: 0;
}
.tap-share-own_tags-item-actions { span {
display: flex; font-size: 0.7rem;
flex-direction: row; opacity: 0.7px;
}
}
align-items: center; .tap-share-own_tags-item-actions {
display: flex;
flex-direction: row;
gap: 10px; align-items: center;
gap: 10px;
} }
}
}
} }
.tap-share-register { .tap-share-register {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
gap: 20px; gap: 20px;
&.compact { &.compact {
.tap-share-register-header { .tap-share-register-header {
padding: 10px; padding: 10px;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
.tap-share-register-header-icon { .tap-share-register-header-icon {
font-size: 0; font-size: 0;
width: 0; width: 0;
height: 0; height: 0;
} }
} }
} }
.tap-share-register-header { .tap-share-register-header {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 20px; padding: 20px;
gap: 10px; gap: 10px;
background-color: var(--background-color-accent); background-color: var(--background-color-accent);
border-radius: 12px; border-radius: 12px;
transition: all 150ms ease-in-out; transition: all 150ms ease-in-out;
h1 { h1 {
margin: 0; margin: 0;
} }
.tap-share-register-header-back { .tap-share-register-header-back {
font-size: 2rem; font-size: 2rem;
color: var(--colorPrimary); color: var(--colorPrimary);
&.hidden { &.hidden {
width: 0; width: 0;
height: 0; height: 0;
padding: 0; padding: 0;
display: none; display: none;
} }
} }
.tap-share-register-header-icon { .tap-share-register-header-icon {
font-size: 5rem; font-size: 5rem;
color: var(--colorPrimary); color: var(--colorPrimary);
svg { svg {
margin: 0; margin: 0;
} }
} }
} }
.tap-share-register-content { .tap-share-register-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
.tap-share-register_step { .tap-share-register_step {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
width: 100%; width: 100%;
padding: 0 10px; padding: 0 10px;
transition: all 150ms ease-in-out; transition: all 150ms ease-in-out;
.adm-input-element { .adm-input-element {
color: var(--text-color); color: var(--text-color);
} }
h1 { h1 {
transition: all 150ms ease-in-out; transition: all 150ms ease-in-out;
color: var(--text-color); color: var(--text-color);
} }
&.centered { &.centered {
align-items: center; align-items: center;
} }
.ant-form { .ant-form {
width: 100%; width: 100%;
.ant-form-item { .ant-form-item {
height: fit-content; height: fit-content;
padding: 0; padding: 0;
.ant-form_with_selector { .ant-form_with_selector {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
.ant-select { .ant-select {
width: fit-content; width: fit-content;
} }
.ant-input { .ant-input {
width: 100%; width: 100%;
} }
} }
.ant-form-item-label { .ant-form-item-label {
height: fit-content; height: fit-content;
padding: 0; padding: 0;
margin: 0; margin: 0;
label { label {
height: fit-content; height: fit-content;
padding: 0; padding: 0;
margin: 0; margin: 0;
color: var(--text-color); color: var(--text-color);
} }
} }
.description { .description {
font-size: 0.8rem; font-size: 0.8rem;
opacity: 0.8; opacity: 0.8;
color: var(--text-color); color: var(--text-color);
} }
} }
} }
.tap-share-register_step_actions { .tap-share-register_step_actions {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
gap: 20px; gap: 20px;
padding: 10px; padding: 10px;
color: var(--text-color); color: var(--text-color);
} }
} }
} }
} }
.animation-player { .animation-player {
width: 50%; width: 50%;
&.loading { &.loading {
.phone-loop { .phone-loop {
color: #17b2ff; color: #17b2ff;
} }
} }
.phone-loop { .phone-loop {
color: var(--colorPrimary); color: var(--colorPrimary);
path { path {
fill: currentColor; fill: currentColor;
stroke: currentColor; stroke: currentColor;
} }
} }
} }