diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..4ca0343
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,6 @@
+VITE_GRAPHQL_SUPPORT_API=https://example.com/graphql
+VITE_PAYMENT_API=https://example.com/payment/api
+VITE_GRAPHQL_SUPPORT_SUBSCRIPTIONS_API=https://example.com/graphql
+VITE_GRAPHQL_API=https://example.com/graphql
+VITE_STRIPE_PUBLIC_KEY=STRIPE_PUBLIC_KEY
+VITE_CLOUDINARY_URL=CLOUDINARY_URL
\ No newline at end of file
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..82a9a73
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1 @@
+.eslintrc.js
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
index 987866d..ac9efb0 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -5,6 +5,7 @@ module.exports = {
'plugin:jest/recommended',
'plugin:prettier/recommended',
'plugin:@typescript-eslint/recommended',
+ 'plugin:import/recommended'
],
plugins: ['react', '@typescript-eslint', 'jest', 'prettier'],
env: {
@@ -54,18 +55,6 @@ module.exports = {
'@typescript-eslint/explicit-module-boundary-types': 0,
'@typescript-eslint/no-explicit-any': 0,
'linebreak-style': 'off',
- 'jsx-a11y/label-has-associated-control': [
- 'error',
- {
- labelComponents: [],
- labelAttributes: [],
- controlComponents: [],
- assert: 'either',
- depth: 25,
- },
- ],
- 'jsx-a11y/control-has-associated-label': 0,
- 'jsx-a11y/anchor-is-valid': 0,
'prettier/prettier': [
'error',
{
diff --git a/__tests__/Alert.test.tsx b/__tests__/Alert.test.tsx
deleted file mode 100644
index 61127d7..0000000
--- a/__tests__/Alert.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Alert test suite', () => {});
diff --git a/__tests__/Avatar.test.tsx b/__tests__/Avatar.test.tsx
deleted file mode 100644
index 7a1cf6b..0000000
--- a/__tests__/Avatar.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Avatar test suite', () => {});
diff --git a/__tests__/Box.test.tsx b/__tests__/Box.test.tsx
deleted file mode 100644
index 1f96ffe..0000000
--- a/__tests__/Box.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Box test suite', () => {});
diff --git a/__tests__/Button.test.tsx b/__tests__/Button.test.tsx
deleted file mode 100644
index 745c3aa..0000000
--- a/__tests__/Button.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Button test suite', () => {});
diff --git a/__tests__/CheckBox.test.tsx b/__tests__/CheckBox.test.tsx
deleted file mode 100644
index b81b312..0000000
--- a/__tests__/CheckBox.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('CheckBox test suite', () => {});
diff --git a/__tests__/Input.test.tsx b/__tests__/Input.test.tsx
deleted file mode 100644
index 5184a98..0000000
--- a/__tests__/Input.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Input test suite', () => {});
diff --git a/__tests__/Link.test.tsx b/__tests__/Link.test.tsx
deleted file mode 100644
index f2f13b9..0000000
--- a/__tests__/Link.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Link test suite', () => {});
diff --git a/__tests__/Menu.test.tsx b/__tests__/Menu.test.tsx
deleted file mode 100644
index 046dcc2..0000000
--- a/__tests__/Menu.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Modal test suite', () => {});
diff --git a/__tests__/Modal.test.tsx b/__tests__/Modal.test.tsx
deleted file mode 100644
index 046dcc2..0000000
--- a/__tests__/Modal.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Modal test suite', () => {});
diff --git a/__tests__/Search.test.tsx b/__tests__/Search.test.tsx
deleted file mode 100644
index b6e7a24..0000000
--- a/__tests__/Search.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Search test suite', () => {});
diff --git a/__tests__/Spinner.test.tsx b/__tests__/Spinner.test.tsx
deleted file mode 100644
index 260af1a..0000000
--- a/__tests__/Spinner.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Spinner test suite', () => {});
diff --git a/__tests__/Text.test.tsx b/__tests__/Text.test.tsx
deleted file mode 100644
index ed4b53c..0000000
--- a/__tests__/Text.test.tsx
+++ /dev/null
@@ -1 +0,0 @@
-describe('Text test suite', () => {});
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..46a45a0
--- /dev/null
+++ b/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Astrobuild
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
index 2a2502f..fef1f67 100644
--- a/package.json
+++ b/package.json
@@ -3,40 +3,43 @@
"version": "0.1.0",
"private": true,
"dependencies": {
- "@apollo/client": "^3.3.14",
- "@testing-library/jest-dom": "^5.11.4",
- "@testing-library/react": "^11.1.0",
- "@testing-library/user-event": "^12.1.10",
- "@types/jest": "^26.0.15",
+ "@apollo/client": "^3.7.10",
+ "@testing-library/jest-dom": "^5.16.5",
+ "@testing-library/react": "^14.0.0",
+ "@testing-library/user-event": "^14.4.3",
+ "@types/jest": "^29.5.0",
"@types/jwt-decode": "^3.1.0",
- "@types/node": "^12.0.0",
- "@types/react": "^17.0.3",
- "@types/react-dom": "^17.0.3",
- "@types/react-router-dom": "^5.1.7",
- "@types/styled-components": "^5.1.9",
- "formik": "^2.2.6",
- "graphql": "^15.5.0",
+ "@types/node": "^18.15.7",
+ "@types/react": "^18.0.29",
+ "@types/react-dom": "^18.0.11",
+ "@types/react-router-dom": "^5.3.3",
+ "@types/styled-components": "^5.1.26",
+ "formik": "^2.2.9",
+ "graphql": "^16.6.0",
"jwt-decode": "^3.1.2",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
+ "localforage": "^1.10.0",
+ "match-sorter": "^6.3.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
"react-elastic-carousel": "^0.11.5",
- "react-flow-renderer": "^9.6.0",
- "react-router-dom": "^5.2.0",
- "react-scripts": "4.0.3",
- "react-to-print": "^2.12.6",
- "styled-components": "^5.2.3",
+ "react-router-dom": "^6.9.0",
+ "react-to-print": "^2.14.12",
+ "reactflow": "^11.7.0",
+ "sort-by": "^1.2.0",
+ "styled-components": "^5.3.10",
"subscriptions-transport-ws": "^0.9.19",
- "typescript": "^4.1.2",
- "web-vitals": "^1.0.1",
- "yup": "^0.32.9"
+ "typescript": "^5.0.2",
+ "vite-plugin-svgr": "^2.4.0",
+ "web-vitals": "^3.3.0",
+ "yup": "^1.0.2"
},
"scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
- "eject": "react-scripts eject",
+ "start": "vite",
+ "build": "vite build",
"generate-main": "graphql-codegen --config codegen-main.yml",
- "generate-support": "graphql-codegen --config codegen-support.yml"
+ "generate-support": "graphql-codegen --config codegen-support.yml",
+ "lint": "yarn run eslint src --ext .ts,.tsx",
+ "fix": "yarn lint --fix"
},
"browserslist": {
"production": [
@@ -51,21 +54,23 @@
]
},
"devDependencies": {
- "@graphql-codegen/cli": "^1.21.3",
- "@graphql-codegen/introspection": "^1.18.2",
- "@graphql-codegen/typescript": "^1.22.0",
- "@graphql-codegen/typescript-operations": "^1.17.16",
- "@typescript-eslint/eslint-plugin": "^4.21.0",
- "@typescript-eslint/parser": "^4.21.0",
- "eslint-config-airbnb": "18.2.1",
- "eslint-config-airbnb-typescript": "^12.3.1",
- "eslint-config-prettier": "^8.1.0",
- "eslint-plugin-import": "2.22.1",
- "eslint-plugin-jest": "^24.3.4",
- "eslint-plugin-jsx-a11y": "6.4.1",
- "eslint-plugin-prettier": "^3.3.1",
- "eslint-plugin-react": "7.21.5",
- "eslint-plugin-react-hooks": "1.7.0",
- "prettier": "^2.2.1"
+ "@graphql-codegen/cli": "^3.2.2",
+ "@graphql-codegen/introspection": "^3.0.1",
+ "@graphql-codegen/typescript": "^3.0.2",
+ "@graphql-codegen/typescript-operations": "^3.0.2",
+ "@typescript-eslint/eslint-plugin": "^5.56.0",
+ "@typescript-eslint/parser": "^5.56.0",
+ "@vitejs/plugin-react": "^4.0.0",
+ "eslint-config-airbnb": "19.0.4",
+ "eslint-config-airbnb-typescript": "^17.0.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-jest": "^27.2.1",
+ "eslint-plugin-jsx-a11y": "6.7.1",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-react": "7.32.2",
+ "eslint-plugin-react-hooks": "4.6.0",
+ "prettier": "^2.8.7",
+ "vite": "^4.2.1"
}
}
diff --git a/public/index.html b/public/index.html
deleted file mode 100644
index f60baa8..0000000
--- a/public/index.html
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Astrobuild
-
-
-
-
-
-
-
diff --git a/src/App.tsx b/src/App.tsx
index 1fcfc89..3be0a9c 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,10 +1,10 @@
import jwtDecode from 'jwt-decode';
import { useEffect } from 'react';
-import { Redirect, Switch } from 'react-router-dom';
+import { Routes, Route, Navigate } from 'react-router-dom';
import { useLazyQuery, useReactiveVar } from '@apollo/client';
import {
- ProtectedRoute,
- AuthRoute,
+ Protected,
+ Public,
Navbar,
Sidebar,
Spinner,
@@ -78,8 +78,6 @@ const App = () => {
getUserById({ variables: { id } });
tokenVar(localStorageToken);
}
-
- // eslint-disable-next-line
}, []);
return !loading ? (
@@ -90,111 +88,273 @@ const App = () => {
>
)}
-
-
+
+
{role !== 'admin' ? (
-
+
) : (
-
+
)}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ } />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
>
) : (
diff --git a/src/components/AuthRoute/index.tsx b/src/components/AuthRoute/index.tsx
deleted file mode 100644
index 89e5af8..0000000
--- a/src/components/AuthRoute/index.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import { useReactiveVar } from '@apollo/client';
-import { Redirect, Route, RouteProps } from 'react-router-dom';
-import { tokenVar } from '../../graphql/state';
-
-const AuthRoute: React.FC = ({ children, ...rest }) => {
- const token = useReactiveVar(tokenVar);
-
- return (
- (!token ? children : )} />
- );
-};
-
-export default AuthRoute;
diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx
index 8296148..8fadab5 100644
--- a/src/components/Button/index.tsx
+++ b/src/components/Button/index.tsx
@@ -6,8 +6,8 @@ type ButtonProps = {
size?: 'small' | 'big';
variant?: 'primary-action' | 'secondary-action' | 'outlined' | 'text';
type?: 'submit' | 'button' | 'reset';
- iconLeft?: React.SVGProps;
- iconRight?: React.SVGProps;
+ iconLeft?: React.FunctionComponentElement>;
+ iconRight?: React.FunctionComponentElement>;
fullWidth?: boolean;
loading?: boolean;
disabled?: boolean;
diff --git a/src/components/Button/styles.ts b/src/components/Button/styles.ts
index 7e0673c..dc1e694 100644
--- a/src/components/Button/styles.ts
+++ b/src/components/Button/styles.ts
@@ -4,8 +4,8 @@ type WrapperProps = {
color: 'client' | 'productOwner' | 'developer' | 'admin' | 'error';
size?: 'small' | 'big';
variant?: 'primary-action' | 'secondary-action' | 'outlined' | 'text';
- iconLeft?: React.SVGProps;
- iconRight?: React.SVGProps;
+ iconLeft?: React.FunctionComponentElement>;
+ iconRight?: React.FunctionComponentElement>;
load?: boolean;
disabled?: boolean;
fullWidth?: boolean;
diff --git a/src/components/ContextMenu/index.tsx b/src/components/ContextMenu/index.tsx
index 9acc97b..91296f7 100644
--- a/src/components/ContextMenu/index.tsx
+++ b/src/components/ContextMenu/index.tsx
@@ -10,46 +10,38 @@ type ContextMenuProps = {
const ContextMenu = ({ items, component, className }: ContextMenuProps) => {
const [open, setOpen] = useState(false);
- const ref = useRef(null);
+ const parentComponentRef = useRef();
useEffect(() => {
- const wrapper = ref.current;
+ parentComponentRef.current = document.querySelector(`#${component}`) as HTMLDivElement;
const openMenu = () => setOpen(true);
const closeMenu = () => setOpen(false);
- (document.querySelector(`#${component}`) as HTMLElement)?.addEventListener(
+ parentComponentRef.current?.addEventListener(
'mouseenter',
openMenu
);
- ref.current?.addEventListener('mouseleave', closeMenu);
+ parentComponentRef.current?.addEventListener(
+ 'mouseleave',
+ closeMenu
+ );
return () => {
- (document.querySelector(
- `#${component}`
- ) as HTMLElement)?.removeEventListener('mouseenter', openMenu);
- wrapper?.removeEventListener('mouseleave', closeMenu);
+ parentComponentRef.current?.removeEventListener('mouseenter', openMenu);
+ parentComponentRef.current?.removeEventListener('mouseleave', closeMenu);
};
-
- // eslint-disable-next-line
- }, [ref.current]);
+ }, []);
return (
{open && (
{items.map(({ label, action }) => (
- // eslint-disable-next-line
- {
if (action) {
diff --git a/src/components/FrontendFeatureCard/index.tsx b/src/components/FrontendFeatureCard/index.tsx
index c0bcb34..3893a19 100644
--- a/src/components/FrontendFeatureCard/index.tsx
+++ b/src/components/FrontendFeatureCard/index.tsx
@@ -1,53 +1,60 @@
+import { Handle, Position } from 'reactflow';
import { Box, Text } from '..';
import { FeatureOutput } from '../../graphql/types';
type FrontendFeatureCardProps = {
- feature: FeatureOutput;
+ data: FeatureOutput;
+ isConnectable?: boolean;
className?: string;
};
const FrontendFeatureCard = ({
- feature,
+ data,
+ isConnectable = false,
className,
}: FrontendFeatureCardProps) => {
return (
-
-
-
-
- {feature.name}
-
+ <>
+
+
+
+
+
+ {data.name}
+
+
+
+
+ {data.wireframes?.map((wireframe) => (
+
+ ))}
-
- {feature.wireframes?.map((wireframe) => (
-
- ))}
-
-
+
+ >
);
};
diff --git a/src/components/IconButton/index.tsx b/src/components/IconButton/index.tsx
index a6fe950..3ca7a2c 100644
--- a/src/components/IconButton/index.tsx
+++ b/src/components/IconButton/index.tsx
@@ -3,7 +3,7 @@ import { Wrapper } from './styles';
type IconButtonProps = {
color?: 'client' | 'productOwner' | 'developer' | 'admin';
size?: 'small' | 'medium' | 'big';
- icon?: React.SVGProps;
+ icon?: React.FunctionComponentElement>;
onClick: () => void;
};
diff --git a/src/components/IconButton/styles.ts b/src/components/IconButton/styles.ts
index ac7891a..0e97323 100644
--- a/src/components/IconButton/styles.ts
+++ b/src/components/IconButton/styles.ts
@@ -3,7 +3,7 @@ import styled, { css } from 'styled-components';
type WrapperProps = {
color?: 'client' | 'productOwner' | 'developer' | 'admin';
size?: 'small' | 'medium' | 'big';
- icon?: React.SVGProps;
+ icon?: React.FunctionComponentElement>;
};
export const Wrapper = styled.button`
diff --git a/src/components/Link/index.tsx b/src/components/Link/index.tsx
index 6fdd3b3..cdf1bd8 100644
--- a/src/components/Link/index.tsx
+++ b/src/components/Link/index.tsx
@@ -18,7 +18,7 @@ type LinkProps = {
| string;
selected?: boolean;
className?: string;
- iconLeft?: React.SVGProps;
+ iconLeft?: React.FunctionComponentElement>;
onClick?: () => void;
target?: '_self' | '_blank';
};
diff --git a/src/components/Menu/index.tsx b/src/components/Menu/index.tsx
index b7fbcfa..127981f 100644
--- a/src/components/Menu/index.tsx
+++ b/src/components/Menu/index.tsx
@@ -5,7 +5,7 @@ import { Text } from '..';
type MenuProps = {
className?: string;
items: Array<{
- icon: React.SVGProps;
+ icon: React.FunctionComponentElement>;
avoid?: boolean;
label: string;
action?: () => void;
@@ -15,45 +15,38 @@ type MenuProps = {
const Menu = ({ items, component, className }: MenuProps) => {
const [open, setOpen] = useState(false);
- const ref = useRef(null);
+ const componentRef = useRef(null);
+ const parentComponentRef = useRef();
+
+ const openMenu = () => setOpen(true);
+ const closeMenu = () => setOpen(false);
useEffect(() => {
- const wrapper = ref.current;
+ parentComponentRef.current = document.querySelector(`#${component}`) as HTMLDivElement;
- const openMenu = () => setOpen(true);
- const closeMenu = () => setOpen(false);
-
- (document.querySelector(`#${component}`) as HTMLElement)?.addEventListener(
- 'mouseenter',
- openMenu
- );
- ref.current?.addEventListener('mouseleave', closeMenu);
+ parentComponentRef.current?.addEventListener('mouseenter', openMenu);
+ componentRef.current?.addEventListener('mouseleave', closeMenu);
return () => {
- (document.querySelector(
- `#${component}`
- ) as HTMLElement)?.removeEventListener('mouseenter', openMenu);
- wrapper?.addEventListener('mouseleave', closeMenu);
+ parentComponentRef.current?.removeEventListener('mouseenter', openMenu);
+ componentRef.current?.removeEventListener('mouseleave', closeMenu);
};
-
- // eslint-disable-next-line
- }, [ref.current]);
+ }, []);
return (
{open && (
{items.map(({ icon, label, avoid, action }) => (
- // eslint-disable-next-line
- {
if (action) {
diff --git a/src/components/MessagingSidebar/index.tsx b/src/components/MessagingSidebar/index.tsx
index 23c926d..6b650ad 100644
--- a/src/components/MessagingSidebar/index.tsx
+++ b/src/components/MessagingSidebar/index.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react';
-import { useHistory, useLocation } from 'react-router';
+import { useNavigate, useLocation } from 'react-router';
import { useReactiveVar } from '@apollo/client';
import { roleVar } from '../../graphql/state';
import { Box, Button, Text } from '..';
@@ -20,7 +20,7 @@ type MessagingSidebarProps = {
const MessagingSidebar = ({ onClose }: MessagingSidebarProps) => {
const role = useReactiveVar(roleVar);
const location = useLocation();
- const history = useHistory();
+ const navigate = useNavigate();
const [projectThreads, setProjectThreads] = useState>();
useEffect(() => {
@@ -65,9 +65,7 @@ const MessagingSidebar = ({ onClose }: MessagingSidebarProps) => {
iconLeft={}
onClick={() => {
onClose();
- history.push(
- `/support-messaging/${location.pathname.split('/')[2]}`
- );
+ navigate(`/support-messaging/${location.pathname.split('/')[2]}`);
}}
/>
@@ -87,7 +85,7 @@ const MessagingSidebar = ({ onClose }: MessagingSidebarProps) => {
borderRadius='10px'
onClick={() => {
onClose();
- history.push(
+ navigate(
`/support-messaging/${location.pathname.split('/')[2]}/${
thread.id
}`
diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx
index 85cdaa1..935372d 100644
--- a/src/components/Navbar/index.tsx
+++ b/src/components/Navbar/index.tsx
@@ -1,5 +1,5 @@
import { useReactiveVar } from '@apollo/client';
-import { useHistory, useLocation } from 'react-router';
+import { useNavigate, useLocation } from 'react-router';
import { roleVar, tokenVar, userVar } from '../../graphql/state';
import { Wrapper } from './styles';
import { Avatar, Link, Menu, Text } from '..';
@@ -8,7 +8,7 @@ import { Settings, Logout, Logo } from '../../assets';
const Navbar = () => {
const user = useReactiveVar(userVar);
const role = useReactiveVar(roleVar);
- const history = useHistory();
+ const navigate = useNavigate();
const location = useLocation();
return (
@@ -151,7 +151,7 @@ const Navbar = () => {
{
icon: ,
label: 'Settings',
- action: () => history.push('/settings'),
+ action: () => navigate('/settings'),
},
{
icon: ,
@@ -159,7 +159,7 @@ const Navbar = () => {
action: () => {
tokenVar(undefined);
localStorage.removeItem('token');
- history.push('/login');
+ navigate('/login');
},
avoid: true,
},
diff --git a/src/components/Protected/index.tsx b/src/components/Protected/index.tsx
new file mode 100644
index 0000000..04abfe3
--- /dev/null
+++ b/src/components/Protected/index.tsx
@@ -0,0 +1,19 @@
+import { useReactiveVar } from '@apollo/client';
+import { Navigate } from 'react-router-dom';
+import { tokenVar } from '../../graphql/state';
+
+type Props = {
+ children: React.ReactNode;
+};
+
+const Protected = ({ children }: Props) => {
+ const token = useReactiveVar(tokenVar);
+
+ return (
+ <>
+ {token ? children : }
+ >
+ );
+};
+
+export default Protected;
diff --git a/src/components/ProtectedRoute/index.tsx b/src/components/ProtectedRoute/index.tsx
deleted file mode 100644
index 9c709e9..0000000
--- a/src/components/ProtectedRoute/index.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { useReactiveVar } from '@apollo/client';
-import { Redirect, Route, RouteProps } from 'react-router-dom';
-import { tokenVar } from '../../graphql/state';
-
-const ProtectedRoute: React.FC = ({ children, ...rest }) => {
- const token = useReactiveVar(tokenVar);
-
- return (
- (token ? children : )}
- />
- );
-};
-
-export default ProtectedRoute;
diff --git a/src/components/Public/index.tsx b/src/components/Public/index.tsx
new file mode 100644
index 0000000..fac62d5
--- /dev/null
+++ b/src/components/Public/index.tsx
@@ -0,0 +1,19 @@
+import { useReactiveVar } from '@apollo/client';
+import { Navigate } from 'react-router-dom';
+import { tokenVar } from '../../graphql/state';
+
+type Props = {
+ children: React.ReactNode;
+};
+
+const Public = ({ children }: Props) => {
+ const token = useReactiveVar(tokenVar);
+
+ return (
+ <>
+ {!token ? children : }
+ >
+ );
+};
+
+export default Public;
diff --git a/src/components/SectionSelector/index.tsx b/src/components/SectionSelector/index.tsx
index 4c97847..ba7c21e 100644
--- a/src/components/SectionSelector/index.tsx
+++ b/src/components/SectionSelector/index.tsx
@@ -1,7 +1,7 @@
import { Wrapper } from './styles';
type SectionSelectorProps = {
- icon: React.SVGProps;
+ icon: React.FunctionComponentElement>;
text: string;
color: 'client' | 'productOwner' | 'developer' | 'admin';
selected?: boolean;
diff --git a/src/components/SectionSelector/styles.ts b/src/components/SectionSelector/styles.ts
index 8adf53e..fb59760 100644
--- a/src/components/SectionSelector/styles.ts
+++ b/src/components/SectionSelector/styles.ts
@@ -1,7 +1,7 @@
import styled, { css } from 'styled-components';
type WrapperProps = {
- icon: React.SVGProps;
+ icon: React.FunctionComponentElement>;
color: 'client' | 'productOwner' | 'developer' | 'admin';
selected: boolean;
disabled: boolean;
diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx
index 61a8aaa..235d61e 100644
--- a/src/components/Sidebar/index.tsx
+++ b/src/components/Sidebar/index.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react';
-import { useHistory, useLocation } from 'react-router';
+import { useNavigate, useLocation } from 'react-router';
import { useLazyQuery, useReactiveVar } from '@apollo/client';
import { roleVar, userVar } from '../../graphql/state';
import {
@@ -39,14 +39,13 @@ const Sidebar = () => {
const role = useReactiveVar(roleVar);
const currentUser = useReactiveVar(userVar);
const location = useLocation();
- const history = useHistory();
+ const navigate = useNavigate();
const [projects, setProjects] = useState>();
const [templates, setTemplates] = useState>();
const [features, setFeatures] = useState>();
const [categories, setCategories] = useState>();
- const [messagingSidebarOpen, setMessagingSidebarOpen] = useState(
- false
- );
+ const [messagingSidebarOpen, setMessagingSidebarOpen] =
+ useState(false);
const [getProjectsByClientId] = useLazyQuery<
GetAllProjectsByClientIdQuery,
@@ -143,7 +142,7 @@ const Sidebar = () => {
location.pathname
)}
text={project.name[0]}
- onClick={() => history.push(`/project/${project.id}`)}
+ onClick={() => navigate(`/project/${project.id}`)}
/>
{
(index === 0 && location.pathname === '/template')
}
text={template.name[0]}
- onClick={() => history.push(`/template/${template.id}`)}
+ onClick={() => navigate(`/template/${template.id}`)}
/>
{
(index === 0 && location.pathname === '/feature')
}
text={feature.name[0]}
- onClick={() => history.push(`/feature/${feature.id}`)}
+ onClick={() => navigate(`/feature/${feature.id}`)}
/>
{
(index === 0 && location.pathname === '/category')
}
text={category.name[0]}
- onClick={() => history.push(`/category/${category.id}`)}
+ onClick={() => navigate(`/category/${category.id}`)}
/>
{
color={role}
onClick={() => {
if (/project/i.test(location.pathname)) {
- history.push('/add-project');
+ navigate('/add-project');
}
if (/template/i.test(location.pathname)) {
- history.push('/add-template');
+ navigate('/add-template');
}
if (/feature/i.test(location.pathname)) {
- history.push('/add-feature');
+ navigate('/add-feature');
}
if (/category/i.test(location.pathname)) {
- history.push('/add-category');
+ navigate('/add-category');
}
}}
/>
diff --git a/src/components/Sidebar/styles.ts b/src/components/Sidebar/styles.ts
index 5f4d7c0..e4ac6e8 100644
--- a/src/components/Sidebar/styles.ts
+++ b/src/components/Sidebar/styles.ts
@@ -17,4 +17,9 @@ export const Wrapper = styled.div`
grid-template-rows: 1fr auto;
justify-content: center;
padding: 55px 0px;
+ overflow-y: scroll;
+
+ &::-webkit-scrollbar {
+ width: 1px;
+ }
`;
diff --git a/src/components/index.tsx b/src/components/index.tsx
index f1545f3..bb8929c 100644
--- a/src/components/index.tsx
+++ b/src/components/index.tsx
@@ -15,8 +15,8 @@ import CheckBox from './CheckBox';
import Menu from './Menu';
import Navbar from './Navbar';
import Sidebar from './Sidebar';
-import ProtectedRoute from './ProtectedRoute';
-import AuthRoute from './AuthRoute';
+import Protected from './Protected';
+import Public from './Public';
import SectionSelector from './SectionSelector';
import Modal from './Modal';
import SidebarItem from './SidebarItem';
@@ -48,8 +48,8 @@ export {
CheckBox,
Navbar,
Sidebar,
- ProtectedRoute,
- AuthRoute,
+ Protected,
+ Public,
SectionSelector,
Modal,
SidebarItem,
diff --git a/src/graphql/types.support.ts b/src/graphql/types.support.ts
index 9203ece..cf7a682 100644
--- a/src/graphql/types.support.ts
+++ b/src/graphql/types.support.ts
@@ -1,7 +1,13 @@
export type Maybe = T | null;
-export type Exact = { [K in keyof T]: T[K] };
-export type MakeOptional = Omit & { [SubKey in K]?: Maybe };
-export type MakeMaybe = Omit & { [SubKey in K]: Maybe };
+export type Exact = {
+ [K in keyof T]: T[K];
+};
+export type MakeOptional = Omit & {
+ [SubKey in K]?: Maybe;
+};
+export type MakeMaybe = Omit & {
+ [SubKey in K]: Maybe;
+};
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: string;
@@ -11,7 +17,6 @@ export type Scalars = {
Float: number;
};
-
export type MutationRoot = {
__typename?: 'MutationRoot';
createThread: Scalars['ID'];
@@ -19,27 +24,23 @@ export type MutationRoot = {
sendMsg: Scalars['ID'];
};
-
export type MutationRootCreateThreadArgs = {
projectId: Scalars['String'];
title: Scalars['String'];
threadDescription: Scalars['String'];
};
-
export type MutationRootDeleteThreadArgs = {
threadId: Scalars['String'];
};
-
export type MutationRootSendMsgArgs = {
threadId: Scalars['String'];
username: Scalars['String'];
msg: Scalars['String'];
};
-export type MutationType =
- | 'CREATED';
+export type MutationType = 'CREATED';
export type QueryRoot = {
__typename?: 'QueryRoot';
@@ -48,17 +49,14 @@ export type QueryRoot = {
getThreadById: ThreadObject;
};
-
export type QueryRootMessagesArgs = {
threadId: Scalars['String'];
};
-
export type QueryRootGetProjectThreadsArgs = {
projectId: Scalars['String'];
};
-
export type QueryRootGetThreadByIdArgs = {
threadId: Scalars['String'];
};
@@ -75,7 +73,6 @@ export type SubscriptionRoot = {
connectStream: StreamChanged;
};
-
export type SubscriptionRootConnectStreamArgs = {
mutationType?: Maybe;
};
@@ -105,48 +102,46 @@ export type GetProjectThreadsQueryVariables = Exact<{
projectId: Scalars['String'];
}>;
-
-export type GetProjectThreadsQuery = (
- { __typename?: 'QueryRoot' }
- & { getProjectThreads: Array<(
- { __typename?: 'ThreadObject' }
- & Pick
- & { userMessages: Array<(
- { __typename?: 'UserMessage' }
- & Pick
- )> }
- )> }
-);
+export type GetProjectThreadsQuery = { __typename?: 'QueryRoot' } & {
+ getProjectThreads: Array<
+ { __typename?: 'ThreadObject' } & Pick<
+ ThreadObject,
+ 'id' | 'title' | 'threadDescription'
+ > & {
+ userMessages: Array<
+ { __typename?: 'UserMessage' } & Pick<
+ UserMessage,
+ 'username' | 'text'
+ >
+ >;
+ }
+ >;
+};
export type GetThreadByIdQueryVariables = Exact<{
threadId: Scalars['String'];
}>;
-
-export type GetThreadByIdQuery = (
- { __typename?: 'QueryRoot' }
- & { getThreadById: (
- { __typename?: 'ThreadObject' }
- & Pick
- & { userMessages: Array<(
- { __typename?: 'UserMessage' }
- & Pick
- )> }
- ) }
-);
+export type GetThreadByIdQuery = { __typename?: 'QueryRoot' } & {
+ getThreadById: { __typename?: 'ThreadObject' } & Pick<
+ ThreadObject,
+ 'id' | 'title' | 'threadDescription'
+ > & {
+ userMessages: Array<
+ { __typename?: 'UserMessage' } & Pick
+ >;
+ };
+};
export type MessagesQueryVariables = Exact<{
threadId: Scalars['String'];
}>;
-
-export type MessagesQuery = (
- { __typename?: 'QueryRoot' }
- & { messages: Array<(
- { __typename?: 'UserMessage' }
- & Pick
- )> }
-);
+export type MessagesQuery = { __typename?: 'QueryRoot' } & {
+ messages: Array<
+ { __typename?: 'UserMessage' } & Pick
+ >;
+};
export type CreateThreadMutationVariables = Exact<{
projectId: Scalars['String'];
@@ -154,11 +149,10 @@ export type CreateThreadMutationVariables = Exact<{
threadDescription: Scalars['String'];
}>;
-
-export type CreateThreadMutation = (
- { __typename?: 'MutationRoot' }
- & Pick
-);
+export type CreateThreadMutation = { __typename?: 'MutationRoot' } & Pick<
+ MutationRoot,
+ 'createThread'
+>;
export type SendMsgMutationVariables = Exact<{
threadId: Scalars['String'];
@@ -166,25 +160,25 @@ export type SendMsgMutationVariables = Exact<{
msg: Scalars['String'];
}>;
-
-export type SendMsgMutation = (
- { __typename?: 'MutationRoot' }
- & Pick
-);
+export type SendMsgMutation = { __typename?: 'MutationRoot' } & Pick<
+ MutationRoot,
+ 'sendMsg'
+>;
export type ConnectStreamSubscriptionVariables = Exact<{
mutationType?: Maybe;
}>;
-
-export type ConnectStreamSubscription = (
- { __typename?: 'SubscriptionRoot' }
- & { connectStream: (
- { __typename?: 'StreamChanged' }
- & Pick
- & { userMessage?: Maybe<(
- { __typename?: 'UserMessageObject' }
- & Pick
- )> }
- ) }
-);
+export type ConnectStreamSubscription = { __typename?: 'SubscriptionRoot' } & {
+ connectStream: { __typename?: 'StreamChanged' } & Pick<
+ StreamChanged,
+ 'mutationType' | 'id'
+ > & {
+ userMessage?: Maybe<
+ { __typename?: 'UserMessageObject' } & Pick<
+ UserMessageObject,
+ 'id' | 'username' | 'text'
+ >
+ >;
+ };
+};
diff --git a/src/graphql/types.ts b/src/graphql/types.ts
index 1aea53f..c761dc2 100644
--- a/src/graphql/types.ts
+++ b/src/graphql/types.ts
@@ -1,7 +1,13 @@
export type Maybe = T | null;
-export type Exact = { [K in keyof T]: T[K] };
-export type MakeOptional = Omit & { [SubKey in K]?: Maybe };
-export type MakeMaybe = Omit & { [SubKey in K]: Maybe };
+export type Exact = {
+ [K in keyof T]: T[K];
+};
+export type MakeOptional = Omit & {
+ [SubKey in K]?: Maybe;
+};
+export type MakeMaybe = Omit & {
+ [SubKey in K]: Maybe;
+};
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: string;
@@ -11,7 +17,6 @@ export type Scalars = {
Float: number;
};
-
export type AddressInput = {
place: Scalars['String'];
city: Scalars['String'];
@@ -175,168 +180,138 @@ export type MutationRoot = {
addProjectDesign: ProjectOutput;
};
-
export type MutationRootSignupArgs = {
email: Scalars['String'];
password: Scalars['String'];
};
-
export type MutationRootCreateUserArgs = {
user: UserInput;
};
-
export type MutationRootLoginArgs = {
email: Scalars['String'];
password: Scalars['String'];
};
-
export type MutationRootDeleteUserArgs = {
id: Scalars['String'];
password: Scalars['String'];
};
-
export type MutationRootUpdateUserInfoArgs = {
user: UpdateUserInput;
};
-
export type MutationRootUpdateUserPasswordArgs = {
id: Scalars['String'];
password: PasswordInput;
};
-
export type MutationRootResetUserPasswordArgs = {
email: Scalars['String'];
};
-
export type MutationRootConfirmUserResetPasswordArgs = {
id: Scalars['String'];
password: Scalars['String'];
};
-
export type MutationRootDeleteCategoryArgs = {
id: Scalars['String'];
};
-
export type MutationRootDeleteFeatureArgs = {
id: Scalars['String'];
};
-
export type MutationRootDeleteTemplateArgs = {
id: Scalars['String'];
};
-
export type MutationRootUpdateTemplateFeaturesArgs = {
id: Scalars['String'];
featuresId: Array;
};
-
export type MutationRootAddTemplateSpecificationArgs = {
id: Scalars['String'];
specification: SpecificationInput;
};
-
export type MutationRootAddCategoryArgs = {
category: CategoryInput;
};
-
export type MutationRootUpdateCategoryArgs = {
id: Scalars['String'];
category: CategoryInput;
};
-
export type MutationRootAddFeatureArgs = {
feature: FeatureInput;
};
-
export type MutationRootUpdateFeatureArgs = {
id: Scalars['String'];
feature: FeatureInput;
};
-
export type MutationRootDeleteFeatureWireframeArgs = {
id: Scalars['String'];
};
-
export type MutationRootAddFeatureWireframesArgs = {
id: Scalars['String'];
wireframes: Array;
};
-
export type MutationRootAddTemplateArgs = {
template: TemplateInput;
};
-
export type MutationRootUpdateTemplateArgs = {
id: Scalars['String'];
template: TemplateUpdateInput;
specification?: Maybe;
};
-
export type MutationRootAddPrototypeArgs = {
prototype: TemplateProtoTypeInput;
};
-
export type MutationRootUpdatePrototypeArgs = {
prototype: TemplateProtoTypeInput;
};
-
export type MutationRootAddProjectArgs = {
project: ProjectInput;
};
-
export type MutationRootChangeProjectStateArgs = {
id: Scalars['String'];
state: State;
};
-
export type MutationRootUpdateProjectArgs = {
id: Scalars['String'];
name: Scalars['String'];
image: InputFile;
};
-
export type MutationRootAddProjectProposalArgs = {
id: Scalars['String'];
proposal: ProposalInput;
};
-
export type MutationRootAddProjectMvpArgs = {
mvp: ProjectFileInput;
};
-
export type MutationRootAddProjectFullBuildArgs = {
fullBuild: ProjectFullBuildInput;
};
-
export type MutationRootAddProjectDesignArgs = {
design: ProjectFileInput;
};
@@ -487,42 +462,34 @@ export type QueryRoot = {
getCountryCode: Array;
};
-
export type QueryRootGetUserByIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetCategoryByIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetFeatureByIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetPrototypeByIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetTemplateByIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetProjectByIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetAllProjectsByClientIdArgs = {
id: Scalars['String'];
};
-
export type QueryRootGetAllTemplatesByCategoriesIdArgs = {
categories: Array;
};
@@ -570,11 +537,7 @@ export type SpecificationOutput = {
issuesList: Scalars['String'];
};
-export type State =
- | 'Approved'
- | 'Declined'
- | 'OnReview'
- | 'Archived';
+export type State = 'Approved' | 'Declined' | 'OnReview' | 'Archived';
export type TemplateDefactoredOutput = {
__typename?: 'TemplateDefactoredOutput';
@@ -664,865 +627,1053 @@ export type UserOutput = {
role: Scalars['String'];
};
-export type GetAllUsersQueryVariables = Exact<{ [key: string]: never; }>;
+export type GetAllUsersQueryVariables = Exact<{ [key: string]: never }>;
-
-export type GetAllUsersQuery = (
- { __typename?: 'QueryRoot' }
- & { getAllUsers: Array<(
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- )> }
-);
+export type GetAllUsersQuery = { __typename?: 'QueryRoot' } & {
+ getAllUsers: Array<
+ { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ }
+ >;
+};
export type GetUserByIdQueryVariables = Exact<{
id: Scalars['String'];
}>;
-
-export type GetUserByIdQuery = (
- { __typename?: 'QueryRoot' }
- & { getUserById: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type GetUserByIdQuery = { __typename?: 'QueryRoot' } & {
+ getUserById: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
export type CreateUserMutationVariables = Exact<{
user: UserInput;
}>;
-
-export type CreateUserMutation = (
- { __typename?: 'MutationRoot' }
- & { createUser: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type CreateUserMutation = { __typename?: 'MutationRoot' } & {
+ createUser: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
export type SignupMutationVariables = Exact<{
email: Scalars['String'];
password: Scalars['String'];
}>;
-
-export type SignupMutation = (
- { __typename?: 'MutationRoot' }
- & { signup: (
- { __typename?: 'UserAuthenticationOutput' }
- & Pick
- & { user: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
- ) }
-);
+export type SignupMutation = { __typename?: 'MutationRoot' } & {
+ signup: { __typename?: 'UserAuthenticationOutput' } & Pick<
+ UserAuthenticationOutput,
+ 'token'
+ > & {
+ user: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+ };
+};
export type LoginMutationVariables = Exact<{
email: Scalars['String'];
password: Scalars['String'];
}>;
-
-export type LoginMutation = (
- { __typename?: 'MutationRoot' }
- & { login: (
- { __typename?: 'UserAuthenticationOutput' }
- & Pick
- & { user: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
- ) }
-);
+export type LoginMutation = { __typename?: 'MutationRoot' } & {
+ login: { __typename?: 'UserAuthenticationOutput' } & Pick<
+ UserAuthenticationOutput,
+ 'token'
+ > & {
+ user: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+ };
+};
export type ResetPasswordMutationVariables = Exact<{
email: Scalars['String'];
}>;
-
-export type ResetPasswordMutation = (
- { __typename?: 'MutationRoot' }
- & { resetUserPassword: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type ResetPasswordMutation = { __typename?: 'MutationRoot' } & {
+ resetUserPassword: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
export type ConfirmUserResetPasswordMutationVariables = Exact<{
id: Scalars['String'];
password: Scalars['String'];
}>;
-
-export type ConfirmUserResetPasswordMutation = (
- { __typename?: 'MutationRoot' }
- & { confirmUserResetPassword: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type ConfirmUserResetPasswordMutation = {
+ __typename?: 'MutationRoot';
+} & {
+ confirmUserResetPassword: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
export type UpdateUserInfoMutationVariables = Exact<{
user: UpdateUserInput;
}>;
-
-export type UpdateUserInfoMutation = (
- { __typename?: 'MutationRoot' }
- & { updateUserInfo: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type UpdateUserInfoMutation = { __typename?: 'MutationRoot' } & {
+ updateUserInfo: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
export type UpdateUserPasswordMutationVariables = Exact<{
id: Scalars['String'];
password: PasswordInput;
}>;
-
-export type UpdateUserPasswordMutation = (
- { __typename?: 'MutationRoot' }
- & { updateUserPassword: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type UpdateUserPasswordMutation = { __typename?: 'MutationRoot' } & {
+ updateUserPassword: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
export type DeleteUserMutationVariables = Exact<{
id: Scalars['String'];
password: Scalars['String'];
}>;
+export type DeleteUserMutation = { __typename?: 'MutationRoot' } & {
+ deleteUser: { __typename?: 'UserOutput' } & Pick<
+ UserOutput,
+ 'id' | 'email' | 'firstName' | 'lastName' | 'role'
+ > & {
+ phone: { __typename?: 'PhoneOutput' } & Pick<
+ PhoneOutput,
+ 'prefix' | 'number'
+ >;
+ address: { __typename?: 'AddressOutput' } & Pick<
+ AddressOutput,
+ 'place' | 'city' | 'country' | 'zip'
+ >;
+ };
+};
-export type DeleteUserMutation = (
- { __typename?: 'MutationRoot' }
- & { deleteUser: (
- { __typename?: 'UserOutput' }
- & Pick
- & { phone: (
- { __typename?: 'PhoneOutput' }
- & Pick
- ), address: (
- { __typename?: 'AddressOutput' }
- & Pick
- ) }
- ) }
-);
+export type GetCountryCodesQueryVariables = Exact<{ [key: string]: never }>;
-export type GetCountryCodesQueryVariables = Exact<{ [key: string]: never; }>;
+export type GetCountryCodesQuery = { __typename?: 'QueryRoot' } & {
+ getCountryCode: Array<
+ { __typename?: 'CountryPrefixModel' } & Pick<
+ CountryPrefixModel,
+ 'prefix' | 'country'
+ >
+ >;
+};
+export type GetAllCategoriesQueryVariables = Exact<{ [key: string]: never }>;
-export type GetCountryCodesQuery = (
- { __typename?: 'QueryRoot' }
- & { getCountryCode: Array<(
- { __typename?: 'CountryPrefixModel' }
- & Pick
- )> }
-);
-
-export type GetAllCategoriesQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type GetAllCategoriesQuery = (
- { __typename?: 'QueryRoot' }
- & { getAllCategories: Array<(
- { __typename?: 'CategoryOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ) }
- )> }
-);
+export type GetAllCategoriesQuery = { __typename?: 'QueryRoot' } & {
+ getAllCategories: Array<
+ { __typename?: 'CategoryOutput' } & Pick<
+ CategoryOutput,
+ 'id' | 'name' | 'description'
+ > & { image: { __typename?: 'File' } & Pick }
+ >;
+};
export type GetCategoryByIdQueryVariables = Exact<{
id: Scalars['String'];
}>;
-
-export type GetCategoryByIdQuery = (
- { __typename?: 'QueryRoot' }
- & { getCategoryById: (
- { __typename?: 'CategoryOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ) }
- ) }
-);
+export type GetCategoryByIdQuery = { __typename?: 'QueryRoot' } & {
+ getCategoryById: { __typename?: 'CategoryOutput' } & Pick<
+ CategoryOutput,
+ 'id' | 'name' | 'description'
+ > & { image: { __typename?: 'File' } & Pick };
+};
export type AddCategoryMutationVariables = Exact<{
category: CategoryInput;
}>;
-
-export type AddCategoryMutation = (
- { __typename?: 'MutationRoot' }
- & { addCategory: (
- { __typename?: 'CategoryOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ) }
- ) }
-);
+export type AddCategoryMutation = { __typename?: 'MutationRoot' } & {
+ addCategory: { __typename?: 'CategoryOutput' } & Pick<
+ CategoryOutput,
+ 'id' | 'name' | 'description'
+ > & { image: { __typename?: 'File' } & Pick };
+};
export type UpdateCategoryMutationVariables = Exact<{
id: Scalars['String'];
category: CategoryInput;
}>;
-
-export type UpdateCategoryMutation = (
- { __typename?: 'MutationRoot' }
- & { updateCategory: (
- { __typename?: 'CategoryOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ) }
- ) }
-);
+export type UpdateCategoryMutation = { __typename?: 'MutationRoot' } & {
+ updateCategory: { __typename?: 'CategoryOutput' } & Pick<
+ CategoryOutput,
+ 'id' | 'name' | 'description'
+ > & { image: { __typename?: 'File' } & Pick };
+};
export type DeleteCategoryMutationVariables = Exact<{
id: Scalars['String'];
}>;
+export type DeleteCategoryMutation = { __typename?: 'MutationRoot' } & {
+ deleteCategory: { __typename?: 'CategoryOutput' } & Pick<
+ CategoryOutput,
+ 'id' | 'name' | 'description'
+ > & { image: { __typename?: 'File' } & Pick };
+};
-export type DeleteCategoryMutation = (
- { __typename?: 'MutationRoot' }
- & { deleteCategory: (
- { __typename?: 'CategoryOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ) }
- ) }
-);
+export type GetAllFeaturesQueryVariables = Exact<{ [key: string]: never }>;
-export type GetAllFeaturesQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type GetAllFeaturesQuery = (
- { __typename?: 'QueryRoot' }
- & { getAllFeatures: Array<(
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- )> }
-);
+export type GetAllFeaturesQuery = { __typename?: 'QueryRoot' } & {
+ getAllFeatures: Array<
+ { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ }
+ >;
+};
export type GetFeatureByIdQueryVariables = Exact<{
id: Scalars['String'];
}>;
-
-export type GetFeatureByIdQuery = (
- { __typename?: 'QueryRoot' }
- & { getFeatureById: (
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- ) }
-);
+export type GetFeatureByIdQuery = { __typename?: 'QueryRoot' } & {
+ getFeatureById: { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ };
+};
export type AddFeatureMutationVariables = Exact<{
feature: FeatureInput;
}>;
-
-export type AddFeatureMutation = (
- { __typename?: 'MutationRoot' }
- & { addFeature: (
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- ) }
-);
+export type AddFeatureMutation = { __typename?: 'MutationRoot' } & {
+ addFeature: { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ };
+};
export type UpdateFeatureMutationVariables = Exact<{
id: Scalars['String'];
feature: FeatureInput;
}>;
-
-export type UpdateFeatureMutation = (
- { __typename?: 'MutationRoot' }
- & { updateFeature: (
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- ) }
-);
+export type UpdateFeatureMutation = { __typename?: 'MutationRoot' } & {
+ updateFeature: { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ };
+};
export type DeleteFeatureMutationVariables = Exact<{
id: Scalars['String'];
}>;
-
-export type DeleteFeatureMutation = (
- { __typename?: 'MutationRoot' }
- & { deleteFeature: (
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- ) }
-);
+export type DeleteFeatureMutation = { __typename?: 'MutationRoot' } & {
+ deleteFeature: { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ };
+};
export type AddFeatureWireframesMutationVariables = Exact<{
id: Scalars['String'];
wireframes: Array | InputFile;
}>;
-
-export type AddFeatureWireframesMutation = (
- { __typename?: 'MutationRoot' }
- & { addFeatureWireframes: (
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- ) }
-);
+export type AddFeatureWireframesMutation = { __typename?: 'MutationRoot' } & {
+ addFeatureWireframes: { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ };
+};
export type DeleteFeatureWireframeMutationVariables = Exact<{
id: Scalars['String'];
}>;
+export type DeleteFeatureWireframeMutation = { __typename?: 'MutationRoot' } & {
+ deleteFeatureWireframe: { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ };
+};
-export type DeleteFeatureWireframeMutation = (
- { __typename?: 'MutationRoot' }
- & { deleteFeatureWireframe: (
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- ) }
-);
+export type GetAllProjectsQueryVariables = Exact<{ [key: string]: never }>;
-export type GetAllProjectsQueryVariables = Exact<{ [key: string]: never; }>;
-
-
-export type GetAllProjectsQuery = (
- { __typename?: 'QueryRoot' }
- & { getAllProjects: Array<(
- { __typename?: 'ProjectOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), template: (
- { __typename?: 'TemplateOutput' }
- & Pick
- & { features?: Maybe
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- )>>, image: (
- { __typename?: 'File' }
- & Pick
- ), specification?: Maybe<(
- { __typename?: 'SpecificationOutput' }
- & Pick
- & { introduction: (
- { __typename?: 'IntroductionOutput' }
- & Pick
- ), overallDescription: (
- { __typename?: 'OverallDescriptionOutput' }
- & Pick
- ), nonFunctionalRequirements: (
- { __typename?: 'NonFunctionalRequirementsOutput' }
- & Pick
- ) }
- )> }
- ), features: Array<(
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- )>, proposal?: Maybe<(
- { __typename?: 'ProposalOutput' }
- & Pick
- & { devtime: (
- { __typename?: 'DevtimeOutput' }
- & Pick
- ), resources: Array<(
- { __typename?: 'ResourceOutput' }
- & Pick
- )> }
- )>, paymentOption: (
- { __typename?: 'PaymentOptionOutput' }
- & Pick
- ), delivrable?: Maybe<(
- { __typename?: 'DelivrableOutput' }
- & Pick
- & { specification: (
- { __typename?: 'File' }
- & Pick
- ), mvp: (
- { __typename?: 'File' }
- & Pick
- ), design: (
- { __typename?: 'File' }
- & Pick
- ) }
- )> }
- )> }
-);
+export type GetAllProjectsQuery = { __typename?: 'QueryRoot' } & {
+ getAllProjects: Array<
+ { __typename?: 'ProjectOutput' } & Pick<
+ ProjectOutput,
+ 'id' | 'clientId' | 'name' | 'platforms' | 'state' | 'totalPrice'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ template: { __typename?: 'TemplateOutput' } & Pick<
+ TemplateOutput,
+ 'id' | 'name' | 'description' | 'category'
+ > & {
+ features?: Maybe<
+ Array<
+ { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ | 'id'
+ | 'name'
+ | 'description'
+ | 'featureType'
+ | 'price'
+ | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ }
+ >
+ >;
+ image: { __typename?: 'File' } & Pick;
+ specification?: Maybe<
+ { __typename?: 'SpecificationOutput' } & Pick<
+ SpecificationOutput,
+ | 'otherRequirements'
+ | 'glossary'
+ | 'analysisModels'
+ | 'issuesList'
+ > & {
+ introduction: { __typename?: 'IntroductionOutput' } & Pick<
+ IntroductionOutput,
+ | 'purpose'
+ | 'documentConventions'
+ | 'intendedAudience'
+ | 'projectScope'
+ >;
+ overallDescription: {
+ __typename?: 'OverallDescriptionOutput';
+ } & Pick<
+ OverallDescriptionOutput,
+ | 'perspective'
+ | 'userCharacteristics'
+ | 'operatingEnvironment'
+ | 'designImplementationConstraints'
+ | 'userDocumentation'
+ | 'assemptionsDependencies'
+ >;
+ nonFunctionalRequirements: {
+ __typename?: 'NonFunctionalRequirementsOutput';
+ } & Pick<
+ NonFunctionalRequirementsOutput,
+ | 'performanceRequirements'
+ | 'safetyRequirements'
+ | 'securityRequirements'
+ | 'softwareQualityAttributes'
+ >;
+ }
+ >;
+ };
+ features: Array<
+ { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ }
+ >;
+ proposal?: Maybe<
+ { __typename?: 'ProposalOutput' } & Pick<
+ ProposalOutput,
+ 'summary' | 'purpose'
+ > & {
+ devtime: { __typename?: 'DevtimeOutput' } & Pick<
+ DevtimeOutput,
+ 'months' | 'days' | 'hours'
+ >;
+ resources: Array<
+ { __typename?: 'ResourceOutput' } & Pick<
+ ResourceOutput,
+ 'resourceType' | 'developers'
+ >
+ >;
+ }
+ >;
+ paymentOption: { __typename?: 'PaymentOptionOutput' } & Pick<
+ PaymentOptionOutput,
+ 'optOne' | 'optTwo' | 'optThree'
+ >;
+ delivrable?: Maybe<
+ { __typename?: 'DelivrableOutput' } & Pick<
+ DelivrableOutput,
+ 'fullBuild'
+ > & {
+ specification: { __typename?: 'File' } & Pick<
+ File,
+ 'name' | 'src'
+ >;
+ mvp: { __typename?: 'File' } & Pick;
+ design: { __typename?: 'File' } & Pick;
+ }
+ >;
+ }
+ >;
+};
export type GetAllProjectsByClientIdQueryVariables = Exact<{
id: Scalars['String'];
}>;
-
-export type GetAllProjectsByClientIdQuery = (
- { __typename?: 'QueryRoot' }
- & { getAllProjectsByClientId: Array<(
- { __typename?: 'ProjectOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), template: (
- { __typename?: 'TemplateOutput' }
- & Pick
- & { features?: Maybe
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- )>>, image: (
- { __typename?: 'File' }
- & Pick
- ), specification?: Maybe<(
- { __typename?: 'SpecificationOutput' }
- & Pick
- & { introduction: (
- { __typename?: 'IntroductionOutput' }
- & Pick
- ), overallDescription: (
- { __typename?: 'OverallDescriptionOutput' }
- & Pick
- ), nonFunctionalRequirements: (
- { __typename?: 'NonFunctionalRequirementsOutput' }
- & Pick
- ) }
- )> }
- ), features: Array<(
- { __typename?: 'FeatureOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- )>, proposal?: Maybe<(
- { __typename?: 'ProposalOutput' }
- & Pick
- & { devtime: (
- { __typename?: 'DevtimeOutput' }
- & Pick
- ), resources: Array<(
- { __typename?: 'ResourceOutput' }
- & Pick
- )> }
- )>, paymentOption: (
- { __typename?: 'PaymentOptionOutput' }
- & Pick
- ), delivrable?: Maybe<(
- { __typename?: 'DelivrableOutput' }
- & Pick
- & { specification: (
- { __typename?: 'File' }
- & Pick
- ), mvp: (
- { __typename?: 'File' }
- & Pick
- ), design: (
- { __typename?: 'File' }
- & Pick
- ) }
- )> }
- )> }
-);
+export type GetAllProjectsByClientIdQuery = { __typename?: 'QueryRoot' } & {
+ getAllProjectsByClientId: Array<
+ { __typename?: 'ProjectOutput' } & Pick<
+ ProjectOutput,
+ 'id' | 'clientId' | 'name' | 'platforms' | 'state' | 'totalPrice'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ template: { __typename?: 'TemplateOutput' } & Pick<
+ TemplateOutput,
+ 'id' | 'name' | 'description' | 'category'
+ > & {
+ features?: Maybe<
+ Array<
+ { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ | 'id'
+ | 'name'
+ | 'description'
+ | 'featureType'
+ | 'price'
+ | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ }
+ >
+ >;
+ image: { __typename?: 'File' } & Pick;
+ specification?: Maybe<
+ { __typename?: 'SpecificationOutput' } & Pick<
+ SpecificationOutput,
+ | 'otherRequirements'
+ | 'glossary'
+ | 'analysisModels'
+ | 'issuesList'
+ > & {
+ introduction: { __typename?: 'IntroductionOutput' } & Pick<
+ IntroductionOutput,
+ | 'purpose'
+ | 'documentConventions'
+ | 'intendedAudience'
+ | 'projectScope'
+ >;
+ overallDescription: {
+ __typename?: 'OverallDescriptionOutput';
+ } & Pick<
+ OverallDescriptionOutput,
+ | 'perspective'
+ | 'userCharacteristics'
+ | 'operatingEnvironment'
+ | 'designImplementationConstraints'
+ | 'userDocumentation'
+ | 'assemptionsDependencies'
+ >;
+ nonFunctionalRequirements: {
+ __typename?: 'NonFunctionalRequirementsOutput';
+ } & Pick<
+ NonFunctionalRequirementsOutput,
+ | 'performanceRequirements'
+ | 'safetyRequirements'
+ | 'securityRequirements'
+ | 'softwareQualityAttributes'
+ >;
+ }
+ >;
+ };
+ features: Array<
+ { __typename?: 'FeatureOutput' } & Pick<
+ FeatureOutput,
+ 'id' | 'name' | 'description' | 'featureType' | 'price' | 'repo'
+ > & {
+ image: { __typename?: 'File' } & Pick;
+ wireframes?: Maybe<
+ Array<
+ { __typename?: 'FileWithOutOId' } & Pick<
+ FileWithOutOId,
+ 'id' | 'name' | 'src'
+ >
+ >
+ >;
+ }
+ >;
+ proposal?: Maybe<
+ { __typename?: 'ProposalOutput' } & Pick<
+ ProposalOutput,
+ 'summary' | 'purpose'
+ > & {
+ devtime: { __typename?: 'DevtimeOutput' } & Pick<
+ DevtimeOutput,
+ 'months' | 'days' | 'hours'
+ >;
+ resources: Array<
+ { __typename?: 'ResourceOutput' } & Pick<
+ ResourceOutput,
+ 'resourceType' | 'developers'
+ >
+ >;
+ }
+ >;
+ paymentOption: { __typename?: 'PaymentOptionOutput' } & Pick<
+ PaymentOptionOutput,
+ 'optOne' | 'optTwo' | 'optThree'
+ >;
+ delivrable?: Maybe<
+ { __typename?: 'DelivrableOutput' } & Pick<
+ DelivrableOutput,
+ 'fullBuild'
+ > & {
+ specification: { __typename?: 'File' } & Pick<
+ File,
+ 'name' | 'src'
+ >;
+ mvp: { __typename?: 'File' } & Pick;
+ design: { __typename?: 'File' } & Pick;
+ }
+ >;
+ }
+ >;
+};
export type GetProjectByIdQueryVariables = Exact<{
id: Scalars['String'];
}>;
-
-export type GetProjectByIdQuery = (
- { __typename?: 'QueryRoot' }
- & { getProjectById: (
- { __typename?: 'ProjectOutput' }
- & Pick
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), template: (
- { __typename?: 'TemplateOutput' }
- & Pick
- & { features?: Maybe
- & { image: (
- { __typename?: 'File' }
- & Pick
- ), wireframes?: Maybe
- )>> }
- )>>, image: (
- { __typename?: 'File' }
- & Pick
- ), specification?: Maybe<(
- { __typename?: 'SpecificationOutput' }
- & Pick