diff --git a/package-lock.json b/package-lock.json index a3b69e1..e2514ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "clsx": "^2.1.1", "cmdk": "^1.0.0", "flatpickr": "^4.6.13", + "jsvectormap": "^1.6.0", "lucide-react": "^0.462.0", "next": "15.0.3", "next-crypto": "^1.0.8", @@ -2049,6 +2050,11 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/jsvectormap": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jsvectormap/-/jsvectormap-1.6.0.tgz", + "integrity": "sha512-4b/v4GWqiggHGN+CBOJBhIdpSGLY6wVetmMKiOlQ7oVM1PIzsLlSBJDMQd9ycLk6Rmzg4aFua35QDrk5HPb1YQ==" + }, "node_modules/libphonenumber-js": { "version": "1.11.15", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.15.tgz", diff --git a/package.json b/package.json index 4c71df6..5d6201a 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "clsx": "^2.1.1", "cmdk": "^1.0.0", "flatpickr": "^4.6.13", + "jsvectormap": "^1.6.0", "lucide-react": "^0.462.0", "next": "15.0.3", "next-crypto": "^1.0.8", diff --git a/src/apicalls/api-fetcher.tsx b/src/apicalls/api-fetcher.tsx index 7d216d7..9a20015 100644 --- a/src/apicalls/api-fetcher.tsx +++ b/src/apicalls/api-fetcher.tsx @@ -27,6 +27,7 @@ const prepareResponse = async (response: any) => { const errorResponse = responseJson?.error || responseJson?.Error; const messageResponse = (responseJson?.message || "").toString(); const completeResponse = responseJson?.completed; + const preparedResponse = { completed: completeResponse, message: messageResponse, diff --git a/src/apicalls/cookies/token.tsx b/src/apicalls/cookies/token.tsx index 34728b3..9fa25b6 100644 --- a/src/apicalls/cookies/token.tsx +++ b/src/apicalls/cookies/token.tsx @@ -20,7 +20,6 @@ async function check_access_token_is_valid() { "GET", false ); - console.log("response", response?.status); return response?.status === 200 ? true : false; } @@ -48,9 +47,17 @@ async function retrieve_access_objects() { return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null; } +async function retrieve_available_events() { + const cookieStore = await cookies(); + const encrpytAccessObject = cookieStore.get("availableEvents")?.value || ""; + const decrpytAccessObject = await nextCrypto.decrypt(encrpytAccessObject); + return decrpytAccessObject ? JSON.parse(decrpytAccessObject) : null; +} + export { check_access_token_is_valid, retrieve_access_token, retrieve_user_type, retrieve_access_objects, + retrieve_available_events, }; diff --git a/src/apicalls/dashboard/menu.tsx b/src/apicalls/dashboard/menu.tsx new file mode 100644 index 0000000..1bb7756 --- /dev/null +++ b/src/apicalls/dashboard/menu.tsx @@ -0,0 +1,27 @@ +"use server"; +import { fetchDataWithToken } from "../api-fetcher"; +import { cookies } from "next/headers"; +import { baseUrl, cookieObject, tokenSecret } from "@/apicalls/basics"; +import NextCrypto from "next-crypto"; + +const eventList = `${baseUrl}/event/list`; +const nextCrypto = new NextCrypto(tokenSecret); + +async function retrieve_event_list() { + const cookieStore = await cookies(); + const encrpytAccessToken = cookieStore.get("accessToken")?.value || ""; + const decryptedAccessToken = + (await nextCrypto.decrypt(encrpytAccessToken)) || ""; + + const response = await fetchDataWithToken( + eventList, + decryptedAccessToken, + {}, + "GET", + false + ); + console.log("response", response); + return response; +} + +export { retrieve_event_list }; diff --git a/src/apicalls/events/available.tsx b/src/apicalls/events/available.tsx new file mode 100644 index 0000000..4a83073 --- /dev/null +++ b/src/apicalls/events/available.tsx @@ -0,0 +1,34 @@ +"use server"; +import { fetchDataWithToken } from "../api-fetcher"; +import { cookies } from "next/headers"; +import { baseUrl, cookieObject, tokenSecret } from "@/apicalls/basics"; +import NextCrypto from "next-crypto"; + +const availableEventsURL = `${baseUrl}/access/endpoints/available`; + +async function setAvailableEvents(accessToken: string) { + const cookieStore = await cookies(); + const nextCrypto = new NextCrypto(tokenSecret); + + const availableResponse: any = await fetchDataWithToken( + availableEventsURL, + accessToken, + {}, + "POST", + false + ); + + if (availableResponse.status === 200) { + const availableEventData = Array.from(availableResponse?.result) || []; + const availableEvents = await nextCrypto.encrypt( + JSON.stringify({ availableEvents: availableEventData }) + ); + cookieStore.set({ + name: "availableEvents", + value: availableEvents, + ...cookieObject, + }); + } +} + +export { setAvailableEvents }; diff --git a/src/apicalls/login/login.tsx b/src/apicalls/login/login.tsx index 71da6ed..382906d 100644 --- a/src/apicalls/login/login.tsx +++ b/src/apicalls/login/login.tsx @@ -96,7 +96,6 @@ async function login_select_employee(payload: LoginSelectEmployee) { "POST", false ); - const responseData = selectResponse?.data; if (selectResponse.status === 200) { const usersSelection = await nextCrypto.encrypt( JSON.stringify({ @@ -110,7 +109,7 @@ async function login_select_employee(payload: LoginSelectEmployee) { ...cookieObject, }); } - return responseData; + return selectResponse; } async function login_select_occupant(payload: LoginSelectOccupant) { diff --git a/src/apicalls/login/password.tsx b/src/apicalls/login/password.tsx index fd6ac4d..1b75ee5 100644 --- a/src/apicalls/login/password.tsx +++ b/src/apicalls/login/password.tsx @@ -4,6 +4,7 @@ import { baseUrl } from "@/apicalls/basics"; const createPasswordEndpoint = `${baseUrl}/authentication/create_password`; const changePasswordEndpoint = `${baseUrl}/authentication/change_password`; +const forgotPasswordEndpoint = `${baseUrl}/authentication/reset_password`; interface createPasswordViaToken { token: string; @@ -17,6 +18,11 @@ interface changePasswordViaToken { newPassword: string; } +interface sendForgotPasswordEmail { + domain: string; + accessKey: string; +} + async function create_password_via_token(payload: createPasswordViaToken) { const createPasswordResponse: any = await fetchData( createPasswordEndpoint, @@ -45,4 +51,21 @@ async function change_password_via_token(payload: changePasswordViaToken) { return changePasswordResponse; } -export { create_password_via_token, change_password_via_token }; +async function send_forgot_password_email(payload: sendForgotPasswordEmail) { + const response: any = await fetchData( + forgotPasswordEndpoint, + { + domain: payload.domain, + access_key: payload.accessKey, + }, + "POST", + false + ); + return response; +} + +export { + create_password_via_token, + change_password_via_token, + send_forgot_password_email, +}; diff --git a/src/app/build/page.tsx b/src/app/build/page.tsx new file mode 100644 index 0000000..a107815 --- /dev/null +++ b/src/app/build/page.tsx @@ -0,0 +1,13 @@ +"use server"; +import React from "react"; + +const BuildPage: React.FC = async () => { + return ( +
+

Build Page

+

Welcome to the build page!

+
+ ); +}; + +export default BuildPage; diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 1cfb420..2ccd073 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -4,8 +4,10 @@ import { redirect } from "next/navigation"; import { check_access_token_is_valid, retrieve_access_token, + retrieve_available_events, } from "@/apicalls/cookies/token"; import DashboardPage from "@/components/Dashboards/DashboardPage"; +import { retrieveAvailableCategories } from "@/appEvents/categories"; const Dashboard: React.FC = async () => { const accessToken = (await retrieve_access_token()) || ""; @@ -14,9 +16,14 @@ const Dashboard: React.FC = async () => { redirect("/login/email"); } + const eventsList = await retrieve_available_events(); + const availableMenu = retrieveAvailableCategories(eventsList); return (
- +
); }; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a36cde0..cdc5736 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,9 @@ -import type { Metadata } from "next"; import localFont from "next/font/local"; import "./globals.css"; +// import "jsvectormap/dist/jsvectormap.css"; +// import "flatpickr/dist/flatpickr.min.css"; +// import "@/css/satoshi.css"; +// import "@/css/style.css"; const geistSans = localFont({ src: "./fonts/GeistVF.woff", @@ -13,11 +16,6 @@ const geistMono = localFont({ weight: "100 900", }); -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - export default function RootLayout({ children, }: Readonly<{ diff --git a/src/app/login/select/page.tsx b/src/app/login/select/page.tsx index f4d9b7e..52a9ff0 100644 --- a/src/app/login/select/page.tsx +++ b/src/app/login/select/page.tsx @@ -16,15 +16,19 @@ const SelectPage: React.FC = async () => { redirect("/login/email"); } - return userType === "employee" ? ( -
- -
- ) : ( -
- -
- ); + if (userType === "employee") { + return ( +
+ +
+ ); + } else { + return ( +
+ +
+ ); + } }; export default SelectPage; diff --git a/src/app/page.tsx b/src/app/page.tsx index 3eee014..4b54cce 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,12 @@ +"use client"; import Image from "next/image"; +import type { Metadata } from "next"; +import { redirect } from "next/navigation"; + +// export const metadata: Metadata = { +// title: "Evyos App", +// description: "Generated by Evyos Home Application", +// }; export default function Home() { return ( @@ -23,13 +31,13 @@ export default function Home() {
  • Save and see your changes instantly.
  • -
    - +
    { + redirect("/login/email"); + }} + > + - Deploy now + Sign In { + return ( +
    + +
    + ); +}; + +export default ForgotPasswordPage; diff --git a/src/appEvents/account/account.ts b/src/appEvents/account/account.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/appEvents/address/address.ts b/src/appEvents/address/address.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/appEvents/application/authentication.ts b/src/appEvents/application/authentication.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/appEvents/basic.ts b/src/appEvents/basic.ts new file mode 100644 index 0000000..cb244cd --- /dev/null +++ b/src/appEvents/basic.ts @@ -0,0 +1,121 @@ +interface SingleEventConstructor { + icon: string; + firstLayer: boolean; + eventName: string; + eventDescription: string; + eventFunctionUUID: string; + eventHref?: string; + childEvents: string[]; +} + +class SingleEvent { + icon: string; + firstLayer: boolean; + eventName: string; + eventDescription: string; + eventFunctionUUID: string; + eventHref?: string; + childEvents: string[]; + + constructor({ + icon, + firstLayer, + eventName, + eventDescription, + eventFunctionUUID, + childEvents, + eventHref, + }: SingleEventConstructor) { + this.icon = icon; + this.firstLayer = firstLayer; + this.eventName = eventName; + this.eventDescription = eventDescription; + this.eventFunctionUUID = eventFunctionUUID; + this.eventHref = eventHref; + this.childEvents = childEvents; + } + + create() { + return { + icon: this.icon, + firstLayer: this.firstLayer, + eventName: this.eventName, + eventDescription: this.eventDescription, + eventFunctionUUID: this.eventFunctionUUID, + eventHref: this.eventHref, + childEvents: this.childEvents, + }; + } +} + +interface CollectEventsConstructor { + mainEvent?: SingleEvent; + allEvents: SingleEvent[]; +} + +class CollectEvents { + allEvents: SingleEvent[]; + selectedEvents: SingleEvent[]; + mainEvent?: SingleEvent; + + constructor({ mainEvent, allEvents }: CollectEventsConstructor) { + this.mainEvent = mainEvent; + this.allEvents = allEvents; + this.selectedEvents = []; + console.log( + "events before", + this.mainEvent, + this.allEvents, + this.selectedEvents + ); + this.create(); + console.log( + "events after", + this.mainEvent, + this.allEvents, + this.selectedEvents + ); + } + + create() { + if (this.mainEvent) { + this.allEvents.forEach((event) => { + if (event.eventFunctionUUID === this.mainEvent?.eventFunctionUUID) { + event.childEvents.forEach((childEventUUID: string) => { + this.getSingleEventByUUID(childEventUUID); + }); + } + }); + } else { + this.allEvents.forEach((event) => { + if (event.firstLayer) { + this.selectedEvents.push(event); + } + }); + } + } + getSingleEventByUUID(singleEventByUUID: string) { + const foundEvent = this.allEvents.find( + (event) => event.eventFunctionUUID === singleEventByUUID + ); + console.log("foundEvent", foundEvent); + if (foundEvent) { + this.selectedEvents.push(foundEvent); + } + } +} + +const singleEvent = new SingleEvent({ + icon: "icon", + firstLayer: true, + eventName: "singleEvent", + eventDescription: "This is a single event", + eventFunctionUUID: "singleEventFunction", + childEvents: [ + "eventFunctionUUID1", + "eventFunctionUUID2", + "eventFunctionUUID3", + ], + eventHref: undefined, +}); +const singleEventObject = singleEvent.create(); diff --git a/src/appEvents/building/build.tsx b/src/appEvents/building/build.tsx new file mode 100644 index 0000000..ab2383d --- /dev/null +++ b/src/appEvents/building/build.tsx @@ -0,0 +1,5 @@ +import Build from "@/components/ContextComponents/Building/Build/Build"; + +const BuildPage = ; + +export default BuildPage; diff --git a/src/appEvents/building/iconSet.tsx b/src/appEvents/building/iconSet.tsx new file mode 100644 index 0000000..1c3adf8 --- /dev/null +++ b/src/appEvents/building/iconSet.tsx @@ -0,0 +1,33 @@ +import exp from "constants"; + +const BuildIcon = ( + <> + + + + + + + +); + +export default BuildIcon; diff --git a/src/appEvents/categories.ts b/src/appEvents/categories.ts new file mode 100644 index 0000000..79b6f95 --- /dev/null +++ b/src/appEvents/categories.ts @@ -0,0 +1,191 @@ +import { title } from "process"; +import BuildIcon from "./building/iconSet"; +import BuildPage from "./building/build"; + +const LeftMenuCategoriesSecond = [ + { + title: "Daireler", + icon: "apartment", + firstLayer: false, + selfEndpoints: [], + subCategories: [], + allEndpointUUID: [], + }, + { + title: "Kullanılabilir Alanlar", + icon: "area", + selfEndpoints: [], + subCategories: [], + allEndpointUUID: [], + }, + { + title: "Yaşayan Kişiler", + icon: "person", + selfEndpoints: [], + subCategories: [], + allEndpointUUID: [], + }, + { + title: "Davetiyeler", + icon: "invitation", + selfEndpoints: [], + subCategories: [], + allEndpointUUID: [], + }, + { + title: "Görev Ata", + icon: "task", + selfEndpoints: [], + subCategories: [], + allEndpointUUID: [], + }, + { + title: "Bakiye Sorgulama", + icon: "balance", + subCategories: [], + selfEndpoints: [], + allEndpointUUID: ["/account/records/list"], + }, +]; + +const BuildSubCategories = [ + { + title: "Daireler", + icon: "apartment", + component: "BuildPart", + selfEndpoints: [ + "/building/parts/list", + "/building/parts/create", + "/building/parts/update/{build_uu_id}", + ], + allEndpointUUID: [], + subCategories: [], + }, + { + title: "Kullanılabilir Alanlar", + icon: "area", + component: "BuildArea", + selfEndpoints: [ + "/building/area/list", + "/building/area/create", + "/building/area/update/{build_uu_id}", + ], + allEndpointUUID: [], + subCategories: [], + }, + { + title: "Yaşayan Kişiler", + icon: "person", + component: "LivingSpace", + selfEndpoints: [ + "/building/living_space/list", + "/building/living_space/create", + "/building/living_space/update/{build_uu_id}", + ], + allEndpointUUID: [], + subCategories: [], + }, +]; + +const LeftMenuCategories = [ + { + title: "Bina Tanımları", + icon: BuildIcon, + component: BuildPage, + allEndpoints: [ + "/building/build/list", + "/building/build/create", + "/building/build/update/{build_uu_id}", + "/building/parts/list", + "/building/parts/create", + "/building/parts/update/{build_uu_id}", + "/building/area/list", + "/building/area/create", + "/building/area/update/{build_uu_id}", + "/building/living_space/list", + "/building/living_space/create", + "/building/living_space/update/{build_uu_id}", + ], + selfEndpoints: [ + "/building/build/list", + "/building/build/create", + "/building/build/update/{build_uu_id}", + ], + subCategories: BuildSubCategories, + }, + { + title: "Toplantılar", + icon: "meeting", + allEndpointUUID: [ + "/build/decision_book/invite/list", + "/build/decision_book/invite/create", + "/build/decision_book/invite/update", + "/build/decision_book/invitations/assign", + ], + subCategories: [ + { + title: "Davetiyeler", + icon: "invitation", + selfEndpoints: [ + "/build/decision_book/invite/list", + "/build/decision_book/invite/create", + "/build/decision_book/invite/update", + "/build/decision_book/invitations/assign", + ], + allEndpointUUID: [], + subCategories: [], + }, + { + title: "Görev Ata", + icon: "task", + selfEndpoints: [], + subCategories: [], + allEndpointUUID: [], + }, + ], + }, + { + title: "Karar Defteri", + icon: "decision", + selfEndpoints: [], + allEndpointUUID: [], + subCategories: [], + }, + { + title: "Cari Hesaplar", + icon: "account", + selfEndpoints: [], + allEndpointUUID: ["/account/records/list"], + subCategories: [ + { + title: "Bakiye Sorgulama", + icon: "balance", + subCategories: [], + selfEndpoints: ["/account/records/list"], + allEndpointUUID: [], + }, + ], + }, +]; + +export function retrieveAvailableCategories(availableCategories: any) { + const availableCategoriesList = Array.from( + availableCategories?.availableEvents || [] + ); + let availableMenu: Array = []; + + for (let i = 0; i < LeftMenuCategories.length; i++) { + const category = LeftMenuCategories[i]; + if (category.allEndpoints) { + const categoryList = Array.from(category.allEndpoints); + for (let j = 0; j < categoryList.length; j++) { + const endpoint = categoryList[j]; + if (availableCategoriesList.includes(endpoint)) { + availableMenu.push(category); + break; + } + } + } + } + return availableMenu; +} diff --git a/src/components/ContextComponents/Building/Build/Build.tsx b/src/components/ContextComponents/Building/Build/Build.tsx new file mode 100644 index 0000000..bbf866f --- /dev/null +++ b/src/components/ContextComponents/Building/Build/Build.tsx @@ -0,0 +1,461 @@ +"use client"; +import React from "react"; +import { set, z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { + LucideRemoveFormatting, + RemoveFormattingIcon, + SidebarClose, +} from "lucide-react"; +import TableThree from "@/components/Tables/TableThree"; +import { retrieve_available_events } from "@/apicalls/cookies/token"; +import EventButton from "../../Commons/EventButton"; + +const formSchema = z.object({ + searchText: z.string().default(""), +}); + +const Build: React.FC = () => { + const packageData = [ + { + name: "Free package", + price: 0.0, + invoiceDate: `Jan 13,2023`, + status: true, + selected: false, + }, + { + name: "Standard Package", + price: 59.0, + invoiceDate: `Jan 13,2023`, + status: true, + selected: false, + }, + { + name: "Business Package", + price: 99.0, + invoiceDate: `Jan 13,2023`, + status: false, + selected: false, + }, + { + name: "Standard Package", + price: 59.0, + invoiceDate: `Jan 13,2023`, + status: false, + selected: false, + }, + ]; + const headers = [ + "Package", + "Package1", + "Package2", + "Package3", + "Invoice date", + "Onaylandı", + ]; + + const [renderTable, setRenderTable] = React.useState(false); + const [renderCreate, setRenderCreate] = React.useState(false); + const [renderUpdate, setRenderUpdate] = React.useState(false); + const endpointNeeds = [ + { + endpoint: "/building/build/list", + component: setRenderTable, + }, + { + endpoint: "/building/build/create", + component: setRenderCreate, + }, + { + endpoint: "/building/build/update/{build_uu_id}", + component: setRenderUpdate, + }, + ]; + const [packageList, setPackageList] = React.useState(Array.from(packageData)); + const [tableShow, settableShow] = React.useState(true); + + const form = useForm>({ + resolver: zodResolver(formSchema), + }); + + function selectItem({ key }: { key: number }) { + packageList.map((item, index) => { + if (index === key) { + item.selected = !item.selected; + } + }); + setPackageList([...packageList] as any); + } + + function cleanSelection() { + packageList.map((item) => { + item.selected = false; + }); + setPackageList([...packageList] as any); + } + + function cleanSearch() { + form.setValue("searchText", ""); + setPackageList(Array.from(packageData)); + } + + function search(values: z.infer) { + const searchText = values.searchText; + if (searchText === "") { + setPackageList(Array.from(packageData)); + } else { + const filteredList = Array.from(packageData).filter((item) => { + return item.name.toLowerCase().includes(searchText.toLowerCase()); + }); + setPackageList(filteredList); + } + } + + React.useEffect(() => {}, [packageList]); + + retrieve_available_events() + .then((data) => { + for (const endpointNeed of endpointNeeds) { + if (data?.availableEvents.includes(endpointNeed.endpoint)) { + endpointNeed.component(true); + } + } + }) + .catch((error) => { + console.log("error", error); + }); + + return ( + <> +
    + cleanSelection()} + label="Seçimleri Temizle" + bgColor="bg-red-700" + icon={ + + + + + + + } + /> + {renderUpdate && ( + console.log("Delete clicked")} + label="Seçili Olanları Sil" + bgColor="bg-emerald-700" + icon={ + + + + + + + } + /> + )} + {renderUpdate && ( + console.log("Create clicked")} + label="Kayıdı Güncelle" + bgColor="bg-blue-500" + icon={ + + + + + + + } + /> + )} + {renderUpdate && ( + console.log("Create clicked")} + label="Kayıt ekle" + bgColor="bg-indigo-700" + icon={ + + + + + + + } + /> + )} +
    + {renderTable ? ( + <> +
    +
    +
    + +
    + ( + + + + + + + )} + /> + + +
    +
    + +
    +
    + +
    +
    + + + + {headers.map((header, key) => ( + + ))} + + + + {packageList.map((packageItem, key) => ( + selectItem({ key })} + > + + + + + + + + ))} + +
    + {header} +
    +
    + {packageItem.name} +
    +
    +
    + {packageItem.name} +
    +
    +
    + {packageItem.name} +
    +
    +
    + {packageItem.name} +
    +
    +

    + {packageItem.invoiceDate} +

    +
    +

    + {packageItem.status ? "Evet" : "Hayır"} +

    +
    +
    +
    + + ) : ( + <> + )} + + ); +}; + +export default Build; diff --git a/src/components/ContextComponents/Building/BuildArea/BuildArea.tsx b/src/components/ContextComponents/Building/BuildArea/BuildArea.tsx new file mode 100644 index 0000000..a44bb7a --- /dev/null +++ b/src/components/ContextComponents/Building/BuildArea/BuildArea.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +const BuildArea: React.FC = () => { + return ( +
    +

    BuildArea Component

    +
    + ); +}; + +export default BuildArea; diff --git a/src/components/ContextComponents/Building/BuildPart/BuildPart.tsx b/src/components/ContextComponents/Building/BuildPart/BuildPart.tsx new file mode 100644 index 0000000..24f32d6 --- /dev/null +++ b/src/components/ContextComponents/Building/BuildPart/BuildPart.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +const BuildPart: React.FC = () => { + return ( +
    +

    BuildPart Component

    +
    + ); +}; + +export default BuildPart; diff --git a/src/components/ContextComponents/Commons/EventButton.tsx b/src/components/ContextComponents/Commons/EventButton.tsx new file mode 100644 index 0000000..7afea85 --- /dev/null +++ b/src/components/ContextComponents/Commons/EventButton.tsx @@ -0,0 +1,31 @@ +import React from "react"; + +interface EventButtonProps { + onClick: () => void; + label: string; + icon: React.ReactNode; + bgColor?: string; +} + +const EventButton: React.FC = ({ + onClick, + label, + icon, + bgColor, +}) => { + return ( +
    onClick()} + > +
    + {icon} + {label} +
    +
    + ); +}; + +export default EventButton; diff --git a/src/components/ContextComponents/Commons/Landing.tsx b/src/components/ContextComponents/Commons/Landing.tsx new file mode 100644 index 0000000..55d3183 --- /dev/null +++ b/src/components/ContextComponents/Commons/Landing.tsx @@ -0,0 +1,23 @@ +import ECommerce from "@/components/Dashboard/E-commerce"; +import React from "react"; + +const Landing: React.FC = () => { + return ( +
    +
    +
    +
    +
    + + Evyos Yönetim Sistemine Hoşgeldiniz + +
    + +
    +
    +
    +
    + ); +}; + +export default Landing; diff --git a/src/components/ContextComponents/Commons/Table.tsx b/src/components/ContextComponents/Commons/Table.tsx new file mode 100644 index 0000000..2a7845a --- /dev/null +++ b/src/components/ContextComponents/Commons/Table.tsx @@ -0,0 +1,395 @@ +"use client"; +import React from "react"; +import { set, z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import Landing from "@/components/ContextComponents/Commons/Landing"; + +interface TableProps { + data: Array; +} + +const formSchema = z.object({ + searchText: z.string().default(""), +}); + +const Table: React.FC = ({ data }) => { + const [packageList, setPackageList] = React.useState(Array.from(data)); + const headersList: Array = getHeaders(data); + + function getHeaders(data: Array): Array { + let returnList: Array = []; + if (Array.from(data).length > 0) { + Object.entries(data[0]).map(([key, value]) => { + console.log("key, value", key, value); + returnList.push(key); + }); + } + return returnList; + } + + const form = useForm>({ + resolver: zodResolver(formSchema), + }); + + function selectItem({ key }: { key: number }) { + packageList.map((item, index) => { + if (index === key) { + item.selected = !item.selected; + } + }); + setPackageList([...packageList] as any); + } + + function cleanSelection() { + packageList.map((item) => { + item.selected = false; + }); + setPackageList([...packageList] as any); + } + + function cleanSearch() { + form.setValue("searchText", ""); + setPackageList(Array.from(data)); + } + + function search(values: z.infer) { + const searchText = values.searchText; + if (searchText === "") { + setPackageList(Array.from(data)); + } else { + const filteredList = Array.from(data).filter((item) => { + return item.name.toLowerCase().includes(searchText.toLowerCase()); + }); + setPackageList(filteredList); + } + } + React.useEffect(() => {}, [packageList]); + + return ( + <> +
    +
    +
    cleanSelection()} + > + + + + + + + + + Seçimleri Temizle +
    +
    +
    +
    + + + + + + + + + Seçili Olanları Sil +
    +
    +
    +
    + + + + + + + + + Kayıdı Güncelle +
    +
    +
    +
    + + + + + + + + + Kayıt ekle +
    +
    +
    + +
    +
    +
    + +
    + ( + + + + + + + )} + /> + + +
    +
    + +
    +
    + +
    +
    + + + + {headersList.map((header, key) => ( + + ))} + + + + {packageList.map((packageItem, key) => ( + selectItem({ key })} + > + + + + + + + + ))} + +
    + {header} +
    +
    + {packageItem.name} +
    +
    +
    + {packageItem.name} +
    +
    +
    + {packageItem.name} +
    +
    +
    + {packageItem.name} +
    +
    +

    + {packageItem.invoiceDate} +

    +
    +

    + {packageItem.status ? "Evet" : "Hayır"} +

    +
    +
    +
    + + ); +}; + +export default Table; diff --git a/src/components/ContextComponents/DecisionBook/DecisionBook/DecisionBook.tsx b/src/components/ContextComponents/DecisionBook/DecisionBook/DecisionBook.tsx new file mode 100644 index 0000000..bf41cee --- /dev/null +++ b/src/components/ContextComponents/DecisionBook/DecisionBook/DecisionBook.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +const DecisionBook: React.FC = () => { + return ( +
    +

    DecisionBook Component

    +
    + ); +}; + +export default DecisionBook; diff --git a/src/components/ContextComponents/DecisionBook/a.txt b/src/components/ContextComponents/DecisionBook/a.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/components/ContextComponents/LivingSpace/LivingSpace.tsx b/src/components/ContextComponents/LivingSpace/LivingSpace.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Dashboard/E-commerce.tsx b/src/components/Dashboard/E-commerce.tsx index be70c6f..af7bfd3 100644 --- a/src/components/Dashboard/E-commerce.tsx +++ b/src/components/Dashboard/E-commerce.tsx @@ -7,9 +7,9 @@ import ChatCard from "../Chat/ChatCard"; import TableOne from "../Tables/TableOne"; import CardDataStats from "../CardDataStats"; -const MapOne = dynamic(() => import("@/components/Maps/MapOne"), { - ssr: false, -}); +// const MapOne = dynamic(() => import("@/components/Maps/MapOne"), { +// ssr: false, +// }); const ChartThree = dynamic(() => import("@/components/Charts/ChartThree"), { ssr: false, @@ -104,16 +104,15 @@ const ECommerce: React.FC = () => {
    - -
    +
    - - -
    + {/* */} + {/* */} + {/*
    - + */}
    ); diff --git a/src/components/Dashboards/DashboardPage.tsx b/src/components/Dashboards/DashboardPage.tsx index 4d696ac..2c08465 100644 --- a/src/components/Dashboards/DashboardPage.tsx +++ b/src/components/Dashboards/DashboardPage.tsx @@ -1,88 +1,36 @@ "use client"; import React from "react"; -import Image from "next/image"; import { Toaster } from "@/components/ui/toaster"; +import { showToast } from "@/components/login/toaster"; + import { useToast } from "@/hooks/use-toast"; import { useRouter } from "next/navigation"; -import { showToast } from "@/components/login/toaster"; -import { logout_active_session } from "@/apicalls/login/logout"; +import Landing from "../ContextComponents/Commons/Landing"; +import DefaultLayout from "@/components/Layouts/DefaultLayout"; -interface LoginSelectUser { - access_token: string; +interface DashboardPageProps { + accessToken: string; + leftSideMenuContent: Array; } -const DashboardPage: React.FC = ({ access_token }) => { +const DashboardPage: React.FC = ({ + accessToken, + leftSideMenuContent, +}) => { const { toast } = useToast(); const router = useRouter(); - - const logoutActiveSession = () => { - logout_active_session({ - token: access_token, - domain: "evyos.com.tr", - }) - .then((responseData: any) => { - if (responseData?.completed) { - showToast(toast, "Çıkış", { - message: "Çıkış başarılı", - data: JSON.stringify(responseData), - }); - router.push("/login/email"); - } - }) - .catch((error) => { - console.error(error); - showToast(toast, "Çıkış", { - message: "Çıkış başarısız", - data: JSON.stringify(error), - }); - }); - }; + const [activePage, setActivePage] = React.useState(); return ( -
    -

    Dashboard

    - -

    Welcome to the dashboard!

    -
    + + {activePage} + ); }; diff --git a/src/components/Header/DarkModeSwitcher.tsx b/src/components/Header/DarkModeSwitcher.tsx index 692d13b..0bba472 100644 --- a/src/components/Header/DarkModeSwitcher.tsx +++ b/src/components/Header/DarkModeSwitcher.tsx @@ -1,3 +1,4 @@ +"use client"; import useColorMode from "@/hooks/useColorMode"; const DarkModeSwitcher = () => { diff --git a/src/components/Header/DropdownMessage.tsx b/src/components/Header/DropdownMessage.tsx index dcb80cb..4e211be 100644 --- a/src/components/Header/DropdownMessage.tsx +++ b/src/components/Header/DropdownMessage.tsx @@ -1,3 +1,4 @@ +"use client"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; import Image from "next/image"; @@ -7,7 +8,6 @@ const DropdownMessage = () => { const [dropdownOpen, setDropdownOpen] = useState(false); const [notifying, setNotifying] = useState(true); - return ( setDropdownOpen(false)} className="relative">
  • diff --git a/src/components/Header/DropdownNotification.tsx b/src/components/Header/DropdownNotification.tsx index 835986a..259016d 100644 --- a/src/components/Header/DropdownNotification.tsx +++ b/src/components/Header/DropdownNotification.tsx @@ -1,3 +1,4 @@ +"use client"; import { useState } from "react"; import Link from "next/link"; import ClickOutside from "@/components/ClickOutside"; diff --git a/src/components/Header/DropdownUser.tsx b/src/components/Header/DropdownUser.tsx index f627b9e..df23f48 100644 --- a/src/components/Header/DropdownUser.tsx +++ b/src/components/Header/DropdownUser.tsx @@ -1,10 +1,44 @@ +"use client"; import { useState } from "react"; import Link from "next/link"; import Image from "next/image"; import ClickOutside from "@/components/ClickOutside"; +import { logout_active_session } from "@/apicalls/login/logout"; +import { showToast } from "../login/toaster"; +import { useToast } from "@/hooks/use-toast"; +import { useRouter } from "next/navigation"; -const DropdownUser = () => { +interface LoginSelectUser { + access_token: string; +} + +const DropdownUser: React.FC = ({ access_token }) => { const [dropdownOpen, setDropdownOpen] = useState(false); + const router = useRouter(); + const { toast } = useToast(); + + const logoutActiveSession = () => { + logout_active_session({ + token: access_token, + domain: "evyos.com.tr", + }) + .then((responseData: any) => { + if (responseData?.completed) { + showToast(toast, "Çıkış", { + message: "Çıkış başarılı", + data: JSON.stringify(responseData), + }); + router.push("/login/email"); + } + }) + .catch((error) => { + console.error(error); + showToast(toast, "Çıkış", { + message: "Çıkış başarısız", + data: JSON.stringify(error), + }); + }); + }; return ( setDropdownOpen(false)} className="relative"> @@ -50,7 +84,6 @@ const DropdownUser = () => { - {/* */} {dropdownOpen && (
    {
  • -
    )} - {/* */} ); }; diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index a43c531..5f01afc 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -1,3 +1,4 @@ +"use client"; import Link from "next/link"; import DarkModeSwitcher from "./DarkModeSwitcher"; import DropdownMessage from "./DropdownMessage"; @@ -5,9 +6,16 @@ import DropdownNotification from "./DropdownNotification"; import DropdownUser from "./DropdownUser"; import Image from "next/image"; -const Header = (props: { +interface HeaderProps { + access_token: string; sidebarOpen: string | boolean | undefined; setSidebarOpen: (arg0: boolean) => void; +} + +const Header: React.FC = ({ + access_token, + sidebarOpen, + setSidebarOpen, }) => { return (
    @@ -18,7 +26,7 @@ const Header = (props: { aria-controls="sidebar" onClick={(e) => { e.stopPropagation(); - props.setSidebarOpen(!props.sidebarOpen); + setSidebarOpen(!sidebarOpen); }} className="z-99999 block rounded-sm border border-stroke bg-white p-1.5 shadow-sm dark:border-strokedark dark:bg-boxdark lg:hidden" > @@ -26,29 +34,29 @@ const Header = (props: { @@ -67,7 +75,7 @@ const Header = (props: {
    -
    +
    diff --git a/src/components/Layouts/DefaultLayout.tsx b/src/components/Layouts/DefaultLayout.tsx index 82862be..b9bc703 100644 --- a/src/components/Layouts/DefaultLayout.tsx +++ b/src/components/Layouts/DefaultLayout.tsx @@ -3,36 +3,47 @@ import React, { useState, ReactNode } from "react"; import Sidebar from "@/components/Sidebar"; import Header from "@/components/Header"; -export default function DefaultLayout({ +interface DefaultLayoutProps { + children: ReactNode; + accessToken: string; + leftSideMenuContent: Array; + activePage: React.JSX.Element; + setActivePage: React.Dispatch>; +} + +const DefaultLayout: React.FC = ({ children, -}: { - children: React.ReactNode; -}) { + accessToken, + leftSideMenuContent, + activePage, + setActivePage, +}) => { const [sidebarOpen, setSidebarOpen] = useState(false); return ( <> - {/* */}
    - {/* */} - - {/* */} - - {/* */} -
    - {/* */} - {/* */} - - {/* */} + +
    +
    -
    +
    {children}
    - {/* */}
    - {/* */}
    - {/* */} ); -} +}; + +export default DefaultLayout; diff --git a/src/components/Sidebar/SidebarItem.tsx b/src/components/Sidebar/SidebarItem.tsx index 9f18494..30efa61 100644 --- a/src/components/Sidebar/SidebarItem.tsx +++ b/src/components/Sidebar/SidebarItem.tsx @@ -1,19 +1,16 @@ import React from "react"; import Link from "next/link"; import SidebarDropdown from "@/components/Sidebar/SidebarDropdown"; -import { usePathname } from "next/navigation"; const SidebarItem = ({ item, pageName, setPageName }: any) => { const handleClick = () => { - const updatedPageName = - pageName !== item.label.toLowerCase() ? item.label.toLowerCase() : ""; - return setPageName(updatedPageName); + console.log("item", item.title.toLowerCase(), pageName); + if (pageName !== item.title.toLowerCase()) { + setPageName(item.component); + } }; - const pathname = usePathname(); - const isActive = (item: any) => { - if (item.route === pathname) return true; if (item.children) { return item.children.some((child: any) => isActive(child)); } @@ -25,14 +22,15 @@ const SidebarItem = ({ item, pageName, setPageName }: any) => { return ( <>
  • - {item.icon} - {item.label} - {item.children && ( + {item.title} + {/* {item.children && ( { /> )} - - - {item.children && ( + */} +
  • + {/* {item.children && (
    { >
    - )} + )} */} ); diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index 64e73ed..bc81fb3 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -10,322 +10,19 @@ import useLocalStorage from "@/hooks/useLocalStorage"; interface SidebarProps { sidebarOpen: boolean; + leftSideMenuContent: Array; + activePage: React.JSX.Element; + setActivePage: React.Dispatch>; setSidebarOpen: (arg: boolean) => void; } -const menuGroups = [ - { - name: "MENU", - menuItems: [ - { - icon: ( - - - - - - - ), - label: "Dashboard", - route: "#", - children: [{ label: "eCommerce", route: "/" }], - }, - { - icon: ( - - - - ), - label: "Calendar", - route: "/calendar", - }, - { - icon: ( - - - - - ), - label: "Profile", - route: "/profile", - }, - { - icon: ( - - - - - - - - ), - label: "Forms", - route: "#", - children: [ - { label: "Form Elements", route: "/forms/form-elements" }, - { label: "Form Layout", route: "/forms/form-layout" }, - ], - }, - { - icon: ( - - - - - - - - - - - ), - label: "Tables", - route: "/tables", - }, - { - icon: ( - - - - - - - - - - - - ), - label: "Settings", - route: "/settings", - }, - ], - }, - { - name: "OTHERS", - menuItems: [ - { - icon: ( - - - - - - - - - - - - ), - label: "Chart", - route: "/chart", - }, - { - icon: ( - - - - - - - - - - - - - ), - label: "UI Elements", - route: "#", - children: [ - { label: "Alerts", route: "/ui/alerts" }, - { label: "Buttons", route: "/ui/buttons" }, - ], - }, - { - icon: ( - - - - - - - - - - - - ), - label: "Authentication", - route: "#", - children: [ - { label: "Sign In", route: "/auth/signin" }, - { label: "Sign Up", route: "/auth/signup" }, - ], - }, - ], - }, -]; - -const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { - const pathname = usePathname(); - const [pageName, setPageName] = useLocalStorage("selectedMenu", "dashboard"); - +const Sidebar = ({ + sidebarOpen, + leftSideMenuContent, + activePage, + setSidebarOpen, + setActivePage, +}: SidebarProps) => { return ( setSidebarOpen(false)}>
    diff --git a/src/components/Tables/TableFour.tsx b/src/components/Tables/TableFour.tsx index 60d21e2..d90b0d2 100644 --- a/src/components/Tables/TableFour.tsx +++ b/src/components/Tables/TableFour.tsx @@ -1,8 +1,8 @@ -import { BRAND } from "@/types/brand"; +// import { BRAND } from "@/types/brand"; import Image from "next/image"; import DropdownDefault from "../Dropdowns/DropdownDefault"; -const brandData: BRAND[] = [ +const brandData = [ { logo: "/images/brand/brand-01.svg", name: "Google", @@ -19,14 +19,14 @@ const brandData: BRAND[] = [ sales: 467, conversion: 4.3, }, - { - logo: "/images/brand/brand-06.svg", - name: "Youtube", - visitors: 2.1, - revenues: "4,290", - sales: 420, - conversion: 3.7, - }, + // { + // logo: "/images/brand/brand-06.svg", + // name: "Youtube", + // visitors: 2.1, + // revenues: "4,290", + // sales: 420, + // conversion: 3.7, + // }, { logo: "/images/brand/brand-04.svg", name: "Vimeo", diff --git a/src/components/Tables/TableThree.tsx b/src/components/Tables/TableThree.tsx index bd01c6e..af52ea5 100644 --- a/src/components/Tables/TableThree.tsx +++ b/src/components/Tables/TableThree.tsx @@ -1,156 +1,429 @@ -import { Package } from "@/types/package"; +"use client"; +import React from "react"; +import { set, z } from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { + LucideRemoveFormatting, + RemoveFormattingIcon, + SidebarClose, +} from "lucide-react"; +import Landing from "../ContextComponents/Commons/Landing"; -const packageData: Package[] = [ +const formSchema = z.object({ + searchText: z.string().default(""), +}); + +const packageData = [ { name: "Free package", price: 0.0, invoiceDate: `Jan 13,2023`, - status: "Paid", + status: true, + selected: false, }, { name: "Standard Package", price: 59.0, invoiceDate: `Jan 13,2023`, - status: "Paid", + status: true, + selected: false, }, { name: "Business Package", price: 99.0, invoiceDate: `Jan 13,2023`, - status: "Unpaid", + status: false, + selected: false, }, { name: "Standard Package", price: 59.0, invoiceDate: `Jan 13,2023`, - status: "Pending", + status: false, + selected: false, }, ]; +const headers = [ + "Package", + "Package1", + "Package2", + "Package3", + "Invoice date", + "Onaylandı", +]; const TableThree = () => { - return ( -
    -
    - - - - - - - - - - - {packageData.map((packageItem, key) => ( - - - - - + + + + + ))} + +
    - Package - - Invoice date - - Status - - Actions -
    -
    - {packageItem.name} -
    -

    ${packageItem.price}

    -
    -

    - {packageItem.invoiceDate} -

    -
    -

    >({ + resolver: zodResolver(formSchema), + }); + + function selectItem({ key }: { key: number }) { + packageList.map((item, index) => { + if (index === key) { + item.selected = !item.selected; + } + }); + setPackageList([...packageList] as any); + } + + function cleanSelection() { + packageList.map((item) => { + item.selected = false; + }); + setPackageList([...packageList] as any); + } + + function cleanSearch() { + form.setValue("searchText", ""); + setPackageList(Array.from(packageData)); + } + + function search(values: z.infer) { + const searchText = values.searchText; + if (searchText === "") { + setPackageList(Array.from(packageData)); + } else { + const filteredList = Array.from(packageData).filter((item) => { + return item.name.toLowerCase().includes(searchText.toLowerCase()); + }); + setPackageList(filteredList); + } + } + + React.useEffect(() => {}, [packageList]); + + if (tableShow) { + return ( + <> +

    +
    +
    cleanSelection()} + > + + + + + + + + + Seçimleri Temizle +
    +
    +
    +
    + + + + + + + + + Seçili Olanları Sil +
    +
    +
    +
    + + + + + + + + + Kayıdı Güncelle +
    +
    +
    +
    + + + + + + + + + Kayıt ekle +
    +
    +
    + +
    +
    + + +
    + ( + + + + + + + )} + /> +
    -
    - + +
    + + + + + +
    +
    + + + + {headers.map((header, key) => ( + + ))} + + + + {packageList.map((packageItem, key) => ( + selectItem({ key })} + > + + + - - ))} - -
    + {header} +
    +
    - - - - -
    +
    - - - - - - -
    +
    - - - - - -
    -
    -
    - ); + {packageItem.name} + +
    +
    + {packageItem.name} +
    +
    +

    + {packageItem.invoiceDate} +

    +
    +

    + {packageItem.status ? "Evet" : "Hayır"} +

    +
    +
    +
    + + ); + } else { + return ; + } }; export default TableThree; diff --git a/src/components/login/loginselectemployee.tsx b/src/components/login/loginselectemployee.tsx index b6b8c81..3327d8c 100644 --- a/src/components/login/loginselectemployee.tsx +++ b/src/components/login/loginselectemployee.tsx @@ -1,11 +1,14 @@ "use client"; import Image from "next/image"; +import React from "react"; +import Loader from "@/components/common/Loader"; import { Toaster } from "@/components/ui/toaster"; import { useToast } from "@/hooks/use-toast"; import { showToast } from "./toaster"; import { useRouter } from "next/navigation"; import { login_select_employee } from "@/apicalls/login/login"; +import { setAvailableEvents } from "@/apicalls/events/available"; interface CompanyList { company_list: Array; @@ -18,15 +21,21 @@ const LoginSelectEmployee: React.FC = ({ }) => { const { toast } = useToast(); const router = useRouter(); + const [isLoading, setIsLoading] = React.useState(false); + const companiesList = company_list || []; const onClick = (data: any) => { + setIsLoading(true); login_select_employee({ company_uu_id: data?.uu_id, token: access_token }) .then((responseData: any) => { + console.log("responseData", responseData); if (responseData?.completed) { showToast(toast, "Şirket seçimi", { message: "Şirket seçimi başarılı", data: JSON.stringify(responseData), }); + setIsLoading(false); + setAvailableEvents(access_token); router.push("/dashboard"); } }) @@ -39,53 +48,57 @@ const LoginSelectEmployee: React.FC = ({ }); }; - return ( - <> -
    + if (isLoading) { + return ; + } else { + return ( + <>
    - -
    -
    - {companiesList.map((data: any) => ( -
    -
    onClick(data)} - > -
    - {`Evyos -
    -
    -

    - UUID : {data.uu_id} -

    -

    - Şirket Unvanı : {data.public_name} -

    -

    - Şirket Tipi Name : {data.company_type} -

    -

    - Adres :{" "} - {data.company_address - ? data.company_address - : "Tanımlı Değil"} -

    +
    + +
    +
    + {companiesList.map((data: any) => ( +
    +
    onClick(data)} + > +
    + {`Evyos +
    +
    +

    + UUID : {data.uu_id} +

    +

    + Şirket Unvanı : {data.public_name} +

    +

    + Şirket Tipi Name : {data.company_type} +

    +

    + Adres :{" "} + {data.company_address + ? data.company_address + : "Tanımlı Değil"} +

    +
    -
    - ))} + ))} +
    -
    - - ); + + ); + } }; export default LoginSelectEmployee; diff --git a/src/components/login/loginselectoccupant.tsx b/src/components/login/loginselectoccupant.tsx index ba9a260..ecbb1dc 100644 --- a/src/components/login/loginselectoccupant.tsx +++ b/src/components/login/loginselectoccupant.tsx @@ -1,11 +1,13 @@ "use client"; import React from "react"; import Image from "next/image"; +import Loader from "@/components/common/Loader"; import { Toaster } from "@/components/ui/toaster"; import { useToast } from "@/hooks/use-toast"; import { showToast } from "@/components/login/toaster"; import { useRouter } from "next/navigation"; import { login_select_occupant } from "@/apicalls/login/login"; +import { setAvailableEvents } from "@/apicalls/events/available"; interface LoginSelectOccupantProps { access_token: string; @@ -22,6 +24,7 @@ const LoginSelectOccupant: React.FC = ({ const [activeOccupantList, setactiveOccupantList] = React.useState([]); const [isBuildingSelected, setIsBuildingSelected] = React.useState(false); const [selectedBuilding, setselectedBuilding] = React.useState(""); + const [isLoading, setIsLoading] = React.useState(false); const onClickBuild = (data: any) => { setselectedBuilding(data.build_uu_id); @@ -29,6 +32,7 @@ const LoginSelectOccupant: React.FC = ({ }; const onClick = (data: any) => { + setIsLoading(true); login_select_occupant({ build_part_uu_id: data?.part_uu_id, occupant_uu_id: data?.uu_id, @@ -41,7 +45,10 @@ const LoginSelectOccupant: React.FC = ({ message: "Şirket seçimi başarılı", data: JSON.stringify(responseData), }); - router.push("/dashboard"); + setTimeout(() => { + setAvailableEvents(access_token); + router.push("/dashboard"); + }, 3000); } }) .catch((error) => { @@ -79,87 +86,91 @@ const LoginSelectOccupant: React.FC = ({ } } - return ( - <> -
    + if (isLoading) { + return ; + } else { + return ( + <>
    - -
    - {!isBuildingSelected ? ( -
    - {activeBuildingList.map((data: any) => ( -
    onClickBuild(data)} - key={data.build_uu_id} - > -
    - {`Evyos -
    -
    -

    - UUID : {data.build_uu_id} -

    -

    - Bina : {data.build_name} -

    -

    - Bina No : {data.build_no} -

    - {/*

    +
    + +
    + {!isBuildingSelected ? ( +
    + {activeBuildingList.map((data: any) => ( +
    onClickBuild(data)} + key={data.build_uu_id} + > +
    + {`Evyos +
    +
    +

    + UUID : {data.build_uu_id} +

    +

    + Bina : {data.build_name} +

    +

    + Bina No : {data.build_no} +

    + {/*

    Adres :{" "} {data.company_address ? data.company_address : "Tanımlı Değil"}

    */} +
    -
    - ))} -

    - ) : ( -
    - {activeOccupantList.map((data: any) => ( -
    onClick(data)} - > -
    - {`Evyos + ))} +
    + ) : ( +
    + {activeOccupantList.map((data: any) => ( +
    onClick(data)} + > +
    + {`Evyos +
    +
    +

    + UUID : {data.part_uu_id} +

    +

    + Bina : {data.part_name} +

    +

    + Daire Kat : {data.part_level} +

    +

    + Giriş Tipi : {data.code} - {data.description} +

    +
    -
    -

    - UUID : {data.part_uu_id} -

    -

    - Bina : {data.part_name} -

    -

    - Daire Kat : {data.part_level} -

    -

    - Giriş Tipi : {data.code} - {data.description} -

    -
    -
    - ))} -
    - )} -
    - - ); + ))} +
    + )} +
    + + ); + } }; export default LoginSelectOccupant; diff --git a/src/components/login/loginwithemail.tsx b/src/components/login/loginwithemail.tsx index 57df77b..f26a190 100644 --- a/src/components/login/loginwithemail.tsx +++ b/src/components/login/loginwithemail.tsx @@ -19,7 +19,7 @@ import { Switch } from "@/components/ui/switch"; import { useRouter } from "next/navigation"; import { showToast } from "./toaster"; import { login_via_access_keys } from "@/apicalls/login/login"; -import { Link } from "lucide-react"; +import Loader from "@/components/common/Loader"; const formSchema = z.object({ loginEmailInput: z @@ -39,6 +39,7 @@ const LoginWithEmail: React.FC = () => { const router = useRouter(); const [showPassword, setShowPassword] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); const form = useForm>({ resolver: zodResolver(formSchema), @@ -49,6 +50,7 @@ const LoginWithEmail: React.FC = () => { } function onSubmit(values: z.infer) { + setIsLoading(true); login_via_access_keys({ domain: "evyos.com.tr", accessKey: values.loginEmailInput, @@ -79,331 +81,334 @@ const LoginWithEmail: React.FC = () => { }); }); } + if (isLoading) { + return ; + } else { + return ( + <> +
    +
    +
    +
    +
    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit + suspendisse. +

    - return ( - <> -
    -
    -
    -
    -
    -
    -

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit - suspendisse. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    -

    - Mail ile Giriş Yap -

    -
    - -
    - -
    - ( - - - - - - - )} - /> - - - - - - - -
    -
    - -
    - -
    - ( - - - - - - - )} - /> - - - - - - - - -
    -
    - ( - -
    - - Beni Hatırla - -
    - - - -
    - )} - /> - -
    - + + -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    - + + +
    + - - -
    - +
    -
    - - - ); + + + ); + } }; export default LoginWithEmail; diff --git a/src/components/password/ChangePassword.tsx b/src/components/password/ChangePassword.tsx index 6ae1d99..b1114f5 100644 --- a/src/components/password/ChangePassword.tsx +++ b/src/components/password/ChangePassword.tsx @@ -19,7 +19,10 @@ import { import { useRouter } from "next/navigation"; import { showToast } from "@/components/login/toaster"; -import { change_password_via_token } from "@/apicalls/login/password"; +import { + change_password_via_token, + send_forgot_password_email, +} from "@/apicalls/login/password"; const formSchema = z.object({ oldPassword: z.string().min(5, { message: "Şifre 6 karakterden az olamaz" }), @@ -409,6 +412,14 @@ const ChangePassword: React.FC = ({ accessToken }) => {
    +
    + +
    ); diff --git a/src/components/password/ForgotPassword.tsx b/src/components/password/ForgotPassword.tsx new file mode 100644 index 0000000..e67580e --- /dev/null +++ b/src/components/password/ForgotPassword.tsx @@ -0,0 +1,278 @@ +"use client"; +import React from "react"; +import { useToast } from "@/hooks/use-toast"; +import { Toaster } from "@/components/ui/toaster"; +import { set, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import * as z from "zod"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Switch } from "@/components/ui/switch"; + +import { useRouter } from "next/navigation"; +import { showToast } from "@/components/login/toaster"; +import { send_forgot_password_email } from "@/apicalls/login/password"; +import { Link } from "lucide-react"; +import { access } from "fs"; + +const formSchema = z.object({ + accessKey: z + .string() + .min(4, { message: "Email adresi minimum 4 karaterden oluşmalıdır" }) + .email("Geçerli bir mail adresi giriniz") + .default(""), +}); + +const ForgotPassword: React.FC = () => { + const { toast } = useToast(); + const router = useRouter(); + + const form = useForm>({ + resolver: zodResolver(formSchema), + }); + + function onSubmit(values: z.infer) { + send_forgot_password_email({ + domain: "evyos.com.tr", + accessKey: values.accessKey, + }) + .then((res: any) => { + if (res.status === 200) { + showToast(toast, "Email gönderildi", { + message: res?.message, + data: res, + }); + } + showToast(toast, "Email gönderilemedi", { + message: res?.error, + data: res, + }); + }) + .catch((error) => { + console.error(error); + showToast(toast, "Giriş başarısız", { + message: "Kullanıcı adı veya şifre hatalı", + data: JSON.stringify(error.code), + }); + }); + } + + return ( + <> +
    +
    +
    +
    +
    +
    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit + suspendisse. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    +

    + Şifremi Unuttum +

    +
    + +
    + +
    + ( + + + + + + + )} + /> + + + + + + + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + ); +}; + +export default ForgotPassword;