Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c106e66f44 | |||
| 222c739663 | |||
| 96972dbe2f | |||
| 7146048aee | |||
| 39f1f5bc73 | |||
| 752fc6a4a8 | |||
| 608d5b92f1 | |||
| 45563cc59b | |||
| b027e20c20 | |||
| bbe0777496 | |||
| 27efbe362b | |||
| 878539a56a | |||
| 8016d1bd12 |
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
@@ -63,7 +63,7 @@ const AssignTaskPopout = React.memo(({ action, details, situation, familyDetail
|
|||||||
// API PAYLOADS
|
// API PAYLOADS
|
||||||
job_id: activeTask.data?.job_id,
|
job_id: activeTask.data?.job_id,
|
||||||
job_uid: activeTask.data?.job_uid,
|
job_uid: activeTask.data?.job_uid,
|
||||||
family_uid: familyDetails.uid,
|
family_uid: familyDetails?.uid || details?.family_uid,
|
||||||
job_description: activeTask.data?.description,
|
job_description: activeTask.data?.description,
|
||||||
assign_mode: 110011,
|
assign_mode: 110011,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -217,22 +217,22 @@ export default function History() {
|
|||||||
{/* <TopHxBox className="mb-11" /> */}
|
{/* <TopHxBox className="mb-11" /> */}
|
||||||
<div className='w-full p-4 md:p-8 bg-white dark:bg-dark-white rounded-2xl shadow bottomMargin'>
|
<div className='w-full p-4 md:p-8 bg-white dark:bg-dark-white rounded-2xl shadow bottomMargin'>
|
||||||
{/* switch button */}
|
{/* switch button */}
|
||||||
<div className="my-1 flex items-center border-b border-slate-300">
|
<div className="pl-7 my-2 flex items-center border-b border-slate-300 gap-3">
|
||||||
<button
|
<button
|
||||||
name="purchases"
|
name="purchases"
|
||||||
onClick={(e) => setTab(e.target.name)}
|
onClick={(e) => setTab(e.target.name)}
|
||||||
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border ${
|
className={`px-4 py-1 rounded-t-2xl ${
|
||||||
tab == "purchases" ? "border-sky-blue" : "border-slate-300"
|
tab == "purchases" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
|
||||||
} tracking-wide transition duration-200`}
|
}`}
|
||||||
>
|
>
|
||||||
Purchases
|
Purchases
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
name="recent"
|
name="recent"
|
||||||
onClick={(e) => setTab(e.target.name)}
|
onClick={(e) => setTab(e.target.name)}
|
||||||
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border ${
|
className={`px-4 py-1 rounded-t-2xl ${
|
||||||
tab == "recent" ? "border-sky-blue" : "border-slate-300"
|
tab == "recent" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
|
||||||
} tracking-wide transition duration-200`}
|
}`}
|
||||||
>
|
>
|
||||||
Recent Activity
|
Recent Activity
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -9,14 +9,14 @@ import PaginatedList from "../Pagination/PaginatedList";
|
|||||||
import { handlePagingFunc } from "../Pagination/HandlePagination";
|
import { handlePagingFunc } from "../Pagination/HandlePagination";
|
||||||
|
|
||||||
export default function ActiveJobMessage({ activeJobMesList }) {
|
export default function ActiveJobMessage({ activeJobMesList }) {
|
||||||
const [currentPage, setCurrentPage] = useState(0);
|
// const [currentPage, setCurrentPage] = useState(0);
|
||||||
const indexOfFirstItem = Number(currentPage);
|
// const indexOfFirstItem = Number(currentPage);
|
||||||
const indexOfLastItem = Number(indexOfFirstItem)+Number(process.env.REACT_APP_ITEM_PER_PAGE);
|
// const indexOfLastItem = Number(indexOfFirstItem)+Number(process.env.REACT_APP_ITEM_PER_PAGE);
|
||||||
const currentActiveJobMesList = activeJobMesList?.data?.slice(indexOfFirstItem, indexOfLastItem);
|
// const currentActiveJobMesList = activeJobMesList?.data?.slice(indexOfFirstItem, indexOfLastItem);
|
||||||
|
|
||||||
const handlePagination = (e) => {
|
// const handlePagination = (e) => {
|
||||||
handlePagingFunc(e,setCurrentPage)
|
// handlePagingFunc(e,setCurrentPage)
|
||||||
}
|
// }
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col justify-between'>
|
<div className='flex flex-col justify-between'>
|
||||||
@@ -27,10 +27,10 @@ export default function ActiveJobMessage({ activeJobMesList }) {
|
|||||||
<th className="p-2"></th>
|
<th className="p-2"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{activeJobMesList.data.length ?
|
{activeJobMesList?.data?.length ?
|
||||||
(
|
(
|
||||||
<tbody>
|
<tbody>
|
||||||
{currentActiveJobMesList.map((item, index) => (
|
{activeJobMesList.data.map((item, index) => (
|
||||||
<tr key={index} className='text-slate-500'>
|
<tr key={index} className='text-slate-500'>
|
||||||
<td>
|
<td>
|
||||||
<div className={`msg_box ${item.who}`}>
|
<div className={`msg_box ${item.who}`}>
|
||||||
@@ -63,7 +63,7 @@ export default function ActiveJobMessage({ activeJobMesList }) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* PAGINATION BUTTON */}
|
{/* PAGINATION BUTTON */}
|
||||||
<PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= activeJobMesList?.data?.length ? true : false} data={activeJobMesList?.data} start={indexOfFirstItem} stop={indexOfLastItem} />
|
{/* <PaginatedList onClick={handlePagination} prev={currentPage == 0 ? true : false} next={currentPage+Number(process.env.REACT_APP_ITEM_PER_PAGE) >= activeJobMesList?.data?.length ? true : false} data={activeJobMesList?.data} start={indexOfFirstItem} stop={indexOfLastItem} /> */}
|
||||||
{/* END OF PAGINATION BUTTON */}
|
{/* END OF PAGINATION BUTTON */}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ function ActiveJobs(props) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="my-4 py-[20px] bg-white dark:bg-black px-4 rounded-2xl shadow-md lg:flex justify-between items-start space-y-4 lg:space-x-4 lg:space-y-0">
|
<div className="my-4 py-[20px] bg-white dark:bg-black px-4 rounded-2xl shadow-md lg:flex justify-between items-start space-y-4 lg:space-x-4 lg:space-y-0">
|
||||||
<div className="w-full lg:w-1/2">
|
<div className="w-full lg:w-1/2 mb-4 border-b pb-4 lg:pb-0 lg:mb-0 lg:border-b-0">
|
||||||
<div className="">
|
<div className="">
|
||||||
<h1 className="text-lg font-bold text-dark-gray dark:text-white tracking-wide">
|
<h1 className="text-lg font-bold text-dark-gray dark:text-white tracking-wide">
|
||||||
Actions
|
Actions
|
||||||
@@ -459,7 +459,7 @@ function ActiveJobs(props) {
|
|||||||
|
|
||||||
{/* Buttons Sections */}
|
{/* Buttons Sections */}
|
||||||
<div className="py-2 sm:flex sm:justify-end sm:items-center">
|
<div className="py-2 sm:flex sm:justify-end sm:items-center">
|
||||||
<div className="w-full sm:w-2/4 flex justify-between items-center space-x-2">
|
<div className="w-full sm:w-3/4 flex justify-between items-center space-x-2">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={handleClearAll}
|
onClick={handleClearAll}
|
||||||
|
|||||||
@@ -25,13 +25,6 @@ function ConfirmAddFund({
|
|||||||
status: false,
|
status: false,
|
||||||
}); // STATE FOR API REQUEST
|
}); // STATE FOR API REQUEST
|
||||||
|
|
||||||
// const [ConfirmCredit, setConfirmCredit] = useState({
|
|
||||||
// show: false,
|
|
||||||
// loader: false,
|
|
||||||
// msg: "",
|
|
||||||
// data: {},
|
|
||||||
// });
|
|
||||||
|
|
||||||
const apiURL = new usersService();
|
const apiURL = new usersService();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
@@ -131,14 +124,18 @@ function ConfirmAddFund({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setConfirmCredit((prev) => ({
|
return setTimeout(
|
||||||
...prev,
|
() =>
|
||||||
show: {
|
setConfirmCredit((prev) => ({
|
||||||
awaitConfirm: { loader: false, state: false },
|
...prev,
|
||||||
acceptConfirm: { loader: false, state: true },
|
show: {
|
||||||
},
|
awaitConfirm: { loader: false, state: false },
|
||||||
data: _response,
|
acceptConfirm: { loader: false, state: true },
|
||||||
}));
|
},
|
||||||
|
data: _response,
|
||||||
|
})),
|
||||||
|
1500
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setConfirmCredit((prev) => ({
|
setConfirmCredit((prev) => ({
|
||||||
...prev,
|
...prev,
|
||||||
@@ -170,7 +167,8 @@ function ConfirmAddFund({
|
|||||||
<div className="px-4 md:p-8 py-4 add-fund-info">
|
<div className="px-4 md:p-8 py-4 add-fund-info">
|
||||||
<div className="field w-full mb-3 min-h-[45px]">
|
<div className="field w-full mb-3 min-h-[45px]">
|
||||||
{confirmCredit?.show?.awaitConfirm?.state ? (
|
{confirmCredit?.show?.awaitConfirm?.state ? (
|
||||||
<div className="flex flex-col gap-4">
|
<div className="flex flex-col gap-2">
|
||||||
|
{/* Amount */}
|
||||||
<div
|
<div
|
||||||
className={`flex items-center ${
|
className={`flex items-center ${
|
||||||
__confirmCountry == "US" ? "gap-14" : "gap-4"
|
__confirmCountry == "US" ? "gap-14" : "gap-4"
|
||||||
@@ -185,6 +183,40 @@ function ConfirmAddFund({
|
|||||||
}`}
|
}`}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
{/* Transaction Fee */}
|
||||||
|
<div
|
||||||
|
className={`flex items-center border-b border-gray-600 ${
|
||||||
|
__confirmCountry == "US" ? "gap-[2.7rem]" : "gap-4"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-tighter my-1">
|
||||||
|
Transaction Fee
|
||||||
|
</h1>
|
||||||
|
<span className="text-xl font-bold text-dark-gray dark:text-white tracking-tighter my-1">
|
||||||
|
{`${walletItem?.symbol} ${
|
||||||
|
Number(__confirmData?.fee).toLocaleString() || ""
|
||||||
|
}`}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{/* Total */}
|
||||||
|
<div
|
||||||
|
className={`flex items-center ${
|
||||||
|
__confirmCountry == "US" ? "gap-[8rem]" : "gap-4"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<h1 className="text-xl font-bold text-dark-gray dark:text-white tracking-tighter my-1">
|
||||||
|
Total
|
||||||
|
</h1>
|
||||||
|
<span className="text-xl font-bold text-dark-gray dark:text-white tracking-tighter my-1">
|
||||||
|
{`${walletItem?.symbol} ${
|
||||||
|
(
|
||||||
|
Number(__confirmData?.amount) +
|
||||||
|
Number(__confirmData?.fee)
|
||||||
|
).toLocaleString() || ""
|
||||||
|
}`}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
{__confirmCountry == "US" && (
|
{__confirmCountry == "US" && (
|
||||||
<div className="flex items-center gap-8">
|
<div className="flex items-center gap-8">
|
||||||
<label
|
<label
|
||||||
@@ -220,9 +252,10 @@ function ConfirmAddFund({
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
className={
|
className={
|
||||||
__confirmCountry == "US" ? "min-h-[163px]" : "min-h-[200px]"
|
__confirmCountry == "US" ? "min-h-[96px]" : "min-h-[200px]"
|
||||||
}
|
}
|
||||||
></div>
|
></div>
|
||||||
|
<hr />
|
||||||
<div className="md:p-8 p-4 add-fund-btn flex justify-end items-center py-4 gap-4">
|
<div className="md:p-8 p-4 add-fund-btn flex justify-end items-center py-4 gap-4">
|
||||||
<button
|
<button
|
||||||
className="px-4 h-11 flex justify-center items-center border-gradient text-base rounded-full"
|
className="px-4 h-11 flex justify-center items-center border-gradient text-base rounded-full"
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ const CreditPopup = ({ details, onClose, situation, walletItem }) => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="logout-modal-body w-full flex flex-col items-center">
|
<div className="logout-modal-body w-full flex flex-col items-center">
|
||||||
{confirmCredit?.show?.acceptConfirm?.loader ? (
|
{confirmCredit?.show?.acceptConfirm?.loader ? (
|
||||||
<div className="h-[33rem] flex items-center justify-center">
|
<div className="h-[32rem] flex items-center justify-center">
|
||||||
<LoadingSpinner size="12" color="sky-blue" />
|
<LoadingSpinner size="12" color="sky-blue" />
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ function RecentActivityTable({ payment }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-between overflow-y-auto">
|
<div className="flex flex-col justify-between min-h-[500px]">
|
||||||
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
<table className="wallet-activity w-full table-auto border-collapse text-left">
|
||||||
<thead className="border-b-2">
|
<thead className="border-b-2">
|
||||||
<tr className="text-slate-600">
|
<tr className="text-slate-600">
|
||||||
|
|||||||
@@ -166,22 +166,22 @@ export default function ManageInterestOffer(props) {
|
|||||||
|
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
{/* switch button */}
|
{/* switch button */}
|
||||||
<div className="my-1 flex items-center border-b border-slate-300">
|
<div className="pl-7 my-2 flex items-center border-b border-slate-300 gap-3">
|
||||||
<button
|
<button
|
||||||
name="info"
|
name="info"
|
||||||
onClick={(e) => setTab(e.target.name)}
|
onClick={(e) => setTab(e.target.name)}
|
||||||
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border ${
|
className={`px-4 py-1 rounded-t-2xl ${
|
||||||
tab == "info" ? "border-sky-blue" : "border-slate-300"
|
tab == "info" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
|
||||||
} tracking-wide transition duration-200`}
|
}`}
|
||||||
>
|
>
|
||||||
Info
|
Info
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
name="message"
|
name="message"
|
||||||
onClick={(e) => setTab(e.target.name)}
|
onClick={(e) => setTab(e.target.name)}
|
||||||
className={`p-2 text-lg font-bold text-slate-600 dark:text-white border ${
|
className={`px-4 py-1 rounded-t-2xl ${
|
||||||
tab == "message" ? "border-sky-blue" : "border-slate-300"
|
tab == "message" ? "bg-[#4687ba] border-[2px] border-[#4687ba] text-white" : "bg-white text-[#000] border-t-[2px]"
|
||||||
} tracking-wide transition duration-200`}
|
}`}
|
||||||
>
|
>
|
||||||
Messages ({messageList.data.length})
|
Messages ({messageList.data.length})
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import products from "../../data/product_data.json";
|
|||||||
import Layout from "../Partials/Layout";
|
import Layout from "../Partials/Layout";
|
||||||
import {
|
import {
|
||||||
ActivitiesTab, BlogTab,
|
ActivitiesTab, BlogTab,
|
||||||
|
QuestionsTab,
|
||||||
CollectionTab,
|
CollectionTab,
|
||||||
CreatedTab,
|
CreatedTab,
|
||||||
HiddenProductsTab,
|
HiddenProductsTab,
|
||||||
@@ -39,7 +40,7 @@ export default function Resources(props) {
|
|||||||
// Category Components
|
// Category Components
|
||||||
const tabComponents = {
|
const tabComponents = {
|
||||||
blog: <BlogTab blogdata={blogItems} />,
|
blog: <BlogTab blogdata={blogItems} />,
|
||||||
onsale: <OnSaleTab products={onSaleProducts} />,
|
onsale: <QuestionsTab products={onSaleProducts} />,
|
||||||
owned: <OwnTab products={ownProducts} />,
|
owned: <OwnTab products={ownProducts} />,
|
||||||
created: (
|
created: (
|
||||||
<CreatedTab marketProducts={CreatedSell} mainProducts={CreatedBits} />
|
<CreatedTab marketProducts={CreatedSell} mainProducts={CreatedBits} />
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import ProductCardStyleTwo from "../../Cards/ProductCardStyleTwo";
|
||||||
|
import DataIteration from "../../Helpers/DataIteration";
|
||||||
|
import SearchCom from "../../Helpers/SearchCom";
|
||||||
|
|
||||||
|
export default function QuestionsTab({ className, products }) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className={`onsale-tab-wrapper w-full ${className || ""}`}>
|
||||||
|
<div className="main-container w-full">
|
||||||
|
<div className="filter-section w-full items-center sm:flex justify-between mb-6">
|
||||||
|
{/* filter-search */}
|
||||||
|
<div className="sm:w-1/2 w-full sm:pr-20 pr-0 mb-5 sm:mb-0">
|
||||||
|
<SearchCom />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div className="content-section w-full-width">
|
||||||
|
<div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-[30px]">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -5,9 +5,11 @@ import HiddenProductsTab from "./HiddenProductsTab";
|
|||||||
import OnSaleTab from "./OnSaleTab";
|
import OnSaleTab from "./OnSaleTab";
|
||||||
import OwnTab from "./OwnTab";
|
import OwnTab from "./OwnTab";
|
||||||
import BlogTab from "./BlogTab";
|
import BlogTab from "./BlogTab";
|
||||||
|
import QuestionsTab from "./QuestionsTab";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
BlogTab,
|
BlogTab,
|
||||||
|
QuestionsTab,
|
||||||
ActivitiesTab,
|
ActivitiesTab,
|
||||||
CollectionTab,
|
CollectionTab,
|
||||||
CreatedTab,
|
CreatedTab,
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export default function NotificationSettingTab() {
|
|||||||
setAccSettings(prev => {
|
setAccSettings(prev => {
|
||||||
let newAccSettings = prev.data.map(data => {
|
let newAccSettings = prev.data.map(data => {
|
||||||
if(data.uid == item.uid){
|
if(data.uid == item.uid){
|
||||||
let newPrefValue = data.pref_value == null || data.pref_value == false ? true : false
|
let newPrefValue = data.pref_value == null || data.pref_value == '0' ? '100' : '0'
|
||||||
return {...data, pref_value: newPrefValue}
|
return {...data, pref_value: newPrefValue}
|
||||||
}else{
|
}else{
|
||||||
return data
|
return data
|
||||||
@@ -40,7 +40,7 @@ export default function NotificationSettingTab() {
|
|||||||
setNotificationChange({loading: true, uid: item.uid})
|
setNotificationChange({loading: true, uid: item.uid})
|
||||||
let reqData = { // API PAYLOADS
|
let reqData = { // API PAYLOADS
|
||||||
pref_id: item.pref_id,
|
pref_id: item.pref_id,
|
||||||
status: '100'
|
status: item.pref_value == null || item.pref_value == 0 ? 100 : 0
|
||||||
}
|
}
|
||||||
api.setAccSettings(reqData).then(res => {
|
api.setAccSettings(reqData).then(res => {
|
||||||
if(res.status != 200 || res.data.internal_return < 0){
|
if(res.status != 200 || res.data.internal_return < 0){
|
||||||
@@ -94,7 +94,7 @@ export default function NotificationSettingTab() {
|
|||||||
<LoadingSpinner size='8' color='sky-blue' />
|
<LoadingSpinner size='8' color='sky-blue' />
|
||||||
:
|
:
|
||||||
<SwitchCom
|
<SwitchCom
|
||||||
value={item.pref_value}
|
value={item.pref_value == null || item.pref_value == '0' ? 0 : 100}
|
||||||
handler={ notificationChange.loading ? ()=>{} : () => handleNotificationChange(item)}
|
handler={ notificationChange.loading ? ()=>{} : () => handleNotificationChange(item)}
|
||||||
// value={updateNotification}
|
// value={updateNotification}
|
||||||
// handler={() => setUpdateNotification(!updateNotification)}
|
// handler={() => setUpdateNotification(!updateNotification)}
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ function JobListPopout({ details, onClose, situation }) {
|
|||||||
>
|
>
|
||||||
{(props) => {
|
{(props) => {
|
||||||
return (
|
return (
|
||||||
<Form className="mb-4">
|
<Form className="mb-4 hidden">
|
||||||
{/* Assign to Family */}
|
{/* Assign to Family */}
|
||||||
<JobFieldInput
|
<JobFieldInput
|
||||||
label="Assign to family"
|
label="Assign to family"
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@
|
|||||||
}
|
}
|
||||||
.RECIPIENT{
|
.RECIPIENT{
|
||||||
margin-right: 60px !important;
|
margin-right: 60px !important;
|
||||||
background-color: lightblue;
|
background-color: #add8e6 !important;
|
||||||
}
|
}
|
||||||
.wallet-box{
|
.wallet-box{
|
||||||
background-color: aliceblue;
|
background-color: aliceblue;
|
||||||
|
|||||||
Reference in New Issue
Block a user