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

View File

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