diff --git a/src/App.tsx b/src/App.tsx index b0e6bc6..d1fd70a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,185 +1,14 @@ import React from 'react'; -//import logo from './logo.svg'; import './App.css'; -import { useState, useEffect } from 'react'; + +import Gallery from './Gallery/index'; function App() { - const [data, setData] = useState(''); - const [category, setCategory] = useState(''); - - useEffect(() => { - post(category, (json: string) => { - setData(json); - }); - }); - return (
-
- {getContents(data, true, category, setCategory)} -
-
- {getContents(data, false, category, setCategory)} -
+
); } -interface galleryItemInfo { - is_dir: boolean; - url: string; - thumbnail_url: string; -} - -function getContents( - data: string, - getDir: boolean, - category: string, - setCategory: (category: string) => void -) { - if (data === '') return; - - let obj = null; - try { - obj = JSON.parse(data); - } catch (error: unknown) { - if (!(error instanceof SyntaxError)) { - throw new Error(error as unknown as undefined); - } - return data; - } - - return obj - .sort((a: galleryItemInfo, b: galleryItemInfo) => { - if (a.is_dir && b.is_dir) return 0; - if (a.is_dir && !b.is_dir) return -1; - if (!a.is_dir && b.is_dir) return 1; - if (!a.is_dir && !b.is_dir) return 0; - }) - .filter((item: galleryItemInfo) => { - return getDir == item.is_dir; - }) - .map((item: galleryItemInfo, index: number) => { - const url = item.url; - const thumbnail_url = - item.thumbnail_url === null ? item.url : item.thumbnail_url; - let onClick = () => {}; - if (item.is_dir) { - onClick = () => { - const subCategory = getFileName(url); - - if (category !== '') category = `${category}/${subCategory}`; - else category = subCategory; - if (subCategory === '..') - category = category.split('/').slice(0, -2).join('/'); - - setCategory(category); - }; - return ( - - ); - } - if (url.endsWith('.mp4')) { - return ( - - ); - } - return ( - - ); - }); -} - -interface galleryItem { - url: string; - thumbnail_url: string; - onClick: () => void; -} - -function ImageItem({ thumbnail_url, url }: galleryItem) { - return ( -
- - {getFileName(url)} - - -
- ); -} - -function VideoItem({ url }: galleryItem) { - return ( -
- - {getFileName(url)} - - -
- ); -} - -function DirectoryItem({ url, onClick }: galleryItem) { - let buttonText = getFileName(url); - const isBackButton = buttonText === '..'; - buttonText = isBackButton ? 'Back' : `Category: ${buttonText}`; - const backButtonClass = isBackButton ? 'ParentDirectoryItem' : ''; - return ( -
- -
- ); -} - -function getFileName(string: string): string { - return string.split('/').at(-1) as unknown as string; -} - -function post(category: string, callback: (text: string) => void) { - fetch( - //'http://localhost/photo-viewer-backend/php/get.php', - 'https://dundun.ddns.net/photo-viewer/photo-viewer-backend/php/get.php', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - category: category, - }), - } - ) - .then((response) => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response; - }) - .then((response) => response.text()) - .then((data) => { - callback(data as unknown as string); - }) - .catch((error) => { - console.error('There was a problem with the fetch operation:', error); - }); -} - export default App; diff --git a/src/Gallery/index.tsx b/src/Gallery/index.tsx new file mode 100644 index 0000000..1350797 --- /dev/null +++ b/src/Gallery/index.tsx @@ -0,0 +1,167 @@ +import React from 'react'; +import '../App.css'; +import { useState, useEffect } from 'react'; + +function Gallery() { + const [data, setData] = useState(''); + const [category, setCategory] = useState(''); + + useEffect(() => { + post(category, (json: string) => { + setData(json); + }); + }); + + return ( +
+
+ {getContents(data, true, category, setCategory)} +
+
+ {getContents(data, false, category, setCategory)} +
+
+ ); +} + +interface galleryItemInfo { + is_dir: boolean; + url: string; + thumbnail_url: string; +} + +function getContents( + data: string, + getDir: boolean, + category: string, + setCategory: (category: string) => void +) { + if (data === '') return; + + let obj = null; + try { + obj = JSON.parse(data); + } catch (error: unknown) { + if (!(error instanceof SyntaxError)) { + throw new Error(error as unknown as undefined); + } + return data; + } + + return obj + .sort((a: galleryItemInfo, b: galleryItemInfo) => { + if (a.is_dir && b.is_dir) return 0; + if (a.is_dir && !b.is_dir) return -1; + if (!a.is_dir && b.is_dir) return 1; + if (!a.is_dir && !b.is_dir) return 0; + }) + .filter((item: galleryItemInfo) => { + return getDir == item.is_dir; + }) + .map((item: galleryItemInfo, index: number) => { + const itemProps = { + key: index, + url: item.url, + thumbnail_url: + item.thumbnail_url === null ? item.url : item.thumbnail_url, + onClick: () => {}, + }; + + if (item.is_dir) { + itemProps.onClick = () => { + const subCategory = getFileName(itemProps.url); + + if (category !== '') category = `${category}/${subCategory}`; + else category = subCategory; + if (subCategory === '..') + category = category.split('/').slice(0, -2).join('/'); + + setCategory(category); + }; + return ; + } + if (itemProps.url.endsWith('.mp4')) { + return ; + } + return ; + }); +} + +interface galleryItem { + url: string; + thumbnail_url: string; + onClick: () => void; +} + +function ImageItem({ thumbnail_url, url }: galleryItem) { + return ( + + ); +} + +function VideoItem({ url }: galleryItem) { + return ( + + ); +} + +function DirectoryItem({ url, onClick }: galleryItem) { + let buttonText = getFileName(url); + const isBackButton = buttonText === '..'; + buttonText = isBackButton ? 'Back' : `Category: ${buttonText}`; + const backButtonClass = isBackButton ? 'ParentDirectoryItem' : ''; + return ( +
+ +
+ ); +} + +function getFileName(string: string): string { + return string.split('/').at(-1) as unknown as string; +} + +function post(category: string, callback: (text: string) => void) { + fetch( + 'http://localhost/photo-viewer-backend/php/get.php', + //'https://dundun.ddns.net/photo-viewer/photo-viewer-backend/php/get.php', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + category: category, + }), + } + ) + .then((response) => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response; + }) + .then((response) => response.text()) + .then((data) => { + callback(data as unknown as string); + }) + .catch((error) => { + console.error('There was a problem with the fetch operation:', error); + }); +} + +export default Gallery;