deleteFile(fileInfo.outpoint, deleteChecked)}
+ onConfirmed={() =>
+ deleteFile(fileInfo.outpoint, deleteChecked, abandonClaimChecked)}
onAborted={closeModal}
>
- {__("Are you sure you'd like to remove")} {title}
- {" "}{__("from LBRY?")}
+ {__("Are you sure you'd like to remove")} {title} {" "}
+ {__("from LBRY?")}
-
-
- {" "}{__("Delete this file from my computer")}
-
+
+
+ {" "}
+ {__("Delete this file from my computer")}
+
+
+ {claimIsMine &&
+
+
+ {" "}
+ {__("Abandon the claim for this URI")}
+
+ }
);
diff --git a/ui/js/constants/action_types.js b/ui/js/constants/action_types.js
index a66ae5874..216c84762 100644
--- a/ui/js/constants/action_types.js
+++ b/ui/js/constants/action_types.js
@@ -62,6 +62,8 @@ export const PLAY_VIDEO_STARTED = "PLAY_VIDEO_STARTED";
export const FETCH_AVAILABILITY_STARTED = "FETCH_AVAILABILITY_STARTED";
export const FETCH_AVAILABILITY_COMPLETED = "FETCH_AVAILABILITY_COMPLETED";
export const FILE_DELETE = "FILE_DELETE";
+export const ABANDON_CLAIM_STARTED = "ABANDON_CLAIM_STARTED";
+export const ABANDON_CLAIM_COMPLETED = "ABANDON_CLAIM_COMPLETED";
// Search
export const SEARCH_STARTED = "SEARCH_STARTED";
diff --git a/ui/js/lbry.js b/ui/js/lbry.js
index 262e957bf..accc5152c 100644
--- a/ui/js/lbry.js
+++ b/ui/js/lbry.js
@@ -268,9 +268,10 @@ lbry.getClientSettings = function() {
var outSettings = {};
for (let setting of Object.keys(lbry.defaultClientSettings)) {
var localStorageVal = localStorage.getItem("setting_" + setting);
- outSettings[setting] = localStorageVal === null
- ? lbry.defaultClientSettings[setting]
- : JSON.parse(localStorageVal);
+ outSettings[setting] =
+ localStorageVal === null
+ ? lbry.defaultClientSettings[setting]
+ : JSON.parse(localStorageVal);
}
return outSettings;
};
@@ -462,6 +463,12 @@ lbry.claim_list_mine = function(params = {}) {
});
};
+lbry.claim_abandon = function(params = {}) {
+ return new Promise((resolve, reject) => {
+ apiCall("claim_abandon", params, resolve, reject);
+ });
+};
+
lbry._resolveXhrs = {};
lbry.resolve = function(params = {}) {
return new Promise((resolve, reject) => {
diff --git a/ui/js/reducers/claims.js b/ui/js/reducers/claims.js
index a237947b6..7417bc2fb 100644
--- a/ui/js/reducers/claims.js
+++ b/ui/js/reducers/claims.js
@@ -80,6 +80,29 @@ reducers[types.FETCH_CHANNEL_CLAIMS_COMPLETED] = function(state, action) {
});
};
+reducers[types.ABANDON_CLAIM_COMPLETED] = function(state, action) {
+ const { claimId } = action.data;
+ const myClaims = new Set(state.myClaims);
+ const byId = Object.assign({}, state.byId);
+ const claimsByUri = Object.assign({}, state.claimsByUri);
+ const uris = [];
+
+ Object.keys(claimsByUri).forEach(uri => {
+ if (claimsByUri[uri] === claimId) {
+ delete claimsByUri[uri];
+ }
+ });
+
+ delete byId[claimId];
+ myClaims.delete(claimId);
+
+ return Object.assign({}, state, {
+ myClaims,
+ byId,
+ claimsByUri,
+ });
+};
+
export default function reducer(state = defaultState, action) {
const handler = reducers[action.type];
if (handler) return handler(state, action);
diff --git a/ui/js/selectors/claims.js b/ui/js/selectors/claims.js
index 7508c6ce1..b966375e9 100644
--- a/ui/js/selectors/claims.js
+++ b/ui/js/selectors/claims.js
@@ -48,6 +48,18 @@ export const makeSelectClaimForUri = () => {
return createSelector(selectClaimForUri, claim => claim);
};
+const selectClaimForUriIsMine = (state, props) => {
+ const uri = lbryuri.normalize(props.uri);
+ const claim = selectClaimsByUri(state)[uri];
+ const myClaims = selectMyClaims(state);
+
+ return myClaims.has(claim.claim_id);
+};
+
+export const makeSelectClaimForUriIsMine = () => {
+ return createSelector(selectClaimForUriIsMine, isMine => isMine);
+};
+
export const selectClaimsInChannelForUri = (state, props) => {
return selectAllClaimsByChannel(state)[props.uri];
};
@@ -95,7 +107,7 @@ export const selectClaimListMineIsPending = createSelector(
export const selectMyClaims = createSelector(
_selectState,
- state => state.myClaims || new Set()
+ state => new Set(state.myClaims)
);
export const selectMyClaimsOutpoints = createSelector(