2023-04-23 08:26:39 -05:00
// Copyright (C) 2022-present Daniel31x13 <daniel31x13@gmail.com>
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
2023-03-05 15:03:20 -06:00
import { create } from "zustand" ;
2023-04-24 16:30:40 -05:00
import { ExtendedLink , NewLink } from "@/types/global" ;
2023-03-25 09:17:34 -05:00
import useTagStore from "./tags" ;
import useCollectionStore from "./collections" ;
2023-03-05 15:03:20 -06:00
2023-03-22 18:11:54 -05:00
type LinkStore = {
2023-03-10 13:25:33 -06:00
links : ExtendedLink [ ] ;
2023-03-05 15:03:20 -06:00
setLinks : ( ) = > void ;
2023-04-24 16:30:40 -05:00
addLink : ( body : NewLink ) = > Promise < boolean > ;
2023-03-10 13:25:33 -06:00
updateLink : ( link : ExtendedLink ) = > void ;
2023-03-23 10:25:17 -05:00
removeLink : ( link : ExtendedLink ) = > void ;
2023-03-05 15:03:20 -06:00
} ;
2023-03-22 18:11:54 -05:00
const useLinkStore = create < LinkStore > ( ) ( ( set ) = > ( {
2023-03-05 15:03:20 -06:00
links : [ ] ,
setLinks : async ( ) = > {
const response = await fetch ( "/api/routes/links" ) ;
const data = await response . json ( ) ;
if ( response . ok ) set ( { links : data.response } ) ;
} ,
2023-04-24 16:30:40 -05:00
addLink : async ( body ) = > {
2023-03-05 15:03:20 -06:00
const response = await fetch ( "/api/routes/links" , {
2023-04-24 16:30:40 -05:00
body : JSON.stringify ( body ) ,
2023-03-05 15:03:20 -06:00
headers : {
"Content-Type" : "application/json" ,
} ,
method : "POST" ,
} ) ;
const data = await response . json ( ) ;
2023-03-28 02:31:50 -05:00
console . log ( data ) ;
2023-03-28 10:11:34 -05:00
if ( response . ok ) {
2023-03-05 15:03:20 -06:00
set ( ( state ) = > ( {
links : [ . . . state . links , data . response ] ,
} ) ) ;
2023-03-28 10:11:34 -05:00
useTagStore . getState ( ) . setTags ( ) ;
useCollectionStore . getState ( ) . setCollections ( ) ;
}
2023-03-25 09:17:34 -05:00
2023-03-08 15:31:24 -06:00
return response . ok ;
2023-03-05 15:03:20 -06:00
} ,
2023-03-28 10:11:34 -05:00
updateLink : async ( link ) = > {
const response = await fetch ( "/api/routes/links" , {
body : JSON.stringify ( link ) ,
headers : {
"Content-Type" : "application/json" ,
} ,
method : "PUT" ,
} ) ;
const data = await response . json ( ) ;
console . log ( data ) ;
if ( response . ok ) {
set ( ( state ) = > ( {
2023-05-01 05:07:01 -05:00
links : state.links.map ( ( e ) = >
e . id === data . response . id ? data.response : e
) ,
2023-03-28 10:11:34 -05:00
} ) ) ;
useTagStore . getState ( ) . setTags ( ) ;
2023-05-01 05:07:01 -05:00
useCollectionStore . getState ( ) . setCollections ( ) ;
2023-03-28 10:11:34 -05:00
}
} ,
2023-03-23 10:25:17 -05:00
removeLink : async ( link ) = > {
const response = await fetch ( "/api/routes/links" , {
body : JSON.stringify ( link ) ,
headers : {
"Content-Type" : "application/json" ,
} ,
method : "DELETE" ,
} ) ;
const data = await response . json ( ) ;
2023-04-26 15:40:48 -05:00
console . log ( data ) ;
2023-03-28 10:11:34 -05:00
if ( response . ok ) {
2023-03-23 10:25:17 -05:00
set ( ( state ) = > ( {
links : state.links.filter ( ( e ) = > e . id !== link . id ) ,
} ) ) ;
2023-03-28 10:11:34 -05:00
useTagStore . getState ( ) . setTags ( ) ;
}
2023-03-23 10:25:17 -05:00
return response . ok ;
2023-03-05 15:03:20 -06:00
} ,
} ) ) ;
2023-03-22 18:11:54 -05:00
export default useLinkStore ;