From 1357be9268f693660a0921a6df1480961aa5680d Mon Sep 17 00:00:00 2001 From: Paradoxe Ngwasi Date: Fri, 17 Nov 2023 07:48:39 +0000 Subject: [PATCH 1/9] fixed: react infinite rerendering timezone dropdown --- apps/web/lib/settings/timezone-dropdown.tsx | 43 +++++++++++---------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/apps/web/lib/settings/timezone-dropdown.tsx b/apps/web/lib/settings/timezone-dropdown.tsx index d81253606..d6e144ae7 100644 --- a/apps/web/lib/settings/timezone-dropdown.tsx +++ b/apps/web/lib/settings/timezone-dropdown.tsx @@ -7,6 +7,8 @@ import { clsxm } from '@app/utils'; import moment from 'moment-timezone'; import _debounce from 'lodash/debounce'; +const allTimezonesNames = moment.tz.names(); + export const TimezoneDropDown = ({ currentTimezone, onChangeTimezone @@ -17,30 +19,31 @@ export const TimezoneDropDown = ({ const { activeTimezone, setActiveTimezone } = useTimezoneSettings(); const [searchText, setSearchText] = useState(''); - const allTimezonesNames = moment.tz.names(); - const allTimezonesWithUTC = allTimezonesNames.map((item) => { - const offset = moment.tz(item).format('Z'); - return { name: item, offset: offset }; - }); + const items = useMemo(() => { + const allTimezonesWithUTC = allTimezonesNames.map((item) => { + const offset = moment.tz(item).format('Z'); + return { name: item, offset: offset }; + }); - allTimezonesWithUTC.sort((a, b) => { - // Compare the offsets for sorting - if (a.offset < b.offset) { - return -1; - } - if (a.offset > b.offset) { - return 1; - } - return 0; - }); + allTimezonesWithUTC.sort((a, b) => { + // Compare the offsets for sorting + if (a.offset < b.offset) { + return -1; + } + if (a.offset > b.offset) { + return 1; + } + return 0; + }); - const sortedTimezones = allTimezonesWithUTC.map((item) => `${item.name} (UTC ${item.offset})`); + const sortedTimezones = allTimezonesWithUTC.map((item) => `${item.name} (UTC ${item.offset})`); - const timeZonesMap: string[] = sortedTimezones.filter((item) => - item.toLowerCase().includes(searchText.toLowerCase()) - ); + const timeZonesMap: string[] = sortedTimezones.filter((item) => + item.toLowerCase().includes(searchText.toLowerCase()) + ); - const items = useMemo(() => mapTimezoneItems(timeZonesMap), [timeZonesMap]); + return mapTimezoneItems(timeZonesMap); + }, []); const [timezoneItem, setTimezoneItem] = useState(null); From 77ca309315e21afe0cb156e2abb840cfe8a16b22 Mon Sep 17 00:00:00 2001 From: Paradoxe Ngwasi Date: Fri, 17 Nov 2023 08:05:09 +0000 Subject: [PATCH 2/9] fixed: missing dependency warning --- apps/web/lib/settings/timezone-dropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/lib/settings/timezone-dropdown.tsx b/apps/web/lib/settings/timezone-dropdown.tsx index d6e144ae7..389f13fc7 100644 --- a/apps/web/lib/settings/timezone-dropdown.tsx +++ b/apps/web/lib/settings/timezone-dropdown.tsx @@ -43,7 +43,7 @@ export const TimezoneDropDown = ({ ); return mapTimezoneItems(timeZonesMap); - }, []); + }, [searchText]); const [timezoneItem, setTimezoneItem] = useState(null); From c97e56138bda5fc0a7031b2c8945ab0ad8b4dc3e Mon Sep 17 00:00:00 2001 From: desperado1802 Date: Fri, 17 Nov 2023 11:38:52 +0200 Subject: [PATCH 3/9] added nullish operator to fix errors --- .../app/components/TeamDropdown/DropDown.tsx | 2 +- .../TeamDropdown/DropDownSection.tsx | 6 +- .../components/ProfileHeader.tsx | 98 ++-- .../ProfileScreen/components/TaskFilter.tsx | 4 +- .../components/AcceptInviteModal.tsx | 4 +- .../TeamScreen/components/UserHeaderCard.tsx | 8 +- .../Authenticated/TeamScreen/index.tsx | 499 ++++++++---------- 7 files changed, 285 insertions(+), 336 deletions(-) diff --git a/apps/mobile/app/components/TeamDropdown/DropDown.tsx b/apps/mobile/app/components/TeamDropdown/DropDown.tsx index 4d70c5025..82733f7ff 100644 --- a/apps/mobile/app/components/TeamDropdown/DropDown.tsx +++ b/apps/mobile/app/components/TeamDropdown/DropDown.tsx @@ -55,7 +55,7 @@ const DropDown: FC = observer(function CreateTeamModal({ style={styles.teamImage} size={40} source={{ - uri: activeTeam.image?.thumbUrl || activeTeam.logo || activeTeam.image?.fullUrl + uri: activeTeam?.image?.thumbUrl || activeTeam?.logo || activeTeam?.image?.fullUrl }} /> ) : ( diff --git a/apps/mobile/app/components/TeamDropdown/DropDownSection.tsx b/apps/mobile/app/components/TeamDropdown/DropDownSection.tsx index dc2be3d7b..ca36e9fc8 100644 --- a/apps/mobile/app/components/TeamDropdown/DropDownSection.tsx +++ b/apps/mobile/app/components/TeamDropdown/DropDownSection.tsx @@ -143,11 +143,11 @@ const DropItem: FC = observer(function DropItem({ team, changeTeam, i return ( changeTeam(team)}> - {team.image?.thumbUrl || team.logo || team.image?.fullUrl ? ( + {team?.image?.thumbUrl || team?.logo || team?.image?.fullUrl ? ( ) : ( = observer(function DropItem({ team, changeTeam, i fontFamily: isActiveTeam ? typography.primary.semiBold : typography.primary.normal }} > - {limitTextCharaters({ text: team.name, numChars: resized ? 12 : 20 })} ({team.members.length}) + {limitTextCharaters({ text: team?.name, numChars: resized ? 12 : 20 })} ({team?.members.length}) navigateToSettings(team)}> diff --git a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ProfileHeader.tsx b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ProfileHeader.tsx index a32feaa3c..e81cca182 100644 --- a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ProfileHeader.tsx +++ b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ProfileHeader.tsx @@ -1,29 +1,24 @@ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import React from "react" -import { View, StyleSheet } from "react-native" -import { typography, useAppTheme } from "../../../../theme" +import React from 'react'; +import { View, StyleSheet } from 'react-native'; +import { typography, useAppTheme } from '../../../../theme'; // COMPONENTS -import { Text } from "../../../../components" -import { IUser } from "../../../../services/interfaces/IUserData" -import ProfileImage from "../../../../components/ProfileImage" -import { observer } from "mobx-react-lite" -import { useStores } from "../../../../models" -import { Avatar } from "react-native-paper" -import { limitTextCharaters } from "../../../../helpers/sub-text" -import { imgTitle } from "../../../../helpers/img-title" +import { Text } from '../../../../components'; +import { IUser } from '../../../../services/interfaces/IUserData'; +import ProfileImage from '../../../../components/ProfileImage'; +import { observer } from 'mobx-react-lite'; +import { useStores } from '../../../../models'; +import { Avatar } from 'react-native-paper'; +import { limitTextCharaters } from '../../../../helpers/sub-text'; +import { imgTitle } from '../../../../helpers/img-title'; const ProfileHeader = observer((member: IUser) => { - const { colors, dark } = useAppTheme() + const { colors, dark } = useAppTheme(); return ( - - + + {member?.name} @@ -32,21 +27,21 @@ const ProfileHeader = observer((member: IUser) => { - ) -}) + ); +}); const UserTeam = observer(() => { const { - teamStore: { activeTeam }, - } = useStores() + teamStore: { activeTeam } + } = useStores(); return ( @@ -55,10 +50,7 @@ const UserTeam = observer(() => { style={styles.teamImage} size={16} source={{ - uri: - activeTeam.image?.thumbUrl || - activeTeam.logo || - activeTeam.image?.fullUrl, + uri: activeTeam?.image?.thumbUrl || activeTeam?.logo || activeTeam?.image?.fullUrl }} /> ) : ( @@ -72,59 +64,59 @@ const UserTeam = observer(() => { {`${limitTextCharaters({ text: activeTeam?.name, - numChars: 16, + numChars: 16 })} `} - ) -}) + ); +}); const styles = StyleSheet.create({ activeTeamContainer: { - alignItems: "center", - backgroundColor: "#F5F5F5", + alignItems: 'center', + backgroundColor: '#F5F5F5', borderRadius: 60, - flexDirection: "row", + flexDirection: 'row', gap: 3, paddingHorizontal: 4, - paddingVertical: 0, + paddingVertical: 0 }, activeTeamTxt: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 8, - fontWeight: "600", + fontWeight: '600' // left: 12, }, container: { - backgroundColor: "#fff", - flexDirection: "row", - justifyContent: "space-between", + backgroundColor: '#fff', + flexDirection: 'row', + justifyContent: 'space-between', paddingBottom: 24, paddingHorizontal: 20, - paddingTop: 14, + paddingTop: 14 }, containerInfo: { - justifyContent: "center", - marginLeft: 10, + justifyContent: 'center', + marginLeft: 10 }, email: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.secondary.medium, - fontSize: 12, + fontSize: 12 }, name: { - color: "#282048", + color: '#282048', fontFamily: typography.primary.semiBold, - fontSize: 18, + fontSize: 18 }, prefix: { fontFamily: typography.fonts.PlusJakartaSans.semiBold, fontSize: 8, - fontWeight: "600", + fontWeight: '600' }, teamImage: { - backgroundColor: "#C1E0EA", - }, -}) + backgroundColor: '#C1E0EA' + } +}); -export default ProfileHeader +export default ProfileHeader; diff --git a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/TaskFilter.tsx b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/TaskFilter.tsx index f06dc7cd3..6d383f85d 100644 --- a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/TaskFilter.tsx +++ b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/TaskFilter.tsx @@ -26,14 +26,14 @@ const TaskFilter = ({ profile, hook }: { profile: IUserProfile; hook: ITaskFilte setShowFilterPopup(false)} /> setShowModal(true)} style={[ $assignStyle, { backgroundColor: colors.background, borderColor: colors.secondary, - opacity: profile.userProfile.isEmailVerified ? 1 : 0.5 + opacity: profile.userProfile?.isEmailVerified ? 1 : 0.5 } ]} > diff --git a/apps/mobile/app/screens/Authenticated/TeamScreen/components/AcceptInviteModal.tsx b/apps/mobile/app/screens/Authenticated/TeamScreen/components/AcceptInviteModal.tsx index 54b180543..380c66c2a 100644 --- a/apps/mobile/app/screens/Authenticated/TeamScreen/components/AcceptInviteModal.tsx +++ b/apps/mobile/app/screens/Authenticated/TeamScreen/components/AcceptInviteModal.tsx @@ -110,8 +110,8 @@ const AcceptInviteModal: FC = function InviteUserModal({ - {invitation?.teams[0].image ? ( - + {invitation?.teams[0]?.image ? ( + ) : ( )} diff --git a/apps/mobile/app/screens/Authenticated/TeamScreen/components/UserHeaderCard.tsx b/apps/mobile/app/screens/Authenticated/TeamScreen/components/UserHeaderCard.tsx index 8a5f46f5d..eb47b647d 100644 --- a/apps/mobile/app/screens/Authenticated/TeamScreen/components/UserHeaderCard.tsx +++ b/apps/mobile/app/screens/Authenticated/TeamScreen/components/UserHeaderCard.tsx @@ -75,25 +75,25 @@ const UserHeaderCard = ({ member, user }: { member: OT_Member; user: IUser }) => return ( - {user.image?.thumbUrl || user.imageUrl || user.image?.fullUrl ? ( + {user?.image?.thumbUrl || user?.imageUrl || user?.image?.fullUrl ? ( ) : ( )} - {user.name} + {user?.name} ); diff --git a/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx index 1a524b352..55d533f55 100644 --- a/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable camelcase */ -import React, { FC, SetStateAction, useState } from "react" +import React, { FC, SetStateAction, useState } from 'react'; import { View, TouchableOpacity, @@ -11,258 +11,215 @@ import { Dimensions, LogBox, FlatList, -} from "react-native" + StatusBar +} from 'react-native'; // TYPES -import { AuthenticatedTabScreenProps } from "../../../navigators/AuthenticatedNavigator" +import { AuthenticatedTabScreenProps } from '../../../navigators/AuthenticatedNavigator'; // COMPONENTS -import { Screen } from "../../../components" -import InviteUserModal from "./components/InviteUserModal" -import ListCardItem from "./components/ListCardItem" +import { Screen } from '../../../components'; +import InviteUserModal from './components/InviteUserModal'; +import ListCardItem from './components/ListCardItem'; // STYLES -import { GLOBAL_STYLE as GS } from "../../../../assets/ts/styles" -import { spacing, typography, useAppTheme } from "../../../theme" -import HomeHeader from "../../../components/HomeHeader" -import DropDown from "../../../components/TeamDropdown/DropDown" -import CreateTeamModal from "../../../components/CreateTeamModal" -import { useStores } from "../../../models" -import InviteCardItem from "./components/InviteCardItem" -import { BlurView } from "expo-blur" -import { useOrganizationTeam } from "../../../services/hooks/useOrganization" -import { translate } from "../../../i18n" -import useTeamScreenLogic from "./logics/useTeamScreenLogic" -import TeamScreenSkeleton from "./components/TeamScreenSkeleton" -import AcceptInviteModal from "./components/AcceptInviteModal" -import { useAcceptInviteModal } from "../../../services/hooks/features/useAcceptInviteModal" -import NoTeam from "../../../components/NoTeam" -import VerifyAccountModal from "./components/VerifyAccount" -import { useVerifyEmail } from "../../../services/hooks/features/useVerifyEmail" -import { - IOrganizationTeamWithMStatus, - OT_Member, -} from "../../../services/interfaces/IOrganizationTeam" -import { IInvitation } from "../../../services/interfaces/IInvite" +import { GLOBAL_STYLE as GS } from '../../../../assets/ts/styles'; +import { spacing, typography, useAppTheme } from '../../../theme'; +import HomeHeader from '../../../components/HomeHeader'; +import DropDown from '../../../components/TeamDropdown/DropDown'; +import CreateTeamModal from '../../../components/CreateTeamModal'; +import { useStores } from '../../../models'; +import InviteCardItem from './components/InviteCardItem'; +import { BlurView } from 'expo-blur'; +import { useOrganizationTeam } from '../../../services/hooks/useOrganization'; +import { translate } from '../../../i18n'; +import useTeamScreenLogic from './logics/useTeamScreenLogic'; +import TeamScreenSkeleton from './components/TeamScreenSkeleton'; +import AcceptInviteModal from './components/AcceptInviteModal'; +import { useAcceptInviteModal } from '../../../services/hooks/features/useAcceptInviteModal'; +import NoTeam from '../../../components/NoTeam'; +import VerifyAccountModal from './components/VerifyAccount'; +import { useVerifyEmail } from '../../../services/hooks/features/useVerifyEmail'; +import { IOrganizationTeamWithMStatus, OT_Member } from '../../../services/interfaces/IOrganizationTeam'; +import { IInvitation } from '../../../services/interfaces/IInvite'; -const { width, height } = Dimensions.get("window") -export const AuthenticatedTeamScreen: FC> = - function AuthenticatedTeamScreen(_props) { - const { colors, dark } = useAppTheme() - LogBox.ignoreAllLogs() - // Get authentificate data - const { - teamStore: { teamInvitations }, - TimerStore: { localTimerStatus }, - } = useStores() +const { width, height } = Dimensions.get('window'); +export const AuthenticatedTeamScreen: FC> = function AuthenticatedTeamScreen( + _props +) { + const { colors, dark } = useAppTheme(); + LogBox.ignoreAllLogs(); + // Get authentificate data + const { + teamStore: { teamInvitations }, + TimerStore: { localTimerStatus } + } = useStores(); - const { - $otherMembers, - createOrganizationTeam, - isTeamManager, - currentUser, - activeTeam, - currentTeam, - } = useOrganizationTeam() - const { - setShowCreateTeamModal, - setShowInviteModal, - showCreateTeamModal, - showInviteModal, - // setShowMoreMenu, - isLoading, - isTeamModalOpen, - setIsTeamModalOpen, - } = useTeamScreenLogic() - const { openModal, closeModal, activeInvitation, onAcceptInvitation, onRejectInvitation } = - useAcceptInviteModal() - const [showVerifyAccountModal, setShowVerifyAccountModal] = useState(false) - const [isScrolling, setIsScrolling] = useState(false) + const { $otherMembers, createOrganizationTeam, isTeamManager, currentUser, activeTeam, currentTeam } = + useOrganizationTeam(); + const { + setShowCreateTeamModal, + setShowInviteModal, + showCreateTeamModal, + showInviteModal, + // setShowMoreMenu, + isLoading, + isTeamModalOpen, + setIsTeamModalOpen + } = useTeamScreenLogic(); + const { openModal, closeModal, activeInvitation, onAcceptInvitation, onRejectInvitation } = useAcceptInviteModal(); + const [showVerifyAccountModal, setShowVerifyAccountModal] = useState(false); + const [isScrolling, setIsScrolling] = useState(false); - const { - resendAccountVerificationCode, - isLoading: isLoadingEmailVerification, - verifyEmailByCode, - } = useVerifyEmail() + const { + resendAccountVerificationCode, + isLoading: isLoadingEmailVerification, + verifyEmailByCode + } = useVerifyEmail(); - const [openMenuIndex, setOpenMenuIndex] = useState(null) + const [openMenuIndex, setOpenMenuIndex] = useState(null); - return ( - <> - {showInviteModal && } - - {isLoading ? ( - - ) : ( - <> - setShowInviteModal(false)} - /> - setShowVerifyAccountModal(false)} - isLoading={isLoadingEmailVerification} - verifyEmailByCode={verifyEmailByCode} - userEmail={currentUser?.employee.user.email} - resendAccountVerificationCode={() => - resendAccountVerificationCode(currentUser.employee.user.email) - } - /> - closeModal()} - invitation={activeInvitation} - onAcceptInvitation={onAcceptInvitation} - onRejectInvitation={onRejectInvitation} - /> - setShowCreateTeamModal(false)} - /> - - {activeTeam ? ( - <> - - - setShowCreateTeamModal(true)} - isAccountVerified={ - currentUser?.employee.user.isEmailVerified - } - /> - - {isTeamManager && - currentUser.employee.user.isEmailVerified ? ( - setShowInviteModal(true)} - > - - {translate("teamScreen.inviteButton")} - - - ) : isTeamManager && - !currentUser.employee.user.isEmailVerified ? ( - { - setShowVerifyAccountModal(true) - resendAccountVerificationCode( - currentUser.employee.user.email, - ) - }} - > - - {translate("accountVerificationModal.verify")} - - - ) : null} + return ( + <> + {showInviteModal && } + + + {isLoading ? ( + + ) : ( + <> + setShowInviteModal(false)} /> + setShowVerifyAccountModal(false)} + isLoading={isLoadingEmailVerification} + verifyEmailByCode={verifyEmailByCode} + userEmail={currentUser?.employee.user.email} + resendAccountVerificationCode={() => + resendAccountVerificationCode(currentUser.employee.user.email) + } + /> + closeModal()} + invitation={activeInvitation} + onAcceptInvitation={onAcceptInvitation} + onRejectInvitation={onRejectInvitation} + /> + setShowCreateTeamModal(false)} + /> + + {activeTeam ? ( + <> + + + setShowCreateTeamModal(true)} + isAccountVerified={currentUser?.employee?.user?.isEmailVerified} + /> - - {/* Users activity list */} - - setIsScrolling(false)} - onScrollBeginDrag={() => setIsScrolling(true)} - data={[currentUser, $otherMembers, teamInvitations]} - showsVerticalScrollIndicator={false} - bounces={false} - keyExtractor={(item, index) => index.toString()} - renderItem={({ item, index }) => { - if (index === 0) { - return ( - - ) - } else if (index === 1) { - return ( - - ) - } else { - return ( - - ) - } + {isTeamManager && currentUser?.employee?.user?.isEmailVerified ? ( + setShowInviteModal(true)} + > + + {translate('teamScreen.inviteButton')} + + + ) : isTeamManager && !currentUser?.employee?.user?.isEmailVerified ? ( + { + setShowVerifyAccountModal(true); + resendAccountVerificationCode(currentUser.employee.user.email); }} - ListFooterComponent={ - + > + + {translate('accountVerificationModal.verify')} + + + ) : null} + + + {/* Users activity list */} + + setIsScrolling(false)} + onScrollBeginDrag={() => setIsScrolling(true)} + data={[currentUser, $otherMembers, teamInvitations]} + showsVerticalScrollIndicator={false} + bounces={false} + keyExtractor={(item, index) => index.toString()} + renderItem={({ item, index }) => { + if (index === 0) { + return ( + + ); + } else if (index === 1) { + return ( + + ); + } else { + return ( + + ); } - /> - - - ) : ( - setShowCreateTeamModal(true)} /> - )} - - )} - - - ) - } + }} + ListFooterComponent={} + /> + + + ) : ( + setShowCreateTeamModal(true)} /> + )} + + )} + + + ); +}; const CurrentUserCard: FC<{ - member: OT_Member - openMenuIndex: number | null - setOpenMenuIndex: React.Dispatch> - currentTeam: IOrganizationTeamWithMStatus | null - canNavigate: boolean + member: OT_Member; + openMenuIndex: number | null; + setOpenMenuIndex: React.Dispatch>; + currentTeam: IOrganizationTeamWithMStatus | null; + canNavigate: boolean; }> = ({ member, openMenuIndex, setOpenMenuIndex, currentTeam, canNavigate }) => { return ( @@ -275,15 +232,15 @@ const CurrentUserCard: FC<{ canNavigate={canNavigate} /> - ) -} + ); +}; const OtherMembersList: FC<{ - members: OT_Member[] - openMenuIndex: number | null - setOpenMenuIndex: React.Dispatch> - currentTeam: IOrganizationTeamWithMStatus | null - canNavigate: boolean + members: OT_Member[]; + openMenuIndex: number | null; + setOpenMenuIndex: React.Dispatch>; + currentTeam: IOrganizationTeamWithMStatus | null; + canNavigate: boolean; }> = ({ members, openMenuIndex, setOpenMenuIndex, currentTeam, canNavigate }) => { return ( @@ -303,14 +260,14 @@ const OtherMembersList: FC<{ )} /> - ) -} + ); +}; const InvitationsList: FC<{ - invitations: IInvitation[] - $otherMembers: OT_Member[] - openMenuIndex: number | null - setOpenMenuIndex: React.Dispatch> + invitations: IInvitation[]; + $otherMembers: OT_Member[]; + openMenuIndex: number | null; + setOpenMenuIndex: React.Dispatch>; }> = ({ invitations, $otherMembers, openMenuIndex, setOpenMenuIndex }) => { return ( @@ -328,24 +285,24 @@ const InvitationsList: FC<{ )} /> - ) -} + ); +}; const $container: ViewStyle = { - ...GS.flex1, -} + ...GS.flex1 +}; const $cardContainer: ViewStyle = { ...GS.flex1, - paddingHorizontal: spacing.small, -} + paddingHorizontal: spacing.small +}; const $blurContainer: ViewStyle = { height, - width: "100%", - position: "absolute", + width: '100%', + position: 'absolute', top: 0, - zIndex: 1001, -} + zIndex: 1001 +}; const $inviteButton: ViewStyle = { width: width / 3, @@ -354,20 +311,20 @@ const $inviteButton: ViewStyle = { paddingVertical: 10, borderRadius: 10, borderWidth: 2, - justifyContent: "center", - alignItems: "center", -} + justifyContent: 'center', + alignItems: 'center' +}; const $inviteButtonText: TextStyle = { fontSize: 14, fontFamily: typography.fonts.PlusJakartaSans.semiBold, - color: "#3826A6", -} + color: '#3826A6' +}; const $wrapTeam: ViewStyle = { - flexDirection: "row", - width: "100%", + flexDirection: 'row', + width: '100%', padding: 20, - justifyContent: "space-between", - alignItems: "center", - zIndex: 999, -} + justifyContent: 'space-between', + alignItems: 'center', + zIndex: 999 +}; From fe06e43eb879c423caa39eb5858b162ed42f35c1 Mon Sep 17 00:00:00 2001 From: Paradoxe Ngwasi Date: Fri, 17 Nov 2023 09:55:46 +0000 Subject: [PATCH 4/9] fixed: browser terminal errors and warning --- apps/web/lib/components/color-picker.tsx | 1 + apps/web/lib/components/emoji-picker.tsx | 1 + apps/web/lib/settings/page-dropdown.tsx | 2 +- apps/web/lib/settings/period-dropdown.tsx | 2 +- apps/web/lib/settings/proof-dropdown.tsx | 2 +- apps/web/lib/settings/team-size-popover.tsx | 1 + 6 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/web/lib/components/color-picker.tsx b/apps/web/lib/components/color-picker.tsx index be3fefae3..d068a9fe1 100644 --- a/apps/web/lib/components/color-picker.tsx +++ b/apps/web/lib/components/color-picker.tsx @@ -72,6 +72,7 @@ export const ColorPicker = ({ ref={buttonRef} disabled={disableButton} onClick={toggleDisabled} + as="div" >
diff --git a/apps/web/lib/settings/proof-dropdown.tsx b/apps/web/lib/settings/proof-dropdown.tsx index 6d28a197d..81b15232c 100644 --- a/apps/web/lib/settings/proof-dropdown.tsx +++ b/apps/web/lib/settings/proof-dropdown.tsx @@ -62,7 +62,7 @@ export const ProofDropdown = ({ 'py-0 font-medium h-[54px] w-[150px] w-full', ProofList.length === 0 && ['py-2'] )} - value={ProofItem} + value={ProofItem || null} onChange={onChangeActiveTeam} items={items} > diff --git a/apps/web/lib/settings/team-size-popover.tsx b/apps/web/lib/settings/team-size-popover.tsx index 2ea000422..fcd280091 100644 --- a/apps/web/lib/settings/team-size-popover.tsx +++ b/apps/web/lib/settings/team-size-popover.tsx @@ -96,6 +96,7 @@ const TeamSize = ({ ref={buttonRef} disabled={disableButton} onClick={toggleDisabled} + as="div" >
Date: Fri, 17 Nov 2023 12:08:53 +0200 Subject: [PATCH 5/9] added navigation when task title pressed in profile screen --- .../ProfileScreen/components/ListCardItem.tsx | 26 +++++++++++++++---- .../components/TaskTitleDisplay.tsx | 9 ++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ListCardItem.tsx b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ListCardItem.tsx index de7d9e097..960bfb20a 100644 --- a/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ListCardItem.tsx +++ b/apps/mobile/app/screens/Authenticated/ProfileScreen/components/ListCardItem.tsx @@ -25,6 +25,8 @@ import { secondsToTime } from '../../../../helpers/date'; import { useTaskStatistics } from '../../../../services/hooks/features/useTaskStatics'; import { useStores } from '../../../../models'; import IssuesModal from '../../../../components/IssuesModal'; +import { SettingScreenNavigationProp } from '../../../../navigators/AuthenticatedNavigator'; +import { useNavigation } from '@react-navigation/native'; export type ListItemProps = { active?: boolean; @@ -61,6 +63,12 @@ export const ListItemContent: React.FC = observer((props) => { return (activeTaskTotalStat?.duration * 100) / props.task?.estimate || 0; }, [timerStatus, props.activeAuthTask, activeTaskTotalStat]); + const navigation = useNavigation>(); + + const navigateToTask = (taskId: string) => { + !editTitle && navigation.navigate('TaskScreen', { taskId }); + }; + return ( { @@ -97,12 +105,20 @@ export const ListItemContent: React.FC = observer((props) => { - - - + navigateToTask(props.task?.id)}> + + + + + + - - + {!enableEstimate ? ( setEnableEstimate(true)}> unknown; task: ITeamTask; + navigateToTask: (taskId: string) => void; } -const TaskTitleDisplay: FC = ({ editMode, setEditMode, task }) => { +const TaskTitleDisplay: FC = ({ editMode, setEditMode, task, navigateToTask }) => { const { colors } = useAppTheme(); const { updateTask } = useTeamTasks(); const [taskTitle, setTaskTitle] = useState(task.title); @@ -60,7 +61,7 @@ const TaskTitleDisplay: FC = ({ editMode, setEditMode, task }) => { } return ( - setEditMode(true)}> + setEditMode(true)} onPress={() => navigateToTask(task?.id)}> #{task.number} @@ -72,7 +73,7 @@ const TaskTitleDisplay: FC = ({ editMode, setEditMode, task }) => { - + ); }; From 542d83ef829cb38ad6d42a48844274a1d5fdc15c Mon Sep 17 00:00:00 2001 From: desperado1802 Date: Fri, 17 Nov 2023 16:26:27 +0200 Subject: [PATCH 6/9] added status bar to screens --- .../MembersSettingsScreen/index.tsx | 234 +++++++------ .../Authenticated/ProfileScreen/index.tsx | 13 +- .../Authenticated/SettingScreen/index.tsx | 5 +- .../Authenticated/TaskLabelScreen/index.tsx | 165 +++++---- .../TaskPrioritiesScreen/index.tsx | 164 +++++---- .../Authenticated/TaskScreen/index.tsx | 96 +++--- .../Authenticated/TaskSizeScreen/index.tsx | 315 +++++++++--------- .../Authenticated/TaskStatusScreen/index.tsx | 313 +++++++++-------- .../Authenticated/TaskVersionScreen/index.tsx | 307 +++++++++-------- .../Authenticated/TeamScreen/index.tsx | 2 +- .../Authenticated/TimerScreen/index.tsx | 3 +- 11 files changed, 797 insertions(+), 820 deletions(-) diff --git a/apps/mobile/app/screens/Authenticated/MembersSettingsScreen/index.tsx b/apps/mobile/app/screens/Authenticated/MembersSettingsScreen/index.tsx index 8035b030d..e4dd2c4a6 100644 --- a/apps/mobile/app/screens/Authenticated/MembersSettingsScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/MembersSettingsScreen/index.tsx @@ -1,102 +1,96 @@ /* eslint-disable camelcase */ /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react-native/no-color-literals */ -import { View, Text, ViewStyle, TouchableOpacity, StyleSheet } from "react-native" -import React, { FC, SetStateAction, useState } from "react" +import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, StatusBar } from 'react-native'; +import React, { FC, SetStateAction, useState } from 'react'; import { AuthenticatedDrawerScreenProps, DrawerNavigationProp, - SettingScreenNavigationProp, -} from "../../../navigators/AuthenticatedNavigator" -import { Screen } from "../../../components" -import { typography, useAppTheme } from "../../../theme" -import { AntDesign, Feather } from "@expo/vector-icons" -import { translate } from "../../../i18n" -import { useStores } from "../../../models" -import MembersList from "./components/MembersList" -import { OT_Member } from "../../../services/interfaces/IOrganizationTeam" -import { SvgXml } from "react-native-svg" -import { moreButtonDark, moreButtonLight } from "../../../components/svgs/icons" -import { GLOBAL_STYLE as GS } from "../../../../assets/ts/styles" -import ChangeRoleModal from "./components/ChangeRoleModal" -import ConfirmationModal from "../../../components/ConfirmationModal" -import { useOrganizationTeam } from "../../../services/hooks/useOrganization" -import { useTeamMemberCard } from "../../../services/hooks/features/useTeamMemberCard" -import { useNavigation } from "@react-navigation/native" + SettingScreenNavigationProp +} from '../../../navigators/AuthenticatedNavigator'; +import { Screen } from '../../../components'; +import { typography, useAppTheme } from '../../../theme'; +import { AntDesign, Feather } from '@expo/vector-icons'; +import { translate } from '../../../i18n'; +import { useStores } from '../../../models'; +import MembersList from './components/MembersList'; +import { OT_Member } from '../../../services/interfaces/IOrganizationTeam'; +import { SvgXml } from 'react-native-svg'; +import { moreButtonDark, moreButtonLight } from '../../../components/svgs/icons'; +import { GLOBAL_STYLE as GS } from '../../../../assets/ts/styles'; +import ChangeRoleModal from './components/ChangeRoleModal'; +import ConfirmationModal from '../../../components/ConfirmationModal'; +import { useOrganizationTeam } from '../../../services/hooks/useOrganization'; +import { useTeamMemberCard } from '../../../services/hooks/features/useTeamMemberCard'; +import { useNavigation } from '@react-navigation/native'; -export const MembersSettingsScreen: FC> = ( - _props, -) => { - const { colors, dark } = useAppTheme() +export const MembersSettingsScreen: FC> = (_props) => { + const { colors, dark } = useAppTheme(); // const { navigation } = _props - const { isTeamManager } = useOrganizationTeam() + const { isTeamManager } = useOrganizationTeam(); const { - teamStore: { activeTeam }, - } = useStores() + teamStore: { activeTeam } + } = useStores(); - const [selectMode, setSelectMode] = useState(false) - const [showDropdownMenu, setShowDropdownMenu] = useState(false) - const [selectedMembers, setSelectedMembers] = useState([]) - const [isNameEditMode, setIsNameEditMode] = useState(false) + const [selectMode, setSelectMode] = useState(false); + const [showDropdownMenu, setShowDropdownMenu] = useState(false); + const [selectedMembers, setSelectedMembers] = useState([]); + const [isNameEditMode, setIsNameEditMode] = useState(false); - const navigation = useNavigation>() - const alternateNavigation = useNavigation>() + const navigation = useNavigation>(); + const alternateNavigation = useNavigation>(); const addOrRemoveToSelectedList = (member: OT_Member): void => { if (selectMode) { if (!selectedMembers.some((selected) => selected.id === member.id)) { - setSelectedMembers([...selectedMembers, member]) + setSelectedMembers([...selectedMembers, member]); } else { const updatedSelectedMembers = selectedMembers.filter( - (selectedMember) => selectedMember.id !== member.id, - ) - setSelectedMembers(updatedSelectedMembers) + (selectedMember) => selectedMember.id !== member.id + ); + setSelectedMembers(updatedSelectedMembers); if (selectedMembers.length === 1) { - setSelectMode(false) - setShowDropdownMenu(false) + setSelectMode(false); + setShowDropdownMenu(false); } } } else { - alternateNavigation.navigate("AuthenticatedTab") + alternateNavigation.navigate('AuthenticatedTab'); setTimeout(() => { - navigation.navigate("Profile", { + navigation.navigate('Profile', { userId: member?.employee?.userId, - activeTab: "worked", - }) - }, 50) + activeTab: 'worked' + }); + }, 50); } - } + }; const setSelectMembersMode = (member: OT_Member): void => { - if (!isTeamManager) return + if (!isTeamManager) return; if (!selectMode) { - setSelectMode(true) + setSelectMode(true); } if (!selectedMembers.some((selectedMember) => selectedMember.id === member.id)) { - const updatedSelectedMembers = [...selectedMembers, member] - setSelectedMembers(updatedSelectedMembers) + const updatedSelectedMembers = [...selectedMembers, member]; + setSelectedMembers(updatedSelectedMembers); } - setSelectMode(true) - } + setSelectMode(true); + }; return ( - + + - navigation.navigate("Setting")}> + navigation.navigate('Setting')}> - {translate("settingScreen.membersSettingsScreen.mainTitle")} + {translate('settingScreen.membersSettingsScreen.mainTitle')} - - selectMode && setShowDropdownMenu(!showDropdownMenu)} - > + + selectMode && setShowDropdownMenu(!showDropdownMenu)}> {selectMode ? ( showDropdownMenu ? ( @@ -128,16 +122,16 @@ export const MembersSettingsScreen: FC - ) -} + ); +}; interface IMenuDropdown { - showDropdownMenu: boolean - setShowDropdownMenu: React.Dispatch> - selectedMembers: OT_Member[] - setIsNameEditMode: React.Dispatch> - setSelectedMembers: React.Dispatch> - setSelectMode: React.Dispatch> + showDropdownMenu: boolean; + setShowDropdownMenu: React.Dispatch>; + selectedMembers: OT_Member[]; + setIsNameEditMode: React.Dispatch>; + setSelectedMembers: React.Dispatch>; + setSelectMode: React.Dispatch>; } const MenuDropdown: React.FC = ({ @@ -146,19 +140,19 @@ const MenuDropdown: React.FC = ({ selectedMembers, setIsNameEditMode, setSelectMode, - setSelectedMembers, + setSelectedMembers }) => { - const [showRoleModal, setShowRoleModal] = useState(false) - const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false) + const [showRoleModal, setShowRoleModal] = useState(false); + const [showDeleteConfirmation, setShowDeleteConfirmation] = useState(false); - const { colors } = useAppTheme() + const { colors } = useAppTheme(); - const { removeMemberFromTeam } = useTeamMemberCard(selectedMembers[0]) + const { removeMemberFromTeam } = useTeamMemberCard(selectedMembers[0]); const reset = () => { - setSelectMode(false) - setSelectedMembers([]) - } + setSelectMode(false); + setSelectedMembers([]); + }; return showDropdownMenu ? ( <> @@ -166,27 +160,25 @@ const MenuDropdown: React.FC = ({ member={selectedMembers[0]} visible={showRoleModal} onDismiss={() => { - setShowRoleModal(false) - setTimeout(() => setShowDropdownMenu(false), 300) - reset() + setShowRoleModal(false); + setTimeout(() => setShowDropdownMenu(false), 300); + reset(); }} /> { - setShowDeleteConfirmation(false) - setTimeout(() => setShowDropdownMenu(false), 300) - reset() + setShowDeleteConfirmation(false); + setTimeout(() => setShowDropdownMenu(false), 300); + reset(); }} onConfirm={() => { - removeMemberFromTeam() - setShowDeleteConfirmation(false) - setShowDropdownMenu(false) - reset() + removeMemberFromTeam(); + setShowDeleteConfirmation(false); + setShowDropdownMenu(false); + reset(); }} - confirmationText={translate( - "settingScreen.membersSettingsScreen.deleteUserConfirmation", - )} + confirmationText={translate('settingScreen.membersSettingsScreen.deleteUserConfirmation')} /> {selectedMembers.length === 1 && ( = ({ styles.dropdownContainer, { ...GS.shadowLg, - backgroundColor: colors.background, - }, + backgroundColor: colors.background + } ]} > { - setShowRoleModal(true) + setShowRoleModal(true); }} > - {translate("settingScreen.membersSettingsScreen.changeRole")} + {translate('settingScreen.membersSettingsScreen.changeRole')} { - setIsNameEditMode(true) - setShowDropdownMenu(false) + setIsNameEditMode(true); + setShowDropdownMenu(false); }} > - - {translate("common.edit")} - + {translate('common.edit')} { - setShowDeleteConfirmation(true) + setShowDeleteConfirmation(true); }} > - - {translate("settingScreen.membersSettingsScreen.delete")} + + {translate('settingScreen.membersSettingsScreen.delete')} @@ -233,51 +223,51 @@ const MenuDropdown: React.FC = ({ ) : ( <> - ) -} + ); +}; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 5, + height: 5 }, shadowOpacity: 0.07, shadowRadius: 10, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ container: { - alignItems: "center", - flexDirection: "row", - justifyContent: "space-between", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%' }, dropdownContainer: { borderRadius: 14, - flexDirection: "column", + flexDirection: 'column', gap: 8, padding: 10, - position: "absolute", + position: 'absolute', right: 20, - shadowColor: "rgba(0, 0, 0, 0.52)", + shadowColor: 'rgba(0, 0, 0, 0.52)', top: 6, - width: 100, + width: 100 }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", - }, -}) + textAlign: 'center', + width: '80%' + } +}); diff --git a/apps/mobile/app/screens/Authenticated/ProfileScreen/index.tsx b/apps/mobile/app/screens/Authenticated/ProfileScreen/index.tsx index 2558eb1f7..7d44e1da0 100644 --- a/apps/mobile/app/screens/Authenticated/ProfileScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/ProfileScreen/index.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ import React, { FC, useState } from 'react'; -import { ViewStyle, LogBox } from 'react-native'; +import { ViewStyle, LogBox, StatusBar } from 'react-native'; import { AuthenticatedTabScreenProps } from '../../../navigators/AuthenticatedNavigator'; import { Screen } from '../../../components'; import HomeHeader from '../../../components/HomeHeader'; @@ -17,6 +17,7 @@ import NoTeam from '../../../components/NoTeam'; import CreateTeamModal from '../../../components/CreateTeamModal'; import { useOrganizationTeam } from '../../../services/hooks/useOrganization'; import { useProfileScreenLogic } from './logics/useProfileScreenLogic'; +import { useAppTheme } from '../../../theme'; export const AuthenticatedProfileScreen: FC> = function AuthenticatedProfileScreen(_props) { @@ -25,6 +26,8 @@ export const AuthenticatedProfileScreen: FC + + {profile.isLoading ? ( ) : ( diff --git a/apps/mobile/app/screens/Authenticated/SettingScreen/index.tsx b/apps/mobile/app/screens/Authenticated/SettingScreen/index.tsx index 405dc7a29..c24e67503 100644 --- a/apps/mobile/app/screens/Authenticated/SettingScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/SettingScreen/index.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ import React, { FC, useState } from 'react'; -import { View, ViewStyle, Dimensions, TouchableWithoutFeedback, LogBox } from 'react-native'; +import { View, ViewStyle, Dimensions, TouchableWithoutFeedback, LogBox, StatusBar } from 'react-native'; import Animated from 'react-native-reanimated'; import BottomSheet from 'reanimated-bottom-sheet'; import { BlurView } from 'expo-blur'; @@ -38,7 +38,7 @@ export type IPopup = export const AuthenticatedSettingScreen: FC> = function AuthenticatedDrawerScreen(_props) { LogBox.ignoreAllLogs(); - const { colors } = useAppTheme(); + const { colors, dark } = useAppTheme(); const { isLoading } = useSettings(); const { activeTeam } = useOrganizationTeam(); const route = useRoute>(); @@ -64,6 +64,7 @@ export const AuthenticatedSettingScreen: FC + {isOpen && ( > = +export const TaskLabelScreen: FC> = function AuthenticatedDrawerScreen(_props) { - const { colors, dark } = useAppTheme() - const { navigation } = _props - const { isLoading, labels, deleteLabel, updateLabel, createLabel } = useTaskLabels() - const [editMode, setEditMode] = useState(false) - const [itemToEdit, setItemToEdit] = useState(null) - const [isSheetOpen, setIsSheetOpen] = useState(false) + const { colors, dark } = useAppTheme(); + const { navigation } = _props; + const { isLoading, labels, deleteLabel, updateLabel, createLabel } = useTaskLabels(); + const [editMode, setEditMode] = useState(false); + const [itemToEdit, setItemToEdit] = useState(null); + const [isSheetOpen, setIsSheetOpen] = useState(false); // ref - const sheetRef = React.useRef(null) + const sheetRef = React.useRef(null); // variables // const snapPoints = useMemo(() => ["25%", "50%"], []) - const fall = new Animated.Value(1) + const fall = new Animated.Value(1); const openForEdit = (item: ITaskLabelItem) => { - setEditMode(true) - setIsSheetOpen(true) - setItemToEdit(item) - sheetRef.current.snapTo(0) - } + setEditMode(true); + setIsSheetOpen(true); + setItemToEdit(item); + sheetRef.current.snapTo(0); + }; return ( + - navigation.navigate("Setting")}> + navigation.navigate('Setting')}> - {translate("settingScreen.labelScreen.mainTitle")} + {translate('settingScreen.labelScreen.mainTitle')} - + - - {translate("settingScreen.labelScreen.listLabels")} - + {translate('settingScreen.labelScreen.listLabels')} - {isLoading ? ( - - ) : null} + {isLoading ? : null} {!isLoading && labels?.total === 0 ? ( - {translate("settingScreen.labelScreen.noActiveLabels")} + {translate('settingScreen.labelScreen.noActiveLabels')} ) : null} ( { - setEditMode(false) - setIsSheetOpen(true) - sheetRef.current.snapTo(0) + setEditMode(false); + setIsSheetOpen(true); + sheetRef.current.snapTo(0); }} > - - - {translate("settingScreen.labelScreen.createNewLabelText")} + + + {translate('settingScreen.labelScreen.createNewLabelText')} @@ -114,9 +111,9 @@ export const TaskLabelScreen: FC )} @@ -131,9 +128,9 @@ export const TaskLabelScreen: FC { - setEditMode(false) - setIsSheetOpen(false) - sheetRef.current.snapTo(1) + setEditMode(false); + setIsSheetOpen(false); + sheetRef.current.snapTo(1); }} onUpdateLabel={updateLabel} onCreateLabel={createLabel} @@ -142,66 +139,66 @@ export const TaskLabelScreen: FC - ) - } + ); + }; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 2, + height: 2 }, shadowOpacity: 0.07, shadowRadius: 1.0, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ btnText: { - color: "#3826A6", + color: '#3826A6', fontFamily: typography.primary.semiBold, fontSize: 18, - fontStyle: "normal", + fontStyle: 'normal' }, container: { - alignItems: "center", - flexDirection: "row", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + width: '100%' }, createButton: { - alignItems: "center", - alignSelf: "center", - borderColor: "#3826A6", + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', borderRadius: 12, borderWidth: 2, - flexDirection: "row", - justifyContent: "center", + flexDirection: 'row', + justifyContent: 'center', marginTop: 24, padding: 16, - width: "90%", + width: '90%' }, noStatusTxt: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, - fontSize: 16, + fontSize: 16 }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", + textAlign: 'center', + width: '80%' }, title2: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, fontSize: 16, - marginBottom: 8, - }, -}) + marginBottom: 8 + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskPrioritiesScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TaskPrioritiesScreen/index.tsx index 0270ad648..7643ee18a 100644 --- a/apps/mobile/app/screens/Authenticated/TaskPrioritiesScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskPrioritiesScreen/index.tsx @@ -1,85 +1,83 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, FlatList } from "react-native" -import { AntDesign, Ionicons } from "@expo/vector-icons" -import { Screen } from "../../../components" -import { AuthenticatedDrawerScreenProps } from "../../../navigators/AuthenticatedNavigator" -import { translate } from "../../../i18n" -import BottomSheet from "reanimated-bottom-sheet" -import { typography, useAppTheme } from "../../../theme" -import { ActivityIndicator } from "react-native-paper" -import Animated from "react-native-reanimated" -import { ITaskPriorityItem } from "../../../services/interfaces/ITaskPriority" -import TaskPriorityForm from "./components/TaskPriorityForm" -import { useTaskPriority } from "../../../services/hooks/features/useTaskPriority" -import PriorityItem from "./components/PriorityItem" -import { BlurView } from "expo-blur" +import React, { FC, useState } from 'react'; +import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, FlatList, StatusBar } from 'react-native'; +import { AntDesign, Ionicons } from '@expo/vector-icons'; +import { Screen } from '../../../components'; +import { AuthenticatedDrawerScreenProps } from '../../../navigators/AuthenticatedNavigator'; +import { translate } from '../../../i18n'; +import BottomSheet from 'reanimated-bottom-sheet'; +import { typography, useAppTheme } from '../../../theme'; +import { ActivityIndicator } from 'react-native-paper'; +import Animated from 'react-native-reanimated'; +import { ITaskPriorityItem } from '../../../services/interfaces/ITaskPriority'; +import TaskPriorityForm from './components/TaskPriorityForm'; +import { useTaskPriority } from '../../../services/hooks/features/useTaskPriority'; +import PriorityItem from './components/PriorityItem'; +import { BlurView } from 'expo-blur'; -export const TaskPriorityScreen: FC> = +export const TaskPriorityScreen: FC> = function AuthenticatedDrawerScreen(_props) { - const { colors, dark } = useAppTheme() - const { navigation } = _props - const { isLoading, priorities, deletePriority, updatePriority, createPriority } = - useTaskPriority() - const [editMode, setEditMode] = useState(false) - const [itemToEdit, setItemToEdit] = useState(null) - const [isSheetOpen, setIsSheetOpen] = useState(false) + const { colors, dark } = useAppTheme(); + const { navigation } = _props; + const { isLoading, priorities, deletePriority, updatePriority, createPriority } = useTaskPriority(); + const [editMode, setEditMode] = useState(false); + const [itemToEdit, setItemToEdit] = useState(null); + const [isSheetOpen, setIsSheetOpen] = useState(false); // ref - const sheetRef = React.useRef(null) + const sheetRef = React.useRef(null); // variables // const snapPoints = useMemo(() => ["25%", "50%"], []) - const fall = new Animated.Value(1) + const fall = new Animated.Value(1); const openForEdit = (item: ITaskPriorityItem) => { - setEditMode(true) - setIsSheetOpen(true) - setItemToEdit(item) - sheetRef.current.snapTo(0) - } + setEditMode(true); + setIsSheetOpen(true); + setItemToEdit(item); + sheetRef.current.snapTo(0); + }; return ( + - navigation.navigate("Setting")}> + navigation.navigate('Setting')}> - {translate("settingScreen.priorityScreen.mainTitle")} + {translate('settingScreen.priorityScreen.mainTitle')} - + - {translate("settingScreen.priorityScreen.listPriorities")} + {translate('settingScreen.priorityScreen.listPriorities')} - {isLoading ? ( - - ) : null} + {isLoading ? : null} {!isLoading && priorities?.total === 0 ? ( - {translate("settingScreen.priorityScreen.noActivePriorities")} + {translate('settingScreen.priorityScreen.noActivePriorities')} ) : null} ( { - setEditMode(false) - setIsSheetOpen(true) - sheetRef.current.snapTo(0) + setEditMode(false); + setIsSheetOpen(true); + sheetRef.current.snapTo(0); }} > - - - {translate("settingScreen.priorityScreen.createNewPriorityText")} + + + {translate('settingScreen.priorityScreen.createNewPriorityText')} @@ -115,9 +113,9 @@ export const TaskPriorityScreen: FC )} @@ -132,9 +130,9 @@ export const TaskPriorityScreen: FC { - setEditMode(false) - setIsSheetOpen(false) - sheetRef.current.snapTo(1) + setEditMode(false); + setIsSheetOpen(false); + sheetRef.current.snapTo(1); }} onUpdatePriority={updatePriority} onCreatePriority={createPriority} @@ -143,66 +141,66 @@ export const TaskPriorityScreen: FC - ) - } + ); + }; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 2, + height: 2 }, shadowOpacity: 0.07, shadowRadius: 1.0, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ btnText: { - color: "#3826A6", + color: '#3826A6', fontFamily: typography.primary.semiBold, fontSize: 18, - fontStyle: "normal", + fontStyle: 'normal' }, container: { - alignItems: "center", - flexDirection: "row", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + width: '100%' }, createButton: { - alignItems: "center", - alignSelf: "center", - borderColor: "#3826A6", + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', borderRadius: 12, borderWidth: 2, - flexDirection: "row", - justifyContent: "center", + flexDirection: 'row', + justifyContent: 'center', marginTop: 24, padding: 16, - width: "90%", + width: '90%' }, noStatusTxt: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, - fontSize: 16, + fontSize: 16 }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", + textAlign: 'center', + width: '80%' }, title2: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, fontSize: 16, - marginBottom: 8, - }, -}) + marginBottom: 8 + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TaskScreen/index.tsx index c40156229..103c14a94 100644 --- a/apps/mobile/app/screens/Authenticated/TaskScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskScreen/index.tsx @@ -1,55 +1,51 @@ /* eslint-disable react-native/no-inline-styles */ -import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, ScrollView } from "react-native" -import React, { FC, useEffect } from "react" -import { AuthenticatedDrawerScreenProps } from "../../../navigators/AuthenticatedNavigator" -import { Screen } from "../../../components" -import { typography, useAppTheme } from "../../../theme" -import { AntDesign } from "@expo/vector-icons" -import { useTeamTasks } from "../../../services/hooks/features/useTeamTasks" -import TaskTitleBlock from "../../../components/Task/TitleBlock" -import DetailsBlock from "../../../components/Task/DetailsBlock" -import { translate } from "../../../i18n" -import EstimateBlock from "../../../components/Task/EstimateBlock" -import TimeBlock from "../../../components/Task/TimeBlock" -import LinkedIssuesBlock from "../../../components/Task/LinkedIssuesBlock" -import DescriptionBlock from "../../../components/Task/DescrptionBlock" +import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, ScrollView, StatusBar } from 'react-native'; +import React, { FC, useEffect } from 'react'; +import { AuthenticatedDrawerScreenProps } from '../../../navigators/AuthenticatedNavigator'; +import { Screen } from '../../../components'; +import { typography, useAppTheme } from '../../../theme'; +import { AntDesign } from '@expo/vector-icons'; +import { useTeamTasks } from '../../../services/hooks/features/useTeamTasks'; +import TaskTitleBlock from '../../../components/Task/TitleBlock'; +import DetailsBlock from '../../../components/Task/DetailsBlock'; +import { translate } from '../../../i18n'; +import EstimateBlock from '../../../components/Task/EstimateBlock'; +import TimeBlock from '../../../components/Task/TimeBlock'; +import LinkedIssuesBlock from '../../../components/Task/LinkedIssuesBlock'; +import DescriptionBlock from '../../../components/Task/DescrptionBlock'; -export const AuthenticatedTaskScreen: FC> = ( - _props, -) => { - const { colors } = useAppTheme() - const { navigation, route } = _props - const { taskId } = route.params - const { getTaskById, detailedTask: task } = useTeamTasks() +export const AuthenticatedTaskScreen: FC> = (_props) => { + const { colors, dark } = useAppTheme(); + const { navigation, route } = _props; + const { taskId } = route.params; + const { getTaskById, detailedTask: task } = useTeamTasks(); useEffect(() => { if (route.params.taskId) { - getTaskById(taskId) + getTaskById(taskId); } - }, [getTaskById, route, task, route.params.taskId]) + }, [getTaskById, route, task, route.params.taskId]); return ( - + + - navigation.navigate("AuthenticatedTab")}> + navigation.navigate('AuthenticatedTab')}> - {translate("taskDetailsScreen.taskScreen")} + {translate('taskDetailsScreen.taskScreen')} - ) -} + ); +}; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 2, + height: 2 }, shadowOpacity: 0.07, shadowRadius: 1.0, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ container: { - alignItems: "center", - flexDirection: "row", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + width: '100%' }, screenContentWrapper: { - alignItems: "center", + alignItems: 'center', flex: 4, gap: 12, paddingBottom: 20, - width: "100%", + width: '100%' }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", - }, -}) + textAlign: 'center', + width: '80%' + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskSizeScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TaskSizeScreen/index.tsx index 61075069f..5a7cf8f07 100644 --- a/apps/mobile/app/screens/Authenticated/TaskSizeScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskSizeScreen/index.tsx @@ -1,210 +1,205 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, FlatList } from "react-native" -import { AntDesign, Ionicons } from "@expo/vector-icons" -import { Screen } from "../../../components" -import { AuthenticatedDrawerScreenProps } from "../../../navigators/AuthenticatedNavigator" -import { translate } from "../../../i18n" -import BottomSheet from "reanimated-bottom-sheet" -import { typography, useAppTheme } from "../../../theme" -import { ActivityIndicator } from "react-native-paper" -import Animated from "react-native-reanimated" -import { ITaskStatusItem } from "../../../services/interfaces/ITaskStatus" -import TaskSizeForm from "./components/TaskSizeForm" -import SizeItem from "./components/SizeItem" -import { useTaskSizes } from "../../../services/hooks/features/useTaskSizes" -import { BlurView } from "expo-blur" +import React, { FC, useState } from 'react'; +import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, FlatList, StatusBar } from 'react-native'; +import { AntDesign, Ionicons } from '@expo/vector-icons'; +import { Screen } from '../../../components'; +import { AuthenticatedDrawerScreenProps } from '../../../navigators/AuthenticatedNavigator'; +import { translate } from '../../../i18n'; +import BottomSheet from 'reanimated-bottom-sheet'; +import { typography, useAppTheme } from '../../../theme'; +import { ActivityIndicator } from 'react-native-paper'; +import Animated from 'react-native-reanimated'; +import { ITaskStatusItem } from '../../../services/interfaces/ITaskStatus'; +import TaskSizeForm from './components/TaskSizeForm'; +import SizeItem from './components/SizeItem'; +import { useTaskSizes } from '../../../services/hooks/features/useTaskSizes'; +import { BlurView } from 'expo-blur'; -export const TaskSizeScreen: FC> = - function AuthenticatedDrawerScreen(_props) { - const { colors, dark } = useAppTheme() - const { navigation } = _props - const { isLoading, sizes, deleteSize, updateSize, createSize } = useTaskSizes() - const [editMode, setEditMode] = useState(false) - const [itemToEdit, setItemToEdit] = useState(null) - const [isSheetOpen, setIsSheetOpen] = useState(false) - // ref - const sheetRef = React.useRef(null) +export const TaskSizeScreen: FC> = function AuthenticatedDrawerScreen( + _props +) { + const { colors, dark } = useAppTheme(); + const { navigation } = _props; + const { isLoading, sizes, deleteSize, updateSize, createSize } = useTaskSizes(); + const [editMode, setEditMode] = useState(false); + const [itemToEdit, setItemToEdit] = useState(null); + const [isSheetOpen, setIsSheetOpen] = useState(false); + // ref + const sheetRef = React.useRef(null); - // variables - // const snapPoints = useMemo(() => ["25%", "50%"], []) - const fall = new Animated.Value(1) + // variables + // const snapPoints = useMemo(() => ["25%", "50%"], []) + const fall = new Animated.Value(1); - // console.log(fall) + // console.log(fall) - const openForEdit = (item: ITaskStatusItem) => { - setEditMode(true) - setIsSheetOpen(true) - setItemToEdit(item) - sheetRef.current.snapTo(0) - } + const openForEdit = (item: ITaskStatusItem) => { + setEditMode(true); + setIsSheetOpen(true); + setItemToEdit(item); + sheetRef.current.snapTo(0); + }; - return ( - - - - - navigation.navigate("Setting")}> - - - - {translate("settingScreen.sizeScreen.mainTitle")} - - + return ( + + + + + + navigation.navigate('Setting')}> + + + + {translate('settingScreen.sizeScreen.mainTitle')} + - - - - {translate("settingScreen.sizeScreen.listSizes")} - - - - {isLoading ? ( - - ) : null} - {!isLoading && sizes?.total === 0 ? ( - - {translate("settingScreen.sizeScreen.noActiveSizes")} - - ) : null} - - ( - openForEdit(item)} - onDeleteSize={() => deleteSize(item.id)} - size={item} - /> - )} - keyExtractor={(_, index) => index.toString()} - ListFooterComponent={() => } - /> - + + + + {translate('settingScreen.sizeScreen.listSizes')} - { - setEditMode(false) - setIsSheetOpen(true) - sheetRef.current.snapTo(0) + minHeight: 200, + justifyContent: 'center', + alignItems: 'center' }} > - - - {translate("settingScreen.sizeScreen.createSizeButton")} - - - - {isSheetOpen && ( - : null} + {!isLoading && sizes?.total === 0 ? ( + + {translate('settingScreen.sizeScreen.noActiveSizes')} + + ) : null} + + ( + openForEdit(item)} + onDeleteSize={() => deleteSize(item.id)} + size={item} + /> + )} + keyExtractor={(_, index) => index.toString()} + ListFooterComponent={() => } + /> + + + { + setEditMode(false); + setIsSheetOpen(true); + sheetRef.current.snapTo(0); + }} + > + + + {translate('settingScreen.sizeScreen.createSizeButton')} + + + + {isSheetOpen && ( + + )} + ( + { + setEditMode(false); + setIsSheetOpen(false); + sheetRef.current.snapTo(1); }} + onUpdateSize={updateSize} + onCreateSize={createSize} + isEdit={editMode} /> )} - ( - { - setEditMode(false) - setIsSheetOpen(false) - sheetRef.current.snapTo(1) - }} - onUpdateSize={updateSize} - onCreateSize={createSize} - isEdit={editMode} - /> - )} - /> - - ) - } + /> + + ); +}; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 2, + height: 2 }, shadowOpacity: 0.07, shadowRadius: 1.0, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ btnText: { - color: "#3826A6", + color: '#3826A6', fontFamily: typography.primary.semiBold, fontSize: 18, - fontStyle: "normal", + fontStyle: 'normal' }, container: { - alignItems: "center", - flexDirection: "row", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + width: '100%' }, createButton: { - alignItems: "center", - alignSelf: "center", - borderColor: "#3826A6", + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', borderRadius: 12, borderWidth: 2, - flexDirection: "row", - justifyContent: "center", + flexDirection: 'row', + justifyContent: 'center', marginTop: 24, padding: 16, - width: "90%", + width: '90%' }, noStatusTxt: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, - fontSize: 16, + fontSize: 16 }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", + textAlign: 'center', + width: '80%' }, title2: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, fontSize: 16, - marginBottom: 8, - }, -}) + marginBottom: 8 + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskStatusScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TaskStatusScreen/index.tsx index 33af4bb84..2d6dacab5 100644 --- a/apps/mobile/app/screens/Authenticated/TaskStatusScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskStatusScreen/index.tsx @@ -1,207 +1,202 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useState } from "react" -import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, FlatList } from "react-native" -import { AntDesign, Ionicons } from "@expo/vector-icons" -import { Screen } from "../../../components" -import { AuthenticatedDrawerScreenProps } from "../../../navigators/AuthenticatedNavigator" -import { translate } from "../../../i18n" -import BottomSheet from "reanimated-bottom-sheet" -import { typography, useAppTheme } from "../../../theme" -import StatusItem from "./components/StatusItem" -import { ActivityIndicator } from "react-native-paper" -import { useTaskStatus } from "../../../services/hooks/features/useTaskStatus" -import Animated from "react-native-reanimated" -import { ITaskStatusItem } from "../../../services/interfaces/ITaskStatus" -import TaskStatusForm from "./components/TaskStatusForm" -import { BlurView } from "expo-blur" +import React, { FC, useState } from 'react'; +import { View, Text, ViewStyle, TouchableOpacity, StyleSheet, FlatList, StatusBar } from 'react-native'; +import { AntDesign, Ionicons } from '@expo/vector-icons'; +import { Screen } from '../../../components'; +import { AuthenticatedDrawerScreenProps } from '../../../navigators/AuthenticatedNavigator'; +import { translate } from '../../../i18n'; +import BottomSheet from 'reanimated-bottom-sheet'; +import { typography, useAppTheme } from '../../../theme'; +import StatusItem from './components/StatusItem'; +import { ActivityIndicator } from 'react-native-paper'; +import { useTaskStatus } from '../../../services/hooks/features/useTaskStatus'; +import Animated from 'react-native-reanimated'; +import { ITaskStatusItem } from '../../../services/interfaces/ITaskStatus'; +import TaskStatusForm from './components/TaskStatusForm'; +import { BlurView } from 'expo-blur'; -export const TaskStatusScreen: FC> = - function AuthenticatedDrawerScreen(_props) { - const { colors, dark } = useAppTheme() - const { navigation } = _props - const { isLoading, statuses, deleteStatus, updateStatus, createStatus } = useTaskStatus() - const [editMode, setEditMode] = useState(false) - const [itemToEdit, setItemToEdit] = useState(null) - const [isSheetOpen, setIsSheetOpen] = useState(false) - // ref - const sheetRef = React.useRef(null) +export const TaskStatusScreen: FC> = function AuthenticatedDrawerScreen( + _props +) { + const { colors, dark } = useAppTheme(); + const { navigation } = _props; + const { isLoading, statuses, deleteStatus, updateStatus, createStatus } = useTaskStatus(); + const [editMode, setEditMode] = useState(false); + const [itemToEdit, setItemToEdit] = useState(null); + const [isSheetOpen, setIsSheetOpen] = useState(false); + // ref + const sheetRef = React.useRef(null); - // variables - const fall = new Animated.Value(1) - const openForEdit = (item: ITaskStatusItem) => { - setEditMode(true) - setIsSheetOpen(true) - setItemToEdit(item) - sheetRef.current.snapTo(0) - } - // console.log("in-progress-again".replaceAll("-", " ")) + // variables + const fall = new Animated.Value(1); + const openForEdit = (item: ITaskStatusItem) => { + setEditMode(true); + setIsSheetOpen(true); + setItemToEdit(item); + sheetRef.current.snapTo(0); + }; + // console.log("in-progress-again".replaceAll("-", " ")) - return ( - - - - - navigation.navigate("Setting")}> - - - - {translate("settingScreen.statusScreen.mainTitle")} - - + return ( + + + + + + navigation.navigate('Setting')}> + + + + {translate('settingScreen.statusScreen.mainTitle')} + - - - - {translate("settingScreen.statusScreen.listStatuses")} - - - - {isLoading ? ( - - ) : null} - {!isLoading && statuses?.total === 0 ? ( - - {translate("settingScreen.statusScreen.noActiveStatuses")} - - ) : null} - - ( - openForEdit(item)} - onDeleteTask={() => deleteStatus(item.id)} - status={item} - /> - )} - keyExtractor={(_, index) => index.toString()} - ListFooterComponent={() => } - /> - + + + + {translate('settingScreen.statusScreen.listStatuses')} - { - setEditMode(false) - setIsSheetOpen(true) - sheetRef.current.snapTo(0) + minHeight: 200, + justifyContent: 'center', + alignItems: 'center' }} > - - - {translate("settingScreen.statusScreen.createStatusButton")} - - - - {isSheetOpen && ( - : null} + {!isLoading && statuses?.total === 0 ? ( + + {translate('settingScreen.statusScreen.noActiveStatuses')} + + ) : null} + + ( + openForEdit(item)} + onDeleteTask={() => deleteStatus(item.id)} + status={item} + /> + )} + keyExtractor={(_, index) => index.toString()} + ListFooterComponent={() => } + /> + + + { + setEditMode(false); + setIsSheetOpen(true); + sheetRef.current.snapTo(0); + }} + > + + + {translate('settingScreen.statusScreen.createStatusButton')} + + + + {isSheetOpen && ( + + )} + ( + { + setEditMode(false); + setIsSheetOpen(false); + sheetRef.current.snapTo(1); }} + onUpdateStatus={updateStatus} + onCreateStatus={createStatus} + isEdit={editMode} /> )} - ( - { - setEditMode(false) - setIsSheetOpen(false) - sheetRef.current.snapTo(1) - }} - onUpdateStatus={updateStatus} - onCreateStatus={createStatus} - isEdit={editMode} - /> - )} - /> - - ) - } + /> + + ); +}; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 2, + height: 2 }, shadowOpacity: 0.07, shadowRadius: 1.0, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ btnText: { - color: "#3826A6", + color: '#3826A6', fontFamily: typography.primary.semiBold, fontSize: 18, - fontStyle: "normal", + fontStyle: 'normal' }, container: { - alignItems: "center", - flexDirection: "row", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + width: '100%' }, createButton: { - alignItems: "center", - alignSelf: "center", - borderColor: "#3826A6", + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', borderRadius: 12, borderWidth: 2, - flexDirection: "row", - justifyContent: "center", + flexDirection: 'row', + justifyContent: 'center', marginTop: 24, padding: 16, - width: "90%", + width: '90%' }, noStatusTxt: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, - fontSize: 16, + fontSize: 16 }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", + textAlign: 'center', + width: '80%' }, title2: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, fontSize: 16, - marginBottom: 8, - }, -}) + marginBottom: 8 + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TaskVersionScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TaskVersionScreen/index.tsx index c72f909b6..f19f654e6 100644 --- a/apps/mobile/app/screens/Authenticated/TaskVersionScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TaskVersionScreen/index.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { FC, useRef, useState } from "react" +import React, { FC, useRef, useState } from 'react'; import { View, Text, @@ -9,208 +9,203 @@ import { StyleSheet, ActivityIndicator, FlatList, -} from "react-native" -import { AntDesign, Ionicons } from "@expo/vector-icons" -import { Screen } from "../../../components" -import { AuthenticatedDrawerScreenProps } from "../../../navigators/AuthenticatedNavigator" -import { translate } from "../../../i18n" -import { typography, useAppTheme } from "../../../theme" -import BottomSheet from "reanimated-bottom-sheet" -import Animated from "react-native-reanimated" -import { useTaskVersion } from "../../../services/hooks/features/useTaskVersion" -import { ITaskVersionItemList } from "../../../services/interfaces/ITaskVersion" -import { BlurView } from "expo-blur" -import VersionItem from "./components/VersionItem" -import TaskVersionForm from "./components/TaskVersionForm" + StatusBar +} from 'react-native'; +import { AntDesign, Ionicons } from '@expo/vector-icons'; +import { Screen } from '../../../components'; +import { AuthenticatedDrawerScreenProps } from '../../../navigators/AuthenticatedNavigator'; +import { translate } from '../../../i18n'; +import { typography, useAppTheme } from '../../../theme'; +import BottomSheet from 'reanimated-bottom-sheet'; +import Animated from 'react-native-reanimated'; +import { useTaskVersion } from '../../../services/hooks/features/useTaskVersion'; +import { ITaskVersionItemList } from '../../../services/interfaces/ITaskVersion'; +import { BlurView } from 'expo-blur'; +import VersionItem from './components/VersionItem'; +import TaskVersionForm from './components/TaskVersionForm'; -export const TaskVersionScreen: FC> = - function AuthenticatedDrawerScreen(_props) { - const { colors, dark } = useAppTheme() - const { navigation } = _props +export const TaskVersionScreen: FC> = function AuthenticatedDrawerScreen( + _props +) { + const { colors, dark } = useAppTheme(); + const { navigation } = _props; - const { isLoading, versions, deleteTaskVersion, updateTaskVersion, createTaskVersion } = - useTaskVersion() + const { isLoading, versions, deleteTaskVersion, updateTaskVersion, createTaskVersion } = useTaskVersion(); - const [editMode, setEditMode] = useState(false) - const [itemToEdit, setItemToEdit] = useState(null) - const [isSheetOpen, setIsSheetOpen] = useState(false) + const [editMode, setEditMode] = useState(false); + const [itemToEdit, setItemToEdit] = useState(null); + const [isSheetOpen, setIsSheetOpen] = useState(false); - const sheetRef = useRef(null) + const sheetRef = useRef(null); - const fall = new Animated.Value(1) - const openForEdit = (item: ITaskVersionItemList) => { - setEditMode(true) - setIsSheetOpen(true) - setItemToEdit(item) - sheetRef.current.snapTo(0) - } + const fall = new Animated.Value(1); + const openForEdit = (item: ITaskVersionItemList) => { + setEditMode(true); + setIsSheetOpen(true); + setItemToEdit(item); + sheetRef.current.snapTo(0); + }; - return ( - - - - - navigation.navigate("Setting")}> - - - - {translate("settingScreen.versionScreen.mainTitle")} - - + return ( + + + + + + navigation.navigate('Setting')}> + + + + {translate('settingScreen.versionScreen.mainTitle')} + + - - - - {translate("settingScreen.versionScreen.listOfVersions")} - - - - {isLoading ? ( - - ) : null} - {!isLoading && versions?.total === 0 ? ( - - {translate("settingScreen.versionScreen.noActiveVersions")} - - ) : null} - - ( - openForEdit(item)} - onDeleteTask={() => deleteTaskVersion(item.id)} - version={item} - /> - )} - keyExtractor={(_, index) => index.toString()} - ListFooterComponent={() => } - /> - + + + {translate('settingScreen.versionScreen.listOfVersions')} - { - setEditMode(false) - setIsSheetOpen(true) - sheetRef.current.snapTo(0) + minHeight: 200, + justifyContent: 'center', + alignItems: 'center' }} > - - - {translate("settingScreen.versionScreen.createNewVersionButton")} - - - - {isSheetOpen && ( - : null} + {!isLoading && versions?.total === 0 ? ( + + {translate('settingScreen.versionScreen.noActiveVersions')} + + ) : null} + + ( + openForEdit(item)} + onDeleteTask={() => deleteTaskVersion(item.id)} + version={item} + /> + )} + keyExtractor={(_, index) => index.toString()} + ListFooterComponent={() => } + /> + + + { + setEditMode(false); + setIsSheetOpen(true); + sheetRef.current.snapTo(0); + }} + > + + + {translate('settingScreen.versionScreen.createNewVersionButton')} + + + + {isSheetOpen && ( + + )} + ( + { + setEditMode(false); + setIsSheetOpen(false); + sheetRef.current.snapTo(1); }} + onUpdateVersion={updateTaskVersion} + onCreateVersion={createTaskVersion} + isEdit={editMode} /> )} - ( - { - setEditMode(false) - setIsSheetOpen(false) - sheetRef.current.snapTo(1) - }} - onUpdateVersion={updateTaskVersion} - onCreateVersion={createTaskVersion} - isEdit={editMode} - /> - )} - /> - - ) - } + /> + + ); +}; const $container: ViewStyle = { - flex: 1, -} + flex: 1 +}; const $headerContainer: ViewStyle = { padding: 20, paddingVertical: 16, - shadowColor: "rgba(0, 0, 0, 0.6)", + shadowColor: 'rgba(0, 0, 0, 0.6)', shadowOffset: { width: 0, - height: 2, + height: 2 }, shadowOpacity: 0.07, shadowRadius: 1.0, elevation: 1, - zIndex: 10, -} + zIndex: 10 +}; const styles = StyleSheet.create({ btnText: { - color: "#3826A6", + color: '#3826A6', fontFamily: typography.primary.semiBold, fontSize: 18, - fontStyle: "normal", + fontStyle: 'normal' }, container: { - alignItems: "center", - flexDirection: "row", - width: "100%", + alignItems: 'center', + flexDirection: 'row', + width: '100%' }, createButton: { - alignItems: "center", - alignSelf: "center", - borderColor: "#3826A6", + alignItems: 'center', + alignSelf: 'center', + borderColor: '#3826A6', borderRadius: 12, borderWidth: 2, - flexDirection: "row", - justifyContent: "center", + flexDirection: 'row', + justifyContent: 'center', marginTop: 24, padding: 16, - width: "90%", + width: '90%' }, noVersionTxt: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, - fontSize: 16, + fontSize: 16 }, title: { - alignSelf: "center", + alignSelf: 'center', fontFamily: typography.primary.semiBold, fontSize: 16, - textAlign: "center", - width: "80%", + textAlign: 'center', + width: '80%' }, title2: { - color: "#7E7991", + color: '#7E7991', fontFamily: typography.primary.semiBold, fontSize: 16, - marginBottom: 8, - }, -}) + marginBottom: 8 + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx index 55d533f55..5ae74c70f 100644 --- a/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TeamScreen/index.tsx @@ -89,7 +89,7 @@ export const AuthenticatedTeamScreen: FC> = StatusBarProps={{ backgroundColor: 'black' }} safeAreaEdges={['top']} > - + {isLoading ? ( ) : ( diff --git a/apps/mobile/app/screens/Authenticated/TimerScreen/index.tsx b/apps/mobile/app/screens/Authenticated/TimerScreen/index.tsx index affe29b0d..514fc56d0 100644 --- a/apps/mobile/app/screens/Authenticated/TimerScreen/index.tsx +++ b/apps/mobile/app/screens/Authenticated/TimerScreen/index.tsx @@ -1,6 +1,6 @@ /* eslint-disable react-native/no-inline-styles */ import React, { FC, useCallback, useEffect, useState } from 'react'; -import { ViewStyle, View, LogBox, TouchableWithoutFeedback } from 'react-native'; +import { ViewStyle, View, LogBox, TouchableWithoutFeedback, StatusBar } from 'react-native'; // COMPONENTS import { Screen } from '../../../components'; @@ -48,6 +48,7 @@ export const AuthenticatedTimerScreen: FC> backgroundColor={dark ? 'rgb(16,17,20)' : colors.background} safeAreaEdges={['top']} > + onClickOutside()}> {isLoading ? ( From cb431fea00a3901d6be9d0d693c310fef45f1078 Mon Sep 17 00:00:00 2001 From: desperado1802 Date: Fri, 17 Nov 2023 18:50:56 +0200 Subject: [PATCH 7/9] scroll buttons no longer navigate to task screen --- .../TeamScreen/components/ListCardItem.tsx | 457 ++++++++---------- .../TeamScreen/components/TaskInfo.tsx | 6 +- 2 files changed, 206 insertions(+), 257 deletions(-) diff --git a/apps/mobile/app/screens/Authenticated/TeamScreen/components/ListCardItem.tsx b/apps/mobile/app/screens/Authenticated/TeamScreen/components/ListCardItem.tsx index 5f699e59b..fd11307d5 100644 --- a/apps/mobile/app/screens/Authenticated/TeamScreen/components/ListCardItem.tsx +++ b/apps/mobile/app/screens/Authenticated/TeamScreen/components/ListCardItem.tsx @@ -1,178 +1,155 @@ /* eslint-disable camelcase */ /* eslint-disable react-native/no-color-literals */ /* eslint-disable react-native/no-inline-styles */ -import React, { useState } from "react" -import { - View, - ViewStyle, - TouchableOpacity, - StyleSheet, - TouchableWithoutFeedback, -} from "react-native" -import { Ionicons, Entypo } from "@expo/vector-icons" +import React, { useState } from 'react'; +import { View, ViewStyle, TouchableOpacity, StyleSheet, TouchableWithoutFeedback } from 'react-native'; +import { Ionicons, Entypo } from '@expo/vector-icons'; // COMPONENTS -import { Card, ListItem } from "../../../../components" +import { Card, ListItem } from '../../../../components'; // STYLES -import { GLOBAL_STYLE as GS } from "../../../../../assets/ts/styles" -import { spacing, typography, useAppTheme } from "../../../../theme" -import EstimateTime from "../../TimerScreen/components/EstimateTime" -import AllTaskStatuses from "../../../../components/AllTaskStatuses" -import { - IOrganizationTeamWithMStatus, - OT_Member, -} from "../../../../services/interfaces/IOrganizationTeam" +import { GLOBAL_STYLE as GS } from '../../../../../assets/ts/styles'; +import { spacing, typography, useAppTheme } from '../../../../theme'; +import EstimateTime from '../../TimerScreen/components/EstimateTime'; +import AllTaskStatuses from '../../../../components/AllTaskStatuses'; +import { IOrganizationTeamWithMStatus, OT_Member } from '../../../../services/interfaces/IOrganizationTeam'; import { I_TeamMemberCardHook, I_TMCardTaskEditHook, useTeamMemberCard, - useTMCardTaskEdit, -} from "../../../../services/hooks/features/useTeamMemberCard" -import UserHeaderCard from "./UserHeaderCard" -import TaskInfo from "./TaskInfo" -import { observer } from "mobx-react-lite" -import { TodayWorkedTime } from "./TodayWorkTime" -import { TimeProgressBar } from "./TimeProgressBar" -import { useNavigation } from "@react-navigation/native" -import { WorkedOnTask } from "./WorkedOnTask" -import UnassignedTasksList from "./UnassignedTaskList" -import { translate } from "../../../../i18n" -import { useTimer } from "../../../../services/hooks/useTimer" -import { SettingScreenNavigationProp } from "../../../../navigators/AuthenticatedNavigator" -import { getTimerStatusValue } from "../../../../helpers/get-timer-status" + useTMCardTaskEdit +} from '../../../../services/hooks/features/useTeamMemberCard'; +import UserHeaderCard from './UserHeaderCard'; +import TaskInfo from './TaskInfo'; +import { observer } from 'mobx-react-lite'; +import { TodayWorkedTime } from './TodayWorkTime'; +import { TimeProgressBar } from './TimeProgressBar'; +import { useNavigation } from '@react-navigation/native'; +import { WorkedOnTask } from './WorkedOnTask'; +import UnassignedTasksList from './UnassignedTaskList'; +import { translate } from '../../../../i18n'; +import { useTimer } from '../../../../services/hooks/useTimer'; +import { SettingScreenNavigationProp } from '../../../../navigators/AuthenticatedNavigator'; +import { getTimerStatusValue } from '../../../../helpers/get-timer-status'; export type ListItemProps = { - member: OT_Member -} + member: OT_Member; +}; interface IcontentProps { - memberInfo: I_TeamMemberCardHook - taskEdition: I_TMCardTaskEditHook - onPressIn?: (isTaskScreen?: boolean) => void + memberInfo: I_TeamMemberCardHook; + taskEdition: I_TMCardTaskEditHook; + onPressIn?: (isTaskScreen?: boolean) => void; } export interface Props extends ListItemProps { - index: number - openMenuIndex: number | null - setOpenMenuIndex: React.Dispatch> - currentTeam: IOrganizationTeamWithMStatus | null - canNavigate: boolean + index: number; + openMenuIndex: number | null; + setOpenMenuIndex: React.Dispatch>; + currentTeam: IOrganizationTeamWithMStatus | null; + canNavigate: boolean; } -export const ListItemContent: React.FC = observer( - ({ memberInfo, taskEdition, onPressIn }) => { - // HOOKS - const { colors, dark } = useAppTheme() - return ( - - - onPressIn()}> - - - - +export const ListItemContent: React.FC = observer(({ memberInfo, taskEdition, onPressIn }) => { + // HOOKS + const { colors, dark } = useAppTheme(); + return ( + + + onPressIn()}> + + + + + + onPressIn(true)} + /> + taskEdition.editMode && taskEdition.setEditMode(false)}> + {memberInfo.memberTask ? : null} + + + onPressIn(true)} + style={{ + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + height: 48, + width: '100%' + }} > - - {memberInfo.memberTask ? ( - - ) : null} - - - - - - + + + - - - + + + - {memberInfo.memberTask && taskEdition.estimateEditMode ? ( - - - - ) : ( - taskEdition.setEstimateEditMode(true)} + {memberInfo.memberTask && taskEdition.estimateEditMode ? ( + + - )} - + + ) : ( + taskEdition.setEstimateEditMode(true)} + /> + )} - - ) - }, -) + + + ); +}); const ListCardItem: React.FC = observer((props) => { - const { colors } = useAppTheme() + const { colors } = useAppTheme(); // // STATS - const memberInfo = useTeamMemberCard(props.member) - const taskEdition = useTMCardTaskEdit(memberInfo.memberTask) - const { timerStatus } = useTimer() - const [showUnassignedList, setShowUnassignedList] = useState(false) + const memberInfo = useTeamMemberCard(props.member); + const taskEdition = useTMCardTaskEdit(memberInfo.memberTask); + const { timerStatus } = useTimer(); + const [showUnassignedList, setShowUnassignedList] = useState(false); - const navigation = useNavigation>() + const navigation = useNavigation>(); const onPressIn = (isTaskScreen?: boolean) => { - taskEdition.setEditMode(false) - taskEdition.setEstimateEditMode(false) - props.setOpenMenuIndex(null) + taskEdition.setEditMode(false); + taskEdition.setEstimateEditMode(false); + props.setOpenMenuIndex(null); if (props.canNavigate) { isTaskScreen - ? memberInfo.memberTask && - navigation.navigate("TaskScreen", { taskId: memberInfo.memberTask?.id }) - : navigation.navigate("Profile", { + ? memberInfo.memberTask && navigation.navigate('TaskScreen', { taskId: memberInfo.memberTask?.id }) + : navigation.navigate('Profile', { userId: memberInfo.memberUser.id, - activeTab: "worked", - }) + activeTab: 'worked' + }); } - } - const currentMember = props.currentTeam?.members.find( - (currentMember) => currentMember.id === props.member.id, - ) + }; + const currentMember = props.currentTeam?.members.find((currentMember) => currentMember.id === props.member.id); - const timerStatusValue = getTimerStatusValue( - timerStatus, - currentMember, - props.currentTeam?.public, - ) + const timerStatusValue = getTimerStatusValue(timerStatus, currentMember, props.currentTeam?.public); return ( = observer((props) => { ...GS.mt5, paddingTop: 4, backgroundColor: - timerStatusValue === "idle" - ? "#F1A2A2" - : timerStatusValue === "pause" - ? "#EBC386" - : timerStatusValue === "online" - ? "#88D1A5" - : "#DCD6D6", + timerStatusValue === 'idle' + ? '#F1A2A2' + : timerStatusValue === 'pause' + ? '#EBC386' + : timerStatusValue === 'online' + ? '#88D1A5' + : '#DCD6D6' }} HeadingComponent={ = observer((props) => { ...GS.r0, ...GS.pt5, ...GS.pr3, - ...GS.zIndexFront, + ...GS.zIndexFront }} > = observer((props) => { ...GS.r0, ...GS.zIndexFront, ...GS.shadowLg, - shadowColor: "rgba(0, 0, 0, 0.52)", + shadowColor: 'rgba(0, 0, 0, 0.52)', borderRadius: 14, width: 172, marginTop: -5, marginRight: 17, backgroundColor: colors.background, minWidth: spacing.huge * 2, - ...(props.index !== props.openMenuIndex ? { display: "none" } : {}), + ...(props.index !== props.openMenuIndex ? { display: 'none' } : {}) }} > - {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && - taskEdition.task && ( - { - taskEdition.setEditMode(true) - props.setOpenMenuIndex(null) - }} - > - {translate("tasksScreen.editTaskLabel")} - - )} - {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && - taskEdition.task && ( - { - taskEdition.setEstimateEditMode(true) - props.setOpenMenuIndex(null) - }} - > - {translate("myWorkScreen.estimateLabel")} - - )} + {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && taskEdition.task && ( + { + taskEdition.setEditMode(true); + props.setOpenMenuIndex(null); + }} + > + {translate('tasksScreen.editTaskLabel')} + + )} + {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && taskEdition.task && ( + { + taskEdition.setEstimateEditMode(true); + props.setOpenMenuIndex(null); + }} + > + {translate('myWorkScreen.estimateLabel')} + + )} {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && memberInfo.memberUnassignTasks.length > 0 && ( { - setShowUnassignedList(true) - props.setOpenMenuIndex(null) - }} - > - {translate("tasksScreen.assignTaskButton")} - - )} - {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && - !!memberInfo.memberTask && ( - { - memberInfo.unassignTask(taskEdition.task) - props.setOpenMenuIndex(null) + setShowUnassignedList(true); + props.setOpenMenuIndex(null); }} > - {translate("tasksScreen.unassignTaskLabel")} + {translate('tasksScreen.assignTaskButton')} )} + {(memberInfo.isAuthTeamManager || memberInfo.isAuthUser) && !!memberInfo.memberTask && ( + { + memberInfo.unassignTask(taskEdition.task); + props.setOpenMenuIndex(null); + }} + > + {translate('tasksScreen.unassignTaskLabel')} + + )} {memberInfo.isAuthTeamManager && !memberInfo.isAuthUser && @@ -293,43 +255,37 @@ const ListCardItem: React.FC = observer((props) => { <> {memberInfo.isTeamManager ? ( { - props.setOpenMenuIndex(null) - memberInfo.unMakeMemberManager() + props.setOpenMenuIndex(null); + memberInfo.unMakeMemberManager(); }} > - {translate("tasksScreen.unMakeManager")} + {translate('tasksScreen.unMakeManager')} ) : ( { - props.setOpenMenuIndex(null) - memberInfo.makeMemberManager() + props.setOpenMenuIndex(null); + memberInfo.makeMemberManager(); }} > - {translate("tasksScreen.makeManager")} + {translate('tasksScreen.makeManager')} )} )} {!memberInfo.isTeamOwner && ( { - props.setOpenMenuIndex(null) - memberInfo.removeMemberFromTeam() + props.setOpenMenuIndex(null); + memberInfo.removeMemberFromTeam(); }} > - {translate("tasksScreen.remove")} + {translate('tasksScreen.remove')} )} @@ -337,7 +293,7 @@ const ListCardItem: React.FC = observer((props) => { {showUnassignedList ? ( { - setShowUnassignedList(false) + setShowUnassignedList(false); }} > @@ -345,17 +301,11 @@ const ListCardItem: React.FC = observer((props) => { ) : ( - props.setOpenMenuIndex( - props.openMenuIndex === props.index ? null : props.index, - ) + props.setOpenMenuIndex(props.openMenuIndex === props.index ? null : props.index) } > {props.openMenuIndex !== props.index ? ( - + ) : ( )} @@ -373,18 +323,15 @@ const ListCardItem: React.FC = observer((props) => { onPressIn={(isTaskScreen?: boolean) => onPressIn(isTaskScreen)} /> ) : ( - + )} } /> - ) -}) + ); +}); -export default ListCardItem +export default ListCardItem; const $listCard: ViewStyle = { ...GS.flex1, @@ -393,52 +340,52 @@ const $listCard: ViewStyle = { ...GS.shadowSm, ...GS.roundedMd, minHeight: null, - shadowOffset: { width: 0, height: 0 }, -} + shadowOffset: { width: 0, height: 0 } +}; const styles = StyleSheet.create({ dropdownTxt: { - color: "#282048", + color: '#282048', fontFamily: typography.primary.semiBold, fontSize: 14, height: 38, - width: "100%", + width: '100%' }, estimate: { - alignItems: "center", - backgroundColor: "#E8EBF8", + alignItems: 'center', + backgroundColor: '#E8EBF8', borderRadius: 5, - flexDirection: "row", - justifyContent: "space-between", - marginLeft: "auto", + flexDirection: 'row', + justifyContent: 'space-between', + marginLeft: 'auto', marginRight: 10, - paddingVertical: 2, + paddingVertical: 2 }, firstContainer: { - alignItems: "center", - flexDirection: "row", - width: "95%", + alignItems: 'center', + flexDirection: 'row', + width: '95%' }, times: { - alignItems: "center", + alignItems: 'center', borderTopWidth: 1, - flexDirection: "row", - justifyContent: "space-between", - paddingTop: 16, + flexDirection: 'row', + justifyContent: 'space-between', + paddingTop: 16 }, wrapTaskTitle: { borderTopWidth: 1, marginTop: 16, paddingVertical: 16, - width: "98%", + width: '98%' }, wrapTotalTime: { - alignItems: "center", - justifyContent: "center", + alignItems: 'center', + justifyContent: 'center', marginRight: 30, - position: "absolute", - right: 0, - }, -}) + position: 'absolute', + right: 0 + } +}); diff --git a/apps/mobile/app/screens/Authenticated/TeamScreen/components/TaskInfo.tsx b/apps/mobile/app/screens/Authenticated/TeamScreen/components/TaskInfo.tsx index 1c6382081..cac6b7229 100644 --- a/apps/mobile/app/screens/Authenticated/TeamScreen/components/TaskInfo.tsx +++ b/apps/mobile/app/screens/Authenticated/TeamScreen/components/TaskInfo.tsx @@ -13,11 +13,13 @@ import IssuesModal from '../../../../components/IssuesModal'; const TaskInfo = ({ memberInfo, editMode, - setEditMode + setEditMode, + onPressIn }: { memberInfo: I_TeamMemberCardHook; editMode: boolean; setEditMode: (value: boolean) => unknown; + onPressIn: () => void; }) => { const task = memberInfo.memberTask; const { colors } = useAppTheme(); @@ -62,7 +64,7 @@ const TaskInfo = ({ } return ( - setEditMode(true)}> + setEditMode(true)} onPress={onPressIn}> From 99f6d1aa163e4534cb38262b42845a450384ea52 Mon Sep 17 00:00:00 2001 From: Ndekocode Date: Fri, 17 Nov 2023 20:04:25 +0200 Subject: [PATCH 8/9] chore: fix spelling --- .cspell.json | 276 ++++++++++++++++++++++++++++++++++++++++++++++++--- package.json | 6 +- 2 files changed, 264 insertions(+), 18 deletions(-) diff --git a/.cspell.json b/.cspell.json index 31f1ed0ea..99ffbdb42 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,43 +1,283 @@ { "version": "0.2", "language": "en", + "caseSensitive": false, "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "words": [ + "appdev", + "APPSTORE", "barcodes", + "binutils", + "buildjet", "cacheable", "camelcase", + "Chatwoot", + "cloc", "cloudinary", "clsxm", + "commitlint", + "compodoc", "dummyimage", + "envalid", "everco", "everteamsdesktop", "exposdk", + "gcloud", + "graphicsmagick", + "gtag", "headlessui", "heroicons", + "Huhn", + "icnsutils", "JITSU", "kanban", + "libappindicator", + "mathieudutour", + "ncipollo", "passcode", "plasmo", + "precommit", "RECAPTCHA", + "setuptools", + "snyk", + "stylelint", "svgs", "tailwindcss", "Timesheet", - "Vercel", - "buildjet", "vcpu", - "libappindicator", - "binutils", - "icnsutils", - "graphicsmagick", - "setuptools", - "gcloud", - "mathieudutour", - "ncipollo", - "Huhn", - "appdev", - "Chatwoot", - "gtag", - "APPSTORE" + "Vercel", + "HUBSTAFF", + "UPWORK", + "runned", + "Timeslot", + "Isssue", + "datas", + "Changemail", + "Lask", + "publicactive", + "Formated", + "Btns", + "RESERVERD", + "shandow", + "UIUX", + "xlight", + "domutils", + "domhandler", + "hyperscript", + "nocheck", + "locatio", + "falsey", + "unhang", + "popperjs", + "Isssue", + "inital", + "FULLNAME", + "extramenu", + "iuser", + "Pourtcent", + "Reconds", + "Pourtcent", + "combx", + "fomated", + "Hanlder", + "cmdk", + "sitekey", + "Loadtasks", + "Accordian", + "lgcard", + "dvalue", + "Codacy", + "codecov", + "huntr", + "Gitter", + "shadcn", + "Repobeats", + "Codementor", + "xlcard", + "wght", + "worksace", + "appkey", + "jitsi", + "accepte", + "Parens", + "pako", + "embla", + "excalidraw", + "Lngs", + "Transpiles", + "wasabisys", + "apistage", + "flaticon", + "VERSONS", + "Tongatapu", + "Moresby", + "Pago", + "Kosrae", + "Kiritimati", + "Fakaofo", + "Enderbury", + "Efate", + "Propf", + "mappagination", + "INAPP", + "INFOTMATION", + "nimg", + "strock", + "ISSUETYPE", + "borde", + "imlement", + "Invitatio", + "Synk", + "nimg", + "capitaliz", + "nimg", + "Settingfilter", + "recieve", + "Opena", + "TRANSFERT", + "choos", + "Darkmode", + "recieve", + "Vefified", + "Uturn", + "insted", + "Cmbx", + "hidde", + "invitationid", + "cheched", + "Dropown", + "imodal", + "Signle", + "Filder", + "outclick", + "Filder", + "skey", + "outclick", + "Xlarge", + "Permisson", + "noreferrer", + "errr", + "Instanciate", + "Varibales", + "ciphertext", + "discrepenancy", + "unoffic", + "implem", + "asel", + "Togger", + "Organizatio", + "Combox", + "unchild", + "signoff", + "Settingfilter", + "X", + "stackoverflow", + "payperiod", + "billrate", + "tnode", + "localstorage", + "millisencods", + "taskid", + "creatoe", + "setrole", + "lastest", + "immediatly", + "Verifiy", + "invdate", + "ianatz", + "uicolors", + "greppable", + "Andross", + "Bowser", + "Boilerplates", + "xcodeproj", + "gradlew", + "paren", + "iphonesimulator", + "xcworkspace", + "dropwdown", + "itask", + "xcodebuild", + "reactotron", + "fbjs", + "stylesheet", + "bootsplash", + "animatable", + "apisauce", + "grotesk", + "jsbundle", + "unimodules", + "mobx", + "typeof", + "loglevel", + "applesimutils", + "phraseapp", + "OSTYPE", + "pkill", + "yellowbox", + "miliseconds", + "Bugsnag", + "Neue", + "Defaul", + "Reactotron's", + "Worspace", + "Funtion", + "tinvitations", + "Authentificate", + "screenstatus", + "withteam", + "Invitions", + "lastlog", + "STMP", + "statut", + "statsus", + "simplecast", + "Ffeeds", + "smalltext", + "Pressible", + "Pressable", + "deserunt", + "longpress", + "endregion", + "checkcircleo", + "Entypo", + "Charaters", + "Ionicons", + "ellipsize", + "unasigned", + "progess", + "Icontent", + "arrowleft", + "Descrption", + "Swith", + "Chane", + "Plaholder", + "firstname", + "Isvalid", + "Chane", + "checkcircle", + "exclamationcircleo", + "contaniner", + "Galery", + "clockcircleo", + "filtmembers", + "comparision", + "Jamon", + "Chami", + "Mazen", + "Heinze", + "Holmgren", + "Jamon", + "Rickert", + "Metral", + "subsquently", + "Syle", + "imagebutton", + "hwba", + "plasmohq", + "Proguard", + "horcrux", + "dimesions" ], "useGitignore": true, "ignorePaths": [ @@ -75,10 +315,14 @@ "signin", "Chatwoot", "CHATWOOT", + "apps/web/lib/settings/timezones.js", + "apps/**/*.{svg,css,scss}", "apps/web/lib/i18n/*.ts", + "apps/mobile/app/screens/DemoShowroomScreen/demos/**", "apps/web/public/locales/**", "apps/mobile/app/i18n/*.ts", "apps/mobile/android/**", - "apps/mobile/ios/**" + "apps/mobile/ios/**", + "apps/desktop/i18n/**" ] } diff --git a/package.json b/package.json index 503971573..0189d2627 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,8 @@ "doc:build-serve": "compodoc -p tsconfig.json -d docs -s", "postinstall.electron": "yarn electron-builder install-app-deps && yarn node tools/electron/postinstall", "postinstall.web": "yarn node tools/web/postinstall", - "spell": "cspell . --config .cspell.json" + "spell": "cspell . --config .cspell.json", + "spellcheck": "cspell ." }, "config": { "commitizen": { @@ -189,7 +190,8 @@ "pretty-quick": "^3.1.3", "rimraf": "^3.0.2", "semantic-release": "^19.0.5", - "ts-node": "^10.9.1" + "ts-node": "^10.9.1", + "cspell": "8.0.0" }, "engines": { "node": ">=16.0.0", From 4cd9e41cd33d0c18e5487185533665073b5ef4ad Mon Sep 17 00:00:00 2001 From: Ndekocode Date: Fri, 17 Nov 2023 21:15:03 +0200 Subject: [PATCH 9/9] update yarn.lock --- yarn.lock | 614 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 609 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 393b3bbfb..92b50ed36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1471,6 +1471,348 @@ dot "^2.0.0-beta.1" fs-extra "^11.1.1" +"@cspell/cspell-bundled-dicts@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.0.0.tgz#39b57038fbbd8c01a0e714e83ddceecc4cc49734" + integrity sha512-Phbb1ij1TQQuqxuuvxf5P6fvV9U+EVoATNLmDqFHvRZfUyuhgbJuCMzIPeBx4GfTTDWlPs51FYRvZ/Q8xBHsyA== + dependencies: + "@cspell/dict-ada" "^4.0.2" + "@cspell/dict-aws" "^4.0.0" + "@cspell/dict-bash" "^4.1.2" + "@cspell/dict-companies" "^3.0.27" + "@cspell/dict-cpp" "^5.0.9" + "@cspell/dict-cryptocurrencies" "^4.0.0" + "@cspell/dict-csharp" "^4.0.2" + "@cspell/dict-css" "^4.0.12" + "@cspell/dict-dart" "^2.0.3" + "@cspell/dict-django" "^4.1.0" + "@cspell/dict-docker" "^1.1.7" + "@cspell/dict-dotnet" "^5.0.0" + "@cspell/dict-elixir" "^4.0.3" + "@cspell/dict-en-common-misspellings" "^1.0.2" + "@cspell/dict-en-gb" "1.1.33" + "@cspell/dict-en_us" "^4.3.11" + "@cspell/dict-filetypes" "^3.0.2" + "@cspell/dict-fonts" "^4.0.0" + "@cspell/dict-fsharp" "^1.0.1" + "@cspell/dict-fullstack" "^3.1.5" + "@cspell/dict-gaming-terms" "^1.0.4" + "@cspell/dict-git" "^2.0.0" + "@cspell/dict-golang" "^6.0.4" + "@cspell/dict-haskell" "^4.0.1" + "@cspell/dict-html" "^4.0.5" + "@cspell/dict-html-symbol-entities" "^4.0.0" + "@cspell/dict-java" "^5.0.6" + "@cspell/dict-k8s" "^1.0.2" + "@cspell/dict-latex" "^4.0.0" + "@cspell/dict-lorem-ipsum" "^4.0.0" + "@cspell/dict-lua" "^4.0.2" + "@cspell/dict-makefile" "^1.0.0" + "@cspell/dict-node" "^4.0.3" + "@cspell/dict-npm" "^5.0.12" + "@cspell/dict-php" "^4.0.4" + "@cspell/dict-powershell" "^5.0.2" + "@cspell/dict-public-licenses" "^2.0.5" + "@cspell/dict-python" "^4.1.10" + "@cspell/dict-r" "^2.0.1" + "@cspell/dict-ruby" "^5.0.1" + "@cspell/dict-rust" "^4.0.1" + "@cspell/dict-scala" "^5.0.0" + "@cspell/dict-software-terms" "^3.3.9" + "@cspell/dict-sql" "^2.1.2" + "@cspell/dict-svelte" "^1.0.2" + "@cspell/dict-swift" "^2.0.1" + "@cspell/dict-typescript" "^3.1.2" + "@cspell/dict-vue" "^3.0.0" + +"@cspell/cspell-json-reporter@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.0.0.tgz#b41b057ba85b47a853c0d39f0dabf384a4bd3057" + integrity sha512-1ltK5N4xMGWjDSIkU+GJd3rXV8buXgO/lAgnpM1RhKWqAmG+u0k6pnhk2vIo/4qZQpgfK0l3J3h/Ky2FcE95vA== + dependencies: + "@cspell/cspell-types" "8.0.0" + +"@cspell/cspell-pipe@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-8.0.0.tgz#811a5ca79debd7ef02cb4063fc1f4dee9781c8b9" + integrity sha512-1MH+9q3AmbzwK1BYhSGla8e4MAAYzzPApGvv8eyv0rWDmgmDTkGqJPTTvYj1wFvll5ximQ5OolpPQGv3JoWvtQ== + +"@cspell/cspell-resolver@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-8.0.0.tgz#94ee2f58403c0d41444001ac230ab2f79da30cc0" + integrity sha512-gtALHFLT2vSZ7BZlIg26AY3W9gkiqxPGE75iypWz06JHJs05ngnAR+h6VOu0+rmgx98hNfzPPEh4g+Tjm8Ma0A== + dependencies: + global-dirs "^3.0.1" + +"@cspell/cspell-service-bus@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-8.0.0.tgz#7f13e30ecb2758bcef4f918e56a03a37f28637c3" + integrity sha512-1EYhIHoZnhxpfEp6Bno6yVWYBuYfaQrwIfeDMntnezUcSmi7RyroQEcp5U7sLv69vhRD2c81o7r8iUaAbPSmIg== + +"@cspell/cspell-types@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-8.0.0.tgz#fc083dad9fc9aa9b2dfeaa8e1db13596dbb9e65d" + integrity sha512-dPdxQI8dLJoJEjylaPYfCJNnm2XNMYPuowHE2FMcsnFR9hEchQAhnKVc/aD63IUYnUtUrPxPlUJdoAoj569e+g== + +"@cspell/dict-ada@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.0.2.tgz#8da2216660aeb831a0d9055399a364a01db5805a" + integrity sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA== + +"@cspell/dict-aws@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.0.tgz#ab71fe0c05d9ad662d27495e74361bdcb5b470eb" + integrity sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ== + +"@cspell/dict-bash@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.1.2.tgz#47696a13f6294c310801b811e75fc62e6151d28c" + integrity sha512-AEBWjbaMaJEyAjOHW0F15P2izBjli2cNerG3NjuVH7xX/HUUeNoTj8FF1nwpMufKwGQCvuyO2hCmkVxhJ0y55Q== + +"@cspell/dict-companies@^3.0.27": + version "3.0.27" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.0.27.tgz#c2fd0d82959c7b12a0876cf68f4140d05e6cbfe8" + integrity sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ== + +"@cspell/dict-cpp@^5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-5.0.9.tgz#9de9b8532af22597ee1c97292a94b2bfa6cf38d4" + integrity sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA== + +"@cspell/dict-cryptocurrencies@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-4.0.0.tgz#6517a7e1b0ed184cf3fc18f03230c82508369dec" + integrity sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg== + +"@cspell/dict-csharp@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz#e55659dbe594e744d86b1baf0f3397fe57b1e283" + integrity sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g== + +"@cspell/dict-css@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.12.tgz#59abf3512ae729835c933c38f64a3d8a5f09ce3d" + integrity sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw== + +"@cspell/dict-dart@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.0.3.tgz#75e7ffe47d5889c2c831af35acdd92ebdbd4cf12" + integrity sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw== + +"@cspell/dict-data-science@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-1.0.11.tgz#4eabba75c21d27253c1114b4fbbade0ead739ffc" + integrity sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ== + +"@cspell/dict-django@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.0.tgz#2d4b765daf3c83e733ef3e06887ea34403a4de7a" + integrity sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w== + +"@cspell/dict-docker@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.7.tgz#bcf933283fbdfef19c71a642e7e8c38baf9014f2" + integrity sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A== + +"@cspell/dict-dotnet@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz#13690aafe14b240ad17a30225ac1ec29a5a6a510" + integrity sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw== + +"@cspell/dict-elixir@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz#57c25843e46cf3463f97da72d9ef8e37c818296f" + integrity sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q== + +"@cspell/dict-en-common-misspellings@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-1.0.2.tgz#3c4ebab8e9e906d66d60f53c8f8c2e77b7f108e7" + integrity sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw== + +"@cspell/dict-en-gb@1.1.33": + version "1.1.33" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz#7f1fd90fc364a5cb77111b5438fc9fcf9cc6da0e" + integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== + +"@cspell/dict-en_us@^4.3.11": + version "4.3.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.3.11.tgz#3adef0c99a97c8ebb20a96be7647215263a5d5dc" + integrity sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw== + +"@cspell/dict-filetypes@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.2.tgz#d9b36dbc84b5e92f7d0feb3879374a74a0c0bb09" + integrity sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg== + +"@cspell/dict-fonts@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz#9bc8beb2a7b068b4fdb45cb994b36fd184316327" + integrity sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q== + +"@cspell/dict-fsharp@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz#d62c699550a39174f182f23c8c1330a795ab5f53" + integrity sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ== + +"@cspell/dict-fullstack@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz#35d18678161f214575cc613dd95564e05422a19c" + integrity sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA== + +"@cspell/dict-gaming-terms@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.4.tgz#b67d89d014d865da6cb40de4269d4c162a00658e" + integrity sha512-hbDduNXlk4AOY0wFxcDMWBPpm34rpqJBeqaySeoUH70eKxpxm+dvjpoRLJgyu0TmymEICCQSl6lAHTHSDiWKZg== + +"@cspell/dict-git@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-2.0.0.tgz#fa5cb298845da9c69efc01c6af07a99097718dc9" + integrity sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w== + +"@cspell/dict-golang@^6.0.4": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.4.tgz#a7bece30fc491babe0c36a93eacd7e8bb81844ae" + integrity sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ== + +"@cspell/dict-haskell@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz#e9fca7c452411ff11926e23ffed2b50bb9b95e47" + integrity sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ== + +"@cspell/dict-html-symbol-entities@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz#4d86ac18a4a11fdb61dfb6f5929acd768a52564f" + integrity sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw== + +"@cspell/dict-html@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.5.tgz#03a5182148d80e6c25f71339dbb2b7c5b9894ef8" + integrity sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w== + +"@cspell/dict-java@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.6.tgz#2462d6fc15f79ec15eb88ecf875b6ad2a7bf7a6a" + integrity sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw== + +"@cspell/dict-k8s@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.2.tgz#b19e66f4ac8a4264c0f3981ac6e23e88a60f1c91" + integrity sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ== + +"@cspell/dict-latex@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-4.0.0.tgz#85054903db834ea867174795d162e2a8f0e9c51e" + integrity sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ== + +"@cspell/dict-lorem-ipsum@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz#2793a5dbfde474a546b0caecc40c38fdf076306e" + integrity sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw== + +"@cspell/dict-lua@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.2.tgz#74f080296f94eda4e65f79d14be00cb0f8fdcb22" + integrity sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg== + +"@cspell/dict-makefile@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz#5afb2910873ebbc01ab8d9c38661c4c93d0e5a40" + integrity sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ== + +"@cspell/dict-node@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-4.0.3.tgz#5ae0222d72871e82978049f8e11ea627ca42fca3" + integrity sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg== + +"@cspell/dict-npm@^5.0.12": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.0.12.tgz#dc752a4a22875c3835910266398d70c732648610" + integrity sha512-T/+WeQmtbxo7ad6hrdI8URptYstKJP+kXyWJZfuVJJGWJQ7yubxrI5Z5AfM+Dh/ff4xHmdzapxD9adaEQ727uw== + +"@cspell/dict-php@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.4.tgz#7510c0fe4bdbb049c143eb3c471820d1e681bbb9" + integrity sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug== + +"@cspell/dict-powershell@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz#2b1d7d514354b6d7de405d5faaef30f8eca0ef09" + integrity sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw== + +"@cspell/dict-public-licenses@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.5.tgz#86948b29bd36184943955eaa80bf594488c4dd8a" + integrity sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A== + +"@cspell/dict-python@^4.1.10": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.1.10.tgz#bae6557e7b828a1701d3733b7766c4d95f279175" + integrity sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA== + dependencies: + "@cspell/dict-data-science" "^1.0.11" + +"@cspell/dict-r@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.0.1.tgz#73474fb7cce45deb9094ebf61083fbf5913f440a" + integrity sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA== + +"@cspell/dict-ruby@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.0.1.tgz#a59df952d66781d811e7aac9208c145680e8cdf9" + integrity sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ== + +"@cspell/dict-rust@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.1.tgz#ef0b88cb3a45265824e2c9ce31b0baa4e1050351" + integrity sha512-xJSSzHDK2z6lSVaOmMxl3PTOtfoffaxMo7fTcbZUF+SCJzfKbO6vnN9TCGX2sx1RHFDz66Js6goz6SAZQdOwaw== + +"@cspell/dict-scala@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.0.tgz#b64365ad559110a36d44ccd90edf7151ea648022" + integrity sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ== + +"@cspell/dict-software-terms@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-3.3.9.tgz#0350f46d796be1c08e45d5d4a465bcfcb66f3bb3" + integrity sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA== + +"@cspell/dict-sql@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.1.2.tgz#80492b887e7986dd8bc39a9c5ea513ede2b17cb1" + integrity sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ== + +"@cspell/dict-svelte@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz#0c866b08a7a6b33bbc1a3bdbe6a1b484ca15cdaa" + integrity sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q== + +"@cspell/dict-swift@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.1.tgz#06ec86e52e9630c441d3c19605657457e33d7bb6" + integrity sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw== + +"@cspell/dict-typescript@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.1.2.tgz#14d05f54db2984feaa24ea133b583d19c04cc104" + integrity sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA== + +"@cspell/dict-vue@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.0.tgz#68ccb432ad93fcb0fd665352d075ae9a64ea9250" + integrity sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A== + +"@cspell/dynamic-import@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-8.0.0.tgz#68d7b6c407fccb62a0f706c8cc99e4d77dc82a12" + integrity sha512-HNkCepopgiEGuI1QGA6ob4+ayvoSMxvAqetLxP0u1sZzc50LH2DEWwotcNrpVdzZOtERHvIBcGaQKIBEx8pPRQ== + dependencies: + import-meta-resolve "^3.1.1" + +"@cspell/strong-weak-map@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.0.0.tgz#9f1dc029b86146cd2b01cb563bc470cff1cb0009" + integrity sha512-fRlqPSdpdub52vFtulDgLPzGPGe75I04ScId1zOO9ABP7/ro8VmaG//m1k7hsPkm6h7FG4jWympoA3aXDAcXaA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -6430,6 +6772,11 @@ array-includes@^3.1.6: get-intrinsic "^1.2.1" is-string "^1.0.7" +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -7424,7 +7771,7 @@ callsite@^1.0.0: resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" integrity sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ== -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== @@ -7505,6 +7852,13 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chalk-template@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" + integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== + dependencies: + chalk "^5.2.0" + chalk@3.0.0, chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -7549,7 +7903,7 @@ chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^5.2.0: +chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -7689,6 +8043,14 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== + dependencies: + parent-module "^2.0.0" + resolve-from "^5.0.0" + cli-columns@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" @@ -7981,6 +8343,11 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -8011,6 +8378,17 @@ commander@^9.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== +comment-json@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.3.tgz#50b487ebbf43abe44431f575ebda07d30d015365" + integrity sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + commitizen@^4.0.3, commitizen@^4.2.5: version "4.3.0" resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.3.0.tgz#0d056c542a2d2b1f9b9aba981aa32575b2849924" @@ -8140,6 +8518,17 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + confusing-browser-globals@^1.0.9: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" @@ -8473,7 +8862,7 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: +core-util-is@^1.0.3, core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== @@ -8507,6 +8896,16 @@ cosmiconfig@7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" + integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -8633,6 +9032,115 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +cspell-dictionary@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-8.0.0.tgz#7486d2dea00b6b9f8f98726c0a526ebfdeecd153" + integrity sha512-R/AzUj7W7F4O4fAOL8jvIiUqPYGy6jIBlDkxO9SZe/A6D2kOICZZzGSXMZ0M7OKYqxc6cioQUMKOJsLkDXfDXw== + dependencies: + "@cspell/cspell-pipe" "8.0.0" + "@cspell/cspell-types" "8.0.0" + cspell-trie-lib "8.0.0" + fast-equals "^4.0.3" + gensequence "^6.0.0" + +cspell-gitignore@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-8.0.0.tgz#b2fba587712f8f8fb7d70231a3ebfe1ea370b88d" + integrity sha512-Uv+ENdUm+EXwQuG9187lKmE1t8b2KW+6VaQHP7r01WiuhkwhfzmWA7C30iXVcwRcsMw07wKiWvMEtG6Zlzi6lQ== + dependencies: + cspell-glob "8.0.0" + find-up "^5.0.0" + +cspell-glob@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-8.0.0.tgz#8719f5e62a00536f2dc9bda0d4155e48ac93eaaf" + integrity sha512-wOkRA1OTIPhyN7a+k9Qq45yFXM+tBFi9DS5ObiLv6t6VTBIeMQpwRK0KLViHmjTgiA6eWx53Dnr+DZfxcAkcZA== + dependencies: + micromatch "^4.0.5" + +cspell-grammar@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-8.0.0.tgz#e45f4229eeec96313d115cdcaf987f162b4b272d" + integrity sha512-uxpRvbBxOih6SjFQvKTBPTA+YyqYM5UFTNTFuRnA6g6WZeg+NJaTkbQrTgXja4B2r8MJ6XU22YrKTtHNNcP7bQ== + dependencies: + "@cspell/cspell-pipe" "8.0.0" + "@cspell/cspell-types" "8.0.0" + +cspell-io@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-8.0.0.tgz#f62250bbcaaa39fca51ac72235d15f976dc255d2" + integrity sha512-NVdVmQd7SU/nxYwWtO/6gzux/kp1Dt36zKds0+QHZhQ18JJjXduF5e+WUttqKi2oj/vvmjiG4HGFKQVDBcBz3w== + dependencies: + "@cspell/cspell-service-bus" "8.0.0" + +cspell-lib@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-8.0.0.tgz#6fb28bd87c764296367d2828d8490c5579646789" + integrity sha512-X/BzUjrzHOx7YlhvSph/OlMu1RmCTnybeZvIE67d1Pd7wT1TmZhFTnmvruUhoHxWEudOEe4HjzuNL9ph6Aw+aA== + dependencies: + "@cspell/cspell-bundled-dicts" "8.0.0" + "@cspell/cspell-pipe" "8.0.0" + "@cspell/cspell-resolver" "8.0.0" + "@cspell/cspell-types" "8.0.0" + "@cspell/dynamic-import" "8.0.0" + "@cspell/strong-weak-map" "8.0.0" + clear-module "^4.1.2" + comment-json "^4.2.3" + configstore "^6.0.0" + cosmiconfig "8.0.0" + cspell-dictionary "8.0.0" + cspell-glob "8.0.0" + cspell-grammar "8.0.0" + cspell-io "8.0.0" + cspell-trie-lib "8.0.0" + fast-equals "^5.0.1" + find-up "^6.3.0" + gensequence "^6.0.0" + import-fresh "^3.3.0" + resolve-from "^5.0.0" + vscode-languageserver-textdocument "^1.0.11" + vscode-uri "^3.0.8" + +cspell-trie-lib@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-8.0.0.tgz#9a4fb5e073d9b4d82da301278bc45e0469eafb2c" + integrity sha512-0rC5e1C0uM78uuS+lC1T18EojWZyNvq4bPOPCisnwuhuWrAfCqrFrX/qDNslWk3VTOPbsEMlFj6OnIGQnfwSKg== + dependencies: + "@cspell/cspell-pipe" "8.0.0" + "@cspell/cspell-types" "8.0.0" + gensequence "^6.0.0" + +cspell@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-8.0.0.tgz#f44dd022ac91a8c098a3f09596315cb4e1d166d0" + integrity sha512-Nayy25Dh+GAlDFDpVZaQhmidP947rpj1Pn9lmZ3nUFjD9W/yj0h0vrjMLMN4dbonddkmKh4t51C+7NuMP405hg== + dependencies: + "@cspell/cspell-json-reporter" "8.0.0" + "@cspell/cspell-pipe" "8.0.0" + "@cspell/cspell-types" "8.0.0" + "@cspell/dynamic-import" "8.0.0" + chalk "^5.3.0" + chalk-template "^1.1.0" + commander "^11.1.0" + cspell-gitignore "8.0.0" + cspell-glob "8.0.0" + cspell-io "8.0.0" + cspell-lib "8.0.0" + fast-glob "^3.3.2" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^7.0.1" + get-stdin "^9.0.0" + semver "^7.5.4" + strip-ansi "^7.1.0" + vscode-uri "^3.0.8" + css-declaration-sorter@^6.3.1: version "6.4.1" resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" @@ -10463,6 +10971,16 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-equals@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-4.0.3.tgz#72884cc805ec3c6679b99875f6b7654f39f0e8c7" + integrity sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg== + +fast-equals@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + fast-fifo@^1.1.0, fast-fifo@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" @@ -10490,6 +11008,17 @@ fast-glob@^3.2.12, fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -10566,6 +11095,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-7.0.2.tgz#2d61bb70ba89b9548e3035b7c9173fe91deafff0" + integrity sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g== + dependencies: + flat-cache "^3.2.0" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -10717,6 +11253,15 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -10727,6 +11272,11 @@ flatted@^3.2.7: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" @@ -10965,6 +11515,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gensequence@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-6.0.0.tgz#ae46a0f89ebd7cc334e45cfb8f1c99a65248694e" + integrity sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -11025,6 +11580,11 @@ get-stdin@^8.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + get-stream@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" @@ -11265,7 +11825,7 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" -global-dirs@^3.0.0: +global-dirs@^3.0.0, global-dirs@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== @@ -11436,6 +11996,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-own-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== + has-property-descriptors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" @@ -11935,6 +12500,11 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-meta-resolve@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz#75d194ae465d17c15736f414734310c87d4c45d7" + integrity sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -16148,6 +16718,13 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -18969,7 +19546,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -19696,6 +20273,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + type-fest@^3.0.0: version "3.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" @@ -19916,6 +20498,13 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" @@ -20164,6 +20753,16 @@ void-elements@3.1.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== +vscode-languageserver-textdocument@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" + integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== + +vscode-uri@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + vue-eslint-parser@^9.1.0: version "9.3.2" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz#6f9638e55703f1c77875a19026347548d93fd499" @@ -20590,6 +21189,11 @@ ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +xdg-basedir@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + xmlbuilder@^15.1.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"