moonyeju 2023-10-05
[ADD]g
@48f7947048e6f23aa47aff307a9ba09db4cb7482
 
kogas_app/__tests__/App.test.tsx (deleted)
--- kogas_app/__tests__/App.test.tsx
@@ -1,17 +0,0 @@
-/**
- * @format
- */
-
-import 'react-native';
-import React from 'react';
-import App from '../App';
-
-// Note: import explicitly to use the types shiped with jest.
-import {it} from '@jest/globals';
-
-// Note: test renderer must be required after react-native.
-import renderer from 'react-test-renderer';
-
-it('renders correctly', () => {
-  renderer.create(<App />);
-});
kogas_app/package-lock.json
--- kogas_app/package-lock.json
+++ kogas_app/package-lock.json
@@ -9,6 +9,7 @@
       "version": "0.0.1",
       "dependencies": {
         "@react-native-community/masked-view": "^0.1.11",
+        "@react-native-firebase/messaging": "^18.5.0",
         "@react-navigation/bottom-tabs": "^6.5.8",
         "@react-navigation/native": "^6.1.7",
         "@react-navigation/stack": "^6.3.17",
@@ -3478,6 +3479,34 @@
       "peerDependencies": {
         "react": ">=16.0",
         "react-native": ">=0.57"
+      }
+    },
+    "node_modules/@react-native-firebase/app": {
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-18.5.0.tgz",
+      "integrity": "sha512-AhHQi5KFDlKZn/lH7rEYtLfpsGamEq+P/cXZWcNPcP0WGlmi++abk7Pxnn4MjnG7TNhEyG/C9uq//qb6VhXaZg==",
+      "peer": true,
+      "dependencies": {
+        "opencollective-postinstall": "^2.0.1",
+        "superstruct": "^0.6.2"
+      },
+      "peerDependencies": {
+        "expo": ">=47.0.0",
+        "react": "*",
+        "react-native": "*"
+      },
+      "peerDependenciesMeta": {
+        "expo": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@react-native-firebase/messaging": {
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/@react-native-firebase/messaging/-/messaging-18.5.0.tgz",
+      "integrity": "sha512-y1FApYxBMcygmbWBqUPFC+fCfvx6Yf6TdZewun7kPwx+S+tkYzoKx1IsXtxOXtqyJjCNEYirjFgNrs5SSd02zA==",
+      "peerDependencies": {
+        "@react-native-firebase/app": "18.5.0"
       }
     },
     "node_modules/@react-native/assets-registry": {
@@ -7261,6 +7290,27 @@
         "is-callable": "^1.1.3"
       }
     },
+    "node_modules/for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/for-own": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+      "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==",
+      "peer": true,
+      "dependencies": {
+        "for-in": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -7938,6 +7988,15 @@
       "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
       "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
       "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+      "peer": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10315,6 +10374,28 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/mixin-object": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+      "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
+      "peer": true,
+      "dependencies": {
+        "for-in": "^0.1.3",
+        "is-extendable": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mixin-object/node_modules/for-in": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+      "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/mkdirp": {
       "version": "0.5.6",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -10666,6 +10747,15 @@
       },
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
+      "peer": true,
+      "bin": {
+        "opencollective-postinstall": "index.js"
       }
     },
     "node_modules/optionator": {
@@ -12352,6 +12442,54 @@
       "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==",
       "license": "MIT"
     },
+    "node_modules/superstruct": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.6.2.tgz",
+      "integrity": "sha512-lvA97MFAJng3rfjcafT/zGTSWm6Tbpk++DP6It4Qg7oNaeM+2tdJMuVgGje21/bIpBEs6iQql1PJH6dKTjl4Ig==",
+      "peer": true,
+      "dependencies": {
+        "clone-deep": "^2.0.1",
+        "kind-of": "^6.0.1"
+      }
+    },
+    "node_modules/superstruct/node_modules/clone-deep": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+      "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
+      "peer": true,
+      "dependencies": {
+        "for-own": "^1.0.0",
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.0",
+        "shallow-clone": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/superstruct/node_modules/shallow-clone": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+      "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
+      "peer": true,
+      "dependencies": {
+        "is-extendable": "^0.1.1",
+        "kind-of": "^5.0.0",
+        "mixin-object": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/superstruct/node_modules/shallow-clone/node_modules/kind-of": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
kogas_app/package.json
--- kogas_app/package.json
+++ kogas_app/package.json
@@ -11,6 +11,7 @@
   },
   "dependencies": {
     "@react-native-community/masked-view": "^0.1.11",
+    "@react-native-firebase/messaging": "^18.5.0",
     "@react-navigation/bottom-tabs": "^6.5.8",
     "@react-navigation/native": "^6.1.7",
     "@react-navigation/stack": "^6.3.17",
 
kogas_app/src/App.js (deleted)
--- kogas_app/src/App.js
@@ -1,12 +0,0 @@
-import {UserProvider} from './contexts/UserContext';
-import Navigation from './navigations';
-
-const App = () => {
-  return (
-    <UserProvider>
-      <Navigation />
-    </UserProvider>
-  );
-};
-
-export default App;
 
kogas_app/src/color.js (deleted)
--- kogas_app/src/color.js
@@ -1,14 +0,0 @@
-export const WHITE = '#ffffff';
-export const BLACK = '#000000';
-export const GRAY = '#a3a3a3';
-
-export const PRIMARY = {
-  DARK: '#0E56AA',
-  DEFAULT: '#3E78BB',
-  LIGHT: '#B7CDE6',
-};
-
-export const SBTN = {
-  DEFAULT: '#DBE6F2',
-  DARK: '#B3BECA',
-};
 
kogas_app/src/components/Button.js (deleted)
--- kogas_app/src/components/Button.js
@@ -1,48 +0,0 @@
-import {ActivityIndicator, Pressable, StyleSheet, Text} from 'react-native';
-import PropTypes from 'prop-types';
-import {GRAY, PRIMARY, WHITE} from '../color';
-
-const Button = ({title, onPress, disabled, isLoading}) => {
-  return (
-    <Pressable
-      onPress={onPress}
-      style={({pressed}) => [
-        styles.container,
-        {backgroundColor: PRIMARY.DEFAULT},
-        pressed && {backgroundColor: PRIMARY.DARK},
-        disabled && {backgroundColor: PRIMARY.LIGHT},
-      ]}
-      disabled={disabled}>
-      {isLoading ? (
-        <ActivityIndicator size={'small'} color={GRAY} />
-      ) : (
-        <Text style={styles.title}>{title}</Text>
-      )}
-    </Pressable>
-  );
-};
-
-Button.propTypes = {
-  title: PropTypes.string.isRequired,
-  onPress: PropTypes.func.isRequired,
-  disabled: PropTypes.bool,
-  isLoading: PropTypes.bool,
-};
-
-const styles = StyleSheet.create({
-  container: {
-    backgroundColor: PRIMARY.DEFAULT,
-    borderRadius: 8,
-    justifyContent: 'center',
-    alignItems: 'center',
-    paddingVertical: 15,
-  },
-  title: {
-    color: WHITE,
-    fontSize: 16,
-    fontWeight: '700',
-    lineHeight: 20,
-  },
-});
-
-export default Button;
 
kogas_app/src/components/CircularProgressBar.js (deleted)
--- kogas_app/src/components/CircularProgressBar.js
@@ -1,71 +0,0 @@
-import React from 'react';
-import { View, StyleSheet } from 'react-native';
-import { Circle, G, Svg, Text } from 'react-native-svg';
-import { BLACK } from '../color';
-
-const CircularProgressBar = ({ percentage }) => {
-  // 원의 반지름
-  const radius = 30;
-
-  // 원의 중심 좌표
-  const centerX = radius + 5; // X 좌표
-  const centerY = radius + 5; // Y 좌표
-
-  // 원의 둘레
-  const circumference = 2 * Math.PI * radius;
-
-  // 원의 시작 각도 (12시 방향이 0도)
-  const startAngle = -Math.PI / 2;
-
-  // 퍼센티지에 따른 끝 각도 계산
-  const endAngle = startAngle + (percentage / 100) * (2 * Math.PI);
-
-  return (
-    <View style={styles.container}>
-      <Svg width={2 * (radius + 5)} height={2 * (radius + 5)}>
-        <G>
-          {/* 배경 원 */}
-          <Circle
-            r={radius}
-            cx={centerX}
-            cy={centerY}
-            fill="none"
-            stroke="#ddd"
-            strokeWidth={10}
-          />
-          {/* 원형 그래프 */}
-          <Circle
-            r={radius}
-            cx={centerX}
-            cy={centerY}
-            fill="none"
-            stroke="#007AFF" // 원형 그래프의 색상
-            strokeWidth={10} // 원형 그래프의 두께
-            strokeDasharray={`${circumference}, ${circumference}`}
-            strokeDashoffset={circumference - (percentage / 100) * circumference}
-          />
-          {/* 텍스트 */}
-          <Text
-            x={centerX - 7}
-            y={centerY + 5} // 텍스트 위치 조절
-            fontSize="15"
-            textAnchor="middle"
-            fill={BLACK} // 텍스트 색상
-          >
-            {percentage}%
-          </Text>
-        </G>
-      </Svg>
-    </View>
-  );
-};
-
-const styles = StyleSheet.create({
-  container: {
-    alignItems: 'center',
-    justifyContent: 'center',
-    marginRight:10,
-  },
-});
-
-export default CircularProgressBar;
 
kogas_app/src/components/DetailListItem.js (deleted)
--- kogas_app/src/components/DetailListItem.js
@@ -1,56 +0,0 @@
-import {Pressable, StyleSheet, Text, View} from 'react-native';
-import {memo} from 'react';
-import { useNavigation } from '@react-navigation/native';
-import { useEffect, useState } from 'react';
-
-const DetailListItem = memo(({name, item}) => {
-  const navigation = useNavigation();
-  const [statusMessage, setStatusMessage] = useState('');
-
-  useEffect(() => {
-    if (item.status === 'Y') {
-      setStatusMessage("서명완료");
-    } else if (item.status === 'N') {
-      setStatusMessage("진행중");
-    } else if (item.status === 'X') {
-      setStatusMessage("반려");
-  }
-  }, [statusMessage]);
-  return (
-    <Pressable>
-      <View style={styles.container}>
-        <View style={styles.left}>
-          <Text>{item.department}</Text>
-          <Text> {item.name}</Text>
-        </View>
-
-        <View style={styles.right}>
-            <Text>{statusMessage}</Text>
-          <Text>{item.datetime}</Text>
-        </View>
-      </View>
-    </Pressable>
-  );
-});
-
-DetailListItem.displayName = 'DetailListItem';
-
-const styles = StyleSheet.create({
-  container: {
-    flexDirection: 'column',
-    marginHorizontal: 10,
-    marginVertical:5,
-    borderBottomWidth: 0.5,
-    paddingVertical: 5,
-    paddingHorizontal: 15,
-    },
-    left: {
-        flexDirection: 'row',
-    },
-    right: {
-        flexDirection: 'column',
-        alignItems: 'flex-end',
-    }
-});
-
-export default DetailListItem;
 
kogas_app/src/components/EmptyList.js (deleted)
--- kogas_app/src/components/EmptyList.js
@@ -1,24 +0,0 @@
-import {Image, StyleSheet, Text, View} from 'react-native';
-import {PRIMARY} from '../color';
-
-const EmptyList = () => {
-  return (
-    <View style={styles.container}>
-      <Text style={styles.title}>기록이 없습니다.</Text>
-    </View>
-  );
-};
-const styles = StyleSheet.create({
-  container: {
-    flex: 1,
-    justifyContent: 'center',
-    alignItems: 'center',
-  },
-  title: {
-    fontSize: 18,
-    marginTop: 10,
-    fontWeight: '700',
-    color: PRIMARY.DEFAULT,
-  },
-});
-export default EmptyList;
 
kogas_app/src/components/ListItem.js (deleted)
--- kogas_app/src/components/ListItem.js
@@ -1,66 +0,0 @@
-import {Pressable, StyleSheet, Text, View} from 'react-native';
-import {memo} from 'react';
-import {useNavigation} from '@react-navigation/native';
-import { BLACK } from '../color';
-import { useEffect, useState } from 'react';
-
-const ListItem = memo(({name, item}) => {
-  const navigation = useNavigation();
-  const [stageMessage, setStageMessage] = useState('');
-
-  useEffect(() => {
-  if (item.stage === 0) {
-    setStageMessage('서명 진행중');
-  } else if (item.stage === -1) {
-    setStageMessage('반려 처리');
-  } else if (item.stage >= 1) {
-    setStageMessage(`${item.stage}차 서명완료`);
-  }
-  }, [stageMessage]);
-  
-  return (
-    <Pressable
-      onPress={() => {
-        navigation.navigate('ListDetail', {
-            document_id: item.document_id,
-            document_name: item.document_name,
-            main_department: item.main_department,
-            reg_date: item.reg_date,
-            name: item.name, 
-            stage: stageMessage
-          });
-    }}
-    hitSlop={10}
-    >
-      <View style={styles.container}>
-        <View>
-          <Text>{stageMessage}</Text>
-          <Text>제목: {item.document_name}</Text>
-          <Text>기안자: {item.main_department} {item.name}</Text>
-        </View>
-
-        <View>
-          <Text>기안일자: {item.reg_date}</Text>
-        </View>
-      </View>
-    </Pressable>
-  );
-});
-
-ListItem.displayName = 'ListItem';
-
-const styles = StyleSheet.create({
-  container: {
-    flexDirection: 'column',
-    marginHorizontal: 10,
-    marginVertical:10,
-    paddingVertical: 10,
-    paddingHorizontal: 15,
-    borderRadius: 20,
-    borderColor: BLACK,
-    borderWidth: 1,
-    
-  },
-});
-
-export default ListItem;
 
kogas_app/src/components/TextInput.js (deleted)
--- kogas_app/src/components/TextInput.js
@@ -1,123 +0,0 @@
-import {StyleSheet, Text, TextInput, View} from 'react-native';
-import PropTypes from 'prop-types';
-import {forwardRef, useState} from 'react';
-import {GRAY, BLACK, PRIMARY, WHITE} from '../color';
-import Icon from 'react-native-vector-icons/Ionicons';
-
-export const ReturnKeyTypes = {
-  DONE: 'done',
-  NEXT: 'next',
-};
-
-export const IconNames = {
-  ID: 'mail',
-  PASSWORD: 'lock-closed',
-};
-
-const Input = forwardRef(({placeholder, value, iconName, ...props}, ref) => {
-  const [isFocused, setIsFocused] = useState(false);
-
-  return (
-    <View style={styles.container}>
-      <View>
-        <TextInput
-          ref={ref}
-          {...props}
-          value={value}
-          style={[
-            styles.input,
-            iconName && {paddingLeft: 50},
-            value && styles.hasValueInput,
-            isFocused && styles.focusedInput,
-          ]}
-          autoCapitalize={'none'}
-          autoCorrect={false}
-          autoCompleteType={'off'}
-          textContentType={'none'}
-          keyboardAppearance={'light'}
-          onBlur={() => setIsFocused(false)}
-          onFocus={() => setIsFocused(true)}
-          placeholder={placeholder}
-        />
-
-        <View style={styles.icon}>
-          <Icon
-            name={iconName}
-            size={20}
-            color={WHITE}
-            // color={(() => {
-            //   switch (true) {
-            //     case isFocused:
-            //       return PRIMARY.DEFAULT;
-            //     case !!value:
-            //       return BLACK;
-            //     default:
-            //       return GRAY;
-            //   }
-            // })()}
-          />
-        </View>
-      </View>
-    </View>
-  );
-});
-Input.displayName = 'Input';
-
-Input.defaultProps = {
-  returnKeyType: ReturnKeyTypes.DONE,
-};
-
-Input.propTypes = {
-  title: PropTypes.string,
-  placeholder: PropTypes.string,
-  value: PropTypes.string,
-  iconName: PropTypes.oneOf(Object.values(IconNames)),
-};
-
-const styles = StyleSheet.create({
-  container: {
-    width: '100%',
-    paddingHorizontal: 15,
-    marginVertical: 10,
-  },
-  title: {
-    marginBottom: 4,
-    color: GRAY,
-  },
-  focusedTitle: {
-    fontWeight: '600',
-    color: PRIMARY.DEFAULT,
-  },
-  hasValueTitle: {
-    color: BLACK,
-  },
-  input: {
-    borderWidth: 1,
-    borderRadius: 10,
-    borderColor: '#E7EEEE',
-    // paddingHorizontal: 20,
-    // height: 42,
-    // paddingLeft: 5,
-  },
-  focusedInput: {
-    borderBottomWidth: 2,
-    borderBottomColor: PRIMARY.DEFAULT,
-    color: PRIMARY.DEFAULT,
-  },
-  hasValueInput: {
-    borderColor: BLACK,
-    color: BLACK,
-  },
-  icon: {
-    position: 'absolute',
-    width: 'auto',
-    height: '100%',
-    justifyContent: 'center',
-    backgroundColor: PRIMARY.DEFAULT,
-    padding: 10,
-    borderTopLeftRadius: 10,
-    borderBottomLeftRadius: 10,
-  },
-});
-
-export default Input;
 
kogas_app/src/contexts/UserContext.js (deleted)
--- kogas_app/src/contexts/UserContext.js
@@ -1,20 +0,0 @@
-import {createContext, useContext, useState} from 'react';
-import PropTypes from 'prop-types';
-
-const UserContext = createContext();
-export const UserProvider = ({children}) => {
-  const [user, setUser] = useState(null);
-  return (
-    <UserContext.Provider value={{user, setUser}}>
-      {children}
-    </UserContext.Provider>
-  );
-};
-
-UserProvider.propTypes = {
-  children: PropTypes.node,
-};
-
-export const useUserContext = () => useContext(UserContext);
-
-export default UserContext;
 
kogas_app/src/img/logo.png (Binary) (deleted)
--- kogas_app/src/img/logo.png
Binary file is not shown
 
kogas_app/src/navigations/BottomStack.js (deleted)
--- kogas_app/src/navigations/BottomStack.js
@@ -1,55 +0,0 @@
-import {createBottomTabNavigator} from '@react-navigation/bottom-tabs';
-import HomeScreen from '../screens/HomeScreen.js';
-import {PRIMARY, WHITE} from '../color';
-import Icon from 'react-native-vector-icons/Ionicons';
-import SettingsScreen from '../screens/SettingsScreen.js';
-import SignatureScreen from '../screens/SignatureScreen.js';
-
-const Tab = createBottomTabNavigator();
-
-const BottomStack = () => {
-  Icon.loadFont(); // Ionicons 폰트 로드
-  return (
-    <Tab.Navigator
-      initialRouteName="Home" screenOptions={{ headerShown: false }}>
-      <Tab.Screen
-        name="Home"
-        component={HomeScreen}
-        options={{
-          title: '홈',
-          tabBarLabel: '홈',
-          tabBarIcon: ({color, size}) => (
-            <Icon name="home-outline" color={color} size={size} />
-          ),
-        }}
-      />
-      <Tab.Screen
-        name="Signature"
-        component={SignatureScreen}
-        options={{
-          tabBarLabel: '서명 문서',
-          title: '서명 문서',
-          tabBarIcon: ({color, size}) => (
-            <Icon name="document-text-outline" color={color} size={size} />
-          ),
-        }}
-      />
-      <Tab.Screen
-        name="Settings"
-        component={SettingsScreen}
-        options={{
-          tabBarLabel: '환경설정',
-          title: '환경설정',
-          headerStyle: {
-            backgroundColor: PRIMARY.DEFAULT,
-          },
-          headerTintColor: WHITE,
-          tabBarIcon: ({color, size}) => (
-            <Icon name="settings-outline" color={color} size={size} />
-          ),
-        }}
-      />
-    </Tab.Navigator>
-  );
-};
-export default BottomStack;
 
kogas_app/src/navigations/MainStack.js (deleted)
--- kogas_app/src/navigations/MainStack.js
@@ -1,65 +0,0 @@
-import { Button,Text ,View} from 'react-native';
-import { createStackNavigator } from '@react-navigation/stack';
-import BottomStack from './BottomStack';
-import ListDetailScreen from '../screens/ListDetailScreen';
-import {useNavigation} from '@react-navigation/native';
-import { PRIMARY } from '../color';
-import { TouchableOpacity } from 'react-native-gesture-handler';
-import { useEffect, useState } from 'react';
-import { url } from '../url';
-const Stack = createStackNavigator();
-
-
-const MainStack = () => {
-  const navigation = useNavigation();
-  const [user, setUser] = useState(''); 
-  const [department, setDepartment] = useState(''); 
-  useEffect(() => {
-     // 세션 정보를 가져옴
-    getSession();
-  }, []); // 여기에서는 세션 정보를 한 번만 가져오도록 수정
-
-  // 세션 정보를 가져오는 함수
-  const getSession = async () => {
-    try {
-      const response = await fetch(`${url}/`); // 세션 정보를 가져오는 엔드포인트로 변경
-      if (response.ok) {
-        const data = await response.json();
-        console.log('서버에서 받은 세션 정보mainstack:', data);
-        setUser(data.user);
-        setDepartment(data.department);
-      } else {
-        console.error('세션 정보를 가져오는 데 실패했습니다.');
-      }
-    } catch (error) {
-      console.error('오류:', error);
-    }
-  };
-  
-  return (
-      <Stack.Navigator initialRouteName="BottomHome" screenOptions={{
-        title: 'KOGAS',
-        tabBarActiveTintColor: PRIMARY.DEFAULT,
-        headerTitleAlign: 'center',
-        headerTintColor: PRIMARY.DEFAULT,
-      headerTitleStyle: { fontWeight: '700' },
-        headerRight: () => (
-    <TouchableOpacity onPress={() => {/* 오른쪽 헤더 버튼 눌렀을 때 수행할 동작 */}}>
-            <View><Text>{department}</Text>
-            <Text>{user}</Text></View>
-    </TouchableOpacity>
-  ),
-      }}>
-          <Stack.Screen
-        name="BottomHome"
-        component={BottomStack}
-        options={{
-          headerLeft: null, // 뒤로 가기 버튼 숨김
-        }}
-      />
-      <Stack.Screen name="ListDetail"
-        component={ListDetailScreen}/>
-      </Stack.Navigator>
-  );
-};
-export default MainStack;
 
kogas_app/src/navigations/index.js (deleted)
--- kogas_app/src/navigations/index.js
@@ -1,50 +0,0 @@
-import { NavigationContainer } from '@react-navigation/native';
-import { createStackNavigator } from '@react-navigation/stack';
-import React, { useEffect, useState } from 'react';
-import SignInScreen from '../screens/SignInScreen';
-import MainStack from './MainStack';
-import { url } from '../url';
-
-const RootStack = createStackNavigator();
-
-const Navigation = () => {
-  const [session, setSession] = useState(''); // 세션 정보가 유효한지 여부
-
-  useEffect(() => {
-     // 세션 정보를 가져옴
-    getSession();
-  }, []); // 여기에서는 세션 정보를 한 번만 가져오도록 수정
-
-  // 세션 정보를 가져오는 함수
-  const getSession = async () => {
-    try {
-      const response = await fetch(`${url}/`); // 세션 정보를 가져오는 엔드포인트로 변경
-      if (response.ok) {
-        const data = await response.json();
-        console.log('서버에서 받은 세션 정보index:', data);
-        if (data) {
-        setSession(data.user);
-      }
-      } else {
-        console.error('세션 정보를 가져오는 데 실패했습니다.');
-      }
-    } catch (error) {
-      console.error('오류:', error);
-    }
-  };
-
-  return (
-    <NavigationContainer>
-      <RootStack.Navigator
-        //initialRouteName={session!==undefined ? 'Main' : 'Login'}  // 세션 정보에 따라 초기 라우트 설정
-        initialRouteName={'Login'}  // 세션 정보에 따라 초기 라우트 설정
-        screenOptions={{ headerShown: false }}
-      >
-        <RootStack.Screen name="Login" component={SignInScreen} />
-        <RootStack.Screen name="Main" component={MainStack} />
-      </RootStack.Navigator>
-    </NavigationContainer>
-  );
-};
-
-export default Navigation;
 
kogas_app/src/screens/HomeScreen.js (deleted)
--- kogas_app/src/screens/HomeScreen.js
@@ -1,127 +0,0 @@
-import { Pressable, StyleSheet, Text, View } from 'react-native';
-import { BLACK, GRAY, WHITE } from '../color';
-import {useNavigation} from '@react-navigation/native';
-import { FlatList } from 'react-native-gesture-handler';
-import ListItem from '../components/ListItem';
-import { useEffect, useState } from 'react';
-import { url } from '../url';
-import CircularProgressBar from '../components/CircularProgressBar';
-
-const HomeScreen = () => {
-  const navigation = useNavigation();
-  const [list, setList] = useState([]);
-  const [signatureAll, setSignatureAll] = useState(0);
-  const [signatureClear, setSignatureClear] = useState(0);
-  const [recentAll, setRecentAll] = useState(0);
-  const [recentClear, setRecentClear] = useState(0);
-  const myperc = Math.floor((signatureClear / signatureAll) * 100);
-  const recentperc = Math.floor((recentClear / recentAll) * 100); 
-
-useEffect(() => {
-  getMainChart();
-}, [signatureAll, signatureClear, recentAll, recentClear]);
-  
-const getMainChart = async () => {
-  try {
-    const response = await fetch(`${url}/main_chart`, {
-      method: 'GET',
-      headers: {
-        'Content-Type': 'application/json',
-      },
-    })
-    if (response.ok) {
-      const data = await response.json();
-      //console.log('aalistpage:', data);
-      setSignatureAll(data.signature_all);
-      setSignatureClear(data.signature_clear);
-      setRecentAll(data.now_all);
-      setRecentClear(data.now_clear);
-      } else {
-      console.error('main_chart 데이터를 가져오는 데 실패했습니다.');
-    }
-  }catch (error) {
-      console.error('데이터를 가져오는 중 오류 발생:', error);
-    }
-  };
-  useEffect(() => {
-  getList();
-}, []);
-const getList = async () => {
-  try {
-    const response = await fetch(`${url}/list`, {
-      method: 'GET',
-      headers: {
-        'Content-Type': 'application/json',
-      },
-    })
-    if (response.ok) {
-      const data = await response.json();
-      //console.log('listpage:', data);
-      setList(data);
-    } else {
-      console.error('list 데이터를 가져오는 데 실패했습니다.');
-    }
-  } catch (error) {
-      console.error('데이터를 가져오는 중 오류 발생:', error);
-    }
-};
-
-
-  return (
-    <View style={styles.container}>
-    <View style={styles.containerTop}>
-      <Text style={styles.title}>내 진행 상황</Text>
-        <View style={styles.mydocs}><CircularProgressBar percentage={myperc} />
-          <View style={styles.text}>
-            <Text>내 문서 진행률</Text>
-          <Text>서명 대상자 {signatureAll}명 중 {signatureClear}명이 서명을 완료하였습니다.</Text>
-        </View></View>
-        <View style={styles.mydocs}><CircularProgressBar percentage={recentperc} />
-          <View style={styles.text}>
-            <Text>내 문서 진행률</Text>
-          <Text>서명 대상자 {recentAll}명 중 {recentClear}명이 서명을 완료하였습니다.</Text>
-        </View></View>
-    </View>
-    <View style={styles.containerBottom}>
-        <Text style={styles.title}>서명 이력</Text>
-        <View>
-        <FlatList
-        data={list}
-        renderItem={({item}) => (
-          <ListItem name="HomeScreen" item={item} />
-        )}
-        // windowSize={5}
-        ListHeaderComponent={View}
-      />
-        </View>
-    </View>
-    </View>
-  );
-};
-const styles = StyleSheet.create({
-  container: {
-    backgroundColor: WHITE,
-    flex:1,
-  },
-  containerTop: {
-    
-  },
-  mydocs: {
-    flexDirection: 'row',
-    borderWidth: 0.5,
-    borderColor: GRAY,
-    borderRadius: 10, 
-    margin: 10,
-    padding:20,
-  },
-  title: {
-    color: BLACK,
-    //marginTop: 5,
-    fontWeight: '900',
-    borderBottomWidth: 0.5, 
-    borderBottomColor: BLACK,
-    paddingVertical: 5,
-    marginHorizontal:10,
-  },
-});
-export default HomeScreen;
 
kogas_app/src/screens/ListDetailScreen.js (deleted)
--- kogas_app/src/screens/ListDetailScreen.js
@@ -1,156 +0,0 @@
-import { FlatList, StyleSheet, Text, View, Button, Alert } from 'react-native';
-import { GRAY } from '../color';
-import DetailListItem from '../components/DetailListItem';
-import { useEffect, useState } from 'react';
-import { url } from '../url';
-
-const ListDetailScreen = ({ route, navigation }) => {
-  const { document_id } = route.params;
-  const { document_name } = route.params;
-  const { name } = route.params;
-  const { main_department } = route.params;
-  const { reg_date } = route.params;
-  const { stage } = route.params;
-  const [user, setUser] = useState('');
-  const [department, setDepartment] = useState('');
-  const [list, setList] = useState([]);
-  const [actionType, setActionType] = useState(null); // 서명 완료, 승인, 반려 액션 타입
-
-  useEffect(() => {
-    // 세션 정보를 가져옴
-    getSession();
-  }, []); // 여기에서는 세션 정보를 한 번만 가져오도록 수정
-
-  // 세션 정보를 가져오는 함수
-  const getSession = async () => {
-    try {
-      const response = await fetch(`${url}/`); // 세션 정보를 가져오는 엔드포인트로 변경
-      if (response.ok) {
-        const data = await response.json();
-        console.log('서버에서 받은 세션 정보listdetail:', data);
-        setUser(data.user);
-        setDepartment(data.department);
-      } else {
-        console.error('세션 정보를 가져오는 데 실패했습니다.');
-      }
-    } catch (error) {
-      console.error('오류:', error);
-    }
-  };
-
-  useEffect(() => {
-    getList();
-  }, []);
-
-  const getList = async () => {
-    //await SInfo.getItem('SessionId', {}).then(sessionId => {
-    //if (sessionId) {
-    fetch(`${url}/show_sig`, {
-      method: 'POST',
-      body: JSON.stringify({
-        document_id: document_id
-      }),
-      headers: {
-        'Content-Type': 'application/json',
-        //Authorization: `Bearer ${sessionId}`, // 세션 아이디 사용
-      },
-    })
-      .then(response => response.json())
-      .then(data => {
-        console.log('listdetailpage:', data);
-        setList(data);
-      })
-      .catch(error => {
-        console.error(error);
-      });
-    //} else {
-    //  console.log('세션 아이디 없음');
-    //}
-    //});
-  };
-
-  // user와 department 정보를 기반으로 stage 정보를 필터링
-  const filteredItem = list.find(item => item.name === user && item.department === department);
-
-  // 서명 완료, 승인, 반려 여부에 따라 액션 타입 설정
-  useEffect(() => {
-    if (filteredItem) {
-      setActionType(filteredItem.status);
-    }
-  }, [filteredItem, actionType]);
-
-  // 승인 또는 반려 버튼 클릭 시
-  const handleApproveOrReject = (isApprove) => {
-    const message = isApprove ? '승인하시겠습니까?' : '반려하시겠습니까?';
-    Alert.alert(
-      '알림',
-      message,
-      [
-        {
-          text: '예',
-          onPress: () => {
-            // 승인 또는 반려 동작 처리
-            if (isApprove) {
-              // 승인 처리 로직
-              // ...
-              console.log('승인 처리');
-            } else {
-              // 반려 처리 로직
-              // ...
-              console.log('반려 처리');
-            }
-          }
-        },
-        {
-          text: '아니요',
-          style: 'cancel'
-        }
-      ]
-    );
-  };
-
-  return (
-    <View style={styles.container}>
-      <View>
-        <Text style={styles.title}>{stage}</Text>
-        <Text style={styles.title}>{document_name}</Text>
-        <Text style={styles.date}>기안자: {main_department} {name}</Text>
-        <Text style={styles.date}>기안일자: {reg_date}</Text>
-      </View>
-      <Button title={'문서 보기'} />
-      <View>
-        <Text style={styles.v}>서명 정보</Text>
-        <FlatList
-          data={list}
-          renderItem={({ item }) => (
-            <DetailListItem name="ListDetailScreen" item={item} />
-          )}
-          windowSize={5}
-          ListHeaderComponent={View}
-          ListHeaderComponentStyle={{ height: 10 }}
-        />
-        {actionType === 'Y' && (
-          <Button title={'서명 완료'} />
-        )}
-        {actionType === 'N' && (
-          <View>
-            <Button title={'승인'} onPress={() => handleApproveOrReject(true)} />
-            <Button title={'반려'} onPress={() => handleApproveOrReject(false)} />
-          </View>
-        )}
-        {actionType === 'X' && (
-          <Button title={'반려 처리'} />
-        )}
-      </View>
-    </View>
-  );
-};
-
-const styles = StyleSheet.create({
-  v: {
-    marginTop: 10,
-    fontWeight: 'bold',
-  }
-});
-
-export default ListDetailScreen;
 
kogas_app/src/screens/SettingsScreen.js (deleted)
--- kogas_app/src/screens/SettingsScreen.js
@@ -1,102 +0,0 @@
-import { Alert, StyleSheet, Switch, Text, View } from 'react-native';
-import PropTypes from 'prop-types';
-import { GRAY, PRIMARY, WHITE } from '../color';
-import { useState } from 'react';
-import Button from '../components/Button';
-import { url } from '../url';
-
-const SettingsScreen = ({ navigation }) => {
-  const [alarm, setAlarm] = useState(false);
-  const [dark, setDark] = useState(false);
-
-  const toggleSwitchAlarm = () => setAlarm((previousState) => !previousState);
-  const toggleSwitchDark = () => setDark((previousState) => !previousState);
-
-  const handleLogout = () => {
-    fetch(`${url}/logout`, {
-      method: 'POST',
-      credentials: 'same-origin'
-    })
-      .then((response) => {
-        console.log(response.status);
-        if (response.status === 200) {
-          navigation.navigate('Login');
-        } else {
-          Alert.alert('로그아웃 실패');
-        }
-      })
-      .catch((error) => {
-        console.error('로그아웃 중 오류 발생:', error);
-        Alert.alert('로그아웃 중 오류가 발생했습니다.');
-      });
-  };
-
-  return (
-    <View style={styles.container}>
-      <View style={styles.containerRadius}>
-        <View style={styles.textContainer}>
-          <Text style={styles.text}>알림 설정</Text>
-          <View style={styles.switchStyle}>
-            <Switch
-              trackColor={{ false: GRAY, true: PRIMARY.DEFAULT }}
-              thumbColor={WHITE}
-              ios_backgroundColor={GRAY}
-              onValueChange={toggleSwitchAlarm}
-              value={alarm}
-            />
-          </View>
-        </View>
-        {alarm && (
-          <View>
-            <Text>시간대별 알림 설정 여부</Text>
-          </View>
-        )}
-        <View style={styles.view}>
-          <Button title={'기기 등록'} onPress={() => {}} />
-        </View>
-        <View style={styles.view}>
-          <Button title={'로그아웃'} onPress={handleLogout} />
-        </View>
-      </View>
-    </View>
-  );
-};
-
-SettingsScreen.propTypes = {};
-
-const styles = StyleSheet.create({
-  container: {
-    flex: 1,
-  },
-  containerRadius: {
-    backgroundColor: WHITE,
-    flex: 1,
-    margin: 25,
-    borderRadius: 15,
-  },
-  textContainer: {
-    position: 'relative',
-    justifyContent: 'center',
-    borderBottomWidth: 1,
-    borderColor: GRAY,
-    paddingVertical: 30,
-  },
-  text: {
-    position: 'absolute',
-    left: 0,
-    fontSize: 20,
-    fontWeight: '600',
-    paddingHorizontal: 20,
-  },
-  switchStyle: {
-    position: 'absolute',
-    right: 0,
-    paddingVertical: 20,
-    paddingHorizontal: 20,
-  },
-  view: {
-    margin: 15,
-  },
-});
-
-export default SettingsScreen;
 
kogas_app/src/screens/SignInScreen.js (deleted)
--- kogas_app/src/screens/SignInScreen.js
@@ -1,166 +0,0 @@
-import React, { useState, useRef, useEffect } from 'react';
-import {
-  View,
-  StyleSheet,
-  Text,
-  Keyboard,
-  Alert,
-  TouchableOpacity,
-  Image,
-  TouchableWithoutFeedback,
-} from 'react-native';
-import Button from '../components/Button';
-import TextInput, { IconNames, ReturnKeyTypes } from '../components/TextInput';
-import PropTypes from 'prop-types';
-import {url} from '../url';
-
-const SignInScreen = ({ navigation }) => {
-  const [id, setId] = useState('');
-  const [password, setPassword] = useState('');
-  const passwordRef = useRef(null);
-  const [disabled, setDisabled] = useState(true);
-  const [isLoading, setIsLoading] = useState(false);
-
-  useEffect(() => {
-    setDisabled(!id || !password);
-  }, [id, password]);
-
-  const handleDismissKeyboard = () => {
-    Keyboard.dismiss();
-  };
-
-const onSubmit = async () => {
-    if (!disabled && !isLoading) {
-      Keyboard.dismiss();
-      setIsLoading(true);
-      try {
-        fetch(`${url}/login`, {
-          method: 'POST',
-          body: JSON.stringify({
-            username: id,
-            password: password,
-          }),
-          headers: {
-            'Content-Type': 'application/json',
-          },
-        })
-            try {
-              //await SecureStore.setItemAsync('Token', token);
-              // 로그인 성공 후 메인 화면으로 이동
-              console.log("성공")
-              Alert.alert('로그인 성공');
-              try {
-                const response = await fetch(`${url}/`); // 세션 정보를 가져오는 엔드포인트로 변경
-                if (response.ok) {
-                  console.log('세션성공');
-                    navigation.navigate('Main');
-                } else {
-                  console.error('세션 정보를 가져오는 데 실패했습니다.');
-                }
-              } catch (error) {
-                console.error('오류:', error);
-              }
-            } catch (e) {
-              console.log("실패")
-              Alert.alert('로그인 실패');
-              setIsLoading(false);
-            }
-      } catch (e) {
-        console.log("실패")
-        Alert.alert('로그인 실패', e, [
-          {
-            text: 'Ok',
-            onPress: () => setIsLoading(false),
-          },
-        ]);
-      }
-    }
-  };
-
-
-  return (
-    <TouchableWithoutFeedback onPress={handleDismissKeyboard}>
-      <View style={styles.container}>
-        <View style={styles.titleContainer}>
-          <Image source={require('../img/logo.png')} style={styles.image} />
-          <Text
-            style={[styles.textContainer, {alignSelf: 'center'}]}>
-            스마트 전자서명 시스템
-          </Text>
-        </View>
-        <View style={styles.viewContainer}>
-          <TextInput
-            value={id}
-            onChangeText={text => setId(text.trim())}
-            placeholder={'아이디'}
-            returnKeyType={ReturnKeyTypes.NEXT}
-            iconName={IconNames.ID}
-            onSubmitEditing={() => passwordRef.current.focus()}
-          />
-          <TextInput
-            ref={passwordRef}
-            value={password}
-            onChangeText={text => setPassword(text.trim())}
-            placeholder={'비밀번호'}
-            secureTextEntry
-            iconName={IconNames.PASSWORD}
-            onSubmitEditing={onSubmit}
-          />
-          <View style={styles.buttonContainer}>
-            <Button
-              title={'로그인'}
-              onPress={onSubmit}
-              disabled={disabled}
-              isLoading={isLoading}
-            />
-          </View>
-        </View>
-      </View>
-    </TouchableWithoutFeedback>
-  );
-};
-
-SignInScreen.propTypes = {
-  navigation: PropTypes.object,
-};
-
-const styles = StyleSheet.create({
-  container: {
-    flex: 1,
-    paddingTop: 20,
-    justifyContent: 'flex-start',
-    alignItems: 'center',
-  },
-  titleContainer: {
-    width: '100%',
-    flex: 1,
-    justifyContent: 'center',
-    alignItems: 'center',
-    marginTop: 50,
-  },
-  image: {
-    flex: 1,
-    width: '60%',
-    resizeMode: 'contain',
-    justifyContent: 'flex-end',
-    alignItems: 'center',
-  },
-  viewContainer: {
-    flex: 2,
-    width: '90%',
-  },
-  buttonContainer: {
-    padding: 5,
-    marginTop: 10,
-  },
-  textContainer: {
-    flex: 1,
-    padding: 10,
-    alignItems: 'center',
-    fontSize: 30,
-    justifyContent: 'flex-start',
-    fontWeight: '900',
-  },
-});
-
-export default SignInScreen;
 
kogas_app/src/screens/SignatureScreen.js (deleted)
--- kogas_app/src/screens/SignatureScreen.js
@@ -1,178 +0,0 @@
-import React, { useState,useEffect } from 'react';
-import { View, Text, TouchableOpacity } from 'react-native';
-import { FlatList } from 'react-native-gesture-handler';
-import ListItem from '../components/ListItem';
-import { url } from '../url';
-
-// 라디오 버튼 컴포넌트
-const RadioButton = ({ options, selectedOption, onSelect }) => {
-  return (
-    <View style={{ flexDirection: 'row'}}>
-      {options.map((option, index) => (
-        <TouchableOpacity
-          key={index}
-          onPress={() => {
-            onSelect(option,index);
-          }}
-        >
-          <View>
-            {/* 선택된 옵션에 따라 스타일 변경 */}
-            <Text
-              style={{
-                fontSize: 16,
-                marginRight: 10,
-                color: selectedOption === option ? 'blue' : 'black',
-              }}
-            >
-              {option}
-            </Text>
-          </View>
-        </TouchableOpacity>
-      ))}
-    </View>
-  );
-};
-
-// 예제 앱
-const SignatureScreen = () => {
-  //const [myList, setMyList] = useState([]);
-  //const [proceedingList, setProceedingList] = useState([]);
-  //const [doneList, setDoneList] = useState([]);
-  const [user, setUser] = useState('');
-  const options = ['내 기안', '진행 문서', '완료 문서'];
-  const [selectedOption, setSelectedOption] = useState(null);
-  const [selectedList, setSelectedList] = useState([]);
-    useEffect(() => {
-      if (user !== '') {
-        if (selectedOption === null && options.length > 0) {
-          getMyDoc();
-          setSelectedOption(options[0]);
-        }
-      }  else {
-        console.log("user 없음")
-      }
-    }, [user,selectedList]);
-  
-  // 옵션 선택 시 호출되는 함수
-  const handleSelect = (option,index) => {
-      setSelectedOption(option);
-      // 선택된 옵션에 따라 다른 리스트 데이터를 설정
-    if (index === 0) {
-      getMyDoc();
-    } else if (index === 1) {
-      getProceedingDoc();
-    } else if (index === 2) {
-      getDoneDoc();
-    }
-  };
-  useEffect(() => {
-    // 세션 정보를 가져옴
-    getSession();
-  }, []); // 여기에서는 세션 정보를 한 번만 가져오도록 수정
-
-  // 세션 정보를 가져오는 함수
-  const getSession = async () => {
-    try {
-      const response = await fetch(`${url}/`); // 세션 정보를 가져오는 엔드포인트로 변경
-      if (response.ok) {
-        const data = await response.json();
-        console.log('서버에서 받은 세션 정보signaturelist:', data);
-        setUser(data.user);
-        
-      } else {
-        console.error('세션 정보를 가져오는 데 실패했습니다.');
-      }
-    } catch (error) {
-      console.error('오류:', error);
-    }
-  };
-  
-const getMyDoc = async () => {
-  console.log('mydoc user signaturelist:',user);
-    try {
-      const response = await fetch(`${url}/my_doc`, {
-        method: 'POST',
-        body: JSON.stringify({
-          user_id: user,
-        }),
-        headers: {
-          'Content-Type': 'application/json',
-        },
-      });
-      if (response.ok) {
-        const data = await response.json();
-        console.log("my"+data);
-        setSelectedList(data);
-      } else {
-        console.error('mydoc 데이터를 가져오는 데 실패했습니다.',response);
-      }
-    } catch (error) {
-      console.error('mydoc 데이터를 가져오는 중 오류 발생:', error);
-    }
-};
-
-const getProceedingDoc = async () => {
-  try {
-    const response = await fetch(`${url}/trying_doc`, {
-      method: 'POST',
-      body: JSON.stringify({
-        user_id: user,
-      }),
-      headers: {
-        'Content-Type': 'application/json',
-      },
-    })
-    if (response.ok) {
-      const data = await response.json();
-      console.log("proceed"+data);
-      //console.log('listpage:', data);
-      setSelectedList(data);
-    } else {
-      console.error('proceedingdoc 데이터를 가져오는 데 실패했습니다.');
-    }
-  } catch (error) {
-      console.error('proceedingdoc 데이터를 가져오는 중 오류 발생:', error);
-    }
-  };
-
-const getDoneDoc = async () => {
-  try {
-    const response = await fetch(`${url}/done_doc`, {
-      method: 'GET',
-      headers: {
-        'Content-Type': 'application/json',
-      },
-    })
-    if (response.ok) {
-      const data = await response.json();
-      //console.log('listpage:', data);
-      setSelectedList(data);
-    } else {
-      console.error('donedoc 데이터를 가져오는 데 실패했습니다.');
-    }
-  } catch (error) {
-      console.error('donedoc 데이터를 가져오는 중 오류 발생:', error);
-    }
-};
-    return (
-    <View>
-      {/* 라디오 버튼 컴포넌트 사용 */}
-      <RadioButton
-        options={options}
-        selectedOption={selectedOption}
-        onSelect={handleSelect}
-      />
-          <FlatList
-              data={selectedList}
-        renderItem={({item}) => (
-          <ListItem name="SignatureScreen" item={item} />
-        )}
-        windowSize={5}
-        ListHeaderComponent={View}
-        ListHeaderComponentStyle={{height: 10}}
-      />
-    </View>
-  );
-};
-
-export default SignatureScreen;
 
kogas_app/src/test/PdfOpen.js (deleted)
--- kogas_app/src/test/PdfOpen.js
@@ -1,95 +0,0 @@
-/**
- * Copyright (c) 2017-present, Wonday (@wonday.org)
- * All rights reserved.
- *
- * This source code is licensed under the MIT-style license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-import React from 'react';
-import { StyleSheet, Dimensions, View } from 'react-native';
-import Pdf from 'react-native-pdf';
-
-export default class PDFOpen extends React.Component {
-    render() {
-        const source = { uri: 'file://C:/Users/mycom/Desktop/KOGAS_APP/test.pdf', cache: false };
-        //const source = require('./test.pdf');  // ios only
-        //const source = {uri:'bundle-assets://test.pdf' };
-        //const source = {uri:'file:///sdcard/test.pdf'};
-        //const source = {uri:"data:application/pdf;base64,JVBERi0xLjcKJc..."};
-        //const source = {uri:"content://com.example.blobs/xxxxxxxx-...?offset=0&size=xxx"};
-        //const source = {uri:"blob:xxxxxxxx-...?offset=0&size=xxx"};
-
-        return (
-            <View style={styles.container}>
-                <Pdf
-                    source={source}
-                    onLoadComplete={(numberOfPages,filePath) => {
-                        console.log(`Number of pages: ${numberOfPages}`);
-                    }}
-                    onPageChanged={(page,numberOfPages) => {
-                        console.log(`Current page: ${page}`);
-                    }}
-                    onError={(error) => {
-                        console.log(error);
-                    }}
-                    onPressLink={(uri) => {
-                        console.log(`Link pressed: ${uri}`);
-                    }}
-                    style={styles.pdf}/>
-            </View>
-        )
-    }
-}
-
-const styles = StyleSheet.create({
-    container: {
-        flex: 1,
-        justifyContent: 'flex-start',
-        alignItems: 'center',
-        marginTop: 25,
-    },
-    pdf: {
-        flex:1,
-        width:Dimensions.get('window').width,
-        height:Dimensions.get('window').height,
-    }
-});
-
-// import React from 'react';
-// import { Text, View, Button } from 'react-native';
-// import { WebView } from 'react-native-webview';
-
-// export default class PdfOpen extends React.Component {
-//   constructor(props) {
-//     super(props);
-//     this.state = {
-//       showPdfViewer: false, // 초기에 PDF 뷰어를 숨깁니다.
-//     };
-//   }
-
-//   // 버튼 클릭 시 PDF 뷰어를 보이도록 상태를 변경합니다.
-//   showPdfViewer = () => {
-//     this.setState({ showPdfViewer: true });
-//   }
-
-//   render() {
-//     // 상태에 따라 PDF 뷰어를 보이거나 숨깁니다.
-//     const pdfViewer = this.state.showPdfViewer ? (
-//       <WebView
-//         source={{ uri: 'C:/Users/mycom/Desktop/aa.pdf' }}
-//         onError={(err) => console.log(err)}
-//       />
-//     ) : null;
-
-//     return (
-//       <View>
-//         <Text>d</Text>
-//         {pdfViewer}
-//         {/* 버튼을 누르면 PDF 뷰어를 보이도록 합니다. */}
-//         <Button title="Show PDF" onPress={this.showPdfViewer} />
-//       </View>
-//     );
-//   }
-// }
-
kogas_app/yarn.lock
--- kogas_app/yarn.lock
+++ kogas_app/yarn.lock
@@ -1702,6 +1702,19 @@
   resolved "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.11.tgz"
   integrity sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw==
 
+"@react-native-firebase/[email protected]":
+  version "18.5.0"
+  resolved "https://registry.npmjs.org/@react-native-firebase/app/-/app-18.5.0.tgz"
+  integrity sha512-AhHQi5KFDlKZn/lH7rEYtLfpsGamEq+P/cXZWcNPcP0WGlmi++abk7Pxnn4MjnG7TNhEyG/C9uq//qb6VhXaZg==
+  dependencies:
+    opencollective-postinstall "^2.0.1"
+    superstruct "^0.6.2"
+
+"@react-native-firebase/messaging@^18.5.0":
+  version "18.5.0"
+  resolved "https://registry.npmjs.org/@react-native-firebase/messaging/-/messaging-18.5.0.tgz"
+  integrity sha512-y1FApYxBMcygmbWBqUPFC+fCfvx6Yf6TdZewun7kPwx+S+tkYzoKx1IsXtxOXtqyJjCNEYirjFgNrs5SSd02zA==
+
 "@react-native/assets-registry@^0.72.0":
   version "0.72.0"
   resolved "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.72.0.tgz"
@@ -2686,6 +2699,16 @@
     strip-ansi "^6.0.1"
     wrap-ansi "^7.0.0"
 
+clone-deep@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz"
+  integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==
+  dependencies:
+    for-own "^1.0.0"
+    is-plain-object "^2.0.4"
+    kind-of "^6.0.0"
+    shallow-clone "^1.0.0"
+
 clone-deep@^4.0.1:
   version "4.0.1"
   resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz"
@@ -3646,6 +3669,23 @@
   dependencies:
     is-callable "^1.1.3"
 
+for-in@^0.1.3:
+  version "0.1.8"
+  resolved "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz"
+  integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
+  integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+for-own@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz"
+  integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==
+  dependencies:
+    for-in "^1.0.1"
+
 form-data@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz"
@@ -4043,6 +4083,11 @@
   version "0.3.1"
   resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz"
   integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+  integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
 
 is-extglob@^2.1.1:
   version "2.1.1"
@@ -4798,7 +4843,12 @@
   dependencies:
     json-buffer "3.0.1"
 
-kind-of@^6.0.2:
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
+  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.1, kind-of@^6.0.2:
   version "6.0.3"
   resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
   integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -5527,6 +5577,14 @@
   resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
   integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
 
+mixin-object@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz"
+  integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==
+  dependencies:
+    for-in "^0.1.3"
+    is-extendable "^0.1.1"
+
 mkdirp@^0.5.1:
   version "0.5.6"
   resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz"
@@ -5746,6 +5804,11 @@
   integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==
   dependencies:
     is-wsl "^1.1.0"
+
+opencollective-postinstall@^2.0.1:
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz"
+  integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
 
 optionator@^0.9.3:
   version "0.9.3"
@@ -6549,6 +6612,15 @@
   resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
   integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
 
+shallow-clone@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz"
+  integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
+  dependencies:
+    is-extendable "^0.1.1"
+    kind-of "^5.0.0"
+    mixin-object "^2.0.1"
+
 shallow-clone@^3.0.0:
   version "3.0.1"
   resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
@@ -6822,6 +6894,14 @@
   resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz"
   integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==
 
+superstruct@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.6.2.tgz"
+  integrity sha512-lvA97MFAJng3rfjcafT/zGTSWm6Tbpk++DP6It4Qg7oNaeM+2tdJMuVgGje21/bIpBEs6iQql1PJH6dKTjl4Ig==
+  dependencies:
+    clone-deep "^2.0.1"
+    kind-of "^6.0.1"
+
 supports-color@^5.3.0:
   version "5.5.0"
   resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
Add a comment
List