Saya memiliki kasus ketika saya perlu tahu apakah pengguna masuk atau tidak sebelum halaman diberikan sisi server dan dikirim kembali kepada saya menggunakan Next.js untuk menghindari perubahan flicker di UI.
Saya bisa mengetahui cara mencegah pengguna mengakses beberapa halaman jika dia sudah masuk menggunakan komponen HOC ini ...
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;
};
Dan ini bekerja dengan baik.
Sekarang, bagaimana saya bisa membangun komponen HOC yang serupa untuk membungkusnya katakanlah "_app.tsx" sehingga saya bisa meneruskan prop "userAuthenticated" ke setiap halaman dengan mendapatkan token dan mencari tahu apakah kadaluwarsa atau tidak dan berdasarkan pada prop yang saya dapat menunjukkan UI yang tepat kepada pengguna tanpa efek berkedip yang mengganggu?
Saya harap Anda dapat membantu saya dengan hal itu, saya mencoba melakukannya dengan cara yang sama seperti saya membangun HOC di atas, tetapi saya tidak bisa melakukannya, terutama karena Typacrip tidak membuat ini lebih mudah dengan kesalahan aneh :(
Edit == ==========================================
Saya dapat membuat komponen HOC tersebut dan meneruskan pro userAuthenticated
ke setiap halaman seperti ini ...
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;
};
Namun saya harus membungkus setiap halaman dengan HOC ini untuk meneruskan prop userAuthenticated
ke tata letak global yang saya miliki, karena saya tidak dapat membungkus komponen kelas "_app.tsx" dengan itu, selalu memberi saya Kesalahan. ..
Ini bekerja ...
export default isAuthenticated(Home);
export default isAuthenticated(about);
Tapi ini tidak ...
export default withRedux(configureStore)(isAuthenticated(MyApp));
Jadi agak menjengkelkan karena harus melakukan ini pada setiap halaman, dan kemudian meneruskan prop ke tata letak global di setiap halaman daripada hanya melakukannya sekali di "_app.tsx".
Saya menduga alasannya mungkin karena "_app.tsx" adalah komponen kelas dan bukan komponen fungsi seperti sisa halaman? Saya tidak tahu, saya hanya menebak.
Ada bantuan dengan itu?
ReactJS
ikuti Pemrograman Fungsional atau OOP, tapi saya melihat pola pikir pengembangan backend dalam kode Anda dengan pemikiran OOP. Mewarisi kelas baru dari komponen lain! 😐 Saya tidak melihat seperti itu sebelumnya.