version 1.2

This commit is contained in:
Admin 2025-08-26 15:31:57 +07:00
parent a648994761
commit c3069e6f0e
114 changed files with 10119 additions and 223 deletions

View File

@ -4,3 +4,5 @@ Command: ssh root@172.16.7.48
Password: Work1234
server folder: /root/facebook-publist-server/auto-post-marketplace-facebook/server
Chỉnh sửa liên quan đến nội dung: @lib/ultils.ts

View File

@ -8,7 +8,7 @@
"css": "src/index.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
"prefix": "tw"
},
"aliases": {
"components": "@/components",
@ -18,4 +18,4 @@
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}
}

89
package-lock.json generated
View File

@ -17,11 +17,13 @@
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"@tailwindcss/vite": "^4.1.12",
"@tanstack/react-query": "^5.85.5",
"axios": "^1.11.0",
@ -31,11 +33,13 @@
"fs-extra": "^11.3.1",
"lodash": "^4.17.21",
"lucide-react": "^0.540.0",
"next-themes": "^0.4.6",
"p-queue": "^8.1.0",
"react": "^19.1.1",
"react-day-picker": "^9.9.0",
"react-dom": "^19.1.1",
"react-hook-form": "^7.62.0",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.12",
"use-debounce": "^10.0.5",
@ -1449,6 +1453,37 @@
}
}
},
"node_modules/@radix-ui/react-scroll-area": {
"version": "1.2.10",
"resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
"integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
"license": "MIT",
"dependencies": {
"@radix-ui/number": "1.1.1",
"@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
"@radix-ui/react-direction": "1.1.1",
"@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-use-callback-ref": "1.1.1",
"@radix-ui/react-use-layout-effect": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
}
},
"node_modules/@radix-ui/react-select": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz",
@ -1594,6 +1629,40 @@
}
}
},
"node_modules/@radix-ui/react-tooltip": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz",
"integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
"@radix-ui/react-dismissable-layer": "1.1.11",
"@radix-ui/react-id": "1.1.1",
"@radix-ui/react-popper": "1.2.8",
"@radix-ui/react-portal": "1.1.9",
"@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-use-controllable-state": "1.2.2",
"@radix-ui/react-visually-hidden": "1.2.3"
},
"peerDependencies": {
"@types/react": "*",
"@types/react-dom": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
}
},
"node_modules/@radix-ui/react-use-callback-ref": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
@ -5329,6 +5398,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/next-themes": {
"version": "0.4.6",
"resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
"integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
}
},
"node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@ -6396,6 +6475,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/sonner": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz",
"integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==",
"license": "MIT",
"peerDependencies": {
"react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
"react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",

View File

@ -25,11 +25,13 @@
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-tooltip": "^1.2.8",
"@tailwindcss/vite": "^4.1.12",
"@tanstack/react-query": "^5.85.5",
"axios": "^1.11.0",
@ -39,11 +41,13 @@
"fs-extra": "^11.3.1",
"lodash": "^4.17.21",
"lucide-react": "^0.540.0",
"next-themes": "^0.4.6",
"p-queue": "^8.1.0",
"react": "^19.1.1",
"react-day-picker": "^9.9.0",
"react-dom": "^19.1.1",
"react-hook-form": "^7.62.0",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.12",
"use-debounce": "^10.0.5",

View File

@ -28,7 +28,7 @@
"matches": ["https://www.facebook.com/*"]
}
],
"permissions": ["tabs", "activeTab", "scripting"],
"permissions": ["tabs", "activeTab", "scripting", "storage"],
"icons": {
"16": "icons/16.png",
"32": "icons/32.png",

View File

@ -0,0 +1 @@
function a(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function s(e,t=[]){return Object.entries(e).reduce((r,[n,o])=>((o||t.includes(n))&&(r[n]=o),r),{})}function u(e){return new Promise(t=>setTimeout(t,e))}function l(e,t){const r=Math.floor(Math.random()*(t-e+1))+e;return u(r)}export{u as a,l as d,a as g,s as r};

View File

@ -0,0 +1 @@
function s(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}async function u(e){return fetch(e).then(t=>t.blob()).then(t=>new Promise((n,o)=>{const r=new FileReader;r.onloadend=()=>{typeof r.result=="string"?n(r.result):o("Failed to convert blob to base64")},r.onerror=o,r.readAsDataURL(t)}))}function l(e,t=[]){return Object.entries(e).reduce((n,[o,r])=>((r||t.includes(o))&&(n[o]=r),n),{})}function a(e){return new Promise(t=>setTimeout(t,e))}function d(e,t){const n=Math.floor(Math.random()*(t-e+1))+e;return a(n)}export{a,d,s as g,l as r,u};

View File

@ -0,0 +1 @@
async function a(n){return fetch(n).then(o=>o.blob()).then(o=>new Promise((t,r)=>{const e=new FileReader;e.onloadend=()=>{typeof e.result=="string"?t(e.result):r("Failed to convert blob to base64")},e.onerror=r,e.readAsDataURL(o)}))}export{a as u};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{R as c,j as s,Q as u,q as l,P as d}from"./popup-D--aKLqS.js";import"./base64-BbJB1hmJ.js";import"./product-api.service-DR0CE0o9.js";import"./app-C7VSS-q9.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))i(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&i(o)}).observe(document,{childList:!0,subtree:!0});function n(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(e){if(e.ep)return;e.ep=!0;const r=n(e);fetch(e.href,r)}})();c.createRoot(document.getElementById("root")).render(s.jsx(u,{client:l,children:s.jsx(d,{})}));
import{R as c,j as s,Q as u,q as l,P as d}from"./popup-BJkdpTff.js";import"./base64-BbJB1hmJ.js";import"./product-api.service-PLptzR9s.js";import"./app-C7VSS-q9.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))i(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&i(o)}).observe(document,{childList:!0,subtree:!0});function n(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(e){if(e.ep)return;e.ep=!0;const r=n(e);fetch(e.href,r)}})();c.createRoot(document.getElementById("root")).render(s.jsx(u,{client:l,children:s.jsx(d,{})}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{R as r,j as t,Q as i,q as o,P as n}from"../assets/popup-D--aKLqS.js";import{C as s}from"../assets/contants-Cf0CQNSY.js";import"../assets/base64-BbJB1hmJ.js";import"../assets/product-api.service-DR0CE0o9.js";import"../assets/app-C7VSS-q9.js";const e=document.getElementById(s.ID_EXTENSION);e&&r.createRoot(e).render(t.jsx(t.Fragment,{children:t.jsx(i,{client:o,children:t.jsx("div",{className:"fixed bottom-20 right-6",children:t.jsx(n,{})})})}));
import{r as m,j as o,T as b,R as j,Q as E,q as T,P as C}from"../assets/popup-BJkdpTff.js";import{C as w}from"../assets/contants-Cf0CQNSY.js";import"../assets/base64-BbJB1hmJ.js";import"../assets/product-api.service-PLptzR9s.js";import"../assets/app-C7VSS-q9.js";var I=(t,n,d,a,i,r,p,u)=>{let s=document.documentElement,h=["light","dark"];function c(e){(Array.isArray(t)?t:[t]).forEach(l=>{let g=l==="class",S=g&&r?i.map(y=>r[y]||y):i;g?(s.classList.remove(...S),s.classList.add(r&&r[e]?r[e]:e)):s.setAttribute(l,e)}),x(e)}function x(e){u&&h.includes(e)&&(s.style.colorScheme=e)}function v(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(a)c(a);else try{let e=localStorage.getItem(n)||d,l=p&&e==="system"?v():e;c(l)}catch{}},N=m.createContext(void 0),R={setTheme:t=>{},themes:[]},k=()=>{var t;return(t=m.useContext(N))!=null?t:R};m.memo(({forcedTheme:t,storageKey:n,attribute:d,enableSystem:a,enableColorScheme:i,defaultTheme:r,value:p,themes:u,nonce:s,scriptProps:h})=>{let c=JSON.stringify([d,n,r,t,u,p,a,i]).slice(1,-1);return m.createElement("script",{...h,suppressHydrationWarning:!0,nonce:typeof window>"u"?s:"",dangerouslySetInnerHTML:{__html:`(${I.toString()})(${c})`}})});const M=({...t})=>{const{theme:n="system"}=k();return o.jsx(b,{theme:n,className:"toaster group",style:{"--normal-bg":"var(--popover)","--normal-text":"var(--popover-foreground)","--normal-border":"var(--border)"},...t})},f=document.getElementById(w.ID_EXTENSION);f&&j.createRoot(f).render(o.jsx(o.Fragment,{children:o.jsxs(E,{client:T,children:[o.jsx("div",{className:"fixed bottom-20 right-6",children:o.jsx(C,{})}),o.jsx(M,{position:"top-right"})]})}));

View File

@ -7,9 +7,9 @@
<title>Vite + React + TS</title>
<script type="module" crossorigin src="/assets/popup.js"></script>
<link rel="modulepreload" crossorigin href="/assets/base64-BbJB1hmJ.js">
<link rel="modulepreload" crossorigin href="/assets/product-api.service-DR0CE0o9.js">
<link rel="modulepreload" crossorigin href="/assets/product-api.service-PLptzR9s.js">
<link rel="modulepreload" crossorigin href="/assets/app-C7VSS-q9.js">
<link rel="modulepreload" crossorigin href="/assets/popup-D--aKLqS.js">
<link rel="modulepreload" crossorigin href="/assets/popup-BJkdpTff.js">
<link rel="stylesheet" crossorigin href="/assets/style.css">
</head>
<body>

View File

@ -28,7 +28,7 @@
"matches": ["https://www.facebook.com/*"]
}
],
"permissions": ["tabs", "activeTab", "scripting"],
"permissions": ["tabs", "activeTab", "scripting", "storage"],
"icons": {
"16": "icons/16.png",
"32": "icons/32.png",

View File

@ -1,20 +1,30 @@
[
{
"title": "Cisco FPR2K-SLIDE-RAILS Mounting Rail Kit for FirePower FPR 2100 Series",
"price": 995,
"title": "Cisco C9120AXI-E 802.11ax Internal Antennas 4x4:4 MIMO Bluetooth 5 Reg E AP",
"price": 862,
"el": {},
"date": "2025-08-23T01:38:28.591Z"
"url_info": "https://www.facebook.com/profile.php?id=61578035566295",
"date": "2025-08-26T08:31:36.498Z"
},
{
"title": "HP DL380 G9 2U Server 2x CPU E5-2650V3 32Gb RAM 600Gb HDD Dual PSU Rail Kit - DL380 G9, server",
"price": 2245,
"el": {},
"url_info": "https://www.facebook.com/profile.php?id=61578035566295",
"date": "2025-08-26T08:31:36.498Z"
},
{
"title": "Cisco AIR-PWRINJ6 Power Injector 8023at for Aironet Access Points",
"price": 95,
"el": {},
"date": "2025-08-23T01:38:28.591Z"
"url_info": "https://www.facebook.com/profile.php?id=61578035566295",
"date": "2025-08-26T08:31:36.498Z"
},
{
"title": "Cisco NM-1CE1T1-PRI - Fully Tested - 6 Month Warranty - Tax Invoice included",
"price": 75,
"title": "Cisco AIR-AP1542D-Z-K9 802.11ac W2 Value Outdoor AP, Direct. Ant, Z Reg Dom.",
"price": 2563,
"el": {},
"date": "2025-08-23T01:38:28.591Z"
"url_info": "https://www.facebook.com/profile.php?id=61578035566295",
"date": "2025-08-26T08:31:36.498Z"
}
]

View File

@ -97,7 +97,8 @@ app.post("/", async (req, res) => {
// ===== Meta =====
let meta = readJSON(metaPath, { total: 4000 });
const filter = req.body?.filter || {};
const { info, ...filter } = req.body?.filter || {};
const originalFilter = { ...filter };
const status = filter?.where?.status_listing;
@ -137,28 +138,22 @@ app.post("/", async (req, res) => {
const skip = originalFilter.skip || 0;
const limit = originalFilter.limit || data.data.length;
// const listedCodes = new Set(
// publistedData.map((i) => (i.title + i.price || "").trim().toLowerCase())
// );
// let filteredData = data.data.filter((item) => {
// const key = `${item.title} - ${item.code}${item.price}`.toLowerCase();
// return status === "listed"
// ? listedCodes.has(key)
// : !listedCodes.has(key);
// });
let filteredData = data.data.filter((item) => {
const key = item?.title.includes(item.code)
? `${item.title}`.toLowerCase()
: `${item.title} - ${item.code}`.toLowerCase();
if (status === "listed") {
return publistedData.some((i) =>
`${i.title}`.toLowerCase().includes(key)
return publistedData.some(
(i) =>
`${i.title}`.toLowerCase().includes(key) &&
i?.url_info == info?.url
);
} else {
return !publistedData.some((i) =>
`${i.title}`.toLowerCase().includes(key)
return !publistedData.some(
(i) =>
`${i.title}`.toLowerCase().includes(key) &&
i?.url_info == info?.url
);
}
});

View File

@ -9,6 +9,7 @@ class ProductApiService {
limit?: number;
order?: string;
where?: Record<string, any>;
info?: any;
}) {
const defaultFilter = {
skip: 0,
@ -75,7 +76,8 @@ class ProductApiService {
| "createBlobUrl"
| "publist"
| "unlist"
| "sync",
| "sync"
| "dequeue",
body: Record<string, any>
) {
return new Promise((resolve, reject) => {

View File

@ -0,0 +1,13 @@
import { DoorOpenIcon } from "lucide-react";
import { Button } from "../ui/button";
import { PopoverTrigger } from "../ui/popover";
export default function TrigerOpenModal() {
return (
<PopoverTrigger asChild>
<Button size={"icon"}>
<DoorOpenIcon />
</Button>
</PopoverTrigger>
);
}

Some files were not shown because too many files have changed in this diff Show More