আমার একটি মামলা আছে যখন পৃষ্ঠাটি সার্ভার-সাইড রেন্ডার হওয়ার আগে ব্যবহারকারী লগ ইন হয়েছে কিনা তা আমার জানা দরকার এবং ইউআইতে ফ্লিকার পরিবর্তন এড়াতে Next.js ব্যবহার করে আমাকে আবার প্রেরণ করা হয়েছে।
আমি যদি এইচওসি উপাদানটি ইতিমধ্যে লগ ইন করে থাকে তবে ব্যবহারকারীকে কিছু পৃষ্ঠাগুলি অ্যাক্সেস করা থেকে কীভাবে রোধ করবেন তা আমি বুঝতে সক্ষম হয়েছি ...
export const noAuthenticatedAllowed = (WrappedComponent: NextPage) => {
const Wrapper = (props: any) => {
return <WrappedComponent {...props} />;
};
Wrapper.getInitialProps = async (ctx: NextPageContext) => {
let context = {};
const { AppToken } = nextCookie(ctx);
if (AppToken) {
const decodedToken: MetadataObj = jwt_decode(AppToken);
const isExpired = () => {
if (decodedToken.exp < Date.now() / 1000) {
return true;
} else {
return false;
}
};
if (ctx.req) {
if (!isExpired()) {
ctx.res && ctx.res.writeHead(302, { Location: "/" });
ctx.res && ctx.res.end();
}
}
if (!isExpired()) {
context = { ...ctx };
Router.push("/");
}
}
const componentProps =
WrappedComponent.getInitialProps &&
(await WrappedComponent.getInitialProps(ctx));
return { ...componentProps, context };
};
return Wrapper;
};
এবং এটি দুর্দান্ত কাজ করে।
এখন, আমি কীভাবে এটির চারপাশে মোড়ানোর জন্য একটি অনুরূপ এইচওসি উপাদান তৈরি করতে পারি যাক "_app.tsx" বলি যাতে টোকনটি পেয়ে প্রতিটি ব্যবহারকারীকে "ইউজারআউট্টিস্টিকেটেড" প্রপ পাস করতে পারি এবং এটি নির্ধারিত হয় কি না এবং এর ভিত্তিতে নির্ধারিত হয় সেই প্রস্তাবটি আমি সেই বিরক্তিকর ঝাঁকুনির প্রভাব ছাড়াই ব্যবহারকারীর কাছে সঠিক ইউআইটি দেখাতে পারি?
আমি আশা করি আপনি এটির সাথে আমাকে সহায়তা করতে পারেন, আমি উপরের এইচওসিটি যেভাবে তৈরি করেছি ঠিক সেভাবেই করার চেষ্টা করেছি, তবে আমি এটি করতে পারিনি, বিশেষত টাইপসক্রিপ্টটি তার অদ্ভুত ত্রুটিগুলির দ্বারা এটিকে আরও সহজ করে না :(
সম্পাদনা == ==========================================
আমি এই জাতীয় এইচওসি উপাদান তৈরি করতে সক্ষম হয়েছি এবং userAuthenticated
প্রতিটি পৃষ্ঠার জন্য প্রোটি এইরকম দিয়ে দিতে পারি ...
export const isAuthenticated = (WrappedComponent: NextPage) => {
const Wrapper = (props: any) => {
return <WrappedComponent {...props} />;
};
Wrapper.getInitialProps = async (ctx: NextPageContext) => {
let userAuthenticated = false;
const { AppToken} = nextCookie(ctx);
if (AppToken) {
const decodedToken: MetadataObj = jwt_decode(AppToken);
const isExpired = () => {
if (decodedToken.exp < Date.now() / 1000) {
return true;
} else {
return false;
}
};
if (ctx.req) {
if (!isExpired()) {
// ctx.res && ctx.res.writeHead(302, { Location: "/" });
// ctx.res && ctx.res.end();
userAuthenticated = true;
}
}
if (!isExpired()) {
userAuthenticated = true;
}
}
const componentProps =
WrappedComponent.getInitialProps &&
(await WrappedComponent.getInitialProps(ctx));
return { ...componentProps, userAuthenticated };
};
return Wrapper;
};
তবে আমার কাছে থাকা এই userAuthenticated
বিশ্বব্যাপী বিন্যাসের প্রপমটি পাস করার জন্য আমাকে এই এইচওসি দিয়ে প্রতিটি পৃষ্ঠাগুলি মুড়ে রাখতে হয়েছিল, কারণ "_app.tsx" শ্রেণীর উপাদানটি এটি দিয়ে মোড়ানো করতে পারি না, এটি সর্বদা আমাকে একটি ত্রুটি দেয়। ..
এইটা কাজ করে ...
export default isAuthenticated(Home);
export default isAuthenticated(about);
কিন্তু এটি না ...
export default withRedux(configureStore)(isAuthenticated(MyApp));
সুতরাং প্রতিটি পৃষ্ঠায় এটি করা কিছুটা বিরক্তিকর, এবং তারপরে প্রতিটি পৃষ্ঠায় গ্লোবাল লেআউটে প্রপটি কেবল "_app.tsx" এ একবার না করে দিয়ে দিন।
আমি অনুমান করছি কারণটি হতে পারে কারণ "_app.tsx" একটি বর্গ উপাদান এবং অন্যান্য পৃষ্ঠাগুলির মতো কোনও ফাংশন উপাদান নয়? আমি জানি না, আমি কেবল অনুমান করছি।
কোন সাহায্য?
ReactJS
ফাংশনাল প্রোগ্রামিং বা ওওপি অনুসরণ করে, তবে আমি ওওপি চিন্তাভাবনার সাথে আপনার কোডটিতে ব্যাকএন্ড বিকাশের মানসিকতা দেখতে পাচ্ছি। অন্য উপাদান থেকে একটি নতুন বর্গ উত্তরাধিকার! আমি এর আগে দেখিনি।